my $f = delete $self->{filename};
if (!-f $f) { # SQLite defaults mode to 0644, we want 0666
if ($rw) {
+ require PublicInbox::Spawn;
open my $fh, '+>>', $f or die "failed to open $f: $!";
+ PublicInbox::Spawn::nodatacow_fd(fileno($fh));
+ my $j = "$f-journal";
+ open $fh, '+>>', $j or die "failed to open $j: $!";
+ PublicInbox::Spawn::nodatacow_fd(fileno($fh));
} else {
$self->{filename} = $f; # die on stat() below:
}
$st = pack('dd', $st[0], $st[1]);
} while ($st ne $self->{st} && $tries++ < 3);
warn "W: $f: .st_dev, .st_ino unstable\n" if $st ne $self->{st};
+ $dbh->do('PRAGMA synchronous = OFF') if ($rw // 0) > 1;
$dbh;
}
sub disconnect {
my ($self) = @_;
if (my $dbh = delete $self->{dbh}) {
+ delete $self->{-get_art};
$self->{filename} = $dbh->sqlite_db_filename;
}
}
bless $smsg, 'PublicInbox::Smsg';
if (defined(my $data = delete $smsg->{ddd})) {
$data = uncompress($data);
- utf8::decode($data);
PublicInbox::Smsg::load_from_data($smsg, $data);
# saves over 600K for 1000+ message threads
}
+sub get_all {
+ my $self = shift;
+ my $nr = scalar(@_) or return [];
+ my $in = '?' . (',?' x ($nr - 1));
+ do_get($self, <<"", { cull => 1, limit => $nr }, @_);
+SELECT num,ds,ddd FROM over WHERE num IN ($in)
+
+}
+
sub nothing () { wantarray ? (0, []) : [] };
sub get_thread {
sub get_art {
my ($self, $num) = @_;
- my $dbh = $self->connect;
- my $sth = $dbh->prepare_cached(<<'', undef, 1);
+ # caching $sth ourselves is faster than prepare_cached
+ my $sth = $self->{-get_art} //= $self->connect->prepare(<<'');
SELECT num,ds,ts,ddd FROM over WHERE num = ? LIMIT 1
$sth->execute($num);
$sth->execute($$id, $$prev);
my $num = $sth->fetchrow_array or return;
$$prev = $num;
-
- $sth = $dbh->prepare_cached(<<"", undef, 1);
-SELECT num,ts,ds,ddd FROM over WHERE num = ? LIMIT 1
-
- $sth->execute($num);
- my $smsg = $sth->fetchrow_hashref or return;
- load_from_row($smsg);
+ get_art($self, $num);
}
# IMAP search, this is limited by callers to UID_SLICE size (50K)
my $st = pack('dd', $st[0], $st[1]);
# don't actually reopen, just let {dbh} be recreated later
- if ($st ne ($self->{st} // $st)) {
- delete($self->{dbh});
- $self->{filename} = $f;
- }
+ disconnect($self) if $st ne ($self->{st} // $st);
} else {
warn "W: stat $f: $!\n";
}