fix(tools): anvil-access-module: default interactive, handle non-existing on class object

main
Tsu-ba-me 2 years ago
parent d9bc73ec2d
commit b494f79ffe
  1. 30
      tools/anvil-access-module

@ -161,12 +161,13 @@ sub access_chain
else # Left-hand is not hash; treat it as blessed/class object (module) and try to call a method from it else # Left-hand is not hash; treat it as blessed/class object (module) and try to call a method from it
{ {
# Key not found in object; stop following the chain # Key not found in object; stop following the chain
last if (not defined $intermediate->${key}); eval { defined $intermediate->${key} ? 1 : 0; } or last;
# On the last key of the chain; try to execute the subroutine if it exists # On the last key of the chain; try to execute the subroutine if it exists
if ( $is_last_key && $intermediate->can($key) ) if ( $is_last_key && $intermediate->can($key) )
{ {
eval { (@results) = $intermediate->${key}(@$chain_args); return 1; } or @results = (1); # Trailing 1 means the eval block will return success if the subroutine and assign succeeded
eval { (@results) = $intermediate->${key}(@$chain_args); 1; } or @results = (1);
last; last;
} }
@ -420,14 +421,14 @@ if (not $anvil->data->{sys}{database}{connections})
} }
my $data_hash = $anvil->data->{switches}{'data'}; my $data_hash = $anvil->data->{switches}{'data'};
my $db_access_mode = defined $anvil->data->{switches}{'mode'} ? $anvil->data->{switches}{'mode'} : ""; my $db_access_mode = $anvil->data->{switches}{'mode'} // "";
my $db_uuid = $anvil->data->{switches}{'uuid'}; my $db_uuid = $anvil->data->{switches}{'uuid'};
my $pre_data = $anvil->data->{switches}{'predata'}; my $pre_data = $anvil->data->{switches}{'predata'};
my $script_file = $anvil->data->{switches}{'script'}; my $script_file = $anvil->data->{switches}{'script'} // "-";
my $sql_query = $anvil->data->{switches}{'query'}; my $sql_query = $anvil->data->{switches}{'query'};
my $sub_module_name = defined $anvil->data->{switches}{'sub-module'} ? $anvil->data->{switches}{'sub-module'} : "Database"; my $sub_module_name = $anvil->data->{switches}{'sub-module'} // "Database";
my $sub_name = defined $anvil->data->{switches}{'sub'} ? $anvil->data->{switches}{'sub'} : ""; my $sub_name = $anvil->data->{switches}{'sub'} // "";
my $sub_params = defined $anvil->data->{switches}{'sub-params'} ? $anvil->data->{switches}{'sub-params'} : "{}"; my $sub_params = $anvil->data->{switches}{'sub-params'} // "{}";
if ($sql_query) if ($sql_query)
{ {
@ -483,12 +484,12 @@ elsif ($data_hash)
pstdout(JSON->new->utf8->allow_blessed->encode($get_anvil_data_params->{data})); pstdout(JSON->new->utf8->allow_blessed->encode($get_anvil_data_params->{data}));
} }
elsif ($script_file) else
{ {
my $script_file_handle; my $script_file_handle;
eval { eval {
if ($script_file eq "#!SET!#") if ($script_file =~ /^#!SET!#|-$/)
{ {
$script_file = "-"; $script_file = "-";
@ -499,7 +500,8 @@ elsif ($script_file)
open($script_file_handle, "< :encoding(UTF-8)", $script_file); open($script_file_handle, "< :encoding(UTF-8)", $script_file);
} }
} or do { } or do {
pstderr("failed to open $script_file as script input; cause: $@"); # open() sets $! upon error, different from the database module failure (which sets $@)
pstderr("failed to open $script_file as script input; cause: $!");
$anvil->nice_exit({ exit_code => 1 }); $anvil->nice_exit({ exit_code => 1 });
}; };
@ -529,16 +531,10 @@ elsif ($script_file)
} }
close($script_file_handle) or do { close($script_file_handle) or do {
pstderr("failed to close $script_file handle; cause: $@"); pstderr("failed to close $script_file handle; cause: $!");
$anvil->nice_exit({ exit_code => 1 }); $anvil->nice_exit({ exit_code => 1 });
}; };
} }
else
{
print STDERR "missing switches/parameters; one of --data, --query, --script, or --sub is required\n";
$anvil->nice_exit({ exit_code => 1 });
}
$anvil->nice_exit({ exit_code => 0 }); $anvil->nice_exit({ exit_code => 0 });

Loading…
Cancel
Save