sql-api-private.h revision 0dffa25d211be541ee3c953b23566a1a990789df
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen#ifndef SQL_API_PRIVATE_H
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen#define SQL_API_PRIVATE_H
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen#include "sql-api.h"
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen#include "module-context.h"
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainenenum sql_db_state {
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen /* not connected to database */
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen SQL_DB_STATE_DISCONNECTED,
edf7428147facc11ddb43b9a874a99b96486d42dTimo Sirainen /* waiting for connection attempt to succeed or fail */
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen SQL_DB_STATE_CONNECTING,
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen /* connected, allowing more queries */
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen SQL_DB_STATE_IDLE,
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen /* connected, no more queries allowed */
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen SQL_DB_STATE_BUSY
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen};
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen/* Minimum delay between reconnecting to same server */
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen#define SQL_CONNECT_MIN_DELAY 1
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen/* Maximum time to avoiding reconnecting to same server */
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen#define SQL_CONNECT_MAX_DELAY (60*30)
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen/* If no servers are connected but a query is requested, try reconnecting to
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen next server which has been disconnected longer than this (with a single
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen server setup this is really the "max delay" and the SQL_CONNECT_MAX_DELAY
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen is never used). */
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen#define SQL_CONNECT_RESET_DELAY 15
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen/* Abort connect() if it can't connect within this time. */
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen#define SQL_CONNECT_TIMEOUT_SECS 5
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen/* Abort queries after this many seconds */
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen#define SQL_QUERY_TIMEOUT_SECS 60
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen/* Default max. number of connections to create per host */
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen#define SQL_DEFAULT_CONNECTION_LIMIT 5
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen#define SQL_DB_IS_READY(db) \
6c07b8ddc5e894feead4d422075b079451721241Timo Sirainen ((db)->state == SQL_DB_STATE_IDLE)
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen#define SQL_ERRSTR_NOT_CONNECTED "Not connected to database"
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainenstruct sql_db_module_register {
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen unsigned int id;
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen};
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainenunion sql_db_module_context {
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen struct sql_db_module_register *reg;
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen};
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen
6c07b8ddc5e894feead4d422075b079451721241Timo Sirainenextern struct sql_db_module_register sql_db_module_register;
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainenstruct sql_transaction_query {
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen struct sql_transaction_query *next;
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen struct sql_transaction_context *trans;
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen const char *query;
edf7428147facc11ddb43b9a874a99b96486d42dTimo Sirainen unsigned int *affected_rows;
edf7428147facc11ddb43b9a874a99b96486d42dTimo Sirainen};
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainenstruct sql_db_vfuncs {
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen struct sql_db *(*init)(const char *connect_string);
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen void (*deinit)(struct sql_db *db);
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen int (*connect)(struct sql_db *db);
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen void (*disconnect)(struct sql_db *db);
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainen const char *(*escape_string)(struct sql_db *db, const char *string);
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainen
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainen void (*exec)(struct sql_db *db, const char *query);
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen void (*query)(struct sql_db *db, const char *query,
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainen sql_query_callback_t *callback, void *context);
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen struct sql_result *(*query_s)(struct sql_db *db, const char *query);
edf7428147facc11ddb43b9a874a99b96486d42dTimo Sirainen
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen struct sql_transaction_context *(*transaction_begin)(struct sql_db *db);
edf7428147facc11ddb43b9a874a99b96486d42dTimo Sirainen void (*transaction_commit)(struct sql_transaction_context *ctx,
edf7428147facc11ddb43b9a874a99b96486d42dTimo Sirainen sql_commit_callback_t *callback,
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen void *context);
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen int (*transaction_commit_s)(struct sql_transaction_context *ctx,
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen const char **error_r);
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen void (*transaction_rollback)(struct sql_transaction_context *ctx);
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen void (*update)(struct sql_transaction_context *ctx, const char *query,
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen unsigned int *affected_rows);
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen const char *(*escape_blob)(struct sql_db *db,
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen const unsigned char *data, size_t size);
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen};
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainenstruct sql_db {
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen const char *name;
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen enum sql_db_flags flags;
244fcb971a4a38b476f733bfd5ed5d18b2c831f7Timo Sirainen
244fcb971a4a38b476f733bfd5ed5d18b2c831f7Timo Sirainen struct sql_db_vfuncs v;
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen ARRAY(union sql_db_module_context *) module_contexts;
3a734c9c3efd87864d1ad860826fd4e787457bedTimo Sirainen
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen void (*state_change_callback)(struct sql_db *db,
244fcb971a4a38b476f733bfd5ed5d18b2c831f7Timo Sirainen enum sql_db_state prev_state,
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen void *context);
3a734c9c3efd87864d1ad860826fd4e787457bedTimo Sirainen void *state_change_context;
3a734c9c3efd87864d1ad860826fd4e787457bedTimo Sirainen
3a734c9c3efd87864d1ad860826fd4e787457bedTimo Sirainen enum sql_db_state state;
244fcb971a4a38b476f733bfd5ed5d18b2c831f7Timo Sirainen /* last time we started connecting to this server
3a734c9c3efd87864d1ad860826fd4e787457bedTimo Sirainen (which may or may not have succeeded) */
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen time_t last_connect_try;
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen unsigned int connect_delay;
3a734c9c3efd87864d1ad860826fd4e787457bedTimo Sirainen unsigned int connect_failure_count;
244fcb971a4a38b476f733bfd5ed5d18b2c831f7Timo Sirainen struct timeout *to_reconnect;
244fcb971a4a38b476f733bfd5ed5d18b2c831f7Timo Sirainen
244fcb971a4a38b476f733bfd5ed5d18b2c831f7Timo Sirainen bool no_reconnect:1;
244fcb971a4a38b476f733bfd5ed5d18b2c831f7Timo Sirainen};
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen
3a734c9c3efd87864d1ad860826fd4e787457bedTimo Sirainenstruct sql_result_vfuncs {
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen void (*free)(struct sql_result *result);
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen int (*next_row)(struct sql_result *result);
244fcb971a4a38b476f733bfd5ed5d18b2c831f7Timo Sirainen
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen unsigned int (*get_fields_count)(struct sql_result *result);
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen const char *(*get_field_name)(struct sql_result *result,
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainen unsigned int idx);
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainen int (*find_field)(struct sql_result *result, const char *field_name);
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen const char *(*get_field_value)(struct sql_result *result,
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen unsigned int idx);
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen const unsigned char *
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen (*get_field_value_binary)(struct sql_result *result,
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainen unsigned int idx,
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainen size_t *size_r);
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainen const char *(*find_field_value)(struct sql_result *result,
e80203675151ef9d4f3f850cf02041042eb13096Timo Sirainen const char *field_name);
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainen const char *const *(*get_values)(struct sql_result *result);
e80203675151ef9d4f3f850cf02041042eb13096Timo Sirainen
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainen const char *(*get_error)(struct sql_result *result);
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainen};
e80203675151ef9d4f3f850cf02041042eb13096Timo Sirainen
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainenstruct sql_field_map {
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainen enum sql_field_type type;
e80203675151ef9d4f3f850cf02041042eb13096Timo Sirainen size_t offset;
517d1e7142d57299c733b30423e35e7e1f8d01d6Timo Sirainen};
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainenstruct sql_result {
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen struct sql_result_vfuncs v;
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen int refcount;
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen
d1414c09cf0d58ac983054e2f4e1a1f329272dcfTimo Sirainen struct sql_db *db;
d1414c09cf0d58ac983054e2f4e1a1f329272dcfTimo Sirainen const struct sql_field_def *fields;
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen unsigned int map_size;
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen struct sql_field_map *map;
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen void *fetch_dest;
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen size_t fetch_dest_size;
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen bool failed:1;
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen bool failed_try_retry:1;
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen bool callback:1;
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen};
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen
9abfe876fa81576f130f3f82f622ae936c21a716Timo Sirainenstruct sql_transaction_context {
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen struct sql_db *db;
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen /* commit() must use this query list if head is non-NULL. */
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen struct sql_transaction_query *head, *tail;
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen};
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen
94a78eb438622fa53abef1e1726714dacad4b61cTimo SirainenARRAY_DEFINE_TYPE(sql_drivers, const struct sql_db *);
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainenextern ARRAY_TYPE(sql_drivers) sql_drivers;
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainenextern struct sql_result sql_not_connected_result;
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainenstruct sql_db *
e80203675151ef9d4f3f850cf02041042eb13096Timo Sirainendriver_sqlpool_init(const char *connect_string, const struct sql_db *driver);
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainen
94a78eb438622fa53abef1e1726714dacad4b61cTimo Sirainenvoid sql_db_set_state(struct sql_db *db, enum sql_db_state state);
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen
d1414c09cf0d58ac983054e2f4e1a1f329272dcfTimo Sirainenvoid sql_transaction_add_query(struct sql_transaction_context *ctx, pool_t pool,
d1414c09cf0d58ac983054e2f4e1a1f329272dcfTimo Sirainen const char *query, unsigned int *affected_rows);
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen
d1414c09cf0d58ac983054e2f4e1a1f329272dcfTimo Sirainen#endif
d1414c09cf0d58ac983054e2f4e1a1f329272dcfTimo Sirainen