Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib-dict/dict-sql.c @ 3967:6fabe878c46d HEAD
Dictionary takes now a username parameter, which is used for private
queries. Made dict-sql use "insert .. on duplicate key update" syntax, which
unfortunately doesn't work with PostgreSQL yet.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 31 Jan 2006 08:05:21 +0200 |
parents | cbe5c6772e0d |
children | 71b8faa84ec6 |
rev | line source |
---|---|
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1 /* Copyright (C) 2005 Timo Sirainen */ |
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 "strescape.h" |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "sql-api-private.h" |
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" |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 #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
|
11 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 #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
|
13 #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
|
14 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 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
|
16 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
|
17 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 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
|
19 struct sql_db *db; |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 |
3967
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
21 const char *connect_string, *username; |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
22 const char *table, *select_field, *where_field, *username_field; |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 }; |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 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
|
26 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
|
27 |
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_result *result; |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 }; |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 |
3787
40600601502e
Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents:
3737
diff
changeset
|
31 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
|
32 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
|
33 |
40600601502e
Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents:
3737
diff
changeset
|
34 struct sql_transaction_context *sql_ctx; |
40600601502e
Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents:
3737
diff
changeset
|
35 }; |
40600601502e
Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents:
3737
diff
changeset
|
36 |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 static int sql_dict_read_config(struct sql_dict *dict, const char *path) |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 { |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 struct istream *input; |
3849
8d2028705702
Fixed parsing configuration file.
Timo Sirainen <tss@iki.fi>
parents:
3787
diff
changeset
|
40 const char *line, *value, *p; |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 int fd; |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 fd = open(path, O_RDONLY); |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 if (fd == -1) { |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 i_error("open(%s) failed: %m", path); |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 return -1; |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 input = i_stream_create_file(fd, default_pool, (size_t)-1, FALSE); |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 while ((line = i_stream_read_next_line(input)) != NULL) { |
3849
8d2028705702
Fixed parsing configuration file.
Timo Sirainen <tss@iki.fi>
parents:
3787
diff
changeset
|
51 while (*line == ' ') line++; |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 value = strchr(line, '='); |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 if (value == NULL) |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 continue; |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 t_push(); |
3849
8d2028705702
Fixed parsing configuration file.
Timo Sirainen <tss@iki.fi>
parents:
3787
diff
changeset
|
57 for (p = value; p[-1] == ' ' && p != line; p--) ; |
8d2028705702
Fixed parsing configuration file.
Timo Sirainen <tss@iki.fi>
parents:
3787
diff
changeset
|
58 line = t_strdup_until(line, p); |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 value++; |
3849
8d2028705702
Fixed parsing configuration file.
Timo Sirainen <tss@iki.fi>
parents:
3787
diff
changeset
|
60 while (*value == ' ') value++; |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 if (strcmp(line, "connect") == 0) |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 dict->connect_string = p_strdup(dict->pool, value); |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 else if (strcmp(line, "table") == 0) |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 dict->table = p_strdup(dict->pool, value); |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 else if (strcmp(line, "select_field") == 0) |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 dict->select_field = p_strdup(dict->pool, value); |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 else if (strcmp(line, "where_field") == 0) |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 dict->where_field = p_strdup(dict->pool, value); |
3967
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
70 else if (strcmp(line, "username_field") == 0) |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
71 dict->username_field = p_strdup(dict->pool, value); |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 t_pop(); |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 } |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
75 i_stream_unref(&input); |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 (void)close(fd); |
3849
8d2028705702
Fixed parsing configuration file.
Timo Sirainen <tss@iki.fi>
parents:
3787
diff
changeset
|
77 |
8d2028705702
Fixed parsing configuration file.
Timo Sirainen <tss@iki.fi>
parents:
3787
diff
changeset
|
78 if (dict->connect_string == NULL) { |
8d2028705702
Fixed parsing configuration file.
Timo Sirainen <tss@iki.fi>
parents:
3787
diff
changeset
|
79 i_error("%s: 'connect' missing", path); |
8d2028705702
Fixed parsing configuration file.
Timo Sirainen <tss@iki.fi>
parents:
3787
diff
changeset
|
80 return -1; |
8d2028705702
Fixed parsing configuration file.
Timo Sirainen <tss@iki.fi>
parents:
3787
diff
changeset
|
81 } |
8d2028705702
Fixed parsing configuration file.
Timo Sirainen <tss@iki.fi>
parents:
3787
diff
changeset
|
82 if (dict->table == NULL) { |
8d2028705702
Fixed parsing configuration file.
Timo Sirainen <tss@iki.fi>
parents:
3787
diff
changeset
|
83 i_error("%s: 'table' missing", path); |
8d2028705702
Fixed parsing configuration file.
Timo Sirainen <tss@iki.fi>
parents:
3787
diff
changeset
|
84 return -1; |
8d2028705702
Fixed parsing configuration file.
Timo Sirainen <tss@iki.fi>
parents:
3787
diff
changeset
|
85 } |
8d2028705702
Fixed parsing configuration file.
Timo Sirainen <tss@iki.fi>
parents:
3787
diff
changeset
|
86 if (dict->select_field == NULL) { |
8d2028705702
Fixed parsing configuration file.
Timo Sirainen <tss@iki.fi>
parents:
3787
diff
changeset
|
87 i_error("%s: 'select_field' missing", path); |
8d2028705702
Fixed parsing configuration file.
Timo Sirainen <tss@iki.fi>
parents:
3787
diff
changeset
|
88 return -1; |
8d2028705702
Fixed parsing configuration file.
Timo Sirainen <tss@iki.fi>
parents:
3787
diff
changeset
|
89 } |
8d2028705702
Fixed parsing configuration file.
Timo Sirainen <tss@iki.fi>
parents:
3787
diff
changeset
|
90 if (dict->where_field == NULL) { |
8d2028705702
Fixed parsing configuration file.
Timo Sirainen <tss@iki.fi>
parents:
3787
diff
changeset
|
91 i_error("%s: 'where_field' missing", path); |
8d2028705702
Fixed parsing configuration file.
Timo Sirainen <tss@iki.fi>
parents:
3787
diff
changeset
|
92 return -1; |
8d2028705702
Fixed parsing configuration file.
Timo Sirainen <tss@iki.fi>
parents:
3787
diff
changeset
|
93 } |
3967
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
94 if (dict->username_field == NULL) { |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
95 i_error("%s: 'username_field' missing", path); |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
96 return -1; |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
97 } |
3849
8d2028705702
Fixed parsing configuration file.
Timo Sirainen <tss@iki.fi>
parents:
3787
diff
changeset
|
98 |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 return 0; |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 |
3967
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
102 static struct dict *sql_dict_init(struct dict *dict_class, const char *uri, |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
103 const char *username) |
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 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
|
106 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
|
107 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 pool = pool_alloconly_create("sql dict", 1024); |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 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
|
110 dict->pool = pool; |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 dict->dict = *dict_class; |
3967
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
112 dict->username = p_strdup(pool, username); |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 |
3849
8d2028705702
Fixed parsing configuration file.
Timo Sirainen <tss@iki.fi>
parents:
3787
diff
changeset
|
114 if (sql_dict_read_config(dict, uri) < 0) { |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 pool_unref(pool); |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 return NULL; |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 t_push(); |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 dict->db = sql_init(dict_class->name, dict->connect_string); |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 t_pop(); |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 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
|
123 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 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
|
126 { |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 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
|
128 |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
129 sql_deinit(&dict->db); |
3787
40600601502e
Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents:
3737
diff
changeset
|
130 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
|
131 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 |
3967
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
133 static int sql_path_fix(const char **path, bool *private_r) |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
134 { |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
135 const char *p; |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
136 size_t len; |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
137 |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
138 p = strchr(*path, '/'); |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
139 if (p == NULL) |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
140 return -1; |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
141 len = p - *path; |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
142 |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
143 if (strncmp(*path, DICT_PATH_PRIVATE, len) == 0) |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
144 *private_r = TRUE; |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
145 else if (strncmp(*path, DICT_PATH_SHARED, len) == 0) |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
146 *private_r = FALSE; |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
147 else |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
148 return -1; |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
149 |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
150 *path += len + 1; |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
151 return 0; |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
152 } |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
153 |
3787
40600601502e
Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents:
3737
diff
changeset
|
154 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
|
155 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
|
156 { |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
157 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
|
158 struct sql_result *result; |
3967
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
159 string_t *query; |
3787
40600601502e
Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents:
3737
diff
changeset
|
160 int ret; |
3967
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
161 bool priv; |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
162 |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
163 if (sql_path_fix(&key, &priv) < 0) { |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
164 *value_r = NULL; |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
165 return -1; |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
166 } |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 t_push(); |
3967
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
169 query = t_str_new(256); |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
170 str_printfa(query, "SELECT %s FROM %s WHERE %s = '%s'", |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
171 dict->select_field, dict->table, |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
172 dict->where_field, str_escape(key)); |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
173 if (priv) { |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
174 str_printfa(query, " AND %s = '%s'", |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
175 dict->username_field, str_escape(dict->username)); |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
176 } |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
177 result = sql_query_s(dict->db, str_c(query)); |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
178 t_pop(); |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 |
3787
40600601502e
Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents:
3737
diff
changeset
|
180 ret = sql_result_next_row(result); |
40600601502e
Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents:
3737
diff
changeset
|
181 if (ret <= 0) |
40600601502e
Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents:
3737
diff
changeset
|
182 *value_r = NULL; |
40600601502e
Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents:
3737
diff
changeset
|
183 else { |
40600601502e
Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents:
3737
diff
changeset
|
184 *value_r = |
40600601502e
Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents:
3737
diff
changeset
|
185 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
|
186 } |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 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
|
189 return ret; |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
190 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
191 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
192 static struct dict_iterate_context * |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3849
diff
changeset
|
193 sql_dict_iterate_init(struct dict *_dict, const char *path, bool recurse) |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 { |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
195 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
|
196 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
|
197 string_t *query; |
3967
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
198 bool priv; |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
199 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
200 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
|
201 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
|
202 |
3967
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
203 if (sql_path_fix(&path, &priv) < 0) |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
204 ctx->result = NULL; |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
205 else { |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
206 t_push(); |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
207 query = t_str_new(256); |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
208 str_printfa(query, "SELECT %s, %s FROM %s " |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
209 "WHERE %s LIKE '%s/%%'", |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
210 dict->where_field, dict->select_field, |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
211 dict->table, dict->where_field, str_escape(path)); |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
212 if (priv) { |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
213 str_printfa(query, " AND %s = '%s'", |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
214 dict->username_field, |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
215 str_escape(dict->username)); |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
216 } |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
217 if (!recurse) { |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
218 str_printfa(query, " AND %s NOT LIKE '%s/%%/%%'", |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
219 dict->where_field, str_escape(path)); |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
220 } |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
221 ctx->result = sql_query_s(dict->db, str_c(query)); |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
222 t_pop(); |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
223 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
224 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
225 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
|
226 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
227 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
228 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
|
229 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
|
230 { |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
231 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
|
232 (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
|
233 int ret; |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
234 |
3967
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
235 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
|
236 return -1; |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
237 |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
238 if ((ret = sql_result_next_row(ctx->result)) <= 0) |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
239 return ret; |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
240 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
241 *key_r = sql_result_get_field_value(ctx->result, 0); |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
242 *value_r = sql_result_get_field_value(ctx->result, 1); |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
243 return 1; |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
244 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
245 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
246 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
|
247 { |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
248 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
|
249 (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
|
250 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
251 sql_result_free(ctx->result); |
3787
40600601502e
Added dictinary lookup server and a "proxy" dict implementation to talk to
Timo Sirainen <tss@iki.fi>
parents:
3737
diff
changeset
|
252 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
|
253 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
254 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
255 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
|
256 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
|
257 { |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
258 struct sql_dict *dict = (struct sql_dict *)_dict; |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
259 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
|
260 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
261 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
|
262 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
|
263 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
|
264 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
265 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
|
266 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
267 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
268 static int sql_dict_transaction_commit(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
|
269 { |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
270 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
|
271 (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
|
272 const char *error; |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
273 int ret; |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
274 |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
275 ret = sql_transaction_commit_s(&ctx->sql_ctx, &error); |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
276 if (ret < 0) |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
277 i_error("sql dict: commit failed: %s", error); |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
278 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
|
279 return ret; |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
280 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
281 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
282 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
|
283 { |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
284 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
|
285 (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
|
286 |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
287 sql_transaction_rollback(&ctx->sql_ctx); |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
288 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
|
289 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
290 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
291 static void sql_dict_set(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
|
292 const char *key, const char *value) |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
293 { |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
294 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
|
295 (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
|
296 struct sql_dict *dict = (struct sql_dict *)_ctx->dict; |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
297 const char *query; |
3967
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
298 bool priv; |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
299 |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
300 if (sql_path_fix(&key, &priv) < 0) |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
301 return; |
3737
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 t_push(); |
3967
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
304 if (priv) { |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
305 query = t_strdup_printf( |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
306 "INSERT INTO %s (%s, %s, %s) VALUES (%s, %s, %s) " |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
307 "ON DUPLICATE KEY UPDATE %s = '%s'", |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
308 dict->table, dict->select_field, dict->where_field, |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
309 dict->username_field, |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
310 str_escape(key), str_escape(value), |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
311 str_escape(dict->username), |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
312 str_escape(key), str_escape(value)); |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
313 } else { |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
314 query = t_strdup_printf( |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
315 "INSERT INTO %s (%s, %s) VALUES (%s, %s) " |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
316 "ON DUPLICATE KEY UPDATE %s = '%s'", |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
317 dict->table, dict->select_field, dict->where_field, |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
318 str_escape(key), str_escape(value), |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
319 str_escape(key), str_escape(value)); |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
320 } |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
321 sql_update(ctx->sql_ctx, query); |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
322 t_pop(); |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
323 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
324 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
325 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
|
326 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
|
327 { |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
328 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
|
329 (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
|
330 struct sql_dict *dict = (struct sql_dict *)_ctx->dict; |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
331 const char *query; |
3967
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
332 bool priv; |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
333 |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
334 if (sql_path_fix(&key, &priv) < 0) |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
335 return; |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
336 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
337 t_push(); |
3967
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
338 if (priv) { |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
339 query = t_strdup_printf( |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
340 "INSERT INTO %s (%s, %s, %s) VALUES (%s, %lld, %s) " |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
341 "ON DUPLICATE KEY UPDATE %s = %s + %lld", |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
342 dict->table, dict->select_field, dict->where_field, |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
343 dict->username_field, |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
344 str_escape(key), diff, str_escape(dict->username), |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
345 str_escape(key), str_escape(key), diff); |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
346 } else { |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
347 query = t_strdup_printf( |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
348 "INSERT INTO %s (%s, %s) VALUES (%s, %lld) " |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
349 "ON DUPLICATE KEY UPDATE %s = %s + %lld", |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
350 dict->table, dict->select_field, dict->where_field, |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
351 str_escape(key), diff, |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
352 str_escape(key), str_escape(key), diff); |
6fabe878c46d
Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents:
3943
diff
changeset
|
353 } |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
354 sql_update(ctx->sql_ctx, query); |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
355 t_pop(); |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
356 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
357 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
358 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
|
359 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
|
360 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
361 { |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
362 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
|
363 sql_dict_deinit, |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
364 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
|
365 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
|
366 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
|
367 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
|
368 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
|
369 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
|
370 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
|
371 sql_dict_set, |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
372 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
|
373 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
374 }; |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
375 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
376 static struct dict *dict_sql_classes; |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
377 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
378 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
|
379 { |
3943
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
380 const struct sql_db *const *drivers; |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
381 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
|
382 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
383 /* @UNSAFE */ |
3943
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
384 drivers = array_get(&sql_drivers, &count); |
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
385 dict_sql_classes = 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
|
386 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
387 for (i = 0; i < count; i++) { |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
388 dict_sql_classes[i] = sql_dict; |
3943
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
389 dict_sql_classes[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
|
390 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
391 dict_class_register(&dict_sql_classes[i]); |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
392 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
393 } |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
394 |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
395 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
|
396 { |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
397 int i; |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
398 |
3943
cbe5c6772e0d
Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
399 for (i = 0; dict_sql_classes[i].name != NULL; i++) |
3737
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
400 dict_class_unregister(&dict_sql_classes[i]); |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
401 i_free(dict_sql_classes); |
d67092398377
Added dictionary API and implementation for SQL. It's meant for looking and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
402 } |