GNUnet  0.20.0
plugin_namestore_postgres.c File Reference

postgres-based namestore backend More...

Include dependency graph for plugin_namestore_postgres.c:

Go to the source code of this file.

Data Structures

struct  Plugin
 Handle for a plugin. More...
 
struct  ParserContext
 Closure for parse_result_call_iterator. More...
 

Macros

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

Functions

static enum GNUNET_GenericReturnValue namestore_postgres_create_tables (void *cls)
 Initialize the database connections and associated data structures (create tables and indices as needed as well). More...
 
static enum GNUNET_GenericReturnValue namestore_postgres_drop_tables (void *cls)
 Drop existing namestore tables. More...
 
static enum GNUNET_GenericReturnValue database_prepare (struct Plugin *plugin)
 
static enum GNUNET_GenericReturnValue database_connect (struct Plugin *plugin)
 Initialize the database connections and associated data structures (create tables and indices as needed as well). More...
 
static enum GNUNET_GenericReturnValue namestore_postgres_store_records (void *cls, const struct GNUNET_IDENTITY_PrivateKey *zone_key, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
 Store a record in the datastore. More...
 
static void parse_result_call_iterator (void *cls, PGresult *res, unsigned int num_results)
 A statement has been run. More...
 
static enum GNUNET_GenericReturnValue lookup_records (void *cls, const struct GNUNET_IDENTITY_PrivateKey *zone, const char *label, GNUNET_NAMESTORE_RecordIterator iter, void *iter_cls, const char *method)
 Lookup records in the datastore for which we are the authority. More...
 
static enum GNUNET_GenericReturnValue namestore_postgres_lookup_records (void *cls, const struct GNUNET_IDENTITY_PrivateKey *zone, const char *label, GNUNET_NAMESTORE_RecordIterator iter, void *iter_cls)
 Lookup records in the datastore for which we are the authority. More...
 
static int namestore_postgres_edit_records (void *cls, const struct GNUNET_IDENTITY_PrivateKey *zone, const char *label, GNUNET_NAMESTORE_RecordIterator iter, void *iter_cls)
 Edit records in the datastore for which we are the authority. More...
 
static enum GNUNET_GenericReturnValue namestore_postgres_iterate_records (void *cls, const struct GNUNET_IDENTITY_PrivateKey *zone, uint64_t serial, uint64_t limit, GNUNET_NAMESTORE_RecordIterator iter, void *iter_cls)
 Iterate over the results for a particular key and zone in the datastore. More...
 
static enum GNUNET_GenericReturnValue namestore_postgres_zone_to_name (void *cls, const struct GNUNET_IDENTITY_PrivateKey *zone, const struct GNUNET_IDENTITY_PublicKey *value_zone, GNUNET_NAMESTORE_RecordIterator iter, void *iter_cls)
 Look for an existing PKEY delegation record for a given public key. More...
 
static enum GNUNET_GenericReturnValue namestore_postgres_transaction_begin (void *cls, char **emsg)
 Begin a transaction for a client. More...
 
static enum GNUNET_GenericReturnValue namestore_postgres_transaction_rollback (void *cls, char **emsg)
 Commit a transaction for a client. More...
 
static enum GNUNET_GenericReturnValue namestore_postgres_transaction_commit (void *cls, char **emsg)
 Roll back a transaction for a client. More...
 
static void database_shutdown (struct Plugin *plugin)
 Shutdown database connection and associate data structures. More...
 
void * libgnunet_plugin_namestore_postgres_init (void *cls)
 Entry point for the plugin. More...
 
void * libgnunet_plugin_namestore_postgres_done (void *cls)
 Exit point from the plugin. More...
 

Detailed Description

postgres-based namestore backend

Author
Christian Grothoff

Definition in file plugin_namestore_postgres.c.

Macro Definition Documentation

◆ LOG

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

Definition at line 34 of file plugin_namestore_postgres.c.

Function Documentation

◆ namestore_postgres_create_tables()

static enum GNUNET_GenericReturnValue namestore_postgres_create_tables ( void *  cls)
static

Initialize the database connections and associated data structures (create tables and indices as needed as well).

Parameters
clsthe plugin context (state for this module)
Returns
GNUNET_OK on success

Definition at line 1 of file plugin_namestore_postgres.c.

68 {
69  struct Plugin *plugin = cls;
70  struct GNUNET_PQ_Context *dbh;
71 
73  "namestore-postgres",
74  "namestore-",
75  NULL,
76  NULL);
77  if (NULL == dbh)
78  return GNUNET_SYSERR;
80  return GNUNET_OK;
81 }
struct TestcasePlugin * plugin
The process handle to the testbed service.
void GNUNET_PQ_disconnect(struct GNUNET_PQ_Context *db)
Disconnect from the database, destroying the prepared statements and releasing other associated resou...
Definition: pq_connect.c:684
struct GNUNET_PQ_Context * GNUNET_PQ_connect_with_cfg(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *load_path_suffix, const struct GNUNET_PQ_ExecuteStatement *es, const struct GNUNET_PQ_PreparedStatement *ps)
Connect to a postgres database using the configuration option "CONFIG" in section.
Definition: pq_connect.c:619
@ GNUNET_OK
@ GNUNET_SYSERR
Handle to Postgres database.
Definition: pq.h:36
Handle for a plugin.
Definition: block.c:38

Referenced by libgnunet_plugin_namestore_postgres_init().

Here is the caller graph for this function:

◆ namestore_postgres_drop_tables()

static enum GNUNET_GenericReturnValue namestore_postgres_drop_tables ( void *  cls)
static

Drop existing namestore tables.

Parameters
clsthe plugin context (state for this module)
Returns
GNUNET_OK on success

Definition at line 1 of file plugin_namestore_postgres.c.

92 {
93  struct Plugin *plugin = cls;
94  struct GNUNET_PQ_Context *dbh;
96 
98  "namestore-postgres",
99  NULL,
100  NULL,
101  NULL);
102  if (NULL == dbh)
103  {
105  "Failed to connect to database\n");
106  return GNUNET_SYSERR;
107  }
108  ret = GNUNET_PQ_exec_sql (dbh,
109  "namestore-drop");
110  GNUNET_PQ_disconnect (dbh);
111  return ret;
112 }
static int ret
Return value of the commandline.
Definition: gnunet-abd.c:81
enum GNUNET_GenericReturnValue GNUNET_PQ_exec_sql(struct GNUNET_PQ_Context *db, const char *buf)
Execute SQL statements from buf against db.
Definition: pq_connect.c:144
#define GNUNET_log(kind,...)
GNUNET_GenericReturnValue
Named constants for return values.
@ GNUNET_ERROR_TYPE_ERROR

Referenced by libgnunet_plugin_namestore_postgres_init().

Here is the caller graph for this function:

◆ database_prepare()

static enum GNUNET_GenericReturnValue database_prepare ( struct Plugin plugin)
static

Definition at line 1 of file plugin_namestore_postgres.c.

117 {
119 
120  if (plugin->ready)
121  return GNUNET_OK;
122  {
123  struct GNUNET_PQ_PreparedStatement ps[] = {
124  GNUNET_PQ_make_prepare ("store_records",
125  "INSERT INTO namestore.ns098records"
126  " (zone_private_key, pkey, rvalue, record_count, record_data, label)"
127  " VALUES ($1, $2, $3, $4, $5, $6)"
128  " ON CONFLICT ON CONSTRAINT zl"
129  " DO UPDATE"
130  " SET pkey=$2,rvalue=$3,record_count=$4,record_data=$5"
131  " WHERE ns098records.zone_private_key = $1"
132  " AND ns098records.label = $6"),
133  GNUNET_PQ_make_prepare ("delete_records",
134  "DELETE FROM namestore.ns098records "
135  "WHERE zone_private_key=$1 AND label=$2"),
136  GNUNET_PQ_make_prepare ("zone_to_name",
137  "SELECT seq,record_count,record_data,label FROM namestore.ns098records"
138  " WHERE zone_private_key=$1 AND pkey=$2"),
139  GNUNET_PQ_make_prepare ("iterate_zone",
140  "SELECT seq,record_count,record_data,label FROM namestore.ns098records "
141  "WHERE zone_private_key=$1 AND seq > $2 ORDER BY seq ASC LIMIT $3"),
142  GNUNET_PQ_make_prepare ("iterate_all_zones",
143  "SELECT seq,record_count,record_data,label,zone_private_key"
144  " FROM namestore.ns098records WHERE seq > $1 ORDER BY seq ASC LIMIT $2"),
145  GNUNET_PQ_make_prepare ("lookup_label",
146  "SELECT seq,record_count,record_data,label "
147  "FROM namestore.ns098records WHERE zone_private_key=$1 AND label=$2"),
148  GNUNET_PQ_make_prepare ("edit_set",
149  "SELECT seq,record_count,record_data,label "
150  "FROM namestore.ns098records WHERE zone_private_key=$1 AND label=$2 FOR UPDATE NOWAIT"),
152  };
153 
155  ps);
156  }
157  if (GNUNET_OK != ret)
158  return ret;
159  plugin->ready = true;
160  return GNUNET_OK;
161 }
enum GNUNET_GenericReturnValue GNUNET_PQ_prepare_statements(struct GNUNET_PQ_Context *db, const struct GNUNET_PQ_PreparedStatement *ps)
Request creation of prepared statements ps from Postgres.
Definition: pq_prepare.c:88
struct GNUNET_PQ_PreparedStatement GNUNET_PQ_make_prepare(const char *name, const char *sql)
Create a struct GNUNET_PQ_PreparedStatement.
Definition: pq_prepare.c:30
#define GNUNET_PQ_PREPARED_STATEMENT_END
Terminator for prepared statement list.
Information needed to prepare a list of SQL statements using GNUNET_PQ_prepare_statements().

◆ database_connect()

static enum GNUNET_GenericReturnValue database_connect ( struct Plugin plugin)
static

Initialize the database connections and associated data structures (create tables and indices as needed as well).

Parameters
pluginthe plugin context (state for this module)
Returns
GNUNET_OK on success

Definition at line 1 of file plugin_namestore_postgres.c.

174 {
175  struct GNUNET_PQ_ExecuteStatement ess[] = {
176  GNUNET_PQ_make_try_execute ("SET synchronous_commit TO off"),
178  };
179  struct GNUNET_PQ_ExecuteStatement *es;
180 
181  if (GNUNET_YES ==
183  "namestore-postgres",
184  "ASYNC_COMMIT"))
185  es = &ess[0];
186  else
187  es = &ess[1];
188 
189  if (GNUNET_YES ==
191  "namestore-postgres",
192  "INIT_ON_CONNECT"))
193  {
194  if (GNUNET_OK !=
196  {
198  "Failed to create tables\n");
199  return GNUNET_SYSERR;
200  }
201  }
203  "namestore-postgres",
204  NULL,
205  es,
206  NULL);
207  if (NULL == plugin->dbh)
208  return GNUNET_SYSERR;
209  return GNUNET_OK;
210 }
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:42
#define GNUNET_PQ_EXECUTE_STATEMENT_END
Terminator for executable statement list.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_yesno(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option)
Get a configuration value that should be in a set of "YES" or "NO".
@ GNUNET_YES
static enum GNUNET_GenericReturnValue namestore_postgres_create_tables(void *cls)
Initialize the database connections and associated data structures (create tables and indices as need...
Information needed to run a list of SQL statements using GNUNET_PQ_exec_statements().

Referenced by libgnunet_plugin_namestore_postgres_init().

Here is the caller graph for this function:

◆ namestore_postgres_store_records()

static enum GNUNET_GenericReturnValue namestore_postgres_store_records ( void *  cls,
const struct GNUNET_IDENTITY_PrivateKey zone_key,
const char *  label,
unsigned int  rd_count,
const struct GNUNET_GNSRECORD_Data rd 
)
static

Store a record in the datastore.

Removes any existing record in the same zone with the same name.

Parameters
clsclosure (internal context for the plugin)
zone_keyprivate key of the zone
labelname that is being mapped (at most 255 characters long)
rd_countnumber of entries in rd array
rdarray of records with data to store
Returns
GNUNET_OK on success, else GNUNET_SYSERR

Definition at line 1 of file plugin_namestore_postgres.c.

231 {
232  struct Plugin *plugin = cls;
234  uint64_t rvalue;
235  uint32_t rd_count32 = (uint32_t) rd_count;
236  ssize_t data_size;
237 
239  memset (&pkey,
240  0,
241  sizeof(pkey));
242  for (unsigned int i = 0; i < rd_count; i++)
243  if (GNUNET_YES ==
244  GNUNET_GNSRECORD_is_zonekey_type (rd[i].record_type))
245  {
248  rd[i].data_size,
249  rd[i].record_type,
250  &pkey));
251  break;
252  }
254  UINT64_MAX);
256  rd);
257  if (data_size < 0)
258  {
259  GNUNET_break (0);
260  return GNUNET_SYSERR;
261  }
262  if (data_size >= UINT16_MAX)
263  {
264  GNUNET_break (0);
265  return GNUNET_SYSERR;
266  }
267  /* if record set is empty, delete existing records */
268  if (0 == rd_count)
269  {
270  struct GNUNET_PQ_QueryParam params[] = {
274  };
276 
278  "delete_records",
279  params);
282  {
283  GNUNET_break (0);
284  return GNUNET_SYSERR;
285  }
287  "postgres",
288  "Record deleted\n");
289  return GNUNET_OK;
290  }
291  /* otherwise, UPSERT (i.e. UPDATE if exists, otherwise INSERT) */
292  {
293  char data[data_size];
294  struct GNUNET_PQ_QueryParam params[] = {
298  GNUNET_PQ_query_param_uint32 (&rd_count32),
302  };
304  ssize_t ret;
305 
307  rd,
308  data_size,
309  data);
310  if ((ret < 0) ||
311  (data_size != ret))
312  {
313  GNUNET_break (0);
314  return GNUNET_SYSERR;
315  }
316 
318  "store_records",
319  params);
321  return GNUNET_SYSERR;
322  }
323  return GNUNET_OK;
324 }
static size_t data_size
Number of bytes in data.
Definition: gnunet-abd.c:187
static int res
uint32_t data
The data value.
static char * pkey
Public key of the zone to look in, in ASCII.
static const struct GNUNET_IDENTITY_PrivateKey * zone_key
Private key of the zone.
static unsigned int rd_count
Number of records for currently parsed set.
static struct GNUNET_GNSRECORD_Data rd[50]
The record data under a single label.
GNUNET_DB_QueryStatus
Status code returned from functions running database commands.
Definition: gnunet_db_lib.h:37
@ GNUNET_DB_STATUS_SUCCESS_ONE_RESULT
The transaction succeeded, and yielded one result.
Definition: gnunet_db_lib.h:60
@ GNUNET_DB_STATUS_SUCCESS_NO_RESULTS
The transaction succeeded, but yielded zero results.
Definition: gnunet_db_lib.h:55
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.
struct GNUNET_PQ_QueryParam GNUNET_PQ_query_param_uint64(const uint64_t *x)
Generate query parameter for an uint16_t in host byte order.
#define GNUNET_PQ_query_param_auto_from_type(x)
Generate fixed-size query parameter with size determined by variable type.
#define GNUNET_PQ_query_param_end
End of query parameter specification.
struct GNUNET_PQ_QueryParam GNUNET_PQ_query_param_uint32(const uint32_t *x)
Generate query parameter for an uint32_t in host byte order.
enum GNUNET_DB_QueryStatus GNUNET_PQ_eval_prepared_non_select(struct GNUNET_PQ_Context *db, const char *statement_name, const struct GNUNET_PQ_QueryParam *params)
Execute a named prepared statement that is NOT a SELECT statement in connection using the given param...
Definition: pq_eval.c:135
struct GNUNET_PQ_QueryParam GNUNET_PQ_query_param_string(const char *ptr)
Generate query parameter for a string.
uint64_t GNUNET_CRYPTO_random_u64(enum GNUNET_CRYPTO_Quality mode, uint64_t max)
Generate a random unsigned 64-bit value.
@ GNUNET_CRYPTO_QUALITY_WEAK
No good quality of the operation is needed (i.e., random numbers can be pseudo-random).
enum GNUNET_GenericReturnValue GNUNET_GNSRECORD_identity_from_data(const char *data, size_t data_size, uint32_t type, struct GNUNET_IDENTITY_PublicKey *key)
Build a #GNUNET_GNSRECORD_PublicKey from zone delegation resource record data.
ssize_t GNUNET_GNSRECORD_records_serialize(unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd, size_t dest_size, char *dest)
Serialize the given records to the given destination buffer.
GNUNET_NETWORK_STRUCT_END ssize_t GNUNET_GNSRECORD_records_get_size(unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
Calculate how many bytes we will need to serialize the given records.
enum GNUNET_GenericReturnValue GNUNET_GNSRECORD_is_zonekey_type(uint32_t type)
Check if this type is one of the supported GNS zone types.
#define GNUNET_log_from(kind, comp,...)
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
@ GNUNET_ERROR_TYPE_DEBUG
static enum GNUNET_GenericReturnValue database_prepare(struct Plugin *plugin)
An identity key as per LSD0001.
Description of a DB query parameter.
Definition: gnunet_pq_lib.h:83

Referenced by libgnunet_plugin_namestore_postgres_init().

Here is the caller graph for this function:

◆ parse_result_call_iterator()

static void parse_result_call_iterator ( void *  cls,
PGresult *  res,
unsigned int  num_results 
)
static

A statement has been run.

We should evaluate the result, and if possible call the iter in cls with the result.

Parameters
clsclosure of type struct ParserContext *
resthe postgres result
num_resultsthe number of results in result

Definition at line 364 of file plugin_namestore_postgres.c.

367 {
368  struct ParserContext *pc = cls;
369 
370  if (NULL == pc->iter)
371  return; /* no need to do more work */
373  "Got %d results from PQ.\n", num_results);
374  for (unsigned int i = 0; i < num_results; i++)
375  {
376  uint64_t serial;
377  void *data;
378  size_t data_size;
379  uint32_t record_count;
380  char *label;
381  struct GNUNET_IDENTITY_PrivateKey zk;
382  struct GNUNET_PQ_ResultSpec rs_with_zone[] = {
383  GNUNET_PQ_result_spec_uint64 ("seq", &serial),
384  GNUNET_PQ_result_spec_uint32 ("record_count", &record_count),
386  GNUNET_PQ_result_spec_string ("label", &label),
387  GNUNET_PQ_result_spec_auto_from_type ("zone_private_key", &zk),
389  };
390  struct GNUNET_PQ_ResultSpec rs_without_zone[] = {
391  GNUNET_PQ_result_spec_uint64 ("seq", &serial),
392  GNUNET_PQ_result_spec_uint32 ("record_count", &record_count),
394  GNUNET_PQ_result_spec_string ("label", &label),
396  };
397  struct GNUNET_PQ_ResultSpec *rs;
398 
399  rs = (NULL == pc->zone_key) ? rs_with_zone : rs_without_zone;
400  if (GNUNET_YES !=
402  rs,
403  i))
404  {
405  GNUNET_break (0);
406  return;
407  }
408 
409  if (record_count > 64 * 1024)
410  {
411  /* sanity check, don't stack allocate far too much just
412  because database might contain a large value here */
413  GNUNET_break (0);
415  return;
416  }
417 
418  {
420 
421  GNUNET_assert (0 != serial);
422  if (GNUNET_OK !=
424  data,
425  record_count,
426  rd))
427  {
428  GNUNET_break (0);
430  return;
431  }
432  pc->iter (pc->iter_cls,
433  serial,
434  (NULL == pc->zone_key) ? &zk : pc->zone_key,
435  label,
436  record_count,
437  rd);
438  }
440  }
441  pc->limit -= num_results;
442 }
static uint64_t record_count
Record count.
static struct GNUNET_FS_PublishContext * pc
Handle to FS-publishing operation.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_uint32(const char *name, uint32_t *u32)
uint32_t expected.
#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_PQ_ResultSpec GNUNET_PQ_result_spec_uint64(const char *name, uint64_t *u64)
uint64_t expected.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_string(const char *name, char **dst)
0-terminated string expected.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_variable_size(const char *name, void **dst, size_t *sptr)
Variable-size result expected.
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:139
enum GNUNET_GenericReturnValue 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:149
#define GNUNET_PQ_result_spec_end
End of result parameter specification.
int GNUNET_GNSRECORD_records_deserialize(size_t len, const char *src, unsigned int rd_count, struct GNUNET_GNSRECORD_Data *dest)
Deserialize the given records to the given destination.
#define GNUNET_NZL(l)
Macro used to avoid using 0 for the length of a variable-size array (Non-Zero-Length).
#define LOG(kind,...)
A private key for an identity as per LSD0001.
Description of a DB result cell.
Closure for parse_result_call_iterator.

◆ lookup_records()

static enum GNUNET_GenericReturnValue lookup_records ( void *  cls,
const struct GNUNET_IDENTITY_PrivateKey zone,
const char *  label,
GNUNET_NAMESTORE_RecordIterator  iter,
void *  iter_cls,
const char *  method 
)
static

Lookup records in the datastore for which we are the authority.

Parameters
clsclosure (internal context for the plugin)
zoneprivate key of the zone
labelname of the record in the zone
iterfunction to call with the result
iter_clsclosure for iter
methodthe method to use "lookup_record" or "edit_set"
Returns
GNUNET_OK on success, GNUNET_NO for no results, else GNUNET_SYSERR

Definition at line 364 of file plugin_namestore_postgres.c.

464 {
465  struct Plugin *plugin = cls;
467  struct GNUNET_PQ_QueryParam params[] = {
471  };
472  struct ParserContext pc;
474 
475  if (NULL == zone)
476  {
477  GNUNET_break (0);
478  return GNUNET_SYSERR;
479  }
480  pc.iter = iter;
481  pc.iter_cls = iter_cls;
482  pc.zone_key = zone;
484  method,
485  params,
487  &pc);
488  if (res < 0)
489  return GNUNET_SYSERR;
491  return GNUNET_NO;
492  return GNUNET_OK;
493 }
static char * zone
Name of the zone being managed.
enum GNUNET_DB_QueryStatus GNUNET_PQ_eval_prepared_multi_select(struct GNUNET_PQ_Context *db, 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:165
@ GNUNET_NO
static void parse_result_call_iterator(void *cls, PGresult *res, unsigned int num_results)
A statement has been run.
void * iter_cls
Closure for iter.
GNUNET_NAMESTORE_RecordIterator iter
Function to call for each result.

References data, data_size, GNUNET_assert, GNUNET_break, GNUNET_ERROR_TYPE_DEBUG, GNUNET_GNSRECORD_records_deserialize(), GNUNET_NZL, GNUNET_OK, GNUNET_PQ_cleanup_result(), GNUNET_PQ_extract_result(), GNUNET_PQ_result_spec_auto_from_type, GNUNET_PQ_result_spec_end, GNUNET_PQ_result_spec_string(), GNUNET_PQ_result_spec_uint32(), GNUNET_PQ_result_spec_uint64(), GNUNET_PQ_result_spec_variable_size(), GNUNET_YES, LOG, pc, rd, record_count, and res.

Referenced by namestore_postgres_edit_records().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ namestore_postgres_lookup_records()

static enum GNUNET_GenericReturnValue namestore_postgres_lookup_records ( void *  cls,
const struct GNUNET_IDENTITY_PrivateKey zone,
const char *  label,
GNUNET_NAMESTORE_RecordIterator  iter,
void *  iter_cls 
)
static

Lookup records in the datastore for which we are the authority.

Parameters
clsclosure (internal context for the plugin)
zoneprivate key of the zone
labelname of the record in the zone
iterfunction to call with the result
iter_clsclosure for iter
Returns
GNUNET_OK on success, GNUNET_NO for no results, else GNUNET_SYSERR

Definition at line 364 of file plugin_namestore_postgres.c.

513 {
514  return lookup_records (cls, zone, label, iter, iter_cls, "lookup_label");
515 }
static enum GNUNET_GenericReturnValue lookup_records(void *cls, const struct GNUNET_IDENTITY_PrivateKey *zone, const char *label, GNUNET_NAMESTORE_RecordIterator iter, void *iter_cls, const char *method)
Lookup records in the datastore for which we are the authority.

Referenced by libgnunet_plugin_namestore_postgres_init().

Here is the caller graph for this function:

◆ namestore_postgres_edit_records()

static int namestore_postgres_edit_records ( void *  cls,
const struct GNUNET_IDENTITY_PrivateKey zone,
const char *  label,
GNUNET_NAMESTORE_RecordIterator  iter,
void *  iter_cls 
)
static

Edit records in the datastore for which we are the authority.

Parameters
clsclosure (internal context for the plugin)
zoneprivate key of the zone
labelname of the record in the zone
iterfunction to call with the result
iter_clsclosure for iter
Returns
GNUNET_OK on success, GNUNET_NO for no results, else GNUNET_SYSERR

Definition at line 529 of file plugin_namestore_postgres.c.

535 {
536  return lookup_records (cls, zone, label, iter, iter_cls, "edit_set");
537 }

References ParserContext::iter, ParserContext::iter_cls, lookup_records(), and zone.

Referenced by libgnunet_plugin_namestore_postgres_init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ namestore_postgres_iterate_records()

static enum GNUNET_GenericReturnValue namestore_postgres_iterate_records ( void *  cls,
const struct GNUNET_IDENTITY_PrivateKey zone,
uint64_t  serial,
uint64_t  limit,
GNUNET_NAMESTORE_RecordIterator  iter,
void *  iter_cls 
)
static

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

Will return at most one result to the iterator.

Parameters
clsclosure (internal context for the plugin)
zonehash of public key of the zone, NULL to iterate over all zones
serialserial number to exclude in the list of all matching records
limitmaximum number of results to fetch
iterfunction to call with the result
iter_clsclosure for iter
Returns
GNUNET_OK on success, GNUNET_NO if there were no more results, GNUNET_SYSERR on error

Definition at line 529 of file plugin_namestore_postgres.c.

560 {
561  struct Plugin *plugin = cls;
563  struct ParserContext pc;
564 
566  pc.iter = iter;
567  pc.iter_cls = iter_cls;
568  pc.zone_key = zone;
569  pc.limit = limit;
570  if (NULL == zone)
571  {
572  struct GNUNET_PQ_QueryParam params_without_zone[] = {
576  };
577 
579  "iterate_all_zones",
580  params_without_zone,
582  &pc);
583  }
584  else
585  {
586  struct GNUNET_PQ_QueryParam params_with_zone[] = {
591  };
592 
594  "iterate_zone",
595  params_with_zone,
597  &pc);
598  }
599  if (res < 0)
600  return GNUNET_SYSERR;
601 
603  (pc.limit > 0))
604  return GNUNET_NO;
605  return GNUNET_OK;
606 }
uint64_t limit
Number of results still to return (counted down by number of results given to iterator).

Referenced by libgnunet_plugin_namestore_postgres_init().

Here is the caller graph for this function:

◆ namestore_postgres_zone_to_name()

static enum GNUNET_GenericReturnValue namestore_postgres_zone_to_name ( void *  cls,
const struct GNUNET_IDENTITY_PrivateKey zone,
const struct GNUNET_IDENTITY_PublicKey value_zone,
GNUNET_NAMESTORE_RecordIterator  iter,
void *  iter_cls 
)
static

Look for an existing PKEY delegation record for a given public key.

Returns at most one result to the iterator.

Parameters
clsclosure (internal context for the plugin)
zoneprivate key of the zone to look up in, never NULL
value_zonepublic key of the target zone (value), never NULL
iterfunction to call with the result
iter_clsclosure for iter
Returns
GNUNET_OK on success, GNUNET_NO if there were no results, GNUNET_SYSERR on error

Definition at line 529 of file plugin_namestore_postgres.c.

628 {
629  struct Plugin *plugin = cls;
631  struct GNUNET_PQ_QueryParam params[] = {
635  };
637  struct ParserContext pc;
638 
639  pc.iter = iter;
640  pc.iter_cls = iter_cls;
641  pc.zone_key = zone;
643  "zone_to_name",
644  params,
646  &pc);
647  if (res < 0)
648  return GNUNET_SYSERR;
649  return GNUNET_OK;
650 }

Referenced by libgnunet_plugin_namestore_postgres_init().

Here is the caller graph for this function:

◆ namestore_postgres_transaction_begin()

static enum GNUNET_GenericReturnValue namestore_postgres_transaction_begin ( void *  cls,
char **  emsg 
)
static

Begin a transaction for a client.

Parameters
clsclosure (internal context for the plugin)
emsgerror message set of return code is GNUNET_SYSERR
Returns
GNUNET_YES on success, GNUNET_SYSERR if transaction cannot be started.

Definition at line 529 of file plugin_namestore_postgres.c.

663 {
664  struct Plugin *plugin = cls;
666  struct GNUNET_PQ_ExecuteStatement es[] = {
667  GNUNET_PQ_make_execute ("BEGIN"),
669  };
670 
671  return GNUNET_PQ_exec_statements (plugin->dbh, es);
672 }
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:30
enum GNUNET_GenericReturnValue GNUNET_PQ_exec_statements(struct GNUNET_PQ_Context *db, const struct GNUNET_PQ_ExecuteStatement *es)
Request execution of an array of statements es from Postgres.
Definition: pq_exec.c:54

Referenced by libgnunet_plugin_namestore_postgres_init().

Here is the caller graph for this function:

◆ namestore_postgres_transaction_rollback()

static enum GNUNET_GenericReturnValue namestore_postgres_transaction_rollback ( void *  cls,
char **  emsg 
)
static

Commit a transaction for a client.

This releases the lock on the database.

Parameters
clsclosure (internal context for the plugin)
emsgerror message set of return code is GNUNET_SYSERR
Returns
GNUNET_YES on success, GNUNET_SYSERR if transaction cannot be started.

Definition at line 529 of file plugin_namestore_postgres.c.

686 {
687  struct Plugin *plugin = cls;
689  struct GNUNET_PQ_ExecuteStatement es[] = {
690  GNUNET_PQ_make_execute ("ROLLBACK"),
692  };
693 
694  return GNUNET_PQ_exec_statements (plugin->dbh, es);
695 }

Referenced by libgnunet_plugin_namestore_postgres_init().

Here is the caller graph for this function:

◆ namestore_postgres_transaction_commit()

static enum GNUNET_GenericReturnValue namestore_postgres_transaction_commit ( void *  cls,
char **  emsg 
)
static

Roll back a transaction for a client.

This releases the lock on the database.

Parameters
clsclosure (internal context for the plugin)
emsgerror message set of return code is GNUNET_SYSERR
Returns
GNUNET_YES on success, GNUNET_SYSERR if transaction cannot be started.

Definition at line 529 of file plugin_namestore_postgres.c.

709 {
710  struct Plugin *plugin = cls;
712  struct GNUNET_PQ_ExecuteStatement es[] = {
713  GNUNET_PQ_make_execute ("COMMIT"),
715  };
716 
717  return GNUNET_PQ_exec_statements (plugin->dbh, es);
718 }

Referenced by libgnunet_plugin_namestore_postgres_init().

Here is the caller graph for this function:

◆ database_shutdown()

static void database_shutdown ( struct Plugin plugin)
static

Shutdown database connection and associate data structures.

Parameters
pluginthe plugin context (state for this module)

Definition at line 728 of file plugin_namestore_postgres.c.

729 {
731  plugin->dbh = NULL;
732 }

References GNUNET_PQ_disconnect(), and plugin.

Referenced by libgnunet_plugin_namestore_postgres_done(), and libgnunet_plugin_namestore_postgres_init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ libgnunet_plugin_namestore_postgres_init()

void* libgnunet_plugin_namestore_postgres_init ( void *  cls)

Entry point for the plugin.

Parameters
clsthe struct GNUNET_NAMESTORE_PluginEnvironment*
Returns
NULL on error, othrewise the plugin context

Definition at line 742 of file plugin_namestore_postgres.c.

743 {
744  struct Plugin *plugin;
745  const struct GNUNET_CONFIGURATION_Handle *cfg = cls;
747 
748  plugin = GNUNET_new (struct Plugin);
749  plugin->cfg = cfg;
751  {
754  return NULL;
755  }
757  api->cls = plugin;
769  "Postgres namestore plugin running\n");
770  return api;
771 }
static const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration we are using.
Definition: gnunet-abd.c:36
@ GNUNET_ERROR_TYPE_INFO
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_free(ptr)
Wrapper around free.
static enum GNUNET_GenericReturnValue namestore_postgres_zone_to_name(void *cls, const struct GNUNET_IDENTITY_PrivateKey *zone, const struct GNUNET_IDENTITY_PublicKey *value_zone, GNUNET_NAMESTORE_RecordIterator iter, void *iter_cls)
Look for an existing PKEY delegation record for a given public key.
static enum GNUNET_GenericReturnValue namestore_postgres_transaction_begin(void *cls, char **emsg)
Begin a transaction for a client.
static enum GNUNET_GenericReturnValue namestore_postgres_iterate_records(void *cls, const struct GNUNET_IDENTITY_PrivateKey *zone, uint64_t serial, uint64_t limit, GNUNET_NAMESTORE_RecordIterator iter, void *iter_cls)
Iterate over the results for a particular key and zone in the datastore.
static enum GNUNET_GenericReturnValue namestore_postgres_transaction_rollback(void *cls, char **emsg)
Commit a transaction for a client.
static enum GNUNET_GenericReturnValue namestore_postgres_drop_tables(void *cls)
Drop existing namestore tables.
static void database_shutdown(struct Plugin *plugin)
Shutdown database connection and associate data structures.
static enum GNUNET_GenericReturnValue namestore_postgres_store_records(void *cls, const struct GNUNET_IDENTITY_PrivateKey *zone_key, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
Store a record in the datastore.
static enum GNUNET_GenericReturnValue namestore_postgres_lookup_records(void *cls, const struct GNUNET_IDENTITY_PrivateKey *zone, const char *label, GNUNET_NAMESTORE_RecordIterator iter, void *iter_cls)
Lookup records in the datastore for which we are the authority.
static int namestore_postgres_edit_records(void *cls, const struct GNUNET_IDENTITY_PrivateKey *zone, const char *label, GNUNET_NAMESTORE_RecordIterator iter, void *iter_cls)
Edit records in the datastore for which we are the authority.
static enum GNUNET_GenericReturnValue database_connect(struct Plugin *plugin)
Initialize the database connections and associated data structures (create tables and indices as need...
static enum GNUNET_GenericReturnValue namestore_postgres_transaction_commit(void *cls, char **emsg)
Roll back a transaction for a client.
struct returned by the initialization function of the plugin
enum GNUNET_GenericReturnValue(* create_tables)(void *cls)
Setup the database.
enum GNUNET_GenericReturnValue(* store_records)(void *cls, const struct GNUNET_IDENTITY_PrivateKey *zone, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
Store a record in the datastore for which we are the authority.
enum GNUNET_GenericReturnValue(* lookup_records)(void *cls, const struct GNUNET_IDENTITY_PrivateKey *zone, const char *label, GNUNET_NAMESTORE_RecordIterator iter, void *iter_cls)
Lookup records in the datastore for which we are the authority.
enum GNUNET_GenericReturnValue(* transaction_begin)(void *cls, char **emsg)
Transaction-based API draft.
enum GNUNET_GenericReturnValue(* iterate_records)(void *cls, const struct GNUNET_IDENTITY_PrivateKey *zone, uint64_t serial, uint64_t limit, GNUNET_NAMESTORE_RecordIterator iter, void *iter_cls)
Iterate over the results for a particular zone in the datastore.
enum GNUNET_GenericReturnValue(* zone_to_name)(void *cls, const struct GNUNET_IDENTITY_PrivateKey *zone, const struct GNUNET_IDENTITY_PublicKey *value_zone, GNUNET_NAMESTORE_RecordIterator iter, void *iter_cls)
Look for an existing PKEY delegation record for a given public key.
enum GNUNET_GenericReturnValue(* drop_tables)(void *cls)
Drop existing tables.
enum GNUNET_GenericReturnValue(* transaction_commit)(void *cls, char **emsg)
Commit a transaction in the database.
void * cls
Closure to pass to all plugin functions.
enum GNUNET_GenericReturnValue(* transaction_rollback)(void *cls, char **emsg)
Abort and roll back a transaction in the database.
enum GNUNET_GenericReturnValue(* edit_records)(void *cls, const struct GNUNET_IDENTITY_PrivateKey *zone, const char *label, GNUNET_NAMESTORE_RecordIterator iter, void *iter_cls)
Edit records in the datastore for which we are the authority.

References cfg, GNUNET_NAMESTORE_PluginFunctions::cls, GNUNET_NAMESTORE_PluginFunctions::create_tables, database_connect(), database_shutdown(), GNUNET_NAMESTORE_PluginFunctions::drop_tables, GNUNET_NAMESTORE_PluginFunctions::edit_records, GNUNET_ERROR_TYPE_INFO, GNUNET_free, GNUNET_new, GNUNET_OK, GNUNET_NAMESTORE_PluginFunctions::iterate_records, LOG, GNUNET_NAMESTORE_PluginFunctions::lookup_records, namestore_postgres_create_tables(), namestore_postgres_drop_tables(), namestore_postgres_edit_records(), namestore_postgres_iterate_records(), namestore_postgres_lookup_records(), namestore_postgres_store_records(), namestore_postgres_transaction_begin(), namestore_postgres_transaction_commit(), namestore_postgres_transaction_rollback(), namestore_postgres_zone_to_name(), plugin, GNUNET_NAMESTORE_PluginFunctions::store_records, GNUNET_NAMESTORE_PluginFunctions::transaction_begin, GNUNET_NAMESTORE_PluginFunctions::transaction_commit, GNUNET_NAMESTORE_PluginFunctions::transaction_rollback, and GNUNET_NAMESTORE_PluginFunctions::zone_to_name.

Here is the call graph for this function:

◆ libgnunet_plugin_namestore_postgres_done()

void* libgnunet_plugin_namestore_postgres_done ( void *  cls)

Exit point from the plugin.

Parameters
clsthe plugin context (as returned by "init")
Returns
always NULL

Definition at line 781 of file plugin_namestore_postgres.c.

782 {
784  struct Plugin *plugin = api->cls;
785 
787  plugin->cfg = NULL;
789  GNUNET_free (api);
791  "Postgres namestore plugin is finished\n");
792  return NULL;
793 }
void * cls
Closure for all of the callbacks.
struct GNUNET_BLOCK_PluginFunctions * api
Plugin API.
Definition: block.c:47

References Plugin::api, GNUNET_BLOCK_PluginFunctions::cls, GNUNET_NAMESTORE_PluginFunctions::cls, database_shutdown(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, LOG, and plugin.

Here is the call graph for this function: