GNUnet  0.11.x
Data Structures | Macros | Functions
plugin_namestore_sqlite.c File Reference

sqlite-based namestore backend More...

#include "platform.h"
#include "gnunet_namestore_plugin.h"
#include "gnunet_namestore_service.h"
#include "gnunet_gnsrecord_lib.h"
#include "gnunet_sq_lib.h"
#include "namestore.h"
#include <sqlite3.h>
Include dependency graph for plugin_namestore_sqlite.c:

Go to the source code of this file.

Data Structures

struct  Plugin
 Handle for a plugin. More...
 

Macros

#define BUSY_TIMEOUT_MS   1000
 After how many ms "busy" should a DB operation fail for good? A low value makes sure that we are more responsive to requests (especially PUTs). More...
 
#define LOG_SQLITE(db, level, cmd)
 Log an error message at log-level 'level' that indicates a failure of the command 'cmd' on file 'filename' with the message given by strerror(errno). More...
 
#define LOG(kind, ...)   GNUNET_log_from (kind, "namestore-sqlite", __VA_ARGS__)
 

Functions

static int database_setup (struct Plugin *plugin)
 Initialize the database connections and associated data structures (create tables and indices as needed as well). More...
 
static void database_shutdown (struct Plugin *plugin)
 Shutdown database connection and associate data structures. More...
 
static int namestore_sqlite_store_records (void *cls, const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
 Store a record in the datastore. More...
 
static int get_records_and_call_iterator (struct Plugin *plugin, sqlite3_stmt *stmt, const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key, uint64_t limit, GNUNET_NAMESTORE_RecordIterator iter, void *iter_cls)
 The given 'sqlite' statement has been prepared to be run. More...
 
static int namestore_sqlite_lookup_records (void *cls, const struct GNUNET_CRYPTO_EcdsaPrivateKey *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_sqlite_iterate_records (void *cls, const struct GNUNET_CRYPTO_EcdsaPrivateKey *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 int namestore_sqlite_zone_to_name (void *cls, const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone, const struct GNUNET_CRYPTO_EcdsaPublicKey *value_zone, GNUNET_NAMESTORE_RecordIterator iter, void *iter_cls)
 Look for an existing PKEY delegation record for a given public key. More...
 
void * libgnunet_plugin_namestore_sqlite_init (void *cls)
 Entry point for the plugin. More...
 
void * libgnunet_plugin_namestore_sqlite_done (void *cls)
 Exit point from the plugin. More...
 

Detailed Description

sqlite-based namestore backend

Author
Christian Grothoff

Definition in file plugin_namestore_sqlite.c.

Macro Definition Documentation

◆ BUSY_TIMEOUT_MS

#define BUSY_TIMEOUT_MS   1000

After how many ms "busy" should a DB operation fail for good? A low value makes sure that we are more responsive to requests (especially PUTs).

A high value guarantees a higher success rate (SELECTs in iterate can take several seconds despite LIMIT=1).

The default value of 1s should ensure that users do not experience huge latencies while at the same time allowing operations to succeed with reasonable probability.

Definition at line 45 of file plugin_namestore_sqlite.c.

Referenced by database_setup().

◆ LOG_SQLITE

#define LOG_SQLITE (   db,
  level,
  cmd 
)
Value:
do { GNUNET_log_from (level, \
"namestore-sqlite", _ ( \
"`%s' failed at %s:%d with error: %s\n"), \
cmd, \
__FILE__, __LINE__, \
sqlite3_errmsg ( \
db->dbh)); \
} while (0)
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
static struct GNUNET_FS_DirectoryBuilder * db
Definition: gnunet-search.c:41
#define GNUNET_log_from(kind, comp,...)

Log an error message at log-level 'level' that indicates a failure of the command 'cmd' on file 'filename' with the message given by strerror(errno).

Definition at line 53 of file plugin_namestore_sqlite.c.

Referenced by database_shutdown(), get_records_and_call_iterator(), namestore_sqlite_iterate_records(), namestore_sqlite_lookup_records(), namestore_sqlite_store_records(), and namestore_sqlite_zone_to_name().

◆ LOG

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

Function Documentation

◆ database_setup()

static int database_setup ( 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 123 of file plugin_namestore_sqlite.c.

References _, BUSY_TIMEOUT_MS, Plugin::cfg, Plugin::dbh, Plugin::delete_records, Plugin::fn, GNUNET_break, GNUNET_CONFIGURATION_get_value_filename(), GNUNET_DISK_directory_create_for_file(), GNUNET_DISK_file_test(), GNUNET_ERROR_TYPE_ERROR, GNUNET_free, GNUNET_log_config_missing(), GNUNET_OK, GNUNET_SQ_exec_statements(), GNUNET_SQ_EXECUTE_STATEMENT_END, GNUNET_SQ_make_execute(), GNUNET_SQ_make_prepare(), GNUNET_SQ_make_try_execute(), GNUNET_SQ_prepare(), GNUNET_SQ_PREPARE_END, GNUNET_SYSERR, Plugin::iterate_all_zones, Plugin::iterate_zone, LOG, Plugin::lookup_label, Plugin::store_records, and Plugin::zone_to_name.

Referenced by libgnunet_plugin_namestore_sqlite_init().

124 {
125  char *sqlite_filename;
126  struct GNUNET_SQ_ExecuteStatement es[] = {
127  GNUNET_SQ_make_try_execute ("PRAGMA temp_store=MEMORY"),
128  GNUNET_SQ_make_try_execute ("PRAGMA synchronous=NORMAL"),
129  GNUNET_SQ_make_try_execute ("PRAGMA legacy_file_format=OFF"),
130  GNUNET_SQ_make_try_execute ("PRAGMA auto_vacuum=INCREMENTAL"),
131  GNUNET_SQ_make_try_execute ("PRAGMA encoding=\"UTF-8\""),
132  GNUNET_SQ_make_try_execute ("PRAGMA locking_mode=EXCLUSIVE"),
133  GNUNET_SQ_make_try_execute ("PRAGMA journal_mode=WAL"),
134  GNUNET_SQ_make_try_execute ("PRAGMA page_size=4092"),
135  GNUNET_SQ_make_execute ("CREATE TABLE IF NOT EXISTS ns098records ("
136  " uid INTEGER PRIMARY KEY,"
137  " zone_private_key BLOB NOT NULL,"
138  " pkey BLOB,"
139  " rvalue INT8 NOT NULL,"
140  " record_count INT NOT NULL,"
141  " record_data BLOB NOT NULL,"
142  " label TEXT NOT NULL"
143  ")"),
144  GNUNET_SQ_make_try_execute ("CREATE INDEX IF NOT EXISTS ir_pkey_reverse "
145  "ON ns098records (zone_private_key,pkey)"),
146  GNUNET_SQ_make_try_execute ("CREATE INDEX IF NOT EXISTS ir_pkey_iter "
147  "ON ns098records (zone_private_key,uid)"),
149  };
150  struct GNUNET_SQ_PrepareStatement ps[] = {
151  GNUNET_SQ_make_prepare ("INSERT INTO ns098records "
152  "(zone_private_key,pkey,rvalue,record_count,record_data,label)"
153  " VALUES (?, ?, ?, ?, ?, ?)",
154  &plugin->store_records),
155  GNUNET_SQ_make_prepare ("DELETE FROM ns098records "
156  "WHERE zone_private_key=? AND label=?",
157  &plugin->delete_records),
158  GNUNET_SQ_make_prepare ("SELECT uid,record_count,record_data,label"
159  " FROM ns098records"
160  " WHERE zone_private_key=? AND pkey=?",
161  &plugin->zone_to_name),
162  GNUNET_SQ_make_prepare ("SELECT uid,record_count,record_data,label"
163  " FROM ns098records"
164  " WHERE zone_private_key=? AND uid > ?"
165  " ORDER BY uid ASC"
166  " LIMIT ?",
167  &plugin->iterate_zone),
169  "SELECT uid,record_count,record_data,label,zone_private_key"
170  " FROM ns098records"
171  " WHERE uid > ?"
172  " ORDER BY uid ASC"
173  " LIMIT ?",
174  &plugin->iterate_all_zones),
175  GNUNET_SQ_make_prepare ("SELECT uid,record_count,record_data,label"
176  " FROM ns098records"
177  " WHERE zone_private_key=? AND label=?",
178  &plugin->lookup_label),
180  };
181 
182  if (GNUNET_OK !=
184  "namestore-sqlite",
185  "FILENAME",
186  &sqlite_filename))
187  {
189  "namestore-sqlite",
190  "FILENAME");
191  return GNUNET_SYSERR;
192  }
193  if (GNUNET_OK !=
194  GNUNET_DISK_file_test (sqlite_filename))
195  {
196  if (GNUNET_OK !=
197  GNUNET_DISK_directory_create_for_file (sqlite_filename))
198  {
199  GNUNET_break (0);
200  GNUNET_free (sqlite_filename);
201  return GNUNET_SYSERR;
202  }
203  }
204  /* sqlite_filename should be UTF-8-encoded. If it isn't, it's a bug */
205  plugin->fn = sqlite_filename;
206 
207  /* Open database and precompile statements */
208  if (SQLITE_OK !=
209  sqlite3_open (plugin->fn,
210  &plugin->dbh))
211  {
213  _ ("Unable to initialize SQLite: %s.\n"),
214  sqlite3_errmsg (plugin->dbh));
215  return GNUNET_SYSERR;
216  }
217  GNUNET_break (SQLITE_OK ==
218  sqlite3_busy_timeout (plugin->dbh,
219  BUSY_TIMEOUT_MS));
220  if (GNUNET_OK !=
222  es))
223  {
224  GNUNET_break (0);
226  _ ("Failed to setup database at `%s'\n"),
227  plugin->fn);
228  return GNUNET_SYSERR;
229  }
230 
231  if (GNUNET_OK !=
232  GNUNET_SQ_prepare (plugin->dbh,
233  ps))
234  {
235  GNUNET_break (0);
237  _ ("Failed to setup database at `%s'\n"),
238  plugin->fn);
239  return GNUNET_SYSERR;
240  }
241  return GNUNET_OK;
242 }
int GNUNET_DISK_file_test(const char *fil)
Check that fil corresponds to a filename (of a file that exists and that is not a directory)...
Definition: disk.c:544
sqlite3_stmt * iterate_all_zones
Precompiled SQL for iterate all records within all zones.
#define GNUNET_SQ_EXECUTE_STATEMENT_END
Terminator for executable statement list.
Information needed to run a list of SQL statements using GNUNET_SQ_exec_statements().
sqlite3_stmt * lookup_label
Precompiled SQL to lookup records based on label.
const struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
int GNUNET_DISK_directory_create_for_file(const char *filename)
Create the directory structure for storing a file.
Definition: disk.c:684
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
Information needed to run a list of SQL statements using GNUNET_SQ_exec_statements().
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
struct GNUNET_SQ_PrepareStatement GNUNET_SQ_make_prepare(const char *sql, sqlite3_stmt **pstmt)
Create a struct GNUNET_SQ_PrepareStatement
Definition: sq_prepare.c:37
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
void GNUNET_log_config_missing(enum GNUNET_ErrorType kind, const char *section, const char *option)
Log error message about missing configuration option.
int GNUNET_SQ_exec_statements(sqlite3 *dbh, const struct GNUNET_SQ_ExecuteStatement *es)
Request execution of an array of statements es from Postgres.
Definition: sq_exec.c:76
struct GNUNET_SQ_ExecuteStatement GNUNET_SQ_make_execute(const char *sql)
Create a struct GNUNET_SQ_ExecuteStatement where errors are fatal.
Definition: sq_exec.c:36
#define LOG(kind,...)
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
sqlite3_stmt * store_records
Precompiled SQL to store records.
#define BUSY_TIMEOUT_MS
After how many ms "busy" should a DB operation fail for good? A low value makes sure that we are more...
char * fn
Filename used for the DB.
#define GNUNET_SQ_PREPARE_END
Terminator for executable statement list.
struct GNUNET_PQ_Context * dbh
Native Postgres database handle.
sqlite3_stmt * delete_records
Precompiled SQL to deltete existing records.
int GNUNET_SQ_prepare(sqlite3 *dbh, const struct GNUNET_SQ_PrepareStatement *ps)
Prepare all statements given in the (NULL,NULL)-terminated array at ps.
Definition: sq_prepare.c:58
sqlite3_stmt * iterate_zone
Precompiled SQL for iterate records within a zone.
int GNUNET_CONFIGURATION_get_value_filename(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, char **value)
Get a configuration value that should be the name of a file or directory.
sqlite3_stmt * zone_to_name
Precompiled SQL to for reverse lookup based on PKEY.
struct GNUNET_SQ_ExecuteStatement GNUNET_SQ_make_try_execute(const char *sql)
Create a struct GNUNET_SQ_ExecuteStatement where errors should be tolerated.
Definition: sq_exec.c:55
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
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 251 of file plugin_namestore_sqlite.c.

References _, Plugin::dbh, Plugin::delete_records, Plugin::fn, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_WARNING, GNUNET_free_non_null, GNUNET_log_from, Plugin::iterate_all_zones, Plugin::iterate_zone, LOG, LOG_SQLITE, Plugin::lookup_label, result, Plugin::store_records, and Plugin::zone_to_name.

Referenced by libgnunet_plugin_namestore_sqlite_done(), and libgnunet_plugin_namestore_sqlite_init().

252 {
253  int result;
254  sqlite3_stmt *stmt;
255 
256  if (NULL != plugin->store_records)
257  sqlite3_finalize (plugin->store_records);
258  if (NULL != plugin->delete_records)
259  sqlite3_finalize (plugin->delete_records);
260  if (NULL != plugin->iterate_zone)
261  sqlite3_finalize (plugin->iterate_zone);
262  if (NULL != plugin->iterate_all_zones)
263  sqlite3_finalize (plugin->iterate_all_zones);
264  if (NULL != plugin->zone_to_name)
265  sqlite3_finalize (plugin->zone_to_name);
266  if (NULL != plugin->lookup_label)
267  sqlite3_finalize (plugin->lookup_label);
268  result = sqlite3_close (plugin->dbh);
269  if (result == SQLITE_BUSY)
270  {
272  _ (
273  "Tried to close sqlite without finalizing all prepared statements.\n"));
274  stmt = sqlite3_next_stmt (plugin->dbh,
275  NULL);
276  while (NULL != stmt)
277  {
279  "sqlite",
280  "Closing statement %p\n",
281  stmt);
282  result = sqlite3_finalize (stmt);
283  if (result != SQLITE_OK)
285  "sqlite",
286  "Failed to close statement %p: %d\n",
287  stmt,
288  result);
289  stmt = sqlite3_next_stmt (plugin->dbh,
290  NULL);
291  }
292  result = sqlite3_close (plugin->dbh);
293  }
294  if (SQLITE_OK != result)
295  LOG_SQLITE (plugin,
297  "sqlite3_close");
298 
299  GNUNET_free_non_null (plugin->fn);
300 }
sqlite3_stmt * iterate_all_zones
Precompiled SQL for iterate all records within all zones.
sqlite3_stmt * lookup_label
Precompiled SQL to lookup records based on label.
#define GNUNET_free_non_null(ptr)
Free the memory pointed to by ptr if ptr is not NULL.
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
#define LOG_SQLITE(db, level, cmd)
Log an error message at log-level &#39;level&#39; that indicates a failure of the command &#39;cmd&#39; on file &#39;file...
static int result
Global testing status.
#define LOG(kind,...)
sqlite3_stmt * store_records
Precompiled SQL to store records.
char * fn
Filename used for the DB.
struct GNUNET_PQ_Context * dbh
Native Postgres database handle.
sqlite3_stmt * delete_records
Precompiled SQL to deltete existing records.
sqlite3_stmt * iterate_zone
Precompiled SQL for iterate records within a zone.
#define GNUNET_log_from(kind, comp,...)
sqlite3_stmt * zone_to_name
Precompiled SQL to for reverse lookup based on PKEY.
Here is the caller graph for this function:

◆ namestore_sqlite_store_records()

static int namestore_sqlite_store_records ( void *  cls,
const struct GNUNET_CRYPTO_EcdsaPrivateKey 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 315 of file plugin_namestore_sqlite.c.

References data, data_size, Plugin::dbh, Plugin::delete_records, GNUNET_break, GNUNET_CRYPTO_QUALITY_WEAK, GNUNET_CRYPTO_random_u64(), GNUNET_ERROR_TYPE_BULK, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_WARNING, GNUNET_GNSRECORD_records_get_size(), GNUNET_GNSRECORD_records_serialize(), GNUNET_GNSRECORD_TYPE_PKEY, GNUNET_log_from, GNUNET_memcpy, GNUNET_NO, GNUNET_OK, GNUNET_SQ_bind(), GNUNET_SQ_query_param_auto_from_type, GNUNET_SQ_query_param_end, GNUNET_SQ_query_param_fixed_size(), GNUNET_SQ_query_param_string(), GNUNET_SQ_query_param_uint32(), GNUNET_SQ_query_param_uint64(), GNUNET_SQ_reset(), GNUNET_SYSERR, LOG_SQLITE, plugin, ret, and Plugin::store_records.

Referenced by libgnunet_plugin_namestore_sqlite_init().

321 {
322  struct Plugin *plugin = cls;
323  int n;
325  uint64_t rvalue;
326  ssize_t data_size;
327 
328  memset (&pkey,
329  0,
330  sizeof(pkey));
331  for (unsigned int i = 0; i < rd_count; i++)
332  if (GNUNET_GNSRECORD_TYPE_PKEY == rd[i].record_type)
333  {
334  GNUNET_break (sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey) ==
335  rd[i].data_size);
337  rd[i].data,
338  rd[i].data_size);
339  break;
340  }
342  UINT64_MAX);
343  data_size = GNUNET_GNSRECORD_records_get_size (rd_count,
344  rd);
345  if (data_size < 0)
346  {
347  GNUNET_break (0);
348  return GNUNET_SYSERR;
349  }
350  if (data_size > 64 * 65536)
351  {
352  GNUNET_break (0);
353  return GNUNET_SYSERR;
354  }
355  {
356  /* First delete 'old' records */
357  char data[data_size];
358  struct GNUNET_SQ_QueryParam dparams[] = {
362  };
363  ssize_t ret;
364 
365  ret = GNUNET_GNSRECORD_records_serialize (rd_count,
366  rd,
367  data_size,
368  data);
369  if ((ret < 0) ||
370  (data_size != ret))
371  {
372  GNUNET_break (0);
373  return GNUNET_SYSERR;
374  }
375  if (GNUNET_OK !=
377  dparams))
378  {
379  LOG_SQLITE (plugin,
381  "sqlite3_bind_XXXX");
382  GNUNET_SQ_reset (plugin->dbh,
383  plugin->delete_records);
384  return GNUNET_SYSERR;
385  }
386  n = sqlite3_step (plugin->delete_records);
387  GNUNET_SQ_reset (plugin->dbh,
388  plugin->delete_records);
389 
390  if (0 != rd_count)
391  {
392  uint32_t rd_count32 = (uint32_t) rd_count;
393  struct GNUNET_SQ_QueryParam sparams[] = {
397  GNUNET_SQ_query_param_uint32 (&rd_count32),
398  GNUNET_SQ_query_param_fixed_size (data, data_size),
401  };
402 
403  if (GNUNET_OK !=
404  GNUNET_SQ_bind (plugin->store_records,
405  sparams))
406  {
407  LOG_SQLITE (plugin,
409  "sqlite3_bind_XXXX");
410  GNUNET_SQ_reset (plugin->dbh,
411  plugin->store_records);
412  return GNUNET_SYSERR;
413  }
414  n = sqlite3_step (plugin->store_records);
415  GNUNET_SQ_reset (plugin->dbh,
416  plugin->store_records);
417  }
418  }
419  switch (n)
420  {
421  case SQLITE_DONE:
422  if (0 != rd_count)
424  "sqlite",
425  "Record stored\n");
426  else
428  "sqlite",
429  "Record deleted\n");
430  return GNUNET_OK;
431 
432  case SQLITE_BUSY:
433  LOG_SQLITE (plugin,
435  "sqlite3_step");
436  return GNUNET_NO;
437 
438  default:
439  LOG_SQLITE (plugin,
441  "sqlite3_step");
442  return GNUNET_SYSERR;
443  }
444 }
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.
static char * pkey
Public key of the zone to look in, in ASCII.
uint64_t GNUNET_CRYPTO_random_u64(enum GNUNET_CRYPTO_Quality mode, uint64_t max)
Random on unsigned 64-bit values.
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.
static size_t data_size
Number of bytes in data.
Definition: gnunet-abd.c:187
#define GNUNET_SQ_query_param_auto_from_type(x)
Generate fixed-size query parameter with size determined by variable type.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
static int ret
Return value of the commandline.
Definition: gnunet-abd.c:81
#define GNUNET_NO
Definition: gnunet_common.h:78
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
struct GNUNET_SQ_QueryParam GNUNET_SQ_query_param_uint32(const uint32_t *x)
Generate query parameter for an uint32_t in host byte order.
#define LOG_SQLITE(db, level, cmd)
Log an error message at log-level &#39;level&#39; that indicates a failure of the command &#39;cmd&#39; on file &#39;file...
#define GNUNET_GNSRECORD_TYPE_PKEY
Record type for GNS zone transfer ("PKEY").
int GNUNET_SQ_bind(sqlite3_stmt *stmt, const struct GNUNET_SQ_QueryParam *params)
Execute binding operations for a prepared statement.
Definition: sq.c:37
static char * plugin
Solver plugin name as string.
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
sqlite3_stmt * store_records
Precompiled SQL to store records.
struct GNUNET_SQ_QueryParam GNUNET_SQ_query_param_string(const char *ptr)
Generate query parameter for a string.
Description of a DB query parameter.
Definition: gnunet_sq_lib.h:54
void GNUNET_SQ_reset(sqlite3 *dbh, sqlite3_stmt *stmt)
Reset stmt and log error.
Definition: sq.c:132
struct GNUNET_SQ_QueryParam GNUNET_SQ_query_param_uint64(const uint64_t *x)
Generate query parameter for an uint16_t in host byte order.
Handle for a plugin.
Definition: block.c:37
struct GNUNET_PQ_Context * dbh
Native Postgres database handle.
sqlite3_stmt * delete_records
Precompiled SQL to deltete existing records.
Public ECC key (always for Curve25519) encoded in a format suitable for network transmission and ECDS...
struct GNUNET_SQ_QueryParam GNUNET_SQ_query_param_fixed_size(const void *ptr, size_t ptr_size)
Generate query parameter for a buffer ptr of ptr_size bytes.
#define GNUNET_SQ_query_param_end
End of query parameter specification.
Definition: gnunet_sq_lib.h:86
#define GNUNET_log_from(kind, comp,...)
uint32_t data
The data value.
No good quality of the operation is needed (i.e., random numbers can be pseudo-random).
Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_records_and_call_iterator()

static int get_records_and_call_iterator ( struct Plugin plugin,
sqlite3_stmt *  stmt,
const struct GNUNET_CRYPTO_EcdsaPrivateKey zone_key,
uint64_t  limit,
GNUNET_NAMESTORE_RecordIterator  iter,
void *  iter_cls 
)
static

The given 'sqlite' statement has been prepared to be run.

It will return a record which should be given to the iterator. Runs the statement and parses the returned record.

Parameters
pluginplugin context
stmtto run (and then clean up)
zone_keyprivate key of the zone
limitmaximum number of results to fetch
iteriterator 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 461 of file plugin_namestore_sqlite.c.

References data, data_size, Plugin::dbh, GNUNET_assert, GNUNET_break, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_GNSRECORD_records_deserialize(), GNUNET_log, GNUNET_NO, GNUNET_OK, GNUNET_SQ_cleanup_result(), GNUNET_SQ_extract_result(), GNUNET_SQ_reset(), GNUNET_SQ_result_spec_auto_from_type, GNUNET_SQ_result_spec_end, GNUNET_SQ_result_spec_string(), GNUNET_SQ_result_spec_uint32(), GNUNET_SQ_result_spec_uint64(), GNUNET_SQ_result_spec_variable_size(), GNUNET_SYSERR, Plugin::iter, LOG_SQLITE, record_count, and ret.

Referenced by namestore_sqlite_iterate_records(), namestore_sqlite_lookup_records(), and namestore_sqlite_zone_to_name().

468 {
469  int ret;
470  int sret;
471 
472  ret = GNUNET_OK;
473  for (uint64_t i = 0; i < limit; i++)
474  {
475  sret = sqlite3_step (stmt);
476 
477  if (SQLITE_DONE == sret)
478  {
480  "Iteration done (no results)\n");
481  ret = GNUNET_NO;
482  break;
483  }
484  if (SQLITE_ROW != sret)
485  {
486  LOG_SQLITE (plugin,
488  "sqlite_step");
489  ret = GNUNET_SYSERR;
490  break;
491  }
492 
493  {
494  uint64_t seq;
495  uint32_t record_count;
496  size_t data_size;
497  void *data;
498  char *label;
500  struct GNUNET_SQ_ResultSpec rs[] = {
502  GNUNET_SQ_result_spec_uint32 (&record_count),
504  &data_size),
507  };
508  struct GNUNET_SQ_ResultSpec rsx[] = {
510  GNUNET_SQ_result_spec_uint32 (&record_count),
512  &data_size),
516  };
517 
518  ret = GNUNET_SQ_extract_result (stmt,
519  (NULL == zone_key)
520  ? rsx
521  : rs);
522  if ((GNUNET_OK != ret) ||
523  (record_count > 64 * 1024))
524  {
525  /* sanity check, don't stack allocate far too much just
526  because database might contain a large value here */
527  GNUNET_break (0);
528  ret = GNUNET_SYSERR;
529  break;
530  }
531  else
532  {
533  struct GNUNET_GNSRECORD_Data rd[record_count];
534 
535  GNUNET_assert (0 != seq);
536  if (GNUNET_OK !=
538  data,
539  record_count,
540  rd))
541  {
542  GNUNET_break (0);
543  ret = GNUNET_SYSERR;
544  break;
545  }
546  else
547  {
548  if (NULL != zone_key)
549  zk = *zone_key;
550  if (NULL != iter)
551  iter (iter_cls,
552  seq,
553  &zk,
554  label,
555  record_count,
556  rd);
557  }
558  }
560  }
561  }
562  GNUNET_SQ_reset (plugin->dbh,
563  stmt);
564  return ret;
565 }
Description of a DB result cell.
struct GNUNET_SQ_ResultSpec GNUNET_SQ_result_spec_uint32(uint32_t *u32)
uint32_t expected.
static size_t data_size
Number of bytes in data.
Definition: gnunet-abd.c:187
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
static int ret
Return value of the commandline.
Definition: gnunet-abd.c:81
#define GNUNET_SQ_result_spec_end
End of result parameter specification.
#define GNUNET_NO
Definition: gnunet_common.h:78
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
Private ECC key encoded for transmission.
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_SQ_result_spec_auto_from_type(dst)
We expect a fixed-size result, with size determined by the type of * dst
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
int GNUNET_SQ_extract_result(sqlite3_stmt *result, struct GNUNET_SQ_ResultSpec *rs)
Extract results from a query result according to the given specification.
Definition: sq.c:82
static uint64_t record_count
Record count.
#define LOG_SQLITE(db, level, cmd)
Log an error message at log-level &#39;level&#39; that indicates a failure of the command &#39;cmd&#39; on file &#39;file...
void GNUNET_SQ_cleanup_result(struct GNUNET_SQ_ResultSpec *rs)
Free all memory that was allocated in rs during GNUNET_SQ_extract_result().
Definition: sq.c:117
struct GNUNET_SQ_ResultSpec GNUNET_SQ_result_spec_variable_size(void **dst, size_t *sptr)
Variable-size result expected.
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
struct GNUNET_SQ_ResultSpec GNUNET_SQ_result_spec_uint64(uint64_t *u64)
uint64_t expected.
void GNUNET_SQ_reset(sqlite3 *dbh, sqlite3_stmt *stmt)
Reset stmt and log error.
Definition: sq.c:132
struct GNUNET_PQ_Context * dbh
Native Postgres database handle.
#define GNUNET_log(kind,...)
struct GNUNET_SQ_ResultSpec GNUNET_SQ_result_spec_string(char **dst)
0-terminated string expected.
uint32_t data
The data value.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ namestore_sqlite_lookup_records()

static int namestore_sqlite_lookup_records ( void *  cls,
const struct GNUNET_CRYPTO_EcdsaPrivateKey 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 579 of file plugin_namestore_sqlite.c.

References Plugin::dbh, get_records_and_call_iterator(), GNUNET_break, GNUNET_ERROR_TYPE_BULK, GNUNET_ERROR_TYPE_ERROR, GNUNET_OK, GNUNET_SQ_bind(), GNUNET_SQ_query_param_auto_from_type, GNUNET_SQ_query_param_end, GNUNET_SQ_query_param_string(), GNUNET_SQ_reset(), GNUNET_SYSERR, LOG_SQLITE, Plugin::lookup_label, and plugin.

Referenced by libgnunet_plugin_namestore_sqlite_init().

585 {
586  struct Plugin *plugin = cls;
587  struct GNUNET_SQ_QueryParam params[] = {
591  };
592 
593  if (NULL == zone)
594  {
595  GNUNET_break (0);
596  return GNUNET_SYSERR;
597  }
598  if (GNUNET_OK !=
599  GNUNET_SQ_bind (plugin->lookup_label,
600  params))
601  {
603  "sqlite3_bind_XXXX");
604  GNUNET_SQ_reset (plugin->dbh,
605  plugin->lookup_label);
606  return GNUNET_SYSERR;
607  }
608  return get_records_and_call_iterator (plugin,
609  plugin->lookup_label,
610  zone,
611  1,
612  iter,
613  iter_cls);
614 }
static int get_records_and_call_iterator(struct Plugin *plugin, sqlite3_stmt *stmt, const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key, uint64_t limit, GNUNET_NAMESTORE_RecordIterator iter, void *iter_cls)
The given &#39;sqlite&#39; statement has been prepared to be run.
sqlite3_stmt * lookup_label
Precompiled SQL to lookup records based on label.
#define GNUNET_SQ_query_param_auto_from_type(x)
Generate fixed-size query parameter with size determined by variable type.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
#define LOG_SQLITE(db, level, cmd)
Log an error message at log-level &#39;level&#39; that indicates a failure of the command &#39;cmd&#39; on file &#39;file...
int GNUNET_SQ_bind(sqlite3_stmt *stmt, const struct GNUNET_SQ_QueryParam *params)
Execute binding operations for a prepared statement.
Definition: sq.c:37
static char * plugin
Solver plugin name as string.
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
struct GNUNET_SQ_QueryParam GNUNET_SQ_query_param_string(const char *ptr)
Generate query parameter for a string.
Description of a DB query parameter.
Definition: gnunet_sq_lib.h:54
void GNUNET_SQ_reset(sqlite3 *dbh, sqlite3_stmt *stmt)
Reset stmt and log error.
Definition: sq.c:132
Handle for a plugin.
Definition: block.c:37
struct GNUNET_PQ_Context * dbh
Native Postgres database handle.
#define GNUNET_SQ_query_param_end
End of query parameter specification.
Definition: gnunet_sq_lib.h:86
Here is the call graph for this function:
Here is the caller graph for this function:

◆ namestore_sqlite_iterate_records()

static int namestore_sqlite_iterate_records ( void *  cls,
const struct GNUNET_CRYPTO_EcdsaPrivateKey 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 return
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 630 of file plugin_namestore_sqlite.c.

References Plugin::dbh, get_records_and_call_iterator(), GNUNET_ERROR_TYPE_BULK, GNUNET_ERROR_TYPE_ERROR, GNUNET_OK, GNUNET_SQ_bind(), GNUNET_SQ_query_param_auto_from_type, GNUNET_SQ_query_param_end, GNUNET_SQ_query_param_uint64(), GNUNET_SQ_reset(), GNUNET_SYSERR, Plugin::iterate_all_zones, Plugin::iterate_zone, LOG_SQLITE, and plugin.

Referenced by libgnunet_plugin_namestore_sqlite_init().

637 {
638  struct Plugin *plugin = cls;
639  sqlite3_stmt *stmt;
640  int err;
641 
642  if (NULL == zone)
643  {
644  struct GNUNET_SQ_QueryParam params[] = {
648  };
649 
650  stmt = plugin->iterate_all_zones;
651  err = GNUNET_SQ_bind (stmt,
652  params);
653  }
654  else
655  {
656  struct GNUNET_SQ_QueryParam params[] = {
661  };
662 
663  stmt = plugin->iterate_zone;
664  err = GNUNET_SQ_bind (stmt,
665  params);
666  }
667  if (GNUNET_OK != err)
668  {
669  LOG_SQLITE (plugin,
671  "sqlite3_bind_XXXX");
672  GNUNET_SQ_reset (plugin->dbh,
673  stmt);
674  return GNUNET_SYSERR;
675  }
676  return get_records_and_call_iterator (plugin,
677  stmt,
678  zone,
679  limit,
680  iter,
681  iter_cls);
682 }
static int get_records_and_call_iterator(struct Plugin *plugin, sqlite3_stmt *stmt, const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key, uint64_t limit, GNUNET_NAMESTORE_RecordIterator iter, void *iter_cls)
The given &#39;sqlite&#39; statement has been prepared to be run.
sqlite3_stmt * iterate_all_zones
Precompiled SQL for iterate all records within all zones.
#define GNUNET_SQ_query_param_auto_from_type(x)
Generate fixed-size query parameter with size determined by variable type.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
#define LOG_SQLITE(db, level, cmd)
Log an error message at log-level &#39;level&#39; that indicates a failure of the command &#39;cmd&#39; on file &#39;file...
int GNUNET_SQ_bind(sqlite3_stmt *stmt, const struct GNUNET_SQ_QueryParam *params)
Execute binding operations for a prepared statement.
Definition: sq.c:37
static char * plugin
Solver plugin name as string.
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
Description of a DB query parameter.
Definition: gnunet_sq_lib.h:54
void GNUNET_SQ_reset(sqlite3 *dbh, sqlite3_stmt *stmt)
Reset stmt and log error.
Definition: sq.c:132
struct GNUNET_SQ_QueryParam GNUNET_SQ_query_param_uint64(const uint64_t *x)
Generate query parameter for an uint16_t in host byte order.
Handle for a plugin.
Definition: block.c:37
struct GNUNET_PQ_Context * dbh
Native Postgres database handle.
sqlite3_stmt * iterate_zone
Precompiled SQL for iterate records within a zone.
#define GNUNET_SQ_query_param_end
End of query parameter specification.
Definition: gnunet_sq_lib.h:86
Here is the call graph for this function:
Here is the caller graph for this function:

◆ namestore_sqlite_zone_to_name()

static int namestore_sqlite_zone_to_name ( void *  cls,
const struct GNUNET_CRYPTO_EcdsaPrivateKey zone,
const struct GNUNET_CRYPTO_EcdsaPublicKey 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 697 of file plugin_namestore_sqlite.c.

References Plugin::dbh, get_records_and_call_iterator(), GNUNET_ERROR_TYPE_BULK, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_GNSRECORD_z2s(), GNUNET_OK, GNUNET_SQ_bind(), GNUNET_SQ_query_param_auto_from_type, GNUNET_SQ_query_param_end, GNUNET_SQ_reset(), GNUNET_SYSERR, LOG, LOG_SQLITE, plugin, and Plugin::zone_to_name.

Referenced by libgnunet_plugin_namestore_sqlite_init().

703 {
704  struct Plugin *plugin = cls;
705  struct GNUNET_SQ_QueryParam params[] = {
709  };
710 
711  if (GNUNET_OK !=
712  GNUNET_SQ_bind (plugin->zone_to_name,
713  params))
714  {
715  LOG_SQLITE (plugin,
717  "sqlite3_bind_XXXX");
718  GNUNET_SQ_reset (plugin->dbh,
719  plugin->zone_to_name);
720  return GNUNET_SYSERR;
721  }
723  "Performing reverse lookup for `%s'\n",
724  GNUNET_GNSRECORD_z2s (value_zone));
725  return get_records_and_call_iterator (plugin,
726  plugin->zone_to_name,
727  zone,
728  1,
729  iter,
730  iter_cls);
731 }
static int get_records_and_call_iterator(struct Plugin *plugin, sqlite3_stmt *stmt, const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key, uint64_t limit, GNUNET_NAMESTORE_RecordIterator iter, void *iter_cls)
The given &#39;sqlite&#39; statement has been prepared to be run.
#define GNUNET_SQ_query_param_auto_from_type(x)
Generate fixed-size query parameter with size determined by variable type.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
#define LOG_SQLITE(db, level, cmd)
Log an error message at log-level &#39;level&#39; that indicates a failure of the command &#39;cmd&#39; on file &#39;file...
const char * GNUNET_GNSRECORD_z2s(const struct GNUNET_CRYPTO_EcdsaPublicKey *z)
Convert a zone key to a string (for printing debug messages).
int GNUNET_SQ_bind(sqlite3_stmt *stmt, const struct GNUNET_SQ_QueryParam *params)
Execute binding operations for a prepared statement.
Definition: sq.c:37
static char * plugin
Solver plugin name as string.
#define LOG(kind,...)
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
Description of a DB query parameter.
Definition: gnunet_sq_lib.h:54
void GNUNET_SQ_reset(sqlite3 *dbh, sqlite3_stmt *stmt)
Reset stmt and log error.
Definition: sq.c:132
Handle for a plugin.
Definition: block.c:37
struct GNUNET_PQ_Context * dbh
Native Postgres database handle.
#define GNUNET_SQ_query_param_end
End of query parameter specification.
Definition: gnunet_sq_lib.h:86
sqlite3_stmt * zone_to_name
Precompiled SQL to for reverse lookup based on PKEY.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ libgnunet_plugin_namestore_sqlite_init()

void* libgnunet_plugin_namestore_sqlite_init ( void *  cls)

Entry point for the plugin.

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

Definition at line 741 of file plugin_namestore_sqlite.c.

References _, Plugin::api, Plugin::cfg, GNUNET_NAMESTORE_PluginFunctions::cls, database_setup(), database_shutdown(), GNUNET_ERROR_TYPE_INFO, GNUNET_new, GNUNET_OK, GNUNET_NAMESTORE_PluginFunctions::iterate_records, LOG, GNUNET_NAMESTORE_PluginFunctions::lookup_records, namestore_sqlite_iterate_records(), namestore_sqlite_lookup_records(), namestore_sqlite_store_records(), namestore_sqlite_zone_to_name(), plugin, GNUNET_NAMESTORE_PluginFunctions::store_records, and GNUNET_NAMESTORE_PluginFunctions::zone_to_name.

742 {
743  static struct Plugin plugin;
744  const struct GNUNET_CONFIGURATION_Handle *cfg = cls;
746 
747  if (NULL != plugin.cfg)
748  return NULL; /* can only initialize once! */
749  memset (&plugin,
750  0,
751  sizeof(struct Plugin));
752  plugin.cfg = cfg;
753  if (GNUNET_OK != database_setup (&plugin))
754  {
756  return NULL;
757  }
759  api->cls = &plugin;
765  _ ("Sqlite database running\n"));
766  return api;
767 }
static const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration we are using.
Definition: gnunet-abd.c:36
static int namestore_sqlite_iterate_records(void *cls, const struct GNUNET_CRYPTO_EcdsaPrivateKey *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.
int(* zone_to_name)(void *cls, const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone, const struct GNUNET_CRYPTO_EcdsaPublicKey *value_zone, GNUNET_NAMESTORE_RecordIterator iter, void *iter_cls)
Look for an existing PKEY delegation record for a given public key.
static int namestore_sqlite_zone_to_name(void *cls, const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone, const struct GNUNET_CRYPTO_EcdsaPublicKey *value_zone, GNUNET_NAMESTORE_RecordIterator iter, void *iter_cls)
Look for an existing PKEY delegation record for a given public key.
static void database_shutdown(struct Plugin *plugin)
Shutdown database connection and associate data structures.
#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.
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
void * cls
Closure to pass to all plugin functions.
static int database_setup(struct Plugin *plugin)
Initialize the database connections and associated data structures (create tables and indices as need...
static char * plugin
Solver plugin name as string.
#define LOG(kind,...)
static int namestore_sqlite_lookup_records(void *cls, const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone, const char *label, GNUNET_NAMESTORE_RecordIterator iter, void *iter_cls)
Lookup records in the datastore for which we are the authority.
int(* lookup_records)(void *cls, const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone, const char *label, GNUNET_NAMESTORE_RecordIterator iter, void *iter_cls)
Lookup records in the datastore for which we are the authority.
configuration data
Definition: configuration.c:85
Handle for a plugin.
Definition: block.c:37
static int namestore_sqlite_store_records(void *cls, const struct GNUNET_CRYPTO_EcdsaPrivateKey *zone_key, const char *label, unsigned int rd_count, const struct GNUNET_GNSRECORD_Data *rd)
Store a record in the datastore.
int(* store_records)(void *cls, const struct GNUNET_CRYPTO_EcdsaPrivateKey *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.
struct returned by the initialization function of the plugin
int(* iterate_records)(void *cls, const struct GNUNET_CRYPTO_EcdsaPrivateKey *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.
Here is the call graph for this function:

◆ libgnunet_plugin_namestore_sqlite_done()

void* libgnunet_plugin_namestore_sqlite_done ( void *  cls)

Exit point from the plugin.

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

Definition at line 777 of file plugin_namestore_sqlite.c.

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

778 {
780  struct Plugin *plugin = api->cls;
781 
782  database_shutdown (plugin);
783  plugin->cfg = NULL;
784  GNUNET_free (api);
786  "sqlite plugin is finished\n");
787  return NULL;
788 }
static void database_shutdown(struct Plugin *plugin)
Shutdown database connection and associate data structures.
const struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
void * cls
Closure to pass to all plugin functions.
static char * plugin
Solver plugin name as string.
#define LOG(kind,...)
Handle for a plugin.
Definition: block.c:37
struct returned by the initialization function of the plugin
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function: