]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/LeiMailSync.pm
imap+nntp: share COMPRESS implementation
[public-inbox.git] / lib / PublicInbox / LeiMailSync.pm
index a9a65fd6f312397909b5bb20b5aa79aa17df60eb..665206a8319ec661501666d139ba0f2413f607e1 100644 (file)
@@ -11,9 +11,9 @@ use PublicInbox::ContentHash qw(git_sha);
 use Carp ();
 
 sub dbh_new {
-       my ($self, $rw) = @_;
+       my ($self) = @_;
        my $f = $self->{filename};
-       my $creat = $rw && !-s $f;
+       my $creat = !-s $f;
        if ($creat) {
                require PublicInbox::Syscall;
                open my $fh, '+>>', $f or Carp::croak "open($f): $!";
@@ -23,11 +23,10 @@ sub dbh_new {
                AutoCommit => 1,
                RaiseError => 1,
                PrintError => 0,
-               ReadOnly => !$rw,
                sqlite_use_immediate_transaction => 1,
        });
        # no sqlite_unicode, here, all strings are binary
-       create_tables($self, $dbh) if $rw;
+       create_tables($self, $dbh);
        $dbh->do('PRAGMA journal_mode = WAL') if $creat;
        $dbh->do('PRAGMA case_sensitive_like = ON');
        $dbh;
@@ -42,7 +41,7 @@ sub new {
        }, $cls;
 }
 
-sub lms_write_prepare { ($_[0]->{dbh} //= dbh_new($_[0], 1)); $_[0] }
+sub lms_write_prepare { ($_[0]->{dbh} //= dbh_new($_[0])); $_[0] }
 
 sub lms_pause {
        my ($self) = @_;
@@ -102,52 +101,56 @@ UPDATE folders SET loc = ? WHERE fid = ?
 }
 
 sub get_fid ($$$) {
-       my ($sth, $folder, $dbh) = @_; # $dbh is set iff RW
+       my ($sth, $folder, $dbh) = @_;
        $sth->bind_param(1, $folder, SQL_BLOB);
        $sth->execute;
        my ($fid) = $sth->fetchrow_array;
        if (defined $fid) { # for downgrade+upgrade (1.8 -> 1.7 -> 1.8)
-               $dbh->do('DELETE FROM folders WHERE loc = ? AND fid != ?',
-                       undef, $folder, $fid) if defined($dbh);
+               my $del = $dbh->prepare_cached(<<'');
+DELETE FROM folders WHERE loc = ? AND fid != ?
+
+               $del->execute($folder, $fid);
        } else {
-               $sth->execute($folder); # fixup old stuff
+               $sth->bind_param(1, $folder, SQL_VARCHAR);
+               $sth->execute; # fixup old stuff
                ($fid) = $sth->fetchrow_array;
-               update_fid($dbh, $fid, $folder) if defined($fid) && $dbh;
+               update_fid($dbh, $fid, $folder) if defined($fid);
        }
        $fid;
 }
 
 sub fid_for {
-       my ($self, $folder, $rw) = @_;
-       my $dbh = $self->{dbh} //= dbh_new($self, $rw);
+       my ($self, $folder, $creat) = @_;
+       my $dbh = $self->{dbh} //= dbh_new($self);
        my $sth = $dbh->prepare_cached(<<'', undef, 1);
 SELECT fid FROM folders WHERE loc = ? LIMIT 1
 
-       my $rw_dbh = $dbh->{ReadOnly} ? undef : $dbh;
-       my $fid = get_fid($sth, $folder, $rw_dbh);
+       my $fid = get_fid($sth, $folder, $dbh);
        return $fid if defined($fid);
 
        # caller had trailing slash (LeiToMail)
        if ($folder =~ s!\A((?:maildir|mh):.*?)/+\z!$1!i) {
-               $fid = get_fid($sth, $folder, $rw_dbh);
+               $fid = get_fid($sth, $folder, $dbh);
                if (defined $fid) {
-                       update_fid($dbh, $fid, $folder) if $rw;
+                       update_fid($dbh, $fid, $folder);
                        return $fid;
                }
        # sometimes we stored trailing slash..
        } elsif ($folder =~ m!\A(?:maildir|mh):!i) {
-               $fid = get_fid($sth, $folder, $rw_dbh);
+               $fid = get_fid($sth, $folder, $dbh);
                if (defined $fid) {
-                       update_fid($dbh, $fid, $folder) if $rw;
+                       update_fid($dbh, $fid, $folder);
                        return $fid;
                }
-       } elsif ($rw && $folder =~ m!\Aimaps?://!i) {
+       } elsif ($creat && $folder =~ m!\Aimaps?://!i) {
                require PublicInbox::URIimap;
-               PublicInbox::URIimap->new($folder)->uidvalidity //
+               my $uri = PublicInbox::URIimap->new($folder);
+               $uri->uidvalidity //
                        Carp::croak("BUG: $folder has no UIDVALIDITY");
+               defined($uri->uid) and Carp::confess("BUG: $folder has UID");
        }
-       return unless $rw;
 
+       return unless $creat;
        ($fid) = $dbh->selectrow_array('SELECT MAX(fid) FROM folders');
 
        $fid += 1;
@@ -350,7 +353,8 @@ sub locations_for {
        }
 
        # deal with 1.7.0 DBs :<
-       $sth->execute($oidbin);
+       $sth->bind_param(1, $oidbin, SQL_VARCHAR);
+       $sth->execute;
        while (my ($fid, $uid) = $sth->fetchrow_array) {
                next if $seen{"$uid.$fid"};
                push @{$fid2id{$fid}}, $uid;
@@ -366,7 +370,8 @@ sub locations_for {
        }
 
        # deal with 1.7.0 DBs :<
-       $sth->execute($oidbin);
+       $sth->bind_param(1, $oidbin, SQL_VARCHAR);
+       $sth->execute;
        while (my ($fid, $name) = $sth->fetchrow_array) {
                next if $seen{"$fid.$name"};
                push @{$fid2id{$fid}}, $name;
@@ -646,7 +651,9 @@ EOM
        $sth->bind_param(2, $nm, SQL_BLOB);
        $sth->execute;
        my @bin = map { $_->[0] } @{$sth->fetchall_arrayref};
-       $sth->execute($fid, $nm);
+       $sth->bind_param(1, $fid);
+       $sth->bind_param(2, $nm, SQL_VARCHAR);
+       $sth->execute;
        my @old = map { $_->[0] } @{$sth->fetchall_arrayref};
        my %uniq; # for public-inbox <= 1.7.0
        grep { !$uniq{$_}++ } (@bin, @old);