From fb948e1e36718621b4dcc92b2a6f54c470812eb4 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Fri, 27 Aug 2010 11:42:09 +0000 Subject: [PATCH] implementing delete --- src/datacache/datacache.c | 9 ++- src/datacache/plugin_datacache_postgres.c | 71 +++++++++++++++++++++-- src/datacache/test_datacache_quota.c | 1 + 3 files changed, 74 insertions(+), 7 deletions(-) diff --git a/src/datacache/datacache.c b/src/datacache/datacache.c index 0ad9b9df4..6e9b07708 100644 --- a/src/datacache/datacache.c +++ b/src/datacache/datacache.c @@ -191,6 +191,7 @@ GNUNET_DATACACHE_create (struct GNUNET_SCHEDULER_Handle *sched, GNUNET_DATACACHE_destroy (ret); return NULL; } + GNUNET_assert (ret->api->get != NULL); return ret; } @@ -244,6 +245,7 @@ GNUNET_DATACACHE_put (struct GNUNET_DATACACHE_Handle *h, { uint32_t used; + GNUNET_assert (h->api->get != NULL); used = h->api->put (h->api->cls, key, size, @@ -251,7 +253,10 @@ GNUNET_DATACACHE_put (struct GNUNET_DATACACHE_Handle *h, type, discard_time); if (used == 0) - return GNUNET_SYSERR; + { + GNUNET_break (0); + return GNUNET_SYSERR; + } GNUNET_STATISTICS_update (h->stats, gettext_noop ("# bytes stored"), size, @@ -282,6 +287,7 @@ GNUNET_DATACACHE_get (struct GNUNET_DATACACHE_Handle *h, GNUNET_DATACACHE_Iterator iter, void *iter_cls) { + GNUNET_assert (h->api->get != NULL); GNUNET_STATISTICS_update (h->stats, gettext_noop ("# requests received"), 1, @@ -295,6 +301,7 @@ GNUNET_DATACACHE_get (struct GNUNET_DATACACHE_Handle *h, GNUNET_NO); return 0; /* can not be present */ } + GNUNET_assert (h->api->get != NULL); return h->api->get (h->api->cls, key, type, diff --git a/src/datacache/plugin_datacache_postgres.c b/src/datacache/plugin_datacache_postgres.c index 53118e6bf..6bf3c7011 100644 --- a/src/datacache/plugin_datacache_postgres.c +++ b/src/datacache/plugin_datacache_postgres.c @@ -30,7 +30,10 @@ #define DEBUG_POSTGRES GNUNET_NO - +/** + * Per-entry overhead estimate + */ +#define OVERHEAD (sizeof(GNUNET_HashCode) + 24) /** * Context for all functions in this plugin. @@ -230,7 +233,7 @@ init_connection (struct Plugin *plugin) (GNUNET_OK != pq_prepare (plugin, "getm", - "SELECT length(value),oid FROM gn090dc " + "SELECT length(value),oid,key FROM gn090dc " "ORDER BY discard_time ASC LIMIT 1", 0, __LINE__)) || @@ -330,7 +333,7 @@ postgres_plugin_put (void *cls, "PQexecPrepared", "put", __LINE__)) return GNUNET_SYSERR; PQclear (ret); - return size; + return size + OVERHEAD; } @@ -455,9 +458,62 @@ postgres_plugin_get (void *cls, static int postgres_plugin_del (void *cls) { - - GNUNET_break (0); - return GNUNET_SYSERR; + struct Plugin *plugin = cls; + uint32_t size; + uint32_t oid; + GNUNET_HashCode key; + PGresult *res; + + res = PQexecPrepared (plugin->dbh, + "getm", + 0, NULL, NULL, NULL, + 1); + if (GNUNET_OK != check_result (plugin, + res, + PGRES_TUPLES_OK, + "PQexecPrepared", + "getm", + __LINE__)) + { +#if DEBUG_POSTGRES + GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, + "datacache-postgres", + "Ending iteration (postgres error)\n"); +#endif + return 0; + } + if (0 == PQntuples (res)) + { + /* no result */ +#if DEBUG_POSTGRES + GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, + "datacache-postgres", + "Ending iteration (no more results)\n"); +#endif + PQclear (res); + return GNUNET_SYSERR; + } + if ( (3 != PQnfields (res)) || + (sizeof (uint32_t) != PQfsize (res, 0)) || + (sizeof (uint32_t) != PQfsize (res, 1)) || + (sizeof (GNUNET_HashCode) != PQfsize (res, 2)) ) + { + GNUNET_break (0); + PQclear (res); + return 0; + } + size = ntohl (*(uint32_t *) PQgetvalue (res, 0, 0)); + oid = ntohl (*(uint32_t *) PQgetvalue (res, 0, 1)); + memcpy (&key, + PQgetvalue (res, 0, 2), + sizeof (GNUNET_HashCode)); + PQclear (res); + if (GNUNET_OK != delete_by_rowid (plugin, oid)) + return GNUNET_SYSERR; + plugin->env->delete_notify (plugin->env->cls, + &key, + size); + return GNUNET_OK; } @@ -508,6 +564,9 @@ libgnunet_plugin_datacache_postgres_done (void *cls) struct GNUNET_DATACACHE_PluginFunctions *api = cls; struct Plugin *plugin = api->cls; + fprintf (stderr, + "Unloading postgres plugin\n"); + PQfinish (plugin->dbh); GNUNET_free (plugin); GNUNET_free (api); return NULL; diff --git a/src/datacache/test_datacache_quota.c b/src/datacache/test_datacache_quota.c index ada5ae171..9e1881bd8 100644 --- a/src/datacache/test_datacache_quota.c +++ b/src/datacache/test_datacache_quota.c @@ -88,6 +88,7 @@ run (void *cls, buf, 1+i, exp)); + fprintf (stderr, "G"); ASSERT (0 < GNUNET_DATACACHE_get (h, &k, 1+i, NULL, NULL)); -- 2.25.1