From: Eric Wong (Contractor, The Linux Foundation) Date: Wed, 21 Mar 2018 08:29:25 +0000 (+0000) Subject: msgmap: add tmp_clone to create an anonymous copy X-Git-Tag: v1.1.0-pre1~137 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=2e5d47e4c02757c027461149b3e1568d713252b1;p=public-inbox.git msgmap: add tmp_clone to create an anonymous copy This will be used to keep track of Message-ID <-> NNTP Article numbers to prevent article number reuse when reindexing. --- diff --git a/lib/PublicInbox/Inbox.pm b/lib/PublicInbox/Inbox.pm index b9cd4c40..f3070383 100644 --- a/lib/PublicInbox/Inbox.pm +++ b/lib/PublicInbox/Inbox.pm @@ -75,7 +75,7 @@ sub new { _set_uint($opts, 'feedmax', 25); $opts->{nntpserver} ||= $pi_config->{'publicinbox.nntpserver'}; my $dir = $opts->{mainrepo}; - if (defined $dir && -f "$dir/msgmap.sqlite3") { # XXX DIRTY + if (defined $dir && -f "$dir/inbox.lock") { $opts->{version} = 2; } bless $opts, $class; diff --git a/lib/PublicInbox/Msgmap.pm b/lib/PublicInbox/Msgmap.pm index 8e81fba0..78922d36 100644 --- a/lib/PublicInbox/Msgmap.pm +++ b/lib/PublicInbox/Msgmap.pm @@ -12,6 +12,7 @@ use strict; use warnings; use DBI; use DBD::SQLite; +use File::Temp qw(tempfile); sub new { my ($class, $git_dir, $writable) = @_; @@ -45,6 +46,18 @@ sub new_file { $self; } +# used to keep track of used numeric mappings for v2 reindex +sub tmp_clone { + my ($self) = @_; + my ($fh, $fn) = tempfile(EXLOCK => 0); + $self->{dbh}->sqlite_backup_to_file($fn); + my $tmp = ref($self)->new_file($fn, 1); + $tmp->{dbh}->do('PRAGMA synchronous = OFF'); + $tmp->{tmp_name} = $fn; # SQLite won't work if unlinked, apparently + $fh = undef; + $tmp; +} + # n.b. invoked directly by scripts/xhdr-num2mid sub meta_accessor { my ($self, $key, $value) = @_; @@ -189,4 +202,10 @@ sub mid_set { $sth->execute($num, $mid); } +sub DESTROY { + my ($self) = @_; + delete $self->{dbh}; + unlink $self->{tmp_name} if defined $self->{tmp_name}; +} + 1; diff --git a/t/msgmap.t b/t/msgmap.t index bc22137d..dce98f46 100644 --- a/t/msgmap.t +++ b/t/msgmap.t @@ -65,4 +65,8 @@ my $orig = $d->mid_insert('spam@1'); $d->mid_delete('spam@1'); is($d->mid_insert('spam@2'), 1 + $orig, "last number not recycled"); +my $tmp = $d->tmp_clone; +is_deeply([$d->minmax], [$tmp->minmax], 'Cloned temporary DB matches'); +ok($tmp->mid_delete('spam@2'), 'temporary DB is writable'); + done_testing();