Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib-dict/dict-sql-settings.c @ 8204:f643f8c0e29d HEAD
Don't use uninitialized variable for allocating initial array size.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 20 Sep 2008 19:30:07 +0300 |
parents | 2d3e942a4cde |
children | b9faf4db2a9f |
rev | line source |
---|---|
8113
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1 /* Copyright (c) 2008 Dovecot authors, see the included COPYING file */ |
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 { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 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
|
124 /* 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
|
125 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
|
126 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
|
127 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
|
128 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 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
|
130 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
|
131 return NULL; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
133 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
134 static const char * |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 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
|
136 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
|
137 { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 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
|
139 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 switch (ctx->type) { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 case SECTION_ROOT: |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 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
|
143 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
|
144 return NULL; |
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 break; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 case SECTION_MAP: |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 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
|
149 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
|
150 &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
|
151 case SECTION_FIELDS: |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
152 if (*value != '$') { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 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
|
154 key, NULL); |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 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
|
157 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
|
158 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
|
159 return NULL; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
160 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 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
|
162 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
164 static bool |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 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
|
166 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
|
167 { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 switch (ctx->type) { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 case SECTION_ROOT: |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
170 if (type == NULL) |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 return FALSE; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 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
|
173 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
|
174 ctx->type = SECTION_MAP; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 return TRUE; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 break; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
178 case SECTION_MAP: |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 if (type == NULL) { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 ctx->type = SECTION_ROOT; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
181 *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
|
182 return FALSE; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
183 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 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
|
185 ctx->type = SECTION_FIELDS; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 return TRUE; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 break; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 case SECTION_FIELDS: |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
190 if (type == NULL) { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
191 ctx->type = SECTION_MAP; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
192 *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
|
193 return FALSE; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
195 break; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 } |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
197 *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
|
198 return FALSE; |
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 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
201 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
|
202 { |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
203 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
|
204 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
205 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
|
206 ctx.pool = pool; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
207 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
|
208 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
|
209 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
|
210 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
211 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
|
212 return NULL; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
213 |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
214 return ctx.set; |
2d3e942a4cde
dict sql: Added configuration for mapping dict paths to SQL fields.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
215 } |