--- loncom/debugging_tools/rebuild_db_from_hist.pl 2006/08/03 17:27:48 1.5 +++ loncom/debugging_tools/rebuild_db_from_hist.pl 2006/08/03 17:53:47 1.6 @@ -4,7 +4,7 @@ # # rebuild_db_from_hist.pl Rebuild a *.db file from a *.hist file # -# $Id: rebuild_db_from_hist.pl,v 1.5 2006/08/03 17:27:48 albertel Exp $ +# $Id: rebuild_db_from_hist.pl,v 1.6 2006/08/03 17:53:47 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -38,11 +38,12 @@ use Apache::lonnet; # # Options -my ($help,$debug,$test,$p_is_s); -GetOptions("help" => \$help, - "debug" => \$debug, - "test" => \$test, - "p_is_s" => \$p_is_s); +my ($help,$debug,$test,$test_db,$p_is_s); +GetOptions("help" => \$help, + "debug" => \$debug, + "test" => \$test, + "create_test_db" => \$test_db, + "p_is_s" => \$p_is_s); if (! defined($debug)) { $debug = 0; } if (! defined($test)) { $test = 0; } @@ -57,6 +58,8 @@ Options: -debug Output debugging code (not much is output yet) -test Verify the given *.hist file will reconstruct the current db file Sends error messages to STDERR. + -create_test_db + when testing also create a *.db.test db of the testing info -p_is_s Treat 'P' lines as 'S' lines. Examples: rebuild_db_from_hist.pl -t $file.hist # Perform a test rebuild @@ -76,7 +79,7 @@ while (my $fname = shift) { my $db_filename = $fname; $db_filename =~ s/\.hist$/\.db/; if (-e $db_filename && ! $test) { - print "Aborting: The target file $db_filename exists.".$/; + print STDERR "Aborting: The target file $db_filename exists.".$/; next; } my ($error,$constructed_hash) = &process_file($fname,$db_filename,$debug); @@ -86,14 +89,14 @@ while (my $fname = shift) { if (! defined($error) || ! $test) { $error = &write_hash($db_filename,$constructed_hash); } - if ($test) { + if ($test && $test_db) { $error = &write_hash($db_filename.'.test',$constructed_hash); } if ($test) { my $error = &test_hash($db_filename,$constructed_hash); if (defined($error)) { print "Error processing ".$fname.$/; - print $error; + print STDERR $error; } else { print "Everything looks good for ".$fname.$/; } @@ -121,18 +124,23 @@ sub process_file { # S:store # D:delete # N:new put (only adds tha values if they are all new values) + # M:modify the values for a previous S my ($action,$time,$concatenated_data) = split(':',$command,3); if ($fname eq 'roles.hist' && $concatenated_data =~ /^.*:.*:/) { (undef,undef,$concatenated_data) = split(':',$concatenated_data,3); } next if (! defined($action)); if ($action eq 'P' && $p_is_s) { $action = 'S'; } - my ($rid,$allkeys,$version); + my ($rid,@allkeys,$version); if ($action eq 'S') { ($rid,$concatenated_data) = split(':',$concatenated_data,2); $version = ++$db_to_store{"version:$rid"}; #print $version.$/; } + if ($action eq 'M') { + ($rid,$version,$concatenated_data) = + split(':',$concatenated_data,3); + } next if (! defined($concatenated_data)); my $add_new_data = 1; my @data = split('&',$concatenated_data); @@ -144,9 +152,9 @@ sub process_file { } else { $no_action_count++; } - } elsif ($action eq 'S') { + } elsif ($action eq 'S' || $action eq 'M') { # Versioning of data, so we update the old ata - $allkeys.=$key.':'; + push(@allkeys,$key); $db_to_store{"$version:$rid:$key"}=$value; } elsif ($action eq 'N') { if (exists($db_to_store{$key})) { @@ -159,16 +167,19 @@ sub process_file { $error = "Unable to understand action '".$action."'"; } } + if ($action eq 'N' && $add_new_data) { foreach my $k_v_pair (@data) { my ($key,$value) = split('=',$k_v_pair,2); $db_to_store{$key}=$value; } } - if ($action eq 'S') { + if ($action eq 'S') { $db_to_store{"$version:$rid:timestamp"}=$time; - $allkeys.='timestamp'; - $db_to_store{"$version:keys:$rid"}=$allkeys; + push(@allkeys,'timestamp'); + } + if ($action eq 'S' || $action eq 'M') { + $db_to_store{"$version:keys:$rid"}=join(':',@allkeys); } if (defined($error)) { return ('Error:'.$error.$/,undef);