[exim-cvs] cvs commit: exim/exim-doc/doc-txt ChangeLog NewSt…

Góra strony
Delete this message
Reply to this message
Autor: Philip Hazel
Data:  
Dla: exim-cvs
Temat: [exim-cvs] cvs commit: exim/exim-doc/doc-txt ChangeLog NewStuff exim/exim-src/scripts MakeLinks exim/exim-src/src/lookups Makefile lf_functions.h lf_sqlperform.c mysql.c pgsql.c exim/exim-test/scri
ph10 2007/08/23 11:16:51 BST

  Modified files:
    exim-doc/doc-txt     ChangeLog NewStuff 
    exim-src/scripts     MakeLinks 
    exim-src/src/lookups Makefile lf_functions.h mysql.c pgsql.c 
    exim-test/scripts/9100-MySQL 9100 
    exim-test/scripts/9200-PostgreSQL 9200 
    exim-test/stderr     9100 9200 
    exim-test/stdout     9100 9200 
  Added files:
    exim-src/src/lookups lf_sqlperform.c 
  Log:
  Add "server=" feature to MySQL and PostgreSQL lookups.


  Revision  Changes    Path
  1.526     +3 -0      exim/exim-doc/doc-txt/ChangeLog
  1.156     +32 -0     exim/exim-doc/doc-txt/NewStuff
  1.12      +1 -0      exim/exim-src/scripts/MakeLinks
  1.6       +2 -1      exim/exim-src/src/lookups/Makefile
  1.5       +3 -0      exim/exim-src/src/lookups/lf_functions.h
  1.1       +139 -0    exim/exim-src/src/lookups/lf_sqlperform.c (new)
  1.5       +5 -21     exim/exim-src/src/lookups/mysql.c
  1.10      +5 -22     exim/exim-src/src/lookups/pgsql.c
  1.2       +4 -0      exim/exim-test/scripts/9100-MySQL/9100
  1.3       +4 -0      exim/exim-test/scripts/9200-PostgreSQL/9200
  1.4       +57 -12    exim/exim-test/stderr/9100
  1.6       +57 -13    exim/exim-test/stderr/9200
  1.2       +4 -0      exim/exim-test/stdout/9100
  1.3       +4 -0      exim/exim-test/stdout/9200


  Index: ChangeLog
  ===================================================================
  RCS file: /home/cvs/exim/exim-doc/doc-txt/ChangeLog,v
  retrieving revision 1.525
  retrieving revision 1.526
  diff -u -r1.525 -r1.526
  --- ChangeLog    22 Aug 2007 14:20:28 -0000    1.525
  +++ ChangeLog    23 Aug 2007 10:16:51 -0000    1.526
  @@ -1,4 +1,4 @@
  -$Cambridge: exim/exim-doc/doc-txt/ChangeLog,v 1.525 2007/08/22 14:20:28 ph10 Exp $
  +$Cambridge: exim/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
   -------------------------------------------
  @@ -92,6 +92,9 @@
         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
-----------------

  Index: NewStuff
  ===================================================================
  RCS file: /home/cvs/exim/exim-doc/doc-txt/NewStuff,v
  retrieving revision 1.155
  retrieving revision 1.156
  diff -u -r1.155 -r1.156
  --- NewStuff    22 Aug 2007 10:10:23 -0000    1.155
  +++ NewStuff    23 Aug 2007 10:16:51 -0000    1.156
  @@ -1,4 +1,4 @@
  -$Cambridge: exim/exim-doc/doc-txt/NewStuff,v 1.155 2007/08/22 10:10:23 ph10 Exp $
  +$Cambridge: exim/exim-doc/doc-txt/NewStuff,v 1.156 2007/08/23 10:16:51 ph10 Exp $


   New Features in Exim
   --------------------
  @@ -119,6 +119,38 @@
       "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
------------

  Index: MakeLinks
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/scripts/MakeLinks,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- MakeLinks    26 Jun 2007 11:16:54 -0000    1.11
  +++ MakeLinks    23 Aug 2007 10:16:51 -0000    1.12
  @@ -1,5 +1,5 @@
   #!/bin/sh
  -# $Cambridge: exim/exim-src/scripts/MakeLinks,v 1.11 2007/06/26 11:16:54 ph10 Exp $
  +# $Cambridge: exim/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.
  @@ -95,6 +95,7 @@
   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 ..


Index: lf_sqlperform.c
====================================================================
/* $Cambridge: exim/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 */

  Index: Makefile
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/src/lookups/Makefile,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- Makefile    12 Sep 2005 13:50:03 -0000    1.5
  +++ Makefile    23 Aug 2007 10:16:51 -0000    1.6
  @@ -1,4 +1,4 @@
  -# $Cambridge: exim/exim-src/src/lookups/Makefile,v 1.5 2005/09/12 13:50:03 ph10 Exp $
  +# $Cambridge: exim/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
@@ -7,7 +7,7 @@

   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
  @@ -22,6 +22,7 @@


   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


  Index: lf_functions.h
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/src/lookups/lf_functions.h,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- lf_functions.h    8 Jan 2007 10:50:19 -0000    1.4
  +++ lf_functions.h    23 Aug 2007 10:16:51 -0000    1.5
  @@ -1,4 +1,4 @@
  -/* $Cambridge: exim/exim-src/src/lookups/lf_functions.h,v 1.4 2007/01/08 10:50:19 ph10 Exp $ */
  +/* $Cambridge: exim/exim-src/src/lookups/lf_functions.h,v 1.5 2007/08/23 10:16:51 ph10 Exp $ */


   /*************************************************
   *     Exim - an Internet mail transport agent    *
  @@ -12,5 +12,8 @@
   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 */

  Index: mysql.c
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/src/lookups/mysql.c,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- mysql.c    8 Jan 2007 10:50:19 -0000    1.4
  +++ mysql.c    23 Aug 2007 10:16:51 -0000    1.5
  @@ -1,4 +1,4 @@
  -/* $Cambridge: exim/exim-src/src/lookups/mysql.c,v 1.4 2007/01/08 10:50:19 ph10 Exp $ */
  +/* $Cambridge: exim/exim-src/src/lookups/mysql.c,v 1.5 2007/08/23 10:16:51 ph10 Exp $ */


   /*************************************************
   *     Exim - an Internet mail transport agent    *
  @@ -338,32 +338,16 @@
   *************************************************/


/* 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);
   }




  Index: pgsql.c
  ===================================================================
  RCS file: /home/cvs/exim/exim-src/src/lookups/pgsql.c,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- pgsql.c    8 Jan 2007 10:50:19 -0000    1.9
  +++ pgsql.c    23 Aug 2007 10:16:51 -0000    1.10
  @@ -1,4 +1,4 @@
  -/* $Cambridge: exim/exim-src/src/lookups/pgsql.c,v 1.9 2007/01/08 10:50:19 ph10 Exp $ */
  +/* $Cambridge: exim/exim-src/src/lookups/pgsql.c,v 1.10 2007/08/23 10:16:51 ph10 Exp $ */


   /*************************************************
   *     Exim - an Internet mail transport agent    *
  @@ -410,33 +410,16 @@
   *************************************************/


/* 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);
   }




  Index: 9100
  ===================================================================
  RCS file: /home/cvs/exim/exim-test/scripts/9100-MySQL/9100,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- 9100    7 Feb 2006 10:54:50 -0000    1.1
  +++ 9100    23 Aug 2007 10:16:51 -0000    1.2
  @@ -10,6 +10,10 @@
   ${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>


  Index: 9200
  ===================================================================
  RCS file: /home/cvs/exim/exim-test/scripts/9200-PostgreSQL/9200,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- 9200    30 Jun 2006 13:57:46 -0000    1.2
  +++ 9200    23 Aug 2007 10:16:51 -0000    1.3
  @@ -10,6 +10,10 @@
   ${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>


  Index: 9100
  ===================================================================
  RCS file: /home/cvs/exim/exim-test/stderr/9100,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- 9100    26 Jul 2006 14:39:14 -0000    1.3
  +++ 9100    23 Aug 2007 10:16:51 -0000    1.4
  @@ -8,7 +8,7 @@
   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"
  @@ -28,7 +28,7 @@
   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
  @@ -40,7 +40,7 @@
   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
  @@ -52,7 +52,7 @@
   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"
  @@ -63,7 +63,7 @@
   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
  @@ -76,7 +76,7 @@
   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"
  @@ -87,7 +87,7 @@
   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" 
  @@ -99,7 +99,7 @@
   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"
  @@ -110,10 +110,55 @@
   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 >>>>>>>>>>>>>>>>
  @@ -161,7 +206,7 @@
   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
  @@ -266,7 +311,7 @@
   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
  @@ -309,7 +354,7 @@
   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


  Index: 9200
  ===================================================================
  RCS file: /home/cvs/exim/exim-test/stderr/9200,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- 9200    26 Jul 2006 14:39:14 -0000    1.5
  +++ 9200    23 Aug 2007 10:16:51 -0000    1.6
  @@ -8,7 +8,7 @@
   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"
  @@ -28,7 +28,7 @@
   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
  @@ -40,7 +40,7 @@
   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"
  @@ -51,7 +51,7 @@
   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"
  @@ -62,7 +62,7 @@
   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
  @@ -75,7 +75,7 @@
   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"
  @@ -86,7 +86,7 @@
   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 
  @@ -98,7 +98,7 @@
   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"
  @@ -109,10 +109,54 @@
   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 ....
  @@ -159,7 +203,7 @@
   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
  @@ -290,7 +334,7 @@
   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
  @@ -333,7 +377,7 @@
   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
  @@ -387,7 +431,7 @@
   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


  Index: 9100
  ===================================================================
  RCS file: /home/cvs/exim/exim-test/stdout/9100,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- 9100    7 Feb 2006 10:47:37 -0000    1.1
  +++ 9100    23 Aug 2007 10:16:51 -0000    1.2
  @@ -10,6 +10,10 @@
   > 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

  Index: 9200
  ===================================================================
  RCS file: /home/cvs/exim/exim-test/stdout/9200,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- 9200    30 Jun 2006 13:57:46 -0000    1.2
  +++ 9200    23 Aug 2007 10:16:51 -0000    1.3
  @@ -9,6 +9,10 @@
   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