make updates really work
authorDobrica Pavlinusic <dpavlin@rot13.org>
Sat, 7 Aug 2004 14:48:23 +0000 (14:48 +0000)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Sat, 7 Aug 2004 14:48:23 +0000 (14:48 +0000)
git-svn-id: svn://svn.rot13.org/fuse_dbi/trunk@7 17f4e80c-d0e0-0310-8903-bfc3ae804c12

fuse_dbi.pl

index a19c92c..f08ff92 100755 (executable)
@@ -1,6 +1,6 @@
 #!/usr/bin/perl
 
 #!/usr/bin/perl
 
-use POSIX qw(ENOENT EISDIR EINVAL O_RDWR);
+use POSIX qw(ENOENT EISDIR EINVAL ENOSYS O_RDWR);
 use Fuse;
 
 use DBI;
 use Fuse;
 
 use DBI;
@@ -30,9 +30,10 @@ my $sql_update = q{
 
 my $connect = "DBI:Pg:dbname=webgui";
 
 
 my $connect = "DBI:Pg:dbname=webgui";
 
-my $dbh = DBI->connect($connect,"","") || die $DBI::errstr;
+my $dbh = DBI->connect($connect,"","", { AutoCommit => 0 }) || die $DBI::errstr;
 
 
-print STDERR "$sql_filenames\n";
+print "start transaction\n";
+#$dbh->begin_work || die $dbh->errstr;
 
 my $sth_filenames = $dbh->prepare($sql_filenames) || die $dbh->errstr();
 $sth_filenames->execute() || die $sth_filenames->errstr();
 
 my $sth_filenames = $dbh->prepare($sql_filenames) || die $dbh->errstr();
 $sth_filenames->execute() || die $sth_filenames->errstr();
@@ -40,8 +41,6 @@ $sth_filenames->execute() || die $sth_filenames->errstr();
 my $sth_read = $dbh->prepare($sql_read) || die $dbh->errstr();
 my $sth_update = $dbh->prepare($sql_update) || die $dbh->errstr();
 
 my $sth_read = $dbh->prepare($sql_read) || die $dbh->errstr();
 my $sth_update = $dbh->prepare($sql_update) || die $dbh->errstr();
 
-print "#",join(",",@{ $sth_filenames->{NAME} }),"\n";
-
 my $ctime_start = time();
 
 my (%files) = (
 my $ctime_start = time();
 
 my (%files) = (
@@ -88,7 +87,7 @@ while (my $row = $sth_filenames->fetchrow_hashref() ) {
        }
 }
 
        }
 }
 
-print scalar (keys %dirs), " dirs:",join(" ",keys %dirs),"\n";
+print "found ",scalar(keys %files)-scalar(keys %dirs)," files, ",scalar(keys %dirs), " dirs\n";
 
 sub filename_fixup {
        my ($file) = shift;
 
 sub filename_fixup {
        my ($file) = shift;
@@ -130,7 +129,6 @@ sub e_getdir {
                } else {
                        $out{$f}++ if ($f =~ /^[^\/]+$/);
                }
                } else {
                        $out{$f}++ if ($f =~ /^[^\/]+$/);
                }
-               print "f: $_ -> $f\n";
        }
        if (! %out) {
                $out{'no files? bug?'}++;
        }
        if (! %out) {
                $out{'no files? bug?'}++;
@@ -139,8 +137,6 @@ sub e_getdir {
        return (keys %out),0;
 }
 
        return (keys %out),0;
 }
 
-my $in_transaction = 0;
-
 sub e_open {
        # VFS sanity check; it keeps all the necessary state, not much to do here.
        my $file = filename_fixup(shift);
 sub e_open {
        # VFS sanity check; it keeps all the necessary state, not much to do here.
        my $file = filename_fixup(shift);
@@ -149,19 +145,10 @@ sub e_open {
        return -ENOENT() unless exists($files{$file});
        return -EISDIR() unless exists($files{$file}{id});
 
        return -ENOENT() unless exists($files{$file});
        return -EISDIR() unless exists($files{$file}{id});
 
-       if (! $in_transaction) {
-               # begin transaction
-               if (! $dbh->begin_work) {
-                       print "transaction begin: ",$dbh->errstr;
-                       return -ENOENT();
-               }
-       }
-       $in_transaction++;
-       print "files opened: $in_transaction\n";
-
        if (!exists($files{$file}{cont})) {
                $sth_read->execute($files{$file}{id}) || die $sth_read->errstr;
                $files{$file}{cont} = $sth_read->fetchrow_array;
        if (!exists($files{$file}{cont})) {
                $sth_read->execute($files{$file}{id}) || die $sth_read->errstr;
                $files{$file}{cont} = $sth_read->fetchrow_array;
+               print "file '$file' content read in cache\n";
        }
        print "open '$file' ",length($files{$file}{cont})," bytes\n";
        return 0;
        }
        print "open '$file' ",length($files{$file}{cont})," bytes\n";
        return 0;
@@ -189,10 +176,14 @@ sub e_read {
 }
 
 sub clear_cont {
 }
 
 sub clear_cont {
+       print "transaction rollback\n";
+       $dbh->rollback || die $dbh->errstr;
        print "invalidate all cached content\n";
        foreach my $f (keys %files) {
                delete $files{$f}{cont};
        }
        print "invalidate all cached content\n";
        foreach my $f (keys %files) {
                delete $files{$f}{cont};
        }
+       print "begin new transaction\n";
+       $dbh->begin_work || die $dbh->errstr;
 }
 
 
 }
 
 
@@ -201,16 +192,12 @@ sub update_db {
 
        if (!$sth_update->execute($files{$file}{cont},$files{$file}{id})) {
                print "update problem: ",$sth_update->errstr;
 
        if (!$sth_update->execute($files{$file}{cont},$files{$file}{id})) {
                print "update problem: ",$sth_update->errstr;
-               $dbh->rollback;
                clear_cont;
                clear_cont;
-               $dbh->begin_work;
                return 0;
        } else {
                return 0;
        } else {
-               if ($dbh->commit) {
-                       print "commit problem: ",$sth_update->errstr;
-                       $dbh->rollback;
+               if (! $dbh->commit) {
+                       print "ERROR: commit problem: ",$sth_update->errstr;
                        clear_cont;
                        clear_cont;
-                       $dbh->begin_work;
                        return 0;
                }
                print "updated '$file' [",$files{$file}{id},"]\n";
                        return 0;
                }
                print "updated '$file' [",$files{$file}{id},"]\n";
@@ -275,5 +262,5 @@ Fuse::main(
        write=>\&e_write,
        utime=>\&e_utime,
        truncate=>\&e_truncate,
        write=>\&e_write,
        utime=>\&e_utime,
        truncate=>\&e_truncate,
-       debug=>1,
+       debug=>0,
 );
 );