annotate src/lib-dict/dict-sql.c @ 9575:0a00dcc4f0ea HEAD

lib-storage: Allow shared namespace prefix to use %variable modifiers.
author Timo Sirainen <tss@iki.fi>
date Wed, 26 May 2010 17:07:51 +0100
parents 00cd9aacd03c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9532
00cd9aacd03c Updated copyright notices to include year 2010.
Timo Sirainen <tss@iki.fi>
parents: 9377
diff changeset
1 /* Copyright (c) 2005-2010 Dovecot authors, see the included COPYING file */
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
3943
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
4 #include "array.h"
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "istream.h"
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "str.h"
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "sql-api-private.h"
6480
7596339a9452 Use SQL connection pools.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
8 #include "sql-pool.h"
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "dict-private.h"
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
10 #include "dict-sql-settings.h"
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #include "dict-sql.h"
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include <unistd.h>
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 #include <fcntl.h>
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15
6480
7596339a9452 Use SQL connection pools.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
16 #define DICT_SQL_MAX_UNUSED_CONNECTIONS 10
7596339a9452 Use SQL connection pools.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
17
8265
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
18 enum sql_recurse_type {
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
19 SQL_DICT_RECURSE_NONE,
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
20 SQL_DICT_RECURSE_ONE,
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
21 SQL_DICT_RECURSE_FULL
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
22 };
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
23
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 struct sql_dict {
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 struct dict dict;
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 pool_t pool;
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 struct sql_db *db;
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
29 const char *username;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
30 const struct dict_sql_settings *set;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
31 unsigned int prev_map_match_idx;
7966
54225d0b6e2b dict-sql: Only MySQL supports "INSERT .. ON DUPLICATE KEY". With others just
Timo Sirainen <tss@iki.fi>
parents: 7821
diff changeset
32
54225d0b6e2b dict-sql: Only MySQL supports "INSERT .. ON DUPLICATE KEY". With others just
Timo Sirainen <tss@iki.fi>
parents: 7821
diff changeset
33 unsigned int has_on_duplicate_key:1;
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 };
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 struct sql_dict_iterate_context {
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 struct dict_iterate_context ctx;
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
38 enum dict_iterate_flags flags;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
39 char *path;
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 struct sql_result *result;
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
42 string_t *key;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
43 const struct dict_sql_map *map;
8265
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
44 unsigned int key_prefix_len, pattern_prefix_len, next_map_idx;
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 };
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46
9361
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
47 struct sql_dict_inc_row {
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
48 struct sql_dict_inc_row *prev;
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
49 unsigned int rows;
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
50 };
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
51
3787
40600601502e Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents: 3737
diff changeset
52 struct sql_dict_transaction_context {
40600601502e Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents: 3737
diff changeset
53 struct dict_transaction_context ctx;
40600601502e Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents: 3737
diff changeset
54
40600601502e Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents: 3737
diff changeset
55 struct sql_transaction_context *sql_ctx;
4511
3f808dd8f568 If invalid key is given to dict_set() or dict_atomic_inc() fail the whole
Timo Sirainen <tss@iki.fi>
parents: 4371
diff changeset
56
8647
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
57 const struct dict_sql_map *prev_inc_map;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
58 char *prev_inc_key;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
59 long long prev_inc_diff;
9361
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
60 pool_t inc_row_pool;
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
61 struct sql_dict_inc_row *inc_row;
8647
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
62
4511
3f808dd8f568 If invalid key is given to dict_set() or dict_atomic_inc() fail the whole
Timo Sirainen <tss@iki.fi>
parents: 4371
diff changeset
63 unsigned int failed:1;
3f808dd8f568 If invalid key is given to dict_set() or dict_atomic_inc() fail the whole
Timo Sirainen <tss@iki.fi>
parents: 4371
diff changeset
64 unsigned int changed:1;
3787
40600601502e Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents: 3737
diff changeset
65 };
40600601502e Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents: 3737
diff changeset
66
6480
7596339a9452 Use SQL connection pools.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
67 static struct sql_pool *dict_sql_pool;
7596339a9452 Use SQL connection pools.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
68
8647
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
69 static void sql_dict_prev_inc_flush(struct sql_dict_transaction_context *ctx);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
70
4516
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4511
diff changeset
71 static struct dict *
4517
e661182eab75 Berkeley DB dict support is now enabled only when using --with-db configure option.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4516
diff changeset
72 sql_dict_init(struct dict *driver, const char *uri,
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 6162
diff changeset
73 enum dict_data_type value_type ATTR_UNUSED,
9174
eed86bcc33aa dict proxy: Use base_dir as the default dict-server location.
Timo Sirainen <tss@iki.fi>
parents: 8685
diff changeset
74 const char *username, const char *base_dir ATTR_UNUSED)
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 {
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 struct sql_dict *dict;
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 pool_t pool;
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78
8685
6ee78e18d026 Increased some initial memory pool sizes.
Timo Sirainen <tss@iki.fi>
parents: 8660
diff changeset
79 pool = pool_alloconly_create("sql dict", 2048);
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 dict = p_new(pool, struct sql_dict, 1);
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 dict->pool = pool;
4517
e661182eab75 Berkeley DB dict support is now enabled only when using --with-db configure option.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4516
diff changeset
82 dict->dict = *driver;
3967
6fabe878c46d Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents: 3943
diff changeset
83 dict->username = p_strdup(pool, username);
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
84 dict->set = dict_sql_settings_read(pool, uri);
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
85 if (dict->set == NULL) {
6428
7cad076906eb pool_unref() now takes ** pointer.
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
86 pool_unref(&pool);
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 return NULL;
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 }
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89
7966
54225d0b6e2b dict-sql: Only MySQL supports "INSERT .. ON DUPLICATE KEY". With others just
Timo Sirainen <tss@iki.fi>
parents: 7821
diff changeset
90 /* currently pgsql and sqlite don't support "ON DUPLICATE KEY" */
54225d0b6e2b dict-sql: Only MySQL supports "INSERT .. ON DUPLICATE KEY". With others just
Timo Sirainen <tss@iki.fi>
parents: 7821
diff changeset
91 dict->has_on_duplicate_key = strcmp(driver->name, "mysql") == 0;
54225d0b6e2b dict-sql: Only MySQL supports "INSERT .. ON DUPLICATE KEY". With others just
Timo Sirainen <tss@iki.fi>
parents: 7821
diff changeset
92
6480
7596339a9452 Use SQL connection pools.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
93 dict->db = sql_pool_new(dict_sql_pool, driver->name,
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
94 dict->set->connect);
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95 return &dict->dict;
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96 }
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98 static void sql_dict_deinit(struct dict *_dict)
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99 {
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 struct sql_dict *dict = (struct sql_dict *)_dict;
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
102 sql_deinit(&dict->db);
6428
7cad076906eb pool_unref() now takes ** pointer.
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
103 pool_unref(&dict->pool);
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 }
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
106 static bool
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
107 dict_sql_map_match(const struct dict_sql_map *map, const char *path,
8265
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
108 ARRAY_TYPE(const_string) *values, unsigned int *pat_len_r,
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
109 unsigned int *path_len_r, bool partial_ok)
3967
6fabe878c46d Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents: 3943
diff changeset
110 {
8265
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
111 const char *path_start = path;
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
112 const char *pat, *field, *p;
8265
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
113 unsigned int len;
3967
6fabe878c46d Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents: 3943
diff changeset
114
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
115 array_clear(values);
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
116 pat = map->pattern;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
117 while (*pat != '\0' && *path != '\0') {
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
118 if (*pat == '$') {
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
119 /* variable */
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
120 pat++;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
121 if (*pat == '\0') {
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
122 /* pattern ended with this variable,
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
123 it'll match the rest of the path */
8265
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
124 len = strlen(path);
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
125 if (partial_ok) {
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
126 /* iterating - the last field never
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
127 matches fully. if there's a trailing
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
128 '/', drop it. */
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
129 pat--;
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
130 if (path[len-1] == '/') {
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
131 field = t_strndup(path, len-1);
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
132 array_append(values, &field, 1);
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
133 } else {
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
134 array_append(values, &path, 1);
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
135 }
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
136 } else {
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
137 array_append(values, &path, 1);
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
138 path += len;
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
139 }
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
140 *path_len_r = path - path_start;
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
141 *pat_len_r = pat - map->pattern;
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
142 return TRUE;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
143 }
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
144 /* pattern matches until the next '/' in path */
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
145 p = strchr(path, '/');
8265
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
146 if (p != NULL) {
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
147 field = t_strdup_until(path, p);
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
148 array_append(values, &field, 1);
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
149 path = p;
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
150 } else {
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
151 /* no '/' anymore, but it'll still match a
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
152 partial */
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
153 array_append(values, &path, 1);
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
154 path += strlen(path);
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
155 pat++;
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
156 }
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
157 } else if (*pat == *path) {
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
158 pat++;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
159 path++;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
160 } else {
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
161 return FALSE;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
162 }
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
163 }
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
164 if (*pat == '\0')
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
165 return *path == '\0';
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
166 else if (!partial_ok)
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
167 return FALSE;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
168 else {
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
169 /* partial matches must end with '/' */
8265
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
170 *path_len_r = path - path_start;
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
171 *pat_len_r = pat - map->pattern;
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
172 return pat == map->pattern || pat[-1] == '/';
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
173 }
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
174 }
3967
6fabe878c46d Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents: 3943
diff changeset
175
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
176 static const struct dict_sql_map *
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
177 sql_dict_find_map(struct sql_dict *dict, const char *path,
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
178 ARRAY_TYPE(const_string) *values)
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
179 {
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
180 const struct dict_sql_map *maps;
8265
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
181 unsigned int i, idx, count, len;
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
182
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
183 t_array_init(values, dict->set->max_field_count);
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
184 maps = array_get(&dict->set->maps, &count);
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
185 for (i = 0; i < count; i++) {
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
186 /* start matching from the previously successful match */
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
187 idx = (dict->prev_map_match_idx + i) % count;
8265
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
188 if (dict_sql_map_match(&maps[idx], path, values,
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
189 &len, &len, FALSE)) {
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
190 dict->prev_map_match_idx = idx;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
191 return &maps[idx];
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
192 }
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
193 }
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
194 return NULL;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
195 }
3967
6fabe878c46d Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents: 3943
diff changeset
196
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
197 static void
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
198 sql_dict_where_build(struct sql_dict *dict, const struct dict_sql_map *map,
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
199 const ARRAY_TYPE(const_string) *values_arr,
8654
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
200 char key1, enum sql_recurse_type recurse_type,
8265
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
201 string_t *query)
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
202 {
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
203 const char *const *sql_fields, *const *values;
8265
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
204 unsigned int i, count, count2, exact_count;
8654
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
205 bool priv = key1 == DICT_PATH_PRIVATE[0];
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
206
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
207 sql_fields = array_get(&map->sql_fields, &count);
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
208 values = array_get(values_arr, &count2);
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
209 /* if we came here from iteration code there may be less values */
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
210 i_assert(count2 <= count);
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
211
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
212 if (count2 == 0 && !priv) {
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
213 /* we want everything */
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
214 return;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
215 }
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
216
8265
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
217 str_append(query, " WHERE");
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
218 exact_count = count == count2 && recurse_type != SQL_DICT_RECURSE_NONE ?
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
219 count2-1 : count2;
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
220 for (i = 0; i < exact_count; i++) {
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
221 if (i > 0)
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
222 str_append(query, " AND");
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
223 str_printfa(query, " %s = '%s'", sql_fields[i],
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
224 sql_escape_string(dict->db, values[i]));
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
225 }
8265
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
226 switch (recurse_type) {
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
227 case SQL_DICT_RECURSE_NONE:
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
228 break;
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
229 case SQL_DICT_RECURSE_ONE:
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
230 if (i > 0)
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
231 str_append(query, " AND");
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
232 if (i < count2) {
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
233 str_printfa(query, " %s LIKE '%s/%%' AND "
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
234 "%s NOT LIKE '%s/%%/%%'",
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
235 sql_fields[i],
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
236 sql_escape_string(dict->db, values[i]),
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
237 sql_fields[i],
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
238 sql_escape_string(dict->db, values[i]));
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
239 } else {
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
240 str_printfa(query, " %s LIKE '%%' AND "
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
241 "%s NOT LIKE '%%/%%'",
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
242 sql_fields[i], sql_fields[i]);
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
243 }
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
244 break;
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
245 case SQL_DICT_RECURSE_FULL:
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
246 if (i < count2) {
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
247 if (i > 0)
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
248 str_append(query, " AND");
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
249 str_printfa(query, " %s LIKE '%s/%%'", sql_fields[i],
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
250 sql_escape_string(dict->db, values[i]));
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
251 }
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
252 break;
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
253 }
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
254 if (priv) {
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
255 if (count2 > 0)
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
256 str_append(query, " AND");
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
257 str_printfa(query, " %s = '%s'", map->username_field,
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
258 sql_escape_string(dict->db, dict->username));
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
259 }
3967
6fabe878c46d Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents: 3943
diff changeset
260 }
6fabe878c46d Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents: 3943
diff changeset
261
3787
40600601502e Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents: 3737
diff changeset
262 static int sql_dict_lookup(struct dict *_dict, pool_t pool,
40600601502e Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents: 3737
diff changeset
263 const char *key, const char **value_r)
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264 {
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
265 struct sql_dict *dict = (struct sql_dict *)_dict;
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
266 const struct dict_sql_map *map;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
267 ARRAY_TYPE(const_string) values;
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268 struct sql_result *result;
3787
40600601502e Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents: 3737
diff changeset
269 int ret;
3967
6fabe878c46d Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents: 3943
diff changeset
270
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
271 map = sql_dict_find_map(dict, key, &values);
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
272 if (map == NULL) {
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
273 i_error("sql dict lookup: Invalid/unmapped key: %s", key);
3967
6fabe878c46d Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents: 3943
diff changeset
274 *value_r = NULL;
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
275 return 0;
3967
6fabe878c46d Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents: 3943
diff changeset
276 }
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
277
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
278 T_BEGIN {
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6480
diff changeset
279 string_t *query = t_str_new(256);
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
280
8265
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
281 str_printfa(query, "SELECT %s FROM %s",
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
282 map->value_field, map->table);
8654
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
283 sql_dict_where_build(dict, map, &values, key[0],
8265
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
284 SQL_DICT_RECURSE_NONE, query);
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6480
diff changeset
285 result = sql_query_s(dict->db, str_c(query));
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
286 } T_END;
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
287
3787
40600601502e Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents: 3737
diff changeset
288 ret = sql_result_next_row(result);
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
289 if (ret <= 0) {
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
290 if (ret < 0) {
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
291 i_error("dict sql lookup failed: %s",
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
292 sql_result_get_error(result));
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
293 }
3787
40600601502e Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents: 3737
diff changeset
294 *value_r = NULL;
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
295 } else {
3787
40600601502e Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents: 3737
diff changeset
296 *value_r =
40600601502e Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents: 3737
diff changeset
297 p_strdup(pool, sql_result_get_field_value(result, 0));
40600601502e Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents: 3737
diff changeset
298 }
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
299
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300 sql_result_free(result);
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
301 return ret;
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
302 }
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
303
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
304 static const struct dict_sql_map *
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
305 sql_dict_iterate_find_next_map(struct sql_dict_iterate_context *ctx,
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
306 ARRAY_TYPE(const_string) *values)
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
307 {
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
308 struct sql_dict *dict = (struct sql_dict *)ctx->ctx.dict;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
309 const struct dict_sql_map *maps;
8265
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
310 unsigned int i, count, pat_len, path_len;
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
311
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
312 t_array_init(values, dict->set->max_field_count);
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
313 maps = array_get(&dict->set->maps, &count);
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
314 for (i = ctx->next_map_idx; i < count; i++) {
8265
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
315 if (dict_sql_map_match(&maps[i], ctx->path,
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
316 values, &pat_len, &path_len, TRUE) &&
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
317 ((ctx->flags & DICT_ITERATE_FLAG_RECURSE) != 0 ||
8265
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
318 array_count(values)+1 >= array_count(&maps[i].sql_fields))) {
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
319 ctx->key_prefix_len = path_len;
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
320 ctx->pattern_prefix_len = pat_len;
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
321 ctx->next_map_idx = i + 1;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
322 return &maps[i];
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
323 }
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
324 }
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
325 return NULL;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
326 }
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
327
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
328 static bool sql_dict_iterate_next_query(struct sql_dict_iterate_context *ctx)
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
329 {
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
330 struct sql_dict *dict = (struct sql_dict *)ctx->ctx.dict;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
331 const struct dict_sql_map *map;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
332 ARRAY_TYPE(const_string) values;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
333 const char *const *sql_fields;
8265
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
334 enum sql_recurse_type recurse_type;
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
335 unsigned int i, count;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
336
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
337 map = sql_dict_iterate_find_next_map(ctx, &values);
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
338 if (map == NULL)
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
339 return FALSE;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
340
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
341 T_BEGIN {
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
342 string_t *query = t_str_new(256);
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
343
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
344 str_printfa(query, "SELECT %s", map->value_field);
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
345 /* get all missing fields */
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
346 sql_fields = array_get(&map->sql_fields, &count);
8265
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
347 i = array_count(&values);
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
348 if (i == count) {
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
349 /* we always want to know the last field since we're
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
350 iterating its children */
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
351 i_assert(i > 0);
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
352 i--;
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
353 }
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
354 for (; i < count; i++)
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
355 str_printfa(query, ",%s", sql_fields[i]);
8265
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
356 str_printfa(query, " FROM %s", map->table);
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
357
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
358 recurse_type = (ctx->flags & DICT_ITERATE_FLAG_RECURSE) == 0 ?
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
359 SQL_DICT_RECURSE_ONE : SQL_DICT_RECURSE_FULL;
8654
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
360 sql_dict_where_build(dict, map, &values, ctx->path[0],
8265
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
361 recurse_type, query);
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
362
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
363 if ((ctx->flags & DICT_ITERATE_FLAG_SORT_BY_KEY) != 0) {
8265
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
364 str_append(query, " ORDER BY ");
8281
3e34e1816ac1 dict-sql: Fixed sorting by key.
Timo Sirainen <tss@iki.fi>
parents: 8278
diff changeset
365 for (i = 0; i < count; i++) {
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
366 str_printfa(query, "%s", sql_fields[i]);
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
367 if (i < count-1)
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
368 str_append_c(query, ',');
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
369 }
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
370 } else if ((ctx->flags & DICT_ITERATE_FLAG_SORT_BY_VALUE) != 0)
8265
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
371 str_printfa(query, " ORDER BY %s", map->value_field);
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
372 ctx->result = sql_query_s(dict->db, str_c(query));
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
373 } T_END;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
374
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
375 ctx->map = map;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
376 return TRUE;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
377 }
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
378
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
379 static struct dict_iterate_context *
4516
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4511
diff changeset
380 sql_dict_iterate_init(struct dict *_dict, const char *path,
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4511
diff changeset
381 enum dict_iterate_flags flags)
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
382 {
7819
59ec9752c3dd Fixed dict iteration with SQL backend.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
383 struct sql_dict_iterate_context *ctx;
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
384
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
385 ctx = i_new(struct sql_dict_iterate_context, 1);
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
386 ctx->ctx.dict = _dict;
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
387 ctx->path = i_strdup(path);
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
388 ctx->flags = flags;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
389 ctx->key = str_new(default_pool, 256);
8265
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
390 str_append(ctx->key, ctx->path);
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
391
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
392 if (!sql_dict_iterate_next_query(ctx)) {
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
393 i_error("sql dict iterate: Invalid/unmapped path: %s", path);
3967
6fabe878c46d Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents: 3943
diff changeset
394 ctx->result = NULL;
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6480
diff changeset
395 return &ctx->ctx;
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6480
diff changeset
396 }
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
397 return &ctx->ctx;
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
398 }
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
399
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
400 static int sql_dict_iterate(struct dict_iterate_context *_ctx,
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
401 const char **key_r, const char **value_r)
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
402 {
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
403 struct sql_dict_iterate_context *ctx =
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
404 (struct sql_dict_iterate_context *)_ctx;
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
405 const char *p;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
406 unsigned int i, count;
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
407 int ret;
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
408
3967
6fabe878c46d Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents: 3943
diff changeset
409 if (ctx->result == NULL)
6fabe878c46d Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents: 3943
diff changeset
410 return -1;
6fabe878c46d Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents: 3943
diff changeset
411
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
412 while ((ret = sql_result_next_row(ctx->result)) == 0) {
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
413 /* see if there are more results in the next map */
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
414 if (!sql_dict_iterate_next_query(ctx))
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
415 return 0;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
416 }
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
417 if (ret < 0) {
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
418 i_error("dict sql iterate failed: %s",
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
419 sql_result_get_error(ctx->result));
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
420 return ret;
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
421 }
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
422
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
423 /* convert fetched row to dict key */
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
424 str_truncate(ctx->key, ctx->key_prefix_len);
8265
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
425 if (ctx->key_prefix_len > 0 &&
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
426 str_c(ctx->key)[ctx->key_prefix_len-1] != '/')
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
427 str_append_c(ctx->key, '/');
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
428
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
429 count = sql_result_get_fields_count(ctx->result);
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
430 i = 1;
8265
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
431 for (p = ctx->map->pattern + ctx->pattern_prefix_len; *p != '\0'; p++) {
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
432 if (*p != '$')
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
433 str_append_c(ctx->key, *p);
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
434 else {
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
435 i_assert(i < count);
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
436 str_append(ctx->key,
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
437 sql_result_get_field_value(ctx->result, i));
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
438 i++;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
439 }
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
440 }
7821
654cd4d966be dict sql: Iterated keys need to contain private/shared prefix.
Timo Sirainen <tss@iki.fi>
parents: 7819
diff changeset
441
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
442 *key_r = str_c(ctx->key);
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
443 *value_r = sql_result_get_field_value(ctx->result, 0);
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
444 return 1;
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
445 }
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
446
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
447 static void sql_dict_iterate_deinit(struct dict_iterate_context *_ctx)
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
448 {
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
449 struct sql_dict_iterate_context *ctx =
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
450 (struct sql_dict_iterate_context *)_ctx;
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
451
8265
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
452 if (ctx->result != NULL)
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
453 sql_result_free(ctx->result);
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
454 str_free(&ctx->key);
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
455 i_free(ctx->path);
3787
40600601502e Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents: 3737
diff changeset
456 i_free(ctx);
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
457 }
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
458
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
459 static struct dict_transaction_context *
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
460 sql_dict_transaction_init(struct dict *_dict)
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
461 {
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
462 struct sql_dict *dict = (struct sql_dict *)_dict;
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
463 struct sql_dict_transaction_context *ctx;
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
464
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
465 ctx = i_new(struct sql_dict_transaction_context, 1);
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
466 ctx->ctx.dict = _dict;
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
467 ctx->sql_ctx = sql_transaction_begin(dict->db);
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
468
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
469 return &ctx->ctx;
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
470 }
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
471
9361
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
472 static int
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
473 sql_dict_transaction_commit(struct dict_transaction_context *_ctx,
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
474 bool async ATTR_UNUSED,
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
475 dict_transaction_commit_callback_t *callback,
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
476 void *context)
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
477 {
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
478 struct sql_dict_transaction_context *ctx =
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
479 (struct sql_dict_transaction_context *)_ctx;
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
480 const char *error;
9361
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
481 int ret = 1;
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
482
8647
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
483 if (ctx->prev_inc_map != NULL)
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
484 sql_dict_prev_inc_flush(ctx);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
485
4511
3f808dd8f568 If invalid key is given to dict_set() or dict_atomic_inc() fail the whole
Timo Sirainen <tss@iki.fi>
parents: 4371
diff changeset
486 if (ctx->failed) {
3f808dd8f568 If invalid key is given to dict_set() or dict_atomic_inc() fail the whole
Timo Sirainen <tss@iki.fi>
parents: 4371
diff changeset
487 sql_transaction_rollback(&ctx->sql_ctx);
3f808dd8f568 If invalid key is given to dict_set() or dict_atomic_inc() fail the whole
Timo Sirainen <tss@iki.fi>
parents: 4371
diff changeset
488 ret = -1;
3f808dd8f568 If invalid key is given to dict_set() or dict_atomic_inc() fail the whole
Timo Sirainen <tss@iki.fi>
parents: 4371
diff changeset
489 } else if (_ctx->changed) {
9361
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
490 if (sql_transaction_commit_s(&ctx->sql_ctx, &error) < 0) {
4511
3f808dd8f568 If invalid key is given to dict_set() or dict_atomic_inc() fail the whole
Timo Sirainen <tss@iki.fi>
parents: 4371
diff changeset
491 i_error("sql dict: commit failed: %s", error);
9361
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
492 ret = -1;
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
493 } else {
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
494 while (ctx->inc_row != NULL) {
9377
35c5f8d064f5 Compiler warning fixes.
Timo Sirainen <tss@iki.fi>
parents: 9361
diff changeset
495 i_assert(ctx->inc_row->rows != -1U);
9361
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
496 if (ctx->inc_row->rows == 0) {
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
497 ret = 0;
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
498 break;
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
499 }
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
500 ctx->inc_row = ctx->inc_row->prev;
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
501 }
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
502 }
4511
3f808dd8f568 If invalid key is given to dict_set() or dict_atomic_inc() fail the whole
Timo Sirainen <tss@iki.fi>
parents: 4371
diff changeset
503 }
9361
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
504 if (ctx->inc_row_pool != NULL)
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
505 pool_unref(&ctx->inc_row_pool);
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
506 i_free(ctx->prev_inc_key);
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
507 i_free(ctx);
9361
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
508
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
509 if (callback != NULL)
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
510 callback(ret, context);
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
511 return ret;
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
512 }
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
513
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
514 static void sql_dict_transaction_rollback(struct dict_transaction_context *_ctx)
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
515 {
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
516 struct sql_dict_transaction_context *ctx =
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
517 (struct sql_dict_transaction_context *)_ctx;
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
518
4511
3f808dd8f568 If invalid key is given to dict_set() or dict_atomic_inc() fail the whole
Timo Sirainen <tss@iki.fi>
parents: 4371
diff changeset
519 if (_ctx->changed)
3f808dd8f568 If invalid key is given to dict_set() or dict_atomic_inc() fail the whole
Timo Sirainen <tss@iki.fi>
parents: 4371
diff changeset
520 sql_transaction_rollback(&ctx->sql_ctx);
9361
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
521
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
522 if (ctx->inc_row_pool != NULL)
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
523 pool_unref(&ctx->inc_row_pool);
8647
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
524 i_free(ctx->prev_inc_key);
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
525 i_free(ctx);
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
526 }
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
527
8647
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
528 struct dict_sql_build_query_field {
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
529 const struct dict_sql_map *map;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
530 const char *value;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
531 };
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
532
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
533 struct dict_sql_build_query {
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
534 struct sql_dict *dict;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
535
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
536 ARRAY_DEFINE(fields, struct dict_sql_build_query_field);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
537 const ARRAY_TYPE(const_string) *extra_values;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
538 char key1;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
539 bool inc;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
540 };
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
541
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
542 static const char *sql_dict_set_query(const struct dict_sql_build_query *build)
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
543 {
8647
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
544 struct sql_dict *dict = build->dict;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
545 const struct dict_sql_build_query_field *fields;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
546 const char *const *sql_fields, *const *extra_values;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
547 unsigned int i, field_count, count, count2;
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
548 string_t *prefix, *suffix;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
549
8647
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
550 fields = array_get(&build->fields, &field_count);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
551 i_assert(field_count > 0);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
552
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
553 prefix = t_str_new(64);
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
554 suffix = t_str_new(256);
8647
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
555 str_printfa(prefix, "INSERT INTO %s (", fields[0].map->table);
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
556 str_append(suffix, ") VALUES (");
8647
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
557 for (i = 0; i < field_count; i++) {
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
558 if (i > 0) {
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
559 str_append_c(prefix, ',');
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
560 str_append_c(suffix, ',');
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
561 }
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
562 str_append(prefix, fields[i].map->value_field);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
563 if (build->inc)
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
564 str_append(suffix, fields[i].value);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
565 else {
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
566 str_printfa(suffix, "'%s'",
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
567 sql_escape_string(dict->db, fields[i].value));
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
568 }
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
569 }
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
570 if (build->key1 == DICT_PATH_PRIVATE[0]) {
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
571 str_printfa(prefix, ",%s", fields[0].map->username_field);
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
572 str_printfa(suffix, ",'%s'",
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
573 sql_escape_string(dict->db, dict->username));
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
574 }
7966
54225d0b6e2b dict-sql: Only MySQL supports "INSERT .. ON DUPLICATE KEY". With others just
Timo Sirainen <tss@iki.fi>
parents: 7821
diff changeset
575
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
576 /* add the other fields from the key */
8647
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
577 sql_fields = array_get(&fields[0].map->sql_fields, &count);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
578 extra_values = array_get(build->extra_values, &count2);
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
579 i_assert(count == count2);
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
580 for (i = 0; i < count; i++) {
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
581 str_printfa(prefix, ",%s", sql_fields[i]);
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
582 str_printfa(suffix, ",'%s'",
8647
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
583 sql_escape_string(dict->db, extra_values[i]));
3967
6fabe878c46d Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents: 3943
diff changeset
584 }
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
585
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
586 str_append_str(prefix, suffix);
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
587 str_append_c(prefix, ')');
8647
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
588 if (!dict->has_on_duplicate_key)
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
589 return str_c(prefix);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
590
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
591 str_append(prefix, " ON DUPLICATE KEY UPDATE ");
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
592 for (i = 0; i < field_count; i++) {
8654
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
593 if (i > 0)
8647
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
594 str_append_c(prefix, ',');
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
595 str_append(prefix, fields[i].map->value_field);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
596 str_append_c(prefix, '=');
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
597 if (build->inc) {
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
598 str_printfa(prefix, "%s+%s",
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
599 fields[i].map->value_field,
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
600 fields[i].value);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
601 } else {
8654
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
602 str_printfa(prefix, "'%s'",
8647
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
603 sql_escape_string(dict->db, fields[i].value));
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
604 }
7966
54225d0b6e2b dict-sql: Only MySQL supports "INSERT .. ON DUPLICATE KEY". With others just
Timo Sirainen <tss@iki.fi>
parents: 7821
diff changeset
605 }
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
606 return str_c(prefix);
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
607 }
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
608
8654
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
609 static const char *
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
610 sql_dict_update_query(const struct dict_sql_build_query *build)
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
611 {
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
612 struct sql_dict *dict = build->dict;
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
613 const struct dict_sql_build_query_field *fields;
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
614 unsigned int i, field_count;
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
615 string_t *query;
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
616
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
617 i_assert(build->inc);
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
618
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
619 fields = array_get(&build->fields, &field_count);
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
620 i_assert(field_count > 0);
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
621
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
622 query = t_str_new(64);
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
623 str_printfa(query, "UPDATE %s SET ", fields[0].map->table);
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
624 for (i = 0; i < field_count; i++) {
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
625 if (i > 0)
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
626 str_append_c(query, ',');
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
627 str_printfa(query, "%s=%s", fields[i].map->value_field,
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
628 fields[i].map->value_field);
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
629 if (fields[i].value[0] != '-')
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
630 str_append_c(query, '+');
9361
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
631 str_append(query, fields[i].value);
8654
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
632 }
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
633
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
634 sql_dict_where_build(dict, fields[0].map, build->extra_values,
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
635 build->key1, SQL_DICT_RECURSE_NONE, query);
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
636 return str_c(query);
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
637 }
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
638
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6480
diff changeset
639 static void sql_dict_set(struct dict_transaction_context *_ctx,
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6480
diff changeset
640 const char *key, const char *value)
4516
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4511
diff changeset
641 {
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4511
diff changeset
642 struct sql_dict_transaction_context *ctx =
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4511
diff changeset
643 (struct sql_dict_transaction_context *)_ctx;
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4511
diff changeset
644 struct sql_dict *dict = (struct sql_dict *)_ctx->dict;
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
645 const struct dict_sql_map *map;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
646 ARRAY_TYPE(const_string) values;
4516
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4511
diff changeset
647
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
648 map = sql_dict_find_map(dict, key, &values);
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
649 if (map == NULL) {
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
650 i_error("sql dict set: Invalid/unmapped key: %s", key);
4516
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4511
diff changeset
651 ctx->failed = TRUE;
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4511
diff changeset
652 return;
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4511
diff changeset
653 }
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4511
diff changeset
654
8647
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
655 if (ctx->prev_inc_map != NULL)
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
656 sql_dict_prev_inc_flush(ctx);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
657
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
658 T_BEGIN {
8647
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
659 struct dict_sql_build_query build;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
660 struct dict_sql_build_query_field field;
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6480
diff changeset
661 const char *query;
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6480
diff changeset
662
8647
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
663 field.map = map;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
664 field.value = value;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
665
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
666 memset(&build, 0, sizeof(build));
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
667 build.dict = dict;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
668 t_array_init(&build.fields, 1);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
669 array_append(&build.fields, &field, 1);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
670 build.extra_values = &values;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
671 build.key1 = key[0];
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
672
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
673 query = sql_dict_set_query(&build);
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6480
diff changeset
674 sql_update(ctx->sql_ctx, query);
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
675 } T_END;
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6480
diff changeset
676 }
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6480
diff changeset
677
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6480
diff changeset
678 static void sql_dict_unset(struct dict_transaction_context *_ctx,
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6480
diff changeset
679 const char *key)
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6480
diff changeset
680 {
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6480
diff changeset
681 struct sql_dict_transaction_context *ctx =
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6480
diff changeset
682 (struct sql_dict_transaction_context *)_ctx;
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6480
diff changeset
683 struct sql_dict *dict = (struct sql_dict *)_ctx->dict;
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
684 const struct dict_sql_map *map;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
685 ARRAY_TYPE(const_string) values;
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6480
diff changeset
686
8647
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
687 if (ctx->prev_inc_map != NULL)
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
688 sql_dict_prev_inc_flush(ctx);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
689
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
690 map = sql_dict_find_map(dict, key, &values);
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
691 if (map == NULL) {
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
692 i_error("sql dict unset: Invalid/unmapped key: %s", key);
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6480
diff changeset
693 ctx->failed = TRUE;
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6480
diff changeset
694 return;
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6480
diff changeset
695 }
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6480
diff changeset
696
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
697 T_BEGIN {
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
698 string_t *query = t_str_new(256);
7966
54225d0b6e2b dict-sql: Only MySQL supports "INSERT .. ON DUPLICATE KEY". With others just
Timo Sirainen <tss@iki.fi>
parents: 7821
diff changeset
699
8265
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
700 str_printfa(query, "DELETE FROM %s", map->table);
8654
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
701 sql_dict_where_build(dict, map, &values, key[0],
8265
72b7277aefb3 dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents: 8113
diff changeset
702 SQL_DICT_RECURSE_NONE, query);
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
703 sql_update(ctx->sql_ctx, str_c(query));
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
704 } T_END;
4516
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4511
diff changeset
705 }
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4511
diff changeset
706
9361
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
707 static unsigned int *
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
708 sql_dict_next_inc_row(struct sql_dict_transaction_context *ctx)
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
709 {
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
710 struct sql_dict_inc_row *row;
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
711
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
712 if (ctx->inc_row_pool == NULL) {
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
713 ctx->inc_row_pool =
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
714 pool_alloconly_create("sql dict inc rows", 128);
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
715 }
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
716 row = p_new(ctx->inc_row_pool, struct sql_dict_inc_row, 1);
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
717 row->prev = ctx->inc_row;
9377
35c5f8d064f5 Compiler warning fixes.
Timo Sirainen <tss@iki.fi>
parents: 9361
diff changeset
718 row->rows = -1U;
9361
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
719 ctx->inc_row = row;
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
720 return &row->rows;
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
721 }
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
722
8647
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
723 static void sql_dict_atomic_inc_real(struct sql_dict_transaction_context *ctx,
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
724 const char *key, long long diff)
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
725 {
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
726 struct sql_dict *dict = (struct sql_dict *)ctx->ctx.dict;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
727 const struct dict_sql_map *map;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
728 ARRAY_TYPE(const_string) values;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
729
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
730 map = sql_dict_find_map(dict, key, &values);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
731 i_assert(map != NULL);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
732
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
733 T_BEGIN {
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
734 struct dict_sql_build_query build;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
735 struct dict_sql_build_query_field field;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
736
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
737 field.map = map;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
738 field.value = t_strdup_printf("%lld", diff);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
739
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
740 memset(&build, 0, sizeof(build));
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
741 build.dict = dict;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
742 t_array_init(&build.fields, 1);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
743 array_append(&build.fields, &field, 1);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
744 build.extra_values = &values;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
745 build.key1 = key[0];
8654
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
746 build.inc = TRUE;
8647
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
747
9361
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
748 sql_update_get_rows(ctx->sql_ctx, sql_dict_update_query(&build),
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
749 sql_dict_next_inc_row(ctx));
8647
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
750 } T_END;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
751 }
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
752
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
753 static void sql_dict_prev_inc_flush(struct sql_dict_transaction_context *ctx)
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
754 {
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
755 sql_dict_atomic_inc_real(ctx, ctx->prev_inc_key, ctx->prev_inc_diff);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
756 i_free_and_null(ctx->prev_inc_key);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
757 ctx->prev_inc_map = NULL;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
758 }
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
759
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
760 static bool
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
761 sql_dict_maps_are_mergeable(struct sql_dict *dict,
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
762 const struct dict_sql_map *map1,
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
763 const struct dict_sql_map *map2,
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
764 const char *map1_key, const char *map2_key,
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
765 const ARRAY_TYPE(const_string) *map2_values)
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
766 {
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
767 const struct dict_sql_map *map3;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
768 ARRAY_TYPE(const_string) map1_values;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
769 const char *const *v1, *const *v2;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
770 unsigned int i, count1, count2;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
771
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
772 if (strcmp(map1->table, map2->table) != 0)
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
773 return FALSE;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
774 if (map1_key[0] != map2_key[0])
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
775 return FALSE;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
776 if (map1_key[0] == DICT_PATH_PRIVATE[0]) {
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
777 if (strcmp(map1->username_field, map2->username_field) != 0)
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
778 return FALSE;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
779 }
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
780
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
781 map3 = sql_dict_find_map(dict, map1_key, &map1_values);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
782 i_assert(map3 == map1);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
783
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
784 v1 = array_get(&map1_values, &count1);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
785 v2 = array_get(map2_values, &count2);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
786 if (count1 != count2)
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
787 return FALSE;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
788
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
789 for (i = 0; i < count1; i++) {
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
790 if (strcmp(v1[i], v2[i]) != 0)
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
791 return FALSE;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
792 }
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
793 return TRUE;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
794 }
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
795
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
796 static void sql_dict_atomic_inc(struct dict_transaction_context *_ctx,
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
797 const char *key, long long diff)
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
798 {
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
799 struct sql_dict_transaction_context *ctx =
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
800 (struct sql_dict_transaction_context *)_ctx;
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
801 struct sql_dict *dict = (struct sql_dict *)_ctx->dict;
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
802 const struct dict_sql_map *map;
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
803 ARRAY_TYPE(const_string) values;
3967
6fabe878c46d Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents: 3943
diff changeset
804
8113
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
805 map = sql_dict_find_map(dict, key, &values);
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
806 if (map == NULL) {
2d3e942a4cde dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents: 7966
diff changeset
807 i_error("sql dict atomic inc: Invalid/unmapped key: %s", key);
4511
3f808dd8f568 If invalid key is given to dict_set() or dict_atomic_inc() fail the whole
Timo Sirainen <tss@iki.fi>
parents: 4371
diff changeset
808 ctx->failed = TRUE;
3967
6fabe878c46d Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents: 3943
diff changeset
809 return;
4511
3f808dd8f568 If invalid key is given to dict_set() or dict_atomic_inc() fail the whole
Timo Sirainen <tss@iki.fi>
parents: 4371
diff changeset
810 }
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
811
8647
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
812 if (ctx->prev_inc_map == NULL) {
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
813 /* see if we can merge this increment SQL query with the
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
814 next one */
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
815 ctx->prev_inc_map = map;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
816 ctx->prev_inc_key = i_strdup(key);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
817 ctx->prev_inc_diff = diff;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
818 return;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
819 }
9361
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
820
8647
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
821 if (!sql_dict_maps_are_mergeable(dict, ctx->prev_inc_map, map,
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
822 ctx->prev_inc_key, key, &values)) {
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
823 sql_dict_prev_inc_flush(ctx);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
824 sql_dict_atomic_inc_real(ctx, key, diff);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
825 } else T_BEGIN {
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
826 struct dict_sql_build_query build;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
827 struct dict_sql_build_query_field *field;
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6480
diff changeset
828
8647
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
829 memset(&build, 0, sizeof(build));
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
830 build.dict = dict;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
831 t_array_init(&build.fields, 1);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
832 build.extra_values = &values;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
833 build.key1 = key[0];
8654
abb1a50a266d pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents: 8647
diff changeset
834 build.inc = TRUE;
8647
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
835
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
836 field = array_append_space(&build.fields);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
837 field->map = ctx->prev_inc_map;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
838 field->value = t_strdup_printf("%lld", ctx->prev_inc_diff);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
839 field = array_append_space(&build.fields);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
840 field->map = map;
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
841 field->value = t_strdup_printf("%lld", diff);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
842
9361
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
843 sql_update_get_rows(ctx->sql_ctx, sql_dict_update_query(&build),
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
844 sql_dict_next_inc_row(ctx));
8647
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
845
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
846 i_free_and_null(ctx->prev_inc_key);
cc46e5822b96 sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
847 ctx->prev_inc_map = NULL;
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
848 } T_END;
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
849 }
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
850
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
851 static struct dict sql_dict = {
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
852 MEMBER(name) "sql",
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
853
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
854 {
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
855 sql_dict_init,
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
856 sql_dict_deinit,
9361
a1b92a251bb9 dict: Added support for async commits. Changed dict_atomic_inc() behavior.
Timo Sirainen <tss@iki.fi>
parents: 9174
diff changeset
857 NULL,
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
858 sql_dict_lookup,
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
859 sql_dict_iterate_init,
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
860 sql_dict_iterate,
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
861 sql_dict_iterate_deinit,
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
862 sql_dict_transaction_init,
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
863 sql_dict_transaction_commit,
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
864 sql_dict_transaction_rollback,
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
865 sql_dict_set,
4516
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4511
diff changeset
866 sql_dict_unset,
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
867 sql_dict_atomic_inc
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
868 }
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
869 };
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
870
4517
e661182eab75 Berkeley DB dict support is now enabled only when using --with-db configure option.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4516
diff changeset
871 static struct dict *dict_sql_drivers;
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
872
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
873 void dict_sql_register(void)
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
874 {
3943
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
875 const struct sql_db *const *drivers;
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
876 unsigned int i, count;
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
877
6480
7596339a9452 Use SQL connection pools.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
878 dict_sql_pool = sql_pool_init(DICT_SQL_MAX_UNUSED_CONNECTIONS);
7596339a9452 Use SQL connection pools.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
879
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
880 /* @UNSAFE */
3943
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
881 drivers = array_get(&sql_drivers, &count);
4517
e661182eab75 Berkeley DB dict support is now enabled only when using --with-db configure option.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4516
diff changeset
882 dict_sql_drivers = i_new(struct dict, count + 1);
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
883
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
884 for (i = 0; i < count; i++) {
4517
e661182eab75 Berkeley DB dict support is now enabled only when using --with-db configure option.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4516
diff changeset
885 dict_sql_drivers[i] = sql_dict;
e661182eab75 Berkeley DB dict support is now enabled only when using --with-db configure option.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4516
diff changeset
886 dict_sql_drivers[i].name = drivers[i]->name;
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
887
4517
e661182eab75 Berkeley DB dict support is now enabled only when using --with-db configure option.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4516
diff changeset
888 dict_driver_register(&dict_sql_drivers[i]);
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
889 }
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
890 }
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
891
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
892 void dict_sql_unregister(void)
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
893 {
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
894 int i;
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
895
4517
e661182eab75 Berkeley DB dict support is now enabled only when using --with-db configure option.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4516
diff changeset
896 for (i = 0; dict_sql_drivers[i].name != NULL; i++)
e661182eab75 Berkeley DB dict support is now enabled only when using --with-db configure option.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4516
diff changeset
897 dict_driver_unregister(&dict_sql_drivers[i]);
e661182eab75 Berkeley DB dict support is now enabled only when using --with-db configure option.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4516
diff changeset
898 i_free(dict_sql_drivers);
6480
7596339a9452 Use SQL connection pools.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
899 sql_pool_deinit(&dict_sql_pool);
3737
d67092398377 Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
900 }