From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id C9BDB1F5B7; Sat, 27 Jun 2020 10:04:00 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Cc: "Eric W. Biederman" Subject: [PATCH 03/34] IMAPTracker: Add a helper to track our place in reading imap mailboxes Date: Sat, 27 Jun 2020 10:03:29 +0000 Message-Id: <20200627100400.9871-4-e@yhbt.net> In-Reply-To: <20200627100400.9871-1-e@yhbt.net> References: <20200627100400.9871-1-e@yhbt.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: From: "Eric W. Biederman" This removes the need to delete from an imap mailbox when downloading it's messages. [ew: minor style changes] Signed-off-by: "Eric W. Biederman" --- MANIFEST | 1 + lib/PublicInbox/IMAPTracker.pm | 61 ++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 lib/PublicInbox/IMAPTracker.pm diff --git a/MANIFEST b/MANIFEST index 3e7d4cc0e29..42a00d74344 100644 --- a/MANIFEST +++ b/MANIFEST @@ -132,6 +132,7 @@ lib/PublicInbox/Hval.pm lib/PublicInbox/IMAP.pm lib/PublicInbox/IMAPClient.pm lib/PublicInbox/IMAPD.pm +lib/PublicInbox/IMAPTracker.pm lib/PublicInbox/IMAPdeflate.pm lib/PublicInbox/IMAPsearchqp.pm lib/PublicInbox/Import.pm diff --git a/lib/PublicInbox/IMAPTracker.pm b/lib/PublicInbox/IMAPTracker.pm new file mode 100644 index 00000000000..c7da422b725 --- /dev/null +++ b/lib/PublicInbox/IMAPTracker.pm @@ -0,0 +1,61 @@ +# Copyright (C) 2018-2020 all contributors +# License: AGPL-3.0+ +package PublicInbox::IMAPTracker; +use strict; +use DBI; +use DBD::SQLite; +use PublicInbox::Config; + +sub create_tables ($) { + my ($dbh) = @_; + + $dbh->do(<<''); +CREATE TABLE IF NOT EXISTS imap_last ( + url VARCHAR PRIMARY KEY NOT NULL, + uid_validity INTEGER NOT NULL, + uid INTEGER NOT NULL, + UNIQUE (url) +) + +} + +sub dbh_new ($) { + my ($dbname) = @_; + my $dbh = DBI->connect("dbi:SQLite:dbname=$dbname", '', '', { + AutoCommit => 1, + RaiseError => 1, + PrintError => 0, + sqlite_use_immediate_transaction => 1, + }); + $dbh->{sqlite_unicode} = 1; + $dbh->do('PRAGMA journal_mode = TRUNCATE'); + create_tables($dbh); + $dbh; +} + +sub get_last ($$) { + my ($self, $url) = @_; + my $sth = $self->{dbh}->prepare_cached(<<'', undef, 1); +SELECT uid_validity, uid FROM imap_last WHERE url = ? + + $sth->execute($url); + $sth->fetchrow_array; +} + +sub update_last ($$$$) { + my ($self, $url, $validity, $last) = @_; + my $sth = $self->{dbh}->prepare_cached(<<''); +INSERT OR REPLACE INTO imap_last (url, uid_validity, uid) +VALUES (?, ?, ?) + + $sth->execute($url, $validity, $last); +} + +sub new { + my ($class) = @_; + my $dbname = PublicInbox::Config->config_dir() . "/imap.sqlite3"; + my $dbh = dbh_new($dbname); + bless { dbname => $dbname, dbh => $dbh }, $class; +} + +1;