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 ''; |
} |
} |
|
|