From 32da7ce14a86d991568460d35bc5b045aa6d1bd4 Mon Sep 17 00:00:00 2001
From: Martin Pitt <martin@piware.de>
Date: Mon, 31 Jan 2005 23:27:17 +0000
Subject: [PATCH] initial Perl version of pg_wrapper

---
 postgresql-common-1/Makefile   | 19 +--------
 postgresql-common-1/TODO       |  2 +
 postgresql-common-1/pg_wrapper | 72 ++++++++++++++++++++++++++++++++++
 3 files changed, 75 insertions(+), 18 deletions(-)
 create mode 100755 postgresql-common-1/pg_wrapper

diff --git a/postgresql-common-1/Makefile b/postgresql-common-1/Makefile
index 5b9fedf4..b81445e3 100644
--- a/postgresql-common-1/Makefile
+++ b/postgresql-common-1/Makefile
@@ -5,21 +5,9 @@ BINDIR = $(PREFIX)/bin
 SBINDIR = $(PREFIX)/sbin
 MANDIR = $(PREFIX)/man
 
-CFLAGS = -g -Wall
-
-PROGS = pg_wrapper
-
-LINKS = pg_exec pg_default psql pg_dump pg_dumpall createdb createuser dropdb dropuser pg_restore clusterdb vacuumdb psql
-
-SRCS  = pg_wrapper.c pg_default.c pg_files.c pg_exec.c
-
-OBJS  = pg_wrapper.o pg_default.o pg_files.o pg_exec.o
-
-all:	pg_wrapper
+LINKS = clusterdb createdb createlang createuser dropdb droplang dropuser pg_dump pg_dumpall pg_restore psql vacuumdb vacuumlo
 
 clean:
-	-rm $(PROGS) $(LINKS) $(OBJS)
-	-rm *~
 
 install:	pg_wrapper
 	[ -z "$(DESTDIR)" ] || mkdir -p "$(DESTDIR)"
@@ -34,8 +22,3 @@ install:	pg_wrapper
 	    for f in $(LINKS); do \
 	        ln -sf pg_wrapper $$f; \
 	    done
-
-pg_wrapper:	$(OBJS)
-	gcc $(CFLAGS) $(OBJS) -o $@ 
-
-$(OBJS):	pg_wrapper.h
diff --git a/postgresql-common-1/TODO b/postgresql-common-1/TODO
index 84c07c4c..f4980a20 100644
--- a/postgresql-common-1/TODO
+++ b/postgresql-common-1/TODO
@@ -48,3 +48,5 @@ Write manpages for: pg_lsclusters, pg_{create,start,stop,reload}cluster
 add $CONFDIR/port, add support for that in pg_{create,start}cluster and
 pg_lscclusters, prefer this in init scripts
 
+determine db version of the default port in pg_wrapper
+
diff --git a/postgresql-common-1/pg_wrapper b/postgresql-common-1/pg_wrapper
new file mode 100755
index 00000000..fcec548f
--- /dev/null
+++ b/postgresql-common-1/pg_wrapper
@@ -0,0 +1,72 @@
+#!/usr/bin/perl -w
+
+# configuration
+$mapfile = "/etc/postgresql-common/user_clusters";
+$confroot = "/etc/postgresql";
+$binroot = "/usr/lib/postgresql";
+$socketdir = "/var/run/postgresql";
+
+@commands = qw/clusterdb createdb createlang createuser dropdb droplang dropuser pg_dump
+    pg_dumpall pg_restore psql vacuumdb vacuumlo/;
+
+# Return parameter from a PostgreSQL configuration file.
+# Parameters: <version> <cluster> <parameter name>
+sub get_conf_value {
+    return 0 unless $_[0] && $_[1];
+    open F, "$confroot/$_[0]/$_[1]/postgresql.conf" or die "Could not open configuration file: $!";
+    while (<F>) {
+        return $1 if /^\s*$_[2]\s*=\s*(\w+)\b/;
+    }
+    return 0;
+}
+
+# Return the PostgreSQL version, cluster, and database to connect to. Return
+# ("","","") if $mapfile does not exist or has no entry for the current user
+sub get_version_cluster_db {
+    my ($user, $pwd, $uid, $gid) = getpwuid $>;
+    my $group = (getgrgid  $gid)[0];
+
+    if (! open MAP, $mapfile) {
+        print "Warning: could not open $mapfile, connecting to default port\n";
+        return ('','',$user);
+    }
+    while (<MAP>) {
+        s/(.*?)#.*/$1/;
+        next if /^\s*$/;
+        ($u,$g,$v,$c,$db) = split;
+        if (!$db) {
+            print  "Warning: ignoring invalid line $. in $mapfile\n";
+            next;
+        }
+        if (($u eq "*" || $u eq $user) && ($g eq "*" || $g eq $group)) {
+            return ($v,$c, ($db eq "*") ? '' : $db);
+        }
+    }
+    return ('','','');
+}
+
+#
+# main
+#
+
+$cmd = (split '/', $0)[-1];
+grep { $cmd eq $_ } @commands or die "pg_wrapper: invalid command name $cmd";
+
+# Determine $version, $cluster, $db, $port
+($version, $cluster, $db) = get_version_cluster_db();
+if ($version && $cluster) {
+    $port = (get_conf_value $version, $cluster, 'port');
+} else {
+    $version = "8.0"; # TODO: determine version from default port
+}
+
+#print "pg_wrapper debug: version $version, cluster $cluster, port $port, db $db\n";
+
+$ENV{'PGPORT'} = "$port" if $port;
+$ENV{'PGHOST'} = $socketdir;
+$ENV{'PGDATABASE'} = $db if $db;
+
+@args = ("$binroot/$version/bin/$cmd");
+push @args, @ARGV;
+exec @args;
+
-- 
GitLab