#!/opt/SUNWstade/bin/perl -I/opt/SUNWstade/lib

use System;
use GDBM_File ;
use MLDBM::Sync;
use Storable qw(retrieve dclone store);
use MLDBM qw(GDBM_File Storable);
use Data::Dumper;
use Getopt::Std;

sub usage {
  print <<EOF;
  Usage: rasdb -d [DB] -k -h -r -l <file>
   -k  : key name only
   -l  : load from file
   -h  : help
   -r  : reorganize
   -t  : generate text files for each database in /DATA.
   -T  : read the text files and re-generate the DATABASES.
EOF
}

if (!getopts("Ttl:rd:hk", \%opts) || $opts{h}) {
    print " $Getopt::Std::ERROR \n";
    usage();
    exit;
}

$key_only = $opts{k};
$file     = $opts{d};
$load     = $opts{l};


System->set_home("/opt/SUNWstade");
$Data::Dumper::Indent = 1;

$file .= ".db" if (substr($file,-3) ne ".db");

if ($opts{d} && $file !~ /\.db/) {
  print "Invalid file: $file \n";
  exit;
}

if ($load) {
 &deserialize($load, $file);
 exit;
}


if ($opts{T}) {                  # serialize all files
  chdir "/opt/SUNWstade/DATA";
  opendir(O, ".");
  @L = readdir(O); closedir(O);
  foreach my $f (@L) {
     if ($f =~ /(.+)\.db$/) {
       my $name = $1;
       if (-f "$name.txt") {
         &deserialize("$name.txt", "$name.db");
         print "De-serialized $name.txt in .db \n";
       }
     }
  }

} elsif ($opts{t}) { # serialize all files
  chdir "/opt/SUNWstade/DATA";
  opendir(O, ".");
  @L = readdir(O); closedir(O);
  foreach my $f (@L) {
     if ($f =~ /(.+)\.db$/) {
       my $name = $1;
       my $out = &serial($f);
       if (!$opts{r}) {
         print "Serialized $name.db in .txt \n";
         open(W, ">$name.txt"); print W $out; close(W);
       }
     }
  }
  
} else {
  my $out = &serial($file);
  print $out;
}


sub deserialize {
  my($load, $file) = @_;

  unlink $file;
  unlink "$file.lock";
  my $ST2_db =  tie %ST2,  'MLDBM::Sync', $file , GDBM_WRCREAT, 0666;

  my $d = Util->deserialize0($load);

  $ST2_db->Lock();

  foreach my $el (keys %$d) {
     $ST2{$el} = $d->{$el};
  }
  $ST2_db->UnLock();
  chmod 0666, $file;
  chmod 0666, "$file.lock";
}



sub serial {
 my($file) = @_; 

 my $ST2_db =  tie %ST2,  'MLDBM::Sync', $file , GDBM_READER, 0666;

 if ($opts{r}) {
    $ST2_db->Lock();
    $ST2_db->reorganize();
    $ST2_db->UnLock();
    print "Reorganization done!\n";

 } else {
   $ST2_db->ReadLock();
   my $out;
   $out .= "\$VAR1 = { \n";
   foreach my $el (keys %ST2) {
      if ($key_only) {
          $out .= "$el \n";
      } else {
         $out .= "'$el' => " . substr(Dumper($ST2{$el}), 8, -2) . ",\n";
      }
   }
   $out .=  "}\n";
   $ST2_db->UnLock();
   return $out;
 }
}
  
  
