1#!/usr/bin/perl -w 2 3use strict; 4use warnings; 5use bigint; 6use DBI; 7use Data::Dumper; 8use File::Basename; 9use Try::Tiny; 10 11my $project = shift; 12$project =~ s/.*=(.*)/$1/; 13my $warns = shift; 14my $db_file = shift; 15 16sub 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 28my $db; 29 30sub 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 43sub 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 73preserve_existing_constraints(); 74 75connect_to_db($db_file); 76load_manual_constraints($0, $project); 77 78$db->commit(); 79$db->disconnect(); 80