version 1.24, 2004/08/20 01:27:05
|
version 1.34, 2005/08/24 19:21:05
|
Line 32 package Apache::lonmysql;
|
Line 32 package Apache::lonmysql;
|
use strict; |
use strict; |
use DBI; |
use DBI; |
use POSIX qw(strftime mktime); |
use POSIX qw(strftime mktime); |
|
use Apache::lonnet; |
|
|
my $mysqluser; |
my $mysqluser; |
my $mysqlpassword; |
my $mysqlpassword; |
|
my $mysqldatabase; |
|
my %db_config; |
|
|
sub set_mysql_user_and_password { |
sub set_mysql_user_and_password { |
# If we are running under Apache and LONCAPA, use the LON-CAPA |
# If we are running under Apache and LONCAPA, use the LON-CAPA |
# user and password. Otherwise...? ? ? ? |
# user and password. Otherwise...? ? ? ? |
($mysqluser,$mysqlpassword) = @_; |
my ($input_mysqluser,$input_mysqlpassword,$input_mysqldatabase) = @_; |
|
if (! defined($mysqldatabase)) { |
|
$mysqldatabase = 'loncapa'; |
|
} |
|
if (defined($input_mysqldatabase)) { |
|
$mysqldatabase = $input_mysqldatabase; |
|
} |
if (! defined($mysqluser) || ! defined($mysqlpassword)) { |
if (! defined($mysqluser) || ! defined($mysqlpassword)) { |
if (! eval 'require Apache::lonnet();') { |
if (! eval 'require Apache::lonnet();') { |
$mysqluser = 'www'; |
$mysqluser = 'www'; |
Line 49 sub set_mysql_user_and_password {
|
Line 58 sub set_mysql_user_and_password {
|
$mysqlpassword = ''; |
$mysqlpassword = ''; |
} |
} |
} |
} |
|
if (defined($input_mysqluser)) { |
|
$mysqluser = $input_mysqluser; |
|
} |
|
if (defined($input_mysqlpassword)) { |
|
$mysqlpassword = $input_mysqlpassword; |
|
} |
} |
} |
|
|
###################################################################### |
###################################################################### |
Line 76 Each table has a numeric ID that is a pa
|
Line 91 Each table has a numeric ID that is a pa
|
The table id is returned by &create_table. |
The table id is returned by &create_table. |
If you lose the table id, it is lost forever. |
If you lose the table id, it is lost forever. |
The table names in MySQL correspond to |
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 |
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 |
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. |
numeric, otherwise you are opening up all the tables in the MySQL database. |
Line 349 sub connect_to_db {
|
Line 364 sub connect_to_db {
|
if (! defined($mysqluser) || ! defined($mysqlpassword)) { |
if (! defined($mysqluser) || ! defined($mysqlpassword)) { |
&set_mysql_user_and_password(); |
&set_mysql_user_and_password(); |
} |
} |
if (! ($dbh = DBI->connect("DBI:mysql:loncapa",$mysqluser,$mysqlpassword, |
if (! ($dbh = DBI->connect("DBI:mysql:$mysqldatabase",$mysqluser,$mysqlpassword, |
{ RaiseError=>0,PrintError=>0}))) { |
{ RaiseError=>0,PrintError=>0}))) { |
$debugstring = "Unable to connect to loncapa database."; |
$debugstring = "Unable to connect to loncapa database."; |
if (! defined($dbh)) { |
if (! defined($dbh)) { |
Line 361 sub connect_to_db {
|
Line 376 sub connect_to_db {
|
return undef; |
return undef; |
} |
} |
$debugstring = "Successfully connected to loncapa database."; |
$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; |
return 1; |
} |
} |
|
|
Line 540 sub update_table_info {
|
Line 571 sub update_table_info {
|
# |
# |
# Get MySQLs table status information. |
# Get MySQLs table status information. |
# |
# |
my @tabledesc = qw/ |
my @tabledesc; |
Name Type Row_format Rows Avg_row_length Data_length |
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 |
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 $db_command = "SHOW TABLE STATUS FROM loncapa LIKE '$tablename'"; |
my $sth = $dbh->prepare($db_command); |
my $sth = $dbh->prepare($db_command); |
$sth->execute(); |
$sth->execute(); |
Line 556 sub update_table_info {
|
Line 596 sub update_table_info {
|
# |
# |
my @info=$sth->fetchrow_array; |
my @info=$sth->fetchrow_array; |
for (my $i=0;$i<= $#info ; $i++) { |
for (my $i=0;$i<= $#info ; $i++) { |
$Tables{$tablename}->{$tabledesc[$i]}= $info[$i]; |
if ($tabledesc[$i] !~ /^(Create_|Update_|Check_)time$/) { |
|
$Tables{$tablename}->{$tabledesc[$i]}= |
|
&unsqltime($info[$i]); |
|
} else { |
|
$Tables{$tablename}->{$tabledesc[$i]}= $info[$i]; |
|
} |
} |
} |
# |
# |
# Determine the column order |
# Determine the column order |
Line 580 sub update_table_info {
|
Line 625 sub update_table_info {
|
$debugstring = "Retrieved table info for $tablename"; |
$debugstring = "Retrieved table info for $tablename"; |
return 1; |
return 1; |
} |
} |
|
|
|
############################### |
|
|
|
=pod |
|
|
|
=item &table_information() |
|
|
|
Inputs: table id |
|
|
|
Returns: hash with the table status |
|
|
|
=cut |
|
|
|
############################### |
|
sub table_information { |
|
my $table_id=shift; |
|
if (&update_table_info($table_id)) { |
|
return %{$Tables{$table_id}}; |
|
} else { |
|
return (); |
|
} |
|
} |
|
|
############################### |
############################### |
|
|
=pod |
=pod |
Line 592 Returns: array with column order
|
Line 660 Returns: array with column order
|
|
|
=cut |
=cut |
|
|
|
############################### |
sub col_order { |
sub col_order { |
my $table_id=shift; |
my $table_id=shift; |
if (&update_table_info($table_id)) { |
if (&update_table_info($table_id)) { |
Line 779 sub get_new_table_id {
|
Line 847 sub get_new_table_id {
|
my $newid = 0; |
my $newid = 0; |
my @tables = &tables_in_db(); |
my @tables = &tables_in_db(); |
foreach (@tables) { |
foreach (@tables) { |
if (/^$ENV{'user.name'}_$ENV{'user.domain'}_(\d+)$/) { |
if (/^$env{'user.name'}_$env{'user.domain'}_(\d+)$/) { |
$newid = $1 if ($1 > $newid); |
$newid = $1 if ($1 > $newid); |
} |
} |
} |
} |
Line 935 sub bulk_store_rows {
|
Line 1003 sub bulk_store_rows {
|
$request .= '('.join(',',@$row).'),'; |
$request .= '('.join(',',@$row).'),'; |
} |
} |
$request =~ s/,$//; |
$request =~ s/,$//; |
|
# $debugstring = "Executed ".$/.$request; # commented out - this is big |
$dbh->do($request); |
$dbh->do($request); |
if ($dbh->err) { |
if ($dbh->err) { |
$errorstring = 'Attempted '.$/.$request.$/.'Got error '.$dbh->errstr(); |
$errorstring = 'Attempted '.$/.$request.$/.'Got error '.$dbh->errstr(); |
Line 1057 sub translate_id {
|
Line 1126 sub translate_id {
|
# id should be a digit. If it is not a digit we assume the given 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. |
# is complete and does not need to be translated. |
return $id if ($id =~ /\D/); |
return $id if ($id =~ /\D/); |
return $ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'.$id; |
return $env{'user.name'}.'_'.$env{'user.domain'}.'_'.$id; |
} |
} |
|
|
########################################### |
########################################### |
Line 1154 sub drop_table {
|
Line 1223 sub drop_table {
|
return 1; # if we got here there was no error, so return a 'true' value |
return 1; # if we got here there was no error, so return a 'true' value |
} |
} |
|
|
|
########################################## |
|
|
|
=pod |
|
|
|
=item fix_table_name |
|
|
|
Fixes a table name so that it will work with MySQL. |
|
|
|
=cut |
|
|
|
########################################## |
|
sub fix_table_name { |
|
my ($name) = @_; |
|
$name =~ s/^(\d+[eE]\d+)/_$1/; |
|
return $name; |
|
} |
|
|
|
|
# ---------------------------- convert 'time' format into a datetime sql format |
# ---------------------------- convert 'time' format into a datetime sql format |