Hi all

More and more I'm finding it useful to extend PostgresNode for project
specific helper classes. But PostgresNode::get_new_node is a factory
that doesn't provide any mechanism for overriding, so you have to
create a PostgresNode then re-bless it as your desired subclass. Ugly.

The attached patch allows an optional second argument, a class name,
to be passed to PostgresNode::get_new_node . It's instantiated instead
of PostgresNode if supplied. Its 'new' constructor must take the same
arguments.

BTW, it strikes me that we should really template a Perl file with the
postgres version. Or finally add a --version-num to pg_config so we
don't have to do version parsing. When you're writing extension TAP
tests you often need to know the target postgres version and parsing
our version strings, already annoying, got even more so with Pg 10. I
prefer adding --version-num to pg_config. Any objections? Will submit
patch if none.

-- 
 Craig Ringer                   http://www.2ndQuadrant.com/
 PostgreSQL Development, 24x7 Support, Training & Services
From 8a19793c89b165c25c88cd7149650e20ef27bd55 Mon Sep 17 00:00:00 2001
From: Craig Ringer <cr...@2ndquadrant.com>
Date: Tue, 30 May 2017 15:18:00 +0800
Subject: [PATCH v1] Allow creation of PostgresNode subclasses from
 get_new_node

---
 src/test/perl/PostgresNode.pm | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/src/test/perl/PostgresNode.pm b/src/test/perl/PostgresNode.pm
index 42e66ed..9f28963 100644
--- a/src/test/perl/PostgresNode.pm
+++ b/src/test/perl/PostgresNode.pm
@@ -853,7 +853,7 @@ sub _update_pid
 
 =pod
 
-=item get_new_node(node_name)
+=item get_new_node(node_name, node_class)
 
 Build a new PostgresNode object, assigning a free port number. Standalone
 function that's automatically imported.
@@ -863,14 +863,20 @@ node, and to ensure that it gets shut down when the test script exits.
 
 You should generally use this instead of PostgresNode::new(...).
 
+If you have a subclass of PostgresNode you want created, pass its name as the
+second argument. By default a 'PostgresNode' is created.
+
 =cut
 
 sub get_new_node
 {
 	my $name  = shift;
+	my $pgnclass  = shift;
 	my $found = 0;
 	my $port  = $last_port_assigned;
 
+	$pgnclass = 'PostgresNode' unless defined $pgnclass;
+
 	while ($found == 0)
 	{
 
@@ -911,7 +917,9 @@ 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 = $pgnclass->new($name, $test_pghost, $port);
+
+	die "$pgnclass must have PostgresNode as a base" if (not ($node->isa("PostgresNode")));
 
 	# Add node to list of nodes
 	push(@all_nodes, $node);
-- 
2.9.4

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to