]> git.g-eek.se Git - interimap.git/commitdiff
interimap: use SQLite's own locking mechanism to lock down the database.
authorGuilhem Moulin <guilhem@fripost.org>
Sat, 12 Mar 2016 22:35:59 +0000 (23:35 +0100)
committerGuilhem Moulin <guilhem@fripost.org>
Sat, 12 Mar 2016 22:38:23 +0000 (23:38 +0100)
(instead of rolling our own)

interimap

index 59ff0cfbeeb59c6c79aab64ffc82510d6e2e5896..d331183f105deba8e1131c8fa44f26f9c3f19189 100755 (executable)
--- a/interimap
+++ b/interimap
@@ -77,7 +77,7 @@ my $CONF = read_config( delete $CONFIG{config} // $NAME
                       , 'list-select-opts' => qr/\A([\x21\x23\x24\x26\x27\x2B-\x5B\x5E-\x7A\x7C-\x7E]+)\z/
                       , 'ignore-mailbox' => qr/\A([\x01-\x09\x0B\x0C\x0E-\x7F]+)\z/
                       );
-my ($DBFILE, $LOCKFILE, $LOGGER_FD);
+my ($DBFILE, $LOGGER_FD);
 
 {
     $DBFILE = $CONF->{_}->{database} if defined $CONF->{_};
@@ -95,8 +95,6 @@ my ($DBFILE, $LOCKFILE, $LOGGER_FD);
         }
     }
 
-    $LOCKFILE = $DBFILE =~ s/([^\/]+)\z/.$1.lck/r;
-
     if (defined $CONF->{_} and defined $CONF->{_}->{logfile}) {
         require 'POSIX.pm';
         require 'Time/HiRes.pm';
@@ -117,7 +115,6 @@ my ($IMAP, $lIMAP, $rIMAP);
 sub cleanup() {
     undef $_ foreach grep defined, ($IMAP, $lIMAP, $rIMAP);
     logger(undef, "Cleaning up...") if $CONFIG{debug};
-    unlink $LOCKFILE if defined $LOCKFILE and -f $LOCKFILE;
     close $LOGGER_FD if defined $LOGGER_FD;
     $DBH->disconnect() if defined $DBH;
 }
@@ -125,26 +122,6 @@ $SIG{INT} = sub { msg(undef, $!); cleanup(); exit 1; };
 $SIG{TERM} = sub { cleanup(); exit 0; };
 
 
-#############################################################################
-# Lock the database
-{
-    if (-f $LOCKFILE) {
-        open my $lock, '<', $LOCKFILE or die "Can't open $LOCKFILE: $!\n";
-        my $pid = <$lock>;
-        close $lock;
-        chomp $pid;
-        my $msg = "LOCKFILE '$LOCKFILE' exists.";
-        undef $LOCKFILE; # don't delete the lockfile
-        $msg .= " (Is PID $pid running?)" if defined $pid and $pid =~ /^[0-9]+$/;
-        die $msg, "\n";
-    }
-
-    open my $lock, '>', $LOCKFILE or die "Can't open $LOCKFILE: $!\n";
-    print $lock $$, "\n";
-    close $lock;
-}
-
-
 #############################################################################
 # Open the database and create tables
 
@@ -152,7 +129,10 @@ $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');