X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=db-hash;h=9b159ff85d716e5d3ee484a37afc1f8e2bf34679;hb=7072dd6217d2a600f729188624f228b5700bd836;hp=28f820918f004f67ff4acfb3040a790341d1a2a8;hpb=2c65a131396bb59dda5b907109d0a52f33d85529;p=bin.git diff --git a/db-hash b/db-hash index 28f8209..9b159ff 100755 --- a/db-hash +++ b/db-hash @@ -1,9 +1,8 @@ #! /usr/bin/perl -# , and is released +# db-hash creates databases and queries it, and is released # under the terms of the GPL version 2, or any later version, at your # option. See the file README and COPYING for more information. -# Copyright 2009 by Don Armstrong . -# $Id: perl_script 1432 2009-04-21 02:42:41Z don $ +# Copyright 2009-11 by Don Armstrong . use warnings; @@ -24,6 +23,11 @@ db-hash - create a database and query using it Options: --create, -c create dbname --update, -u update dbname, create if it doesn't exist + --dump, -D dump dbname + --missing-newline, -n output a newline for unhashed keys + --include-key, -k output the key as well as the value + --reverse, -r reverse (values to key) + --key-to-itself map key to itself --debug, -d debugging level (Default 0) --help, -h display this help --man, -m display manual @@ -32,6 +36,41 @@ db-hash - create a database and query using it =over +=item B<--create,-c> + +Create a database + +=item B<--update,-u> + +Update a database; replaces all keys with the values loaded from the +file, but keeps existing keys which were not replaced + +=item B<--dump,-D> + +Dump database to stdout + +=item B<--include-key,-k> + +Output the key as well as the value. (Off by default) + +=item B<--reverse> + +Map values to a key + +=item B<--key-to-itself> + +Map the key to itself (On by default in reverse hashes) + +=item B<--missing-newline,-n> + +If a key doesn't exist in the database, output a newline. (Forced on +when --include-key set) + +=item B<--reverse,-r> + +Reverse the database (value looks up keys instead); only useful during +creation/update + =item B<--debug, -d> Debug verbosity. (Default 0) @@ -61,10 +100,19 @@ my %options = (debug => 0, man => 0, create => 0, update => 0, + dump => 0, +# include_key => 0, + missing_newline => 1, + reverse => 0, ); GetOptions(\%options, 'create|c','update|u', + 'dump|D', + 'include_key|include-key|k!', + 'reverse|r!', + 'key_to_itself|key-to-itself|K', + 'missing_newline|missing-newline|n!', 'debug|d+','help|h|?','man|m'); pod2usage() if $options{help}; @@ -94,26 +142,65 @@ else { die "Unable to open $db for writing: $!"; } -if ($options{update}) { - die "update currently not supported" +if ($options{reverse}) { + if (not exists $options{key_to_itself}) { + $options{key_to_itself} = 1; + } } -elsif ($options{create}) { + +if (not defined $options{include_key}) { + $options{include_key} = $options{dump} ? 0 : 1; +} + + +if ($options{update} or $options{create}) { my %fast_db; while () { chomp; my ($key,@val) = split /\t/; - $fast_db{$key} = [make_list($fast_db{$key} // [],@val)]; + if ($options{reverse}) { + for my $val_key (@val,$options{key_to_itself}?$key:()) { + $fast_db{$val_key} = [make_list($fast_db{$val_key} // []),$key]; + } + } + else { + $fast_db{$key} = [make_list($fast_db{$key} // [],@val)]; + } } for my $key (keys %fast_db) { $t_db{$key} = $fast_db{$key}; } } +elsif ($options{dump}) { + for my $key (keys %t_db) { + print "$key\t".join("\t",make_list($t_db{$key}))."\n"; + } +} else { - if (@keys) { - print map {"$_\n"} map {make_list($t_db{$_} // [])} @keys; + if (!@keys) { + output_keys(); } else { - print map {"$_\n"} map {make_list($t_db{$_} // [])} ; + output_keys(@keys); + } +} + +sub output_keys { + my @temp = @_; + for my $key (@temp) { + if (not exists $t_db{$key}) { + chomp $key; + } + if ($options{include_key}) { + print $key."\t"; + } + if (exists $t_db{$key}) { + print join("\t",make_list($t_db{$key})); + print "\n"; + } + elsif ($options{missing_newline}) { + print "\n"; + } } }