--- loncom/interface/lonmysql.pm	2002/08/05 12:43:18	1.4
+++ loncom/interface/lonmysql.pm	2003/03/10 21:22:36	1.8
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # MySQL utility functions
 #
-# $Id: lonmysql.pm,v 1.4 2002/08/05 12:43:18 matthew Exp $
+# $Id: lonmysql.pm,v 1.8 2003/03/10 21:22:36 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -327,7 +327,10 @@ sub connect_to_db {
                                $Apache::lonnet::perlvar{'lonSqlAccess'},
                                { RaiseError=>0,PrintError=>0}))) {
         $debugstring = "Unable to connect to loncapa database.";    
-        if ($dbh->err) {
+        if (! defined($dbh)) {
+            $debugstring = "Unable to connect to loncapa database.";
+            $errorstring = "dbh was undefined.";
+        } elsif ($dbh->err) {
             $errorstring = "Connection error: ".$dbh->errstr;
         }
         return undef;
@@ -424,7 +427,7 @@ sub get_debug {
 
 =pod
 
-=item &update_table_info($table_id)
+=item &update_table_info()
 
 Inputs: table id
 
@@ -481,7 +484,7 @@ sub update_table_info {
     # Determine the column order
     #
     $db_command = "DESCRIBE $tablename";
-    my $sth = $dbh->prepare($db_command);
+    $sth = $dbh->prepare($db_command);
     $sth->execute();
     if ($sth->err) {
         $errorstring = "$dbh ATTEMPTED:\n".$db_command."\nRESULTING ERROR:\n".
@@ -504,7 +507,7 @@ sub update_table_info {
 
 =pod
 
-=item &create_table
+=item &create_table()
 
 Inputs: 
     table description
@@ -513,17 +516,20 @@ Input formats:
 
     table description = {
         permanent  => 'yes' or 'no',
-        columns => {
-            colA => {
-                type         => mysql type,
-                restrictions => 'NOT NULL' or empty,
-                primary_key  => 'yes' or empty,
-                auto_inc     => 'yes' or empty,
-            }
-            colB  => { .. }
-            colZ  => { .. }
-        },
-        column_order => [ colA, colB, ..., colZ],
+        columns => [
+                    { name         => 'colA',
+                      type         => mysql type,
+                      restrictions => 'NOT NULL' or empty,
+                      primary_key  => 'yes' or empty,
+                      auto_inc     => 'yes' or empty,
+                  },
+                    { name => 'colB',
+                      ...
+                  },
+                    { name => 'colC',
+                      ...
+                  },
+        ],
     }
 
 Returns:
@@ -543,9 +549,10 @@ sub create_table {
     my $table_id = &get_new_table_id();
     my $tablename = &translate_id($table_id);
     my $request = "CREATE TABLE IF NOT EXISTS ".$tablename." ";
-    foreach my $column (@{$table_des->{'column_order'}}) {
+    foreach my $coldata (@{$table_des->{'columns'}}) {
+        my $column = $coldata->{'name'};
+        next if (! defined($column));
         $col_des = '';
-        my $coldata = $table_des->{'columns'}->{$column};
         if (lc($coldata->{'type'}) =~ /(enum|set)/) { # 'enum' or 'set'
             $col_des.=$column." ".$coldata->{'type'}."('".
                 join("', '",@{$coldata->{'values'}})."')";
@@ -600,7 +607,7 @@ sub create_table {
 
 =pod
 
-=item &get_new_table_id
+=item &get_new_table_id()
 
 Used internally to prevent table name collisions.
 
@@ -609,7 +616,6 @@ Used internally to prevent table name co
 ###############################
 sub get_new_table_id {
     my $newid = 0;
-    my $name_regex = '^'.$ENV{'user.name'}.'_'.$ENV{'user.domain'}."_(\d+)\$";
     my @tables = &tables_in_db();
     foreach (@tables) {
         if (/^$ENV{'user.name'}_$ENV{'user.domain'}_(\d+)$/) {
@@ -623,7 +629,7 @@ sub get_new_table_id {
 
 =pod
 
-=item &get_rows
+=item &get_rows()
 
 Inputs: $table_id,$condition
 
@@ -657,11 +663,6 @@ sub get_rows {
     }
     $debugstring = "Got rows matching $condition";
     my @Results = @{$sth->fetchall_arrayref};
-    foreach my $row (@Results) {
-        for(my $i=0;$i<@$row;$i++) {
-            $row->[$i]=&Apache::lonnet::unescape($row->[$i]);
-        }
-    }
     return @Results;
 }
 
@@ -669,7 +670,7 @@ sub get_rows {
 
 =pod
 
-=item &store_row
+=item &store_row()
 
 Inputs: table id, row data
 
@@ -711,7 +712,7 @@ sub store_row {
         @Parameters = @$rowdata;
     } elsif (ref($rowdata) eq 'HASH') {
         foreach (@{$Tables{$tablename}->{'Col_order'}}) {
-            push(@Parameters,&Apache::lonnet::escape($rowdata->{$_}));
+            push(@Parameters,$rowdata->{$_});
         }
     } 
     $sth->execute(@Parameters);
@@ -728,7 +729,7 @@ sub store_row {
 
 =pod
 
-=item tables_in_db
+=item &tables_in_db()
 
 Returns a list containing the names of all the tables in the database.
 Returns undef on error.
@@ -738,7 +739,7 @@ Returns undef on error.
 ###########################################
 sub tables_in_db {
     return undef if (!defined(&connect_to_db()));
-    my $sth=$dbh->prepare('SHOW TABLES;');
+    my $sth=$dbh->prepare('SHOW TABLES');
     $sth->execute();
     if ($sth->err) {
         $errorstring = "$dbh ATTEMPTED:\n".'SHOW TABLES'.
@@ -758,7 +759,7 @@ sub tables_in_db {
 
 =pod
 
-=item &translate_id
+=item &translate_id()
 
 Used internally to translate a numeric table id into a MySQL table name.
 If the input $id contains non-numeric characters it is assumed to have 
@@ -781,7 +782,9 @@ sub translate_id {
 
 =pod
 
-=item &check_table($id)
+=item &check_table()
+
+Input: table id
 
 Checks to see if the requested table exists.  Returns 0 (no), 1 (yes), or 
 undef (error).
@@ -808,6 +811,45 @@ sub check_table {
     return $result;
 }
 
+###########################################
+
+=pod
+
+=item &remove_from_table()
+
+Input: $table_id, $column, $value
+
+Returns: the number of rows deleted.  undef on error.
+
+Executes a "delete from $tableid where $column like binary '$value'".
+
+=cut
+
+###########################################
+sub remove_from_table {
+    my ($table_id,$column,$value) = @_;
+    return undef if (!defined(&connect_to_db()));
+    #
+    $table_id = &translate_id($table_id);
+    my $command = 'DELETE FROM '.$table_id.' WHERE '.$dbh->quote($column).
+        " LIKE BINARY ".$dbh->quote($value);
+    my $sth = $dbh->prepare($command); 
+    $sth->execute();
+    if ($sth->err) {
+        $errorstring = "ERROR on execution of ".$command."\n".$sth->errstr;
+        return undef;
+    }
+    my $rows = $sth->rows;
+    return $rows;
+}
+
+
 1;
 
 __END__;
+
+=pod
+
+=back
+
+=cut