--- loncom/interface/lonmysql.pm	2003/04/18 15:50:55	1.13
+++ loncom/interface/lonmysql.pm	2004/04/19 21:29:15	1.20
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # MySQL utility functions
 #
-# $Id: lonmysql.pm,v 1.13 2003/04/18 15:50:55 matthew Exp $
+# $Id: lonmysql.pm,v 1.20 2004/04/19 21:29:15 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -32,6 +32,8 @@ package Apache::lonmysql;
 use strict;
 use DBI;
 use Apache::lonnet();
+use POSIX qw(strftime mktime);
+
 
 ######################################################################
 ######################################################################
@@ -557,7 +559,27 @@ sub update_table_info {
     $debugstring = "Retrieved table info for $tablename";
     return 1;
 }
+###############################
+
+=pod
+
+=item &col_order()
+
+Inputs: table id
+
+Returns: array with column order
 
+=cut
+
+
+sub col_order {
+    my $table_id=shift;
+    if (&update_table_info($table_id)) {
+	return @{$Tables{$table_id}->{'Col_order'}};
+    } else {
+	return ();
+    }
+}
 ###############################
 
 =pod
@@ -692,7 +714,8 @@ sub create_table {
     #############################################
     my $count = $dbh->do($request);
     if (! defined($count)) {
-        $errorstring = "$dbh ATTEMPTED:\n".$request."\nRESULTING ERROR:\n";
+        $errorstring = "$dbh ATTEMPTED:\n".$request."\nRESULTING ERROR:\n".
+            $dbh->errstr();
         return undef;
     }
     #
@@ -910,18 +933,20 @@ sub tables_in_db {
     return undef if (!defined(&connect_to_db()));
     my $sth=$dbh->prepare('SHOW TABLES');
     $sth->execute();
-    if ($sth->err) {
-        $errorstring = "$dbh ATTEMPTED:\n".'SHOW TABLES'.
+    $sth->execute();
+    my $aref = $sth->fetchall_arrayref;
+    if ($sth->err()) {
+        $errorstring = 
+            "$dbh ATTEMPTED:\n".'fetchall_arrayref after SHOW TABLES'.
             "\nRESULTING ERROR:\n".$sth->errstr;
         return undef;
     }
-    my $aref = $sth->fetchall_arrayref;
-    my @table_list=();
+    my @table_list;
     foreach (@$aref) {
-        push @table_list,$_->[0];
+        push(@table_list,$_->[0]);
     }
-    $debugstring = "Got list of tables in DB: @table_list";
-    return @table_list;
+    $debugstring = "Got list of tables in DB: ".join(',',@table_list);
+    return(@table_list);
 }
 
 ###########################################
@@ -1000,11 +1025,10 @@ sub remove_from_table {
     return undef if (!defined(&connect_to_db()));
     #
     $table_id = &translate_id($table_id);
-    my $command = 'DELETE FROM '.$table_id.' WHERE '.$dbh->quote($column).
+    my $command = 'DELETE FROM '.$table_id.' WHERE '.$column.
         " LIKE BINARY ".$dbh->quote($value);
     my $sth = $dbh->prepare($command); 
-    $sth->execute();
-    if ($sth->err) {
+    unless ($sth->execute()) {
         $errorstring = "ERROR on execution of ".$command."\n".$sth->errstr;
         return undef;
     }
@@ -1013,6 +1037,67 @@ sub remove_from_table {
     return $rows;
 }
 
+###########################################
+
+=pod
+
+=item drop_table($table_id)
+
+Issues a 'drop table if exists' command
+
+=cut
+
+###########################################
+
+sub drop_table {
+    my ($table_id) = @_;
+    return undef if (!defined(&connect_to_db()));
+    #
+    $table_id = &translate_id($table_id);
+    my $command = 'DROP TABLE IF EXISTS '.$table_id;
+    my $sth = $dbh->prepare($command); 
+    $sth->execute();
+    if ($sth->err) {
+        $errorstring = "ERROR on execution of ".$command."\n".$sth->errstr;
+        return undef;
+    }
+    $debugstring = $command;
+    delete($Tables{$table_id}); # remove any knowledge of the table
+    return 1; # if we got here there was no error, so return a 'true' value
+}
+
+
+
+
+# ---------------------------- convert 'time' format into a datetime sql format
+sub sqltime {
+    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
+	localtime(&unsqltime($_[0]));
+    $mon++; $year+=1900;
+    return "$year-$mon-$mday $hour:$min:$sec";
+}
+
+sub maketime {
+    my %th=@_;
+    return POSIX::mktime(($th{'seconds'},$th{'minutes'},$th{'hours'},
+                          $th{'day'},$th{'month'}-1,
+                          $th{'year'}-1900,0,0,$th{'dlsav'}));
+}
+
+
+#########################################
+#
+# Retro-fixing of un-backward-compatible time format
+
+sub unsqltime {
+    my $timestamp=shift;
+    if ($timestamp=~/^(\d+)\-(\d+)\-(\d+)\s+(\d+)\:(\d+)\:(\d+)$/) {
+        $timestamp=&maketime('year'=>$1,'month'=>$2,'day'=>$3,
+                             'hours'=>$4,'minutes'=>$5,'seconds'=>$6);
+    }
+    return $timestamp;
+}
+
 
 1;