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 open(FILE, "$dir/$project.constraints"); 50 while (<FILE>) { 51 s/\n//; 52 $db->do("insert or ignore into constraints (str) values ('$_')"); 53 } 54 close(FILE); 55 56 open(FILE, "$dir/$project.constraints_required"); 57 while (<FILE>) { 58 my $limit; 59 my $dummy; 60 61 ($dummy, $dummy, $limit) = split(/,/); 62 $limit =~ s/^ +//; 63 $limit =~ s/\n//; 64 try { 65 $db->do("insert or ignore into constraints (str) values ('$limit')"); 66 } catch {} 67 } 68 close(FILE); 69 70 $db->commit(); 71 } 72 73 preserve_existing_constraints(); 74 75 connect_to_db($db_file); 76 load_manual_constraints($0, $project); 77 78 $db->commit(); 79 $db->disconnect();