mirror of
https://codeberg.org/scip/dbmdeep.git
synced 2025-12-16 20:21:03 +01:00
initial commit
This commit is contained in:
10
MANIFEST
Normal file
10
MANIFEST
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
MANIFEST
|
||||||
|
Makefile.PL
|
||||||
|
Manager.pm
|
||||||
|
bin/dbmtree
|
||||||
|
samples/zip.yaml
|
||||||
|
samples/sqlite.yaml
|
||||||
|
README
|
||||||
|
Changelog
|
||||||
|
META.yml Module meta-data (added by MakeMaker)
|
||||||
|
META.json Module meta-data (added by MakeMaker)
|
||||||
35
Makefile.PL
Normal file
35
Makefile.PL
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
#
|
||||||
|
# Makefile.PL - build file for DBM::Tree::Manager
|
||||||
|
#
|
||||||
|
# Copyright (c) 2007-2014 T. v.Dein <tom |AT| cpan.org>.
|
||||||
|
# All Rights Reserved. Std. disclaimer applies.
|
||||||
|
# Artistic License, same as perl itself. Have fun.
|
||||||
|
#
|
||||||
|
|
||||||
|
use ExtUtils::MakeMaker;
|
||||||
|
|
||||||
|
WriteMakefile(
|
||||||
|
NAME => 'DBM::Deep::Manager',
|
||||||
|
VERSION_FROM => 'Manager.pm',
|
||||||
|
'EXE_FILES' => [ 'bin/dbmdeep' ],
|
||||||
|
ABSTRACT => 'Maintain DBM::Deep databases interactively',
|
||||||
|
LICENSE => 'perl',
|
||||||
|
AUTHOR => [
|
||||||
|
'Thomas v.Dein <tlinden@cpan.org>',
|
||||||
|
],
|
||||||
|
clean => { FILES => '*~ */*~' },
|
||||||
|
PREREQ_PM => {
|
||||||
|
'DBM::Deep' => 2.0,
|
||||||
|
'YAML' => 0,
|
||||||
|
'Data::Interactive::Inspect' => 0,
|
||||||
|
},
|
||||||
|
dist => { COMPRESS => 'gzip -9f', SUFFIX => 'gz', },
|
||||||
|
test => { TESTS => 't/*.t' },
|
||||||
|
'META_MERGE' => {
|
||||||
|
resources => {
|
||||||
|
repository => 'https://github.com/TLINDEN/dbmdeep',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
148
Manager.pm
Normal file
148
Manager.pm
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
package DBM::Deep::Manager;
|
||||||
|
$DBM::Deep::Manager::VERSION = 0.01;
|
||||||
|
|
||||||
|
|
||||||
|
use DBM::Deep 2.0;
|
||||||
|
use Data::Interactive::Inspect;
|
||||||
|
use YAML;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
use vars qw(@ISA @EXPORT @EXPORT_OK $db);
|
||||||
|
require Exporter;
|
||||||
|
@ISA = qw(Exporter);
|
||||||
|
@EXPORT = qw(getshell opendb _export _import);
|
||||||
|
@EXPORT_OK = qw();
|
||||||
|
|
||||||
|
sub getshell {
|
||||||
|
my ($db, $dbfile) = @_;
|
||||||
|
my $shell = Data::Interactive::Inspect->new(
|
||||||
|
begin => sub {
|
||||||
|
my ($self) = @_;
|
||||||
|
my $maindb = tied(%{$self->{struct}});
|
||||||
|
if (!$self->{session}) {
|
||||||
|
eval { $maindb->begin_work; };
|
||||||
|
if ($@) {
|
||||||
|
print STDERR "transactions not supported by $dbfile," .
|
||||||
|
" re-create with 'num_txns' > 1\n";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$self->{session} = 1;
|
||||||
|
print "ok\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
commit => sub {
|
||||||
|
my ($self) = @_;
|
||||||
|
my $maindb = tied(%{$self->{struct}});
|
||||||
|
if ($self->{session}) {
|
||||||
|
$maindb->commit();
|
||||||
|
$self->{session} = 0;
|
||||||
|
print "ok\n";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
rollback => sub {
|
||||||
|
my ($self) = @_;
|
||||||
|
my $maindb = tied(%{$self->{struct}});
|
||||||
|
if ($self->{session}) {
|
||||||
|
$maindb->rollback();
|
||||||
|
$self->{session} = 0;
|
||||||
|
print "ok\n";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
name => $dbfile,
|
||||||
|
struct => $db,
|
||||||
|
export => sub {
|
||||||
|
my ($db) = @_;
|
||||||
|
return tied(%{$db})->export();
|
||||||
|
}
|
||||||
|
);
|
||||||
|
return $shell;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub opendb {
|
||||||
|
my ($dbfile, %dbparams) = @_;
|
||||||
|
my $db;
|
||||||
|
if (tie my %db, 'DBM::Deep', %dbparams) {
|
||||||
|
$db = \%db;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
die "Could not open dbfile $dbfile: $!\n";
|
||||||
|
}
|
||||||
|
return $db;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _export {
|
||||||
|
my ($file, $dbfile, %dbparams) = @_;
|
||||||
|
my $db = &opendb($dbfile, %dbparams);
|
||||||
|
my $fd;
|
||||||
|
if ($file eq '-') {
|
||||||
|
$fd = *STDOUT;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
open $fd, ">$file" or die "Could not open export file $file for writing: $!\n";
|
||||||
|
}
|
||||||
|
print $fd YAML::Dump(tied(%{$db})->export());
|
||||||
|
close $fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub _import {
|
||||||
|
my ($file, $dbfile, %dbparams) = @_;
|
||||||
|
my $db = &opendb($dbfile, %dbparams);
|
||||||
|
my $fd;
|
||||||
|
if ($file eq '-') {
|
||||||
|
$fd = *STDIN;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
open $fd, "<$file" or die "Could not open import file $file for reading: $!\n";
|
||||||
|
}
|
||||||
|
my $yaml = join '', <$fd>;
|
||||||
|
my $perl = YAML::Load($yaml);
|
||||||
|
tied(%{$db})->import($perl);
|
||||||
|
close $fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
DBM::Deep::Manager - A container for functions for the dbmdeep program
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
If you want to know about the L<dbmtree> program, see the L<dbmtree> file itself.
|
||||||
|
No user-serviceable parts inside. ack is all that should use this.
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
T.v.Dein <tlinden@cpan.org>
|
||||||
|
|
||||||
|
=head1 BUGS
|
||||||
|
|
||||||
|
Report bugs to
|
||||||
|
http://rt.cpan.org/NoAuth/ReportBug.html?Queue=DBM::Deep::Manager
|
||||||
|
|
||||||
|
=head1 SEE ALSO
|
||||||
|
|
||||||
|
L<dbmtree>
|
||||||
|
|
||||||
|
L<DBM::Deep>
|
||||||
|
|
||||||
|
L<Data::Interactive::Inspect>
|
||||||
|
|
||||||
|
=head1 COPYRIGHT
|
||||||
|
|
||||||
|
Copyright (c) 2015 by T.v.Dein <tlinden@cpan.org>.
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
=head1 LICENSE
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it
|
||||||
|
and/or modify it under the same terms as Perl itself.
|
||||||
|
|
||||||
|
=head1 VERSION
|
||||||
|
|
||||||
|
This is the manual page for B<DBM::Deep::Manager> Version 0.01.
|
||||||
|
|
||||||
|
=cut
|
||||||
65
README
Normal file
65
README
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
NAME
|
||||||
|
dbmdeep - manage DBM::Deep databases via command line
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
Usage: dbmdeep [-ceiVhv] [<dbfile>]
|
||||||
|
Manage a DBM::Deep database. Options:
|
||||||
|
|
||||||
|
--config=<config> | -c <config> yaml config containing connect params
|
||||||
|
--export=<file> | -e <file> export db to <file>
|
||||||
|
--import=<file> | -i <file> import db from <file>
|
||||||
|
--verbose | -V enable debug output
|
||||||
|
--help | -h this help message
|
||||||
|
--version | -v print program version
|
||||||
|
|
||||||
|
If - is specified as <file>, STDIN or STDOUT is used respectively.
|
||||||
|
Interactive commands can be piped into dbmdeep as well, e.g.:
|
||||||
|
echo "drop users" | dbmdeep my.db.
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
dbmdeep is a command line utility which can be used to maintain
|
||||||
|
DBM::Deep databases. It is possible to view, modify or delete contents
|
||||||
|
of the database and you can export to a YAML file or import from one.
|
||||||
|
|
||||||
|
The utility presents an interactive prompt where you enter commands to
|
||||||
|
maintain the database, see section INTERACTIVE COMMANDS for more
|
||||||
|
details. Commands can also be piped into the tool via STDIN. Example:
|
||||||
|
|
||||||
|
dbmdeep my.db
|
||||||
|
my.db> show
|
||||||
|
|
||||||
|
is the same as:
|
||||||
|
|
||||||
|
echo "show" | dbmdeep my.db
|
||||||
|
|
||||||
|
INSTALLATION
|
||||||
|
|
||||||
|
to install, type:
|
||||||
|
perl Makefile.PL
|
||||||
|
make
|
||||||
|
make test
|
||||||
|
make install
|
||||||
|
|
||||||
|
to read the complete documentation, type:
|
||||||
|
perldoc Data::Interactive::Inspect
|
||||||
|
|
||||||
|
AUTHOR
|
||||||
|
T.v.Dein <tlinden@cpan.org>
|
||||||
|
|
||||||
|
BUGS
|
||||||
|
Report bugs to
|
||||||
|
http://rt.cpan.org/NoAuth/ReportBug.html?Queue=DBM::Deep::Manager
|
||||||
|
|
||||||
|
SEE ALSO
|
||||||
|
DBM::Deep
|
||||||
|
|
||||||
|
COPYRIGHT
|
||||||
|
Copyright (c) 2015 by T.v.Dein <tlinden@cpan.org>. All rights reserved.
|
||||||
|
|
||||||
|
LICENSE
|
||||||
|
This program is free software; you can redistribute it and/or modify it
|
||||||
|
under the same terms as Perl itself.
|
||||||
|
|
||||||
|
VERSION
|
||||||
|
This is the manual page for dbmdeep Version 0.01.
|
||||||
|
|
||||||
448
bin/dbmdeep
Normal file
448
bin/dbmdeep
Normal file
@@ -0,0 +1,448 @@
|
|||||||
|
#!/usr/bin/perl -w
|
||||||
|
#
|
||||||
|
# Copyright (c) 2015 T.v.Dein <tlinden |AT| cpan.org>.
|
||||||
|
# All Rights Reserved. Std. disclaimer applies.
|
||||||
|
# Artistic License, same as perl itself. Have fun.
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
use Getopt::Long;
|
||||||
|
use DBM::Deep::Manager;
|
||||||
|
use strict;
|
||||||
|
no strict 'refs';
|
||||||
|
|
||||||
|
our ($dbfile, $debug, $version, $help, $export, $import, $config);
|
||||||
|
our (%dbparams);
|
||||||
|
|
||||||
|
Getopt::Long::Configure( qw(no_ignore_case));
|
||||||
|
if (! GetOptions (
|
||||||
|
"export|e=s" => \$export,
|
||||||
|
"import|i=s" => \$import,
|
||||||
|
"config|c=s" => \$config,
|
||||||
|
"version|v" => \$version,
|
||||||
|
"help|h" => \$help,
|
||||||
|
"verbose|V" => \$debug
|
||||||
|
) ) {
|
||||||
|
&usage;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($help){
|
||||||
|
&usage;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($version) {
|
||||||
|
print STDERR "dmbdeep version $DBM::Deep::Manager::VERSION\n";
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
$dbfile = shift;
|
||||||
|
|
||||||
|
if ($config) {
|
||||||
|
if (open Y, "<$config") {
|
||||||
|
my $yaml = join '', <Y>;
|
||||||
|
close Y;
|
||||||
|
my $parsed = YAML::Load($yaml);
|
||||||
|
%dbparams = %{$parsed};
|
||||||
|
if (exists $dbparams{perl}) {
|
||||||
|
# there's perl code in the config, run it
|
||||||
|
my $perl = delete $dbparams{perl};
|
||||||
|
my %params; # we expect $perl to define this
|
||||||
|
|
||||||
|
eval $perl;
|
||||||
|
if ($@) {
|
||||||
|
print "Failed to evaluate perl code in $config: $@\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
%dbparams = (%dbparams, %params); # merge them in
|
||||||
|
if (exists $dbparams{file}) {
|
||||||
|
$dbfile = $dbparams{file}; # no commandline $dbfile required
|
||||||
|
}
|
||||||
|
elsif ($dbfile) {
|
||||||
|
$dbparams{file} = $dbfile;
|
||||||
|
}
|
||||||
|
elsif (!exists $dbparams{dbi}) {
|
||||||
|
print STDERR "No 'file' or 'dbi' parameter specified\n";
|
||||||
|
exit 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
die "Could not open config $config: $!\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
# work with dbfile, assume defaults
|
||||||
|
if (!$dbfile) {
|
||||||
|
&usage;
|
||||||
|
}
|
||||||
|
%dbparams = (
|
||||||
|
file => $dbfile,
|
||||||
|
locking => 1,
|
||||||
|
autoflush => 1,
|
||||||
|
num_txns => 10,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($export) {
|
||||||
|
_export($export, $dbfile, %dbparams);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
if ($import) {
|
||||||
|
_import($import, $dbfile, %dbparams);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
# main
|
||||||
|
my $db = opendb($dbfile, %dbparams);
|
||||||
|
my $shell = getshell($db, $dbfile);
|
||||||
|
$shell->inspect();
|
||||||
|
exit;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
sub usage {
|
||||||
|
print STDERR qq(Usage: dbmdeep [-ceiVhv] [<dbfile>]
|
||||||
|
Manage a DBM::Deep database. Options:
|
||||||
|
|
||||||
|
--config=<config> | -c <config> yaml config containing connect params
|
||||||
|
--export=<file> | -e <file> export db to <file>
|
||||||
|
--import=<file> | -i <file> import db from <file>
|
||||||
|
--verbose | -V enable debug output
|
||||||
|
--help | -h this help message
|
||||||
|
--version | -v print program version
|
||||||
|
|
||||||
|
If - is specified as <file>, STDIN or STDOUT is used respectively.
|
||||||
|
Interactive commands can be piped into dbmdeep as well, e.g.:
|
||||||
|
echo "drop users" | dbmdeep my.db.
|
||||||
|
|
||||||
|
dbmdeep version $DBM::Deep::Manager::VERSION.
|
||||||
|
);
|
||||||
|
|
||||||
|
exit 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
dbmdeep - manage DBM::Deep databases via command line
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
Usage: dbmdeep [-ceiVhv] [<dbfile>]
|
||||||
|
Manage a DBM::Deep database. Options:
|
||||||
|
|
||||||
|
--config=<config> | -c <config> yaml config containing connect params
|
||||||
|
--export=<file> | -e <file> export db to <file>
|
||||||
|
--import=<file> | -i <file> import db from <file>
|
||||||
|
--verbose | -V enable debug output
|
||||||
|
--help | -h this help message
|
||||||
|
--version | -v print program version
|
||||||
|
|
||||||
|
If - is specified as <file>, STDIN or STDOUT is used respectively.
|
||||||
|
Interactive commands can be piped into dbmdeep as well, e.g.:
|
||||||
|
echo "drop users" | dbmdeep my.db.
|
||||||
|
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
B<dbmdeep> is a command line utility which can be used to maintain L<DBM::Deep>
|
||||||
|
databases. It is possible to view, modify or delete contents of the database and
|
||||||
|
you can export to a L<YAML> file or import from one.
|
||||||
|
|
||||||
|
The utility presents an interactive prompt where you enter commands to maintain
|
||||||
|
the database, see section B<INTERACTIVE COMMANDS> for more details. Commands can
|
||||||
|
also be piped into the tool via STDIN. Example:
|
||||||
|
|
||||||
|
dbmdeep my.db
|
||||||
|
my.db> show
|
||||||
|
|
||||||
|
is the same as:
|
||||||
|
|
||||||
|
echo "show" | dbmdeep my.db
|
||||||
|
|
||||||
|
=head1 OPTIONS
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item B<--config>
|
||||||
|
|
||||||
|
Specify a config file in L<YAML> format. The config may contain special customizations
|
||||||
|
for the L<DBM::Deep> instanziation. See section B<CONFIG> for more details.
|
||||||
|
|
||||||
|
=item B<--export>
|
||||||
|
|
||||||
|
Export the contents of the database to a L<YAML> file. If the specified file name
|
||||||
|
is B<->, STDOUT will be used to print the export.
|
||||||
|
|
||||||
|
=item B<--import>
|
||||||
|
|
||||||
|
Import data from a L<YAML> file. If the database already exists, the contents of
|
||||||
|
the import file will be merged with the existing contents, otherwise the database
|
||||||
|
will be created.
|
||||||
|
|
||||||
|
=item B<--verbose>
|
||||||
|
|
||||||
|
Enable debugging output.
|
||||||
|
|
||||||
|
=item B<--help>
|
||||||
|
|
||||||
|
Print a usage message to STDERR.
|
||||||
|
|
||||||
|
=item B<--version>
|
||||||
|
|
||||||
|
Print the software version to STDERR.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 CONFIG
|
||||||
|
|
||||||
|
A config file is optional. If no config file is specified, B<dbmdeep> makes a couple
|
||||||
|
of assumptions about the database: it opens it with the L<DBM::Deep::Storage::File>
|
||||||
|
backend with transactions enabled.
|
||||||
|
|
||||||
|
Since L<DBM::Deep> allows for a range of options about the storage backend, the B<dbmtree>
|
||||||
|
utility supports complete customization using the config file (parameter B<--config>).
|
||||||
|
|
||||||
|
Here are couple of examples:
|
||||||
|
|
||||||
|
---
|
||||||
|
perl: |
|
||||||
|
use Compress::Zlib;
|
||||||
|
%params = (
|
||||||
|
filter_store_key => \&my_compress,
|
||||||
|
filter_store_value => \&my_compress,
|
||||||
|
filter_fetch_key => \&my_decompress,
|
||||||
|
filter_fetch_value => \&my_decompress,
|
||||||
|
);
|
||||||
|
sub my_compress {
|
||||||
|
my $s = shift;
|
||||||
|
utf8::encode($s);
|
||||||
|
return Compress::Zlib::memGzip( $s ) ;
|
||||||
|
}
|
||||||
|
sub my_decompress {
|
||||||
|
my $s = Compress::Zlib::memGunzip( shift ) ;
|
||||||
|
utf8::decode($s);
|
||||||
|
return $s;
|
||||||
|
}
|
||||||
|
|
||||||
|
This config implements the sample in L<DBM::Deep::Cookbook#Real-time-Compression-Example>.
|
||||||
|
It uses the standard File backend but compresses everything using L<Compress::Zlib>. Note
|
||||||
|
that this config only contains one entry: B<perl>, with a multiline value which contains
|
||||||
|
perl code. This perl code will be evaluated by B<dbmdeep> at runtime.
|
||||||
|
|
||||||
|
Please note, that the hash B<%params> is predefined by B<dbmdeep>, so it must exist and
|
||||||
|
must not be local (e.g. don't use: 'my %params'!). The hash may contain anything allowed
|
||||||
|
by L<DBM::Deep::new()>.
|
||||||
|
|
||||||
|
Also note, that this config doesn't specify a database, so the file name of the database
|
||||||
|
must be specified on the command line, eg:
|
||||||
|
|
||||||
|
dbmdeep -c zip.yaml my.db
|
||||||
|
|
||||||
|
Another example:
|
||||||
|
|
||||||
|
---
|
||||||
|
dbi:
|
||||||
|
dsn: dbi:SQLite:dbname=sb.sqlite
|
||||||
|
username:
|
||||||
|
password:
|
||||||
|
connect_args:
|
||||||
|
|
||||||
|
Here we use the L<DBM::Deep::Storage::DBI> backend with a sqlite database. You don't need
|
||||||
|
to speficy a database file name on the command line in such a case, eg:
|
||||||
|
|
||||||
|
dbmdeep -c sqlite.yaml
|
||||||
|
|
||||||
|
Other supported config parameters are: B<editor> which will be used by the interactive
|
||||||
|
B<edit> command and B<more> which will be used by interactive commands which display
|
||||||
|
large amounts of data.
|
||||||
|
|
||||||
|
=head1 INTERACTIVE COMMANDS
|
||||||
|
|
||||||
|
=head2 DISPLAY COMMANDS
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item B<list>
|
||||||
|
|
||||||
|
Lists the keys of the current level of the database hash.
|
||||||
|
|
||||||
|
Shortcut: B<l>.
|
||||||
|
|
||||||
|
=item B<show>
|
||||||
|
|
||||||
|
Does nearly the same as B<list> but also shows the content of the
|
||||||
|
keys. If a key points to a structure (like a hash or an array), B<show>
|
||||||
|
whill not display anything of it, but instead indicate, that there'e
|
||||||
|
more behind that key.
|
||||||
|
|
||||||
|
Shortcut: B<sh>.
|
||||||
|
|
||||||
|
=item B<dump>
|
||||||
|
|
||||||
|
Dumps out everything of the current level of the database hash.
|
||||||
|
|
||||||
|
Shortcut: B<d>.
|
||||||
|
|
||||||
|
=item B<get> key | /regex>
|
||||||
|
|
||||||
|
Displays the value of B<key>. If you specify a regex, the values of
|
||||||
|
all matching keys will be shown.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 NAVIGATION COMMANDS
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item B<enter> key
|
||||||
|
|
||||||
|
You can use this command to enter a sub hash of the current hash.
|
||||||
|
It works like browsing a directory structure. You can only enter
|
||||||
|
keys which point to sub hashes.
|
||||||
|
|
||||||
|
Shortcuts: B<cd>
|
||||||
|
|
||||||
|
If the key you want to enter doesn't collide with a command, then
|
||||||
|
you can also just directly enter the key without 'enter' or 'cd' in
|
||||||
|
front of it, eg:
|
||||||
|
|
||||||
|
my.db> list
|
||||||
|
subhash
|
||||||
|
my.db> subhash
|
||||||
|
my.db subhash> dump
|
||||||
|
my.db subhash> ..
|
||||||
|
my.db>^D
|
||||||
|
|
||||||
|
If you specify B<..> as parameter (or as its own command like in the
|
||||||
|
example below), you go one level up and leave the current sub hash.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 EDIT COMMANDS
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item B<set> key value
|
||||||
|
|
||||||
|
Use the B<set> command to add a new key or to modify the value
|
||||||
|
of a key. B<value> may be a valid perl structure, which you can
|
||||||
|
use to create sub hashes or arrays. Example:
|
||||||
|
|
||||||
|
my.db> set users [ { name => 'max'}, { name => 'joe' } ]
|
||||||
|
ok
|
||||||
|
mydb> get users
|
||||||
|
users =>
|
||||||
|
{
|
||||||
|
'name' => 'max'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'name' => 'joe'
|
||||||
|
}
|
||||||
|
|
||||||
|
B<Please note that the B<set> command overwrites existing values
|
||||||
|
without asking>.
|
||||||
|
|
||||||
|
=item B<edit> key
|
||||||
|
|
||||||
|
You can edit a whole structure pointed at by B<key> with the
|
||||||
|
B<edit> command. It opens an editor with the structure converted
|
||||||
|
to L<YAML>. Modify whatever you wish, save, and the structure will
|
||||||
|
be saved to the database.
|
||||||
|
|
||||||
|
=item B<append> key value
|
||||||
|
|
||||||
|
This command can be used to append a value to an array. As with the
|
||||||
|
B<set> command, B<value> can be any valid perl structure.
|
||||||
|
|
||||||
|
=item B<drop> key
|
||||||
|
|
||||||
|
Delete a key.
|
||||||
|
|
||||||
|
Again, note that all commands are executed without further asking
|
||||||
|
or warning!
|
||||||
|
|
||||||
|
=item B<pop> key
|
||||||
|
|
||||||
|
Remove the last element of the array pointed at by B<key>.
|
||||||
|
|
||||||
|
=item B<shift> key
|
||||||
|
|
||||||
|
Remove the first element of the array pointed at by B<key>.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 TRANSACTION COMMANDS
|
||||||
|
|
||||||
|
See L<DBM::Deep#TRANSACTIONS>.
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item B<begin>
|
||||||
|
|
||||||
|
Start a transaction.
|
||||||
|
|
||||||
|
=item B<commit>
|
||||||
|
|
||||||
|
Save all changes made since the transaction began to the database.
|
||||||
|
|
||||||
|
=item B<rollback>
|
||||||
|
|
||||||
|
Discard all changes of the transaction.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head2 MISC COMMANDS
|
||||||
|
|
||||||
|
=over
|
||||||
|
|
||||||
|
=item B<help>
|
||||||
|
|
||||||
|
Display a short command help.
|
||||||
|
|
||||||
|
Shortcuts: B<h> or B<?>.
|
||||||
|
|
||||||
|
=item B<CTRL-D>
|
||||||
|
|
||||||
|
Quit B<dbmdeep>
|
||||||
|
|
||||||
|
Shortcuts: B<quit>.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=head1 AUTHOR
|
||||||
|
|
||||||
|
T.v.Dein <tlinden@cpan.org>
|
||||||
|
|
||||||
|
=head1 BUGS
|
||||||
|
|
||||||
|
Report bugs to
|
||||||
|
http://rt.cpan.org/NoAuth/ReportBug.html?Queue=DBM::Deep::Manager
|
||||||
|
|
||||||
|
=head1 SEE ALSO
|
||||||
|
|
||||||
|
L<DBM::Deep>
|
||||||
|
|
||||||
|
=head1 COPYRIGHT
|
||||||
|
|
||||||
|
Copyright (c) 2015 by T.v.Dein <tlinden@cpan.org>.
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
=head1 LICENSE
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it
|
||||||
|
and/or modify it under the same terms as Perl itself.
|
||||||
|
|
||||||
|
=head1 VERSION
|
||||||
|
|
||||||
|
This is the manual page for B<dbmdeep> Version 0.01.
|
||||||
|
|
||||||
|
=cut
|
||||||
7
samples/sqlite.yaml
Normal file
7
samples/sqlite.yaml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
dbi:
|
||||||
|
dsn: dbi:SQLite:dbname=sb.sqlite
|
||||||
|
username:
|
||||||
|
password:
|
||||||
|
connect_args:
|
||||||
|
|
||||||
20
samples/zip.yaml
Normal file
20
samples/zip.yaml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
perl: |
|
||||||
|
use Compress::Zlib;
|
||||||
|
%params = (
|
||||||
|
filter_store_key => \&my_compress,
|
||||||
|
filter_store_value => \&my_compress,
|
||||||
|
filter_fetch_key => \&my_decompress,
|
||||||
|
filter_fetch_value => \&my_decompress,
|
||||||
|
);
|
||||||
|
sub my_compress {
|
||||||
|
my $s = shift;
|
||||||
|
utf8::encode($s);
|
||||||
|
return Compress::Zlib::memGzip( $s ) ;
|
||||||
|
}
|
||||||
|
sub my_decompress {
|
||||||
|
my $s = Compress::Zlib::memGunzip( shift ) ;
|
||||||
|
utf8::decode($s);
|
||||||
|
return $s;
|
||||||
|
}
|
||||||
|
|
||||||
Reference in New Issue
Block a user