Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib-dict/dict-sql-settings.c @ 9575:0a00dcc4f0ea HEAD
lib-storage: Allow shared namespace prefix to use %variable modifiers.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 26 May 2010 17:07:51 +0100 |
parents | 00cd9aacd03c |
children |
rev | line source |
---|---|
9532
00cd9aacd03c
Updated copyright notices to include year 2010.
Timo Sirainen <tss@iki.fi>
parents:
9175
diff
changeset
|
1 /* Copyright (c) 2008-2010 Dovecot authors, see the included COPYING file */ |
8113
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "array.h" |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "str.h" |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "settings.h" |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "dict-sql-settings.h" |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include <ctype.h> |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 enum section_type { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 SECTION_ROOT = 0, |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 SECTION_MAP, |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 SECTION_FIELDS |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 }; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 struct dict_sql_map_field { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 const char *sql_field, *variable; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 }; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 struct setting_parser_ctx { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 pool_t pool; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 struct dict_sql_settings *set; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 enum section_type type; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 struct dict_sql_map cur_map; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 ARRAY_DEFINE(cur_fields, struct dict_sql_map_field); |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 }; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 #define DEF_STR(name) DEF_STRUCT_STR(name, dict_sql_map) |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 static struct setting_def dict_sql_map_setting_defs[] = { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 DEF_STR(pattern), |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 DEF_STR(table), |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 DEF_STR(username_field), |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 DEF_STR(value_field), |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 { 0, NULL, 0 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 }; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 static const char *pattern_read_name(const char **pattern) |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 const char *p = *pattern, *name; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 if (*p == '{') { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 /* ${name} */ |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 name = ++p; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 p = strchr(p, '}'); |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 if (p == NULL) { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 /* error, but allow anyway */ |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 *pattern += strlen(*pattern); |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 return ""; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 *pattern = p + 1; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 } else { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 /* $name - ends at the first non-alnum_ character */ |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 name = p; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 for (; *p != '\0'; p++) { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 if (!i_isalnum(*p) && *p != '_') |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 break; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 *pattern = p; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 name = t_strdup_until(name, p); |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 return name; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 static const char *dict_sql_fields_map(struct setting_parser_ctx *ctx) |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 struct dict_sql_map_field *fields; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 string_t *pattern; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 const char *p, *name; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 unsigned int i, count; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 /* go through the variables in the pattern, replace them with plain |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 '$' character and add its sql field */ |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 pattern = t_str_new(strlen(ctx->cur_map.pattern) + 1); |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 fields = array_get_modifiable(&ctx->cur_fields, &count); |
8204
f643f8c0e29d
Don't use uninitialized variable for allocating initial array size.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
79 |
f643f8c0e29d
Don't use uninitialized variable for allocating initial array size.
Timo Sirainen <tss@iki.fi>
parents:
8113
diff
changeset
|
80 p_array_init(&ctx->cur_map.sql_fields, ctx->pool, count); |
8113
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 for (p = ctx->cur_map.pattern; *p != '\0';) { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 if (*p != '$') { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 str_append_c(pattern, *p); |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 p++; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 continue; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 p++; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 str_append_c(pattern, '$'); |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 name = pattern_read_name(&p); |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 for (i = 0; i < count; i++) { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 if (fields[i].variable != NULL && |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 strcmp(fields[i].variable, name) == 0) |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 break; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 if (i == count) { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 return t_strconcat("Missing SQL field for variable: ", |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 name, NULL); |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 /* mark this field as used */ |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 fields[i].variable = NULL; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 array_append(&ctx->cur_map.sql_fields, |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 &fields[i].sql_field, 1); |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
107 /* make sure there aren't any unused fields */ |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 for (i = 0; i < count; i++) { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 if (fields[i].variable != NULL) { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 return t_strconcat("Unused variable: ", |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 fields[i].variable, NULL); |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 if (ctx->set->max_field_count < count) |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 ctx->set->max_field_count = count; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 ctx->cur_map.pattern = p_strdup(ctx->pool, str_c(pattern)); |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 return NULL; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 static const char *dict_sql_map_finish(struct setting_parser_ctx *ctx) |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 { |
9175
e67c9b3e88b0
dict sql: If pattern, table or value_field is unset, fail early with an error.
Timo Sirainen <tss@iki.fi>
parents:
8732
diff
changeset
|
123 if (ctx->cur_map.pattern == NULL) |
e67c9b3e88b0
dict sql: If pattern, table or value_field is unset, fail early with an error.
Timo Sirainen <tss@iki.fi>
parents:
8732
diff
changeset
|
124 return "Missing setting: pattern"; |
e67c9b3e88b0
dict sql: If pattern, table or value_field is unset, fail early with an error.
Timo Sirainen <tss@iki.fi>
parents:
8732
diff
changeset
|
125 if (ctx->cur_map.table == NULL) |
e67c9b3e88b0
dict sql: If pattern, table or value_field is unset, fail early with an error.
Timo Sirainen <tss@iki.fi>
parents:
8732
diff
changeset
|
126 return "Missing setting: table"; |
e67c9b3e88b0
dict sql: If pattern, table or value_field is unset, fail early with an error.
Timo Sirainen <tss@iki.fi>
parents:
8732
diff
changeset
|
127 if (ctx->cur_map.value_field == NULL) |
e67c9b3e88b0
dict sql: If pattern, table or value_field is unset, fail early with an error.
Timo Sirainen <tss@iki.fi>
parents:
8732
diff
changeset
|
128 return "Missing setting: value_field"; |
e67c9b3e88b0
dict sql: If pattern, table or value_field is unset, fail early with an error.
Timo Sirainen <tss@iki.fi>
parents:
8732
diff
changeset
|
129 |
e67c9b3e88b0
dict sql: If pattern, table or value_field is unset, fail early with an error.
Timo Sirainen <tss@iki.fi>
parents:
8732
diff
changeset
|
130 if (ctx->cur_map.username_field == NULL) { |
e67c9b3e88b0
dict sql: If pattern, table or value_field is unset, fail early with an error.
Timo Sirainen <tss@iki.fi>
parents:
8732
diff
changeset
|
131 /* not all queries require this */ |
e67c9b3e88b0
dict sql: If pattern, table or value_field is unset, fail early with an error.
Timo Sirainen <tss@iki.fi>
parents:
8732
diff
changeset
|
132 ctx->cur_map.username_field = "'username_field not set'"; |
e67c9b3e88b0
dict sql: If pattern, table or value_field is unset, fail early with an error.
Timo Sirainen <tss@iki.fi>
parents:
8732
diff
changeset
|
133 } |
e67c9b3e88b0
dict sql: If pattern, table or value_field is unset, fail early with an error.
Timo Sirainen <tss@iki.fi>
parents:
8732
diff
changeset
|
134 |
8113
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 if (!array_is_created(&ctx->cur_map.sql_fields)) { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 /* no fields besides value. allocate the array anyway. */ |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
137 p_array_init(&ctx->cur_map.sql_fields, ctx->pool, 1); |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 if (strchr(ctx->cur_map.pattern, '$') != NULL) |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 return "Missing fields for pattern variables"; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 array_append(&ctx->set->maps, &ctx->cur_map, 1); |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 memset(&ctx->cur_map, 0, sizeof(ctx->cur_map)); |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 return NULL; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
144 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
146 static const char * |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 parse_setting(const char *key, const char *value, |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 struct setting_parser_ctx *ctx) |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 struct dict_sql_map_field *field; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
152 switch (ctx->type) { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 case SECTION_ROOT: |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 if (strcmp(key, "connect") == 0) { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 ctx->set->connect = p_strdup(ctx->pool, value); |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 return NULL; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
157 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 break; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
159 case SECTION_MAP: |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
160 return parse_setting_from_defs(ctx->pool, |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 dict_sql_map_setting_defs, |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
162 &ctx->cur_map, key, value); |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 case SECTION_FIELDS: |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
164 if (*value != '$') { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 return t_strconcat("Value is missing '$' for field: ", |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 key, NULL); |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 field = array_append_space(&ctx->cur_fields); |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 field->sql_field = p_strdup(ctx->pool, key); |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
170 field->variable = p_strdup(ctx->pool, value + 1); |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 return NULL; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 return t_strconcat("Unknown setting: ", key, NULL); |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
174 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 static bool |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 parse_section(const char *type, const char *name ATTR_UNUSED, |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
178 struct setting_parser_ctx *ctx, const char **error_r) |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 switch (ctx->type) { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
181 case SECTION_ROOT: |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 if (type == NULL) |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
183 return FALSE; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 if (strcmp(type, "map") == 0) { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 array_clear(&ctx->cur_fields); |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 ctx->type = SECTION_MAP; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 return TRUE; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 break; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
190 case SECTION_MAP: |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
191 if (type == NULL) { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
192 ctx->type = SECTION_ROOT; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
193 *error_r = dict_sql_map_finish(ctx); |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 return FALSE; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
195 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 if (strcmp(type, "fields") == 0) { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
197 ctx->type = SECTION_FIELDS; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
198 return TRUE; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
199 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
200 break; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
201 case SECTION_FIELDS: |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
202 if (type == NULL) { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
203 ctx->type = SECTION_MAP; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
204 *error_r = dict_sql_fields_map(ctx); |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
205 return FALSE; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
206 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
207 break; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
208 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
209 *error_r = t_strconcat("Unknown section: ", type, NULL); |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
210 return FALSE; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
211 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
212 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
213 struct dict_sql_settings *dict_sql_settings_read(pool_t pool, const char *path) |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
214 { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
215 struct setting_parser_ctx ctx; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
216 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
217 memset(&ctx, 0, sizeof(ctx)); |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
218 ctx.pool = pool; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
219 ctx.set = p_new(pool, struct dict_sql_settings, 1); |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
220 t_array_init(&ctx.cur_fields, 16); |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
221 p_array_init(&ctx.set->maps, pool, 8); |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
222 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
223 if (!settings_read(path, NULL, parse_setting, parse_section, &ctx)) |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
224 return NULL; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
225 |
8732
4142c933e231
dict sql: If connect setting isn't given, give an error message instead of crashing.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
226 if (ctx.set->connect == NULL) { |
4142c933e231
dict sql: If connect setting isn't given, give an error message instead of crashing.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
227 i_error("Error in configuration file %s: " |
4142c933e231
dict sql: If connect setting isn't given, give an error message instead of crashing.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
228 "Missing connect setting", path); |
4142c933e231
dict sql: If connect setting isn't given, give an error message instead of crashing.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
229 return NULL; |
4142c933e231
dict sql: If connect setting isn't given, give an error message instead of crashing.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
230 } |
4142c933e231
dict sql: If connect setting isn't given, give an error message instead of crashing.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
231 |
8113
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
232 return ctx.set; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
233 } |