Skip to content

Commit 41aea5f

Browse files
committed
cachedb_local: Add support for iterating all cache keys
1 parent cac2517 commit 41aea5f

File tree

5 files changed

+41
-2
lines changed

5 files changed

+41
-2
lines changed

cachedb/cachedb.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ typedef struct cachedb_funcs_t {
8181
int expires, int *new_val);
8282
int (*sub) (cachedb_con *con, str *attr, int val,
8383
int expires, int *new_val);
84+
int (*iter_keys) (cachedb_con *con,
85+
int (*kv_func)(const str *key, const str *value));
86+
8487
/* bi-dimensional array will be returned */
8588
int (*raw_query) (cachedb_con *con, str *query, cdb_raw_entry ***reply,
8689
int num_cols, int *num_rows);

cachedb/cachedb_cap.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,10 @@ typedef enum {
4040
CACHEDB_CAP_BINARY_VALUE = 1<<5,
4141
CACHEDB_CAP_RAW = 1<<6,
4242
CACHEDB_CAP_TRUNCATE = 1<<7,
43+
CACHEDB_CAP_ITER_KEYS = 1<<8,
4344

44-
CACHEDB_CAP_QUERY = 1<<8,
45-
CACHEDB_CAP_UPDATE = 1<<9,
45+
CACHEDB_CAP_QUERY = 1<<9,
46+
CACHEDB_CAP_UPDATE = 1<<10,
4647
CACHEDB_CAP_COL_ORIENTED = (CACHEDB_CAP_QUERY|CACHEDB_CAP_UPDATE),
4748

4849
CACHEDB_CAP_MAP_GET = 1<<10,
@@ -85,6 +86,8 @@ static inline int check_cachedb_api(cachedb_engine *cde)
8586
cde->cdb_func.capability |= CACHEDB_CAP_RAW;
8687
if (cde->cdb_func.truncate)
8788
cde->cdb_func.capability |= CACHEDB_CAP_TRUNCATE;
89+
if (cde->cdb_func.iter_keys)
90+
cde->cdb_func.capability |= CACHEDB_CAP_ITER_KEYS;
8891

8992
if (cde->cdb_func.query)
9093
cde->cdb_func.capability |= CACHEDB_CAP_QUERY;

modules/cachedb_local/cachedb_local.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,7 @@ static int mod_init(void)
587587
cde.cdb_func.add = lcache_htable_add;
588588
cde.cdb_func.sub = lcache_htable_sub;
589589
cde.cdb_func.is_replicated = lcache_is_replicated;
590+
cde.cdb_func.iter_keys = lcache_htable_iter_keys;
590591

591592
cde.cdb_func.capability = CACHEDB_CAP_BINARY_VALUE;
592593

modules/cachedb_local/hash.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -542,3 +542,34 @@ int lcache_htable_fetch_counter(cachedb_con* con,str* attr,int *val)
542542
cdb_slow_queries, cdb_total_queries);
543543
return -2;
544544
}
545+
546+
int lcache_htable_iter_keys(cachedb_con *con,
547+
int (*kv_func)(const str *_k, const str *_v))
548+
{
549+
lcache_t* cache_htable;
550+
lcache_col_t* cache_col;
551+
lcache_entry_t* it;
552+
int i, n = 0;
553+
554+
cache_col = ((lcache_con *)con->data)->col;
555+
if (!cache_col) {
556+
LM_ERR("url <%.*s> does not have any collection associated with!",
557+
con->url.len, con->url.s);
558+
return -1;
559+
}
560+
561+
cache_htable = cache_col->col_htable->htable;
562+
563+
for (i = 0; i < cache_col->size; i++) {
564+
lock_get(&cache_htable[i].lock);
565+
566+
for (it = cache_htable[i].entries; it; it = it->next)
567+
if (kv_func(&it->attr, &it->value) == 0)
568+
n++;
569+
570+
lock_release(&cache_htable[i].lock);
571+
}
572+
573+
/* number of successfully processed keys */
574+
return n;
575+
}

modules/cachedb_local/hash.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,5 +64,6 @@ int lcache_htable_fetch(cachedb_con *con,str* attr, str* val);
6464
int lcache_htable_add(cachedb_con *con,str *attr,int val,int expires,int *new_val);
6565
int lcache_htable_sub(cachedb_con *con,str *attr,int val,int expires,int *new_val);
6666
int lcache_htable_fetch_counter(cachedb_con* con,str* attr,int *val);
67+
int lcache_htable_iter_keys(cachedb_con *con, int (*kv_func)(const str *, const str *));
6768

6869
#endif

0 commit comments

Comments
 (0)