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): $!";
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;
}, $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) = @_;
}
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;
}
# 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;
}
# 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;
$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);