s3: Add gencache_parse
authorVolker Lendecke <vl@samba.org>
Fri, 26 Nov 2010 23:40:25 +0000 (00:40 +0100)
committerVolker Lendecke <vlendec@samba.org>
Sun, 28 Nov 2010 13:19:19 +0000 (14:19 +0100)
source3/include/proto.h
source3/lib/gencache.c

index d199d1e3dfc30d93fa87365d9bf1d8cfd6c0ada0..0af158c5371dbc04f7fba51c1a371d0659232879 100644 (file)
@@ -548,6 +548,10 @@ void pull_file_id_24(char *buf, struct file_id *id);
 bool gencache_set(const char *keystr, const char *value, time_t timeout);
 bool gencache_del(const char *keystr);
 bool gencache_get(const char *keystr, char **valstr, time_t *timeout);
+bool gencache_parse(const char *keystr,
+                   void (*parser)(time_t timeout, DATA_BLOB blob,
+                                  void *private_data),
+                   void *private_data);
 bool gencache_get_data_blob(const char *keystr, DATA_BLOB *blob,
                            time_t *timeout, bool *was_expired);
 bool gencache_stabilize(void);
index 8d2ddb23871d55497a93ba92a8adc0d3bbbf0730..fa8dcb02f9e292c2bbbf8866d5b992c9e592fe63 100644 (file)
@@ -289,6 +289,65 @@ static bool gencache_pull_timeout(char *val, time_t *pres, char **pendptr)
        return true;
 }
 
+struct gencache_parse_state {
+       void (*parser)(time_t timeout, DATA_BLOB blob, void *private_data);
+       void *private_data;
+};
+
+static int gencache_parse_fn(TDB_DATA key, TDB_DATA data, void *private_data)
+{
+       struct gencache_parse_state *state;
+       DATA_BLOB blob;
+       time_t t;
+       char *endptr;
+       bool ret;
+
+       if (data.dptr == NULL) {
+               return -1;
+       }
+       ret = gencache_pull_timeout((char *)data.dptr, &t, &endptr);
+       if (!ret) {
+               return -1;
+       }
+       state = (struct gencache_parse_state *)private_data;
+       blob = data_blob_const(
+               endptr+1, data.dsize - PTR_DIFF(endptr+1, data.dptr));
+       state->parser(t, blob, state->private_data);
+       return 0;
+}
+
+bool gencache_parse(const char *keystr,
+                   void (*parser)(time_t timeout, DATA_BLOB blob,
+                                  void *private_data),
+                   void *private_data)
+{
+       struct gencache_parse_state state;
+       TDB_DATA key;
+       int ret;
+
+       if (keystr == NULL) {
+               return false;
+       }
+       if (tdb_data_cmp(string_term_tdb_data(keystr),
+                        last_stabilize_key()) == 0) {
+               return false;
+       }
+       if (!gencache_init()) {
+               return false;
+       }
+
+       key = string_term_tdb_data(keystr);
+       state.parser = parser;
+       state.private_data = private_data;
+
+       ret = tdb_parse_record(cache_notrans, key, gencache_parse_fn, &state);
+       if (ret != -1) {
+               return true;
+       }
+       ret = tdb_parse_record(cache, key, gencache_parse_fn, &state);
+       return (ret != -1);
+}
+
 /**
  * Get existing entry from the cache file.
  *