On 3/23/21 7:09 PM, Andrew Dunstan wrote:
> On 3/23/21 6:36 PM, Michael Paquier wrote:
>> On Thu, Jan 28, 2021 at 10:19:57AM -0500, Andrew Dunstan wrote:
>>> +BEGIN
>>> +{
>>> +
>>> + # putting this in a BEGIN block means it's run and checked by perl -c
>>> +
>>> +
>>> + # everything other than info and get_new_node that we need to override.
>>> + # they are all instance methods, so we can use the same template for all.
>>> + my @instance_overrides = qw(init backup start kill9 stop reload restart
>>> + promote logrotate safe_psql psql background_psql
>>> + interactive_psql poll_query_until command_ok
>>> + command_fails command_like command_checks_all
>>> + issues_sql_like run_log pg_recvlogical_upto
>>> + );
>> No actual objections here, but it would be easy to miss the addition
>> of a new routine. Would an exclusion filter be more adapted, aka
>> override everything except get_new_node() and info()?
>
>
> Actually, following a brief offline discussion today I've thought of a
> way that doesn't require subclassing. Will post that probably tomorrow.
>
And here it is. No subclass, no eval, no magic :-) Some of my colleagues
are a lot happier ;-)
The downside is that we need to litter PostgresNode with a bunch of
lines like:
local %ENV = %ENV;
_set_install_env($self);
The upside is that there's no longer a possibility that someone will add
a new routine to PostgresNode and forget to update the subclass.
Here is my simple test program:
#!/usr/bin/perl
use lib '/home/andrew/pgl/pg_head/src/test/perl';
# PostgresNode (via TestLib) hijacks stdout, so make a dup before it
gets a chance
use vars qw($out);
BEGIN
{
open ($out, ">&STDOUT");
}
use PostgresNode;
my $node = PostgresNode->get_new_node('v12', install_path =>
'/home/andrew/pgl/inst.12.5711');
$ENV{PG_REGRESS} = '/bin/true'; # stupid but necessary
$node->init();
$node->start();
my $version = $node->safe_psql('postgres', 'select version()');
$node->stop();
print $out "Version: $version\n";
print $out $node->info();
cheers
andrew
--
Andrew Dunstan
EDB: https://www.enterprisedb.com