1 #!/usr/bin/perl -w
   2 
   3 use strict;
   4 use warnings;
   5 use bigint;
   6 use DBI;
   7 use Data::Dumper;
   8 use File::Basename;
   9 use Try::Tiny;
  10 
  11 my $project = shift;
  12 $project =~ s/.*=(.*)/$1/;
  13 my $warns = shift;
  14 my $db_file = shift;
  15 
  16 sub preserve_existing_constraints()
  17 {
  18     if (! -e "smatch_db.sqlite") {
  19         return;
  20     }
  21 
  22     my $db = DBI->connect("dbi:SQLite:$db_file", "", "",);
  23     $db->do('attach "smatch_db.sqlite" as old_db');
  24     $db->do('insert into constraints select * from old_db.constraints');
  25     $db->disconnect();
  26 }
  27 
  28 my $db;
  29 
  30 sub connect_to_db($)
  31 {
  32     my $name = shift;
  33 
  34     $db = DBI->connect("dbi:SQLite:$name", "", "", {AutoCommit => 0});
  35 
  36     $db->do("PRAGMA cache_size = 800000");
  37     $db->do("PRAGMA journal_mode = OFF");
  38     $db->do("PRAGMA count_changes = OFF");
  39     $db->do("PRAGMA temp_store = MEMORY");
  40     $db->do("PRAGMA locking = EXCLUSIVE");
  41 }
  42 
  43 sub load_manual_constraints($$)
  44 {
  45     my $full_path = shift;
  46     my $project = shift;
  47     my $dir = dirname($full_path);
  48 
  49     if ($project =~ /^$/) {
  50         return;
  51     }
  52 
  53     open(FILE, "$dir/$project.constraints");
  54     while (<FILE>) {
  55         s/\n//;
  56         $db->do("insert or ignore into constraints (str) values ('$_')");
  57     }
  58     close(FILE);
  59 
  60     open(FILE, "$dir/$project.constraints_required");
  61     while (<FILE>) {
  62         my $limit;
  63         my $dummy;
  64 
  65         ($dummy, $dummy, $limit) = split(/,/);
  66         $limit =~ s/^ +//;
  67         $limit =~ s/\n//;
  68         try {
  69             $db->do("insert or ignore into constraints (str) values ('$limit')");
  70         } catch {}
  71     }
  72     close(FILE);
  73 
  74     $db->commit();
  75 }
  76 
  77 preserve_existing_constraints();
  78 
  79 connect_to_db($db_file);
  80 load_manual_constraints($0, $project);
  81 
  82 $db->commit();
  83 $db->disconnect();