Diff for /loncom/interface/lonmysql.pm between versions 1.22 and 1.30

version 1.22, 2004/07/21 21:14:36 version 1.30, 2005/04/11 15:33:46
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;
   
 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 57  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 90  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 363  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 464  Be careful. Line 478  Be careful.
 ###############################  ###############################
 sub get_dbh {   sub get_dbh { 
     return undef if (! defined(&connect_to_db()));      return undef if (! defined(&connect_to_db()));
       &Apache::lonnet::logthis("reconnect set to ".$dbh->{mysql_auto_reconnect});
     return $dbh;      return $dbh;
 }  }
   
Line 556  sub update_table_info { Line 571  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 600  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 635  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 619  Returns: Line 662  Returns:
 sub create_table {  sub create_table {
     return undef if (!defined(&connect_to_db($dbh)));      return undef if (!defined(&connect_to_db($dbh)));
     my ($table_des)=@_;      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      # Execute the request to create the table
     #############################################      #############################################
Line 629  sub create_table { Line 672  sub create_table {
             $dbh->errstr();              $dbh->errstr();
         return undef;          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);      my $tablename = &translate_id($table_id);
     delete($Tables{$tablename}) if (exists($Tables{$tablename}));      delete($Tables{$tablename}) if (exists($Tables{$tablename}));
     return undef if (! defined(&update_table_info($table_id)));      return undef if (! defined(&update_table_info($table_id)));
Line 770  sub build_table_creation_request { Line 804  sub build_table_creation_request {
         $request.="COMMENT = 'temporary' ";          $request.="COMMENT = 'temporary' ";
     }       } 
     $request .= "TYPE=MYISAM";      $request .= "TYPE=MYISAM";
     return $request;      return $request,$table_id;
 }  }
   
 ###############################  ###############################
Line 788  sub get_new_table_id { Line 822  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 901  sub store_row { Line 935  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 1014  sub translate_id { Line 1100  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 1111  sub drop_table { Line 1197  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

Removed from v.1.22  
changed lines
  Added in v.1.30


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