about summary refs log tree commit homepage
path: root/lib/PublicInbox/Msgmap.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/PublicInbox/Msgmap.pm')
-rw-r--r--lib/PublicInbox/Msgmap.pm44
1 files changed, 28 insertions, 16 deletions
diff --git a/lib/PublicInbox/Msgmap.pm b/lib/PublicInbox/Msgmap.pm
index 8fe17a95..3fb3805f 100644
--- a/lib/PublicInbox/Msgmap.pm
+++ b/lib/PublicInbox/Msgmap.pm
@@ -20,7 +20,12 @@ sub new {
                 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,
@@ -33,11 +38,14 @@ sub new {
 
         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 {
@@ -51,22 +59,14 @@ sub meta_accessor {
         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 {
@@ -160,6 +160,7 @@ sub create_tables {
                         'val VARCHAR(255) NOT NULL)');
 }
 
+# used by NNTP.pm
 sub id_batch {
         my ($self, $num, $cb) = @_;
         my $dbh = $self->{dbh};
@@ -173,4 +174,15 @@ sub id_batch {
         $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;