]> Sergey Matveev's repositories - public-inbox.git/commitdiff
IMAPTracker: Add a helper to track our place in reading imap mailboxes
authorEric W. Biederman <ebiederm@xmission.com>
Sat, 27 Jun 2020 10:03:29 +0000 (10:03 +0000)
committerEric Wong <e@yhbt.net>
Sun, 28 Jun 2020 22:27:08 +0000 (22:27 +0000)
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" <ebiederm@xmission.com>
MANIFEST
lib/PublicInbox/IMAPTracker.pm [new file with mode: 0644]

index 3e7d4cc0e2999d59bc4e99346926c5b92dff78d0..42a00d7434425d7f346f5204f51dcc5ea72101c2 100644 (file)
--- 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 (file)
index 0000000..c7da422
--- /dev/null
@@ -0,0 +1,61 @@
+# Copyright (C) 2018-2020 all contributors <meta@public-inbox.org>
+# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
+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;