version 1.34, 2005/08/24 19:21:05
|
version 1.36, 2007/03/12 17:10:02
|
Line 87 and provide a common interface. The goa
|
Line 87 and provide a common interface. The goa
|
a complete reimplementation of the DBI interface. Instead we try to |
a complete reimplementation of the DBI interface. Instead we try to |
make using mysql as painless as possible. |
make using mysql as painless as possible. |
|
|
Each table has a numeric ID that is a parameter to most lonmysql functions. |
Each table has a numeric ID that is a parameter to most lonmysql |
The table id is returned by &create_table. |
functions. The table id is returned by &create_table. If you lose |
If you lose the table id, it is lost forever. |
the table id, it is lost forever. The table names in MySQL correspond |
The table names in MySQL correspond to |
to $env{'user.name'}.'_'.$env{'user.domain'}.'_'.$table_id. (With all |
$env{'user.name'}.'_'.$env{'user.domain'}.'_'.$table_id. If the table id |
non-word characters removed form user.name and user.domain) If the |
is non-numeric, it is assumed to be the full name of a table. If you pass |
table id is non-numeric, it is assumed to be the full name of a table. |
the table id in a form, you MUST ensure that what you send to lonmysql is |
If you pass the table id in a form, you MUST ensure that what you send |
numeric, otherwise you are opening up all the tables in the MySQL database. |
to lonmysql is numeric, otherwise you are opening up all the tables in |
|
the MySQL database. |
|
|
=over 4 |
=over 4 |
|
|
Line 571 sub update_table_info {
|
Line 572 sub update_table_info {
|
# |
# |
# Get MySQLs table status information. |
# Get MySQLs table status information. |
# |
# |
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/; |
|
} 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 593 sub update_table_info {
|
Line 581 sub update_table_info {
|
&disconnect_from_db(); |
&disconnect_from_db(); |
return undef; |
return undef; |
} |
} |
|
my @column_name = @{$sth->{NAME}}; |
# |
# |
my @info=$sth->fetchrow_array; |
my @info=$sth->fetchrow_array; |
for (my $i=0;$i<= $#info ; $i++) { |
for (my $i=0;$i<= $#info ; $i++) { |
if ($tabledesc[$i] !~ /^(Create_|Update_|Check_)time$/) { |
if ($column_name[$i] =~ /^(Create_|Update_|Check_)time$/) { |
$Tables{$tablename}->{$tabledesc[$i]}= |
$Tables{$tablename}->{$column_name[$i]}= |
&unsqltime($info[$i]); |
&unsqltime($info[$i]); |
} else { |
} else { |
$Tables{$tablename}->{$tabledesc[$i]}= $info[$i]; |
$Tables{$tablename}->{$column_name[$i]}= $info[$i]; |
} |
} |
} |
} |
# |
# |
Line 762 sub build_table_creation_request {
|
Line 751 sub build_table_creation_request {
|
$table_id = &get_new_table_id(); |
$table_id = &get_new_table_id(); |
} |
} |
my $tablename = &translate_id($table_id); |
my $tablename = &translate_id($table_id); |
|
&Apache::lonnet::logthis(" hmm $tablename, $table_id, ". $table_des->{'id'}); |
my $request = "CREATE TABLE IF NOT EXISTS ".$tablename." "; |
my $request = "CREATE TABLE IF NOT EXISTS ".$tablename." "; |
foreach my $coldata (@{$table_des->{'columns'}}) { |
foreach my $coldata (@{$table_des->{'columns'}}) { |
my $column = $coldata->{'name'}; |
my $column = $coldata->{'name'}; |
Line 836 sub build_table_creation_request {
|
Line 826 sub build_table_creation_request {
|
|
|
=pod |
=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() |
=item &get_new_table_id() |
|
|
Used internally to prevent table name collisions. |
Used internally to prevent table name collisions. |
Line 846 Used internally to prevent table name co
|
Line 855 Used internally to prevent table name co
|
sub get_new_table_id { |
sub get_new_table_id { |
my $newid = 0; |
my $newid = 0; |
my @tables = &tables_in_db(); |
my @tables = &tables_in_db(); |
|
my $prefix = &get_table_prefix(); |
foreach (@tables) { |
foreach (@tables) { |
if (/^$env{'user.name'}_$env{'user.domain'}_(\d+)$/) { |
if (/^\Q$prefix\E(\d+)$/) { |
$newid = $1 if ($1 > $newid); |
$newid = $1 if ($1 > $newid); |
} |
} |
} |
} |
Line 1126 sub translate_id {
|
Line 1136 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 &get_table_prefix().$id; |
} |
} |
|
|
########################################### |
########################################### |