dict.c revision 5f5870385cff47efd2f58e7892f251cf13761528
a8c5a86d183db25a57bf193c06b41e092ec2e151Timo Sirainen/* Copyright (c) 2005-2012 Dovecot authors, see the included COPYING file */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic ARRAY_DEFINE(dict_drivers, struct dict *);
463e82bdf0e990f4f2252d2b53ea23a5abe5883cTimo Sirainenstatic struct dict *dict_driver_lookup(const char *name)
20c892309312df8f4f73cfcaf8acd2ededda8b05Timo Sirainen if (dict_driver_lookup(driver->name) != NULL) {
945631faab2bf1aed8d95a1fd0c317a9ce153725Timo Sirainen i_fatal("dict_driver_register(%s): Already registered",
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainenvoid dict_driver_unregister(struct dict *driver)
f81a4d2002da0db33d11ca694d3a91b3ee2a0fdbTimo Sirainen idx = array_foreach_idx(&dict_drivers, dicts);
e6d7d19c328e7043ad35d5a52c1617bde915a16fTimo Sirainenstruct dict *dict_init(const char *uri, enum dict_data_type value_type,
7de1c472fd23ddac6b4dc5cbeee6fa6a8418b071Timo Sirainen const char *p, *name;
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainen i_error("Dictionary URI is missing ':': %s", uri);
bf91bed88d4e294b4577ba2a3b14d87cf35ae135Timo Sirainen dict->v.init(dict, p+1, value_type, username, base_dir);
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen return dict->v.wait == NULL ? 1 : dict->v.wait(dict);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic bool dict_key_prefix_is_valid(const char *key)
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen return strncmp(key, DICT_PATH_SHARED, strlen(DICT_PATH_SHARED)) == 0 ||
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen strncmp(key, DICT_PATH_PRIVATE, strlen(DICT_PATH_PRIVATE)) == 0;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenint dict_lookup(struct dict *dict, pool_t pool, const char *key,
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen const char **value_r)
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen return dict->v.lookup(dict, pool, key, value_r);
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainendict_iterate_init(struct dict *dict, const char *path,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return dict_iterate_init_multiple(dict, paths, flags);
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainendict_iterate_init_multiple(struct dict *dict, const char *const *paths,
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen unsigned int i;
1cad0dd34667548ba39f794ddeb9fc486cf4c666Timo Sirainen return dict->v.iterate_init(dict, paths, flags);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenbool dict_iterate(struct dict_iterate_context *ctx,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return ctx->dict->v.iterate(ctx, key_r, value_r);
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainenint dict_iterate_deinit(struct dict_iterate_context **_ctx)
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainenstruct dict_transaction_context *dict_transaction_begin(struct dict *dict)
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainenint dict_transaction_commit(struct dict_transaction_context **_ctx)
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainen return ctx->dict->v.transaction_commit(ctx, FALSE, NULL, NULL);
a28a6267f48971117dec958b160deefd14ebb7a6Timo Sirainenvoid dict_transaction_commit_async(struct dict_transaction_context **_ctx,
23079bf0a6e7489c5f542b0b897a71bdfd884a51Timo Sirainen ctx->dict->v.transaction_commit(ctx, TRUE, callback, context);
3697080532ccd9f51fac108be6079b616c7a2ddfTimo Sirainenvoid dict_transaction_rollback(struct dict_transaction_context **_ctx)
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainenvoid dict_set(struct dict_transaction_context *ctx,
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainenvoid dict_unset(struct dict_transaction_context *ctx,
3342badd8c69adff34db589fb0a221ace5996212Timo Sirainen const char *key)
2a6af811ea3de3cf9e2f15e446674dd21b0705f3Timo Sirainenvoid dict_atomic_inc(struct dict_transaction_context *ctx,
31050c3df6cbe403e8ced8ef11b5c4e12124d354Timo Sirainenconst char *dict_escape_string(const char *str)
68b3667c9ee95951d7c3e03b19b2d37abbaa5736Timo Sirainen const char *p;
fa5957ffc9b676bfd649fa9953e63e72ee4ebeb4Timo Sirainen /* see if we need to escape it */
b32de04eb77234b25e2e411884a2503a1bf3c255Phil Carmody if (*p == '\0')
b32de04eb77234b25e2e411884a2503a1bf3c255Phil Carmody /* escape */
b32de04eb77234b25e2e411884a2503a1bf3c255Phil Carmody for (; *p != '\0'; p++) {
b32de04eb77234b25e2e411884a2503a1bf3c255Phil Carmody switch (*p) {
74896b89e1d82819d710f9322cf7c9e72d5841adPhil Carmodyconst char *dict_unescape_string(const char *str)
74896b89e1d82819d710f9322cf7c9e72d5841adPhil Carmody const char *p;
74896b89e1d82819d710f9322cf7c9e72d5841adPhil Carmody /* see if we need to unescape it */
74896b89e1d82819d710f9322cf7c9e72d5841adPhil Carmody if (*p == '\\')
aba9cc9bf97576c0ca653d4e218567e617061029Phil Carmody if (*p == '\0')
89b7d6ce9266288c156e3513f5798680f1e33572Phil Carmody /* unescape */
89b7d6ce9266288c156e3513f5798680f1e33572Phil Carmody ret = t_str_new((size_t) (p - str) + strlen(p) + 1);
4e6629cb5d5e7f67d5023eda540105d32df5f2baPhil Carmody for (; *p != '\0'; p++) {
89b7d6ce9266288c156e3513f5798680f1e33572Phil Carmody if (*p != '\\')
89b7d6ce9266288c156e3513f5798680f1e33572Phil Carmody if (*++p == '|')
53e0e6889bf659b86e4c7d2e83e27d69fd9d6bcbPhil Carmody else if (*p == '\0')