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