--- loncom/interface/lonmysql.pm	2005/02/21 17:23:32	1.27
+++ loncom/interface/lonmysql.pm	2005/08/24 19:21:05	1.34
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # MySQL utility functions
 #
-# $Id: lonmysql.pm,v 1.27 2005/02/21 17:23:32 matthew Exp $
+# $Id: lonmysql.pm,v 1.34 2005/08/24 19:21:05 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -32,10 +32,12 @@ package Apache::lonmysql;
 use strict;
 use DBI;
 use POSIX qw(strftime mktime);
+use Apache::lonnet;
 
 my $mysqluser;
 my $mysqlpassword;
 my $mysqldatabase;
+my %db_config;
 
 sub set_mysql_user_and_password {
     # If we are running under Apache and LONCAPA, use the LON-CAPA 
@@ -89,7 +91,7 @@ Each table has a numeric ID that is a pa
 The table id is returned by &create_table.  
 If you lose the table id, it is lost forever.
 The table names in MySQL correspond to 
-$ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'.$table_id.  If the table id 
+$env{'user.name'}.'_'.$env{'user.domain'}.'_'.$table_id.  If the table id 
 is non-numeric, it is assumed to be the full name of a table.  If you pass
 the table id in a form, you MUST ensure that what you send to lonmysql is
 numeric, otherwise you are opening up all the tables in the MySQL database.
@@ -374,6 +376,22 @@ sub connect_to_db {
         return undef;
     }
     $debugstring = "Successfully connected to loncapa database.";    
+    # Determine DB configuration
+    undef(%db_config);
+    my $sth = $dbh->prepare("SHOW VARIABLES");
+    $sth->execute();
+    if ($sth->err()) {
+        $debugstring = "Unable to retrieve db config variables";
+        return undef;
+    }
+    foreach my $row (@{$sth->fetchall_arrayref}) {
+        $db_config{$row->[0]} = $row->[1];
+    }
+    #&Apache::lonnet::logthis("MySQL configuration variables");
+    #while (my ($k,$v) = each(%db_config)) {
+    #    &Apache::lonnet::logthis("    '$k' => '$v'");
+    #}
+    #
     return 1;
 }
 
@@ -553,10 +571,19 @@ sub update_table_info {
     #
     # Get MySQLs table status information.
     #
-    my @tabledesc = qw/
-        Name Type Row_format Rows Avg_row_length Data_length
+    my @tabledesc;
+    my ($major_version) = ($db_config{'version'} =~ /^(\d)\./);
+    if ($major_version <= 3) {
+        @tabledesc = qw/
+            Name Type Row_format Rows Avg_row_length Data_length
             Max_data_length Index_length Data_free Auto_increment 
-                Create_time Update_time Check_time Create_options Comment /;
+            Create_time Update_time Check_time Create_options Comment/;
+    } else { # At least 4 has this structure...
+        @tabledesc = qw/
+            Name Engine Version Row_format Rows Avg_row_length Data_length
+            Max_data_length Index_length Data_free Auto_increment Create_time 
+            Update_time Check_time Collation Checksum Create_options Comment/;
+    }
     my $db_command = "SHOW TABLE STATUS FROM loncapa LIKE '$tablename'";
     my $sth = $dbh->prepare($db_command);
     $sth->execute();
@@ -820,7 +847,7 @@ sub get_new_table_id {
     my $newid = 0;
     my @tables = &tables_in_db();
     foreach (@tables) {
-        if (/^$ENV{'user.name'}_$ENV{'user.domain'}_(\d+)$/) {
+        if (/^$env{'user.name'}_$env{'user.domain'}_(\d+)$/) {
             $newid = $1 if ($1 > $newid);
         }
     }
@@ -976,6 +1003,7 @@ sub bulk_store_rows {
         $request .= '('.join(',',@$row).'),';
     }
     $request =~ s/,$//;
+    # $debugstring = "Executed ".$/.$request; # commented out - this is big
     $dbh->do($request);
     if ($dbh->err) {
         $errorstring = 'Attempted '.$/.$request.$/.'Got error '.$dbh->errstr();
@@ -1098,7 +1126,7 @@ sub translate_id {
     # id should be a digit.  If it is not a digit we assume the given id
     # is complete and does not need to be translated.
     return $id if ($id =~ /\D/);  
-    return $ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'.$id;
+    return $env{'user.name'}.'_'.$env{'user.domain'}.'_'.$id;
 }
 
 ###########################################
@@ -1208,7 +1236,7 @@ Fixes a table name so that it will work
 ##########################################
 sub fix_table_name {
     my ($name) = @_;
-    $name =~ s/^(\d+e\d+)/_$1/;
+    $name =~ s/^(\d+[eE]\d+)/_$1/;
     return $name;
 }