driver-pgsql.c revision bb2b3656ef7635acc374f7fc19b25aeeb454ae95
816bf6f8088b162b681101d93fd450127a0e586fJulian Kornberger/* Copyright (c) 2004-2016 Dovecot authors, see the included COPYING file */
a847d9812b328c048773e705606b10875a929034Eugen Kuksa
5e2a6a8992b4e9e77be3a94fc87af4dc14b0c8c4henning mueller#include "lib.h"
a4344d37747b6733bbd0d8df738b614cb385316cTim Reddehase#include "array.h"
d1f0cb74e8bc61e9185488a431b86816cb1cc7edSascha Graef#include "ioloop.h"
c273fbbb7863507673f695bc85709c0cb715011fTim Reddehase#include "hex-binary.h"
c273fbbb7863507673f695bc85709c0cb715011fTim Reddehase#include "str.h"
5ec1c6ff5da427d945d7fb708567ce3526c4c741Tim Reddehase#include "time-util.h"
5ec1c6ff5da427d945d7fb708567ce3526c4c741Tim Reddehase#include "sql-api-private.h"
5ec1c6ff5da427d945d7fb708567ce3526c4c741Tim Reddehase
98ba1c38b1cce99ecc61117259f2ae05ffe98469Tim Reddehase#ifdef BUILD_PGSQL
5ec1c6ff5da427d945d7fb708567ce3526c4c741Tim Reddehase#include <libpq-fe.h>
7c0f71e3e6e26af2cc91112fdbe3905879bfd893Tim Reddehase
7c0f71e3e6e26af2cc91112fdbe3905879bfd893Tim Reddehase#define PGSQL_DNS_WARN_MSECS 500
7c0f71e3e6e26af2cc91112fdbe3905879bfd893Tim Reddehase
7c0f71e3e6e26af2cc91112fdbe3905879bfd893Tim Reddehasestruct pgsql_db {
7c0f71e3e6e26af2cc91112fdbe3905879bfd893Tim Reddehase struct sql_db api;
7c0f71e3e6e26af2cc91112fdbe3905879bfd893Tim Reddehase
7c0f71e3e6e26af2cc91112fdbe3905879bfd893Tim Reddehase pool_t pool;
7c0f71e3e6e26af2cc91112fdbe3905879bfd893Tim Reddehase char *connect_string;
7c0f71e3e6e26af2cc91112fdbe3905879bfd893Tim Reddehase char *host;
7c0f71e3e6e26af2cc91112fdbe3905879bfd893Tim Reddehase PGconn *pg;
7c0f71e3e6e26af2cc91112fdbe3905879bfd893Tim Reddehase
7c0f71e3e6e26af2cc91112fdbe3905879bfd893Tim Reddehase struct io *io;
7c0f71e3e6e26af2cc91112fdbe3905879bfd893Tim Reddehase struct timeout *to_connect;
7c0f71e3e6e26af2cc91112fdbe3905879bfd893Tim Reddehase enum io_condition io_dir;
cc3ee169b3cbf177eaf03e9a590ff9e30c338bd2Tim Reddehase
98ba1c38b1cce99ecc61117259f2ae05ffe98469Tim Reddehase struct pgsql_result *cur_result;
98ba1c38b1cce99ecc61117259f2ae05ffe98469Tim Reddehase struct ioloop *ioloop, *orig_ioloop;
98ba1c38b1cce99ecc61117259f2ae05ffe98469Tim Reddehase struct sql_result *sync_result;
d51cee8257d50d1f2d7c0818d968b32096f6b795Tim Reddehase
98ba1c38b1cce99ecc61117259f2ae05ffe98469Tim Reddehase bool (*next_callback)(void *);
98ba1c38b1cce99ecc61117259f2ae05ffe98469Tim Reddehase void *next_context;
5ec1c6ff5da427d945d7fb708567ce3526c4c741Tim Reddehase
7dadc1a5aa3845c2ce19ad1daa2c63dfd7b59979Tim Reddehase char *error;
7dadc1a5aa3845c2ce19ad1daa2c63dfd7b59979Tim Reddehase const char *connect_state;
7dadc1a5aa3845c2ce19ad1daa2c63dfd7b59979Tim Reddehase
7dadc1a5aa3845c2ce19ad1daa2c63dfd7b59979Tim Reddehase bool fatal_error:1;
7dadc1a5aa3845c2ce19ad1daa2c63dfd7b59979Tim Reddehase};
7dadc1a5aa3845c2ce19ad1daa2c63dfd7b59979Tim Reddehase
7dadc1a5aa3845c2ce19ad1daa2c63dfd7b59979Tim Reddehasestruct pgsql_binary_value {
d51cee8257d50d1f2d7c0818d968b32096f6b795Tim Reddehase unsigned char *value;
d51cee8257d50d1f2d7c0818d968b32096f6b795Tim Reddehase size_t size;
d51cee8257d50d1f2d7c0818d968b32096f6b795Tim Reddehase};
d51cee8257d50d1f2d7c0818d968b32096f6b795Tim Reddehase
d51cee8257d50d1f2d7c0818d968b32096f6b795Tim Reddehasestruct pgsql_result {
d51cee8257d50d1f2d7c0818d968b32096f6b795Tim Reddehase struct sql_result api;
d51cee8257d50d1f2d7c0818d968b32096f6b795Tim Reddehase PGresult *pgres;
653f8d7c88abc38a2c42f12b80b3e3efd882e039Tim Reddehase struct timeout *to;
653f8d7c88abc38a2c42f12b80b3e3efd882e039Tim Reddehase
653f8d7c88abc38a2c42f12b80b3e3efd882e039Tim Reddehase unsigned int rownum, rows;
653f8d7c88abc38a2c42f12b80b3e3efd882e039Tim Reddehase unsigned int fields_count;
653f8d7c88abc38a2c42f12b80b3e3efd882e039Tim Reddehase const char **fields;
653f8d7c88abc38a2c42f12b80b3e3efd882e039Tim Reddehase const char **values;
653f8d7c88abc38a2c42f12b80b3e3efd882e039Tim Reddehase
419f986abb76f6fce54b71e17f52a1deaa06dbd6Tim Reddehase ARRAY(struct pgsql_binary_value) binary_values;
419f986abb76f6fce54b71e17f52a1deaa06dbd6Tim Reddehase
419f986abb76f6fce54b71e17f52a1deaa06dbd6Tim Reddehase sql_query_callback_t *callback;
419f986abb76f6fce54b71e17f52a1deaa06dbd6Tim Reddehase void *context;
419f986abb76f6fce54b71e17f52a1deaa06dbd6Tim Reddehase
419f986abb76f6fce54b71e17f52a1deaa06dbd6Tim Reddehase bool timeout:1;
419f986abb76f6fce54b71e17f52a1deaa06dbd6Tim Reddehase};
5ec1c6ff5da427d945d7fb708567ce3526c4c741Tim Reddehase
5ec1c6ff5da427d945d7fb708567ce3526c4c741Tim Reddehasestruct pgsql_transaction_context {
5ec1c6ff5da427d945d7fb708567ce3526c4c741Tim Reddehase struct sql_transaction_context ctx;
ded96a9824d22005463220b5635523420a056f0cEugen Kuksa int refcount;
9789c65179e43e0e8c91aa11c67e60b02250cba9Sascha Graef
ee5342a8882c2fc7631fcffb5497e6597747887cTim Reddehase sql_commit_callback_t *callback;
c7dbfa39641dbdf8d00d1fac2ce96d50a97fcb74henning mueller void *context;
c7dbfa39641dbdf8d00d1fac2ce96d50a97fcb74henning mueller
c7dbfa39641dbdf8d00d1fac2ce96d50a97fcb74henning mueller pool_t query_pool;
c7dbfa39641dbdf8d00d1fac2ce96d50a97fcb74henning mueller const char *error;
c7dbfa39641dbdf8d00d1fac2ce96d50a97fcb74henning mueller
560baaad7d614c8aa6b7871e3a99ce33a137d93bJulian Kornberger bool failed:1;
ee5342a8882c2fc7631fcffb5497e6597747887cTim Reddehase};
6f91bdc1c03bee33882518bd6b5f072968562061Sascha Graef
a0b65fd7d17589196751bea546f738c3534c4facChristian Clausenextern const struct sql_db driver_pgsql_db;
9fbd3a72a4733a42acbea268f38b75b7a35354dcTim Reddehaseextern const struct sql_result driver_pgsql_result;
634abf6594d5960c4ca0b0701b69a81231b05aceChristian Clausen
ee5342a8882c2fc7631fcffb5497e6597747887cTim Reddehasestatic void result_finish(struct pgsql_result *result);
634abf6594d5960c4ca0b0701b69a81231b05aceChristian Clausenstatic void
a0b65fd7d17589196751bea546f738c3534c4facChristian Clausentransaction_update_callback(struct sql_result *result,
634abf6594d5960c4ca0b0701b69a81231b05aceChristian Clausen struct sql_transaction_query *query);
ee5342a8882c2fc7631fcffb5497e6597747887cTim Reddehase
7c7f3cf9415077b18027586822f15ac1dafbbaa3Christian Clausenstatic const char *pgsql_prefix(struct pgsql_db *db)
7c7f3cf9415077b18027586822f15ac1dafbbaa3Christian Clausen{
7c7f3cf9415077b18027586822f15ac1dafbbaa3Christian Clausen return db->host == NULL ? "pgsql" :
00c175adc24043fbcd4cd5e3769c9d13e31ff831Model Renamer t_strdup_printf("pgsql(%s)", db->host);
3b82fa8c1f93a0572ec0d480c8f1645c6ea18e0bTim Reddehase}
b23869f9e7504049f5d28bbbc54d812c8ca36abbEugen Kuksa
b23869f9e7504049f5d28bbbc54d812c8ca36abbEugen Kuksastatic void driver_pgsql_set_state(struct pgsql_db *db, enum sql_db_state state)
b23869f9e7504049f5d28bbbc54d812c8ca36abbEugen Kuksa{
b23869f9e7504049f5d28bbbc54d812c8ca36abbEugen Kuksa i_assert(state == SQL_DB_STATE_BUSY || db->cur_result == NULL);
b23869f9e7504049f5d28bbbc54d812c8ca36abbEugen Kuksa
b23869f9e7504049f5d28bbbc54d812c8ca36abbEugen Kuksa /* switch back to original ioloop in case the caller wants to
3b82fa8c1f93a0572ec0d480c8f1645c6ea18e0bTim Reddehase add/remove timeouts */
ca68055161f6beb2ec248e789ab787e6de69bd18Christian Clausen if (db->ioloop != NULL)
ca68055161f6beb2ec248e789ab787e6de69bd18Christian Clausen io_loop_set_current(db->orig_ioloop);
ca68055161f6beb2ec248e789ab787e6de69bd18Christian Clausen sql_db_set_state(&db->api, state);
7c5e9db9a07461d92c007563a2a27ca42ce93baeChristian Clausen if (db->ioloop != NULL)
Error!

 

There was an error!

null

java.lang.NullPointerException