create_tables($dbh);
$dbh->begin_work;
$self->created_at(time) unless $self->created_at;
+
+ my (undef, $max) = $self->minmax();
+ $max ||= 0;
+ $self->num_highwater($max);
$dbh->commit;
}
$self;
$self->meta_accessor('created_at', $second);
}
+sub num_highwater {
+ my ($self, $num) = @_;
+ my $high = $self->{num_highwater} ||=
+ $self->meta_accessor('num_highwater');
+ if (defined($num) && (!defined($high) || ($num > $high))) {
+ $self->{num_highwater} = $num;
+ $self->meta_accessor('num_highwater', $num);
+ }
+ $self->{num_highwater};
+}
+
sub mid_insert {
my ($self, $mid) = @_;
my $dbh = $self->{dbh};
my $sth = $dbh->prepare_cached(<<'');
-INSERT OR IGNORE INTO msgmap (mid) VALUES (?)
+INSERT INTO msgmap (mid) VALUES (?)
- return if $sth->execute($mid) == 0;
- $dbh->last_insert_id(undef, undef, 'msgmap', 'num');
+ return unless eval { $sth->execute($mid) };
+ my $num = $dbh->last_insert_id(undef, undef, 'msgmap', 'num');
+ $self->num_highwater($num) if defined($num);
+ $num;
}
sub mid_for {
my $attr = { Columns => [] };
my $mids = $dbh->selectall_arrayref(<<'', $attr, $$beg, $end);
SELECT num,mid FROM msgmap WHERE num >= ? AND num <= ?
-ORDER BY num ASC
+ORDER BY num ASC LIMIT 1000
$$beg = $mids->[-1]->[0] + 1 if @$mids;
$mids
$self->{dbh}->prepare(
'INSERT OR IGNORE INTO msgmap (num,mid) VALUES (?,?)');
};
- $sth->execute($num, $mid);
+ my $result = $sth->execute($num, $mid);
+ $self->num_highwater($num) if (defined($result) && $result == 1);
+ $result;
}
sub DESTROY {