]> git.g-eek.se Git - interimap.git/commitdiff
pullimap, interimap: don't autocreate statefile or database in long-lived mode.
authorGuilhem Moulin <guilhem@fripost.org>
Mon, 21 Jan 2019 16:54:53 +0000 (17:54 +0100)
committerGuilhem Moulin <guilhem@fripost.org>
Mon, 21 Jan 2019 17:11:53 +0000 (18:11 +0100)
Changelog
interimap
pullimap

index eb187b69df03108323d10b6f739d7b7fefa800cd..b4fb931de6a22ceef1ad7da04a9542bddbe80fb6 100644 (file)
--- a/Changelog
+++ b/Changelog
@@ -11,6 +11,9 @@ interimap (0.4) UNRELEASED
   + Add support for untagged ESEARCH responses from RFC 4731.
   + pullimap: Use extended SEARCH commands (RFC 4731) if supported by
     the server to search old mail and EXPUNGE them.
+  + pullimap, interimap: don't autocreate statefile or database in
+    long-lived mode (when --watch or --idle is set).  Instead, an error
+    is raised if the statefile or database doesn't exist.
   - Ensure the lower bound of UID ranges is at least 1.
   - Fix manpage generation with pandoc >=2.1.
   - Specify minimum Perl and Net::SSLeay versions.
index 0fb6c1ccc4733d3859721ce64d78ea917440243c..7ac6b058932eb1c05a6361fbf4871b560d78e693 100755 (executable)
--- a/interimap
+++ b/interimap
@@ -27,6 +27,7 @@ my $NAME = 'interimap';
 use Getopt::Long qw/:config posix_default no_ignore_case gnu_compat
                             bundling auto_version/;
 use DBI ();
+use DBD::SQLite::Constants ':file_open';
 use Fcntl qw/F_GETFD F_SETFD FD_CLOEXEC/;
 use List::Util 'first';
 
@@ -121,18 +122,24 @@ $SIG{TERM} = sub { cleanup(); exit 0; };
 #############################################################################
 # Open the database and create tables
 
-$DBH = DBI::->connect("dbi:SQLite:dbname=$DBFILE", undef, undef, {
-    AutoCommit => 0,
-    RaiseError => 1,
-    sqlite_see_if_its_a_number => 1, # see if the bind values are numbers or not
-    sqlite_use_immediate_transaction => 1,
-});
-$DBH->sqlite_busy_timeout(250);
-$DBH->do('PRAGMA locking_mode = EXCLUSIVE');
-$DBH->do('PRAGMA foreign_keys = ON');
-
 
 {
+    my $dbi_data_source = "dbi:SQLite:dbname=".$DBFILE;
+    my %dbi_attrs = (
+        AutoCommit => 0,
+        RaiseError => 1,
+        sqlite_see_if_its_a_number => 1, # see if the bind values are numbers or not
+        sqlite_use_immediate_transaction => 1,
+        sqlite_open_flags => SQLITE_OPEN_READWRITE
+    );
+    # don't auto-create in long-lived mode
+    $dbi_attrs{sqlite_open_flags} |= SQLITE_OPEN_CREATE unless defined $CONFIG{watch};
+
+    $DBH = DBI::->connect($dbi_data_source, undef, undef, \%dbi_attrs);
+    $DBH->sqlite_busy_timeout(250);
+    $DBH->do('PRAGMA locking_mode = EXCLUSIVE');
+    $DBH->do('PRAGMA foreign_keys = ON');
+
     my @schema = (
         mailboxes => [
             q{idx        INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT},
index bd9b1cf63d1af35426d372e606abd9a23748f557..b752b14e0bf4cb54e57f408e074856b7e5d7b6ad 100755 (executable)
--- a/pullimap
+++ b/pullimap
@@ -82,7 +82,11 @@ do {
     die "Missing option statefile" unless defined $statefile;
     $statefile = xdg_basedir( XDG_DATA_HOME => ".local/share", $NAME, $statefile );
 
-    sysopen($STATE, $statefile, O_CREAT|O_RDWR|O_DSYNC, 0600) or die "Can't open $statefile: $!";
+    my $mode = O_RDWR | O_DSYNC;
+    # don't auto-create in long-lived mode
+    $mode |= O_CREAT unless defined $CONFIG{idle};
+
+    sysopen($STATE, $statefile, $mode, 0600) or die "Can't open $statefile: $!";
     # XXX we need to pack the struct flock manually: not portable!
     my $struct_flock = pack('s!s!l!l!i!', F_WRLCK, SEEK_SET, 0, 0, 0);
     fcntl($STATE, F_SETLK, $struct_flock) or die "Can't lock $statefile: $!";