--- loncom/interface/lonmysql.pm	2003/03/13 19:08:52	1.9
+++ loncom/interface/lonmysql.pm	2003/12/27 01:44:49	1.17
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # MySQL utility functions
 #
-# $Id: lonmysql.pm,v 1.9 2003/03/13 19:08:52 matthew Exp $
+# $Id: lonmysql.pm,v 1.17 2003/12/27 01:44:49 www 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);
+
 
 ######################################################################
 ######################################################################
@@ -348,6 +350,33 @@ sub connect_to_db {
 
 =pod
 
+=item &verify_sql_connection()
+
+Inputs: none.
+
+Returns: 0 (failure) or 1 (success)
+
+Checks to make sure the database can be connected to.  It does not
+initialize anything in the lonmysql package.
+
+=cut
+
+###############################
+sub verify_sql_connection {
+    my $connection;
+    if (! ($connection = DBI->connect("DBI:mysql:loncapa","www",
+                                      $Apache::lonnet::perlvar{'lonSqlAccess'},
+                                      { RaiseError=>0,PrintError=>0}))) {
+        return 0;
+    }
+    undef($connection);
+    return 1;
+}
+
+###############################
+
+=pod
+
 =item &disconnect_from_db()
 
 Inputs: none.
@@ -396,6 +425,26 @@ sub number_of_rows {
     return undef if (! defined(&update_table_info($table_id)));
     return $Tables{&translate_id($table_id)}->{'Rows'};
 }
+###############################
+
+=pod
+
+=item &get_dbh()
+
+Input: nothing
+
+Returns: the database handler, or undef on error.
+
+This routine allows the programmer to gain access to the database handler.
+Be careful.
+
+=cut
+
+###############################
+sub get_dbh { 
+    return undef if (! defined(&connect_to_db()));
+    return $dbh;
+}
 
 ###############################
 
@@ -539,16 +588,16 @@ Input formats:
                   },
         ],
         'PRIMARY KEY' => (index_col_name,...),
-         KEY => { name => 'idx_name', 
-                  columns => (col1,col2,..),},
-         INDEX => { name => 'idx_name', 
-                    columns => (col1,col2,..),},
-         UNIQUE => { index => 'yes',
+         KEY => [{ name => 'idx_name', 
+                  columns => (col1,col2,..),},],
+         INDEX => [{ name => 'idx_name', 
+                    columns => (col1,col2,..),},],
+         UNIQUE => [{ index => 'yes',
                      name => 'idx_name',
-                     columns => (col1,col2,..),},
-         FULLTEXT => { index => 'yes',
+                     columns => (col1,col2,..),},],
+         FULLTEXT => [{ index => 'yes',
                        name => 'idx_name',
-                       columns => (col1,col2,..),},
+                       columns => (col1,col2,..),},],
 
     }
 
@@ -606,30 +655,35 @@ sub create_table {
         push (@Columns,'PRIMARY KEY ('.join(',',@{$table_des->{'PRIMARY KEY'}})
               .')');
     }
-    foreach ('KEY','INDEX') {
-        if (exists($table_des->{$_})) {
-            my $text = $_.' ';
-            if (exists($table_des->{$_}->{'name'})) {
-                $text .=$table_des->{$_}->{'name'};
+    #
+    foreach my $indextype ('KEY','INDEX') {
+        next if (!exists($table_des->{$indextype}));
+        foreach my $indexdescription (@{$table_des->{$indextype}}) {
+            my $text = $indextype.' ';
+            if (exists($indexdescription->{'name'})) {
+                $text .=$indexdescription->{'name'};
             }
-            $text .= ' ('.join(',',@{$table_des->{$_}->{'columns'}}).')';
+            $text .= ' ('.join(',',@{$indexdescription->{'columns'}}).')';
             push (@Columns,$text);
         }
     }
-    foreach ('UNIQUE','FULLTEXT') {
-        if (exists($table_des->{$_})) {
-            my $text = $_.' ';
-            if (exists($table_des->{$_}->{'index'}) &&
-                $table_des->{$_}->{'index'} eq 'yes') {
+    #
+    foreach my $indextype ('UNIQUE','FULLTEXT') {
+        next if (! exists($table_des->{$indextype}));
+        foreach my $indexdescription (@{$table_des->{$indextype}}) {
+            my $text = $indextype.' ';
+            if (exists($indexdescription->{'index'}) &&
+                $indexdescription->{'index'} eq 'yes') {
                 $text .= 'INDEX ';
             }
-            if (exists($table_des->{$_}->{'name'})) {
-                $text .=$table_des->{$_}->{'name'};
+            if (exists($indexdescription->{'name'})) {
+                $text .=$indexdescription->{'name'};
             }
-            $text .= ' ('.join(',',@{$table_des->{$_}->{'columns'}}).')';
+            $text .= ' ('.join(',',@{$indexdescription->{'columns'}}).')';
             push (@Columns,$text);
         }
     }
+    #
     $request .= "(".join(", ",@Columns).") ";
     unless($table_des->{'permanent'} eq 'yes') {
         $request.="COMMENT = 'temporary' ";
@@ -948,18 +1002,79 @@ 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;
     }
+    $debugstring = $command;
     my $rows = $sth->rows;
     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;