Diff for /loncom/metadata_database/parse_activity_log.pl between versions 1.14 and 1.15

version 1.14, 2005/03/31 22:09:40 version 1.15, 2005/07/11 05:16:19
Line 65  use HTML::TokeParser; Line 65  use HTML::TokeParser;
   
 #  #
 # Determine parameters  # Determine parameters
 my ($help,$course,$domain,$drop_when_done,$srcfile,$logfile,$time_run,$nocleanup,$log,$backup);  my ($help,$course,$domain,$drop_when_done,$srcfile,$logfile,$time_run,$nocleanup,$log,$backup,$xmlfile);
 &Getopt::Long::GetOptions( "course=s"  => \$course,  &Getopt::Long::GetOptions( "course=s"  => \$course,
                            "domain=s"  => \$domain,                             "domain=s"  => \$domain,
                            "backup"    => \$backup,                             "backup"    => \$backup,
                            "help"      => \$help,                             "help"      => \$help,
                            "logfile=s" => \$logfile,                             "logfile=s" => \$logfile,
                            "srcfile=s" => \$srcfile,                             "srcfile=s" => \$srcfile,
                              "justloadxml=s" => \$xmlfile,
                            "timerun"   => \$time_run,                             "timerun"   => \$time_run,
                            "nocleanup" => \$nocleanup,                             "nocleanup" => \$nocleanup,
                            "dropwhendone" => \$drop_when_done,                             "dropwhendone" => \$drop_when_done,
Line 153  $sql_filename =~ s|[^/]*$|activity.log.s Line 154  $sql_filename =~ s|[^/]*$|activity.log.s
 my $gz_sql_filename = $sql_filename.'.gz';  my $gz_sql_filename = $sql_filename.'.gz';
 #  #
 my $xml_filename = $sourcefilename;  my $xml_filename = $sourcefilename;
 $xml_filename =~ s|[^/]*$|activity.log.xml|;  
 my $gz_xml_filename = $xml_filename.'.gz';  my $gz_xml_filename = $xml_filename.'.gz';
   if (defined($xmlfile)) {
       $xml_filename = $xmlfile;
       if ($xml_filename =~ /\.gz$/) {
           $gz_xml_filename = $xml_filename;
       } else {
           $gz_xml_filename = $xml_filename.'.gz';
       }
   } else {
       my $xml_filename = $sourcefilename;
       $xml_filename =~ s|[^/]*$|activity.log.xml|;
       $gz_xml_filename = $xml_filename.'.gz';
   }
 #  #
 $error_filename = $sourcefilename;  $error_filename = $sourcefilename;
 $error_filename =~ s|[^/]*$|activity.log.errors|;  $error_filename =~ s|[^/]*$|activity.log.errors|;
Line 163  $logthis->('Beginning logging '.time); Line 175  $logthis->('Beginning logging '.time);
 #  #
 # Wait for a lock on the lockfile to avoid collisions  # Wait for a lock on the lockfile to avoid collisions
 my $lockfilename = $sourcefilename.'.lock';  my $lockfilename = $sourcefilename.'.lock';
   if (! defined($xmlfile)) {
 open(LOCKFILE,'>'.$lockfilename);  open(LOCKFILE,'>'.$lockfilename);
 if (!flock(LOCKFILE,LOCK_EX)) {  if (!flock(LOCKFILE,LOCK_EX)) {
     warn("Unable to lock $lockfilename.  Aborting".$/);      warn("Unable to lock $lockfilename.  Aborting".$/);
Line 192  if (-e $sourcefilename) { Line 205  if (-e $sourcefilename) {
 }  }
   
 close(LOCKFILE);  close(LOCKFILE);
   }
 ##  ##
 ## Table definitions  ## Table definitions
 ##  ##
Line 345  if (-s $gz_sql_filename && ! -s $gz_xml_ Line 358  if (-s $gz_sql_filename && ! -s $gz_xml_
     }          }    
 }  }
   
   if (defined($xmlfile)) {
       exit(0);
   }
   
 ##  ##
 ## Ensure the tables we need exist  ## Ensure the tables we need exist
 # create_tables does not complain if the tables already exist  # create_tables does not complain if the tables already exist
Line 376  if (-s $newfilename) { Line 393  if (-s $newfilename) {
         exit 5;          exit 5;
     } elsif ($result > 0) {      } elsif ($result > 0) {
         $time_this->();          $time_this->();
         $logthis->('process_courselog returned '.$result.' backing up tables');          $logthis->('process_courselog returned '.$result.'.'.$/.
                      'Backing up tables');
         &backup_tables_as_xml($gz_xml_filename,\%tables);          &backup_tables_as_xml($gz_xml_filename,\%tables);
         $time_this->('write backup tables');          $time_this->('write backup tables');
     }      }
Line 405  if ($log) { Line 423  if ($log) {
 }  }
   
 foreach my $file ($lockfilename, $error_filename,$logfile) {  foreach my $file ($lockfilename, $error_filename,$logfile) {
     if (-z $file) {       if (defined($file) && -z $file) { 
         unlink($file);           unlink($file); 
     }      }
 }  }
Line 788  sub backup_tables_as_xml { Line 806  sub backup_tables_as_xml {
 ##  ##
 ###############################################################  ###############################################################
 ###############################################################  ###############################################################
   {
       my @fields = ('resource','time',
                     'student','action','idx','machine','action_values');
       my %ids = ();
 sub load_backup_xml_tables {  sub load_backup_xml_tables {
     my ($filename,$tables) = @_;      my ($filename,$tables) = @_;
     my $xmlfh;      my $xmlfh;
Line 795  sub load_backup_xml_tables { Line 817  sub load_backup_xml_tables {
     if (! defined($xmlfh)) {      if (! defined($xmlfh)) {
         return ('error:unable to read '.$filename);          return ('error:unable to read '.$filename);
     }      }
     my $dbh = &Apache::lonmysql::get_dbh();      #
     my $parser = HTML::TokeParser->new($xmlfh);      %ids = (resource=> {"\0count"=>1},
     $parser->xml_mode('1');              student=> {"\0count"=>1},
     &store_entry();              machine=> {"\0count"=>1});
       #
     my %data;      my %data;
     while (my $token = $parser->get_token()) {      while (my $inputline = <$xmlfh>) {
         if ($token->[0] eq 'S' && $token->[1] eq 'row') {          my ($resource,$time,undef,$student,$action,$machine,$action_values) = 
             undef(%data);              ($inputline =~ m{<row>
         }                                   <resource>(.*)</resource>
         foreach my $tag ('resource','time','idx',                                   <time>(.*)</time>
                          'student','action','machine','action_values') {                                   <idx>(.*)</idx>
             if ($token->[0] eq 'S' && $token->[1] eq $tag) {                                   <student>(.*)</student>
                 my $text = $parser->get_text("/$tag");                                   <action>(.*)</action>
                 $data{$tag} = $text;                                   <machine>(.*)</machine>
             }                                   <action_values>(.*)</action_values>
         }                                   </row>$
         if ($token->[0] eq 'E' && $token->[1] eq 'row') {                               }x
             $data{'action_values'} =qq{'$data{'action_values'}'};               );
             my $error = &store_entry($dbh,$tables,\%data);          my $resource_id = &xml_get_id('resource',$resource);
           my $student_id  = &xml_get_id('student',$student);
           my $machine_id  = &xml_get_id('machine',$machine);
           &xml_store_activity_row(map { defined($_)?qq{'$_'}:'' 
                                     } ($resource_id,
                                        $time,
                                        $student_id,
                                        $action,
                                        'NULL',
                                        $machine_id,
                                        $action_values));
       }
       &xml_store_activity_row();
       close($xmlfh);
       # Store id tables
       while (my ($id_name,$id_data) = each(%ids)) {
           if ($id_name eq 'resource') { $id_name = 'res'; }
           delete($id_data->{"\0count"});
           &xml_store_id_table($id_name,$id_data);
       }
       return;
   }
   
   sub xml_get_id {
       my ($table,$element) = @_;
       if (! exists($ids{$table}->{$element})) {
           $ids{$table}->{$element} = $ids{$table}->{"\0count"}++;
       }
       return $ids{$table}->{$element};
   }
   
   {
       my @data_rows;
   sub xml_store_activity_row {
       my @data = @_;
       if (scalar(@data)) {
           push(@data_rows,[@data]);
       }
       if (! scalar(@data) || scalar(@data_rows) > 500) {
           if (! &Apache::lonmysql::bulk_store_rows($tables{'activity'},
                                                    scalar(@{$data_rows[0]}),
                                                    \@data_rows)) {
               $logthis->("Error:".&Apache::lonmysql::get_error());
               warn("Error:".&Apache::lonmysql::get_error());
           } else {
               undef(@data_rows);
         }          }
     }      }
     &store_entry($dbh,$tables);  
     return;      return;
 }  }
   
   }
   
   sub xml_store_id_table {
       my ($table,$tabledata) =@_;
       if (! &Apache::lonmysql::bulk_store_rows
           ($tables{$table},2,
            [map{[$tabledata->{$_},qq{"$_"}]} keys(%$tabledata)])) {
           $logthis->("Error:".&Apache::lonmysql::get_error());
           warn "Error:".&Apache::lonmysql::get_error().$/;
       }
   }
   
   } # End of load xml scoping
   
 #######################################################################  #######################################################################
 #######################################################################  #######################################################################
 ##  ##
 ## store_entry - accumulate data to be inserted into the database  ## store_entry - accumulate data to be inserted into the database
 ##   ##
 ## Pass no values in to clear accumulator  ## Pass no values in to clear accumulator
 ## Pass ($dbh,\%tables) to initiate storage of values  ## Pass ($dbh,\%tables) to initiate storage of values
 ## Pass ($dbh,\%tables,\%data) to use normally  ## Pass ($dbh,\%tables,\%data) to use normally
 ##  ##
 #######################################################################  #######################################################################
 #######################################################################  #######################################################################
   
 {  {
     my @rows;      my @rows;
     my $max_row_count = 100;      my $max_row_count = 100;
Line 870  sub store_entry { Line 949  sub store_entry {
                     $machine_id,                      $machine_id,
                     $data->{'action_values'}]);                      $data->{'action_values'}]);
     }      }
     if (defined($tables) &&       if (defined($tables) &&
         ( (! defined($data) && scalar(@rows)) || scalar(@rows)>$max_row_count)          ( (! defined($data) && scalar(@rows)) || scalar(@rows)>$max_row_count)
         ){          ){
         # Store the rows          # Store the rows
         my $result =           my $result =
             &Apache::lonmysql::bulk_store_rows($tables->{'activity'},              &Apache::lonmysql::bulk_store_rows($tables->{'activity'},
                                                undef,                                                 undef,
                                                \@rows);                                                 \@rows);
Line 886  sub store_entry { Line 965  sub store_entry {
         undef(@rows);          undef(@rows);
         return $result if (! defined($data));          return $result if (! defined($data));
     }      }
   
     return '';      return '';
 }  }
   

Removed from v.1.14  
changed lines
  Added in v.1.15


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