Diff for /loncom/interface/lonmysql.pm between versions 1.18 and 1.26

version 1.18, 2003/12/27 16:58:36 version 1.26, 2005/02/09 21:21:08
Line 31  package Apache::lonmysql; Line 31  package Apache::lonmysql;
   
 use strict;  use strict;
 use DBI;  use DBI;
 use Apache::lonnet();  
 use POSIX qw(strftime mktime);  use POSIX qw(strftime mktime);
   
   my $mysqluser;
   my $mysqlpassword;
   
   sub set_mysql_user_and_password {
       # If we are running under Apache and LONCAPA, use the LON-CAPA 
       # user and password.  Otherwise...? ? ? ?
       ($mysqluser,$mysqlpassword) = @_;
       if (! defined($mysqluser) || ! defined($mysqlpassword)) {
           if (! eval 'require Apache::lonnet();') {
               $mysqluser = 'www';
               $mysqlpassword = $Apache::lonnet::perlvar{'lonSqlAccess'};
           } else {
               $mysqluser = '';
               $mysqlpassword = '';
           }
       }
   }
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
Line 330  connection is established. Line 346  connection is established.
 ###############################  ###############################
 sub connect_to_db {   sub connect_to_db { 
     return 1 if ($dbh);      return 1 if ($dbh);
     if (! ($dbh = DBI->connect("DBI:mysql:loncapa","www",      if (! defined($mysqluser) || ! defined($mysqlpassword)) {
                                $Apache::lonnet::perlvar{'lonSqlAccess'},          &set_mysql_user_and_password();
       }
       if (! ($dbh = DBI->connect("DBI:mysql:loncapa",$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 363  initialize anything in the lonmysql pack Line 381  initialize anything in the lonmysql pack
   
 ###############################  ###############################
 sub verify_sql_connection {  sub verify_sql_connection {
       if (! defined($mysqluser) || ! defined($mysqlpassword)) {
           &set_mysql_user_and_password();
       }
     my $connection;      my $connection;
     if (! ($connection = DBI->connect("DBI:mysql:loncapa","www",      if (! ($connection = DBI->connect("DBI:mysql:loncapa",
                                       $Apache::lonnet::perlvar{'lonSqlAccess'},                                        $mysqluser,$mysqlpassword,
                                       { RaiseError=>0,PrintError=>0}))) {                                        { RaiseError=>0,PrintError=>0}))) {
         return 0;          return 0;
     }      }
Line 535  sub update_table_info { Line 556  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 559  sub update_table_info { Line 585  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 571  Returns: array with column order Line 620  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 580  sub col_order { Line 629  sub col_order {
  return ();   return ();
     }      }
 }  }
   
 ###############################  ###############################
   
 =pod  =pod
Line 587  sub col_order { Line 637  sub col_order {
 =item &create_table()  =item &create_table()
   
 Inputs:   Inputs: 
     table description      table description, see &build_table_creation_request
   Returns:
       undef on error, table id on success.
   
   =cut
   
   ###############################
   sub create_table {
       return undef if (!defined(&connect_to_db($dbh)));
       my ($table_des)=@_;
       my ($request,$table_id) = &build_table_creation_request($table_des);
       #
       # Execute the request to create the table
       #############################################
       my $count = $dbh->do($request);
       if (! defined($count)) {
           $errorstring = "$dbh ATTEMPTED:\n".$request."\nRESULTING ERROR:\n".
               $dbh->errstr();
           return undef;
       }
       my $tablename = &translate_id($table_id);
       delete($Tables{$tablename}) if (exists($Tables{$tablename}));
       return undef if (! defined(&update_table_info($table_id)));
       $debugstring = "Created table $tablename at time ".time.
           " with request\n$request";
       return $table_id;
   }
   
   ###############################
   
 Input formats:  =pod
   
   =item build_table_creation_request
   
   Input: table description
   
     table description = {      table description = {
         permanent  => 'yes' or 'no',          permanent  => 'yes' or 'no',
Line 621  Input formats: Line 703  Input formats:
   
     }      }
   
 Returns:  Returns: scalar string containing mysql commands to create the table
     undef on error, table id on success.  
   
 =cut  =cut
   
 ###############################  ###############################
 sub create_table {  sub build_table_creation_request {
     return undef if (!defined(&connect_to_db($dbh)));  
     my ($table_des)=@_;      my ($table_des)=@_;
     #      #
     # Build request to create table      # Build request to create table
Line 709  sub create_table { Line 789  sub create_table {
         $request.="COMMENT = 'temporary' ";          $request.="COMMENT = 'temporary' ";
     }       } 
     $request .= "TYPE=MYISAM";      $request .= "TYPE=MYISAM";
     #      return $request,$table_id;
     # Execute the request to create the table  
     #############################################  
     my $count = $dbh->do($request);  
     if (! defined($count)) {  
         $errorstring = "$dbh ATTEMPTED:\n".$request."\nRESULTING ERROR:\n";  
         return undef;  
     }  
     #  
     # Set up the internal bookkeeping  
     #############################################  
     delete($Tables{$tablename}) if (exists($Tables{$tablename}));  
     return undef if (! defined(&update_table_info($table_id)));  
     $debugstring = "Created table $tablename at time ".time.  
         " with request\n$request";  
     return $table_id;  
 }  }
   
 ###############################  ###############################
Line 855  sub store_row { Line 920  sub store_row {
     return 1;      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  =pod
Line 932  sub tables_in_db { Line 1049  sub tables_in_db {
     return undef if (!defined(&connect_to_db()));      return undef if (!defined(&connect_to_db()));
     my $sth=$dbh->prepare('SHOW TABLES');      my $sth=$dbh->prepare('SHOW TABLES');
     $sth->execute();      $sth->execute();
     if ($sth->err) {      $sth->execute();
         $errorstring = "$dbh ATTEMPTED:\n".'SHOW TABLES'.      my $aref = $sth->fetchall_arrayref;
       if ($sth->err()) {
           $errorstring = 
               "$dbh ATTEMPTED:\n".'fetchall_arrayref after SHOW TABLES'.
             "\nRESULTING ERROR:\n".$sth->errstr;              "\nRESULTING ERROR:\n".$sth->errstr;
         return undef;          return undef;
     }      }
     my $aref = $sth->fetchall_arrayref;      my @table_list;
     my @table_list=();  
     foreach (@$aref) {      foreach (@$aref) {
         push @table_list,$_->[0];          push(@table_list,$_->[0]);
     }      }
     $debugstring = "Got list of tables in DB: @table_list";      $debugstring = "Got list of tables in DB: ".join(',',@table_list);
     return @table_list;      return(@table_list);
 }  }
   
 ###########################################  ###########################################
Line 1063  sub drop_table { Line 1182  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+e\d+)/_$1/;
       return $name;
   }
   
   
 # ---------------------------- convert 'time' format into a datetime sql format  # ---------------------------- convert 'time' format into a datetime sql format

Removed from v.1.18  
changed lines
  Added in v.1.26


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>