1 #!/usr/bin/perl -w
   2 
   3 use strict;
   4 use warnings;
   5 use File::Basename;
   6 use DBI;
   7 
   8 my $bin_dir = dirname($0);
   9 my $project = shift;
  10 my $db_file = shift;
  11 if (!defined($db_file)) {
  12     print "usage:  $0 <project> <db_file>\n";
  13     exit(1);
  14 }
  15 my $insertions = "$bin_dir/$project.insert.return_states";
  16 
  17 my $db = DBI->connect("dbi:SQLite:$db_file", "", "", {AutoCommit => 0});
  18 $db->do("PRAGMA cache_size = 800000");
  19 $db->do("PRAGMA journal_mode = OFF");
  20 $db->do("PRAGMA count_changes = OFF");
  21 $db->do("PRAGMA temp_store = MEMORY");
  22 $db->do("PRAGMA locking = EXCLUSIVE");
  23 
  24 sub insert_record($$$$$$$)
  25 {
  26     my $file = shift;
  27     my $func = shift;
  28     my $ret = shift;
  29     my $type = shift;
  30     my $param = shift;
  31     my $key = shift;
  32     my $value = shift;
  33 
  34 #    print "file = '$file' func = '$func' ret = $ret\n";
  35 #    print "type = $type param = $param, key = $key, value = '$value'\n";
  36 #    print "select file, return_id, return, static from return_states where function = '$func' and return = '$ret' and type = 0;'\n";
  37 
  38     my $sth;
  39     if ($file ne '') {
  40         $sth = $db->prepare("select file, return_id, static from return_states where file = ? and function = ? and return = ? and type = 0;");
  41         $sth->execute($file, $func, $ret);
  42     } else {
  43         $sth = $db->prepare("select file, return_id, static from return_states where function = ? and return = ? and type = 0;");
  44         $sth->execute($func, $ret);
  45     }
  46 
  47     my $insert = $db->prepare("insert into return_states values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);");
  48     while (my @row = $sth->fetchrow_array()) {
  49         my $file = $row[0];
  50         my $return_id = $row[1];
  51         my $static = $row[2];
  52 
  53         $insert->execute($file, $func, 0, $return_id, $ret, $static, $type, $param, $key, $value);
  54     }
  55 }
  56 
  57 my ($ret, $insert, $file, $func, $type, $param, $key, $value);
  58 
  59 open(FILE, "<$insertions");
  60 while (<FILE>) {
  61 
  62     if ($_ =~ /^\s*#/) {
  63         next;
  64     }
  65 
  66     ($ret, $insert) = split(/\|/, $_);
  67 
  68     if ($ret =~ /(.+),\W*(.+),\W*"(.*)"/) {
  69         $file = $1;
  70         $func = $2;
  71         $ret = $3;
  72     } elsif ($ret =~ /(.+),\W*"(.*)"/) {
  73         $file = "";
  74         $func = $1;
  75         $ret = $2;
  76     } else {
  77         next;
  78     }
  79 
  80     ($type, $param, $key, $value) = split(/,/, $insert);
  81 
  82     $type = int($type);
  83     $param = int($param);
  84     $key =~ s/^["\s]+|["\s]+$//g;
  85     $value =~ s/^["\s]+|["\s]+$//g;
  86     chomp($value);
  87 
  88     insert_record($file, $func, $ret, $type, $param, $key, $value);
  89 }
  90 close(FILE);
  91 
  92 $db->commit();
  93 $db->disconnect();