use PublicInbox::InboxWritable;
use PublicInbox::ContentHash qw(content_hash);
use PublicInbox::Eml;
-use File::Spec;
use PublicInbox::DS qw(now);
use DBI qw(:sql_types); # SQL_BLOB
sub new {
my (undef, $dir, $opt) = @_;
- $dir = File::Spec->canonpath($dir);
my $l = $opt->{indexlevel} // 'full';
$l !~ $PublicInbox::SearchIdx::INDEXLEVELS and
die "invalid indexlevel=$l\n";
sub attach_inbox {
my ($self, $ibx) = @_;
- my $key = $ibx->eidx_key;
- if (!$ibx->over || !$ibx->mm) {
- warn "W: skipping $key (unindexed)\n";
- return;
- }
- if (!defined($ibx->uidvalidity)) {
- warn "W: skipping $key (no UIDVALIDITY)\n";
- return;
- }
- my $ibxdir = File::Spec->canonpath($ibx->{inboxdir});
- if ($ibxdir ne $ibx->{inboxdir}) {
- warn "W: `$ibx->{inboxdir}' canonicalized to `$ibxdir'\n";
- $ibx->{inboxdir} = $ibxdir;
+ my $ekey = $ibx->eidx_key;
+ my $misc = $self->{misc};
+ if ($misc && $misc->inbox_data($ibx)) { # all good if already indexed
+ } else {
+ my @sqlite = ($ibx->over, $ibx->mm);
+ my $uidvalidity = $ibx->uidvalidity;
+ $ibx->{mm} = $ibx->{over} = undef;
+ if (scalar(@sqlite) != 2) {
+ warn "W: skipping $ekey (unindexed)\n";
+ return;
+ }
+ if (!defined($uidvalidity)) {
+ warn "W: skipping $ekey (no UIDVALIDITY)\n";
+ return;
+ }
}
- $self->{ibx_map}->{$key} //= do {
+ $self->{ibx_map}->{$ekey} //= do {
push @{$self->{ibx_list}}, $ibx;
$ibx;
}
state $retval = hostname . '-' . do {
my $m; # machine-id(5) is systemd
if (open(my $fh, '<', '/etc/machine-id')) { $m = <$fh> }
- # hostid(1) is in GNU coreutils, kern.hostid is FreeBSD
- chomp($m ||= `hostid` || `sysctl -n kern.hostid`);
+ # (g)hostid(1) is in GNU coreutils, kern.hostid is most BSDs
+ chomp($m ||= `{ sysctl -n kern.hostid ||
+ hostid || ghostid; } 2>/dev/null`
+ || "no-machine-id-or-hostid-on-$^O");
$m;
};
}
PublicInbox::V2Writable::write_alternates($info_dir, $mode, $o);
}
$self->parallel_init($self->{indexlevel});
- $self->umask_prepare;
$self->with_umask(\&_idx_init, $self, $opt);
$self->{oidx}->begin_lazy;
$self->{oidx}->eidx_prep;
no warnings 'once';
*done = \&PublicInbox::V2Writable::done;
-*umask_prepare = \&PublicInbox::InboxWritable::umask_prepare;
*with_umask = \&PublicInbox::InboxWritable::with_umask;
*parallel_init = \&PublicInbox::V2Writable::parallel_init;
*nproc_shards = \&PublicInbox::V2Writable::nproc_shards;