--- loncom/interface/lonmysql.pm 2005/02/21 18:08:19 1.28 +++ loncom/interface/lonmysql.pm 2005/08/24 19:13:07 1.33 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # MySQL utility functions # -# $Id: lonmysql.pm,v 1.28 2005/02/21 18:08:19 matthew Exp $ +# $Id: lonmysql.pm,v 1.33 2005/08/24 19:13:07 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,20 @@ 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)\./); + &Apache::lonnet::logthis('major version = '.$major_version); + 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 +848,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 +1004,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 +1127,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; } ###########################################