#!perl -w
# Copyright (C) all contributors <meta@public-inbox.org>
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
use v5.12;
use Getopt::Long qw(:config gnu_getopt no_ignore_case auto_abbrev);
my $help = <<EOF; # the following should fit w/o scrolling in 80x24 term:
usage: public-inbox-xcpdb [options] <INBOX_DIR|EXTINDEX_DIR|CINDEX_DIR>

  upgrade or reshard Xapian DB(s) used by public-inbox

options:

  --compact | -c      run public-inbox-compact(1) after indexing
  --all               copy all configured inboxes
  --reshard=NUM       change number the number of shards
  --jobs=NUM          limit parallelism to JOBS count
  --verbose | -v      increase verbosity (may be repeated)
  --sequential-shard  copy+index Xapian shards sequentially (for slow HDD)

index options (see public-inbox-index(1) man page for full description):

  --no-fsync          speed up indexing, risk corruption on power outage
  --batch-size=BYTES  flush changes to OS after a given number of bytes
  --max-size=BYTES    do not index messages larger than the given size

See public-inbox-xcpdb(1) man page for full documentation.
EOF
my $opt = { quiet => -1, compact => 0, fsync => 1,
	-eidx_ok => 1, -cidx_ok => 1 };
GetOptions($opt, qw(
	fsync|sync! compact|c reshard|R=i
	max_size|max-size=s batch_size|batch-size=s
	sequential-shard|seq-shard
	jobs|j=i quiet|q verbose|v
	blocksize|b=s no-full|n fuller|F
	all C=s@ help|h)) or die $help;
if ($opt->{help}) { print $help; exit 0 };

use PublicInbox::Admin;
PublicInbox::Admin::require_or_die('-search');
PublicInbox::Admin::do_chdir(delete $opt->{C});

require PublicInbox::Config;
my $cfg = PublicInbox::Config->new;
my ($ibxs, $eidxs, $cidxs) =
	PublicInbox::Admin::resolve_inboxes(\@ARGV, $opt, $cfg);
unless (@$ibxs || @$eidxs || @$cidxs) { print STDERR $help; exit 1 }
my $idx_env = PublicInbox::Admin::index_prepare($opt, $cfg);

# we only set XAPIAN_FLUSH_THRESHOLD for index, since cpdb doesn't
# know sizes, only doccounts
$opt->{-idx_env} = $idx_env;

if ($opt->{'sequential-shard'} && ($opt->{jobs} // 1) > 1) {
	warn "W: --jobs=$opt->{jobs} ignored with --sequential-shard\n";
	$opt->{jobs} = 0;
}

require PublicInbox::InboxWritable;
require PublicInbox::Xapcmd;
# we rely on --no-renumber to keep docids synched for NNTP(artnum) + IMAP(UID)
for my $ibx (@$ibxs) {
	$ibx = PublicInbox::InboxWritable->new($ibx);
	PublicInbox::Xapcmd::run($ibx, 'cpdb', $opt);
}

for my $ibxish (@$eidxs, @$cidxs) {
	my $restore = $ibxish->can('prep_umask') ? $ibxish->prep_umask : undef;
	PublicInbox::Xapcmd::run($ibxish, 'cpdb', $opt);
}
