## If there are no nouns, we can only show the generic help
help() if ! @nouns;
- my @command = @nouns < 3 ? @nouns
- : $nouns[1] eq 'all' ? ($nouns[0], $nouns[2])
- : ($nouns[0], $nouns[1]);
-
+ my @command = ($nouns[0], join ' ', @nouns);
my $usage = usage(join '/' => @command)
or help(1, "Unknown command: " . join ' ' => @command);
print $usage;
## Example: bucardo add db nyc1 dbname=nyc1 dbhost=nyc1.example.com dbgroup=sales
## Grab our generic usage message
- my $usage = usage('add_database');
+ my $usage = usage('add/add db');
## The first word is the internal name (bucardo.db.name)
my $item_name = shift @nouns || '';
## No name is a problem
if (! length $item_name) {
- warn "$usage\n";
+ warn $usage;
exit 1;
}
## Example: bucardo remove db nyc1 nyc2 --force
## Grab our generic usage message
- my $usage = usage('remove_database');
+ my $usage = usage('remove');
## Must have at least one name
if (!@nouns) {
my @actions = @_;
## Grab our generic usage message
- my $usage = usage('update_database');
+ my $usage = usage('update');
if (! @actions) {
print "$usage\n";
## Example: bucardo list db sale%
## Grab our generic usage message
- my $usage = usage('list_databases');
+ my $usage = usage('list');
## Might be no databases yet
if (! keys %$DB) {
## Example: bucardo add dbgroup nycservers nyc1:source nyc2:source lax1
## Grab our generic usage message
- my $usage = usage('add_dbgroup');
+ my $usage = usage('add/add dbgroup');
my $name = shift @nouns || '';
## Example: bucardo remove dbgroup sales
## Grab our generic usage message
- my $usage = usage('remove_dbgroup');
+ my $usage = usage('remove');
## Must have at least one name
if (!@nouns) {
my @actions = @_;
## Grab our generic usage message
- my $usage = usage('update_dbgroup');
+ my $usage = usage('update');
if (! @actions) {
print "$usage\n";
## Example: bucardo list dbgroups
## Grab our generic usage message
- my $usage = usage('list_dbgroups');
+ my $usage = usage('list');
## Might be no groups yet
if (! keys %$DBGROUP) {
my $item_name = shift @nouns || '';
- my $usage = usage('add_customname');
+ my $usage = usage('add/add customname');
## Must have a second name as well
my $newname = shift @nouns || '';
## Example: bucardo remove customname 7
## Grab our generic usage message
- my $usage = usage('remove_customname');
+ my $usage = usage('remove');
## Must have at least one name
if (!@nouns) {
## Example: bucardo list customname
## Grab our generic usage message
- my $usage = usage('list_customname');
+ my $usage = usage('list');
## Might be no entries yet
if (! keys %$CUSTOMNAME) {
my $item_name = shift @nouns || '';
- my $usage = usage('add_customcols');
+ my $usage = usage('add');
## Must have a clause as well
my $clause = shift @nouns || '';
## Example: bucardo remove customcols 7
## Grab our generic usage message
- my $usage = usage('remove_customcols');
+ my $usage = usage('remove');
## Must have at least one name
if (!@nouns) {
## Example: bucardo list customcols
## Grab our generic usage message
- my $usage = usage('list_customcols');
+ my $usage = usage('list');
## Might be no entries yet
if (! keys %$CUSTOMCOLS) {
## Example: bucardo add table pgbench_accounts foo% myschema.abc
## Grab our generic usage message
- my $usage = usage('add_table');
+ my $usage = usage('add/add table');
## Must have at least one table
if (! @nouns) {
## Arguments: none, parses nouns for tables
## Returns: never, exits
- my $usage = usage('remove_table');
+ my $usage = usage('remove');
if (!@nouns) {
warn "$usage\n";
my @actions = @_;
## Grab our generic usage message
- my $usage = usage('update_table');
+ my $usage = usage('update');
if (! @actions) {
print "$usage\n";
## Example: bucardo list tables
## Grab our generic usage message
- my $usage = usage('list_tables');
+ my $usage = usage('list');
## Might be no tables yet
if (! keys %$TABLE) {
## Example: bucardo add herd foobar tab1 tab2
## Grab our generic usage message
- my $usage = usage('add_herd');
+ my $usage = usage('add/add relgroup');
my $herdname = shift @nouns || '';
## Arguments: none, parses nouns
## Returns: never, exits
- my $usage = usage('remove_herd');
+ my $usage = usage('remove');
if (!@nouns) {
warn "$usage\n";
## Arguments: none, parses nouns for herd names
## Returns: 0 on success, -1 on error
- my $usage = usage('list_herds');
+ my $usage = usage('list');
## Any nouns are filters against the whole list
my $clause = generate_clause({col => 'name', items => \@nouns});
my $item_name = shift @nouns || '';
- my $usage = usage('add_sync');
+ my $usage = usage('add/add sync');
my $batch = 1;
## Arguments: none (uses nouns)
## Returns: never, exits
- my $usage = usage('remove_sync');
+ my $usage = usage('remove');
if (!@nouns) {
warn "$usage\n";
my @actions = @_;
- my $usage = usage('update_sync');
+ my $usage = usage('update');
if (! @actions) {
print "$usage\n";
## Arguments: none (reads nouns for a list of syncs)
## Returns: 0 on success, -1 on error
- my $usage = usage('list_syncs');
+ my $usage = usage('list');
my $syncs = $global{sync};
## Arguments: none, parses nouns
## Returns: never, exits
- my $usage = usage('inspect_table');
+ my $usage = usage('inspect');
if (! @nouns) {
warn "$usage\n";
## Arguments: none, parses nouns
## Returns: never, exits
- my $usage = usage('inspect_herd');
+ my $usage = usage('inspect');
if (! @nouns) {
warn "$usage\n";
## Arguments: none, parses nouns
## Returns: never, exits
- my $usage = usage('inspect_sync');
+ my $usage = usage('inspect');
if (! @nouns) {
warn "$usage\n";
## Arguments: none, parses nouns for customcodes
## Returns: 0 on success, -1 on error
- my $usage = usage('list_customcodes');
+ my $usage = usage('list');
## Any nouns are filters against the whole list
my $clause = generate_clause({col => 'name', items => \@nouns});
## Arguments: none (reads nouns for a list of sequences)
## Returns: 0 on success, -1 on error
- my $usage = usage('list_sequences');
+ my $usage = usage('list');
my $clause = generate_clause({col => 'tablename', items => \@nouns});
my $WHERE = $clause ? "AND $clause" : '';
my $item_name = shift @nouns || '';
- my $usage = usage('add_customcode');
+ my $usage = usage('add/add customcode');
if (!length $item_name) {
warn "$usage\n";
## Arguments: none (uses nouns)
## Returns: never, exits
- my $usage = usage('remove_customcode');
+ my $usage = usage('remove');
if (!@nouns) {
warn "$usage\n";
## Returns: help string or an empty string for no matches
my $name = shift or die;
+ $name .= "/!.+" if $name eq 'add';
my $usage;
open my $usage_fh, '>', \$usage;
bucardo list <type> <regex>
-Lists summary information about Bucardo objects. The supported C<types> are:
+Lists summary information about Bucardo objects. The supported types are:
=over
bucardo add <type> <name> <parameters>
Adds a new object to Bucardo. The C<type> sepcifies the type of object to add,
-while the C<name> should be the name of the object. The supported types and
-their parameters are:
+while the C<name> should be the name of the object. The supported types
+include:
+
+=over
+
+=item C<db>
+
+=item C<dbgroup>
+
+=item C<table>
+
+=item C<sequence>
+
+=item C<all tables>
+
+=item C<all sequences>
+
+=item C<relgroup>
+
+=item C<sync>
+
+=item C<customname>
+
+=item C<customcols>
+
+=item C<customcols>
+
+=back
-=head3 db
+=head3 add db
bucardo add db <name> dbname=actual_name port=xxx host=xxx user=xxx pass=xxx
=back
-=head3 dbgroup
+=head3 add dbgroup
bucardo add dbgroup name db1 db2 db3 ...
Adds one or more databases to the named database group. If the database group
doesn't exist, it will be created.
-=head3 table
+=head3 add table
bucardo add table [schema].table db=actual_db_name
=back
-=head3 sequence
+=head3 add sequence
bucardo add sequence [schema].sequence relgroup=xxx
=back
-=head3 all tables
+=head3 add all tables
bucardo add all tables [relgroup=xxx] [pkonly]
=back
-=head3 all sequences
+=head3 add all sequences
bucardo add all sequences relgroup=xxx
=back
-=head3 relgroup
+=head3 add relgroup
bucardo add relgroup name
bucardo add relgroup name table, sequence, ...
Adds a relation group. After the name, pass in an optional list of tables
and/or sequences and they will be added to the group.
-=head3 sync
+=head3 add sync
bucardo add sync syncname relgroup=xxx dbs=xxx
=back
-=head3 customname
+=head3 add customname
bucardo add customname oldname newname [db=name] [sync=name]
=back
-=head3 customcols
+=head3 add customcols
bucardo add customcols tablename select_clause [sync=x db=x]
=back
-=head3 customcode
+=head3 add customcode
bucardo add customcode <name> <whenrun=value> <src_code=filename> [optional information]
$t = 'Add database with no argument gives expected help message';
$res = $bct->ctl('bucardo add db');
-like ($res, qr/Usage: add db/, $t);
+like ($res, qr/bucardo add db/, $t);
$t = q{Add database accepts both 'add database' and 'add db'};
$res = $bct->ctl('bucardo add database');
-like ($res, qr/Usage: add db/, $t);
+like ($res, qr/bucardo add db/, $t);
$t = q{Add database fails if not given a dbname};
$res = $bct->ctl('bucardo add database foobar');
$t = q{Update database gives proper error with no db};
$res = $bct->ctl('bucardo update db');
-like ($res, qr/Usage:/, $t);
+like ($res, qr/bucardo update/, $t);
$t = q{Update database gives proper error with no items};
$res = $bct->ctl('bucardo update db foobar');
-like ($res, qr/Usage:/, $t);
+like ($res, qr/bucardo update/, $t);
$t = q{Update database gives proper error with invalid database};
$res = $bct->ctl('bucardo update db foobar a=b');
$t = q{Update database gives proper error with invalid format};
$res = $bct->ctl('bucardo update db A blah blah');
-like ($res, qr/Usage: update database/, $t);
+like ($res, qr/bucardo update/, $t);
$res = $bct->ctl('bucardo update db A blah123#=123');
-like ($res, qr/Usage: update database/, $t);
+like ($res, qr/bucardo update/, $t);
$t = q{Update database gives proper error with invalid items};
$res = $bct->ctl('bucardo update db A foobar=123');