X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fsrc%2Flookups%2Fpgsql.c;h=a7ea3d57a0957bd3c4415d9018d22abe72d2b0b8;hb=8f0d0a3138e138ffa6bcc94c8378f5eb22573f0e;hp=cc12e40d7a0d4d1dd8cdd99bec2469fcfbf6d93f;hpb=d7978c0f8af20ff4c3f770589b1bb81568aecff3;p=user%2Fhenk%2Fcode%2Fexim.git diff --git a/src/src/lookups/pgsql.c b/src/src/lookups/pgsql.c index cc12e40d7..a7ea3d57a 100644 --- a/src/src/lookups/pgsql.c +++ b/src/src/lookups/pgsql.c @@ -3,6 +3,7 @@ *************************************************/ /* Copyright (c) University of Cambridge 1995 - 2018 */ +/* Copyright (c) The Exim Maintainers 2020 */ /* See the file NOTICE for conditions of use and distribution. */ /* Thanks to Petr Cech for contributing the original code for these @@ -33,7 +34,7 @@ static pgsql_connection *pgsql_connections = NULL; /* See local README for interface description. */ static void * -pgsql_open(uschar *filename, uschar **errmsg) +pgsql_open(const uschar * filename, uschar ** errmsg) { return (void *)(1); /* Just return something non-null */ } @@ -53,7 +54,7 @@ pgsql_connection *cn; while ((cn = pgsql_connections) != NULL) { pgsql_connections = cn->next; - DEBUG(D_lookup) debug_printf("close PGSQL connection: %s\n", cn->server); + DEBUG(D_lookup) debug_printf_indent("close PGSQL connection: %s\n", cn->server); PQfinish(cn->handle); } } @@ -77,7 +78,7 @@ static void notice_processor(void *arg, const char *message) { arg = arg; /* Keep compiler happy */ -DEBUG(D_lookup) debug_printf("PGSQL: %s\n", message); +DEBUG(D_lookup) debug_printf_indent("PGSQL: %s\n", message); } @@ -113,13 +114,14 @@ Arguments: errmsg where to point an error message defer_break set TRUE if no more servers are to be tried after DEFER do_cache set FALSE if data is changed + opts options list Returns: OK, FAIL, or DEFER */ static int perform_pgsql_search(const uschar *query, uschar *server, uschar **resultptr, - uschar **errmsg, BOOL *defer_break, uint *do_cache) + uschar **errmsg, BOOL *defer_break, uint *do_cache, const uschar * opts) { PGconn *pg_conn = NULL; PGresult *pg_result = NULL; @@ -128,6 +130,7 @@ gstring * result = NULL; int yield = DEFER; unsigned int num_fields, num_tuples; pgsql_connection *cn; +rmark reset_point = store_mark(); uschar *server_copy = NULL; uschar *sdata[3]; @@ -181,7 +184,7 @@ if (!cn) last_slash = Ustrrchr(server, '/'); last_dot = Ustrrchr(server, '.'); - DEBUG(D_lookup) debug_printf("PGSQL new connection: socket=%s " + DEBUG(D_lookup) debug_printf_indent("PGSQL new connection: socket=%s " "database=%s user=%s\n", server, sdata[0], sdata[1]); /* A valid socket name looks like this: /var/run/postgresql/.s.PGSQL.5432 @@ -221,7 +224,7 @@ if (!cn) return DEFER; } - DEBUG(D_lookup) debug_printf("PGSQL new connection: host=%s port=%s " + DEBUG(D_lookup) debug_printf_indent("PGSQL new connection: host=%s port=%s " "database=%s user=%s\n", server, port, sdata[0], sdata[1]); } @@ -238,7 +241,7 @@ if (!cn) if(PQstatus(pg_conn) == CONNECTION_BAD) { - store_reset(server_copy); + reset_point = store_reset(reset_point); *errmsg = string_sprintf("PGSQL connection failed: %s", PQerrorMessage(pg_conn)); PQfinish(pg_conn); @@ -259,7 +262,7 @@ if (!cn) /* Add the connection to the cache */ - cn = store_get(sizeof(pgsql_connection)); + cn = store_get(sizeof(pgsql_connection), FALSE); cn->server = server_copy; cn->handle = pg_conn; cn->next = pgsql_connections; @@ -270,7 +273,7 @@ if (!cn) else { - DEBUG(D_lookup) debug_printf("PGSQL using cached connection for %s\n", + DEBUG(D_lookup) debug_printf_indent("PGSQL using cached connection for %s\n", server_copy); } @@ -288,7 +291,7 @@ switch(PQresultStatus(pg_result)) result = string_cat(result, US PQcmdTuples(pg_result)); *do_cache = 0; - DEBUG(D_lookup) debug_printf("PGSQL: command does not return any data " + DEBUG(D_lookup) debug_printf_indent("PGSQL: command does not return any data " "but was successful. Rows affected: %s\n", string_from_gstring(result)); break; @@ -356,13 +359,13 @@ if (pg_result) PQclear(pg_result); if (result) { - store_reset(result->s + result->ptr + 1); + gstring_release_unused(result); *resultptr = string_from_gstring(result); return OK; } else { - DEBUG(D_lookup) debug_printf("%s\n", *errmsg); + DEBUG(D_lookup) debug_printf_indent("%s\n", *errmsg); return yield; /* FAIL or DEFER */ } } @@ -380,11 +383,12 @@ query is deferred with a retryable error is now in a separate function that is shared with other SQL lookups. */ static int -pgsql_find(void *handle, uschar *filename, const uschar *query, int length, - uschar **result, uschar **errmsg, uint *do_cache) +pgsql_find(void * handle, const uschar * filename, const uschar * query, + int length, uschar ** result, uschar ** errmsg, uint * do_cache, + const uschar * opts) { return lf_sqlperform(US"PostgreSQL", US"pgsql_servers", pgsql_servers, query, - result, errmsg, do_cache, perform_pgsql_search); + result, errmsg, do_cache, opts, perform_pgsql_search); } @@ -427,7 +431,7 @@ while ((c = *t++) != 0) if (Ustrchr("\n\t\r\b\'\"\\", c) != NULL) count++; if (count == 0) return s; -t = quoted = store_get(Ustrlen(s) + count + 1); +t = quoted = store_get(Ustrlen(s) + count + 1, is_tainted(s)); while ((c = *s++) != 0) { @@ -485,15 +489,15 @@ when the connection is established though? */ static lookup_info _lookup_info = { - US"pgsql", /* lookup name */ - lookup_querystyle, /* query-style lookup */ - pgsql_open, /* open function */ - NULL, /* no check function */ - pgsql_find, /* find function */ - NULL, /* no close function */ - pgsql_tidy, /* tidy function */ - pgsql_quote, /* quoting function */ - pgsql_version_report /* version reporting */ + .name = US"pgsql", /* lookup name */ + .type = lookup_querystyle, /* query-style lookup */ + .open = pgsql_open, /* open function */ + .check = NULL, /* no check function */ + .find = pgsql_find, /* find function */ + .close = NULL, /* no close function */ + .tidy = pgsql_tidy, /* tidy function */ + .quote = pgsql_quote, /* quoting function */ + .version_report = pgsql_version_report /* version reporting */ }; #ifdef DYNLOOKUP