annotate src/lib-sql/sql-api-private.h @ 23017:c1d36f2575c7 default tip

lib-imap: Fix "Don't accept strings with NULs" cherry-pick
author Timo Sirainen <timo.sirainen@open-xchange.com>
date Thu, 29 Aug 2019 09:55:25 +0300
parents 7d189977dfe3
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6410
e4eb71ae8e96 Changed .h ifdef/defines to use <NAME>_H format.
Timo Sirainen <tss@iki.fi>
parents: 5496
diff changeset
1 #ifndef SQL_API_PRIVATE_H
e4eb71ae8e96 Changed .h ifdef/defines to use <NAME>_H format.
Timo Sirainen <tss@iki.fi>
parents: 5496
diff changeset
2 #define SQL_API_PRIVATE_H
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "sql-api.h"
6474
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6410
diff changeset
5 #include "module-context.h"
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
7 enum sql_db_state {
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
8 /* not connected to database */
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
9 SQL_DB_STATE_DISCONNECTED,
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
10 /* waiting for connection attempt to succeed or fail */
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
11 SQL_DB_STATE_CONNECTING,
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
12 /* connected, allowing more queries */
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
13 SQL_DB_STATE_IDLE,
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
14 /* connected, no more queries allowed */
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
15 SQL_DB_STATE_BUSY
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
16 };
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
17
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
18 /* Minimum delay between reconnecting to same server */
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
19 #define SQL_CONNECT_MIN_DELAY 1
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
20 /* Maximum time to avoiding reconnecting to same server */
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
21 #define SQL_CONNECT_MAX_DELAY (60*30)
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
22 /* If no servers are connected but a query is requested, try reconnecting to
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
23 next server which has been disconnected longer than this (with a single
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
24 server setup this is really the "max delay" and the SQL_CONNECT_MAX_DELAY
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
25 is never used). */
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
26 #define SQL_CONNECT_RESET_DELAY 15
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
27 /* Abort connect() if it can't connect within this time. */
13495
20a901f1de31 lib-sql: Dropped connect timeout to 5 seconds.
Timo Sirainen <tss@iki.fi>
parents: 11407
diff changeset
28 #define SQL_CONNECT_TIMEOUT_SECS 5
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
29 /* Abort queries after this many seconds */
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
30 #define SQL_QUERY_TIMEOUT_SECS 60
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
31 /* Default max. number of connections to create per host */
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
32 #define SQL_DEFAULT_CONNECTION_LIMIT 5
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
33
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
34 #define SQL_DB_IS_READY(db) \
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
35 ((db)->state == SQL_DB_STATE_IDLE)
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
36 #define SQL_ERRSTR_NOT_CONNECTED "Not connected to database"
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
37
6474
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6410
diff changeset
38 struct sql_db_module_register {
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6410
diff changeset
39 unsigned int id;
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6410
diff changeset
40 };
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
41
6474
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6410
diff changeset
42 union sql_db_module_context {
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6410
diff changeset
43 struct sql_db_module_register *reg;
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6410
diff changeset
44 };
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6410
diff changeset
45
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6410
diff changeset
46 extern struct sql_db_module_register sql_db_module_register;
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6410
diff changeset
47
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
48 struct sql_transaction_query {
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
49 struct sql_transaction_query *next;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
50 struct sql_transaction_context *trans;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
51
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
52 const char *query;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
53 unsigned int *affected_rows;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
54 };
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
55
6474
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6410
diff changeset
56 struct sql_db_vfuncs {
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 struct sql_db *(*init)(const char *connect_string);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 void (*deinit)(struct sql_db *db);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
60 int (*connect)(struct sql_db *db);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
61 void (*disconnect)(struct sql_db *db);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
62 const char *(*escape_string)(struct sql_db *db, const char *string);
3162
5d6787582410 Added sql_get_flags() function, currently returning only
Timo Sirainen <tss@iki.fi>
parents: 2754
diff changeset
63
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 void (*exec)(struct sql_db *db, const char *query);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 void (*query)(struct sql_db *db, const char *query,
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 sql_query_callback_t *callback, void *context);
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
67 struct sql_result *(*query_s)(struct sql_db *db, const char *query);
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
68
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
69 struct sql_transaction_context *(*transaction_begin)(struct sql_db *db);
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
70 void (*transaction_commit)(struct sql_transaction_context *ctx,
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
71 sql_commit_callback_t *callback,
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
72 void *context);
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
73 int (*transaction_commit_s)(struct sql_transaction_context *ctx,
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
74 const char **error_r);
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
75 void (*transaction_rollback)(struct sql_transaction_context *ctx);
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
76
9888
551c273f4844 lib-sql: Added sql_update_get_rows().
Timo Sirainen <tss@iki.fi>
parents: 9270
diff changeset
77 void (*update)(struct sql_transaction_context *ctx, const char *query,
551c273f4844 lib-sql: Added sql_update_get_rows().
Timo Sirainen <tss@iki.fi>
parents: 9270
diff changeset
78 unsigned int *affected_rows);
19072
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
79 const char *(*escape_blob)(struct sql_db *db,
113f4e32cb19 lib-sql: Implemented sql_escape_blob()
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
80 const unsigned char *data, size_t size);
20528
b885fee56a82 lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20526
diff changeset
81 void (*transaction_commit2)(struct sql_transaction_context *ctx,
b885fee56a82 lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20526
diff changeset
82 sql_commit2_callback_t *callback,
b885fee56a82 lib-sql: Added sql_transaction_commit2()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20526
diff changeset
83 void *context);
22514
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
84
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
85 struct sql_prepared_statement *
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
86 (*prepared_statement_init)(struct sql_db *db,
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
87 const char *query_template);
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
88 void (*prepared_statement_deinit)(struct sql_prepared_statement *prep_stmt);
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
89
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
90
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
91 struct sql_statement *
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
92 (*statement_init)(struct sql_db *db, const char *query_template);
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
93 struct sql_statement *
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
94 (*statement_init_prepared)(struct sql_prepared_statement *prep_stmt);
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
95 void (*statement_abort)(struct sql_statement *stmt);
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
96 void (*statement_set_timestamp)(struct sql_statement *stmt,
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
97 const struct timespec *ts);
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
98 void (*statement_bind_str)(struct sql_statement *stmt,
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
99 unsigned int column_idx, const char *value);
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
100 void (*statement_bind_binary)(struct sql_statement *stmt,
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
101 unsigned int column_idx, const void *value,
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
102 size_t value_size);
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
103 void (*statement_bind_int64)(struct sql_statement *stmt,
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
104 unsigned int column_idx, int64_t value);
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
105 void (*statement_query)(struct sql_statement *stmt,
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
106 sql_query_callback_t *callback, void *context);
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
107 struct sql_result *(*statement_query_s)(struct sql_statement *stmt);
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
108 void (*update_stmt)(struct sql_transaction_context *ctx,
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
109 struct sql_statement *stmt,
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
110 unsigned int *affected_rows);
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 };
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112
6474
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6410
diff changeset
113 struct sql_db {
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6410
diff changeset
114 const char *name;
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
115 enum sql_db_flags flags;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
116
6474
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6410
diff changeset
117 struct sql_db_vfuncs v;
14920
a097ef0a9d6d Array API changed: ARRAY_DEFINE(name, type) -> ARRAY(type) name
Timo Sirainen <tss@iki.fi>
parents: 13495
diff changeset
118 ARRAY(union sql_db_module_context *) module_contexts;
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
119
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
120 void (*state_change_callback)(struct sql_db *db,
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
121 enum sql_db_state prev_state,
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
122 void *context);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
123 void *state_change_context;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
124
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
125 enum sql_db_state state;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
126 /* last time we started connecting to this server
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
127 (which may or may not have succeeded) */
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
128 time_t last_connect_try;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
129 unsigned int connect_delay;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
130 unsigned int connect_failure_count;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
131 struct timeout *to_reconnect;
11407
f9e5c73a988b lib-sql: Don't try to reconnect on deinit or intentional disconnect. Fixes a timeout leak.
Timo Sirainen <tss@iki.fi>
parents: 11261
diff changeset
132
f9e5c73a988b lib-sql: Don't try to reconnect on deinit or intentional disconnect. Fixes a timeout leak.
Timo Sirainen <tss@iki.fi>
parents: 11261
diff changeset
133 unsigned int no_reconnect:1;
6474
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6410
diff changeset
134 };
46c3e1ee196f Added module_contexts to struct sql_db.
Timo Sirainen <tss@iki.fi>
parents: 6410
diff changeset
135
5496
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
136 struct sql_result_vfuncs {
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
137 void (*free)(struct sql_result *result);
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138 int (*next_row)(struct sql_result *result);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 unsigned int (*get_fields_count)(struct sql_result *result);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141 const char *(*get_field_name)(struct sql_result *result,
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142 unsigned int idx);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143 int (*find_field)(struct sql_result *result, const char *field_name);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
144
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 const char *(*get_field_value)(struct sql_result *result,
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146 unsigned int idx);
5496
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
147 const unsigned char *
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
148 (*get_field_value_binary)(struct sql_result *result,
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
149 unsigned int idx,
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
150 size_t *size_r);
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151 const char *(*find_field_value)(struct sql_result *result,
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 const char *field_name);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153 const char *const *(*get_values)(struct sql_result *result);
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 const char *(*get_error)(struct sql_result *result);
22354
b9a2a6135419 lib-sql: Add API support for asynchronously iterating over rows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20528
diff changeset
156 void (*more)(struct sql_result **result, bool async,
b9a2a6135419 lib-sql: Add API support for asynchronously iterating over rows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20528
diff changeset
157 sql_query_callback_t *callback, void *context);
5496
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
158 };
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
159
22514
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
160 struct sql_prepared_statement {
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
161 struct sql_db *db;
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
162 };
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
163
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
164 struct sql_statement {
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
165 struct sql_db *db;
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
166
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
167 pool_t pool;
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
168 const char *query_template;
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
169 ARRAY_TYPE(const_string) args;
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
170 };
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
171
5496
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
172 struct sql_field_map {
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
173 enum sql_field_type type;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
174 size_t offset;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
175 };
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
176
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
177 struct sql_result {
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
178 struct sql_result_vfuncs v;
9270
f9ebd72a73e8 SQL API change: SQL results can be now refed/unrefed.
Timo Sirainen <tss@iki.fi>
parents: 6474
diff changeset
179 int refcount;
5496
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
180
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
181 struct sql_db *db;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
182 const struct sql_field_def *fields;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
183
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
184 unsigned int map_size;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
185 struct sql_field_map *map;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
186 void *fetch_dest;
72ee0521dfaf Added sql_result_setup_fetch() which makes it easier to fetch rows into
Timo Sirainen <tss@iki.fi>
parents: 4458
diff changeset
187 size_t fetch_dest_size;
20526
9565305a8512 lib-sql: Added sql_result_get_error_type().
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19072
diff changeset
188 enum sql_result_error_type error_type;
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
189
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
190 unsigned int failed:1;
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
191 unsigned int failed_try_retry:1;
3736
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
192 unsigned int callback:1;
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
193 };
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
194
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
195 struct sql_transaction_context {
3dd0ab18d8da Added support for transactions and synchronous SQL queries.
Timo Sirainen <tss@iki.fi>
parents: 3421
diff changeset
196 struct sql_db *db;
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
197
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
198 /* commit() must use this query list if head is non-NULL. */
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
199 struct sql_transaction_query *head, *tail;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 };
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4294
diff changeset
202 ARRAY_DEFINE_TYPE(sql_drivers, const struct sql_db *);
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4294
diff changeset
203
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4294
diff changeset
204 extern ARRAY_TYPE(sql_drivers) sql_drivers;
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 extern struct sql_result sql_not_connected_result;
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
207 struct sql_db *
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
208 driver_sqlpool_init(const char *connect_string, const struct sql_db *driver);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
209
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
210 void sql_db_set_state(struct sql_db *db, enum sql_db_state state);
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
211
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
212 void sql_transaction_add_query(struct sql_transaction_context *ctx, pool_t pool,
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
213 const char *query, unsigned int *affected_rows);
22514
7d189977dfe3 lib-sql: Add support for prepared SQL statements.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22354
diff changeset
214 const char *sql_statement_get_query(struct sql_statement *stmt);
11261
1c8cc349ef55 lib-sql: Use generic sql connection pooling code for mysql/pgsql.
Timo Sirainen <tss@iki.fi>
parents: 9888
diff changeset
215
2754
3c3ac12be307 Created generic asynchronous SQL API and implemented MySQL and PostgreSQL
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216 #endif