On Fri, Jun 17, 2022 at 06:59:29AM +0000, Hamid Maadani wrote:

> > You need to use a static variable to record whether you've already
> > initialised the library, and do it just once. No need to worry about
> > threads or locks. Postfix is single-threaded.
> 
> This is also done.

Also, the "client pool" is pointless, Postfix processes are not
multi-threaded.  Instead use a single dedicated (long-term) connection
per open table, but be prepared to retry if the connection was
unilaterally closed on the server side.

I'd rename "result_key" to "result_attribute" and allow it to be
multi-valued (multiple potential columns to retrieve from the returned
object, either alternatives, or sometimes many from the same object).

Also, your parsing of the search_keys is hand-rolled, but should be
using mystrtok(3) to split the list on commas/whitespace, and
split_nameval(3) to split "key = value" pairs on "=".  Also vstring
allocation is not an upper bound, but a guestimated size, and you
should be appending to them via vstring_sprintf_append(3) and the
like, not poking bytes directly into the buffer...

Also the docs have:

    search_keys = username:"%s", active:1

Your code is responsible for proving a JSON-compatible quoting function
that encodes the string interpolated via the "%s".  This needs to be
passed to db_common_expand().  Otherwise the query can easily be
malformed/manipulated:

    https://xkcd.com/327/

-- 
    Viktor.

Reply via email to