--- loncom/interface/lonmysql.pm	2005/08/24 19:33:32	1.35
+++ loncom/interface/lonmysql.pm	2016/08/14 16:13:22	1.40
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # MySQL utility functions
 #
-# $Id: lonmysql.pm,v 1.35 2005/08/24 19:33:32 matthew Exp $
+# $Id: lonmysql.pm,v 1.40 2016/08/14 16:13:22 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -87,14 +87,15 @@ and provide a common interface.  The goa
 a complete reimplementation of the DBI interface.  Instead we try to 
 make using mysql as painless as possible.
 
-Each table has a numeric ID that is a parameter to most lonmysql functions.
-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 
-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.
+Each table has a numeric ID that is a parameter to most lonmysql
+functions.  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. (With all
+non-word characters removed form user.name and user.domain) 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.
 
 =over 4
 
@@ -816,7 +817,7 @@ sub build_table_creation_request {
     unless($table_des->{'permanent'} eq 'yes') {
         $request.="COMMENT = 'temporary' ";
     } 
-    $request .= "TYPE=MYISAM";
+    $request .= "ENGINE=MYISAM";
     return $request,$table_id;
 }
 
@@ -824,6 +825,25 @@ sub build_table_creation_request {
 
 =pod
 
+=item &get_table_prefix()
+
+returns the cleaned version of user.name and user.domain for us in table names
+
+=cut
+
+###############################
+sub get_table_prefix {
+    my $clean_name   = $env{'user.name'};
+    my $clean_domain = $env{'user.domain'};
+    $clean_name =~ s/\W//g;
+    $clean_domain =~ s/\W//g;
+    return $clean_name.'_'.$clean_domain.'_';
+}
+
+###############################
+
+=pod
+
 =item &get_new_table_id()
 
 Used internally to prevent table name collisions.
@@ -834,8 +854,9 @@ Used internally to prevent table name co
 sub get_new_table_id {
     my $newid = 0;
     my @tables = &tables_in_db();
+    my $prefix = &get_table_prefix();
     foreach (@tables) {
-        if (/^$env{'user.name'}_$env{'user.domain'}_(\d+)$/) {
+        if (/^\Q$prefix\E(\d+)$/) {
             $newid = $1 if ($1 > $newid);
         }
     }
@@ -1074,16 +1095,29 @@ Returns undef on error.
 =cut
 
 ###########################################
+
+########## Show-Tables Cache
+my $have_read_tables = 0;
+my $dbh_sth;
+##########
+
 sub tables_in_db {
     return undef if (!defined(&connect_to_db()));
-    my $sth=$dbh->prepare('SHOW TABLES');
-    $sth->execute();
-    $sth->execute();
-    my $aref = $sth->fetchall_arrayref;
-    if ($sth->err()) {
+    
+    ########## Show-Tables Cache
+    if(!$have_read_tables) { 
+     $dbh_sth=$dbh->prepare('SHOW TABLES');
+     $have_read_tables = 1;
+    }   
+    $dbh_sth->execute();
+    #$dbh_sth->execute(); # Removed strange execute - from release 119
+    ##########    
+    
+    my $aref = $dbh_sth->fetchall_arrayref;
+    if ($dbh_sth->err()) {
         $errorstring = 
             "$dbh ATTEMPTED:\n".'fetchall_arrayref after SHOW TABLES'.
-            "\nRESULTING ERROR:\n".$sth->errstr;
+            "\nRESULTING ERROR:\n".$dbh_sth->errstr;
         return undef;
     }
     my @table_list;
@@ -1114,7 +1148,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 &get_table_prefix().$id;
 }
 
 ###########################################
@@ -1253,7 +1287,7 @@ 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);
+                             'hours'=>$4,'minutes'=>$5,'seconds'=>$6,'dlsav'=>-1);
     }
     return $timestamp;
 }