[rtg] Bug in targetmaker [WAS: RTG 9]

Brandon Ewing nicotine at warningg.com
Mon Mar 24 15:49:12 EDT 2008


On Fri, Mar 21, 2008 at 04:34:24PM -0500, Brandon Ewing wrote:
> On Sun, Mar 02, 2008 at 07:19:45AM -0600, Brian T. O'Neill wrote:
> > Let me know what issue's you're seeing please, I'll get them taken care
> > of ASAP.
> > 
> > Brian
> 
> There appears to be a bug in the CVS version of targetmaker, but I'm no perl
> guru, so I'm having trouble figuring out how to fix it.
> 
> Every time I run targetmaker, it always inserts additional rows into 
> options_table.  From looking at the code, it appears that it is trying to
> check to see if a row exists, inserting it if it doesn't, and only updating
> if necessary.
> 
> Unfortunately, something appears to be going horribly wrong.
> 
> Wouldn't it make more sense to replace the whole check, INSERT/UPDATE thing
> with just a REPLACE statement, since it appears there's already a key 
> composed of the 3 columns?
> 

Attached patch changes options_table.graphname into a primary key, removes
the select / insert / update check with a simple REPLACE.

-- 
Brandon Ewing                                        (nicotine at warningg.com)
-------------- next part --------------
--- targetmaker/etc/targetmaker.orig	2008-03-24 14:30:37.000000000 -0500
+++ targetmaker/etc/targetmaker	2008-03-24 14:36:55.000000000 -0500
@@ -748,7 +748,7 @@
             (graphname VARCHAR(64) NOT NULL, options VARCHAR(128) NOT NULL, \
             class VARCHAR(32) NOT NULL )";
         &sql_insert($sql);
-        $sql = "CREATE INDEX options_graphname_idx on options_table(graphname)";
+        $sql = "CREATE UNIQUE INDEX options_graphname_idx on options_table(graphname)";
         &sql_insert($sql);
         $sql = "CREATE INDEX options_options_idx on options_table(options)";
         &sql_insert($sql);
@@ -760,31 +760,8 @@
         $sql = "DELETE FROM mapping_table WHERE graphname='$graph'";
         &sql_insert($sql);
 
-        if($DB_TYPE =~ /mysql/i) {
-            $sql = "SELECT * FROM options_table where graphname='$graph'";
-            debug("SQL: $sql");
-            $sth = $dbh->prepare($sql)
-                or die "Can't prepare $sql: $dbh->errstr\n";
-        } elsif($DB_TYPE =~ /oracle/i) {
-            $sql = "SELECT * FROM options_table where graphname=:graph";
-            debug("SQL: $sql");
-            $sth = $dbh->prepare($sql)
-                or die "Can't prepare $sql: $dbh->errstr\n";
-            $sth->bind_param(":graph",$graph);
-        }
-        my $rv = $sth->execute
-            or die "can't execute the query: $sth->errstr\n";
-        my @row = $sth->fetchrow_array();
-        unless ( $#row == 0 ) {
-            $sql = "INSERT INTO options_table VALUES ('$graph','@{$table_options{$graph}}','$table_class{$graph}')";
-            &sql_insert($sql);
-        } 
-        else {
-            if($row[1] ne join(@{$table_options{$graph}}) || $row[2] ne $table_class{$graph}) {
-                $sql = "UPDATE options_table SET options='".join(" ",@{$table_options{$graph}})."',class='$table_class{$graph}' WHERE graphname='$graph'";
-                &sql_insert($sql);
-            }
-        }
+        $sql = "REPLACE INTO options_table VALUES ('$graph','@{$table_options{$graph}}','$table_class{$graph}')";
+        &sql_insert($sql);
 
         foreach $table (@{$table_map{$graph}}) {
             $sql = "SELECT * FROM mapping_table WHERE graphname='$graph' AND tablename='$table'";
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
Url : http://lists.grdata.com/pipermail/rtg/attachments/20080324/30b2cd6d/attachment.bin 


More information about the RTG mailing list