common/tools/bitops.pl
changeset 1158 739036c00f80
child 1162 1127dea6b78b
--- /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 (<FILE>)
+  {
+    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();
+
+