GNUnet  0.10.x
pq.c File Reference

helper functions for libpq (PostGres) interactions More...

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

Go to the source code of this file.


PGresult * GNUNET_PQ_exec_prepared (PGconn *db_conn, const char *name, const struct GNUNET_PQ_QueryParam *params)
 Execute a prepared statement. More...
void GNUNET_PQ_cleanup_result (struct GNUNET_PQ_ResultSpec *rs)
 Free all memory that was allocated in rs during GNUNET_PQ_extract_result(). More...
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. More...

Detailed Description

helper functions for libpq (PostGres) interactions

Sree Harsha Totakura
Florian Dold
Christian Grothoff

Definition in file pq.c.

Function Documentation

◆ GNUNET_PQ_exec_prepared()

PGresult* GNUNET_PQ_exec_prepared ( PGconn *  db_conn,
const char *  name,
const struct GNUNET_PQ_QueryParam params 

Execute a prepared statement.

db_conndatabase connection
namename of the prepared statement
paramsparameters to the statement
postgres result

Definition at line 41 of file pq.c.

References GNUNET_PQ_QueryParam::conv, GNUNET_PQ_QueryParam::conv_cls, GNUNET_PQ_QueryParam::data, GNUNET_assert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_log_from, len, GNUNET_PQ_QueryParam::num_params, res, ret, and GNUNET_PQ_QueryParam::size.

Referenced by GNUNET_PQ_eval_prepared_multi_select(), GNUNET_PQ_eval_prepared_non_select(), and GNUNET_PQ_eval_prepared_singleton_select().

44 {
45  unsigned int len;
46  unsigned int i;
49  "Running prepared statement `%s' on %p\n",
50  name,
51  db_conn);
52  /* count the number of parameters */
53  len = 0;
54  for (i=0;0 != params[i].num_params;i++)
55  len += params[i].num_params;
57  /* new scope to allow stack allocation without alloca */
58  {
59  /* Scratch buffer for temporary storage */
60  void *scratch[len];
61  /* Parameter array we are building for the query */
62  void *param_values[len];
63  int param_lengths[len];
64  int param_formats[len];
65  unsigned int off;
66  /* How many entries in the scratch buffer are in use? */
67  unsigned int soff;
68  PGresult *res;
69  int ret;
71  off = 0;
72  soff = 0;
73  for (i=0;0 != params[i].num_params;i++)
74  {
75  const struct GNUNET_PQ_QueryParam *x = &params[i];
77  ret = x->conv (x->conv_cls,
78  x->data,
79  x->size,
80  &param_values[off],
81  &param_lengths[off],
82  &param_formats[off],
83  x->num_params,
84  &scratch[soff],
85  len - soff);
86  if (ret < 0)
87  {
88  for (off = 0; off < soff; off++)
89  GNUNET_free (scratch[off]);
90  return NULL;
91  }
92  soff += ret;
93  off += x->num_params;
94  }
95  GNUNET_assert (off == len);
97  "pq",
98  "Executing prepared SQL statement `%s'\n",
99  name);
100  res = PQexecPrepared (db_conn,
101  name,
102  len,
103  (const char **) param_values,
104  param_lengths,
105  param_formats,
106  1);
107  for (off = 0; off < soff; off++)
108  GNUNET_free (scratch[off]);
109  return res;
110  }
111 }
GNUNET_PQ_QueryConverter conv
Function for how to handle this type of entry.
Definition: gnunet_pq_lib.h:69
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
const void * data
Data or NULL.
Definition: gnunet_pq_lib.h:79
static int ret
Final status code.
Definition: gnunet-arm.c:89
void * conv_cls
Closure for conv.
Definition: gnunet_pq_lib.h:74
static int res
const char * name
unsigned int num_params
Number of parameters eaten by this operation.
Definition: gnunet_pq_lib.h:89
Description of a DB query parameter.
Definition: gnunet_pq_lib.h:63
#define GNUNET_log(kind,...)
size_t size
Size of data.
Definition: gnunet_pq_lib.h:84
#define GNUNET_log_from(kind, comp,...)
#define GNUNET_free(ptr)
Wrapper around free.
uint16_t len
length of data (which is always a uint32_t, but presumably this can be used to specify that fewer byt...
Here is the caller graph for this function:

◆ GNUNET_PQ_cleanup_result()

void GNUNET_PQ_cleanup_result ( struct GNUNET_PQ_ResultSpec rs)

Free all memory that was allocated in rs during GNUNET_PQ_extract_result().

rsreult specification to clean up

Definition at line 121 of file pq.c.

References GNUNET_PQ_ResultSpec::cleaner, and GNUNET_PQ_ResultSpec::conv.

Referenced by extract_result_cb(), GNUNET_PQ_extract_result(), handle_results(), namecache_postgres_lookup_block(), parse_result_call_iterator(), postgres_plugin_del(), postgres_plugin_get_random(), process_keys(), and process_result().

122 {
123  unsigned int i;
125  for (i=0; NULL != rs[i].conv; i++)
126  if (NULL != rs[i].cleaner)
127  rs[i].cleaner (rs[i].cls,
128  rs[i].dst);
129 }
GNUNET_PQ_ResultCleanup cleaner
Function to clean up result data, NULL if cleanup is not necessary.
GNUNET_PQ_ResultConverter conv
What is the format of the result?
Here is the caller graph for this function:

◆ GNUNET_PQ_extract_result()

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.

resultresult to process
[in,out]rsresult specification to extract for
rowrow from the result to extract
GNUNET_YES if all results could be extracted GNUNET_SYSERR if a result was invalid (non-existing field)

Definition at line 144 of file pq.c.

References GNUNET_PQ_ResultSpec::cls, GNUNET_PQ_ResultSpec::conv, GNUNET_PQ_ResultSpec::dst, GNUNET_PQ_ResultSpec::dst_size, GNUNET_PQ_ResultSpec::fname, GNUNET_OK, GNUNET_PQ_cleanup_result(), GNUNET_SYSERR, GNUNET_PQ_ResultSpec::result_size, and ret.

Referenced by extract_result_cb(), GNUNET_PQ_eval_prepared_singleton_select(), handle_results(), parse_result_call_iterator(), process_keys(), and process_result().

147 {
148  unsigned int i;
149  int ret;
151  for (i=0; NULL != rs[i].conv; i++)
152  {
153  struct GNUNET_PQ_ResultSpec *spec;
155  spec = &rs[i];
156  ret = spec->conv (spec->cls,
157  result,
158  row,
159  spec->fname,
160  &spec->dst_size,
161  spec->dst);
162  if (GNUNET_OK != ret)
163  {
165  return GNUNET_SYSERR;
166  }
167  if (NULL != spec->result_size)
168  *spec->result_size = spec->dst_size;
169  }
170  return GNUNET_OK;
171 }
const char * fname
Field name of the desired result.
Description of a DB result cell.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
static int ret
Final status code.
Definition: gnunet-arm.c:89
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
void * cls
Closure for conv and cleaner.
static int result
Global testing status.
size_t dst_size
Allowed size for the data, 0 for variable-size (in this case, the type of dst is a void ** and we nee...
Definition: gnunet_common.h:79
void * dst
Destination for the data.
size_t * result_size
Where to store actual size of the result.
GNUNET_PQ_ResultConverter conv
What is the format of the result?
Here is the call graph for this function:
Here is the caller graph for this function: