Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib-dict/dict-sql.c @ 9174:eed86bcc33aa HEAD
dict proxy: Use base_dir as the default dict-server location.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 27 Jun 2009 22:08:33 -0400 |
parents | 6ee78e18d026 |
children | a1b92a251bb9 |
rev | line source |
---|---|
8590
b9faf4db2a9f
Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents:
8281
diff
changeset
|
1 /* Copyright (c) 2005-2009 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 | 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 | 16 #define DICT_SQL_MAX_UNUSED_CONNECTIONS 10 |
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 |
3787
40600601502e
Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents:
3737
diff
changeset
|
47 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
|
48 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
|
49 |
40600601502e
Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents:
3737
diff
changeset
|
50 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
|
51 |
8647
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
52 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
|
53 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
|
54 long long prev_inc_diff; |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
55 |
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 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
|
57 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
|
58 }; |
40600601502e
Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents:
3737
diff
changeset
|
59 |
6480 | 60 static struct sql_pool *dict_sql_pool; |
61 | |
8647
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
62 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
|
63 |
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
|
64 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
|
65 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
|
66 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
|
67 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
|
68 { |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 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
|
70 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
|
71 |
8685
6ee78e18d026
Increased some initial memory pool sizes.
Timo Sirainen <tss@iki.fi>
parents:
8660
diff
changeset
|
72 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
|
73 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
|
74 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
|
75 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
|
76 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
|
77 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
|
78 if (dict->set == NULL) { |
6428
7cad076906eb
pool_unref() now takes ** pointer.
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
79 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
|
80 return NULL; |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 |
7966
54225d0b6e2b
dict-sql: Only MySQL supports "INSERT .. ON DUPLICATE KEY". With others just
Timo Sirainen <tss@iki.fi>
parents:
7821
diff
changeset
|
83 /* 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
|
84 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
|
85 |
6480 | 86 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
|
87 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
|
88 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
|
89 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 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
|
92 { |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 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
|
94 |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
95 sql_deinit(&dict->db); |
6428
7cad076906eb
pool_unref() now takes ** pointer.
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
96 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
|
97 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 |
8113
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
99 static bool |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
100 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
|
101 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
|
102 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
|
103 { |
8265
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
104 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
|
105 const char *pat, *field, *p; |
8265
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
106 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
|
107 |
8113
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
108 array_clear(values); |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
109 pat = map->pattern; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
110 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
|
111 if (*pat == '$') { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
112 /* variable */ |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
113 pat++; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
114 if (*pat == '\0') { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
115 /* 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
|
116 it'll match the rest of the path */ |
8265
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
117 len = strlen(path); |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
118 if (partial_ok) { |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
119 /* iterating - the last field never |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
120 matches fully. if there's a trailing |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
121 '/', drop it. */ |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
122 pat--; |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
123 if (path[len-1] == '/') { |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
124 field = t_strndup(path, len-1); |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
125 array_append(values, &field, 1); |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
126 } else { |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
127 array_append(values, &path, 1); |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
128 } |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
129 } else { |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
130 array_append(values, &path, 1); |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
131 path += len; |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
132 } |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
133 *path_len_r = path - path_start; |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
134 *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
|
135 return TRUE; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
136 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
137 /* 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
|
138 p = strchr(path, '/'); |
8265
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
139 if (p != NULL) { |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
140 field = t_strdup_until(path, p); |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
141 array_append(values, &field, 1); |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
142 path = p; |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
143 } else { |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
144 /* no '/' anymore, but it'll still match a |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
145 partial */ |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
146 array_append(values, &path, 1); |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
147 path += strlen(path); |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
148 pat++; |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
149 } |
8113
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
150 } 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
|
151 pat++; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
152 path++; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
153 } else { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
154 return FALSE; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
155 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
156 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
157 if (*pat == '\0') |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
158 return *path == '\0'; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
159 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
|
160 return FALSE; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
161 else { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
162 /* partial matches must end with '/' */ |
8265
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
163 *path_len_r = path - path_start; |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
164 *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
|
165 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
|
166 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
167 } |
3967
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
168 |
8113
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
169 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
|
170 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
|
171 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
|
172 { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
173 const struct dict_sql_map *maps; |
8265
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
174 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
|
175 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
176 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
|
177 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
|
178 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
|
179 /* 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
|
180 idx = (dict->prev_map_match_idx + i) % count; |
8265
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
181 if (dict_sql_map_match(&maps[idx], path, values, |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
182 &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
|
183 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
|
184 return &maps[idx]; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
185 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
186 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
187 return NULL; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
188 } |
3967
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
189 |
8113
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
190 static void |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
191 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
|
192 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
|
193 char key1, enum sql_recurse_type recurse_type, |
8265
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
194 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
|
195 { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
196 const char *const *sql_fields, *const *values; |
8265
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
197 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
|
198 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
|
199 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
200 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
|
201 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
|
202 /* 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
|
203 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
|
204 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
205 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
|
206 /* we want everything */ |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
207 return; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
208 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
209 |
8265
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
210 str_append(query, " WHERE"); |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
211 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
|
212 count2-1 : count2; |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
213 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
|
214 if (i > 0) |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
215 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
|
216 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
|
217 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
|
218 } |
8265
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
219 switch (recurse_type) { |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
220 case SQL_DICT_RECURSE_NONE: |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
221 break; |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
222 case SQL_DICT_RECURSE_ONE: |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
223 if (i > 0) |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
224 str_append(query, " AND"); |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
225 if (i < count2) { |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
226 str_printfa(query, " %s LIKE '%s/%%' AND " |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
227 "%s NOT LIKE '%s/%%/%%'", |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
228 sql_fields[i], |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
229 sql_escape_string(dict->db, values[i]), |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
230 sql_fields[i], |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
231 sql_escape_string(dict->db, values[i])); |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
232 } else { |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
233 str_printfa(query, " %s LIKE '%%' AND " |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
234 "%s NOT LIKE '%%/%%'", |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
235 sql_fields[i], sql_fields[i]); |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
236 } |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
237 break; |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
238 case SQL_DICT_RECURSE_FULL: |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
239 if (i < count2) { |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
240 if (i > 0) |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
241 str_append(query, " AND"); |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
242 str_printfa(query, " %s LIKE '%s/%%'", sql_fields[i], |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
243 sql_escape_string(dict->db, values[i])); |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
244 } |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
245 break; |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
246 } |
8113
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
247 if (priv) { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
248 if (count2 > 0) |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
249 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
|
250 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
|
251 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
|
252 } |
3967
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
253 } |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
254 |
3787
40600601502e
Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents:
3737
diff
changeset
|
255 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
|
256 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
|
257 { |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
258 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
|
259 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
|
260 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
|
261 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
|
262 int ret; |
3967
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
263 |
8113
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
264 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
|
265 if (map == NULL) { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
266 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
|
267 *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
|
268 return 0; |
3967
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
269 } |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
270 |
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
|
271 T_BEGIN { |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6480
diff
changeset
|
272 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
|
273 |
8265
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
274 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
|
275 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
|
276 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
|
277 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
|
278 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
|
279 } 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
|
280 |
3787
40600601502e
Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents:
3737
diff
changeset
|
281 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
|
282 if (ret <= 0) { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
283 if (ret < 0) { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
284 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
|
285 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
|
286 } |
3787
40600601502e
Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents:
3737
diff
changeset
|
287 *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
|
288 } else { |
3787
40600601502e
Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents:
3737
diff
changeset
|
289 *value_r = |
40600601502e
Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents:
3737
diff
changeset
|
290 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
|
291 } |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
292 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
293 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
|
294 return ret; |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
295 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
296 |
8113
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
297 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
|
298 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
|
299 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
|
300 { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
301 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
|
302 const struct dict_sql_map *maps; |
8265
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
303 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
|
304 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
305 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
|
306 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
|
307 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
|
308 if (dict_sql_map_match(&maps[i], ctx->path, |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
309 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
|
310 ((ctx->flags & DICT_ITERATE_FLAG_RECURSE) != 0 || |
8265
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
311 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
|
312 ctx->key_prefix_len = path_len; |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
313 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
|
314 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
|
315 return &maps[i]; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
316 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
317 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
318 return NULL; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
319 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
320 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
321 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
|
322 { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
323 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
|
324 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
|
325 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
|
326 const char *const *sql_fields; |
8265
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
327 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
|
328 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
|
329 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
330 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
|
331 if (map == NULL) |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
332 return FALSE; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
333 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
334 T_BEGIN { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
335 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
|
336 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
337 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
|
338 /* 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
|
339 sql_fields = array_get(&map->sql_fields, &count); |
8265
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
340 i = array_count(&values); |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
341 if (i == count) { |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
342 /* 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
|
343 iterating its children */ |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
344 i_assert(i > 0); |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
345 i--; |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
346 } |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
347 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
|
348 str_printfa(query, ",%s", sql_fields[i]); |
8265
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
349 str_printfa(query, " FROM %s", map->table); |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
350 |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
351 recurse_type = (ctx->flags & DICT_ITERATE_FLAG_RECURSE) == 0 ? |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
352 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
|
353 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
|
354 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
|
355 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
356 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
|
357 str_append(query, " ORDER BY "); |
8281
3e34e1816ac1
dict-sql: Fixed sorting by key.
Timo Sirainen <tss@iki.fi>
parents:
8278
diff
changeset
|
358 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
|
359 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
|
360 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
|
361 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
|
362 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
363 } 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
|
364 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
|
365 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
|
366 } T_END; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
367 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
368 ctx->map = map; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
369 return TRUE; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
370 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
371 |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
372 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
|
373 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
|
374 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
|
375 { |
7819
59ec9752c3dd
Fixed dict iteration with SQL backend.
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
376 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
|
377 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
378 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
|
379 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
|
380 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
|
381 ctx->flags = flags; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
382 ctx->key = str_new(default_pool, 256); |
8265
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
383 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
|
384 |
8113
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
385 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
|
386 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
|
387 ctx->result = NULL; |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6480
diff
changeset
|
388 return &ctx->ctx; |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6480
diff
changeset
|
389 } |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
390 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
|
391 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
392 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
393 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
|
394 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
|
395 { |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
396 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
|
397 (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
|
398 const char *p; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
399 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
|
400 int ret; |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
401 |
3967
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
402 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
|
403 return -1; |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
404 |
8113
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
405 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
|
406 /* 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
|
407 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
|
408 return 0; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
409 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
410 if (ret < 0) { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
411 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
|
412 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
|
413 return ret; |
8113
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
414 } |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
415 |
8113
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
416 /* 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
|
417 str_truncate(ctx->key, ctx->key_prefix_len); |
8265
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
418 if (ctx->key_prefix_len > 0 && |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
419 str_c(ctx->key)[ctx->key_prefix_len-1] != '/') |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
420 str_append_c(ctx->key, '/'); |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
421 |
8113
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
422 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
|
423 i = 1; |
8265
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
424 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
|
425 if (*p != '$') |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
426 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
|
427 else { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
428 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
|
429 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
|
430 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
|
431 i++; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
432 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
433 } |
7821
654cd4d966be
dict sql: Iterated keys need to contain private/shared prefix.
Timo Sirainen <tss@iki.fi>
parents:
7819
diff
changeset
|
434 |
8113
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
435 *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
|
436 *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
|
437 return 1; |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
438 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
439 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
440 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
|
441 { |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
442 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
|
443 (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
|
444 |
8265
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
445 if (ctx->result != NULL) |
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
446 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
|
447 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
|
448 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
|
449 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
|
450 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
451 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
452 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
|
453 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
|
454 { |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
455 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
|
456 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
|
457 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
458 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
|
459 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
|
460 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
|
461 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
462 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
|
463 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
464 |
8660
d8a56ea9f408
Added dict_transaction_commit_async().
Timo Sirainen <tss@iki.fi>
parents:
8654
diff
changeset
|
465 static int sql_dict_transaction_commit(struct dict_transaction_context *_ctx, |
d8a56ea9f408
Added dict_transaction_commit_async().
Timo Sirainen <tss@iki.fi>
parents:
8654
diff
changeset
|
466 bool async 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
|
467 { |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
468 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
|
469 (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
|
470 const char *error; |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
471 int ret; |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
472 |
8647
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
473 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
|
474 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
|
475 |
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
|
476 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
|
477 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
|
478 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
|
479 } else 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
|
480 ret = sql_transaction_commit_s(&ctx->sql_ctx, &error); |
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
|
481 if (ret < 0) |
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
|
482 i_error("sql dict: commit failed: %s", error); |
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
|
483 } else { |
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
|
484 /* nothing to be done */ |
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
|
485 ret = 0; |
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 } |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
487 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
|
488 return ret; |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
489 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
490 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
491 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
|
492 { |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
493 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
|
494 (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
|
495 |
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
|
496 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
|
497 sql_transaction_rollback(&ctx->sql_ctx); |
8647
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
498 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
|
499 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
|
500 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
501 |
8647
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
502 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
|
503 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
|
504 const char *value; |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
505 }; |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
506 |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
507 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
|
508 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
|
509 |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
510 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
|
511 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
|
512 char key1; |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
513 bool inc; |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
514 }; |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
515 |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
516 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
|
517 { |
8647
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
518 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
|
519 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
|
520 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
|
521 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
|
522 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
|
523 |
8647
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
524 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
|
525 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
|
526 |
8113
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
527 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
|
528 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
|
529 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
|
530 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
|
531 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
|
532 if (i > 0) { |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
533 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
|
534 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
|
535 } |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
536 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
|
537 if (build->inc) |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
538 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
|
539 else { |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
540 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
|
541 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
|
542 } |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
543 } |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
544 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
|
545 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
|
546 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
|
547 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
|
548 } |
7966
54225d0b6e2b
dict-sql: Only MySQL supports "INSERT .. ON DUPLICATE KEY". With others just
Timo Sirainen <tss@iki.fi>
parents:
7821
diff
changeset
|
549 |
8113
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
550 /* 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
|
551 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
|
552 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
|
553 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
|
554 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
|
555 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
|
556 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
|
557 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
|
558 } |
8113
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
559 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
560 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
|
561 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
|
562 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
|
563 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
|
564 |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
565 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
|
566 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
|
567 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
|
568 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
|
569 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
|
570 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
|
571 if (build->inc) { |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
572 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
|
573 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
|
574 fields[i].value); |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
575 } else { |
8654
abb1a50a266d
pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents:
8647
diff
changeset
|
576 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
|
577 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
|
578 } |
7966
54225d0b6e2b
dict-sql: Only MySQL supports "INSERT .. ON DUPLICATE KEY". With others just
Timo Sirainen <tss@iki.fi>
parents:
7821
diff
changeset
|
579 } |
8113
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
580 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
|
581 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
582 |
8654
abb1a50a266d
pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents:
8647
diff
changeset
|
583 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
|
584 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
|
585 { |
abb1a50a266d
pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents:
8647
diff
changeset
|
586 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
|
587 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
|
588 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
|
589 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
|
590 |
abb1a50a266d
pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents:
8647
diff
changeset
|
591 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
|
592 |
abb1a50a266d
pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents:
8647
diff
changeset
|
593 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
|
594 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
|
595 |
abb1a50a266d
pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents:
8647
diff
changeset
|
596 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
|
597 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
|
598 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
|
599 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
|
600 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
|
601 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
|
602 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
|
603 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
|
604 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
|
605 else |
abb1a50a266d
pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents:
8647
diff
changeset
|
606 str_append(query, fields[i].value); |
abb1a50a266d
pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents:
8647
diff
changeset
|
607 } |
abb1a50a266d
pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents:
8647
diff
changeset
|
608 |
abb1a50a266d
pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents:
8647
diff
changeset
|
609 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
|
610 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
|
611 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
|
612 } |
abb1a50a266d
pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents:
8647
diff
changeset
|
613 |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6480
diff
changeset
|
614 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
|
615 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
|
616 { |
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
|
617 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
|
618 (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
|
619 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
|
620 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
|
621 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
|
622 |
8113
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
623 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
|
624 if (map == NULL) { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
625 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
|
626 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
|
627 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
|
628 } |
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
|
629 |
8647
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
630 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
|
631 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
|
632 |
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
|
633 T_BEGIN { |
8647
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
634 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
|
635 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
|
636 const char *query; |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6480
diff
changeset
|
637 |
8647
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
638 field.map = map; |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
639 field.value = value; |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
640 |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
641 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
|
642 build.dict = dict; |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
643 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
|
644 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
|
645 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
|
646 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
|
647 |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
648 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
|
649 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
|
650 } T_END; |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6480
diff
changeset
|
651 } |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6480
diff
changeset
|
652 |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6480
diff
changeset
|
653 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
|
654 const char *key) |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6480
diff
changeset
|
655 { |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6480
diff
changeset
|
656 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
|
657 (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
|
658 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
|
659 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
|
660 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
|
661 |
8647
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
662 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
|
663 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
|
664 |
8113
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
665 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
|
666 if (map == NULL) { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
667 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
|
668 ctx->failed = TRUE; |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6480
diff
changeset
|
669 return; |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6480
diff
changeset
|
670 } |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6480
diff
changeset
|
671 |
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
|
672 T_BEGIN { |
8113
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
673 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
|
674 |
8265
72b7277aefb3
dict-sql: Dictionary iteration fixes.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
675 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
|
676 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
|
677 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
|
678 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
|
679 } 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
|
680 } |
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
|
681 |
8647
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
682 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
|
683 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
|
684 { |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
685 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
|
686 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
|
687 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
|
688 |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
689 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
|
690 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
|
691 |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
692 T_BEGIN { |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
693 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
|
694 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
|
695 const char *query; |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
696 |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
697 field.map = map; |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
698 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
|
699 |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
700 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
|
701 build.dict = dict; |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
702 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
|
703 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
|
704 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
|
705 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
|
706 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
|
707 |
8654
abb1a50a266d
pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents:
8647
diff
changeset
|
708 if (diff >= 0) |
abb1a50a266d
pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents:
8647
diff
changeset
|
709 query = sql_dict_set_query(&build); |
abb1a50a266d
pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents:
8647
diff
changeset
|
710 else { |
abb1a50a266d
pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents:
8647
diff
changeset
|
711 /* negative changes can't never be initial values, |
abb1a50a266d
pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents:
8647
diff
changeset
|
712 use UPDATE directly. */ |
abb1a50a266d
pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents:
8647
diff
changeset
|
713 query = sql_dict_update_query(&build); |
abb1a50a266d
pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents:
8647
diff
changeset
|
714 } |
8647
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
715 sql_update(ctx->sql_ctx, query); |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
716 } T_END; |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
717 } |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
718 |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
719 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
|
720 { |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
721 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
|
722 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
|
723 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
|
724 } |
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 static bool |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
727 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
|
728 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
|
729 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
|
730 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
|
731 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
|
732 { |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
733 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
|
734 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
|
735 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
|
736 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
|
737 |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
738 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
|
739 return FALSE; |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
740 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
|
741 return FALSE; |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
742 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
|
743 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
|
744 return FALSE; |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
745 } |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
746 |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
747 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
|
748 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
|
749 |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
750 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
|
751 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
|
752 if (count1 != count2) |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
753 return FALSE; |
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 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
|
756 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
|
757 return FALSE; |
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 return TRUE; |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
760 } |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
761 |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
762 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
|
763 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
|
764 { |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
765 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
|
766 (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
|
767 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
|
768 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
|
769 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
|
770 |
8113
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
771 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
|
772 if (map == NULL) { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
7966
diff
changeset
|
773 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
|
774 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
|
775 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
|
776 } |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
777 |
8647
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
778 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
|
779 /* 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
|
780 next one */ |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
781 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
|
782 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
|
783 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
|
784 return; |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
785 } |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
786 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
|
787 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
|
788 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
|
789 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
|
790 } else T_BEGIN { |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
791 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
|
792 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
|
793 const char *query; |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6480
diff
changeset
|
794 |
8647
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
795 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
|
796 build.dict = dict; |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
797 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
|
798 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
|
799 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
|
800 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
|
801 |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
802 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
|
803 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
|
804 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
|
805 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
|
806 field->map = map; |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
807 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
|
808 |
8654
abb1a50a266d
pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents:
8647
diff
changeset
|
809 if (diff >= 0) |
abb1a50a266d
pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents:
8647
diff
changeset
|
810 query = sql_dict_set_query(&build); |
abb1a50a266d
pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents:
8647
diff
changeset
|
811 else { |
abb1a50a266d
pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents:
8647
diff
changeset
|
812 /* negative changes can't never be initial values, |
abb1a50a266d
pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents:
8647
diff
changeset
|
813 use UPDATE directly. */ |
abb1a50a266d
pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents:
8647
diff
changeset
|
814 query = sql_dict_update_query(&build); |
abb1a50a266d
pgsql: When doing negative increments, don't even try to use INSERT.
Timo Sirainen <tss@iki.fi>
parents:
8647
diff
changeset
|
815 } |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6480
diff
changeset
|
816 sql_update(ctx->sql_ctx, query); |
8647
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
817 |
cc46e5822b96
sql dict: Merge two INSERTs together whenever possible (for dict quota).
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
818 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
|
819 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
|
820 } 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
|
821 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
822 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
823 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
|
824 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
|
825 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
826 { |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
827 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
|
828 sql_dict_deinit, |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
829 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
|
830 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
|
831 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
|
832 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
|
833 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
|
834 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
|
835 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
|
836 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
|
837 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
|
838 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
|
839 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
840 }; |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
841 |
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
|
842 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
|
843 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
844 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
|
845 { |
3943
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
846 const struct sql_db *const *drivers; |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
847 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
|
848 |
6480 | 849 dict_sql_pool = sql_pool_init(DICT_SQL_MAX_UNUSED_CONNECTIONS); |
850 | |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
851 /* @UNSAFE */ |
3943
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
852 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
|
853 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
|
854 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
855 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
|
856 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
|
857 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
|
858 |
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
|
859 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
|
860 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
861 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
862 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
863 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
|
864 { |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
865 int i; |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
866 |
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
|
867 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
|
868 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
|
869 i_free(dict_sql_drivers); |
6480 | 870 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
|
871 } |