about summary refs log tree commit homepage
path: root/lib/PublicInbox/IMAPTracker.pm
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2020-06-27 10:03:29 +0000
committerEric Wong <e@yhbt.net>2020-06-28 22:27:08 +0000
commit80b6cf9fb3aafe7a2d5e2fee1b420a93c6c9b0ae (patch)
tree5d4c982e946dc84a029c006fb776b5fd1e590c05 /lib/PublicInbox/IMAPTracker.pm
parent6adbc635ea6ab754462c74c1056a40eb68c6c78e (diff)
downloadpublic-inbox-80b6cf9fb3aafe7a2d5e2fee1b420a93c6c9b0ae.tar.gz
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>
Diffstat (limited to 'lib/PublicInbox/IMAPTracker.pm')
-rw-r--r--lib/PublicInbox/IMAPTracker.pm61
1 files changed, 61 insertions, 0 deletions
diff --git a/lib/PublicInbox/IMAPTracker.pm b/lib/PublicInbox/IMAPTracker.pm
new file mode 100644
index 00000000..c7da422b
--- /dev/null
+++ b/lib/PublicInbox/IMAPTracker.pm
@@ -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;