diff -r 06290277aa33 -r 739036c00f80 common/tools/bitops.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/common/tools/bitops.pl Fri Jul 09 17:55:07 2010 +0100 @@ -0,0 +1,484 @@ +use strict; +use Date::Calc qw{Delta_DHMS This_Year}; +use DBI; + +use Getopt::Long; + +my $help = 0; +my $create = 0; +my $id = ''; +my $file = ''; +my $verbose = 0; +GetOptions(( + 'create!' => \$create, + 'file=s' => \$file, + 'id=s' => \$id, + 'help!' => \$help, + 'verbose!' => \$verbose +)); + +if ($help||!$file) +{ + print <<_EOH; +bitops +Executes operations on the BIT db + +Usage: bitops.pl [-c|-i ID] -f FILE + +Options: + -h, --help Show this help message and exit + -c, --create Create entry for a new build then set the attributes to + the values provided in FILE. Returns the build id for + the newly created build. + -i ID, --id ID Update entry for build number ID with the values + provided in FILE. + -f FILE, --file FILE Use attributes in FILE to create/update the build info + See below for file format. + +File format: + File must be a list of attribute-value-pairs. One avp per line, on each line + attribute and value are separated by a tab. + These are the supported attributes (in brackets the syntax of the value): + - build_id_string + - package (VALUE) + - platform (VALUE) + - started (VALUE) + - finished (VALUE) + - creator (VALUE) + - machine (VALUE) + - build_brag (VALUE) + - test_brag (VALUE) + - baseline_short (VALUE) + - sources_short (VALUE) + - envinfo (TOOL,VERSION) + - failure (CATEGORY,COUNT) + - report (NAME,URL,TYPE) + - content (NAME,URL,REVISION) + - label (VALUE) +_EOH + exit(0); +} + +my $db = undef; + +my $builds_entry = {}; +my $envinfo = []; +my $failures = []; +my $reports = []; +my $content = []; +my $labels = []; +my $testing_entry = {}; + +sub ConnectToDB() +{ + $db = DBI->connect('DBI:mysql:bit:v800016:3306','fbf','mysql') + or die("Couldn't connect to database: " . DBI->errstr()); +} + +sub DisconnectFromDB() +{ + $db->disconnect(); +} + +sub parse_file +{ + my ($file) = @_; + + open(FILE, $file) or die "Can't open file $file"; + + while () + { + my $line = $_; + chomp $line; + $line =~ s/^\s//g; + $line =~ s/\s$//g; + next if ($line !~ /[^\s]/); + + if ($line =~ /([^\t]+)\t([^\t]+)/) + { + my $attr = $1; + my $value = $2; + + if ($attr =~ /^(build_id_string|package|platform|started|finished|creator|machine|build_brag|test_brag|baseline_short|sources_short)$/i) + { + $attr = lc($attr); + print " found ($attr,$value) for table 'build'\n" if ($verbose); + $builds_entry->{$attr}=$value; + } + elsif ($attr =~ /^(envinfo)$/i) + { + $attr = lc($attr); + if ($value =~ /([^,]*),([^,]*)/) + { + my $tool = $1; + my $version = $2; + + if (!$tool || !$version) + { + print "ERROR: Tool or version empty: \"$value\"\n"; + return 1; + } + print " found ($tool,$version) for table 'envinfo'\n" if ($verbose); + push(@{$envinfo}, {tool=>$tool, version=>$version}); + } + else + { + print "ERROR: Could not understand value of envinfo: \"$value\"\n"; + return 1; + } + } + elsif ($attr =~ /^(failure)$/i) + { + $attr = lc($attr); + if ($value =~ /([^,]*),([^,]*)/) + { + my $category = $1; + my $count = $2; + + if (!$category || !$count) + { + print "ERROR: Category or count empty: \"$value\"\n"; + return 1; + } + print " found ($category,$count) for table 'failures'\n" if ($verbose); + push(@{$failures}, {category=>$category, count=>$count}); + } + else + { + print "ERROR: Could not understand value of failure: \"$value\"\n"; + return 1; + } + } + elsif ($attr =~ /^(report)$/i) + { + $attr = lc($attr); + if ($value =~ /([^,]*),([^,]*),([^,]*)/) + { + my $name = $1; + my $url = $2; + my $type = $3; + + if (!$name || !$url || !$type) + { + print "ERROR: Name, url or type empty: \"$value\"\n"; + return 1; + } + print " found ($name,$url,$type) for table 'reports'\n" if ($verbose); + push(@{$reports}, {name=>$name, url=>$url, type=>$type}); + } + else + { + print "ERROR: Could not understand value of report: \"$value\"\n"; + return 1; + } + } + elsif ($attr =~ /^(content)$/i) + { + $attr = lc($attr); + if ($value =~ /([^,]*),([^,]*),([^,]*)/) + { + my $name = $1; + my $url = $2; + my $revision = $3; + + if (!$name || !$url || !$revision) + { + print "ERROR: Name, url or revision empty: \"$value\"\n"; + return 1; + } + print " found ($name,$url,$revision) for table 'content'\n" if ($verbose); + push(@{$reports}, {name=>$name, url=>$url, revision=>$revision}); + } + else + { + print "ERROR: Could not understand value of content: \"$value\"\n"; + return 1; + } + } + elsif ($attr =~ /^(label)$/i) + { + print " found ($attr,$value) for table 'labels'\n" if ($verbose); + push(@{$labels}, {label=>$value}); + } + else + { + print "ERROR: Could not understand avp: \"$line\"\n"; + return 1; + } + + } + else + { + print "WARNING: line \"$line\" does not seem a correctly formed attribute-value-pair (tab-separated)\n"; + return 1; + } + } + + close(FILE); + return 0; +} + +# MAIN PROGRAM + +my $r=parse_file($file); +if ($r) +{ + print "Error while parsing file $file\n"; + exit(1); +} + +ConnectToDB(); +my $newbuildid = -1; +if ($create) +{ + if (keys %{$builds_entry}) + { + my $field_list = ''; + my $qm_list = ''; + my @fields = (); + for my $field (keys %{$builds_entry}) + { + $field_list .= "$field,"; + $qm_list .= "?,"; + push(@fields,$builds_entry->{$field}); + } + $field_list =~ s/,$//; + $qm_list =~ s/,$//; + + my $query = $db->prepare("insert into builds ($field_list) values ($qm_list)") + or die("Couldn't prepare query insert into builds: " . $db->errstr()); + + $query->execute(@fields) + or print "WARNING: Couldn't execute insert into builds (@fields): " . $db->errstr() . "\n"; + + $newbuildid = $db->last_insert_id(undef, undef, undef, undef); + } + if (@{$envinfo}) + { + my $query = $db->prepare_cached("insert into envinfo (build_id,tool,version) values ($newbuildid,?,?)") + or die("Couldn't prepare query insert into envinfo: " . $db->errstr()); + + for my $entry (@{$envinfo}) + { + my $tool = $entry->{tool}; + my $version = $entry->{version}; + + $query->execute($tool, $version) + or print "WARNING: Couldn't execute insert into envinfo ($tool,$version): " . $db->errstr() . "\n"; + } + } + if (@{$failures}) + { + print " prepare_cached 'insert into failures (build_id,category,count) values ($newbuildid,?,?)'\n" if ($verbose); + my $query = $db->prepare_cached("insert into failures (build_id,category,count) values ($newbuildid,?,?)") + or die("Couldn't prepare query insert into failures: " . $db->errstr()); + + for my $entry (@{$failures}) + { + my $category = $entry->{category}; + my $count = $entry->{count}; + + print " execute '$category, $count'\n" if ($verbose); + $query->execute($category, $count) + or print "WARNING: Couldn't execute insert into failures ($category,$count): " . $db->errstr() . "\n"; + } + } + if (@{$reports}) + { + print " prepare_cached 'insert into reports (build_id,name,url,type) values ($newbuildid,?,?,?)'\n" if ($verbose); + my $query = $db->prepare_cached("insert into reports (build_id,name,url,type) values ($newbuildid,?,?,?)") + or die("Couldn't prepare query insert into reports: " . $db->errstr()); + + for my $entry (@{$reports}) + { + my $name = $entry->{name}; + my $url = $entry->{url}; + my $type = $entry->{type}; + + print " execute '$name, $url, $type'\n" if ($verbose); + $query->execute($name, $url, $type) + or print "WARNING: Couldn't execute insert into reports ($name,$url,$type): " . $db->errstr() . "\n"; + } + } + if (@{$content}) + { + print " prepare_cached 'insert into content (build_id,name,url,revision) values ($newbuildid,?,?,?)'\n" if ($verbose); + my $query = $db->prepare_cached("insert into content (build_id,name,url,revision) values ($newbuildid,?,?,?)") + or die("Couldn't prepare query insert into content: " . $db->errstr()); + + for my $entry (@{$content}) + { + my $name = $entry->{name}; + my $url = $entry->{url}; + my $revision = $entry->{revision}; + + print " execute '$name, $url, $revision'\n" if ($verbose); + $query->execute($name, $url, $revision) + or print "WARNING: Couldn't execute insert into content ($name,$url,$revision): " . $db->errstr() . "\n"; + } + } + if (@{$labels}) + { + print " prepare_cached 'insert into labels (build_id,label) values ($newbuildid,?)'\n" if ($verbose); + my $query = $db->prepare_cached("insert into labels (build_id,label) values ($newbuildid,?)") + or die("Couldn't prepare query insert into labels: " . $db->errstr()); + + for my $entry (@{$labels}) + { + my $label = $entry->{label}; + + print " execute '$label'\n" if ($verbose); + $query->execute($label) + or print "WARNING: Couldn't execute insert into revision ($label): " . $db->errstr() . "\n"; + } + } + print "new build id: $newbuildid\n"; +} +else +{ + print "Updating build $id\n"; + + if (keys %{$builds_entry}) + { + my $field_list = ''; + my @fields = (); + for my $field (keys %{$builds_entry}) + { + $field_list .= "$field=?,"; + push(@fields,$builds_entry->{$field}); + } + $field_list =~ s/,$//; + + print " prepare 'update builds set $field_list where id=$id'\n" if ($verbose); + my $query = $db->prepare("update builds set $field_list where id=$id") + or die("Couldn't prepare query update builds: " . $db->errstr()); + + print " execute '@fields'\n" if ($verbose); + $query->execute(@fields) + or print "WARNING: Couldn't execute update builds (@fields): " . $db->errstr() . "\n"; + } + if (@{$envinfo}) + { + print " prepare 'delete from envinfo where build_id=$id'\n" if ($verbose); + my $delete_query = $db->prepare("delete from envinfo where build_id=$id") + or die("Couldn't prepare query delete from envinfo: " . $db->errstr()); + + print " execute ''\n" if ($verbose); + $delete_query->execute() + or print "WARNING: Couldn't execute delete from envinfo: " . $db->errstr() . "\n"; + + print " prepare 'insert into envinfo (build_id,tool,version) values ($id,?,?)'\n" if ($verbose); + my $query = $db->prepare_cached("insert into envinfo (build_id,tool,version) values ($id,?,?)") + or die("Couldn't prepare query insert into envinfo: " . $db->errstr()); + + for my $entry (@{$envinfo}) + { + my $tool = $entry->{tool}; + my $version = $entry->{version}; + + print " execute '$tool,$version'\n" if ($verbose); + $query->execute($tool, $version) + or print "WARNING: Couldn't execute insert into envinfo ($tool,$version): " . $db->errstr() . "\n"; + } + } + if (@{$failures}) + { + print " prepare 'delete from failures where build_id=$id'\n" if ($verbose); + my $delete_query = $db->prepare("delete from failures where build_id=$id") + or die("Couldn't prepare query delete from failures: " . $db->errstr()); + + print " execute ''\n" if ($verbose); + $delete_query->execute() + or print "WARNING: Couldn't execute delete from failures: " . $db->errstr() . "\n"; + + print " prepare 'insert into failures (build_id,category,count) values ($id,?,?)'\n" if ($verbose); + my $query = $db->prepare_cached("insert into failures (build_id,category,count) values ($id,?,?)") + or die("Couldn't prepare query insert into failures: " . $db->errstr()); + + for my $entry (@{$failures}) + { + my $category = $entry->{category}; + my $count = $entry->{count}; + + print " execute '$category,$count'\n" if ($verbose); + $query->execute($category, $count) + or print "WARNING: Couldn't execute insert into failures ($category,$count): " . $db->errstr() . "\n"; + } + } + if (@{$reports}) + { + print " prepare 'delete from reports where build_id=$id'\n" if ($verbose); + my $delete_query = $db->prepare("delete from reports where build_id=$id") + or die("Couldn't prepare query delete from reports: " . $db->errstr()); + + print " execute ''\n" if ($verbose); + $delete_query->execute() + or print "WARNING: Couldn't execute delete from reports: " . $db->errstr() . "\n"; + + print " prepare 'insert into reports (build_id,name,url,type) values ($id,?,?,?)'\n" if ($verbose); + my $query = $db->prepare_cached("insert into reports (build_id,name,url,type) values ($id,?,?,?)") + or die("Couldn't prepare query insert into failures: " . $db->errstr()); + + for my $entry (@{$reports}) + { + my $name = $entry->{name}; + my $url = $entry->{url}; + my $type = $entry->{type}; + + print " execute '$name,$url,$type'\n" if ($verbose); + $query->execute($name, $url, $type) + or print "WARNING: Couldn't execute insert into reports ($name,$url,$type): " . $db->errstr() . "\n"; + } + } + if (@{$content}) + { + print " prepare 'delete from content where build_id=$id'\n" if ($verbose); + my $delete_query = $db->prepare("delete from content where build_id=$id") + or die("Couldn't prepare query delete from content: " . $db->errstr()); + + print " execute ''\n" if ($verbose); + $delete_query->execute() + or print "WARNING: Couldn't execute delete from content: " . $db->errstr() . "\n"; + + print " prepare 'insert into content (build_id,name,url,revision) values ($id,?,?,?)'\n" if ($verbose); + my $query = $db->prepare_cached("insert into content (build_id,name,url,revision) values ($id,?,?,?)") + or die("Couldn't prepare query insert into content: " . $db->errstr()); + + for my $entry (@{$content}) + { + my $name = $entry->{name}; + my $url = $entry->{url}; + my $revision = $entry->{revision}; + + print " execute '$name,$url,$revision'\n" if ($verbose); + $query->execute($name, $url, $revision) + or print "WARNING: Couldn't execute insert into content ($name,$url,$revision): " . $db->errstr() . "\n"; + } + } + if (@{$labels}) + { + print " prepare 'delete from labels where build_id=$id'\n" if ($verbose); + my $delete_query = $db->prepare("delete from labels where build_id=$id") + or die("Couldn't prepare query delete from labels: " . $db->errstr()); + + print " execute ''\n" if ($verbose); + $delete_query->execute() + or print "WARNING: Couldn't execute delete from labels: " . $db->errstr() . "\n"; + + print " prepare 'insert into labels (build_id,label) values ($id,?)'\n" if ($verbose); + my $query = $db->prepare_cached("insert into label (build_id,label) values ($id,?)") + or die("Couldn't prepare query insert into label: " . $db->errstr()); + + for my $entry (@{$labels}) + { + my $label = $entry->{label}; + + print " execute '$label'\n" if ($verbose); + $query->execute($label) + or print "WARNING: Couldn't execute insert into labels ($label): " . $db->errstr() . "\n"; + } + } +} +DisconnectFromDB(); + +