postgres.git / summary / log / commit / refs

commit    3b7bbee7b661536713df3f6c93a8f446bdbfd0ae
Author:   Alvaro Herrera <alvherre@alvh.no-ip.org>
Date:     Tue Jul 25 22:39:44 2017 +0000

    Make PostgresNode easily subclassable
    
    This module becomes much more useful if we allow it to be used as base
    class for external projects.  To achieve this, change the exported
    get_new_node function into a class method instead, and use the standard
    Perl idiom of accepting the class as first argument.  This method works
    as expected for subclasses.  The standalone function is kept for
    backwards compatibility, though it could be removed in pg11.
    
    Author: Chap Flackman, based on an earlier patch from Craig Ringer
    Discussion: https://postgr.es/m/CAMsr+YF8kO+4+K-_U4PtN==2FndJ+5Bn6A19XHhMiBykEwv0wA@mail.gmail.com


src/test/perl/PostgresNode.pm | 20 ++++++++++++-------- src/test/perl/README | 2 +- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/test/perl/PostgresNode.pm b/src/test/perl/PostgresNode.pm index 711d0deae8f..8ec843edeaa 100644 --- a/src/test/perl/PostgresNode.pm +++ b/src/test/perl/PostgresNode.pm @@ -9,7 +9,7 @@ PostgresNode - class representing PostgreSQL server instance use PostgresNode; - my $node = get_new_node('mynode'); + my $node = PostgresNode->get_new_node('mynode'); # Create a data directory with initdb $node->init(); @@ -845,20 +845,24 @@ sub _update_pid =pod -=item get_new_node(node_name) +=item PostgresNode->get_new_node(node_name) -Build a new PostgresNode object, assigning a free port number. Standalone -function that's automatically imported. +Build a new object of class C<PostgresNode> (or of a subclass, if you have +one), assigning a free port number. Remembers the node, to prevent its port +number from being reused for another node, and to ensure that it gets +shut down when the test script exits. -Remembers the node, to prevent its port number from being reused for another -node, and to ensure that it gets shut down when the test script exits. +You should generally use this instead of C<PostgresNode::new(...)>. -You should generally use this instead of PostgresNode::new(...). +For backwards compatibility, it is also exported as a standalone function, +which can only create objects of class C<PostgresNode>. =cut sub get_new_node { + my $class = 'PostgresNode'; + $class = shift if 1 < scalar @_; my $name = shift; my $found = 0; my $port = $last_port_assigned; @@ -903,7 +907,7 @@ sub get_new_node print "# Found free port $port\n"; # Lock port number found by creating a new node - my $node = new PostgresNode($name, $test_pghost, $port); + my $node = $class->new($name, $test_pghost, $port); # Add node to list of nodes push(@all_nodes, $node); diff --git a/src/test/perl/README b/src/test/perl/README index 4279d316c4d..cbee418e14b 100644 --- a/src/test/perl/README +++ b/src/test/perl/README @@ -42,7 +42,7 @@ Each test script should begin with: then it will generally need to set up one or more nodes, run commands against them and evaluate the results. For example: - my $node = get_new_node('master'); + my $node = PostgresNode->get_new_node('master'); $node->init; $node->start; [parent: 51865a0a0141]