]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/Msgmap.pm
msgmap: mid_insert ignores duplicates instead of die-ing
[public-inbox.git] / lib / PublicInbox / Msgmap.pm
index 2583ff47422c4e1d7c3d9e36344c453ea891b9b5..a49b61e8b7f3636eb28cba61ca052c5000b5720c 100644 (file)
@@ -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,
@@ -40,6 +45,7 @@ sub new {
        $self;
 }
 
+# n.b. invoked directly by scripts/xhdr-num2mid
 sub meta_accessor {
        my ($self, $key, $value) = @_;
        use constant {
@@ -76,10 +82,10 @@ sub created_at {
 sub mid_insert {
        my ($self, $mid) = @_;
        my $dbh = $self->{dbh};
-       use constant MID_INSERT => 'INSERT INTO msgmap (mid) VALUES (?)';
-       my $sth = $self->{mid_insert} ||= $dbh->prepare(MID_INSERT);
+       my $sql = 'INSERT OR IGNORE INTO msgmap (mid) VALUES (?)';
+       my $sth = $self->{mid_insert} ||= $dbh->prepare($sql);
        $sth->bind_param(1, $mid);
-       $sth->execute;
+       return if $sth->execute == 0;
        $dbh->last_insert_id(undef, undef, 'msgmap', 'num');
 }
 
@@ -154,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};
@@ -167,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;