my $err = $!;
-d $d or die "$d not created: $err";
}
- my $f = "$d/msgmap.sqlite3";
+ new_file($class, "$d/msgmap.sqlite3", $writable);
+}
+
+sub new_file {
+ my ($class, $f, $writable) = @_;
+
my $dbh = DBI->connect("dbi:SQLite:dbname=$f",'','', {
AutoCommit => 1,
RaiseError => 1,
if ($writable) {
create_tables($dbh);
+ $dbh->begin_work;
$self->created_at(time) unless $self->created_at;
+ $dbh->commit;
}
$self;
}
+# n.b. invoked directly by scripts/xhdr-num2mid
sub meta_accessor {
my ($self, $key, $value) = @_;
use constant {
defined $value or
return $dbh->selectrow_array(meta_select, undef, $key);
- $dbh->begin_work;
- eval {
- $prev = $dbh->selectrow_array(meta_select, undef, $key);
+ $prev = $dbh->selectrow_array(meta_select, undef, $key);
- if (defined $prev) {
- $dbh->do(meta_update, undef, $value, $key);
- } else {
- $dbh->do(meta_insert, undef, $key, $value);
- }
- $dbh->commit;
- };
- my $err = $@;
- return $prev unless $err;
-
- $dbh->rollback;
- die $err;
+ if (defined $prev) {
+ $dbh->do(meta_update, undef, $value, $key);
+ } else {
+ $dbh->do(meta_insert, undef, $key, $value);
+ }
+ $prev;
}
sub last_commit {
'val VARCHAR(255) NOT NULL)');
}
+# used by NNTP.pm
sub id_batch {
my ($self, $num, $cb) = @_;
my $dbh = $self->{dbh};
$nr;
}
+# only used for mapping external serial numbers (e.g. articles from gmane)
+# see scripts/xhdr-num2mid for usage
+sub mid_set {
+ my ($self, $num, $mid) = @_;
+ my $sth = $self->{mid_set} ||= do {
+ my $sql = 'INSERT INTO msgmap (num, mid) VALUES (?,?)';
+ $self->{dbh}->prepare($sql);
+ };
+ $sth->execute($num, $mid);
+}
+
1;