From: "Eric W. Biederman" <[email protected]>

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" <[email protected]>
---
 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 <[email protected]>
+# 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;
--
unsubscribe: one-click, see List-Unsubscribe header
archive: https://public-inbox.org/meta/

Reply via email to