--- loncom/interface/lonmysql.pm 2004/07/21 21:14:36 1.22 +++ loncom/interface/lonmysql.pm 2005/02/21 17:23:32 1.27 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # MySQL utility functions # -# $Id: lonmysql.pm,v 1.22 2004/07/21 21:14:36 matthew Exp $ +# $Id: lonmysql.pm,v 1.27 2005/02/21 17:23:32 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -35,11 +35,18 @@ use POSIX qw(strftime mktime); my $mysqluser; my $mysqlpassword; +my $mysqldatabase; sub set_mysql_user_and_password { # If we are running under Apache and LONCAPA, use the LON-CAPA # 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 (! eval 'require Apache::lonnet();') { $mysqluser = 'www'; @@ -49,6 +56,12 @@ sub set_mysql_user_and_password { $mysqlpassword = ''; } } + if (defined($input_mysqluser)) { + $mysqluser = $input_mysqluser; + } + if (defined($input_mysqlpassword)) { + $mysqlpassword = $input_mysqlpassword; + } } ###################################################################### @@ -349,7 +362,7 @@ sub connect_to_db { if (! defined($mysqluser) || ! defined($mysqlpassword)) { &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}))) { $debugstring = "Unable to connect to loncapa database."; if (! defined($dbh)) { @@ -556,7 +569,12 @@ sub update_table_info { # my @info=$sth->fetchrow_array; 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 @@ -580,6 +598,29 @@ sub update_table_info { $debugstring = "Retrieved table info for $tablename"; 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 @@ -592,7 +633,7 @@ Returns: array with column order =cut - +############################### sub col_order { my $table_id=shift; if (&update_table_info($table_id)) { @@ -619,7 +660,7 @@ Returns: sub create_table { return undef if (!defined(&connect_to_db($dbh))); my ($table_des)=@_; - my $request = &build_table_creation_request($table_des); + my ($request,$table_id) = &build_table_creation_request($table_des); # # Execute the request to create the table ############################################# @@ -629,15 +670,6 @@ sub create_table { $dbh->errstr(); return undef; } - # - # Set up the internal bookkeeping - ############################################# - my $table_id; - if (exists($table_des->{'id'})) { - $table_id = $table_des->{'id'}; - } else { - $table_id = &get_new_table_id(); - } my $tablename = &translate_id($table_id); delete($Tables{$tablename}) if (exists($Tables{$tablename})); return undef if (! defined(&update_table_info($table_id))); @@ -770,7 +802,7 @@ sub build_table_creation_request { $request.="COMMENT = 'temporary' "; } $request .= "TYPE=MYISAM"; - return $request; + return $request,$table_id; } ############################### @@ -901,6 +933,58 @@ sub store_row { return 1; } + +############################### + +=pod + +=item &bulk_store_rows() + +Inputs: table id, [columns],[[row data1].[row data2],...] + +returns undef on error, 1 on success. + +=cut + +############################### +sub bulk_store_rows { + my ($table_id,$columns,$rows) = @_; + # + return undef if (! defined(&connect_to_db())); + my $dbh = &get_dbh(); + return undef if (! defined($dbh)); + my $table_status = &check_table($table_id); + return undef if (! defined($table_status)); + if (! $table_status) { + $errorstring = "table $table_id does not exist."; + return undef; + } + # + my $tablename = &translate_id($table_id); + # + my $request = 'INSERT IGNORE INTO '.$tablename.' '; + if (defined($columns) && ref($columns) eq 'ARRAY') { + $request .= join(',',@$columns).' '; + } + if (! defined($rows) || ref($rows) ne 'ARRAY') { + $errorstring = "no input rows given."; + return undef; + } + $request .= 'VALUES '; + foreach my $row (@$rows) { + # avoid doing row stuff here... + $request .= '('.join(',',@$row).'),'; + } + $request =~ s/,$//; + $dbh->do($request); + if ($dbh->err) { + $errorstring = 'Attempted '.$/.$request.$/.'Got error '.$dbh->errstr(); + return undef; + } + return 1; +} + + ############################### =pod @@ -1111,7 +1195,22 @@ sub drop_table { 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+e\d+)/_$1/; + return $name; +} # ---------------------------- convert 'time' format into a datetime sql format