GNUnet  0.10.x
Data Structures | Macros | Functions
plugin_datacache_postgres.c File Reference

postgres for an implementation of a database backend for the datacache More...

#include "platform.h"
#include "gnunet_util_lib.h"
#include "gnunet_pq_lib.h"
#include "gnunet_datacache_plugin.h"
Include dependency graph for plugin_datacache_postgres.c:

Go to the source code of this file.

Data Structures

struct  Plugin
 Handle for a plugin. More...
 
struct  HandleResultContext
 Closure for handle_results. More...
 
struct  ExtractResultContext
 Closure for extract_result_cb. More...
 

Macros

#define LOG(kind, ...)   GNUNET_log_from(kind, "datacache-postgres", __VA_ARGS__)
 
#define OVERHEAD   (sizeof(struct GNUNET_HashCode) + 24)
 Per-entry overhead estimate. More...
 

Functions

static int init_connection (struct Plugin *plugin)
 Get a database handle. More...
 
static ssize_t postgres_plugin_put (void *cls, const struct GNUNET_HashCode *key, uint32_t prox, size_t data_size, const char *data, enum GNUNET_BLOCK_Type type, struct GNUNET_TIME_Absolute discard_time, unsigned int path_info_len, const struct GNUNET_PeerIdentity *path_info)
 Store an item in the datastore. More...
 
static void handle_results (void *cls, PGresult *result, unsigned int num_results)
 Function to be called with the results of a SELECT statement that has returned num_results results. More...
 
static unsigned int postgres_plugin_get (void *cls, const struct GNUNET_HashCode *key, enum GNUNET_BLOCK_Type type, GNUNET_DATACACHE_Iterator iter, void *iter_cls)
 Iterate over the results for a particular key in the datastore. More...
 
static int postgres_plugin_del (void *cls)
 Delete the entry with the lowest expiration value from the datacache right now. More...
 
static unsigned int postgres_plugin_get_random (void *cls, GNUNET_DATACACHE_Iterator iter, void *iter_cls)
 Obtain a random key-value pair from the datacache. More...
 
static void extract_result_cb (void *cls, PGresult *result, unsigned int num_results)
 Function to be called with the results of a SELECT statement that has returned num_results results. More...
 
static unsigned int postgres_plugin_get_closest (void *cls, const struct GNUNET_HashCode *key, unsigned int num_results, GNUNET_DATACACHE_Iterator iter, void *iter_cls)
 Iterate over the results that are "close" to a particular key in the datacache. More...
 
void * libgnunet_plugin_datacache_postgres_init (void *cls)
 Entry point for the plugin. More...
 
void * libgnunet_plugin_datacache_postgres_done (void *cls)
 Exit point from the plugin. More...
 

Detailed Description

postgres for an implementation of a database backend for the datacache

Author
Christian Grothoff

Definition in file plugin_datacache_postgres.c.

Macro Definition Documentation

◆ LOG

#define LOG (   kind,
  ... 
)    GNUNET_log_from(kind, "datacache-postgres", __VA_ARGS__)

◆ OVERHEAD

#define OVERHEAD   (sizeof(struct GNUNET_HashCode) + 24)

Per-entry overhead estimate.

Definition at line 36 of file plugin_datacache_postgres.c.

Referenced by postgres_plugin_del(), and postgres_plugin_put().

Function Documentation

◆ init_connection()

static int init_connection ( struct Plugin plugin)
static

Get a database handle.

Parameters
pluginglobal context
Returns
GNUNET_OK on success, GNUNET_SYSERR on error

Definition at line 66 of file plugin_datacache_postgres.c.

References GNUNET_DATACACHE_PluginEnvironment::cfg, Plugin::dbh, Plugin::env, GNUNET_OK, GNUNET_PQ_connect_with_cfg(), GNUNET_PQ_exec_statements(), GNUNET_PQ_EXECUTE_STATEMENT_END, GNUNET_PQ_make_execute(), GNUNET_PQ_make_prepare(), GNUNET_PQ_make_try_execute(), GNUNET_PQ_prepare_statements(), GNUNET_PQ_PREPARED_STATEMENT_END, and GNUNET_SYSERR.

Referenced by libgnunet_plugin_datacache_postgres_init().

67 {
68  struct GNUNET_PQ_ExecuteStatement es[] = {
69  GNUNET_PQ_make_execute("CREATE TEMPORARY TABLE IF NOT EXISTS gn011dc ("
70  " type INTEGER NOT NULL,"
71  " prox INTEGER NOT NULL,"
72  " discard_time BIGINT NOT NULL,"
73  " key BYTEA NOT NULL,"
74  " value BYTEA NOT NULL,"
75  " path BYTEA DEFAULT NULL)"
76  "WITH OIDS"),
77  GNUNET_PQ_make_try_execute("CREATE INDEX IF NOT EXISTS idx_key ON gn011dc (key)"),
78  GNUNET_PQ_make_try_execute("CREATE INDEX IF NOT EXISTS idx_dt ON gn011dc (discard_time)"),
79  GNUNET_PQ_make_execute("ALTER TABLE gn011dc ALTER value SET STORAGE EXTERNAL"),
80  GNUNET_PQ_make_execute("ALTER TABLE gn011dc ALTER key SET STORAGE PLAIN"),
82  };
83  struct GNUNET_PQ_PreparedStatement ps[] = {
84  GNUNET_PQ_make_prepare("getkt",
85  "SELECT discard_time,type,value,path FROM gn011dc "
86  "WHERE key=$1 AND type=$2 AND discard_time >= $3",
87  3),
89  "SELECT discard_time,type,value,path FROM gn011dc "
90  "WHERE key=$1 AND discard_time >= $2",
91  2),
92  GNUNET_PQ_make_prepare("getex",
93  "SELECT length(value) AS len,oid,key FROM gn011dc"
94  " WHERE discard_time < $1"
95  " ORDER BY discard_time ASC LIMIT 1",
96  1),
98  "SELECT length(value) AS len,oid,key FROM gn011dc"
99  " ORDER BY prox ASC, discard_time ASC LIMIT 1",
100  0),
101  GNUNET_PQ_make_prepare("get_random",
102  "SELECT discard_time,type,value,path,key FROM gn011dc"
103  " WHERE discard_time >= $1"
104  " ORDER BY key ASC LIMIT 1 OFFSET $2",
105  2),
106  GNUNET_PQ_make_prepare("get_closest",
107  "SELECT discard_time,type,value,path,key FROM gn011dc "
108  "WHERE key>=$1 AND discard_time >= $2 ORDER BY key ASC LIMIT $3",
109  3),
110  GNUNET_PQ_make_prepare("delrow",
111  "DELETE FROM gn011dc WHERE oid=$1",
112  1),
114  "INSERT INTO gn011dc (type, prox, discard_time, key, value, path) "
115  "VALUES ($1, $2, $3, $4, $5, $6)",
116  6),
118  };
119 
120  plugin->dbh = GNUNET_PQ_connect_with_cfg(plugin->env->cfg,
121  "datacache-postgres");
122  if (NULL == plugin->dbh)
123  return GNUNET_SYSERR;
124  if (GNUNET_OK !=
126  es))
127  {
128  PQfinish(plugin->dbh);
129  plugin->dbh = NULL;
130  return GNUNET_SYSERR;
131  }
132 
133  if (GNUNET_OK !=
135  ps))
136  {
137  PQfinish(plugin->dbh);
138  plugin->dbh = NULL;
139  return GNUNET_SYSERR;
140  }
141  return GNUNET_OK;
142 }
struct GNUNET_PQ_ExecuteStatement GNUNET_PQ_make_execute(const char *sql)
Create a struct GNUNET_PQ_ExecuteStatement where errors are fatal.
Definition: pq_exec.c:37
const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration to use.
Information needed to run a list of SQL statements using GNUNET_PQ_exec_statements().
Information needed to prepare a list of SQL statements using GNUNET_PQ_prepare_statements().
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
int GNUNET_PQ_prepare_statements(PGconn *connection, const struct GNUNET_PQ_PreparedStatement *ps)
Request creation of prepared statements ps from Postgres.
Definition: pq_prepare.c:63
struct GNUNET_DATACACHE_PluginEnvironment * env
Our execution environment.
PGconn * GNUNET_PQ_connect_with_cfg(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section)
Connect to a postgres database using the configuration option "CONFIG" in section.
Definition: pq_connect.c:112
#define GNUNET_PQ_PREPARED_STATEMENT_END
Terminator for prepared statement list.
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
int GNUNET_PQ_exec_statements(PGconn *connection, const struct GNUNET_PQ_ExecuteStatement *es)
Request execution of an array of statements es from Postgres.
Definition: pq_exec.c:77
PGconn * dbh
Native Postgres database handle.
#define GNUNET_PQ_EXECUTE_STATEMENT_END
Terminator for executable statement list.
struct GNUNET_PQ_ExecuteStatement GNUNET_PQ_make_try_execute(const char *sql)
Create a struct GNUNET_PQ_ExecuteStatement where errors should be tolerated.
Definition: pq_exec.c:56
struct GNUNET_PQ_PreparedStatement GNUNET_PQ_make_prepare(const char *name, const char *sql, unsigned int num_args)
Create a struct GNUNET_PQ_PreparedStatement.
Definition: pq_prepare.c:39
Here is the call graph for this function:
Here is the caller graph for this function:

◆ postgres_plugin_put()

static ssize_t postgres_plugin_put ( void *  cls,
const struct GNUNET_HashCode key,
uint32_t  prox,
size_t  data_size,
const char *  data,
enum GNUNET_BLOCK_Type  type,
struct GNUNET_TIME_Absolute  discard_time,
unsigned int  path_info_len,
const struct GNUNET_PeerIdentity path_info 
)
static

Store an item in the datastore.

Parameters
clsclosure (our struct Plugin)
keykey to store data under
proxproximity of key to my PID
data_sizenumber of bytes in data
datadata to store
typetype of the value
discard_timewhen to discard the value in any case
path_info_lennumber of entries in path_info
path_infoa path through the network
Returns
0 if duplicate, -1 on error, number of bytes used otherwise

Definition at line 160 of file plugin_datacache_postgres.c.

References Plugin::dbh, GNUNET_PQ_eval_prepared_non_select(), GNUNET_PQ_query_param_absolute_time(), GNUNET_PQ_query_param_auto_from_type, GNUNET_PQ_query_param_end, GNUNET_PQ_query_param_fixed_size(), GNUNET_PQ_query_param_uint32(), Plugin::num_items, OVERHEAD, plugin, and ret.

Referenced by libgnunet_plugin_datacache_postgres_init().

169 {
170  struct Plugin *plugin = cls;
171  uint32_t type32 = (uint32_t)type;
172  struct GNUNET_PQ_QueryParam params[] = {
179  path_info_len * sizeof(struct GNUNET_PeerIdentity)),
181  };
183 
185  "put",
186  params);
187  if (0 > ret)
188  return -1;
189  plugin->num_items++;
190  return data_size + OVERHEAD;
191 }
struct GNUNET_PQ_QueryParam GNUNET_PQ_query_param_absolute_time(const struct GNUNET_TIME_Absolute *x)
Generate query parameter for an absolute time value.
enum GNUNET_DB_QueryStatus GNUNET_PQ_eval_prepared_non_select(PGconn *connection, const char *statement_name, const struct GNUNET_PQ_QueryParam *params)
Execute a named prepared statement that is NOT a SELECT statement in connnection using the given para...
Definition: pq_eval.c:151
static int ret
Final status code.
Definition: gnunet-arm.c:89
#define OVERHEAD
Per-entry overhead estimate.
static struct GNUNET_ATS_SolverFunctions * plugin
Our solver.
#define GNUNET_PQ_query_param_end
End of query parameter specification.
Definition: gnunet_pq_lib.h:94
#define GNUNET_PQ_query_param_auto_from_type(x)
Generate fixed-size query parameter with size determined by variable type.
struct GNUNET_PQ_QueryParam GNUNET_PQ_query_param_uint32(const uint32_t *x)
Generate query parameter for an uint32_t in host byte order.
The identity of the host (wraps the signing key of the peer).
Handle for a plugin.
Definition: block.c:37
PGconn * dbh
Native Postgres database handle.
Description of a DB query parameter.
Definition: gnunet_pq_lib.h:63
struct GNUNET_PQ_QueryParam GNUNET_PQ_query_param_fixed_size(const void *ptr, size_t ptr_size)
Generate query parameter for a buffer ptr of ptr_size bytes.
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model
GNUNET_DB_QueryStatus
Status code returned from functions running database commands.
Definition: gnunet_db_lib.h:34
unsigned int num_items
Number of key-value pairs in the database.
uint32_t data
The data value.
static size_t data_size
Number of bytes in data.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ handle_results()

static void handle_results ( void *  cls,
PGresult *  result,
unsigned int  num_results 
)
static

Function to be called with the results of a SELECT statement that has returned num_results results.

Parse the result and call the callback given in cls

Parameters
clsclosure of type struct HandleResultContext
resultthe postgres result
num_resultthe number of results in result

Definition at line 225 of file plugin_datacache_postgres.c.

References data, data_size, GNUNET_break, GNUNET_ERROR_TYPE_DEBUG, GNUNET_PQ_cleanup_result(), GNUNET_PQ_extract_result(), GNUNET_PQ_result_spec_absolute_time(), GNUNET_PQ_result_spec_end, GNUNET_PQ_result_spec_uint32(), GNUNET_PQ_result_spec_variable_size(), GNUNET_SYSERR, GNUNET_YES, HandleResultContext::iter, HandleResultContext::iter_cls, HandleResultContext::key, LOG, and type.

Referenced by postgres_plugin_get().

228 {
229  struct HandleResultContext *hrc = cls;
230 
231  for (unsigned int i = 0; i < num_results; i++)
232  {
233  struct GNUNET_TIME_Absolute expiration_time;
234  uint32_t type;
235  void *data;
236  size_t data_size;
237  struct GNUNET_PeerIdentity *path;
238  size_t path_len;
239  struct GNUNET_PQ_ResultSpec rs[] = {
241  &expiration_time),
243  &type),
245  &data,
246  &data_size),
248  (void **)&path,
249  &path_len),
251  };
252 
253  if (GNUNET_YES !=
255  rs,
256  i))
257  {
258  GNUNET_break(0);
259  return;
260  }
261  if (0 != (path_len % sizeof(struct GNUNET_PeerIdentity)))
262  {
263  GNUNET_break(0);
264  path_len = 0;
265  }
266  path_len %= sizeof(struct GNUNET_PeerIdentity);
268  "Found result of size %u bytes and type %u in database\n",
269  (unsigned int)data_size,
270  (unsigned int)type);
271  if ((NULL != hrc->iter) &&
272  (GNUNET_SYSERR ==
273  hrc->iter(hrc->iter_cls,
274  hrc->key,
275  data_size,
276  data,
277  (enum GNUNET_BLOCK_Type)type,
278  expiration_time,
279  path_len,
280  path)))
281  {
283  "Ending iteration (client error)\n");
285  return;
286  }
288  }
289 }
void * iter_cls
Closure for iter.
GNUNET_BLOCK_Type
Blocks in the datastore and the datacache must have a unique type.
#define LOG(kind,...)
Description of a DB result cell.
Closure for handle_results.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
#define GNUNET_PQ_result_spec_end
End of result parameter specification.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_variable_size(const char *name, void **dst, size_t *sptr)
Variable-size result expected.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_uint32(const char *name, uint32_t *u32)
uint32_t expected.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_absolute_time(const char *name, struct GNUNET_TIME_Absolute *at)
Absolute time expected.
static int result
Global testing status.
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
GNUNET_DATACACHE_Iterator iter
Function to call on each result, may be NULL.
The identity of the host (wraps the signing key of the peer).
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model
Time for absolute times used by GNUnet, in microseconds.
#define GNUNET_YES
Definition: gnunet_common.h:77
uint32_t data
The data value.
static size_t data_size
Number of bytes in data.
const struct GNUNET_HashCode * key
Key used.
int GNUNET_PQ_extract_result(PGresult *result, struct GNUNET_PQ_ResultSpec *rs, int row)
Extract results from a query result according to the given specification.
Definition: pq.c:144
void GNUNET_PQ_cleanup_result(struct GNUNET_PQ_ResultSpec *rs)
Free all memory that was allocated in rs during GNUNET_PQ_extract_result().
Definition: pq.c:121
Here is the call graph for this function:
Here is the caller graph for this function:

◆ postgres_plugin_get()

static unsigned int postgres_plugin_get ( void *  cls,
const struct GNUNET_HashCode key,
enum GNUNET_BLOCK_Type  type,
GNUNET_DATACACHE_Iterator  iter,
void *  iter_cls 
)
static

Iterate over the results for a particular key in the datastore.

Parameters
clsclosure (our struct Plugin)
keykey to look for
typeentries of which type are relevant?
itermaybe NULL (to just count)
iter_clsclosure for iter
Returns
the number of results found

Definition at line 304 of file plugin_datacache_postgres.c.

References Plugin::dbh, GNUNET_PQ_eval_prepared_multi_select(), GNUNET_PQ_query_param_absolute_time(), GNUNET_PQ_query_param_auto_from_type, GNUNET_PQ_query_param_end, GNUNET_PQ_query_param_uint32(), GNUNET_TIME_absolute_get(), handle_results(), Plugin::iter, HandleResultContext::iter, Plugin::iter_cls, HandleResultContext::iter_cls, Plugin::key, HandleResultContext::key, plugin, and res.

Referenced by libgnunet_plugin_datacache_postgres_init().

309 {
310  struct Plugin *plugin = cls;
311  uint32_t type32 = (uint32_t)type;
312  struct GNUNET_TIME_Absolute now;
313  struct GNUNET_PQ_QueryParam paramk[] = {
317  };
318  struct GNUNET_PQ_QueryParam paramkt[] = {
323  };
325  struct HandleResultContext hr_ctx;
326 
327  now = GNUNET_TIME_absolute_get();
328  hr_ctx.iter = iter;
329  hr_ctx.iter_cls = iter_cls;
330  hr_ctx.key = key;
332  (0 == type) ? "getk" : "getkt",
333  (0 == type) ? paramk : paramkt,
335  &hr_ctx);
336  if (res < 0)
337  return 0;
338  return res;
339 }
void * iter_cls
Closure for iter.
Closure for handle_results.
struct GNUNET_PQ_QueryParam GNUNET_PQ_query_param_absolute_time(const struct GNUNET_TIME_Absolute *x)
Generate query parameter for an absolute time value.
static struct GNUNET_ATS_SolverFunctions * plugin
Our solver.
#define GNUNET_PQ_query_param_end
End of query parameter specification.
Definition: gnunet_pq_lib.h:94
#define GNUNET_PQ_query_param_auto_from_type(x)
Generate fixed-size query parameter with size determined by variable type.
struct GNUNET_PQ_QueryParam GNUNET_PQ_query_param_uint32(const uint32_t *x)
Generate query parameter for an uint32_t in host byte order.
static void handle_results(void *cls, PGresult *result, unsigned int num_results)
Function to be called with the results of a SELECT statement that has returned num_results results...
static int res
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get(void)
Get the current time.
Definition: time.c:118
struct GNUNET_HashCode key
The key used in the DHT.
GNUNET_DATACACHE_Iterator iter
Function to call on each result, may be NULL.
Handle for a plugin.
Definition: block.c:37
PGconn * dbh
Native Postgres database handle.
Description of a DB query parameter.
Definition: gnunet_pq_lib.h:63
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model
Time for absolute times used by GNUnet, in microseconds.
GNUNET_DB_QueryStatus
Status code returned from functions running database commands.
Definition: gnunet_db_lib.h:34
enum GNUNET_DB_QueryStatus GNUNET_PQ_eval_prepared_multi_select(PGconn *connection, const char *statement_name, const struct GNUNET_PQ_QueryParam *params, GNUNET_PQ_PostgresResultHandler rh, void *rh_cls)
Execute a named prepared statement that is a SELECT statement which may return multiple results in co...
Definition: pq_eval.c:194
Here is the call graph for this function:
Here is the caller graph for this function:

◆ postgres_plugin_del()

static int postgres_plugin_del ( void *  cls)
static

Delete the entry with the lowest expiration value from the datacache right now.

Parameters
clsclosure (our struct Plugin)
Returns
GNUNET_OK on success, GNUNET_SYSERR on error

Definition at line 350 of file plugin_datacache_postgres.c.

References GNUNET_DATACACHE_PluginEnvironment::cls, Plugin::dbh, GNUNET_DATACACHE_PluginEnvironment::delete_notify, Plugin::env, GNUNET_DB_STATUS_SUCCESS_NO_RESULTS, GNUNET_ERROR_TYPE_DEBUG, GNUNET_OK, GNUNET_PQ_cleanup_result(), GNUNET_PQ_eval_prepared_non_select(), GNUNET_PQ_eval_prepared_singleton_select(), GNUNET_PQ_query_param_absolute_time(), GNUNET_PQ_query_param_end, GNUNET_PQ_query_param_uint32(), GNUNET_PQ_result_spec_auto_from_type, GNUNET_PQ_result_spec_end, GNUNET_PQ_result_spec_uint32(), GNUNET_SYSERR, GNUNET_TIME_absolute_get(), LOG, Plugin::num_items, OVERHEAD, plugin, res, and Plugin::size.

Referenced by libgnunet_plugin_datacache_postgres_init().

351 {
352  struct Plugin *plugin = cls;
353  struct GNUNET_PQ_QueryParam pempty[] = {
355  };
356  uint32_t size;
357  uint32_t oid;
358  struct GNUNET_HashCode key;
359  struct GNUNET_PQ_ResultSpec rs[] = {
361  &size),
363  &oid),
365  &key),
367  };
369  struct GNUNET_PQ_QueryParam dparam[] = {
372  };
373  struct GNUNET_TIME_Absolute now;
374  struct GNUNET_PQ_QueryParam xparam[] = {
377  };
378 
379  now = GNUNET_TIME_absolute_get();
381  "getex",
382  xparam,
383  rs);
384  if (0 >= res)
386  "getm",
387  pempty,
388  rs);
389  if (0 > res)
390  return GNUNET_SYSERR;
392  {
393  /* no result */
395  "Ending iteration (no more results)\n");
396  return 0;
397  }
399  "delrow",
400  dparam);
401  if (0 > res)
402  {
404  return GNUNET_SYSERR;
405  }
406  plugin->num_items--;
407  plugin->env->delete_notify(plugin->env->cls,
408  &key,
409  size + OVERHEAD);
411  return GNUNET_OK;
412 }
#define LOG(kind,...)
Description of a DB result cell.
struct GNUNET_PQ_QueryParam GNUNET_PQ_query_param_absolute_time(const struct GNUNET_TIME_Absolute *x)
Generate query parameter for an absolute time value.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
enum GNUNET_DB_QueryStatus GNUNET_PQ_eval_prepared_singleton_select(PGconn *connection, const char *statement_name, const struct GNUNET_PQ_QueryParam *params, struct GNUNET_PQ_ResultSpec *rs)
Execute a named prepared statement that is a SELECT statement which must return a single result in co...
Definition: pq_eval.c:241
enum GNUNET_DB_QueryStatus GNUNET_PQ_eval_prepared_non_select(PGconn *connection, const char *statement_name, const struct GNUNET_PQ_QueryParam *params)
Execute a named prepared statement that is NOT a SELECT statement in connnection using the given para...
Definition: pq_eval.c:151
GNUNET_DATACACHE_DeleteNotifyCallback delete_notify
Function to call whenever the plugin needs to discard content that it was asked to store...
#define OVERHEAD
Per-entry overhead estimate.
static struct GNUNET_ATS_SolverFunctions * plugin
Our solver.
#define GNUNET_PQ_result_spec_end
End of result parameter specification.
#define GNUNET_PQ_query_param_end
End of query parameter specification.
Definition: gnunet_pq_lib.h:94
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_uint32(const char *name, uint32_t *u32)
uint32_t expected.
struct GNUNET_DATACACHE_PluginEnvironment * env
Our execution environment.
struct GNUNET_PQ_QueryParam GNUNET_PQ_query_param_uint32(const uint32_t *x)
Generate query parameter for an uint32_t in host byte order.
A 512-bit hashcode.
static int res
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get(void)
Get the current time.
Definition: time.c:118
#define GNUNET_PQ_result_spec_auto_from_type(name, dst)
We expect a fixed-size result, with size determined by the type of * dst
struct GNUNET_HashCode key
The key used in the DHT.
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
static unsigned int size
Size of the "table".
Definition: peer.c:66
Handle for a plugin.
Definition: block.c:37
PGconn * dbh
Native Postgres database handle.
Description of a DB query parameter.
Definition: gnunet_pq_lib.h:63
void * cls
Closure to use for callbacks.
Time for absolute times used by GNUnet, in microseconds.
GNUNET_DB_QueryStatus
Status code returned from functions running database commands.
Definition: gnunet_db_lib.h:34
unsigned int num_items
Number of key-value pairs in the database.
The transaction succeeded, but yielded zero results.
Definition: gnunet_db_lib.h:52
void GNUNET_PQ_cleanup_result(struct GNUNET_PQ_ResultSpec *rs)
Free all memory that was allocated in rs during GNUNET_PQ_extract_result().
Definition: pq.c:121
Here is the call graph for this function:
Here is the caller graph for this function:

◆ postgres_plugin_get_random()

static unsigned int postgres_plugin_get_random ( void *  cls,
GNUNET_DATACACHE_Iterator  iter,
void *  iter_cls 
)
static

Obtain a random key-value pair from the datacache.

Parameters
clsclosure (our struct Plugin)
itermaybe NULL (to just count)
iter_clsclosure for iter
Returns
the number of results found, zero (datacache empty) or one

Definition at line 424 of file plugin_datacache_postgres.c.

References data, data_size, Plugin::dbh, GNUNET_break, GNUNET_CRYPTO_QUALITY_NONCE, GNUNET_CRYPTO_random_u32(), GNUNET_DB_STATUS_SUCCESS_NO_RESULTS, GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_PQ_cleanup_result(), GNUNET_PQ_eval_prepared_singleton_select(), GNUNET_PQ_query_param_absolute_time(), GNUNET_PQ_query_param_end, GNUNET_PQ_query_param_uint32(), GNUNET_PQ_result_spec_absolute_time(), GNUNET_PQ_result_spec_auto_from_type, GNUNET_PQ_result_spec_end, GNUNET_PQ_result_spec_uint32(), GNUNET_PQ_result_spec_variable_size(), GNUNET_TIME_absolute_get(), Plugin::iter, LOG, Plugin::num_items, plugin, res, and type.

Referenced by libgnunet_plugin_datacache_postgres_init().

427 {
428  struct Plugin *plugin = cls;
429  uint32_t off;
430  struct GNUNET_TIME_Absolute now;
431  struct GNUNET_TIME_Absolute expiration_time;
432  size_t data_size;
433  void *data;
434  size_t path_len;
435  struct GNUNET_PeerIdentity *path;
436  struct GNUNET_HashCode key;
437  uint32_t type;
439  struct GNUNET_PQ_QueryParam params[] = {
443  };
444  struct GNUNET_PQ_ResultSpec rs[] = {
446  &expiration_time),
448  &type),
450  &data,
451  &data_size),
453  (void **)&path,
454  &path_len),
456  &key),
458  };
459 
460  if (0 == plugin->num_items)
461  return 0;
462  if (NULL == iter)
463  return 1;
464  now = GNUNET_TIME_absolute_get();
466  plugin->num_items);
468  "get_random",
469  params,
470  rs);
471  if (0 > res)
472  {
473  GNUNET_break(0);
474  return 0;
475  }
477  {
478  GNUNET_break(0);
479  return 0;
480  }
481  if (0 != (path_len % sizeof(struct GNUNET_PeerIdentity)))
482  {
483  GNUNET_break(0);
484  path_len = 0;
485  }
486  path_len %= sizeof(struct GNUNET_PeerIdentity);
488  "Found random value with key %s of size %u bytes and type %u in database\n",
489  GNUNET_h2s(&key),
490  (unsigned int)data_size,
491  (unsigned int)type);
492  (void)iter(iter_cls,
493  &key,
494  data_size,
495  data,
496  (enum GNUNET_BLOCK_Type)type,
497  expiration_time,
498  path_len,
499  path);
501  return 1;
502 }
GNUNET_BLOCK_Type
Blocks in the datastore and the datacache must have a unique type.
#define LOG(kind,...)
uint32_t GNUNET_CRYPTO_random_u32(enum GNUNET_CRYPTO_Quality mode, uint32_t i)
Produce a random value.
Description of a DB result cell.
struct GNUNET_PQ_QueryParam GNUNET_PQ_query_param_absolute_time(const struct GNUNET_TIME_Absolute *x)
Generate query parameter for an absolute time value.
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
enum GNUNET_DB_QueryStatus GNUNET_PQ_eval_prepared_singleton_select(PGconn *connection, const char *statement_name, const struct GNUNET_PQ_QueryParam *params, struct GNUNET_PQ_ResultSpec *rs)
Execute a named prepared statement that is a SELECT statement which must return a single result in co...
Definition: pq_eval.c:241
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
static struct GNUNET_ATS_SolverFunctions * plugin
Our solver.
#define GNUNET_PQ_result_spec_end
End of result parameter specification.
#define GNUNET_PQ_query_param_end
End of query parameter specification.
Definition: gnunet_pq_lib.h:94
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_variable_size(const char *name, void **dst, size_t *sptr)
Variable-size result expected.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_uint32(const char *name, uint32_t *u32)
uint32_t expected.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_absolute_time(const char *name, struct GNUNET_TIME_Absolute *at)
Absolute time expected.
Randomness for IVs etc.
struct GNUNET_PQ_QueryParam GNUNET_PQ_query_param_uint32(const uint32_t *x)
Generate query parameter for an uint32_t in host byte order.
A 512-bit hashcode.
static int res
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get(void)
Get the current time.
Definition: time.c:118
#define GNUNET_PQ_result_spec_auto_from_type(name, dst)
We expect a fixed-size result, with size determined by the type of * dst
struct GNUNET_HashCode key
The key used in the DHT.
The identity of the host (wraps the signing key of the peer).
Handle for a plugin.
Definition: block.c:37
PGconn * dbh
Native Postgres database handle.
Description of a DB query parameter.
Definition: gnunet_pq_lib.h:63
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model
Time for absolute times used by GNUnet, in microseconds.
GNUNET_DB_QueryStatus
Status code returned from functions running database commands.
Definition: gnunet_db_lib.h:34
unsigned int num_items
Number of key-value pairs in the database.
The transaction succeeded, but yielded zero results.
Definition: gnunet_db_lib.h:52
uint32_t data
The data value.
static size_t data_size
Number of bytes in data.
void GNUNET_PQ_cleanup_result(struct GNUNET_PQ_ResultSpec *rs)
Free all memory that was allocated in rs during GNUNET_PQ_extract_result().
Definition: pq.c:121
Here is the call graph for this function:
Here is the caller graph for this function:

◆ extract_result_cb()

static void extract_result_cb ( void *  cls,
PGresult *  result,
unsigned int  num_results 
)
static

Function to be called with the results of a SELECT statement that has returned num_results results.

Calls the iter from cls for each result.

Parameters
clsclosure with the struct ExtractResultContext
resultthe postgres result
num_resultthe number of results in result

Definition at line 531 of file plugin_datacache_postgres.c.

References data, data_size, GNUNET_break, GNUNET_ERROR_TYPE_DEBUG, GNUNET_PQ_cleanup_result(), GNUNET_PQ_extract_result(), GNUNET_PQ_result_spec_absolute_time(), GNUNET_PQ_result_spec_auto_from_type, GNUNET_PQ_result_spec_end, GNUNET_PQ_result_spec_uint32(), GNUNET_PQ_result_spec_variable_size(), GNUNET_SYSERR, GNUNET_YES, ExtractResultContext::iter, ExtractResultContext::iter_cls, LOG, and type.

Referenced by postgres_plugin_get_closest().

534 {
535  struct ExtractResultContext *erc = cls;
536 
537  if (NULL == erc->iter)
538  return;
539  for (unsigned int i = 0; i < num_results; i++)
540  {
541  struct GNUNET_TIME_Absolute expiration_time;
542  uint32_t type;
543  void *data;
544  size_t data_size;
545  struct GNUNET_PeerIdentity *path;
546  size_t path_len;
547  struct GNUNET_HashCode key;
548  struct GNUNET_PQ_ResultSpec rs[] = {
550  &expiration_time),
552  &type),
554  &data,
555  &data_size),
557  (void **)&path,
558  &path_len),
560  &key),
562  };
563 
564  if (GNUNET_YES !=
566  rs,
567  i))
568  {
569  GNUNET_break(0);
570  return;
571  }
572  if (0 != (path_len % sizeof(struct GNUNET_PeerIdentity)))
573  {
574  GNUNET_break(0);
575  path_len = 0;
576  }
577  path_len %= sizeof(struct GNUNET_PeerIdentity);
579  "Found result of size %u bytes and type %u in database\n",
580  (unsigned int)data_size,
581  (unsigned int)type);
582  if (GNUNET_SYSERR ==
583  erc->iter(erc->iter_cls,
584  &key,
585  data_size,
586  data,
587  (enum GNUNET_BLOCK_Type)type,
588  expiration_time,
589  path_len,
590  path))
591  {
593  "Ending iteration (client error)\n");
595  break;
596  }
598  }
599 }
void * iter_cls
Closure for iter.
GNUNET_BLOCK_Type
Blocks in the datastore and the datacache must have a unique type.
#define LOG(kind,...)
Description of a DB result cell.
Closure for extract_result_cb.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
#define GNUNET_PQ_result_spec_end
End of result parameter specification.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_variable_size(const char *name, void **dst, size_t *sptr)
Variable-size result expected.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_uint32(const char *name, uint32_t *u32)
uint32_t expected.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_absolute_time(const char *name, struct GNUNET_TIME_Absolute *at)
Absolute time expected.
static int result
Global testing status.
A 512-bit hashcode.
#define GNUNET_PQ_result_spec_auto_from_type(name, dst)
We expect a fixed-size result, with size determined by the type of * dst
struct GNUNET_HashCode key
The key used in the DHT.
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
The identity of the host (wraps the signing key of the peer).
GNUNET_DATACACHE_Iterator iter
Function to call for each result found.
enum GNUNET_TESTBED_UnderlayLinkModelType type
the type of this model
Time for absolute times used by GNUnet, in microseconds.
#define GNUNET_YES
Definition: gnunet_common.h:77
uint32_t data
The data value.
static size_t data_size
Number of bytes in data.
int GNUNET_PQ_extract_result(PGresult *result, struct GNUNET_PQ_ResultSpec *rs, int row)
Extract results from a query result according to the given specification.
Definition: pq.c:144
void GNUNET_PQ_cleanup_result(struct GNUNET_PQ_ResultSpec *rs)
Free all memory that was allocated in rs during GNUNET_PQ_extract_result().
Definition: pq.c:121
Here is the call graph for this function:
Here is the caller graph for this function:

◆ postgres_plugin_get_closest()

static unsigned int postgres_plugin_get_closest ( void *  cls,
const struct GNUNET_HashCode key,
unsigned int  num_results,
GNUNET_DATACACHE_Iterator  iter,
void *  iter_cls 
)
static

Iterate over the results that are "close" to a particular key in the datacache.

"close" is defined as numerically larger than key (when interpreted as a circular address space), with small distance.

Parameters
clsclosure (internal context for the plugin)
keyarea of the keyspace to look into
num_resultsnumber of results that should be returned to iter
itermaybe NULL (to just count)
iter_clsclosure for iter
Returns
the number of results found

Definition at line 616 of file plugin_datacache_postgres.c.

References Plugin::dbh, extract_result_cb(), GNUNET_DB_STATUS_SUCCESS_NO_RESULTS, GNUNET_ERROR_TYPE_DEBUG, GNUNET_PQ_eval_prepared_multi_select(), GNUNET_PQ_query_param_absolute_time(), GNUNET_PQ_query_param_auto_from_type, GNUNET_PQ_query_param_end, GNUNET_PQ_query_param_uint32(), GNUNET_TIME_absolute_get(), Plugin::iter, ExtractResultContext::iter, Plugin::iter_cls, ExtractResultContext::iter_cls, LOG, plugin, and res.

Referenced by libgnunet_plugin_datacache_postgres_init().

621 {
622  struct Plugin *plugin = cls;
623  uint32_t num_results32 = (uint32_t)num_results;
624  struct GNUNET_TIME_Absolute now;
625  struct GNUNET_PQ_QueryParam params[] = {
628  GNUNET_PQ_query_param_uint32(&num_results32),
630  };
632  struct ExtractResultContext erc;
633 
634  erc.iter = iter;
635  erc.iter_cls = iter_cls;
636  now = GNUNET_TIME_absolute_get();
638  "get_closest",
639  params,
641  &erc);
642  if (0 > res)
643  {
645  "Ending iteration (postgres error)\n");
646  return 0;
647  }
649  {
650  /* no result */
652  "Ending iteration (no more results)\n");
653  return 0;
654  }
655  return res;
656 }
void * iter_cls
Closure for iter.
#define LOG(kind,...)
struct GNUNET_PQ_QueryParam GNUNET_PQ_query_param_absolute_time(const struct GNUNET_TIME_Absolute *x)
Generate query parameter for an absolute time value.
Closure for extract_result_cb.
static struct GNUNET_ATS_SolverFunctions * plugin
Our solver.
#define GNUNET_PQ_query_param_end
End of query parameter specification.
Definition: gnunet_pq_lib.h:94
static void extract_result_cb(void *cls, PGresult *result, unsigned int num_results)
Function to be called with the results of a SELECT statement that has returned num_results results...
#define GNUNET_PQ_query_param_auto_from_type(x)
Generate fixed-size query parameter with size determined by variable type.
struct GNUNET_PQ_QueryParam GNUNET_PQ_query_param_uint32(const uint32_t *x)
Generate query parameter for an uint32_t in host byte order.
static int res
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get(void)
Get the current time.
Definition: time.c:118
Handle for a plugin.
Definition: block.c:37
PGconn * dbh
Native Postgres database handle.
GNUNET_DATACACHE_Iterator iter
Function to call for each result found.
Description of a DB query parameter.
Definition: gnunet_pq_lib.h:63
Time for absolute times used by GNUnet, in microseconds.
GNUNET_DB_QueryStatus
Status code returned from functions running database commands.
Definition: gnunet_db_lib.h:34
The transaction succeeded, but yielded zero results.
Definition: gnunet_db_lib.h:52
enum GNUNET_DB_QueryStatus GNUNET_PQ_eval_prepared_multi_select(PGconn *connection, const char *statement_name, const struct GNUNET_PQ_QueryParam *params, GNUNET_PQ_PostgresResultHandler rh, void *rh_cls)
Execute a named prepared statement that is a SELECT statement which may return multiple results in co...
Definition: pq_eval.c:194
Here is the call graph for this function:
Here is the caller graph for this function:

◆ libgnunet_plugin_datacache_postgres_init()

void* libgnunet_plugin_datacache_postgres_init ( void *  cls)

Entry point for the plugin.

Parameters
clsclosure (the struct GNUNET_DATACACHE_PluginEnvironmnet)
Returns
the plugin's closure (our struct Plugin)

Definition at line 666 of file plugin_datacache_postgres.c.

References Plugin::api, GNUNET_DATACACHE_PluginEnvironment::cls, GNUNET_DATACACHE_PluginFunctions::cls, GNUNET_DATACACHE_PluginFunctions::del, Plugin::env, GNUNET_DATACACHE_PluginFunctions::get, GNUNET_DATACACHE_PluginFunctions::get_closest, GNUNET_DATACACHE_PluginFunctions::get_random, GNUNET_ERROR_TYPE_INFO, GNUNET_free, GNUNET_new, GNUNET_OK, init_connection(), LOG, plugin, postgres_plugin_del(), postgres_plugin_get(), postgres_plugin_get_closest(), postgres_plugin_get_random(), postgres_plugin_put(), and GNUNET_DATACACHE_PluginFunctions::put.

667 {
670  struct Plugin *plugin;
671 
672  plugin = GNUNET_new(struct Plugin);
673  plugin->env = env;
674 
675  if (GNUNET_OK != init_connection(plugin))
676  {
677  GNUNET_free(plugin);
678  return NULL;
679  }
680 
682  api->cls = plugin;
683  api->get = &postgres_plugin_get;
684  api->put = &postgres_plugin_put;
685  api->del = &postgres_plugin_del;
689  "Postgres datacache running\n");
690  return api;
691 }
void * cls
Closure to pass to all plugin functions.
static unsigned int postgres_plugin_get_random(void *cls, GNUNET_DATACACHE_Iterator iter, void *iter_cls)
Obtain a random key-value pair from the datacache.
ssize_t(* put)(void *cls, const struct GNUNET_HashCode *key, uint32_t xor_distance, size_t size, const char *data, enum GNUNET_BLOCK_Type type, struct GNUNET_TIME_Absolute discard_time, unsigned int path_info_len, const struct GNUNET_PeerIdentity *path_info)
Store an item in the datastore.
int(* del)(void *cls)
Delete the entry with the lowest expiration value from the datacache right now.
static int postgres_plugin_del(void *cls)
Delete the entry with the lowest expiration value from the datacache right now.
#define LOG(kind,...)
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
#define GNUNET_new(type)
Allocate a struct or union of the given type.
struct GNUNET_BLOCK_PluginFunctions * api
Plugin API.
Definition: block.c:46
static unsigned int postgres_plugin_get_closest(void *cls, const struct GNUNET_HashCode *key, unsigned int num_results, GNUNET_DATACACHE_Iterator iter, void *iter_cls)
Iterate over the results that are "close" to a particular key in the datacache.
static struct GNUNET_ATS_SolverFunctions * plugin
Our solver.
struct GNUNET_DATACACHE_PluginEnvironment * env
Our execution environment.
unsigned int(* get_closest)(void *cls, const struct GNUNET_HashCode *key, unsigned int num_results, GNUNET_DATACACHE_Iterator iter, void *iter_cls)
Iterate over the results that are "close" to a particular key in the datacache.
static ssize_t postgres_plugin_put(void *cls, const struct GNUNET_HashCode *key, uint32_t prox, size_t data_size, const char *data, enum GNUNET_BLOCK_Type type, struct GNUNET_TIME_Absolute discard_time, unsigned int path_info_len, const struct GNUNET_PeerIdentity *path_info)
Store an item in the datastore.
struct returned by the initialization function of the plugin
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
Handle for a plugin.
Definition: block.c:37
void * cls
Closure to use for callbacks.
unsigned int(* get_random)(void *cls, GNUNET_DATACACHE_Iterator iter, void *iter_cls)
Return a random value from the datastore.
static int init_connection(struct Plugin *plugin)
Get a database handle.
static unsigned int postgres_plugin_get(void *cls, const struct GNUNET_HashCode *key, enum GNUNET_BLOCK_Type type, GNUNET_DATACACHE_Iterator iter, void *iter_cls)
Iterate over the results for a particular key in the datastore.
The datastore service will pass a pointer to a struct of this type as the first and only argument to ...
unsigned int(* get)(void *cls, const struct GNUNET_HashCode *key, enum GNUNET_BLOCK_Type type, GNUNET_DATACACHE_Iterator iter, void *iter_cls)
Iterate over the results for a particular key in the datastore.
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:

◆ libgnunet_plugin_datacache_postgres_done()

void* libgnunet_plugin_datacache_postgres_done ( void *  cls)

Exit point from the plugin.

Parameters
clsclosure (our struct Plugin)
Returns
NULL

Definition at line 701 of file plugin_datacache_postgres.c.

References Plugin::api, GNUNET_DATACACHE_PluginFunctions::cls, Plugin::dbh, GNUNET_free, and plugin.

702 {
704  struct Plugin *plugin = api->cls;
705 
706  PQfinish(plugin->dbh);
707  GNUNET_free(plugin);
708  GNUNET_free(api);
709  return NULL;
710 }
void * cls
Closure to pass to all plugin functions.
static struct GNUNET_ATS_SolverFunctions * plugin
Our solver.
struct returned by the initialization function of the plugin
Handle for a plugin.
Definition: block.c:37
PGconn * dbh
Native Postgres database handle.
#define GNUNET_free(ptr)
Wrapper around free.