1
0
mirror of https://github.com/pgbackrest/pgbackrest.git synced 2025-07-05 00:28:52 +02:00

Add PostgreSQL query client.

This direct interface to libpq allows simple queries to be run against PostgreSQL and supports timeouts.

Testing is performed using a shim that can use scripted responses to test all aspects of the client code.  The shim will be very useful for testing backup scenarios on complex topologies.

Reviewed by Cynthia Shang.
This commit is contained in:
David Steele
2019-07-25 14:50:02 -04:00
parent 59f135340d
commit 415542b4a3
15 changed files with 1160 additions and 8 deletions

47
src/postgres/client.h Normal file
View File

@ -0,0 +1,47 @@
/***********************************************************************************************************************************
PostgreSQL Client
Connect to a PostgreSQL database and run queries. This is not intended to be a general purpose client but is suitable for
pgBackRest's limited needs. In particular, data type support is limited to text, int, and bool types so it may be necessary to add
casts to queries to output one of these types.
***********************************************************************************************************************************/
#ifndef POSTGRES_QUERY_H
#define POSTGRES_QUERY_H
/***********************************************************************************************************************************
Object type
***********************************************************************************************************************************/
#define PG_CLIENT_TYPE PgClient
#define PG_CLIENT_PREFIX pgClient
typedef struct PgClient PgClient;
/***********************************************************************************************************************************
Constructor
***********************************************************************************************************************************/
PgClient *pgClientNew(
const String *host, const unsigned int port, const String *database, const String *user, const TimeMSec queryTimeout);
/***********************************************************************************************************************************
Functions
***********************************************************************************************************************************/
PgClient *pgClientOpen(PgClient *this);
VariantList *pgClientQuery(PgClient *this, const String *query);
void pgClientClose(PgClient *this);
/***********************************************************************************************************************************
Destructor
***********************************************************************************************************************************/
void pgClientFree(PgClient *this);
/***********************************************************************************************************************************
Macros for function logging
***********************************************************************************************************************************/
String *pgClientToLog(const PgClient *this);
#define FUNCTION_LOG_PG_CLIENT_TYPE \
PgClient *
#define FUNCTION_LOG_PG_CLIENT_FORMAT(value, buffer, bufferSize) \
FUNCTION_LOG_STRING_OBJECT_FORMAT(value, pgClientToLog, buffer, bufferSize)
#endif