use strict;
use DXVars;
+use SysVar;
use DB_File;
use File::Copy;
use DXDebug;
-use Compress::Zlib;
+use DXUtil;
-use vars qw($VERSION $BRANCH);
-$VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ );
-$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/ || (0,0));
-$main::build += $VERSION;
-$main::branch += $BRANCH;
+#use Compress::Zlib;
use vars qw(%db $present $dbfn);
-$dbfn = "$main::data/usdb.v1";
+localdata_mv("usdb.v1");
+$dbfn = localdata("usdb.v1");
sub init
{
end();
- if (tie %db, 'DB_File', $dbfn, O_RDONLY, 0664, $DB_BTREE) {
+ if (tie %db, 'DB_File', $dbfn, O_RDWR, 0664, $DB_BTREE) {
$present = 1;
- dbg("US Database loaded");
- } else {
- dbg("US Database not loaded");
+ return "US Database loaded";
}
+ return "US Database not loaded";
}
sub end
return @s;
}
+sub _add
+{
+ my ($db, $call, $city, $state) = @_;
+
+ # lookup the city
+ my $s = uc "$city|$state";
+ my $ctyn = $db->{$s};
+ unless ($ctyn) {
+ my $no = $db->{'##'} || 1;
+ $ctyn = "#$no";
+ $db->{$s} = $ctyn;
+ $db->{$ctyn} = $s;
+ $no++;
+ $db->{'##'} = "$no";
+ }
+ $db->{uc $call} = $ctyn;
+}
+
+sub add
+{
+ _add(\%db, @_);
+}
+
sub getstate
{
return () unless $present;
return @s ? $s[0] : undef;
}
+sub del
+{
+ my $call = uc shift;
+ delete $db{$call};
+}
+
#
# load in / update an existing DB with a standard format (GZIPPED)
# "raw" file.
my %dbn;
if (-e $dbfn ) {
- syscopy($dbfn, "$dbfn.new") or return "cannot copy $dbfn -> $dbfn.new $!";
+ copy($dbfn, "$dbfn.old") or return "cannot copy $dbfn -> $dbfn.old $!";
}
-
+
+ unlink "$dbfn.new";
tie %dbn, 'DB_File', "$dbfn.new", O_RDWR|O_CREAT, 0664, $a or return "cannot tie $dbfn.new $!";
# now write away all the files
+ my $count = 0;
for (@_) {
- my $fn = shift;
- my $f = gzopen($fn, "r") or return "Cannot open $fn $!";
- my $l;
- while ($f->gzreadline($l)) {
- chomp $l;
+ my $ofn = shift;
+
+ return "Cannot find $ofn" unless -r $ofn;
+
+ # conditionally handle compressed files (don't cha just lurv live code, this is
+ # a rave from the grave and is "in memoriam Flossie" the ICT 1301G I learnt on.
+ # {for pedant computer historians a 1301G is an ICT 1301A that has been
+ # Galdorised[tm] (for instance had decent IOs and a 24 pre-modify instruction)}
+ my $nfn = $ofn;
+ if ($nfn =~ /.gz$/i) {
+ my $gz;
+ eval qq{use Compress::Zlib; \$gz = gzopen(\$ofn, "rb")};
+ return "Cannot read compressed files $@ $!" if $@ || !$gz;
+ $nfn =~ s/.gz$//i;
+ my $of = new IO::File ">$nfn" or return "Cannot write to $nfn $!";
+ my ($l, $buf);
+ $of->write($buf, $l) while ($l = $gz->gzread($buf));
+ $gz->gzclose;
+ $of->close;
+ $ofn = $nfn;
+ }
+
+ my $of = new IO::File "$ofn" or return "Cannot read $ofn $!";
+
+ while (<$of>) {
+ my $l = $_;
+ $l =~ s/[\r\n]+$//;
my ($call, $city, $state) = split /\|/, $l;
+
+ _add(\%dbn, $call, $city, $state);
- # lookup the city
- my $s = "$city|$state";
- my $ctyn = $dbn{$s};
- unless ($ctyn) {
- my $no = $dbn{'##'} || 1;
- $ctyn = "#$no";
- $dbn{$s} = $ctyn;
- $dbn{$ctyn} = $s;
- $no++;
- $dbn{'##'} = "$no";
- }
- $dbn{$call} = $ctyn;
+ $count++;
}
- $f->gzclose;
+ $of->close;
+ unlink $nfn;
}
untie %dbn;
rename "$dbfn.new", $dbfn;
- return ();
+ return "$count records";
}
1;