--- loncom/interface/lonmysql.pm 2003/03/13 19:08:52 1.9 +++ loncom/interface/lonmysql.pm 2003/12/27 16:58:36 1.18 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # MySQL utility functions # -# $Id: lonmysql.pm,v 1.9 2003/03/13 19:08:52 matthew Exp $ +# $Id: lonmysql.pm,v 1.18 2003/12/27 16:58:36 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -32,6 +32,8 @@ package Apache::lonmysql; use strict; use DBI; use Apache::lonnet(); +use POSIX qw(strftime mktime); + ###################################################################### ###################################################################### @@ -348,6 +350,33 @@ sub connect_to_db { =pod +=item &verify_sql_connection() + +Inputs: none. + +Returns: 0 (failure) or 1 (success) + +Checks to make sure the database can be connected to. It does not +initialize anything in the lonmysql package. + +=cut + +############################### +sub verify_sql_connection { + my $connection; + if (! ($connection = DBI->connect("DBI:mysql:loncapa","www", + $Apache::lonnet::perlvar{'lonSqlAccess'}, + { RaiseError=>0,PrintError=>0}))) { + return 0; + } + undef($connection); + return 1; +} + +############################### + +=pod + =item &disconnect_from_db() Inputs: none. @@ -396,6 +425,26 @@ sub number_of_rows { return undef if (! defined(&update_table_info($table_id))); return $Tables{&translate_id($table_id)}->{'Rows'}; } +############################### + +=pod + +=item &get_dbh() + +Input: nothing + +Returns: the database handler, or undef on error. + +This routine allows the programmer to gain access to the database handler. +Be careful. + +=cut + +############################### +sub get_dbh { + return undef if (! defined(&connect_to_db())); + return $dbh; +} ############################### @@ -510,7 +559,27 @@ sub update_table_info { $debugstring = "Retrieved table info for $tablename"; return 1; } +############################### +=pod + +=item &col_order() + +Inputs: table id + +Returns: array with column order + +=cut + + +sub col_order { + my $table_id=shift; + if (&update_table_info($table_id)) { + return @{$Tables{$table_id}->{'Col_order'}}; + } else { + return (); + } +} ############################### =pod @@ -539,16 +608,16 @@ Input formats: }, ], 'PRIMARY KEY' => (index_col_name,...), - KEY => { name => 'idx_name', - columns => (col1,col2,..),}, - INDEX => { name => 'idx_name', - columns => (col1,col2,..),}, - UNIQUE => { index => 'yes', + KEY => [{ name => 'idx_name', + columns => (col1,col2,..),},], + INDEX => [{ name => 'idx_name', + columns => (col1,col2,..),},], + UNIQUE => [{ index => 'yes', name => 'idx_name', - columns => (col1,col2,..),}, - FULLTEXT => { index => 'yes', + columns => (col1,col2,..),},], + FULLTEXT => [{ index => 'yes', name => 'idx_name', - columns => (col1,col2,..),}, + columns => (col1,col2,..),},], } @@ -606,30 +675,35 @@ sub create_table { push (@Columns,'PRIMARY KEY ('.join(',',@{$table_des->{'PRIMARY KEY'}}) .')'); } - foreach ('KEY','INDEX') { - if (exists($table_des->{$_})) { - my $text = $_.' '; - if (exists($table_des->{$_}->{'name'})) { - $text .=$table_des->{$_}->{'name'}; + # + foreach my $indextype ('KEY','INDEX') { + next if (!exists($table_des->{$indextype})); + foreach my $indexdescription (@{$table_des->{$indextype}}) { + my $text = $indextype.' '; + if (exists($indexdescription->{'name'})) { + $text .=$indexdescription->{'name'}; } - $text .= ' ('.join(',',@{$table_des->{$_}->{'columns'}}).')'; + $text .= ' ('.join(',',@{$indexdescription->{'columns'}}).')'; push (@Columns,$text); } } - foreach ('UNIQUE','FULLTEXT') { - if (exists($table_des->{$_})) { - my $text = $_.' '; - if (exists($table_des->{$_}->{'index'}) && - $table_des->{$_}->{'index'} eq 'yes') { + # + foreach my $indextype ('UNIQUE','FULLTEXT') { + next if (! exists($table_des->{$indextype})); + foreach my $indexdescription (@{$table_des->{$indextype}}) { + my $text = $indextype.' '; + if (exists($indexdescription->{'index'}) && + $indexdescription->{'index'} eq 'yes') { $text .= 'INDEX '; } - if (exists($table_des->{$_}->{'name'})) { - $text .=$table_des->{$_}->{'name'}; + if (exists($indexdescription->{'name'})) { + $text .=$indexdescription->{'name'}; } - $text .= ' ('.join(',',@{$table_des->{$_}->{'columns'}}).')'; + $text .= ' ('.join(',',@{$indexdescription->{'columns'}}).')'; push (@Columns,$text); } } + # $request .= "(".join(", ",@Columns).") "; unless($table_des->{'permanent'} eq 'yes') { $request.="COMMENT = 'temporary' "; @@ -948,18 +1022,79 @@ sub remove_from_table { return undef if (!defined(&connect_to_db())); # $table_id = &translate_id($table_id); - my $command = 'DELETE FROM '.$table_id.' WHERE '.$dbh->quote($column). + my $command = 'DELETE FROM '.$table_id.' WHERE '.$column. " LIKE BINARY ".$dbh->quote($value); my $sth = $dbh->prepare($command); - $sth->execute(); - if ($sth->err) { + unless ($sth->execute()) { $errorstring = "ERROR on execution of ".$command."\n".$sth->errstr; return undef; } + $debugstring = $command; my $rows = $sth->rows; return $rows; } +########################################### + +=pod + +=item drop_table($table_id) + +Issues a 'drop table if exists' command + +=cut + +########################################### + +sub drop_table { + my ($table_id) = @_; + return undef if (!defined(&connect_to_db())); + # + $table_id = &translate_id($table_id); + my $command = 'DROP TABLE IF EXISTS '.$table_id; + my $sth = $dbh->prepare($command); + $sth->execute(); + if ($sth->err) { + $errorstring = "ERROR on execution of ".$command."\n".$sth->errstr; + return undef; + } + $debugstring = $command; + delete($Tables{$table_id}); # remove any knowledge of the table + return 1; # if we got here there was no error, so return a 'true' value +} + + + + +# ---------------------------- convert 'time' format into a datetime sql format +sub sqltime { + my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = + localtime(&unsqltime($_[0])); + $mon++; $year+=1900; + return "$year-$mon-$mday $hour:$min:$sec"; +} + +sub maketime { + my %th=@_; + return POSIX::mktime(($th{'seconds'},$th{'minutes'},$th{'hours'}, + $th{'day'},$th{'month'}-1, + $th{'year'}-1900,0,0,$th{'dlsav'})); +} + + +######################################### +# +# Retro-fixing of un-backward-compatible time format + +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); + } + return $timestamp; +} + 1;