# Copyright (C) 2020 all contributors # License: AGPL-3.0+ # temporary queue for public-inbox-index to support multi-Message-ID # messages on mirrors of v2 inboxes package PublicInbox::MultiMidQueue; use strict; use SDBM_File; # part of Perl standard library use Fcntl qw(O_RDWR O_CREAT); use File::Temp 0.19 (); # 0.19 for ->newdir my %e = ( freebsd => 0x100000, linux => 0x80000, netbsd => 0x400000, openbsd => 0x10000, ); my $O_CLOEXEC = $e{$^O} // 0; sub new { my ($class) = @_; my $tmpdir = File::Temp->newdir('multi-mid-q-XXXXXX', TMPDIR => 1); my $base = $tmpdir->dirname . '/q'; my %sdbm; my $flags = O_RDWR|O_CREAT; if (!tie(%sdbm, 'SDBM_File', $base, $flags|$O_CLOEXEC, 0600)) { if (!tie(%sdbm, 'SDBM_File', $base, $flags, 0600)) { die "could not tie ($base): $!"; } $O_CLOEXEC = 0; } bless { cur => 1, min => 1, max => 0, sdbm => \%sdbm, tmpdir => $tmpdir, }, $class; } sub set_oid { my ($self, $i, $oid, $v2w) = @_; $self->{max} = $i if $i > $self->{max}; $self->{min} = $i if $i < $self->{min}; $self->{sdbm}->{$i} = "$oid\t$v2w->{autime}\t$v2w->{cotime}"; } sub get_oid { my ($self, $i, $v2w) = @_; my $rec = $self->{sdbm}->{$i} or return; my ($oid, $autime, $cotime) = split(/\t/, $rec); $v2w->{autime} = $autime; $v2w->{cotime} = $cotime; $oid } sub push_oid { my ($self, $oid, $v2w) = @_; set_oid($self, $self->{cur}++, $oid, $v2w); } 1;