11f5207b7SJohn Levon#!/usr/bin/perl -w
21f5207b7SJohn Levon
31f5207b7SJohn Levonuse strict;
41f5207b7SJohn Levonuse warnings;
51f5207b7SJohn Levonuse bigint;
61f5207b7SJohn Levonuse DBI;
71f5207b7SJohn Levonuse Data::Dumper;
81f5207b7SJohn Levonuse File::Basename;
91f5207b7SJohn Levonuse Try::Tiny;
101f5207b7SJohn Levon
111f5207b7SJohn Levonmy $project = shift;
121f5207b7SJohn Levon$project =~ s/.*=(.*)/$1/;
131f5207b7SJohn Levonmy $warns = shift;
141f5207b7SJohn Levonmy $db_file = shift;
151f5207b7SJohn Levon
161f5207b7SJohn Levonsub preserve_existing_constraints()
171f5207b7SJohn Levon{
181f5207b7SJohn Levon    if (! -e "smatch_db.sqlite") {
191f5207b7SJohn Levon        return;
201f5207b7SJohn Levon    }
211f5207b7SJohn Levon
221f5207b7SJohn Levon    my $db = DBI->connect("dbi:SQLite:$db_file", "", "",);
231f5207b7SJohn Levon    $db->do('attach "smatch_db.sqlite" as old_db');
241f5207b7SJohn Levon    $db->do('insert into constraints select * from old_db.constraints');
251f5207b7SJohn Levon    $db->disconnect();
261f5207b7SJohn Levon}
271f5207b7SJohn Levon
281f5207b7SJohn Levonmy $db;
291f5207b7SJohn Levon
301f5207b7SJohn Levonsub connect_to_db($)
311f5207b7SJohn Levon{
321f5207b7SJohn Levon    my $name = shift;
331f5207b7SJohn Levon
341f5207b7SJohn Levon    $db = DBI->connect("dbi:SQLite:$name", "", "", {AutoCommit => 0});
351f5207b7SJohn Levon
361f5207b7SJohn Levon    $db->do("PRAGMA cache_size = 800000");
371f5207b7SJohn Levon    $db->do("PRAGMA journal_mode = OFF");
381f5207b7SJohn Levon    $db->do("PRAGMA count_changes = OFF");
391f5207b7SJohn Levon    $db->do("PRAGMA temp_store = MEMORY");
401f5207b7SJohn Levon    $db->do("PRAGMA locking = EXCLUSIVE");
411f5207b7SJohn Levon}
421f5207b7SJohn Levon
431f5207b7SJohn Levonsub load_manual_constraints($$)
441f5207b7SJohn Levon{
451f5207b7SJohn Levon    my $full_path = shift;
461f5207b7SJohn Levon    my $project = shift;
471f5207b7SJohn Levon    my $dir = dirname($full_path);
481f5207b7SJohn Levon
49*efe51d0cSJohn Levon    if ($project =~ /^$/) {
50*efe51d0cSJohn Levon        return;
51*efe51d0cSJohn Levon    }
52*efe51d0cSJohn Levon
531f5207b7SJohn Levon    open(FILE, "$dir/$project.constraints");
541f5207b7SJohn Levon    while (<FILE>) {
551f5207b7SJohn Levon        s/\n//;
561f5207b7SJohn Levon        $db->do("insert or ignore into constraints (str) values ('$_')");
571f5207b7SJohn Levon    }
581f5207b7SJohn Levon    close(FILE);
591f5207b7SJohn Levon
601f5207b7SJohn Levon    open(FILE, "$dir/$project.constraints_required");
611f5207b7SJohn Levon    while (<FILE>) {
621f5207b7SJohn Levon        my $limit;
631f5207b7SJohn Levon        my $dummy;
641f5207b7SJohn Levon
651f5207b7SJohn Levon        ($dummy, $dummy, $limit) = split(/,/);
661f5207b7SJohn Levon        $limit =~ s/^ +//;
671f5207b7SJohn Levon        $limit =~ s/\n//;
681f5207b7SJohn Levon        try {
691f5207b7SJohn Levon            $db->do("insert or ignore into constraints (str) values ('$limit')");
701f5207b7SJohn Levon        } catch {}
711f5207b7SJohn Levon    }
721f5207b7SJohn Levon    close(FILE);
731f5207b7SJohn Levon
741f5207b7SJohn Levon    $db->commit();
751f5207b7SJohn Levon}
761f5207b7SJohn Levon
771f5207b7SJohn Levonpreserve_existing_constraints();
781f5207b7SJohn Levon
791f5207b7SJohn Levonconnect_to_db($db_file);
801f5207b7SJohn Levonload_manual_constraints($0, $project);
811f5207b7SJohn Levon
821f5207b7SJohn Levon$db->commit();
831f5207b7SJohn Levon$db->disconnect();
84