quota-dict.c revision 43d32cbe60fdaef2699d99f1ca259053e9350411
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen/* Copyright (C) 2005-2006 Timo Sirainen */
51dbc2d559815da774f8ee5faf0e28df3c8d40c0Timo Sirainen#define DICT_QUOTA_CURRENT_PATH DICT_PATH_PRIVATE"quota/"
51dbc2d559815da774f8ee5faf0e28df3c8d40c0Timo Sirainen#define DICT_QUOTA_CURRENT_BYTES_PATH DICT_QUOTA_CURRENT_PATH"storage"
51dbc2d559815da774f8ee5faf0e28df3c8d40c0Timo Sirainen#define DICT_QUOTA_CURRENT_COUNT_PATH DICT_QUOTA_CURRENT_PATH"messages"
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainenextern struct quota_backend quota_backend_dict;
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainenstatic struct quota_root *dict_quota_alloc(void)
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainenstatic int dict_quota_init(struct quota_root *_root, const char *args)
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen struct dict_quota_root *root = (struct dict_quota_root *)_root;
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen const char *username, *p;
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen i_error("dict quota: URI missing from parameters");
19e8858fad5128326481e6cd85c9070b1345bad8Timo Sirainen i_info("dict quota: user = %s, uri = %s", username, args);
92d1458b00f4f236c4cec96a696253d3bbf8b05aTimo Sirainen /* FIXME: we should use 64bit integer as datatype instead but before
92d1458b00f4f236c4cec96a696253d3bbf8b05aTimo Sirainen it can actually be used don't bother */
92d1458b00f4f236c4cec96a696253d3bbf8b05aTimo Sirainen root->dict = dict_init(args, DICT_DATA_TYPE_STRING, username);
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainenstatic void dict_quota_deinit(struct quota_root *_root)
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen struct dict_quota_root *root = (struct dict_quota_root *)_root;
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainenstatic const char *const *
43d32cbe60fdaef2699d99f1ca259053e9350411Timo Sirainendict_quota_root_get_resources(struct quota_root *root ATTR_UNUSED)
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen static const char *resources[] = {
e392fcb39a06609af20a9e79017683f194de3ddeTimo Sirainen QUOTA_NAME_STORAGE_KILOBYTES, QUOTA_NAME_MESSAGES, NULL
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen if (quota_count(root->root.quota, &bytes, &count) < 0)
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen dict_set(dt, DICT_QUOTA_CURRENT_BYTES_PATH, dec2str(bytes));
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen dict_set(dt, DICT_QUOTA_CURRENT_COUNT_PATH, dec2str(count));
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainendict_quota_get_resource(struct quota_root *_root, const char *name,
43d32cbe60fdaef2699d99f1ca259053e9350411Timo Sirainen uint64_t *value_r, uint64_t *limit ATTR_UNUSED)
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen struct dict_quota_root *root = (struct dict_quota_root *)_root;
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen if (strcmp(name, QUOTA_NAME_STORAGE_BYTES) == 0)
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen else if (strcmp(name, QUOTA_NAME_MESSAGES) == 0)
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen ret = dict_lookup(root->dict, unsafe_data_stack_pool,
bd7b1a9000b12349e2a99bb43b3ce8b96a18e92bTimo Sirainen /* recalculate quota if it's negative or if it wasn't found */
eba0a92d683f111d7b4af1760029f2489625f138Timo Sirainen tmp = ret == 0 ? -1 : strtoll(value, NULL, 10);
eba0a92d683f111d7b4af1760029f2489625f138Timo Sirainen ret = dict_quota_count(root, want_bytes, value_r);
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen struct dict_quota_root *root = (struct dict_quota_root *) _root;
bd7b1a9000b12349e2a99bb43b3ce8b96a18e92bTimo Sirainen dict_unset(dt, DICT_QUOTA_CURRENT_BYTES_PATH);
bd7b1a9000b12349e2a99bb43b3ce8b96a18e92bTimo Sirainen dict_unset(dt, DICT_QUOTA_CURRENT_COUNT_PATH);
bd7b1a9000b12349e2a99bb43b3ce8b96a18e92bTimo Sirainen dict_atomic_inc(dt, DICT_QUOTA_CURRENT_BYTES_PATH,