2017-12-25 20:13 GMT+01:00 Wietse Venema <wie...@porcupine.org>:

> Magos?nyi ?rp?d:
> > Hi,
> >
> > Any news with this patch? I don't see it in 3.2.4 yet.
>
> Features are not added to the stable release.
>
>
I have submitted it more than a year ago (2016.12.11).
I guess there should have been a release since then.



> > >
> > > Thanks. I'll queue this with the other part. Postfix does not change
> > > often, so patch against a stable release is probably your best bet.
>
> I can't find this in the work queue. Is this patch complete, or
> does there need to be code that adds support for the postgresql:
> prefix, in addition to the existing support for unix: and inet:?
>
>
I have submitted the code earlier. I am attaching that patch again.


        Wietse
>
> > > > --- pgsql_table.orig    2016-12-11 20:53:49.030543785 +0100
> > > > +++ pgsql_table    2016-12-11 20:56:44.386592266 +0100
> > > > @@ -89,10 +89,12 @@
> > > >  # .IP "\fBhosts\fR"
> > > >  #    The hosts that Postfix will try to connect to and query from.
> > > >  #    Specify \fIunix:\fR for UNIX-domain sockets, \fIinet:\fR for
> TCP
> > > > -#    connections (default).  Example:
> > > > +#    connections (default), of \fIpostgresql:\fR if you use a
> connection
> > > > +#    string.  Example:
> > > >  # .nf
> > > >  #        hosts = host1.some.domain host2.some.domain:port
> > > >  #        hosts = unix:/file/name
> > > > +#        hosts =
> > > > postgresql://usern...@hostame.org/tablename?sslmode=require
> > > >  # .fi
> > > >  #
> > > >  #    The hosts are tried in random order, with all connections over
> > > >
> > > >
> > >
>
Description: connection string support for pgsql
 You can use a postgres connection string at the hosts line
 .
 postfix (3.1.0-3) unstable; urgency=medium
Author: Arpad Magosanyi <m...@magwas.rulez.org>

---
The information above should follow the Patch Tagging Guidelines, please
checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here
are templates for supplementary fields that you might want to add:

Origin: other
Bug-Ubuntu: https://launchpad.net/bugs/1553928
Last-Update: <2016-12-11>

--- postfix-3.1.0.orig/src/global/dict_pgsql.c
+++ postfix-3.1.0/src/global/dict_pgsql.c
@@ -180,6 +180,7 @@
 
 #define TYPEUNIX                       (1<<0)
 #define TYPEINET                       (1<<1)
+#define TYPECONNSTRING         (1<<2)
 
 #define RETRY_CONN_MAX                 100
 #define RETRY_CONN_INTV                        60      /* 1 minute */
@@ -190,7 +191,7 @@ typedef struct {
     char   *hostname;
     char   *name;
     char   *port;
-    unsigned type;                     /* TYPEUNIX | TYPEINET */
+    unsigned type;                     /* TYPEUNIX | TYPEINET | 
TYPECONNSTRING*/
     unsigned stat;                     /* STATUNTRIED | STATFAIL | STATCUR */
     time_t  ts;                                /* used for attempting 
reconnection */
 } HOST;
@@ -467,7 +468,8 @@ static HOST *dict_pgsql_get_active(PLPGS
 
     /* try the active connections first; prefer the ones to UNIX sockets */
     if ((host = dict_pgsql_find_host(PLDB, STATACTIVE, TYPEUNIX)) != NULL ||
-       (host = dict_pgsql_find_host(PLDB, STATACTIVE, TYPEINET)) != NULL) {
+       (host = dict_pgsql_find_host(PLDB, STATACTIVE, TYPEINET)) != NULL ||
+       (host = dict_pgsql_find_host(PLDB, STATACTIVE, TYPECONNSTRING)) != 
NULL) {
        if (msg_verbose)
            msg_info("%s: found active connection to host %s", myname,
                     host->hostname);
@@ -483,7 +485,9 @@ static HOST *dict_pgsql_get_active(PLPGS
           ((host = dict_pgsql_find_host(PLDB, STATUNTRIED | STATFAIL,
                                         TYPEUNIX)) != NULL ||
            (host = dict_pgsql_find_host(PLDB, STATUNTRIED | STATFAIL,
-                                        TYPEINET)) != NULL)) {
+                                        TYPEINET)) != NULL ||
+           (host = dict_pgsql_find_host(PLDB, STATUNTRIED | STATFAIL,
+                                        TYPECONNSTRING)) != NULL)) {
        if (msg_verbose)
            msg_info("%s: attempting to connect to host %s", myname,
                     host->hostname);
@@ -622,11 +626,21 @@ static PGSQL_RES *plpgsql_query(DICT_PGS
  */
 static void plpgsql_connect_single(HOST *host, char *dbname, char *username, 
char *password)
 {
-    if ((host->db = PQsetdbLogin(host->name, host->port, NULL, NULL,
-                                dbname, username, password)) == NULL
-       || PQstatus(host->db) != CONNECTION_OK) {
-       msg_warn("connect to pgsql server %s: %s",
-                host->hostname, PQerrorMessage(host->db));
+    PGconn *conn;
+    if (msg_verbose)
+       msg_info("dict_pgsql: connecting to host %s (%u)", host->hostname,
+                host->type);
+    if (host->type = TYPECONNSTRING) {
+       conn = PQconnectdb(host->name);
+    } else {
+       conn =
+           PQsetdbLogin(host->name, host->port, NULL, NULL, dbname, username,
+                        password);
+    }
+    host->db = conn;
+    if (conn == NULL || PQstatus(host->db) != CONNECTION_OK) {
+       msg_warn("connect to pgsql server %s: %s", host->hostname,
+                PQerrorMessage(host->db));
        plpgsql_down_host(host);
        return;
     }
@@ -815,6 +829,12 @@ static HOST *host_init(const char *hostn
      * Ad-hoc parsing code. Expect "unix:pathname" or "inet:host:port", where
      * both "inet:" and ":port" are optional.
      */
+   if (strncmp(d, "postgresql:", 11) == 0) {
+       host->type = TYPECONNSTRING;
+       host->name = mystrdup(d);
+       host->port = 0;
+   } else {
+
     if (strncmp(d, "unix:", 5) == 0 || strncmp(d, "inet:", 5) == 0)
        d += 5;
     host->name = mystrdup(d);
@@ -825,11 +845,11 @@ static HOST *host_init(const char *hostn
        host->type = TYPEINET;
     else
        host->type = TYPEUNIX;
-
+   }
     if (msg_verbose > 1)
        msg_info("%s: host=%s, port=%s, type=%s", myname, host->name,
                 host->port ? host->port : "",
-                host->type == TYPEUNIX ? "unix" : "inet");
+                host->type == TYPEUNIX ? "unix" : (host->type == TYPEINET ? 
"inet" : "connstring"), host->type);
     return host;
 }
 

Reply via email to