-$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.525 2007/08/22 14:20:28 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.526 2007/08/23 10:16:51 ph10 Exp $
Change log file for Exim from version 4.21
-------------------------------------------
characters?) which causes problems in log lines. The DN values are now
passed through string_printing() before being added to log lines.
+PH/11 Added the "servers=" facility to MySQL and PostgreSQL lookups. (Oracle
+ and InterBase are left for another time.)
+
Exim version 4.67
-----------------
-$Cambridge: exim/doc/doc-txt/NewStuff,v 1.155 2007/08/22 10:10:23 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/NewStuff,v 1.156 2007/08/23 10:16:51 ph10 Exp $
New Features in Exim
--------------------
"drop" verb in another ACL, it is the message from the other ACL that is
used.
+10. For MySQL and PostgreSQL lookups, it is now possible to specify a list of
+ servers with individual queries. This is done by starting the query with
+ "servers=x:y:z;", where each item in the list may take one of two forms:
+
+ (1) If it is just a host name, the appropriate global option (mysql_servers
+ or pgsql_servers) is searched for a host of the same name, and the
+ remaining parameters (database, user, password) are taken from there.
+
+ (2) If it contains any slashes, it is taken as a complete parameter set.
+
+ The list of servers is used in exactly the same was as the global list.
+ Once a connection to a server has happened and a query has been
+ successfully executed, processing of the lookup ceases.
+
+ This feature is intended for use in master/slave situations where updates
+ are occurring, and one wants to update a master rather than a slave. If the
+ masters are in the list for reading, you might have:
+
+ mysql_servers = slave1/db/name/pw:slave2/db/name/pw:master/db/name/pw
+
+ In an updating lookup, you could then write
+
+ ${lookup mysql{servers=master; UPDATE ...}
+
+ If, on the other hand, the master is not to be used for reading lookups:
+
+ pgsql_servers = slave1/db/name/pw:slave2/db/name/pw
+
+ you can still update the master by
+
+ ${lookup pgsql{servers=master/db/name/pw; UPDATE ...}
+
Version 4.67
------------
#!/bin/sh
-# $Cambridge: exim/src/scripts/MakeLinks,v 1.11 2007/06/26 11:16:54 ph10 Exp $
+# $Cambridge: exim/src/scripts/MakeLinks,v 1.12 2007/08/23 10:16:51 ph10 Exp $
# Script to build links for all the exim source files from the system-
# specific build directory. It should be run from within that directory.
ln -s ../../src/lookups/lf_functions.h lf_functions.h
ln -s ../../src/lookups/lf_check_file.c lf_check_file.c
ln -s ../../src/lookups/lf_quote.c lf_quote.c
+ln -s ../../src/lookups/lf_sqlperform.c lf_sqlperform.c
cd ..
-# $Cambridge: exim/src/src/lookups/Makefile,v 1.5 2005/09/12 13:50:03 ph10 Exp $
+# $Cambridge: exim/src/src/lookups/Makefile,v 1.6 2007/08/23 10:16:51 ph10 Exp $
# Make file for building a library containing all the available lookups and
# calling it lookups.a. This is called from the main make file, after cd'ing
OBJ = cdb.o dbmdb.o dnsdb.o dsearch.o ibase.o ldap.o lsearch.o mysql.o nis.o \
nisplus.o oracle.o passwd.o pgsql.o spf.o sqlite.o testdb.o whoson.o \
- lf_check_file.o lf_quote.o
+ lf_check_file.o lf_quote.o lf_sqlperform.o
lookups.a: $(OBJ)
@$(RM_COMMAND) -f lookups.a
lf_check_file.o: $(HDRS) lf_check_file.c lf_functions.h
lf_quote.o: $(HDRS) lf_quote.c lf_functions.h
+lf_sqlperform.o: $(HDRS) lf_sqlperform.c lf_functions.h
cdb.o: $(HDRS) cdb.c cdb.h
dbmdb.o: $(HDRS) dbmdb.c dbmdb.h
-/* $Cambridge: exim/src/src/lookups/lf_functions.h,v 1.4 2007/01/08 10:50:19 ph10 Exp $ */
+/* $Cambridge: exim/src/src/lookups/lf_functions.h,v 1.5 2007/08/23 10:16:51 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
extern int lf_check_file(int, uschar *, int, int, uid_t *, gid_t *, char *,
uschar **);
extern uschar *lf_quote(uschar *, uschar *, int, uschar *, int *, int *);
+extern int lf_sqlperform(uschar *, uschar *, uschar *, uschar *, uschar **,
+ uschar **, BOOL *, int(*)(uschar *, uschar *, uschar **,
+ uschar **, BOOL *, BOOL *));
/* End of lf_functions.h */
--- /dev/null
+/* $Cambridge: exim/src/src/lookups/lf_sqlperform.c,v 1.1 2007/08/23 10:16:51 ph10 Exp $ */
+
+/*************************************************
+* Exim - an Internet mail transport agent *
+*************************************************/
+
+/* Copyright (c) University of Cambridge 1995 - 2007 */
+/* See the file NOTICE for conditions of use and distribution. */
+
+
+#include "../exim.h"
+#include "lf_functions.h"
+
+
+
+/*************************************************
+* Call SQL server(s) to run an actual query *
+*************************************************/
+
+/* All the SQL lookups are of the same form, with a list of servers to try
+until one can be accessed. It is now also possible to provide the server data
+as part of the query. This function manages server selection and looping; each
+lookup has its own function for actually performing the lookup.
+
+Arguments:
+ name the lookup name, e.g. "MySQL"
+ optionname the name of the servers option, e.g. "mysql_servers"
+ optserverlist the value of the servers option
+ query the query
+ result where to pass back the result
+ errmsg where to pass back an error message
+ do_cache to be set FALSE if data is changed
+ func the lookup function to call
+
+Returns: the return from the lookup function, or DEFER
+*/
+
+int
+lf_sqlperform(uschar *name, uschar *optionname, uschar *optserverlist,
+ uschar *query, uschar **result, uschar **errmsg, BOOL *do_cache,
+ int(*fn)(uschar *, uschar *, uschar **, uschar **, BOOL *, BOOL *))
+{
+int sep, rc;
+uschar *server;
+uschar *serverlist;
+uschar buffer[512];
+BOOL defer_break = FALSE;
+
+DEBUG(D_lookup) debug_printf("%s query: %s\n", name, query);
+
+/* Handle queries that do not have server information at the start. */
+
+if (Ustrncmp(query, "servers", 7) != 0)
+ {
+ sep = 0;
+ serverlist = optserverlist;
+ while ((server = string_nextinlist(&serverlist, &sep, buffer,
+ sizeof(buffer))) != NULL)
+ {
+ rc = (*fn)(query, server, result, errmsg, &defer_break, do_cache);
+ if (rc != DEFER || defer_break) return rc;
+ }
+ if (optserverlist == NULL)
+ *errmsg = string_sprintf("no %s servers defined (%s option)", name,
+ optionname);
+ }
+
+/* Handle queries that do have server information at the start. */
+
+else
+ {
+ int qsep;
+ uschar *s, *ss;
+ uschar *qserverlist;
+ uschar *qserver;
+ uschar qbuffer[512];
+
+ s = query + 7;
+ while (isspace(*s)) s++;
+ if (*s++ != '=')
+ {
+ *errmsg = string_sprintf("missing = after \"servers\" in %s lookup", name);
+ return DEFER;
+ }
+ while (isspace(*s)) s++;
+
+ ss = Ustrchr(s, ';');
+ if (ss == NULL)
+ {
+ *errmsg = string_sprintf("missing ; after \"servers=\" in %s lookup",
+ name);
+ return DEFER;
+ }
+
+ if (ss == s)
+ {
+ *errmsg = string_sprintf("\"servers=\" defines no servers in \"%s\"",
+ query);
+ return DEFER;
+ }
+
+ qserverlist = string_sprintf("%.*s", ss - s, s);
+ qsep = 0;
+
+ while ((qserver = string_nextinlist(&qserverlist, &qsep, qbuffer,
+ sizeof(qbuffer))) != NULL)
+ {
+ if (Ustrchr(qserver, '/') != NULL)
+ server = qserver;
+ else
+ {
+ int len = Ustrlen(qserver);
+
+ sep = 0;
+ serverlist = optserverlist;
+ while ((server = string_nextinlist(&serverlist, &sep, buffer,
+ sizeof(buffer))) != NULL)
+ {
+ if (Ustrncmp(server, qserver, len) == 0 && server[len] == '/')
+ break;
+ }
+
+ if (server == NULL)
+ {
+ *errmsg = string_sprintf("%s server \"%s\" not found in %s", name,
+ qserver, optionname);
+ return DEFER;
+ }
+ }
+
+ rc = (*fn)(ss+1, server, result, errmsg, &defer_break, do_cache);
+ if (rc != DEFER || defer_break) return rc;
+ }
+ }
+
+return DEFER;
+}
+
+/* End of lf_sqlperform.c */
-/* $Cambridge: exim/src/src/lookups/mysql.c,v 1.4 2007/01/08 10:50:19 ph10 Exp $ */
+/* $Cambridge: exim/src/src/lookups/mysql.c,v 1.5 2007/08/23 10:16:51 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
*************************************************/
/* See local README for interface description. The handle and filename
-arguments are not used. Loop through a list of servers while the query is
-deferred with a retryable error. */
+arguments are not used. The code to loop through a list of servers while the
+query is deferred with a retryable error is now in a separate function that is
+shared with other SQL lookups. */
int
mysql_find(void *handle, uschar *filename, uschar *query, int length,
uschar **result, uschar **errmsg, BOOL *do_cache)
{
-int sep = 0;
-uschar *server;
-uschar *list = mysql_servers;
-uschar buffer[512];
-
-DEBUG(D_lookup) debug_printf("MYSQL query: %s\n", query);
-
-while ((server = string_nextinlist(&list, &sep, buffer, sizeof(buffer))) != NULL)
- {
- BOOL defer_break = FALSE;
- int rc = perform_mysql_search(query, server, result, errmsg, &defer_break,
- do_cache);
- if (rc != DEFER || defer_break) return rc;
- }
-
-if (mysql_servers == NULL)
- *errmsg = US"no MYSQL servers defined (mysql_servers option)";
-
-return DEFER;
+return lf_sqlperform(US"MySQL", US"mysql_servers", mysql_servers, query,
+ result, errmsg, do_cache, perform_mysql_search);
}
-/* $Cambridge: exim/src/src/lookups/pgsql.c,v 1.9 2007/01/08 10:50:19 ph10 Exp $ */
+/* $Cambridge: exim/src/src/lookups/pgsql.c,v 1.10 2007/08/23 10:16:51 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
*************************************************/
/* See local README for interface description. The handle and filename
-arguments are not used. Loop through a list of servers while the query is
-deferred with a retryable error. */
+arguments are not used. The code to loop through a list of servers while the
+query is deferred with a retryable error is now in a separate function that is
+shared with other SQL lookups. */
int
pgsql_find(void *handle, uschar *filename, uschar *query, int length,
uschar **result, uschar **errmsg, BOOL *do_cache)
{
-int sep = 0;
-uschar *server;
-uschar *list = pgsql_servers;
-uschar buffer[512];
-
-DEBUG(D_lookup) debug_printf("PGSQL query: %s\n", query);
-
-while ((server = string_nextinlist(&list, &sep, buffer, sizeof(buffer)))
- != NULL)
- {
- BOOL defer_break = FALSE;
- int rc = perform_pgsql_search(query, server, result, errmsg, &defer_break,
- do_cache);
- if (rc != DEFER || defer_break) return rc;
- }
-
-if (pgsql_servers == NULL)
- *errmsg = US"no PGSQL servers defined (pgsql_servers option)";
-
-return DEFER;
+return lf_sqlperform(US"PostgreSQL", US"pgsql_servers", pgsql_servers, query,
+ result, errmsg, do_cache, perform_pgsql_search);
}
${lookup mysql {select * from them where id='filter';}}
${lookup mysql {select * from them where id='quote2';}}
${lookup mysql {select * from them where id='nlonly';}}
+${lookup mysql {servers=x:localhost; select name from them where id='ph10';}}
+${lookup mysql {servers=localhost:x; select name from them where id='ph10';}}
+${lookup mysql {servers=localhost/test/root/:x; select name from them where id='ph10';}}
+${lookup mysql {servers=HOST_IPV4/test/root/:localhost; select name from them where id='ph10';}}
****
exim -d -bh 10.0.0.0
mail from:<a@b>
${lookup pgsql {select * from them where id='newline';}}
${lookup pgsql {select * from them where id='tab';}}
${lookup pgsql {select * from them where name='${quote_pgsql:'stquot}';}}
+${lookup pgsql {servers=x:localhost; select name from them where id='ph10';}}
+${lookup pgsql {servers=localhost:x; select name from them where id='ph10';}}
+${lookup pgsql {servers=localhost/test/CALLER/:x; select name from them where id='ph10';}}
+${lookup pgsql {servers=(/tmp/.s.PGSQL.5432)/test/ph10/:x; select name from them where id='ph10';}}
****
exim -d -bh 10.0.0.0
mail from:<a@b>
internal_search_find: file="NULL"
type=mysql key="select name from them where id='CALLER';"
database lookup required for select name from them where id='CALLER';
-MYSQL query: select name from them where id='CALLER';
+MySQL query: select name from them where id='CALLER';
MYSQL new connection: host=localhost port=0 socket=NULL database=test user=root
lookup yielded: Philip Hazel
search_open: mysql "NULL"
internal_search_find: file="NULL"
type=mysql key="select name from them where id='xxxx';"
database lookup required for select name from them where id='xxxx';
-MYSQL query: select name from them where id='xxxx';
+MySQL query: select name from them where id='xxxx';
MYSQL using cached connection for localhost/test/root
MYSQL: no data found
lookup failed
internal_search_find: file="NULL"
type=mysql key="select name from them where id='nothing';"
database lookup required for select name from them where id='nothing';
-MYSQL query: select name from them where id='nothing';
+MySQL query: select name from them where id='nothing';
MYSQL using cached connection for localhost/test/root
MYSQL: no data found
lookup failed
internal_search_find: file="NULL"
type=mysql key="select id,name from them where id='nothing';"
database lookup required for select id,name from them where id='nothing';
-MYSQL query: select id,name from them where id='nothing';
+MySQL query: select id,name from them where id='nothing';
MYSQL using cached connection for localhost/test/root
lookup yielded: id=nothing name=""
search_open: mysql "NULL"
internal_search_find: file="NULL"
type=mysql key="delete from them where id='nonexist';"
database lookup required for delete from them where id='nonexist';
-MYSQL query: delete from them where id='nonexist';
+MySQL query: delete from them where id='nonexist';
MYSQL using cached connection for localhost/test/root
MYSQL: query was not one that returns data
lookup forced cache cleanup
internal_search_find: file="NULL"
type=mysql key="select * from them where id='quote';"
database lookup required for select * from them where id='quote';
-MYSQL query: select * from them where id='quote';
+MySQL query: select * from them where id='quote';
MYSQL using cached connection for localhost/test/root
lookup yielded: id=quote name="\"Q\" Oted" home=/home/quoted mail=quoted@xxx
search_open: mysql "NULL"
internal_search_find: file="NULL"
type=mysql key="select * from them where id='filter';"
database lookup required for select * from them where id='filter';
-MYSQL query: select * from them where id='filter';
+MySQL query: select * from them where id='filter';
MYSQL using cached connection for localhost/test/root
lookup yielded: id=filter name=filter home=filter mail="#Exim filter
deliver postmaster"
internal_search_find: file="NULL"
type=mysql key="select * from them where id='quote2';"
database lookup required for select * from them where id='quote2';
-MYSQL query: select * from them where id='quote2';
+MySQL query: select * from them where id='quote2';
MYSQL using cached connection for localhost/test/root
lookup yielded: id=quote2 name="\"qnosp" home=/home/q2 mail=""
search_open: mysql "NULL"
internal_search_find: file="NULL"
type=mysql key="select * from them where id='nlonly';"
database lookup required for select * from them where id='nlonly';
-MYSQL query: select * from them where id='nlonly';
+MySQL query: select * from them where id='nlonly';
MYSQL using cached connection for localhost/test/root
lookup yielded: id=nlonly name=filter home=filter mail="Before
After"
+search_open: mysql "NULL"
+ cached open
+search_find: file="NULL"
+ key="servers=x:localhost; select name from them where id='CALLER';" partial=-1 affix=NULL starflags=0
+LRU list:
+internal_search_find: file="NULL"
+ type=mysql key="servers=x:localhost; select name from them where id='CALLER';"
+database lookup required for servers=x:localhost; select name from them where id='CALLER';
+MySQL query: servers=x:localhost; select name from them where id='CALLER';
+lookup deferred: MySQL server "x" not found in mysql_servers
+search_open: mysql "NULL"
+ cached open
+search_find: file="NULL"
+ key="servers=localhost:x; select name from them where id='CALLER';" partial=-1 affix=NULL starflags=0
+LRU list:
+internal_search_find: file="NULL"
+ type=mysql key="servers=localhost:x; select name from them where id='CALLER';"
+database lookup required for servers=localhost:x; select name from them where id='CALLER';
+MySQL query: servers=localhost:x; select name from them where id='CALLER';
+MYSQL using cached connection for localhost/test/root
+lookup yielded: Philip Hazel
+search_open: mysql "NULL"
+ cached open
+search_find: file="NULL"
+ key="servers=localhost/test/root/:x; select name from them where id='CALLER';" partial=-1 affix=NULL starflags=0
+LRU list:
+internal_search_find: file="NULL"
+ type=mysql key="servers=localhost/test/root/:x; select name from them where id='CALLER';"
+database lookup required for servers=localhost/test/root/:x; select name from them where id='CALLER';
+MySQL query: servers=localhost/test/root/:x; select name from them where id='CALLER';
+MYSQL using cached connection for localhost/test/root
+lookup yielded: Philip Hazel
+search_open: mysql "NULL"
+ cached open
+search_find: file="NULL"
+ key="servers=HOST_IPV4/test/root/:localhost; select name from them where id='CALLER';" partial=-1 affix=NULL starflags=0
+LRU list:
+internal_search_find: file="NULL"
+ type=mysql key="servers=HOST_IPV4/test/root/:localhost; select name from them where id='CALLER';"
+database lookup required for servers=HOST_IPV4/test/root/:localhost; select name from them where id='CALLER';
+MySQL query: servers=HOST_IPV4/test/root/:localhost; select name from them where id='CALLER';
+MYSQL new connection: host=HOST_IPV4 port=0 socket=NULL database=test user=root
+MYSQL connection failed: Unknown MySQL server host 'HOST_IPV4' (1)
+MYSQL using cached connection for localhost/test/root
+lookup yielded: Philip Hazel
search_tidyup called
close MYSQL connection: localhost/test/root
>>>>>>>>>>>>>>>> Exim pid=pppp terminating with rc=0 >>>>>>>>>>>>>>>>
internal_search_find: file="NULL"
type=mysql key="select * from them where id='10.0.0.0'"
database lookup required for select * from them where id='10.0.0.0'
-MYSQL query: select * from them where id='10.0.0.0'
+MySQL query: select * from them where id='10.0.0.0'
MYSQL new connection: host=localhost port=0 socket=NULL database=test user=root
MYSQL: no data found
lookup failed
internal_search_find: file="NULL"
type=mysql key="select name from them where id='CALLER'"
database lookup required for select name from them where id='CALLER'
-MYSQL query: select name from them where id='CALLER'
+MySQL query: select name from them where id='CALLER'
MYSQL new connection: host=localhost port=0 socket=NULL database=test user=root
lookup yielded: Philip Hazel
calling r1 router
internal_search_find: file="NULL"
type=mysql key="select id from them where id='CALLER'"
database lookup required for select id from them where id='CALLER'
-MYSQL query: select id from them where id='CALLER'
+MySQL query: select id from them where id='CALLER'
MYSQL new connection: host=localhost port=0 socket=NULL database=test user=root
lookup yielded: CALLER
appendfile: mode=600 notify_comsat=0 quota=0 warning=0
internal_search_find: file="NULL"
type=pgsql key="select name from them where id='CALLER';"
database lookup required for select name from them where id='CALLER';
-PGSQL query: select name from them where id='CALLER';
+PostgreSQL query: select name from them where id='CALLER';
PGSQL new connection: host=localhost port= database=test user=CALLER
lookup yielded: Philip Hazel
search_open: pgsql "NULL"
internal_search_find: file="NULL"
type=pgsql key="select name from them where id='xxxx';"
database lookup required for select name from them where id='xxxx';
-PGSQL query: select name from them where id='xxxx';
+PostgreSQL query: select name from them where id='xxxx';
PGSQL using cached connection for localhost/test/CALLER
PGSQL: no data found
lookup failed
internal_search_find: file="NULL"
type=pgsql key="select name from them where id='nothing';"
database lookup required for select name from them where id='nothing';
-PGSQL query: select name from them where id='nothing';
+PostgreSQL query: select name from them where id='nothing';
PGSQL using cached connection for localhost/test/CALLER
lookup yielded:
search_open: pgsql "NULL"
internal_search_find: file="NULL"
type=pgsql key="select id,name from them where id='nothing';"
database lookup required for select id,name from them where id='nothing';
-PGSQL query: select id,name from them where id='nothing';
+PostgreSQL query: select id,name from them where id='nothing';
PGSQL using cached connection for localhost/test/CALLER
lookup yielded: id=nothing name=""
search_open: pgsql "NULL"
internal_search_find: file="NULL"
type=pgsql key="delete from them where id='nonexist';"
database lookup required for delete from them where id='nonexist';
-PGSQL query: delete from them where id='nonexist';
+PostgreSQL query: delete from them where id='nonexist';
PGSQL using cached connection for localhost/test/CALLER
PGSQL: command does not return any data but was successful. Rows affected: 0
lookup forced cache cleanup
internal_search_find: file="NULL"
type=pgsql key="select * from them where id='quote2';"
database lookup required for select * from them where id='quote2';
-PGSQL query: select * from them where id='quote2';
+PostgreSQL query: select * from them where id='quote2';
PGSQL using cached connection for localhost/test/CALLER
lookup yielded: name="\"stquot" id=quote2
search_open: pgsql "NULL"
internal_search_find: file="NULL"
type=pgsql key="select * from them where id='newline';"
database lookup required for select * from them where id='newline';
-PGSQL query: select * from them where id='newline';
+PostgreSQL query: select * from them where id='newline';
PGSQL using cached connection for localhost/test/CALLER
lookup yielded: name="before
after" id=newline
internal_search_find: file="NULL"
type=pgsql key="select * from them where id='tab';"
database lookup required for select * from them where id='tab';
-PGSQL query: select * from them where id='tab';
+PostgreSQL query: select * from them where id='tab';
PGSQL using cached connection for localhost/test/CALLER
lookup yielded: name="x x" id=tab
search_open: pgsql "NULL"
internal_search_find: file="NULL"
type=pgsql key="select * from them where name='''stquot';"
database lookup required for select * from them where name='''stquot';
-PGSQL query: select * from them where name='''stquot';
+PostgreSQL query: select * from them where name='''stquot';
PGSQL using cached connection for localhost/test/CALLER
lookup yielded: name='stquot id=quote1
+search_open: pgsql "NULL"
+ cached open
+search_find: file="NULL"
+ key="servers=x:localhost; select name from them where id='CALLER';" partial=-1 affix=NULL starflags=0
+LRU list:
+internal_search_find: file="NULL"
+ type=pgsql key="servers=x:localhost; select name from them where id='CALLER';"
+database lookup required for servers=x:localhost; select name from them where id='CALLER';
+PostgreSQL query: servers=x:localhost; select name from them where id='CALLER';
+lookup deferred: PostgreSQL server "x" not found in pgsql_servers
+search_open: pgsql "NULL"
+ cached open
+search_find: file="NULL"
+ key="servers=localhost:x; select name from them where id='CALLER';" partial=-1 affix=NULL starflags=0
+LRU list:
+internal_search_find: file="NULL"
+ type=pgsql key="servers=localhost:x; select name from them where id='CALLER';"
+database lookup required for servers=localhost:x; select name from them where id='CALLER';
+PostgreSQL query: servers=localhost:x; select name from them where id='CALLER';
+PGSQL using cached connection for localhost/test/CALLER
+lookup yielded: Philip Hazel
+search_open: pgsql "NULL"
+ cached open
+search_find: file="NULL"
+ key="servers=localhost/test/CALLER/:x; select name from them where id='CALLER';" partial=-1 affix=NULL starflags=0
+LRU list:
+internal_search_find: file="NULL"
+ type=pgsql key="servers=localhost/test/CALLER/:x; select name from them where id='CALLER';"
+database lookup required for servers=localhost/test/CALLER/:x; select name from them where id='CALLER';
+PostgreSQL query: servers=localhost/test/CALLER/:x; select name from them where id='CALLER';
+PGSQL using cached connection for localhost/test/CALLER
+lookup yielded: Philip Hazel
+search_open: pgsql "NULL"
+ cached open
+search_find: file="NULL"
+ key="servers=(/tmp/.s.PGSQL.5432)/test/CALLER/:x; select name from them where id='CALLER';" partial=-1 affix=NULL starflags=0
+LRU list:
+internal_search_find: file="NULL"
+ type=pgsql key="servers=(/tmp/.s.PGSQL.5432)/test/CALLER/:x; select name from them where id='CALLER';"
+database lookup required for servers=(/tmp/.s.PGSQL.5432)/test/CALLER/:x; select name from them where id='CALLER';
+PostgreSQL query: servers=(/tmp/.s.PGSQL.5432)/test/CALLER/:x; select name from them where id='CALLER';
+PGSQL new connection: socket=/tmp/.s.PGSQL.5432 database=test user=CALLER
+lookup yielded: Philip Hazel
search_tidyup called
+close PGSQL connection: (/tmp/.s.PGSQL.5432)/test/CALLER
close PGSQL connection: localhost/test/CALLER
>>>>>>>>>>>>>>>> Exim pid=pppp terminating with rc=0 >>>>>>>>>>>>>>>>
Exim version x.yz ....
internal_search_find: file="NULL"
type=pgsql key="select * from them where id='10.0.0.0'"
database lookup required for select * from them where id='10.0.0.0'
-PGSQL query: select * from them where id='10.0.0.0'
+PostgreSQL query: select * from them where id='10.0.0.0'
PGSQL new connection: host=localhost port= database=test user=CALLER
PGSQL: no data found
lookup failed
internal_search_find: file="NULL"
type=pgsql key="select name from them where id='CALLER'"
database lookup required for select name from them where id='CALLER'
-PGSQL query: select name from them where id='CALLER'
+PostgreSQL query: select name from them where id='CALLER'
PGSQL new connection: host=localhost port= database=test user=CALLER
lookup yielded: Philip Hazel
calling r1 router
internal_search_find: file="NULL"
type=pgsql key="select id from them where id='CALLER'"
database lookup required for select id from them where id='CALLER'
-PGSQL query: select id from them where id='CALLER'
+PostgreSQL query: select id from them where id='CALLER'
PGSQL new connection: host=localhost port= database=test user=CALLER
lookup yielded: CALLER
appendfile: mode=600 notify_comsat=0 quota=0 warning=0
internal_search_find: file="NULL"
type=pgsql key="select name from them where id='CALLER';"
database lookup required for select name from them where id='CALLER';
-PGSQL query: select name from them where id='CALLER';
+PostgreSQL query: select name from them where id='CALLER';
PGSQL new connection: socket=/tmp/.s.PGSQL.5432 database=test user=CALLER
lookup yielded: Philip Hazel
search_tidyup called
> id=quote2 name="\"qnosp" home=/home/q2 mail=""
> id=nlonly name=filter home=filter mail="Before
After"
+> Failed: lookup of "servers=x:localhost; select name from them where id='CALLER';" gave DEFER: MySQL server "x" not found in mysql_servers
+> Philip Hazel
+> Philip Hazel
+> Philip Hazel
>
**** SMTP testing session as if from host 10.0.0.0
after" id=newline
> name="x x" id=tab
> name='stquot id=quote1
+> Failed: lookup of "servers=x:localhost; select name from them where id='CALLER';" gave DEFER: PostgreSQL server "x" not found in pgsql_servers
+> Philip Hazel
+> Philip Hazel
+> Philip Hazel
>
**** SMTP testing session as if from host 10.0.0.0