/[fuse_dbi]/trunk/DBI.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /trunk/DBI.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 6 by dpavlin, Wed Aug 4 16:17:09 2004 UTC revision 7 by dpavlin, Sat Aug 7 14:48:23 2004 UTC
# Line 1  Line 1 
1  #!/usr/bin/perl  #!/usr/bin/perl
2    
3  use POSIX qw(ENOENT EISDIR EINVAL O_RDWR);  use POSIX qw(ENOENT EISDIR EINVAL ENOSYS O_RDWR);
4  use Fuse;  use Fuse;
5    
6  use DBI;  use DBI;
# Line 30  my $sql_update = q{ Line 30  my $sql_update = q{
30    
31  my $connect = "DBI:Pg:dbname=webgui";  my $connect = "DBI:Pg:dbname=webgui";
32    
33  my $dbh = DBI->connect($connect,"","") || die $DBI::errstr;  my $dbh = DBI->connect($connect,"","", { AutoCommit => 0 }) || die $DBI::errstr;
34    
35  print STDERR "$sql_filenames\n";  print "start transaction\n";
36    #$dbh->begin_work || die $dbh->errstr;
37    
38  my $sth_filenames = $dbh->prepare($sql_filenames) || die $dbh->errstr();  my $sth_filenames = $dbh->prepare($sql_filenames) || die $dbh->errstr();
39  $sth_filenames->execute() || die $sth_filenames->errstr();  $sth_filenames->execute() || die $sth_filenames->errstr();
# Line 40  $sth_filenames->execute() || die $sth_fi Line 41  $sth_filenames->execute() || die $sth_fi
41  my $sth_read = $dbh->prepare($sql_read) || die $dbh->errstr();  my $sth_read = $dbh->prepare($sql_read) || die $dbh->errstr();
42  my $sth_update = $dbh->prepare($sql_update) || die $dbh->errstr();  my $sth_update = $dbh->prepare($sql_update) || die $dbh->errstr();
43    
 print "#",join(",",@{ $sth_filenames->{NAME} }),"\n";  
   
44  my $ctime_start = time();  my $ctime_start = time();
45    
46  my (%files) = (  my (%files) = (
# Line 88  while (my $row = $sth_filenames->fetchro Line 87  while (my $row = $sth_filenames->fetchro
87          }          }
88  }  }
89    
90  print scalar (keys %dirs), " dirs:",join(" ",keys %dirs),"\n";  print "found ",scalar(keys %files)-scalar(keys %dirs)," files, ",scalar(keys %dirs), " dirs\n";
91    
92  sub filename_fixup {  sub filename_fixup {
93          my ($file) = shift;          my ($file) = shift;
# Line 130  sub e_getdir { Line 129  sub e_getdir {
129                  } else {                  } else {
130                          $out{$f}++ if ($f =~ /^[^\/]+$/);                          $out{$f}++ if ($f =~ /^[^\/]+$/);
131                  }                  }
                 print "f: $_ -> $f\n";  
132          }          }
133          if (! %out) {          if (! %out) {
134                  $out{'no files? bug?'}++;                  $out{'no files? bug?'}++;
# Line 139  sub e_getdir { Line 137  sub e_getdir {
137          return (keys %out),0;          return (keys %out),0;
138  }  }
139    
 my $in_transaction = 0;  
   
140  sub e_open {  sub e_open {
141          # VFS sanity check; it keeps all the necessary state, not much to do here.          # VFS sanity check; it keeps all the necessary state, not much to do here.
142          my $file = filename_fixup(shift);          my $file = filename_fixup(shift);
# Line 149  sub e_open { Line 145  sub e_open {
145          return -ENOENT() unless exists($files{$file});          return -ENOENT() unless exists($files{$file});
146          return -EISDIR() unless exists($files{$file}{id});          return -EISDIR() unless exists($files{$file}{id});
147    
         if (! $in_transaction) {  
                 # begin transaction  
                 if (! $dbh->begin_work) {  
                         print "transaction begin: ",$dbh->errstr;  
                         return -ENOENT();  
                 }  
         }  
         $in_transaction++;  
         print "files opened: $in_transaction\n";  
   
148          if (!exists($files{$file}{cont})) {          if (!exists($files{$file}{cont})) {
149                  $sth_read->execute($files{$file}{id}) || die $sth_read->errstr;                  $sth_read->execute($files{$file}{id}) || die $sth_read->errstr;
150                  $files{$file}{cont} = $sth_read->fetchrow_array;                  $files{$file}{cont} = $sth_read->fetchrow_array;
151                    print "file '$file' content read in cache\n";
152          }          }
153          print "open '$file' ",length($files{$file}{cont})," bytes\n";          print "open '$file' ",length($files{$file}{cont})," bytes\n";
154          return 0;          return 0;
# Line 189  sub e_read { Line 176  sub e_read {
176  }  }
177    
178  sub clear_cont {  sub clear_cont {
179            print "transaction rollback\n";
180            $dbh->rollback || die $dbh->errstr;
181          print "invalidate all cached content\n";          print "invalidate all cached content\n";
182          foreach my $f (keys %files) {          foreach my $f (keys %files) {
183                  delete $files{$f}{cont};                  delete $files{$f}{cont};
184          }          }
185            print "begin new transaction\n";
186            $dbh->begin_work || die $dbh->errstr;
187  }  }
188    
189    
# Line 201  sub update_db { Line 192  sub update_db {
192    
193          if (!$sth_update->execute($files{$file}{cont},$files{$file}{id})) {          if (!$sth_update->execute($files{$file}{cont},$files{$file}{id})) {
194                  print "update problem: ",$sth_update->errstr;                  print "update problem: ",$sth_update->errstr;
                 $dbh->rollback;  
195                  clear_cont;                  clear_cont;
                 $dbh->begin_work;  
196                  return 0;                  return 0;
197          } else {          } else {
198                  if ($dbh->commit) {                  if (! $dbh->commit) {
199                          print "commit problem: ",$sth_update->errstr;                          print "ERROR: commit problem: ",$sth_update->errstr;
                         $dbh->rollback;  
200                          clear_cont;                          clear_cont;
                         $dbh->begin_work;  
201                          return 0;                          return 0;
202                  }                  }
203                  print "updated '$file' [",$files{$file}{id},"]\n";                  print "updated '$file' [",$files{$file}{id},"]\n";
# Line 275  Fuse::main( Line 262  Fuse::main(
262          write=>\&e_write,          write=>\&e_write,
263          utime=>\&e_utime,          utime=>\&e_utime,
264          truncate=>\&e_truncate,          truncate=>\&e_truncate,
265          debug=>1,          debug=>0,
266  );  );

Legend:
Removed from v.6  
changed lines
  Added in v.7

  ViewVC Help
Powered by ViewVC 1.1.26