GNUnet debian-0.26.1-3-g4ab7c7911
 
Loading...
Searching...
No Matches
pq_result_helper.c File Reference

functions to extract result values More...

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

Go to the source code of this file.

Data Structures

struct  array_result_cls
 Closure for the array result specifications. More...
 

Macros

#define FAIL_IF(cond)
 
#define HANDLE_ELEMENT(typ, conv, access)
 
#define HANDLE_ARRAY(typ, conv, access)
 
#define DEREF(typ, conv)    *(typ *) out = conv (*(typ *) in)
 
#define ACCESS_ABS(typ, conv)    ((typ *) out)->abs_value_us = conv (*(uint64_t *) in)
 
#define ACCESS_REL(typ, conv)    ((typ *) out)->rel_value_us = conv (*(uint64_t *) in)
 
#define ACCESS_TSTMP(typ, conv)    ((typ *) out)->abs_time.abs_value_us = conv (*(uint64_t *) in)
 

Functions

struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_allow_null (struct GNUNET_PQ_ResultSpec rs, bool *is_null)
 Allow NULL value to be found in the database for the given value.
 
static void clean_varsize_blob (void *cls, void *rd)
 Function called to clean up memory allocated by a GNUNET_PQ_ResultConverter.
 
static enum GNUNET_GenericReturnValue extract_varsize_blob (void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
 Extract data from a Postgres database result at row row.
 
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_variable_size (const char *name, void **dst, size_t *sptr)
 Variable-size result expected.
 
static enum GNUNET_GenericReturnValue extract_fixed_blob (void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
 Extract data from a Postgres database result at row row.
 
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_fixed_size (const char *name, void *dst, size_t dst_size)
 Fixed-size result expected.
 
static enum GNUNET_GenericReturnValue extract_rsa_public_key (void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
 Extract data from a Postgres database result at row row.
 
static void clean_rsa_public_key (void *cls, void *rd)
 Function called to clean up memory allocated by a GNUNET_PQ_ResultConverter.
 
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_rsa_public_key (const char *name, struct GNUNET_CRYPTO_RsaPublicKey **rsa)
 RSA public key expected.
 
static enum GNUNET_GenericReturnValue extract_rsa_signature (void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
 Extract data from a Postgres database result at row row.
 
static void clean_rsa_signature (void *cls, void *rd)
 Function called to clean up memory allocated by a GNUNET_PQ_ResultConverter.
 
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_rsa_signature (const char *name, struct GNUNET_CRYPTO_RsaSignature **sig)
 RSA signature expected.
 
static enum GNUNET_GenericReturnValue extract_string (void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
 Extract data from a Postgres database result at row row.
 
static void clean_string (void *cls, void *rd)
 Function called to clean up memory allocated by a GNUNET_PQ_ResultConverter.
 
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_string (const char *name, char **dst)
 0-terminated string expected.
 
static enum GNUNET_GenericReturnValue extract_bool (void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
 Extract data from a Postgres database result at row row.
 
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_bool (const char *name, bool *dst)
 boolean expected.
 
static enum GNUNET_GenericReturnValue extract_rel_time (void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
 Extract data from a Postgres database result at row row.
 
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_relative_time (const char *name, struct GNUNET_TIME_Relative *rt)
 Relative time expected.
 
static enum GNUNET_GenericReturnValue extract_abs_time (void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
 Extract data from a Postgres database result at row row.
 
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_absolute_time (const char *name, struct GNUNET_TIME_Absolute *at)
 Absolute time expected.
 
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_absolute_time_nbo (const char *name, struct GNUNET_TIME_AbsoluteNBO *at)
 Absolute time expected.
 
static enum GNUNET_GenericReturnValue extract_timestamp (void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
 Extract data from a Postgres database result at row row.
 
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_timestamp (const char *name, struct GNUNET_TIME_Timestamp *at)
 Timestamp expected.
 
static enum GNUNET_GenericReturnValue extract_timestamp_nbo (void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
 Extract data from a Postgres database result at row row.
 
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_timestamp_nbo (const char *name, struct GNUNET_TIME_TimestampNBO *at)
 Timestamp expected.
 
static enum GNUNET_GenericReturnValue extract_uint16 (void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
 Extract data from a Postgres database result at row row.
 
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_uint16 (const char *name, uint16_t *u16)
 uint16_t expected.
 
static enum GNUNET_GenericReturnValue extract_uint32 (void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
 Extract data from a Postgres database result at row row.
 
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_uint32 (const char *name, uint32_t *u32)
 uint32_t expected.
 
static enum GNUNET_GenericReturnValue extract_uint64 (void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
 Extract data from a Postgres database result at row row.
 
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_uint64 (const char *name, uint64_t *u64)
 uint64_t expected.
 
static enum GNUNET_GenericReturnValue extract_int64 (void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
 Extract data from a Postgres database result at row row.
 
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_int64 (const char *name, int64_t *i64)
 int64_t expected.
 
static enum GNUNET_GenericReturnValue extract_array_generic (void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
 Extract data from a Postgres database result as array of a specific type from row row.
 
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_allow_nulls (struct GNUNET_PQ_ResultSpec rs, bool **is_nulls)
 Allow NULL values in an array to be found in the database for the given value.
 
static void array_cleanup (void *cls, void *rd)
 Cleanup of the data and closure of an array spec.
 
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_bool (struct GNUNET_PQ_Context *db, const char *name, size_t *num, bool **dst)
 array of bool expected.
 
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_uint16 (struct GNUNET_PQ_Context *db, const char *name, size_t *num, uint16_t **dst)
 array of uint16_t expected.
 
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_uint32 (struct GNUNET_PQ_Context *db, const char *name, size_t *num, uint32_t **dst)
 array of uint32_t expected.
 
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_uint64 (struct GNUNET_PQ_Context *db, const char *name, size_t *num, uint64_t **dst)
 array of uint64_t expected.
 
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_abs_time (struct GNUNET_PQ_Context *db, const char *name, size_t *num, struct GNUNET_TIME_Absolute **dst)
 array of absolute time expected.
 
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_rel_time (struct GNUNET_PQ_Context *db, const char *name, size_t *num, struct GNUNET_TIME_Relative **dst)
 array of relative time expected.
 
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_timestamp (struct GNUNET_PQ_Context *db, const char *name, size_t *num, struct GNUNET_TIME_Timestamp **dst)
 array of relative time expected.
 
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_variable_size (struct GNUNET_PQ_Context *db, const char *name, size_t *num, size_t **sizes, void **dst)
 Array of variable-size result expected.
 
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_fixed_size (struct GNUNET_PQ_Context *db, const char *name, size_t size, size_t *num, void **dst)
 Array of fixed-size result expected.
 
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_string (struct GNUNET_PQ_Context *db, const char *name, size_t *num, char **dst)
 Array of 0-terminated strings expected.
 
static enum GNUNET_GenericReturnValue extract_blind_sign_pub (void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
 Extract data from a Postgres database result at row row.
 
static void clean_blind_sign_pub (void *cls, void *rd)
 Function called to clean up memory allocated by a GNUNET_PQ_ResultConverter.
 
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_blind_sign_pub (const char *name, struct GNUNET_CRYPTO_BlindSignPublicKey **pub)
 Blind sign public key expected.
 
static enum GNUNET_GenericReturnValue extract_blind_sign_priv (void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
 Extract data from a Postgres database result at row row.
 
static void clean_blind_sign_priv (void *cls, void *rd)
 Function called to clean up memory allocated by a GNUNET_PQ_ResultConverter.
 
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_blind_sign_priv (const char *name, struct GNUNET_CRYPTO_BlindSignPrivateKey **priv)
 Blind sign private key expected.
 
static enum GNUNET_GenericReturnValue extract_blinded_sig (void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
 Extract data from a Postgres database result at row row.
 
static void clean_blinded_sig (void *cls, void *rd)
 Function called to clean up memory allocated by a GNUNET_PQ_ResultConverter.
 
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_blinded_sig (const char *name, struct GNUNET_CRYPTO_BlindedSignature **b_sig)
 Blinded signature expected.
 
static enum GNUNET_GenericReturnValue extract_unblinded_sig (void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
 Extract data from a Postgres database result at row row.
 
static void clean_unblinded_sig (void *cls, void *rd)
 Function called to clean up memory allocated by a GNUNET_PQ_ResultConverter.
 
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_unblinded_sig (const char *name, struct GNUNET_CRYPTO_UnblindedSignature **ub_sig)
 Unblinded signature expected.
 

Detailed Description

functions to extract result values

Author
Christian Grothoff
Özgür Kesim

Definition in file pq_result_helper.c.

Macro Definition Documentation

◆ FAIL_IF

#define FAIL_IF (   cond)
Value:
do { \
if ((cond)) \
{ \
GNUNET_break (! (cond)); \
goto FAIL; \
} \
} while (0)
@ FAIL

◆ HANDLE_ELEMENT

#define HANDLE_ELEMENT (   typ,
  conv,
  access 
)
Value:
do { \
int32_t sz = ntohl (*(int32_t *) in); \
\
in += sizeof(uint32_t); \
if (-1 != sz) \
{ \
FAIL_IF (sz != sizeof(typ)); \
access (typ, conv); \
in += sz; \
} \
else \
{ \
FAIL_IF (! info->allow_nulls); \
(*info->is_nulls)[i] = true; \
} \
\
out += sizeof(typ); \
} while (0)
static GstElement * conv
#define info

◆ HANDLE_ARRAY

#define HANDLE_ARRAY (   typ,
  conv,
  access 
)
Value:
do { \
if (NULL != dst_size) \
*dst_size = sizeof(typ) *(header.dim); \
out = GNUNET_new_array (header.dim, typ); \
*((void **) dst) = out; \
for (uint32_t i = 0; i < header.dim; i++) \
{ \
HANDLE_ELEMENT (typ, conv, access); \
} \
} while (0)
#define GNUNET_new_array(n, type)
Allocate a size n array with structs or unions of the given type.

◆ DEREF

#define DEREF (   typ,
  conv 
)     *(typ *) out = conv (*(typ *) in)

◆ ACCESS_ABS

#define ACCESS_ABS (   typ,
  conv 
)     ((typ *) out)->abs_value_us = conv (*(uint64_t *) in)

◆ ACCESS_REL

#define ACCESS_REL (   typ,
  conv 
)     ((typ *) out)->rel_value_us = conv (*(uint64_t *) in)

◆ ACCESS_TSTMP

#define ACCESS_TSTMP (   typ,
  conv 
)     ((typ *) out)->abs_time.abs_value_us = conv (*(uint64_t *) in)

Function Documentation

◆ GNUNET_PQ_result_spec_allow_null()

struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_allow_null ( struct GNUNET_PQ_ResultSpec  rs,
bool *  is_null 
)

Allow NULL value to be found in the database for the given value.

Parameters
rsresult spec entry to modify
[out]is_nulllocation set to 'true' if the value was indeed NULL, set to 'false' if the value was non-NULL
Returns
array entry for the result specification to use

Definition at line 34 of file pq_result_helper.c.

36{
37 struct GNUNET_PQ_ResultSpec rsr;
38
39 rsr = rs;
40 rsr.is_nullable = true;
41 rsr.is_null = is_null;
42 return rsr;
43}
Description of a DB result cell.
bool * is_null
Points to a location where we should store "true" if the result found is NULL, and otherwise "false".
bool is_nullable
True if NULL is allowed for a value in the database.

References GNUNET_PQ_ResultSpec::is_null, and GNUNET_PQ_ResultSpec::is_nullable.

Referenced by handle_results().

Here is the caller graph for this function:

◆ clean_varsize_blob()

static void clean_varsize_blob ( void *  cls,
void *  rd 
)
static

Function called to clean up memory allocated by a GNUNET_PQ_ResultConverter.

Parameters
clsclosure
rdresult data to clean up

Definition at line 54 of file pq_result_helper.c.

56{
57 void **dst = rd;
58
59 (void) cls;
60 if (NULL != *dst)
61 {
62 GNUNET_free (*dst);
63 *dst = NULL;
64 }
65}
static struct GNUNET_GNSRECORD_Data rd[50]
The record data under a single label.
#define GNUNET_free(ptr)
Wrapper around free.

References GNUNET_PQ_ResultSpec::cls, GNUNET_PQ_ResultSpec::dst, GNUNET_free, and rd.

Referenced by GNUNET_PQ_result_spec_variable_size().

Here is the caller graph for this function:

◆ extract_varsize_blob()

static enum GNUNET_GenericReturnValue extract_varsize_blob ( void *  cls,
PGresult *  result,
int  row,
const char *  fname,
size_t *  dst_size,
void *  dst 
)
static

Extract data from a Postgres database result at row row.

Parameters
clsclosure
resultwhere to extract data from
rowrow to extract data from
fnamename (or prefix) of the fields to extract from
[in,out]dst_sizewhere to store size of result, may be NULL
[out]dstwhere to store the result
Returns
GNUNET_YES if all results could be extracted GNUNET_SYSERR if a result was invalid (non-existing field)

Definition at line 82 of file pq_result_helper.c.

88{
89 size_t len;
90 const char *res;
91 void *idst;
92 int fnum;
93
94 (void) cls;
95 *dst_size = 0;
96 *((void **) dst) = NULL;
97
98 fnum = PQfnumber (result,
99 fname);
100 if (fnum < 0)
101 {
102 GNUNET_break (0);
103 return GNUNET_SYSERR;
104 }
105 if (PQgetisnull (result,
106 row,
107 fnum))
108 return GNUNET_NO;
109 /* if a field is null, continue but
110 * remember that we now return a different result */
111 len = PQgetlength (result,
112 row,
113 fnum);
114 res = PQgetvalue (result,
115 row,
116 fnum);
117 GNUNET_assert (NULL != res);
118 *dst_size = len;
119 idst = GNUNET_malloc (len);
120 *((void **) dst) = idst;
121 GNUNET_memcpy (idst,
122 res,
123 len);
124 return GNUNET_OK;
125}
static char * res
Currently read line or NULL on EOF.
static int result
Global testing status.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
@ GNUNET_OK
@ GNUNET_NO
@ GNUNET_SYSERR
#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.
#define GNUNET_malloc(size)
Wrapper around malloc.

References GNUNET_PQ_ResultSpec::cls, GNUNET_PQ_ResultSpec::dst, GNUNET_PQ_ResultSpec::dst_size, GNUNET_PQ_ResultSpec::fname, GNUNET_assert, GNUNET_break, GNUNET_malloc, GNUNET_memcpy, GNUNET_NO, GNUNET_OK, GNUNET_SYSERR, res, and result.

Referenced by GNUNET_PQ_result_spec_variable_size().

Here is the caller graph for this function:

◆ GNUNET_PQ_result_spec_variable_size()

struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_variable_size ( const char *  name,
void **  dst,
size_t *  sptr 
)

Variable-size result expected.

Parameters
namename of the field in the table
[out]dstwhere to store the result, allocated
[out]sptrwhere to store the size of dst
Returns
array entry for the result specification to use

Definition at line 129 of file pq_result_helper.c.

132{
133 struct GNUNET_PQ_ResultSpec res = {
135 .cleaner = &clean_varsize_blob,
136 .dst = (void *) (dst),
137 .fname = name,
138 .result_size = sptr
139 };
140
141 return res;
142}
static char * name
Name (label) of the records to list.
static enum GNUNET_GenericReturnValue extract_varsize_blob(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.
static void clean_varsize_blob(void *cls, void *rd)
Function called to clean up memory allocated by a GNUNET_PQ_ResultConverter.
void * dst
Destination for the data.
GNUNET_PQ_ResultConverter conv
What is the format of the result?

References clean_varsize_blob(), GNUNET_PQ_ResultSpec::conv, GNUNET_PQ_ResultSpec::dst, extract_varsize_blob(), name, and res.

Referenced by extract_result_cb(), handle_results(), namecache_postgres_lookup_block(), parse_result_call_iterator(), and process_result().

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

◆ extract_fixed_blob()

static enum GNUNET_GenericReturnValue extract_fixed_blob ( void *  cls,
PGresult *  result,
int  row,
const char *  fname,
size_t *  dst_size,
void *  dst 
)
static

Extract data from a Postgres database result at row row.

Parameters
clsclosure
resultwhere to extract data from
rowrow to extract data from
fnamename (or prefix) of the fields to extract from
[in]dst_sizedesired size, never NULL
[out]dstwhere to store the result
Returns
GNUNET_YES if all results could be extracted GNUNET_SYSERR if a result was invalid (non-existing field or NULL)

Definition at line 159 of file pq_result_helper.c.

165{
166 size_t len;
167 const char *res;
168 int fnum;
169
170 (void) cls;
171 fnum = PQfnumber (result,
172 fname);
173 if (fnum < 0)
174 {
175 GNUNET_break (0);
177 "Result does not have field %s\n",
178 fname);
179 return GNUNET_SYSERR;
180 }
181 if (PQgetisnull (result,
182 row,
183 fnum))
184 return GNUNET_NO;
185 /* if a field is null, continue but
186 * remember that we now return a different result */
187 len = PQgetlength (result,
188 row,
189 fnum);
190 if (*dst_size != len)
191 {
193 "Expected %u bytes for field `%s', got %u\n",
194 (unsigned int) *dst_size,
195 fname,
196 (unsigned int) len);
197 GNUNET_break (0);
198 return GNUNET_SYSERR;
199 }
200 res = PQgetvalue (result,
201 row,
202 fnum);
203 GNUNET_assert (NULL != res);
204 GNUNET_memcpy (dst,
205 res,
206 len);
207 return GNUNET_OK;
208}
#define GNUNET_log(kind,...)
@ GNUNET_ERROR_TYPE_ERROR

References GNUNET_PQ_ResultSpec::cls, GNUNET_PQ_ResultSpec::dst, GNUNET_PQ_ResultSpec::dst_size, GNUNET_PQ_ResultSpec::fname, GNUNET_assert, GNUNET_break, GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_memcpy, GNUNET_NO, GNUNET_OK, GNUNET_SYSERR, res, and result.

Referenced by GNUNET_PQ_result_spec_fixed_size().

Here is the caller graph for this function:

◆ GNUNET_PQ_result_spec_fixed_size()

struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_fixed_size ( const char *  name,
void *  dst,
size_t  dst_size 
)

Fixed-size result expected.

Parameters
namename of the field in the table
[out]dstwhere to store the result
dst_sizenumber of bytes in dst
Returns
array entry for the result specification to use

Definition at line 212 of file pq_result_helper.c.

215{
216 struct GNUNET_PQ_ResultSpec res = {
218 .dst = (dst),
220 .fname = name
221 };
222
223 return res;
224}
static enum GNUNET_GenericReturnValue extract_fixed_blob(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.
const char * fname
Field name of the desired result.
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...

References GNUNET_PQ_ResultSpec::conv, GNUNET_PQ_ResultSpec::dst, GNUNET_PQ_ResultSpec::dst_size, extract_fixed_blob(), GNUNET_PQ_ResultSpec::fname, name, and res.

Here is the call graph for this function:

◆ extract_rsa_public_key()

static enum GNUNET_GenericReturnValue extract_rsa_public_key ( void *  cls,
PGresult *  result,
int  row,
const char *  fname,
size_t *  dst_size,
void *  dst 
)
static

Extract data from a Postgres database result at row row.

Parameters
clsclosure
resultwhere to extract data from
rowrow to extract data from
fnamename (or prefix) of the fields to extract from
[in,out]dst_sizewhere to store size of result, may be NULL
[out]dstwhere to store the result
Returns
GNUNET_YES if all results could be extracted GNUNET_SYSERR if a result was invalid (non-existing field or NULL)

Definition at line 241 of file pq_result_helper.c.

247{
248 struct GNUNET_CRYPTO_RsaPublicKey **pk = dst;
249 size_t len;
250 const char *res;
251 int fnum;
252
253 (void) cls;
254 (void) dst_size;
255 *pk = NULL;
256 fnum = PQfnumber (result,
257 fname);
258 if (fnum < 0)
259 {
260 GNUNET_break (0);
261 return GNUNET_SYSERR;
262 }
263 if (PQgetisnull (result,
264 row,
265 fnum))
266 return GNUNET_NO;
267
268 /* if a field is null, continue but
269 * remember that we now return a different result */
270 len = PQgetlength (result,
271 row,
272 fnum);
273 res = PQgetvalue (result,
274 row,
275 fnum);
277 len);
278 if (NULL == *pk)
279 {
280 GNUNET_break (0);
281 return GNUNET_SYSERR;
282 }
283 return GNUNET_OK;
284}
struct GNUNET_CRYPTO_BlindablePrivateKey pk
Private key from command line option, or NULL.
struct GNUNET_CRYPTO_RsaPublicKey * GNUNET_CRYPTO_rsa_public_key_decode(const char *buf, size_t len)
Decode the public key from the data-format back to the "normal", internal format.
Definition crypto_rsa.c:423
The public information of an RSA key pair.
Definition crypto_rsa.c:53

References GNUNET_break, GNUNET_CRYPTO_rsa_public_key_decode(), GNUNET_NO, GNUNET_OK, GNUNET_SYSERR, pk, res, and result.

Referenced by GNUNET_PQ_result_spec_rsa_public_key().

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

◆ clean_rsa_public_key()

static void clean_rsa_public_key ( void *  cls,
void *  rd 
)
static

Function called to clean up memory allocated by a GNUNET_PQ_ResultConverter.

Parameters
clsclosure
rdresult data to clean up

Definition at line 295 of file pq_result_helper.c.

297{
299
300 (void) cls;
301 if (NULL != *pk)
302 {
304 *pk = NULL;
305 }
306}
void GNUNET_CRYPTO_rsa_public_key_free(struct GNUNET_CRYPTO_RsaPublicKey *key)
Free memory occupied by the public key.
Definition crypto_rsa.c:268

References GNUNET_CRYPTO_rsa_public_key_free(), pk, and rd.

Referenced by GNUNET_PQ_result_spec_rsa_public_key().

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

◆ GNUNET_PQ_result_spec_rsa_public_key()

struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_rsa_public_key ( const char *  name,
struct GNUNET_CRYPTO_RsaPublicKey **  rsa 
)

RSA public key expected.

Parameters
namename of the field in the table
[out]rsawhere to store the result
Returns
array entry for the result specification to use

Definition at line 310 of file pq_result_helper.c.

312{
313 struct GNUNET_PQ_ResultSpec res = {
315 .cleaner = &clean_rsa_public_key,
316 .dst = (void *) rsa,
317 .fname = name
318 };
319
320 return res;
321}
static void clean_rsa_public_key(void *cls, void *rd)
Function called to clean up memory allocated by a GNUNET_PQ_ResultConverter.
static enum GNUNET_GenericReturnValue extract_rsa_public_key(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.

References clean_rsa_public_key(), GNUNET_PQ_ResultSpec::conv, extract_rsa_public_key(), GNUNET_PQ_ResultSpec::fname, name, and res.

Here is the call graph for this function:

◆ extract_rsa_signature()

static enum GNUNET_GenericReturnValue extract_rsa_signature ( void *  cls,
PGresult *  result,
int  row,
const char *  fname,
size_t *  dst_size,
void *  dst 
)
static

Extract data from a Postgres database result at row row.

Parameters
clsclosure
resultwhere to extract data from
rowrow to extract data from
fnamename (or prefix) of the fields to extract from
[in,out]dst_sizewhere to store size of result, may be NULL
[out]dstwhere to store the result
Returns
GNUNET_YES if all results could be extracted GNUNET_SYSERR if a result was invalid (non-existing field or NULL)

Definition at line 338 of file pq_result_helper.c.

344{
345 struct GNUNET_CRYPTO_RsaSignature **sig = dst;
346 size_t len;
347 const void *res;
348 int fnum;
349
350 (void) cls;
351 (void) dst_size;
352 *sig = NULL;
353 fnum = PQfnumber (result,
354 fname);
355 if (fnum < 0)
356 {
357 GNUNET_break (0);
358 return GNUNET_SYSERR;
359 }
360 if (PQgetisnull (result,
361 row,
362 fnum))
363 return GNUNET_NO;
364 /* if a field is null, continue but
365 * remember that we now return a different result */
366 len = PQgetlength (result,
367 row,
368 fnum);
369 res = PQgetvalue (result,
370 row,
371 fnum);
373 len);
374 if (NULL == *sig)
375 {
376 GNUNET_break (0);
377 return GNUNET_SYSERR;
378 }
379 return GNUNET_OK;
380}
struct GNUNET_CRYPTO_RsaSignature * GNUNET_CRYPTO_rsa_signature_decode(const void *buf, size_t buf_size)
Decode the signature from the data-format back to the "normal", internal format.

References GNUNET_break, GNUNET_CRYPTO_rsa_signature_decode(), GNUNET_NO, GNUNET_OK, GNUNET_SYSERR, res, and result.

Referenced by GNUNET_PQ_result_spec_rsa_signature().

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

◆ clean_rsa_signature()

static void clean_rsa_signature ( void *  cls,
void *  rd 
)
static

Function called to clean up memory allocated by a GNUNET_PQ_ResultConverter.

Parameters
clsclosure
rdresult data to clean up

Definition at line 391 of file pq_result_helper.c.

393{
394 struct GNUNET_CRYPTO_RsaSignature **sig = rd;
395
396 (void) cls;
397 if (NULL != *sig)
398 {
400 *sig = NULL;
401 }
402}
void GNUNET_CRYPTO_rsa_signature_free(struct GNUNET_CRYPTO_RsaSignature *sig)
Free memory occupied by signature.

References GNUNET_CRYPTO_rsa_signature_free(), and rd.

Referenced by GNUNET_PQ_result_spec_rsa_signature().

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

◆ GNUNET_PQ_result_spec_rsa_signature()

struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_rsa_signature ( const char *  name,
struct GNUNET_CRYPTO_RsaSignature **  sig 
)

RSA signature expected.

Parameters
namename of the field in the table
[out]sigwhere to store the result;
Returns
array entry for the result specification to use

Definition at line 406 of file pq_result_helper.c.

408{
409 struct GNUNET_PQ_ResultSpec res = {
411 .cleaner = &clean_rsa_signature,
412 .dst = (void *) sig,
413 .fname = name
414 };
415
416 return res;
417}
static enum GNUNET_GenericReturnValue extract_rsa_signature(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.
static void clean_rsa_signature(void *cls, void *rd)
Function called to clean up memory allocated by a GNUNET_PQ_ResultConverter.

References clean_rsa_signature(), GNUNET_PQ_ResultSpec::conv, extract_rsa_signature(), GNUNET_PQ_ResultSpec::fname, name, and res.

Here is the call graph for this function:

◆ extract_string()

static enum GNUNET_GenericReturnValue extract_string ( void *  cls,
PGresult *  result,
int  row,
const char *  fname,
size_t *  dst_size,
void *  dst 
)
static

Extract data from a Postgres database result at row row.

Parameters
clsclosure
resultwhere to extract data from
rowrow to extract data from
fnamename (or prefix) of the fields to extract from
[in,out]dst_sizewhere to store size of result, may be NULL
[out]dstwhere to store the result
Returns
GNUNET_YES if all results could be extracted GNUNET_SYSERR if a result was invalid (non-existing field or NULL)

Definition at line 434 of file pq_result_helper.c.

440{
441 char **str = dst;
442 size_t len;
443 const char *res;
444 int fnum;
445
446 (void) cls;
447 (void) dst_size;
448 *str = NULL;
449 fnum = PQfnumber (result,
450 fname);
451 if (fnum < 0)
452 {
453 GNUNET_break (0);
454 return GNUNET_SYSERR;
455 }
456 if (PQgetisnull (result,
457 row,
458 fnum))
459 return GNUNET_NO;
460 /* if a field is null, continue but
461 * remember that we now return a different result */
462 len = PQgetlength (result,
463 row,
464 fnum);
465 res = PQgetvalue (result,
466 row,
467 fnum);
469 len);
470 if (NULL == *str)
471 {
472 GNUNET_break (0);
473 return GNUNET_SYSERR;
474 }
475 return GNUNET_OK;
476}
#define GNUNET_strndup(a, length)
Wrapper around GNUNET_xstrndup_.
const char * str
Definition time.c:1252

References GNUNET_PQ_ResultSpec::cls, GNUNET_PQ_ResultSpec::dst, GNUNET_PQ_ResultSpec::dst_size, GNUNET_PQ_ResultSpec::fname, GNUNET_break, GNUNET_NO, GNUNET_OK, GNUNET_strndup, GNUNET_SYSERR, res, result, and str.

Referenced by GNUNET_PQ_result_spec_string().

Here is the caller graph for this function:

◆ clean_string()

static void clean_string ( void *  cls,
void *  rd 
)
static

Function called to clean up memory allocated by a GNUNET_PQ_ResultConverter.

Parameters
clsclosure
rdresult data to clean up

Definition at line 487 of file pq_result_helper.c.

489{
490 char **str = rd;
491
492 (void) cls;
493 if (NULL != *str)
494 {
495 GNUNET_free (*str);
496 *str = NULL;
497 }
498}

References GNUNET_PQ_ResultSpec::cls, GNUNET_free, rd, and str.

Referenced by GNUNET_PQ_result_spec_string().

Here is the caller graph for this function:

◆ GNUNET_PQ_result_spec_string()

struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_string ( const char *  name,
char **  dst 
)

0-terminated string expected.

Parameters
namename of the field in the table
[out]dstwhere to store the result, allocated
Returns
array entry for the result specification to use

Definition at line 502 of file pq_result_helper.c.

504{
505 struct GNUNET_PQ_ResultSpec res = {
507 .cleaner = &clean_string,
508 .dst = (void *) dst,
509 .fname = (name)
510 };
511
512 return res;
513}
static enum GNUNET_GenericReturnValue extract_string(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.
static void clean_string(void *cls, void *rd)
Function called to clean up memory allocated by a GNUNET_PQ_ResultConverter.

References clean_string(), GNUNET_PQ_ResultSpec::conv, GNUNET_PQ_ResultSpec::dst, extract_string(), GNUNET_PQ_ResultSpec::fname, name, and res.

Referenced by check_patch_applied(), and parse_result_call_iterator().

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

◆ extract_bool()

static enum GNUNET_GenericReturnValue extract_bool ( void *  cls,
PGresult *  result,
int  row,
const char *  fname,
size_t *  dst_size,
void *  dst 
)
static

Extract data from a Postgres database result at row row.

Parameters
clsclosure
resultwhere to extract data from
rowrow to extract data from
fnamename (or prefix) of the fields to extract from
[in,out]dst_sizewhere to store size of result, may be NULL
[out]dstwhere to store the result
Returns
GNUNET_YES if all results could be extracted GNUNET_SYSERR if a result was invalid (non-existing field or NULL)

Definition at line 530 of file pq_result_helper.c.

536{
537 bool *b = dst;
538 const uint8_t *res;
539 int fnum;
540 size_t len;
541
542 (void) cls;
543 (void) dst_size;
544 fnum = PQfnumber (result,
545 fname);
546 if (fnum < 0)
547 {
548 GNUNET_break (0);
549 return GNUNET_SYSERR;
550 }
551 if (PQgetisnull (result,
552 row,
553 fnum))
554 return GNUNET_NO;
555 /* if a field is null, continue but
556 * remember that we now return a different result */
557 len = PQgetlength (result,
558 row,
559 fnum);
560 if (sizeof (uint8_t) != len)
561 {
562 GNUNET_break (0);
563 return GNUNET_SYSERR;
564 }
565 res = (const uint8_t *) PQgetvalue (result,
566 row,
567 fnum);
568 *b = (0 != *res);
569 return GNUNET_OK;
570}

References GNUNET_PQ_ResultSpec::cls, GNUNET_PQ_ResultSpec::dst, GNUNET_PQ_ResultSpec::dst_size, GNUNET_PQ_ResultSpec::fname, GNUNET_break, GNUNET_NO, GNUNET_OK, GNUNET_SYSERR, res, and result.

Referenced by GNUNET_PQ_result_spec_bool().

Here is the caller graph for this function:

◆ GNUNET_PQ_result_spec_bool()

struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_bool ( const char *  name,
bool *  dst 
)

boolean expected.

Parameters
namename of the field in the table
[out]dstwhere to store the result
Returns
array entry for the result specification to use

Definition at line 574 of file pq_result_helper.c.

576{
577 struct GNUNET_PQ_ResultSpec res = {
578 .conv = &extract_bool,
579 .dst = (void *) dst,
580 .fname = name
581 };
582
583 return res;
584}
static enum GNUNET_GenericReturnValue extract_bool(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.

References GNUNET_PQ_ResultSpec::conv, GNUNET_PQ_ResultSpec::dst, extract_bool(), GNUNET_PQ_ResultSpec::fname, name, and res.

Here is the call graph for this function:

◆ extract_rel_time()

static enum GNUNET_GenericReturnValue extract_rel_time ( void *  cls,
PGresult *  result,
int  row,
const char *  fname,
size_t *  dst_size,
void *  dst 
)
static

Extract data from a Postgres database result at row row.

Parameters
clsclosure
resultwhere to extract data from
rowrow to extract data from
fnamename (or prefix) of the fields to extract from
[in,out]dst_sizewhere to store size of result, may be NULL
[out]dstwhere to store the result
Returns
GNUNET_YES if all results could be extracted GNUNET_SYSERR if a result was invalid (non-existing field or NULL)

Definition at line 601 of file pq_result_helper.c.

607{
608 struct GNUNET_TIME_Relative *udst = dst;
609 const int64_t *res;
610 int fnum;
611
612 (void) cls;
613 fnum = PQfnumber (result,
614 fname);
615 if (fnum < 0)
616 {
617 GNUNET_break (0);
618 return GNUNET_SYSERR;
619 }
620 if (PQgetisnull (result,
621 row,
622 fnum))
623 return GNUNET_NO;
624 GNUNET_assert (NULL != dst);
625 if (sizeof(struct GNUNET_TIME_Relative) != *dst_size)
626 {
627 GNUNET_break (0);
628 return GNUNET_SYSERR;
629 }
630 if (sizeof(int64_t) !=
631 PQgetlength (result,
632 row,
633 fnum))
634 {
635 GNUNET_break (0);
636 return GNUNET_SYSERR;
637 }
638 res = (int64_t *) PQgetvalue (result,
639 row,
640 fnum);
641 if (INT64_MAX == GNUNET_ntohll ((uint64_t) *res))
643 else
644 udst->rel_value_us = GNUNET_ntohll ((uint64_t) *res);
645 return GNUNET_OK;
646}
uint64_t GNUNET_ntohll(uint64_t n)
Convert unsigned 64-bit integer to host byte order.
#define GNUNET_TIME_UNIT_FOREVER_REL
Constant used to specify "forever".
Time for relative time used by GNUnet, in microseconds.
uint64_t rel_value_us
The actual value.

References GNUNET_assert, GNUNET_break, GNUNET_NO, GNUNET_ntohll(), GNUNET_OK, GNUNET_SYSERR, GNUNET_TIME_UNIT_FOREVER_REL, GNUNET_TIME_Relative::rel_value_us, res, and result.

Referenced by GNUNET_PQ_result_spec_relative_time().

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

◆ GNUNET_PQ_result_spec_relative_time()

struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_relative_time ( const char *  name,
struct GNUNET_TIME_Relative rt 
)

Relative time expected.

Parameters
namename of the field in the table
[out]rtwhere to store the result
Returns
array entry for the result specification to use

Definition at line 650 of file pq_result_helper.c.

652{
653 struct GNUNET_PQ_ResultSpec res = {
655 .dst = (void *) rt,
656 .dst_size = sizeof(*rt),
657 .fname = name
658 };
659
660 return res;
661}
static enum GNUNET_GenericReturnValue extract_rel_time(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.

References GNUNET_PQ_ResultSpec::conv, GNUNET_PQ_ResultSpec::dst_size, extract_rel_time(), name, and res.

Here is the call graph for this function:

◆ extract_abs_time()

static enum GNUNET_GenericReturnValue extract_abs_time ( void *  cls,
PGresult *  result,
int  row,
const char *  fname,
size_t *  dst_size,
void *  dst 
)
static

Extract data from a Postgres database result at row row.

Parameters
clsclosure
resultwhere to extract data from
rowrow to extract data from
fnamename (or prefix) of the fields to extract from
[in,out]dst_sizewhere to store size of result, may be NULL
[out]dstwhere to store the result
Returns
GNUNET_YES if all results could be extracted GNUNET_SYSERR if a result was invalid (non-existing field or NULL)

Definition at line 678 of file pq_result_helper.c.

684{
685 struct GNUNET_TIME_Absolute *udst = dst;
686 const int64_t *res;
687 int fnum;
688
689 (void) cls;
690 fnum = PQfnumber (result,
691 fname);
692 if (fnum < 0)
693 {
694 GNUNET_break (0);
695 return GNUNET_SYSERR;
696 }
697 if (PQgetisnull (result,
698 row,
699 fnum))
700 return GNUNET_NO;
701 GNUNET_assert (NULL != dst);
702 if (sizeof(struct GNUNET_TIME_Absolute) != *dst_size)
703 {
704 GNUNET_break (0);
705 return GNUNET_SYSERR;
706 }
707 if (sizeof(int64_t) !=
708 PQgetlength (result,
709 row,
710 fnum))
711 {
712 GNUNET_break (0);
713 return GNUNET_SYSERR;
714 }
715 res = (int64_t *) PQgetvalue (result,
716 row,
717 fnum);
718 if (INT64_MAX == GNUNET_ntohll ((uint64_t) *res))
720 else
721 udst->abs_value_us = GNUNET_ntohll ((uint64_t) *res);
722 return GNUNET_OK;
723}
#define GNUNET_TIME_UNIT_FOREVER_ABS
Constant used to specify "forever".
Time for absolute times used by GNUnet, in microseconds.
uint64_t abs_value_us
The actual value.

References GNUNET_TIME_Absolute::abs_value_us, GNUNET_assert, GNUNET_break, GNUNET_NO, GNUNET_ntohll(), GNUNET_OK, GNUNET_SYSERR, GNUNET_TIME_UNIT_FOREVER_ABS, res, and result.

Referenced by GNUNET_PQ_result_spec_absolute_time().

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

◆ GNUNET_PQ_result_spec_absolute_time()

struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_absolute_time ( const char *  name,
struct GNUNET_TIME_Absolute at 
)

Absolute time expected.

Parameters
namename of the field in the table
[out]atwhere to store the result
Returns
array entry for the result specification to use

Definition at line 727 of file pq_result_helper.c.

729{
730 struct GNUNET_PQ_ResultSpec res = {
732 .dst = (void *) at,
733 .dst_size = sizeof(*at),
734 .fname = name
735 };
736
737 return res;
738}
static enum GNUNET_GenericReturnValue extract_abs_time(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.

References GNUNET_PQ_ResultSpec::conv, GNUNET_PQ_ResultSpec::dst_size, extract_abs_time(), name, and res.

Referenced by extract_result_cb(), handle_results(), and process_result().

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

◆ GNUNET_PQ_result_spec_absolute_time_nbo()

struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_absolute_time_nbo ( const char *  name,
struct GNUNET_TIME_AbsoluteNBO at 
)

Absolute time expected.

Parameters
namename of the field in the table
[out]atwhere to store the result
Returns
array entry for the result specification to use

Definition at line 742 of file pq_result_helper.c.

744{
747 &at->abs_value_us__);
748
749 return res;
750}
#define GNUNET_PQ_result_spec_auto_from_type(name, dst)
We expect a fixed-size result, with size determined by the type of * dst
uint64_t abs_value_us__
The actual value (in network byte order).

References GNUNET_PQ_result_spec_auto_from_type, name, and res.

◆ extract_timestamp()

static enum GNUNET_GenericReturnValue extract_timestamp ( void *  cls,
PGresult *  result,
int  row,
const char *  fname,
size_t *  dst_size,
void *  dst 
)
static

Extract data from a Postgres database result at row row.

Parameters
clsclosure
resultwhere to extract data from
rowrow to extract data from
fnamename (or prefix) of the fields to extract from
[in,out]dst_sizewhere to store size of result, may be NULL
[out]dstwhere to store the result
Returns
GNUNET_YES if all results could be extracted GNUNET_SYSERR if a result was invalid (non-existing field or NULL)

Definition at line 767 of file pq_result_helper.c.

773{
774 struct GNUNET_TIME_Timestamp *udst = dst;
775 struct GNUNET_TIME_Absolute abs;
776 const int64_t *res;
777 int fnum;
778
779 (void) cls;
780 fnum = PQfnumber (result,
781 fname);
782 if (fnum < 0)
783 {
784 GNUNET_break (0);
785 return GNUNET_SYSERR;
786 }
787 if (PQgetisnull (result,
788 row,
789 fnum))
790 return GNUNET_NO;
791 GNUNET_assert (NULL != dst);
792 if (sizeof(struct GNUNET_TIME_Absolute) != *dst_size)
793 {
794 GNUNET_break (0);
795 return GNUNET_SYSERR;
796 }
797 if (sizeof(int64_t) !=
798 PQgetlength (result,
799 row,
800 fnum))
801 {
802 GNUNET_break (0);
803 return GNUNET_SYSERR;
804 }
805 res = (int64_t *) PQgetvalue (result,
806 row,
807 fnum);
808 if (INT64_MAX == GNUNET_ntohll ((uint64_t) *res))
809 {
811 }
812 else
813 {
814 abs.abs_value_us = GNUNET_ntohll ((uint64_t) *res);
815 if (0 != abs.abs_value_us % GNUNET_TIME_UNIT_SECONDS.rel_value_us)
816 {
817 /* timestamps must be multiple of seconds! */
818 GNUNET_break (0);
819 return GNUNET_SYSERR;
820 }
821 }
822 udst->abs_time = abs;
823 return GNUNET_OK;
824}
#define GNUNET_TIME_UNIT_SECONDS
One second.
Time for timestamps used by GNUnet, in microseconds rounded to seconds.
struct GNUNET_TIME_Absolute abs_time
The actual value.

References GNUNET_TIME_Timestamp::abs_time, GNUNET_TIME_Absolute::abs_value_us, GNUNET_assert, GNUNET_break, GNUNET_NO, GNUNET_ntohll(), GNUNET_OK, GNUNET_SYSERR, GNUNET_TIME_UNIT_FOREVER_ABS, GNUNET_TIME_UNIT_SECONDS, res, and result.

Referenced by extract_timestamp_nbo(), and GNUNET_PQ_result_spec_timestamp().

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

◆ GNUNET_PQ_result_spec_timestamp()

struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_timestamp ( const char *  name,
struct GNUNET_TIME_Timestamp t 
)

Timestamp expected.

Parameters
namename of the field in the table
[out]twhere to store the result
Returns
array entry for the result specification to use

Definition at line 828 of file pq_result_helper.c.

830{
831 struct GNUNET_PQ_ResultSpec res = {
833 .dst = (void *) at,
834 .dst_size = sizeof(*at),
835 .fname = name
836 };
837
838 return res;
839}
static enum GNUNET_GenericReturnValue extract_timestamp(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.

References GNUNET_PQ_ResultSpec::conv, GNUNET_PQ_ResultSpec::dst_size, extract_timestamp(), name, and res.

Here is the call graph for this function:

◆ extract_timestamp_nbo()

static enum GNUNET_GenericReturnValue extract_timestamp_nbo ( void *  cls,
PGresult *  result,
int  row,
const char *  fname,
size_t *  dst_size,
void *  dst 
)
static

Extract data from a Postgres database result at row row.

Parameters
clsclosure
resultwhere to extract data from
rowrow to extract data from
fnamename (or prefix) of the fields to extract from
[in,out]dst_sizewhere to store size of result, may be NULL
[out]dstwhere to store the result
Returns
GNUNET_YES if all results could be extracted GNUNET_SYSERR if a result was invalid (non-existing field or NULL)

Definition at line 856 of file pq_result_helper.c.

862{
863 struct GNUNET_TIME_TimestampNBO *udst = dst;
866
867 (void) cls;
868 r = extract_timestamp (NULL,
869 result,
870 row,
871 fname,
872 dst_size,
873 &t);
874 if (GNUNET_OK != r)
875 return r;
877 return r;
878}
static struct GNUNET_SCHEDULER_Task * t
Main task.
GNUNET_GenericReturnValue
Named constants for return values.
struct GNUNET_TIME_TimestampNBO GNUNET_TIME_timestamp_hton(struct GNUNET_TIME_Timestamp t)
Convert timestamp to network byte order.
Definition time.c:91
Time for timestamps used by GNUnet, in seconds and in network byte order.

References extract_timestamp(), GNUNET_OK, GNUNET_TIME_timestamp_hton(), result, and t.

Referenced by GNUNET_PQ_result_spec_timestamp_nbo().

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

◆ GNUNET_PQ_result_spec_timestamp_nbo()

struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_timestamp_nbo ( const char *  name,
struct GNUNET_TIME_TimestampNBO tn 
)

Timestamp expected.

Parameters
namename of the field in the table
[out]tnwhere to store the result
Returns
array entry for the result specification to use

Definition at line 882 of file pq_result_helper.c.

884{
885 struct GNUNET_PQ_ResultSpec res = {
887 .dst = (void *) at,
888 .dst_size = sizeof(*at),
889 .fname = name
890 };
891
892 return res;
893}
static enum GNUNET_GenericReturnValue extract_timestamp_nbo(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.

References GNUNET_PQ_ResultSpec::conv, GNUNET_PQ_ResultSpec::dst_size, extract_timestamp_nbo(), name, and res.

Here is the call graph for this function:

◆ extract_uint16()

static enum GNUNET_GenericReturnValue extract_uint16 ( void *  cls,
PGresult *  result,
int  row,
const char *  fname,
size_t *  dst_size,
void *  dst 
)
static

Extract data from a Postgres database result at row row.

Parameters
clsclosure
resultwhere to extract data from
rowrow to extract data from
fnamename (or prefix) of the fields to extract from
[in,out]dst_sizewhere to store size of result, may be NULL
[out]dstwhere to store the result
Returns
GNUNET_YES if all results could be extracted GNUNET_SYSERR if a result was invalid (non-existing field or NULL)

Definition at line 910 of file pq_result_helper.c.

916{
917 uint16_t *udst = dst;
918 const uint16_t *res;
919 int fnum;
920
921 (void) cls;
922 fnum = PQfnumber (result,
923 fname);
924 if (fnum < 0)
925 {
926 GNUNET_break (0);
927 return GNUNET_SYSERR;
928 }
929 if (PQgetisnull (result,
930 row,
931 fnum))
932 return GNUNET_NO;
933 GNUNET_assert (NULL != dst);
934 if (sizeof(uint16_t) != *dst_size)
935 {
936 GNUNET_break (0);
937 return GNUNET_SYSERR;
938 }
939 if (sizeof(uint16_t) !=
940 PQgetlength (result,
941 row,
942 fnum))
943 {
944 GNUNET_break (0);
945 return GNUNET_SYSERR;
946 }
947 res = (uint16_t *) PQgetvalue (result,
948 row,
949 fnum);
950 *udst = ntohs (*res);
951 return GNUNET_OK;
952}

References GNUNET_PQ_ResultSpec::cls, GNUNET_PQ_ResultSpec::dst, GNUNET_PQ_ResultSpec::dst_size, GNUNET_PQ_ResultSpec::fname, GNUNET_assert, GNUNET_break, GNUNET_NO, GNUNET_OK, GNUNET_SYSERR, res, and result.

Referenced by GNUNET_PQ_result_spec_uint16().

Here is the caller graph for this function:

◆ GNUNET_PQ_result_spec_uint16()

struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_uint16 ( const char *  name,
uint16_t *  u16 
)

uint16_t expected.

Parameters
namename of the field in the table
[out]u16where to store the result
Returns
array entry for the result specification to use

Definition at line 956 of file pq_result_helper.c.

958{
959 struct GNUNET_PQ_ResultSpec res = {
961 .dst = (void *) u16,
962 .dst_size = sizeof(*u16),
963 .fname = name
964 };
965
966 return res;
967}
static enum GNUNET_GenericReturnValue extract_uint16(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.

References GNUNET_PQ_ResultSpec::conv, GNUNET_PQ_ResultSpec::dst_size, extract_uint16(), name, and res.

Here is the call graph for this function:

◆ extract_uint32()

static enum GNUNET_GenericReturnValue extract_uint32 ( void *  cls,
PGresult *  result,
int  row,
const char *  fname,
size_t *  dst_size,
void *  dst 
)
static

Extract data from a Postgres database result at row row.

Parameters
clsclosure
resultwhere to extract data from
rowrow to extract data from
fnamename (or prefix) of the fields to extract from
[in,out]dst_sizewhere to store size of result, may be NULL
[out]dstwhere to store the result
Returns
GNUNET_YES if all results could be extracted GNUNET_SYSERR if a result was invalid (non-existing field or NULL)

Definition at line 984 of file pq_result_helper.c.

990{
991 uint32_t *udst = dst;
992 const uint32_t *res;
993 int fnum;
994
995 (void) cls;
996 fnum = PQfnumber (result,
997 fname);
998 if (fnum < 0)
999 {
1000 GNUNET_break (0);
1001 return GNUNET_SYSERR;
1002 }
1003 if (PQgetisnull (result,
1004 row,
1005 fnum))
1006 return GNUNET_NO;
1007 GNUNET_assert (NULL != dst);
1008 if (sizeof(uint32_t) != *dst_size)
1009 {
1010 GNUNET_break (0);
1011 return GNUNET_SYSERR;
1012 }
1013 if (sizeof(uint32_t) !=
1014 PQgetlength (result,
1015 row,
1016 fnum))
1017 {
1018 GNUNET_break (0);
1019 return GNUNET_SYSERR;
1020 }
1021 res = (uint32_t *) PQgetvalue (result,
1022 row,
1023 fnum);
1024 *udst = ntohl (*res);
1025 return GNUNET_OK;
1026}

References GNUNET_PQ_ResultSpec::cls, GNUNET_PQ_ResultSpec::dst, GNUNET_PQ_ResultSpec::dst_size, GNUNET_PQ_ResultSpec::fname, GNUNET_assert, GNUNET_break, GNUNET_NO, GNUNET_OK, GNUNET_SYSERR, res, and result.

Referenced by GNUNET_PQ_result_spec_uint32().

Here is the caller graph for this function:

◆ GNUNET_PQ_result_spec_uint32()

struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_uint32 ( const char *  name,
uint32_t *  u32 
)

uint32_t expected.

Parameters
namename of the field in the table
[out]u32where to store the result
Returns
array entry for the result specification to use

Definition at line 1030 of file pq_result_helper.c.

1032{
1033 struct GNUNET_PQ_ResultSpec res = {
1034 .conv = &extract_uint32,
1035 .dst = (void *) u32,
1036 .dst_size = sizeof(*u32),
1037 .fname = name
1038 };
1039
1040 return res;
1041}
static enum GNUNET_GenericReturnValue extract_uint32(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.

References GNUNET_PQ_ResultSpec::conv, GNUNET_PQ_ResultSpec::dst_size, extract_uint32(), name, and res.

Referenced by extract_result_cb(), GNUNET_PQ_get_oid_by_name(), handle_results(), parse_result_call_iterator(), postgres_plugin_del(), and process_result().

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

◆ extract_uint64()

static enum GNUNET_GenericReturnValue extract_uint64 ( void *  cls,
PGresult *  result,
int  row,
const char *  fname,
size_t *  dst_size,
void *  dst 
)
static

Extract data from a Postgres database result at row row.

Parameters
clsclosure
resultwhere to extract data from
rowrow to extract data from
fnamename (or prefix) of the fields to extract from
[in,out]dst_sizewhere to store size of result, may be NULL
[out]dstwhere to store the result
Returns
GNUNET_YES if all results could be extracted GNUNET_SYSERR if a result was invalid (non-existing field or NULL)

Definition at line 1058 of file pq_result_helper.c.

1064{
1065 uint64_t *udst = dst;
1066 const uint64_t *res;
1067 int fnum;
1068
1069 (void) cls;
1070 fnum = PQfnumber (result,
1071 fname);
1072 if (fnum < 0)
1073 {
1075 "Field %s missing in result\n",
1076 fname);
1077 GNUNET_break (0);
1078 return GNUNET_SYSERR;
1079 }
1080 if (PQgetisnull (result,
1081 row,
1082 fnum))
1083 return GNUNET_NO;
1084
1085 GNUNET_assert (NULL != dst);
1086 if (sizeof(uint64_t) != *dst_size)
1087 {
1088 GNUNET_break (0);
1089 return GNUNET_SYSERR;
1090 }
1091 if (sizeof(uint64_t) !=
1092 PQgetlength (result,
1093 row,
1094 fnum))
1095 {
1096 GNUNET_break (0);
1098 "Got length %u for field `%s'\n",
1099 PQgetlength (result,
1100 row,
1101 fnum),
1102 fname);
1103 return GNUNET_SYSERR;
1104 }
1105 res = (uint64_t *) PQgetvalue (result,
1106 row,
1107 fnum);
1108 *udst = GNUNET_ntohll (*res);
1109 return GNUNET_OK;
1110}

References GNUNET_PQ_ResultSpec::cls, GNUNET_PQ_ResultSpec::dst, GNUNET_PQ_ResultSpec::dst_size, GNUNET_PQ_ResultSpec::fname, GNUNET_assert, GNUNET_break, GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_NO, GNUNET_ntohll(), GNUNET_OK, GNUNET_SYSERR, res, and result.

Referenced by GNUNET_PQ_result_spec_uint64().

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

◆ GNUNET_PQ_result_spec_uint64()

struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_uint64 ( const char *  name,
uint64_t *  u64 
)

uint64_t expected.

Parameters
namename of the field in the table
[out]u64where to store the result
Returns
array entry for the result specification to use

Definition at line 1114 of file pq_result_helper.c.

1116{
1117 struct GNUNET_PQ_ResultSpec res = {
1118 .conv = &extract_uint64,
1119 .dst = (void *) u64,
1120 .dst_size = sizeof(*u64),
1121 .fname = name
1122 };
1123
1124 return res;
1125}
static enum GNUNET_GenericReturnValue extract_uint64(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.

References GNUNET_PQ_ResultSpec::conv, GNUNET_PQ_ResultSpec::dst_size, extract_uint64(), name, and res.

Referenced by parse_result_call_iterator(), postgres_plugin_del(), postgres_plugin_estimate_size(), and process_result().

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

◆ extract_int64()

static enum GNUNET_GenericReturnValue extract_int64 ( void *  cls,
PGresult *  result,
int  row,
const char *  fname,
size_t *  dst_size,
void *  dst 
)
static

Extract data from a Postgres database result at row row.

Parameters
clsclosure
resultwhere to extract data from
rowrow to extract data from
fnamename (or prefix) of the fields to extract from
[in,out]dst_sizewhere to store size of result, may be NULL
[out]dstwhere to store the result
Returns
GNUNET_YES if all results could be extracted GNUNET_SYSERR if a result was invalid (non-existing field or NULL)

Definition at line 1142 of file pq_result_helper.c.

1148{
1149 int64_t *udst = dst;
1150 const int64_t *res;
1151 int fnum;
1152
1153 (void) cls;
1154 fnum = PQfnumber (result,
1155 fname);
1156 if (fnum < 0)
1157 {
1159 "Field %s missing in result\n",
1160 fname);
1161 GNUNET_break (0);
1162 return GNUNET_SYSERR;
1163 }
1164 if (PQgetisnull (result,
1165 row,
1166 fnum))
1167 return GNUNET_NO;
1168
1169 GNUNET_assert (NULL != dst);
1170 if (sizeof(int64_t) != *dst_size)
1171 {
1172 GNUNET_break (0);
1173 return GNUNET_SYSERR;
1174 }
1175 if (sizeof(int64_t) !=
1176 PQgetlength (result,
1177 row,
1178 fnum))
1179 {
1180 GNUNET_break (0);
1182 "Got length %u for field `%s'\n",
1183 PQgetlength (result,
1184 row,
1185 fnum),
1186 fname);
1187 return GNUNET_SYSERR;
1188 }
1189 res = (int64_t *) PQgetvalue (result,
1190 row,
1191 fnum);
1192 *udst = GNUNET_ntohll (*res);
1193 return GNUNET_OK;
1194}

References GNUNET_PQ_ResultSpec::cls, GNUNET_PQ_ResultSpec::dst, GNUNET_PQ_ResultSpec::dst_size, GNUNET_PQ_ResultSpec::fname, GNUNET_assert, GNUNET_break, GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_NO, GNUNET_ntohll(), GNUNET_OK, GNUNET_SYSERR, res, and result.

Referenced by GNUNET_PQ_result_spec_int64().

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

◆ GNUNET_PQ_result_spec_int64()

struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_int64 ( const char *  name,
int64_t *  i64 
)

int64_t expected.

Parameters
namename of the field in the table
[out]i64where to store the result
Returns
array entry for the result specification to use

Definition at line 1198 of file pq_result_helper.c.

1200{
1201 struct GNUNET_PQ_ResultSpec res = {
1202 .conv = &extract_int64,
1203 .dst = (void *) i64,
1204 .dst_size = sizeof(*i64),
1205 .fname = name
1206 };
1207
1208 return res;
1209}
static enum GNUNET_GenericReturnValue extract_int64(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.

References GNUNET_PQ_ResultSpec::conv, GNUNET_PQ_ResultSpec::dst_size, extract_int64(), name, and res.

Here is the call graph for this function:

◆ extract_array_generic()

static enum GNUNET_GenericReturnValue extract_array_generic ( void *  cls,
PGresult *  result,
int  row,
const char *  fname,
size_t *  dst_size,
void *  dst 
)
static

Extract data from a Postgres database result as array of a specific type from row row.

The type information and optionally additional out-parameters are given in cls which is of type array_result_cls.

Parameters
clsclosure of type array_result_cls
resultwhere to extract data from
rowrow to extract data from
fnamename (or prefix) of the fields to extract from
[in,out]dst_sizewhere to store size of result, may be NULL
[out]dstwhere to store the result
Returns
GNUNET_YES if all results could be extracted GNUNET_SYSERR if a result was invalid (non-existing field or NULL)

The sizes of the elements in the input. A NULL element will be indicated in the input by a size of -1. However, we will then use an element size of either 0 (for variable sized data) or info->same_size (for fixed sized data).

The amounts of bytes to advance the in-pointer after the encoded size of an element. If the element is NULL (indicated by a size of -1), the value will be 0, independent of the corresponding value of elem_sz.

Definition at line 1260 of file pq_result_helper.c.

1267{
1268 const struct array_result_cls *info = cls;
1269 int data_sz;
1270 char *data;
1271 void *out = NULL;
1272 struct pq_array_header header;
1273 int col_num;
1274
1275 GNUNET_assert (NULL != dst);
1276 *((void **) dst) = NULL;
1277
1278#define FAIL_IF(cond) \
1279 do { \
1280 if ((cond)) \
1281 { \
1282 GNUNET_break (! (cond)); \
1283 goto FAIL; \
1284 } \
1285 } while (0)
1286
1287 col_num = PQfnumber (result, fname);
1288 FAIL_IF (0 > col_num);
1289
1290 data_sz = PQgetlength (result, row, col_num);
1291 FAIL_IF (0 > data_sz);
1292
1293 /* Report if this field is empty */
1294 if (0 == (size_t) data_sz)
1295 return GNUNET_NO;
1296
1297 data = PQgetvalue (result, row, col_num);
1298
1299 if (sizeof(header) > (size_t) data_sz)
1300 {
1301 uint32_t ndim;
1302
1303 /* data_sz is shorter than header if the
1304 array length is 0, in which case ndim is 0! */
1305 FAIL_IF (sizeof(uint32_t) > (size_t) data_sz);
1306 memcpy (&ndim,
1307 data,
1308 sizeof (ndim));
1309 FAIL_IF (0 != ndim);
1310 *info->num = 0;
1311 return GNUNET_OK;
1312 }
1313 FAIL_IF (sizeof(header) > (size_t) data_sz);
1314 FAIL_IF (NULL == data);
1315
1316 {
1317 struct pq_array_header *h =
1318 (struct pq_array_header *) data;
1319
1320 header.ndim = ntohl (h->ndim);
1321 header.has_nulls = ntohl (h->has_nulls);
1322 header.oid = ntohl (h->oid);
1323 header.dim = ntohl (h->dim);
1324 header.lbound = ntohl (h->lbound);
1325
1326 FAIL_IF (1 != header.ndim);
1327 FAIL_IF (INT_MAX <= header.dim);
1328 FAIL_IF ((0 != header.has_nulls) && ! info->allow_nulls);
1329 FAIL_IF (1 != header.lbound);
1330 FAIL_IF (info->oid != header.oid);
1331 }
1332
1333 if (NULL != info->num)
1334 *info->num = header.dim;
1335
1336 /* Prepare the array of bools, marking NULL elements */
1337 if (info->allow_nulls)
1338 *info->is_nulls = GNUNET_new_array (header.dim, bool);
1339
1340 {
1341 char *in = data + sizeof(header);
1342
1343#define HANDLE_ELEMENT(typ, conv, access) \
1344 do { \
1345 int32_t sz = ntohl (*(int32_t *) in); \
1346\
1347 in += sizeof(uint32_t); \
1348 if (-1 != sz) \
1349 { \
1350 FAIL_IF (sz != sizeof(typ)); \
1351 access (typ, conv); \
1352 in += sz; \
1353 } \
1354 else \
1355 { \
1356 FAIL_IF (! info->allow_nulls); \
1357 (*info->is_nulls)[i] = true; \
1358 } \
1359\
1360 out += sizeof(typ); \
1361 } while (0)
1362
1363#define HANDLE_ARRAY(typ, conv, access) \
1364 do { \
1365 if (NULL != dst_size) \
1366 *dst_size = sizeof(typ) *(header.dim); \
1367 out = GNUNET_new_array (header.dim, typ); \
1368 *((void **) dst) = out; \
1369 for (uint32_t i = 0; i < header.dim; i++) \
1370 { \
1371 HANDLE_ELEMENT (typ, conv, access); \
1372 } \
1373 } while (0)
1374
1375#define DEREF(typ, conv) \
1376 *(typ *) out = conv (*(typ *) in)
1377
1378#define ACCESS_ABS(typ, conv) \
1379 ((typ *) out)->abs_value_us = conv (*(uint64_t *) in)
1380
1381#define ACCESS_REL(typ, conv) \
1382 ((typ *) out)->rel_value_us = conv (*(uint64_t *) in)
1383
1384#define ACCESS_TSTMP(typ, conv) \
1385 ((typ *) out)->abs_time.abs_value_us = conv (*(uint64_t *) in)
1386
1387 switch (info->typ)
1388 {
1389 case array_of_bool:
1390 HANDLE_ARRAY (bool, /* no conv */, DEREF);
1391 break;
1392 case array_of_uint16:
1393 HANDLE_ARRAY (uint16_t, ntohs, DEREF);
1394 break;
1395 case array_of_uint32:
1396 HANDLE_ARRAY (uint32_t, ntohl, DEREF);
1397 break;
1398 case array_of_uint64:
1399 HANDLE_ARRAY (uint64_t, GNUNET_ntohll, DEREF);
1400 break;
1401 case array_of_abs_time:
1404 ACCESS_ABS);
1405 break;
1406 case array_of_rel_time:
1409 ACCESS_REL);
1410 break;
1411 case array_of_timestamp:
1414 ACCESS_TSTMP);
1415 break;
1416 case array_of_byte:
1417 if (0 == info->same_size)
1418 *info->sizes = GNUNET_new_array (header.dim, size_t);
1419 /* fallthrough */
1420 case array_of_string:
1421 {
1422 size_t total_sz = 0;
1423 bool is_string = (array_of_string == info->typ);
1430 uint32_t elem_sz[header.dim];
1437 uint32_t in_adv[header.dim];
1438 bool is_null[header.dim];
1439
1440 memset (elem_sz, 0, sizeof(elem_sz));
1441 memset (in_adv, 0, sizeof(in_adv));
1442 memset (is_null, 0, sizeof(is_null));
1443
1444 /* first, calculate total size required for allocation */
1445 for (uint32_t i = 0; i < header.dim; i++)
1446 {
1447 int32_t sz = ntohl (*(int32_t *) in);
1448
1449 if (-1 == sz) /* signifies NULL entry */
1450 {
1451 FAIL_IF (! info->allow_nulls);
1452 is_null[i] = true;
1453 elem_sz[i] = info->same_size ? info->same_size : 0;
1454 in_adv[i] = 0;
1455 }
1456 else
1457 {
1458 FAIL_IF (0 > sz);
1459 elem_sz[i] = sz;
1460 in_adv[i] = sz;
1461 }
1462 FAIL_IF (info->same_size &&
1463 (elem_sz[i] != info->same_size));
1464
1465 if (info->allow_nulls)
1466 (*info->is_nulls)[i] = is_null[i];
1467
1468 if ((! is_string) &&
1469 (! info->same_size))
1470 (*info->sizes)[i] = elem_sz[i];
1471
1472 total_sz += elem_sz[i];
1473 /* add room for terminator for non-NULL entry of type string */
1474 total_sz += (is_string && ! is_null[i]) ? 1 : 0;
1475 in += sizeof(int32_t);
1476 in += in_adv[i];
1477
1478 FAIL_IF (total_sz < elem_sz[i]);
1479 }
1480
1481 FAIL_IF ((! info->allow_nulls) && (0 == total_sz));
1482 if (NULL != dst_size)
1483 *dst_size = total_sz;
1484
1485 out = GNUNET_malloc (total_sz);
1486 *((void **) dst) = out;
1487 in = data + sizeof(header); /* reset to beginning of input */
1488
1489 /* Finally, copy the data */
1490 for (uint32_t i = 0; i < header.dim; i++)
1491 {
1492 in += sizeof(uint32_t); /* skip length */
1493 if (! is_null[i])
1494 GNUNET_memcpy (out, in, elem_sz[i]);
1495
1496 in += in_adv[i];
1497 out += elem_sz[i];
1498 out += (is_string && ! is_null[i]) ? 1 : 0;
1499 }
1500 break;
1501 }
1502 default:
1503 FAIL_IF (1 != 0);
1504 }
1505 }
1506
1507 return GNUNET_OK;
1508
1509FAIL:
1510 GNUNET_free (*(void **) dst);
1511 return GNUNET_SYSERR;
1512#undef FAIL_IF
1513#undef DEREF
1514#undef ACCESS_ABS
1515#undef ACCESS_REL
1516#undef ACCESS_TSTMP
1517#undef HANDLE_ARRAY
1518#undef HANDLE_ELEMENT
1519}
#define INT_MAX
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition gnunet-arm.c:98
static char * data
The data to insert into the dht.
uint32_t ndim
@ array_of_byte
Definition pq.h:153
@ array_of_uint32
Definition pq.h:151
@ array_of_string
Definition pq.h:154
@ array_of_rel_time
Definition pq.h:156
@ array_of_uint16
Definition pq.h:150
@ array_of_uint64
Definition pq.h:152
@ array_of_abs_time
Definition pq.h:155
@ array_of_timestamp
Definition pq.h:157
@ array_of_bool
Definition pq.h:149
#define DEREF(typ, conv)
#define FAIL_IF(cond)
#define ACCESS_ABS(typ, conv)
#define ACCESS_REL(typ, conv)
#define HANDLE_ARRAY(typ, conv, access)
#define ACCESS_TSTMP(typ, conv)
Closure for the array result specifications.
The header for a postgresql array in binary format.
Definition pq.h:167

References ACCESS_ABS, ACCESS_REL, ACCESS_TSTMP, array_of_abs_time, array_of_bool, array_of_byte, array_of_rel_time, array_of_string, array_of_timestamp, array_of_uint16, array_of_uint32, array_of_uint64, data, DEREF, pq_array_header::dim, FAIL, FAIL_IF, GNUNET_assert, GNUNET_free, GNUNET_malloc, GNUNET_memcpy, GNUNET_new_array, GNUNET_NO, GNUNET_ntohll(), GNUNET_OK, GNUNET_SYSERR, h, HANDLE_ARRAY, pq_array_header::has_nulls, info, INT_MAX, pq_array_header::lbound, ndim, pq_array_header::ndim, pq_array_header::oid, and result.

Referenced by GNUNET_PQ_result_spec_array_abs_time(), GNUNET_PQ_result_spec_array_allow_nulls(), GNUNET_PQ_result_spec_array_bool(), GNUNET_PQ_result_spec_array_fixed_size(), GNUNET_PQ_result_spec_array_rel_time(), GNUNET_PQ_result_spec_array_string(), GNUNET_PQ_result_spec_array_timestamp(), GNUNET_PQ_result_spec_array_uint16(), GNUNET_PQ_result_spec_array_uint32(), GNUNET_PQ_result_spec_array_uint64(), and GNUNET_PQ_result_spec_array_variable_size().

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

◆ GNUNET_PQ_result_spec_array_allow_nulls()

struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_allow_nulls ( struct GNUNET_PQ_ResultSpec  rs,
bool **  is_nulls 
)

Allow NULL values in an array to be found in the database for the given value.

Parameters
rsresult spec entry to modify, MUST be one for the array types
[out]is_nullslocation where to put the array of bools, whose elements will be set to 'true' if the value was indeed NULL, or to 'false' if the value was non-NULL. This parameter MUST NOT be NULL itself. The length of the allocated array will be equal to the length of the result for the values in rs.
Returns
array entry for the result specification to use

Definition at line 1523 of file pq_result_helper.c.

1526{
1527 struct GNUNET_PQ_ResultSpec rsr;
1528 struct array_result_cls *info = rs.cls;
1529
1531 GNUNET_assert (NULL != is_nulls);
1532 info->allow_nulls = true;
1533 info->is_nulls = is_nulls;
1534
1535 rsr = rs;
1536 return rsr;
1537}
static enum GNUNET_GenericReturnValue extract_array_generic(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result as array of a specific type from row row.
void * cls
Closure for conv and cleaner.

References extract_array_generic(), GNUNET_assert, info, and array_result_cls::is_nulls.

Here is the call graph for this function:

◆ array_cleanup()

static void array_cleanup ( void *  cls,
void *  rd 
)
static

Cleanup of the data and closure of an array spec.

Definition at line 1544 of file pq_result_helper.c.

1546{
1547
1548 struct array_result_cls *info = cls;
1549 void **dst = rd;
1550
1551 if ((array_of_byte == info->typ) &&
1552 (0 == info->same_size) &&
1553 (NULL != info->sizes))
1554 GNUNET_free (*(info->sizes));
1555
1556 if (info->allow_nulls)
1557 GNUNET_free (*info->is_nulls);
1558
1559 GNUNET_free (cls);
1560 GNUNET_free (*dst);
1561 *dst = NULL;
1562}

References array_of_byte, GNUNET_free, info, and rd.

Referenced by GNUNET_PQ_result_spec_array_abs_time(), GNUNET_PQ_result_spec_array_bool(), GNUNET_PQ_result_spec_array_fixed_size(), GNUNET_PQ_result_spec_array_rel_time(), GNUNET_PQ_result_spec_array_string(), GNUNET_PQ_result_spec_array_timestamp(), GNUNET_PQ_result_spec_array_uint16(), GNUNET_PQ_result_spec_array_uint32(), GNUNET_PQ_result_spec_array_uint64(), and GNUNET_PQ_result_spec_array_variable_size().

Here is the caller graph for this function:

◆ GNUNET_PQ_result_spec_array_bool()

struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_bool ( struct GNUNET_PQ_Context db,
const char *  name,
size_t *  num,
bool **  bools 
)

array of bool expected.

Parameters
dbDatabase context, needed for OID lookup for the correct type
namename of the field in the table
[out]numwhere to store the number of elements in the array bools.
[out]boolspointer to where to store the result, an array of num bool's. Allocated by the function, MUST be freed with GNUNET_free.
Returns
array entry for the result specification to use

Definition at line 1566 of file pq_result_helper.c.

1571{
1572 struct array_result_cls *info =
1574
1575 info->num = num;
1576 info->typ = array_of_bool;
1579 "bool",
1580 &info->oid));
1581
1582 {
1583 struct GNUNET_PQ_ResultSpec res = {
1585 .cleaner = array_cleanup,
1586 .dst = (void *) dst,
1587 .fname = name,
1588 .cls = info
1589 };
1590 return res;
1591 }
1592}
static struct GNUNET_FS_DirectoryBuilder * db
enum GNUNET_GenericReturnValue GNUNET_PQ_get_oid_by_name(struct GNUNET_PQ_Context *db, const char *name, Oid *oid)
Returns the oid for a given datatype by name.
Definition pq_connect.c:460
#define GNUNET_new(type)
Allocate a struct or union of the given type.
static void array_cleanup(void *cls, void *rd)
Cleanup of the data and closure of an array spec.

References array_cleanup(), array_of_bool, GNUNET_PQ_ResultSpec::cls, GNUNET_PQ_ResultSpec::conv, db, GNUNET_PQ_ResultSpec::dst, extract_array_generic(), GNUNET_PQ_ResultSpec::fname, GNUNET_assert, GNUNET_new, GNUNET_OK, GNUNET_PQ_get_oid_by_name(), info, name, array_result_cls::num, and res.

Here is the call graph for this function:

◆ GNUNET_PQ_result_spec_array_uint16()

struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_uint16 ( struct GNUNET_PQ_Context db,
const char *  name,
size_t *  num,
uint16_t **  dst 
)

array of uint16_t expected.

Parameters
dbDatabase context, needed for OID lookup for the correct type
namename of the field in the table
[out]numwhere to store the number of elements in the array u16s.
[out]dstpointer to where to store the an array of num uint16_t's. Allocated by the function, MUST be freed with GNUNET_free.
Returns
array entry for the result specification to use

Definition at line 1596 of file pq_result_helper.c.

1601{
1602 struct array_result_cls *info =
1604
1605 info->num = num;
1606 info->typ = array_of_uint16;
1609 "int2",
1610 &info->oid));
1611
1612 {
1613 struct GNUNET_PQ_ResultSpec res = {
1615 .cleaner = array_cleanup,
1616 .dst = (void *) dst,
1617 .fname = name,
1618 .cls = info
1619 };
1620 return res;
1621 }
1622}

References array_cleanup(), array_of_uint16, GNUNET_PQ_ResultSpec::cls, GNUNET_PQ_ResultSpec::conv, db, GNUNET_PQ_ResultSpec::dst, extract_array_generic(), GNUNET_PQ_ResultSpec::fname, GNUNET_assert, GNUNET_new, GNUNET_OK, GNUNET_PQ_get_oid_by_name(), info, name, array_result_cls::num, and res.

Here is the call graph for this function:

◆ GNUNET_PQ_result_spec_array_uint32()

struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_uint32 ( struct GNUNET_PQ_Context db,
const char *  name,
size_t *  num,
uint32_t **  dst 
)

array of uint32_t expected.

Parameters
dbDatabase context, needed for OID lookup for the correct type
namename of the field in the table
[out]numwhere to store the number of elements in the array u32s.
[out]dstpointer to where to store the array of num uint32_t's. Allocated by the function, MUST be freed with GNUNET_free.
Returns
array entry for the result specification to use

Definition at line 1626 of file pq_result_helper.c.

1631{
1632 struct array_result_cls *info =
1634
1635 info->num = num;
1636 info->typ = array_of_uint32;
1639 "int4",
1640 &info->oid));
1641
1642 {
1643 struct GNUNET_PQ_ResultSpec res = {
1645 .cleaner = array_cleanup,
1646 .dst = (void *) dst,
1647 .fname = name,
1648 .cls = info
1649 };
1650 return res;
1651 }
1652}

References array_cleanup(), array_of_uint32, GNUNET_PQ_ResultSpec::cls, GNUNET_PQ_ResultSpec::conv, db, GNUNET_PQ_ResultSpec::dst, extract_array_generic(), GNUNET_PQ_ResultSpec::fname, GNUNET_assert, GNUNET_new, GNUNET_OK, GNUNET_PQ_get_oid_by_name(), info, name, array_result_cls::num, and res.

Here is the call graph for this function:

◆ GNUNET_PQ_result_spec_array_uint64()

struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_uint64 ( struct GNUNET_PQ_Context db,
const char *  name,
size_t *  num,
uint64_t **  dst 
)

array of uint64_t expected.

Parameters
dbDatabase context, needed for OID lookup for the correct type
namename of the field in the table
[out]numwhere to store the number of elements in the array u64s.
[out]dstpointer to where to store the array of num uint64_t's. Allocated by the function, MUST be freed with GNUNET_free.
Returns
array entry for the result specification to use

Definition at line 1656 of file pq_result_helper.c.

1661{
1662 struct array_result_cls *info =
1664
1665 info->num = num;
1666 info->typ = array_of_uint64;
1669 "int8",
1670 &info->oid));
1671
1672 {struct GNUNET_PQ_ResultSpec res = {
1674 .cleaner = array_cleanup,
1675 .dst = (void *) dst,
1676 .fname = name,
1677 .cls = info
1678 };
1679 return res;}
1680}

References array_cleanup(), array_of_uint64, GNUNET_PQ_ResultSpec::cls, GNUNET_PQ_ResultSpec::conv, db, GNUNET_PQ_ResultSpec::dst, extract_array_generic(), GNUNET_PQ_ResultSpec::fname, GNUNET_assert, GNUNET_new, GNUNET_OK, GNUNET_PQ_get_oid_by_name(), info, name, array_result_cls::num, and res.

Here is the call graph for this function:

◆ GNUNET_PQ_result_spec_array_abs_time()

struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_abs_time ( struct GNUNET_PQ_Context db,
const char *  name,
size_t *  num,
struct GNUNET_TIME_Absolute **  dst 
)

array of absolute time expected.

Parameters
dbDatabase context, needed for OID lookup for the correct type
namename of the field in the table
[out]numwhere to store the number of elements in the array u64s.
[out]dstpointer to where to store the array of num absolute time. Allocated by the function, MUST be freed with GNUNET_free.
Returns
array entry for the result specification to use

Definition at line 1684 of file pq_result_helper.c.

1689{
1690 struct array_result_cls *info =
1692
1693 info->num = num;
1694 info->typ = array_of_abs_time;
1697 "int8",
1698 &info->oid));
1699
1700 {struct GNUNET_PQ_ResultSpec res = {
1702 .cleaner = array_cleanup,
1703 .dst = (void *) dst,
1704 .fname = name,
1705 .cls = info
1706 };
1707 return res;}
1708}

References array_cleanup(), array_of_abs_time, GNUNET_PQ_ResultSpec::cls, GNUNET_PQ_ResultSpec::conv, db, GNUNET_PQ_ResultSpec::dst, extract_array_generic(), GNUNET_PQ_ResultSpec::fname, GNUNET_assert, GNUNET_new, GNUNET_OK, GNUNET_PQ_get_oid_by_name(), info, name, array_result_cls::num, and res.

Here is the call graph for this function:

◆ GNUNET_PQ_result_spec_array_rel_time()

struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_rel_time ( struct GNUNET_PQ_Context db,
const char *  name,
size_t *  num,
struct GNUNET_TIME_Relative **  dst 
)

array of relative time expected.

Parameters
dbDatabase context, needed for OID lookup for the correct type
namename of the field in the table
[out]numwhere to store the number of elements in the array u64s.
[out]dstpointer to where to store the array of num relate time. Allocated by the function, MUST be freed with GNUNET_free.
Returns
array entry for the result specification to use

Definition at line 1712 of file pq_result_helper.c.

1717{
1718 struct array_result_cls *info =
1720
1721 info->num = num;
1722 info->typ = array_of_rel_time;
1725 "int8",
1726 &info->oid));
1727
1728 {
1729 struct GNUNET_PQ_ResultSpec res = {
1731 .cleaner = array_cleanup,
1732 .dst = (void *) dst,
1733 .fname = name,
1734 .cls = info
1735 };
1736 return res;
1737 }
1738}

References array_cleanup(), array_of_rel_time, GNUNET_PQ_ResultSpec::cls, GNUNET_PQ_ResultSpec::conv, db, GNUNET_PQ_ResultSpec::dst, extract_array_generic(), GNUNET_PQ_ResultSpec::fname, GNUNET_assert, GNUNET_new, GNUNET_OK, GNUNET_PQ_get_oid_by_name(), info, name, array_result_cls::num, and res.

Here is the call graph for this function:

◆ GNUNET_PQ_result_spec_array_timestamp()

struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_timestamp ( struct GNUNET_PQ_Context db,
const char *  name,
size_t *  num,
struct GNUNET_TIME_Timestamp **  dst 
)

array of relative time expected.

Parameters
dbDatabase context, needed for OID lookup for the correct type
namename of the field in the table
[out]numwhere to store the number of elements in the array u64s.
[out]dstpointer to where to store the array of num timestamps. Allocated by the function, MUST be freed with GNUNET_free.
Returns
array entry for the result specification to use

Definition at line 1742 of file pq_result_helper.c.

1747{
1748 struct array_result_cls *info =
1750
1751 info->num = num;
1752 info->typ = array_of_timestamp;
1755 "int8",
1756 &info->oid));
1757
1758 {
1759 struct GNUNET_PQ_ResultSpec res = {
1761 .cleaner = array_cleanup,
1762 .dst = (void *) dst,
1763 .fname = name,
1764 .cls = info
1765 };
1766 return res;
1767 }
1768}

References array_cleanup(), array_of_timestamp, GNUNET_PQ_ResultSpec::cls, GNUNET_PQ_ResultSpec::conv, db, GNUNET_PQ_ResultSpec::dst, extract_array_generic(), GNUNET_PQ_ResultSpec::fname, GNUNET_assert, GNUNET_new, GNUNET_OK, GNUNET_PQ_get_oid_by_name(), info, name, array_result_cls::num, and res.

Here is the call graph for this function:

◆ GNUNET_PQ_result_spec_array_variable_size()

struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_variable_size ( struct GNUNET_PQ_Context db,
const char *  name,
size_t *  num,
size_t **  sizes,
void **  dst 
)

Array of variable-size result expected.

Parameters
dbDatabase context, needed for OID lookup for the correct type
namename of the field in the table
[out]numwhere to store the number of elements
[out]sizeswhere to store the num size's of byte-buffers in dst
[out]dstwhere to store the continuous array of num byte-buffers of sizes given in size, allocated
Returns
array entry for the result specification to use

Definition at line 1772 of file pq_result_helper.c.

1778{
1779 struct array_result_cls *info =
1781
1782 info->num = num;
1783 info->sizes = sizes;
1784 info->typ = array_of_byte;
1787 "bytea",
1788 &info->oid));
1789
1790 {
1791 struct GNUNET_PQ_ResultSpec res = {
1793 .cleaner = array_cleanup,
1794 .dst = (void *) dst,
1795 .fname = name,
1796 .cls = info
1797 };
1798 return res;
1799 }
1800}

References array_cleanup(), array_of_byte, GNUNET_PQ_ResultSpec::cls, GNUNET_PQ_ResultSpec::conv, db, GNUNET_PQ_ResultSpec::dst, extract_array_generic(), GNUNET_PQ_ResultSpec::fname, GNUNET_assert, GNUNET_new, GNUNET_OK, GNUNET_PQ_get_oid_by_name(), info, name, array_result_cls::num, res, and array_result_cls::sizes.

Here is the call graph for this function:

◆ GNUNET_PQ_result_spec_array_fixed_size()

struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_fixed_size ( struct GNUNET_PQ_Context db,
const char *  name,
size_t  size,
size_t *  num,
void **  dst 
)

Array of fixed-size result expected.

Parameters
dbDatabase context, needed for OID lookup for the correct type
namename of the field in the table
sizenumber of bytes expected in each element of dst
[out]numwhere to store the number of elements
[out]dstwhere to store the results, an continuous array of @num fixed-size elements
Returns
array entry for the result specification to use

Definition at line 1804 of file pq_result_helper.c.

1810{
1811 struct array_result_cls *info =
1813
1814 info->num = num;
1815 info->same_size = size;
1816 info->typ = array_of_byte;
1819 "bytea",
1820 &info->oid));
1821
1822 {
1823 struct GNUNET_PQ_ResultSpec res = {
1825 .cleaner = array_cleanup,
1826 .dst = (void *) dst,
1827 .fname = name,
1828 .cls = info
1829 };
1830 return res;
1831 }
1832}
static unsigned int size
Size of the "table".
Definition peer.c:68

References array_cleanup(), array_of_byte, GNUNET_PQ_ResultSpec::cls, GNUNET_PQ_ResultSpec::conv, db, GNUNET_PQ_ResultSpec::dst, extract_array_generic(), GNUNET_PQ_ResultSpec::fname, GNUNET_assert, GNUNET_new, GNUNET_OK, GNUNET_PQ_get_oid_by_name(), info, name, array_result_cls::num, res, and size.

Here is the call graph for this function:

◆ GNUNET_PQ_result_spec_array_string()

struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_array_string ( struct GNUNET_PQ_Context db,
const char *  name,
size_t *  num,
char **  dst 
)

Array of 0-terminated strings expected.

Parameters
dbDatabase context, needed for OID lookup for the correct type
namename of the field in the table
[out]numwhere to store the number of elements
[out]dstwhere to store the allocated continuous array of num 0-terminated strings
Returns
array entry for the result specification to use

Definition at line 1836 of file pq_result_helper.c.

1841{
1842 struct array_result_cls *info =
1844
1845 info->num = num;
1846 info->typ = array_of_string;
1849 "text",
1850 &info->oid));
1851
1852 {
1853 struct GNUNET_PQ_ResultSpec res = {
1855 .cleaner = array_cleanup,
1856 .dst = (void *) dst,
1857 .fname = name,
1858 .cls = info
1859 };
1860 return res;
1861 }
1862}

References array_cleanup(), array_of_string, GNUNET_PQ_ResultSpec::cls, GNUNET_PQ_ResultSpec::conv, db, GNUNET_PQ_ResultSpec::dst, extract_array_generic(), GNUNET_PQ_ResultSpec::fname, GNUNET_assert, GNUNET_new, GNUNET_OK, GNUNET_PQ_get_oid_by_name(), info, name, array_result_cls::num, and res.

Here is the call graph for this function:

◆ extract_blind_sign_pub()

static enum GNUNET_GenericReturnValue extract_blind_sign_pub ( void *  cls,
PGresult *  result,
int  row,
const char *  fname,
size_t *  dst_size,
void *  dst 
)
static

Extract data from a Postgres database result at row row.

Parameters
clsclosure
resultwhere to extract data from
rowthe row to extract data from
fnamename (or prefix) of the fields to extract from
[in,out]dst_sizewhere to store size of result, may be NULL
[out]dstwhere to store the result
Returns
GNUNET_YES if all results could be extracted GNUNET_SYSERR if a result was invalid (non-existing field or NULL)

Definition at line 1879 of file pq_result_helper.c.

1885{
1886 struct GNUNET_CRYPTO_BlindSignPublicKey **bpk = dst;
1888 size_t len;
1889 const char *res;
1890 int fnum;
1891 uint32_t be;
1892
1893 (void) cls;
1894 (void) dst_size;
1895 fnum = PQfnumber (result,
1896 fname);
1897 if (fnum < 0)
1898 {
1899 GNUNET_break (0);
1900 return GNUNET_SYSERR;
1901 }
1902 if (PQgetisnull (result,
1903 row,
1904 fnum))
1905 return GNUNET_NO;
1906
1907 /* if a field is null, continue but
1908 * remember that we now return a different result */
1909 len = PQgetlength (result,
1910 row,
1911 fnum);
1912 res = PQgetvalue (result,
1913 row,
1914 fnum);
1915 if (len < sizeof (be))
1916 {
1917 GNUNET_break (0);
1918 return GNUNET_SYSERR;
1919 }
1920 GNUNET_memcpy (&be,
1921 res,
1922 sizeof (be));
1923 res += sizeof (be);
1924 len -= sizeof (be);
1926 tmp->cipher = ntohl (be);
1927 tmp->rc = 1;
1928 switch (tmp->cipher)
1929 {
1931 break;
1935 len);
1936 if (NULL == tmp->details.rsa_public_key)
1937 {
1938 GNUNET_break (0);
1939 GNUNET_free (tmp);
1940 return GNUNET_SYSERR;
1941 }
1943 len,
1944 &tmp->pub_key_hash);
1945 *bpk = tmp;
1946 return GNUNET_OK;
1948 if (sizeof (tmp->details.cs_public_key) != len)
1949 {
1950 GNUNET_break (0);
1951 GNUNET_free (tmp);
1952 return GNUNET_SYSERR;
1953 }
1955 res,
1956 len);
1958 len,
1959 &tmp->pub_key_hash);
1960 *bpk = tmp;
1961 return GNUNET_OK;
1962 }
1963 GNUNET_break (0);
1964 GNUNET_free (tmp);
1965 return GNUNET_SYSERR;
1966}
void GNUNET_CRYPTO_hash(const void *block, size_t size, struct GNUNET_HashCode *ret)
Compute hash of a given block.
Definition crypto_hash.c:41
@ GNUNET_CRYPTO_BSA_INVALID
Invalid type of signature.
@ GNUNET_CRYPTO_BSA_CS
Clause Blind Schnorr signature.
@ GNUNET_CRYPTO_BSA_RSA
RSA blind signature.
Type of public signing keys for blind signatures.
union GNUNET_CRYPTO_BlindSignPublicKey::@20 details
Details, depending on cipher.
unsigned int rc
Reference counter.
struct GNUNET_HashCode pub_key_hash
Hash of the public key.
struct GNUNET_CRYPTO_CsPublicKey cs_public_key
If we use GNUNET_CRYPTO_BSA_CS in cipher.
enum GNUNET_CRYPTO_BlindSignatureAlgorithm cipher
Type of the public key.
struct GNUNET_CRYPTO_RsaPublicKey * rsa_public_key
If we use GNUNET_CRYPTO_BSA_RSA in cipher.

References GNUNET_CRYPTO_BlindSignPublicKey::cipher, GNUNET_CRYPTO_BlindSignPublicKey::cs_public_key, GNUNET_CRYPTO_BlindSignPublicKey::details, GNUNET_break, GNUNET_CRYPTO_BSA_CS, GNUNET_CRYPTO_BSA_INVALID, GNUNET_CRYPTO_BSA_RSA, GNUNET_CRYPTO_hash(), GNUNET_CRYPTO_rsa_public_key_decode(), GNUNET_free, GNUNET_memcpy, GNUNET_new, GNUNET_NO, GNUNET_OK, GNUNET_SYSERR, GNUNET_CRYPTO_BlindSignPublicKey::pub_key_hash, GNUNET_CRYPTO_BlindSignPublicKey::rc, res, result, and GNUNET_CRYPTO_BlindSignPublicKey::rsa_public_key.

Referenced by GNUNET_PQ_result_spec_blind_sign_pub().

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

◆ clean_blind_sign_pub()

static void clean_blind_sign_pub ( void *  cls,
void *  rd 
)
static

Function called to clean up memory allocated by a GNUNET_PQ_ResultConverter.

Parameters
clsclosure
rdresult data to clean up

Definition at line 1977 of file pq_result_helper.c.

1979{
1981
1982 (void) cls;
1983 if (NULL != *pub)
1984 {
1986 *pub = NULL;
1987 }
1988}
static struct GNUNET_CRYPTO_EddsaPublicKey pub
void GNUNET_CRYPTO_blind_sign_pub_decref(struct GNUNET_CRYPTO_BlindSignPublicKey *bsign_pub)
Decrement reference counter of a bsign_pub, and free it if it reaches zero.

References GNUNET_CRYPTO_blind_sign_pub_decref(), pub, and rd.

Referenced by GNUNET_PQ_result_spec_blind_sign_pub().

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

◆ GNUNET_PQ_result_spec_blind_sign_pub()

struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_blind_sign_pub ( const char *  name,
struct GNUNET_CRYPTO_BlindSignPublicKey **  public_key 
)

Blind sign public key expected.

Parameters
namename of the field in the table
[out]public_keywhere to store the denomination signature
Returns
array entry for the result specification to use

Definition at line 1992 of file pq_result_helper.c.

1995{
1996 struct GNUNET_PQ_ResultSpec res = {
1998 .cleaner = &clean_blind_sign_pub,
1999 .dst = (void *) pub,
2000 .fname = name
2001 };
2002
2003 return res;
2004}
static void clean_blind_sign_pub(void *cls, void *rd)
Function called to clean up memory allocated by a GNUNET_PQ_ResultConverter.
static enum GNUNET_GenericReturnValue extract_blind_sign_pub(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.

References clean_blind_sign_pub(), GNUNET_PQ_ResultSpec::conv, extract_blind_sign_pub(), GNUNET_PQ_ResultSpec::fname, name, pub, and res.

Here is the call graph for this function:

◆ extract_blind_sign_priv()

static enum GNUNET_GenericReturnValue extract_blind_sign_priv ( void *  cls,
PGresult *  result,
int  row,
const char *  fname,
size_t *  dst_size,
void *  dst 
)
static

Extract data from a Postgres database result at row row.

Parameters
clsclosure
resultwhere to extract data from
rowthe row to extract data from
fnamename (or prefix) of the fields to extract from
[in,out]dst_sizewhere to store size of result, may be NULL
[out]dstwhere to store the result
Returns
GNUNET_YES if all results could be extracted GNUNET_SYSERR if a result was invalid (non-existing field or NULL)

Definition at line 2021 of file pq_result_helper.c.

2027{
2028 struct GNUNET_CRYPTO_BlindSignPrivateKey **bpk = dst;
2030 size_t len;
2031 const char *res;
2032 int fnum;
2033 uint32_t be;
2034
2035 (void) cls;
2036 (void) dst_size;
2037 fnum = PQfnumber (result,
2038 fname);
2039 if (fnum < 0)
2040 {
2041 GNUNET_break (0);
2042 return GNUNET_SYSERR;
2043 }
2044 if (PQgetisnull (result,
2045 row,
2046 fnum))
2047 return GNUNET_NO;
2048
2049 /* if a field is null, continue but
2050 * remember that we now return a different result */
2051 len = PQgetlength (result,
2052 row,
2053 fnum);
2054 res = PQgetvalue (result,
2055 row,
2056 fnum);
2057 if (len < sizeof (be))
2058 {
2059 GNUNET_break (0);
2060 return GNUNET_SYSERR;
2061 }
2062 GNUNET_memcpy (&be,
2063 res,
2064 sizeof (be));
2065 res += sizeof (be);
2066 len -= sizeof (be);
2068 tmp->cipher = ntohl (be);
2069 tmp->rc = 1;
2070 switch (tmp->cipher)
2071 {
2073 break;
2077 len);
2078 if (NULL == tmp->details.rsa_private_key)
2079 {
2080 GNUNET_break (0);
2081 GNUNET_free (tmp);
2082 return GNUNET_SYSERR;
2083 }
2084 *bpk = tmp;
2085 return GNUNET_OK;
2087 if (sizeof (tmp->details.cs_private_key) != len)
2088 {
2089 GNUNET_break (0);
2090 GNUNET_free (tmp);
2091 return GNUNET_SYSERR;
2092 }
2094 res,
2095 len);
2096 *bpk = tmp;
2097 return GNUNET_OK;
2098 }
2099 GNUNET_break (0);
2100 GNUNET_free (tmp);
2101 return GNUNET_SYSERR;
2102}
struct GNUNET_CRYPTO_RsaPrivateKey * GNUNET_CRYPTO_rsa_private_key_decode(const void *buf, size_t buf_size)
Decode the private key from the data-format back to the "normal", internal format.
Definition crypto_rsa.c:204
Type of private signing keys for blind signing.
struct GNUNET_CRYPTO_CsPrivateKey cs_private_key
If we use GNUNET_CRYPTO_BSA_CS in cipher.
unsigned int rc
Reference counter.
struct GNUNET_CRYPTO_RsaPrivateKey * rsa_private_key
If we use GNUNET_CRYPTO_BSA_RSA in cipher.
enum GNUNET_CRYPTO_BlindSignatureAlgorithm cipher
Type of the public key.
union GNUNET_CRYPTO_BlindSignPrivateKey::@21 details
Details, depending on cipher.

References GNUNET_CRYPTO_BlindSignPrivateKey::cipher, GNUNET_CRYPTO_BlindSignPrivateKey::cs_private_key, GNUNET_CRYPTO_BlindSignPrivateKey::details, GNUNET_break, GNUNET_CRYPTO_BSA_CS, GNUNET_CRYPTO_BSA_INVALID, GNUNET_CRYPTO_BSA_RSA, GNUNET_CRYPTO_rsa_private_key_decode(), GNUNET_free, GNUNET_memcpy, GNUNET_new, GNUNET_NO, GNUNET_OK, GNUNET_SYSERR, GNUNET_CRYPTO_BlindSignPrivateKey::rc, res, result, and GNUNET_CRYPTO_BlindSignPrivateKey::rsa_private_key.

Referenced by GNUNET_PQ_result_spec_blind_sign_priv().

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

◆ clean_blind_sign_priv()

static void clean_blind_sign_priv ( void *  cls,
void *  rd 
)
static

Function called to clean up memory allocated by a GNUNET_PQ_ResultConverter.

Parameters
clsclosure
rdresult data to clean up

Definition at line 2113 of file pq_result_helper.c.

2115{
2116 struct GNUNET_CRYPTO_BlindSignPrivateKey **priv = rd;
2117
2118 (void) cls;
2119 if (NULL != *priv)
2120 {
2122 *priv = NULL;
2123 }
2124}
void GNUNET_CRYPTO_blind_sign_priv_decref(struct GNUNET_CRYPTO_BlindSignPrivateKey *bsign_priv)
Decrement reference counter of a bsign_priv, and free it if it reaches zero.

References GNUNET_CRYPTO_blind_sign_priv_decref(), and rd.

Referenced by GNUNET_PQ_result_spec_blind_sign_priv().

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

◆ GNUNET_PQ_result_spec_blind_sign_priv()

struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_blind_sign_priv ( const char *  name,
struct GNUNET_CRYPTO_BlindSignPrivateKey **  private_key 
)

Blind sign private key expected.

Parameters
namename of the field in the table
[out]private_keywhere to store the denomination signature
Returns
array entry for the result specification to use

Definition at line 2128 of file pq_result_helper.c.

2131{
2132 struct GNUNET_PQ_ResultSpec res = {
2134 .cleaner = &clean_blind_sign_priv,
2135 .dst = (void *) priv,
2136 .fname = name
2137 };
2138
2139 return res;
2140}
static enum GNUNET_GenericReturnValue extract_blind_sign_priv(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.
static void clean_blind_sign_priv(void *cls, void *rd)
Function called to clean up memory allocated by a GNUNET_PQ_ResultConverter.

References clean_blind_sign_priv(), GNUNET_PQ_ResultSpec::conv, extract_blind_sign_priv(), GNUNET_PQ_ResultSpec::fname, name, and res.

Here is the call graph for this function:

◆ extract_blinded_sig()

static enum GNUNET_GenericReturnValue extract_blinded_sig ( void *  cls,
PGresult *  result,
int  row,
const char *  fname,
size_t *  dst_size,
void *  dst 
)
static

Extract data from a Postgres database result at row row.

Parameters
clsclosure
resultwhere to extract data from
rowthe row to extract data from
fnamename (or prefix) of the fields to extract from
[in,out]dst_sizewhere to store size of result, may be NULL
[out]dstwhere to store the result
Returns
GNUNET_YES if all results could be extracted GNUNET_SYSERR if a result was invalid (non-existing field or NULL)

Definition at line 2157 of file pq_result_helper.c.

2163{
2164 struct GNUNET_CRYPTO_BlindedSignature **sig = dst;
2166 size_t len;
2167 const char *res;
2168 int fnum;
2169 uint32_t be[2];
2170
2171 (void) cls;
2172 (void) dst_size;
2173 fnum = PQfnumber (result,
2174 fname);
2175 if (fnum < 0)
2176 {
2177 GNUNET_break (0);
2178 return GNUNET_SYSERR;
2179 }
2180 if (PQgetisnull (result,
2181 row,
2182 fnum))
2183 return GNUNET_NO;
2184
2185 /* if a field is null, continue but
2186 * remember that we now return a different result */
2187 len = PQgetlength (result,
2188 row,
2189 fnum);
2190 res = PQgetvalue (result,
2191 row,
2192 fnum);
2193 if (len < sizeof (be))
2194 {
2195 GNUNET_break (0);
2196 return GNUNET_SYSERR;
2197 }
2198 GNUNET_memcpy (&be,
2199 res,
2200 sizeof (be));
2201 if (0x01 != ntohl (be[1])) /* magic marker: blinded */
2202 {
2203 GNUNET_break (0);
2204 return GNUNET_SYSERR;
2205 }
2206 res += sizeof (be);
2207 len -= sizeof (be);
2209 bs->rc = 1;
2210 bs->cipher = ntohl (be[0]);
2211 switch (bs->cipher)
2212 {
2214 break;
2218 len);
2219 if (NULL == bs->details.blinded_rsa_signature)
2220 {
2221 GNUNET_break (0);
2222 GNUNET_free (bs);
2223 return GNUNET_SYSERR;
2224 }
2225 *sig = bs;
2226 return GNUNET_OK;
2228 if (sizeof (bs->details.blinded_cs_answer) != len)
2229 {
2230 GNUNET_break (0);
2231 GNUNET_free (bs);
2232 return GNUNET_SYSERR;
2233 }
2235 res,
2236 len);
2237 *sig = bs;
2238 return GNUNET_OK;
2239 }
2240 GNUNET_break (0);
2241 GNUNET_free (bs);
2242 return GNUNET_SYSERR;
2243}
Type for blinded signatures.
unsigned int rc
Reference counter.
struct GNUNET_CRYPTO_CsBlindSignature blinded_cs_answer
If we use GNUNET_CRYPTO_BSA_CS in cipher.
enum GNUNET_CRYPTO_BlindSignatureAlgorithm cipher
Type of the signature.
struct GNUNET_CRYPTO_RsaSignature * blinded_rsa_signature
If we use GNUNET_CRYPTO_BSA_RSA in cipher.
union GNUNET_CRYPTO_BlindedSignature::@19 details
Details, depending on cipher.

References GNUNET_CRYPTO_BlindedSignature::blinded_cs_answer, GNUNET_CRYPTO_BlindedSignature::blinded_rsa_signature, GNUNET_CRYPTO_BlindedSignature::cipher, GNUNET_CRYPTO_BlindedSignature::details, GNUNET_break, GNUNET_CRYPTO_BSA_CS, GNUNET_CRYPTO_BSA_INVALID, GNUNET_CRYPTO_BSA_RSA, GNUNET_CRYPTO_rsa_signature_decode(), GNUNET_free, GNUNET_memcpy, GNUNET_new, GNUNET_NO, GNUNET_OK, GNUNET_SYSERR, GNUNET_CRYPTO_BlindedSignature::rc, res, and result.

Referenced by GNUNET_PQ_result_spec_blinded_sig().

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

◆ clean_blinded_sig()

static void clean_blinded_sig ( void *  cls,
void *  rd 
)
static

Function called to clean up memory allocated by a GNUNET_PQ_ResultConverter.

Parameters
clsclosure
rdresult data to clean up

Definition at line 2254 of file pq_result_helper.c.

2256{
2257 struct GNUNET_CRYPTO_BlindedSignature **b_sig = rd;
2258
2259 (void) cls;
2261}
void GNUNET_CRYPTO_blinded_sig_decref(struct GNUNET_CRYPTO_BlindedSignature *blind_sig)
Decrement reference counter of a blind_sig, and free it if it reaches zero.

References GNUNET_CRYPTO_blinded_sig_decref(), and rd.

Referenced by GNUNET_PQ_result_spec_blinded_sig().

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

◆ GNUNET_PQ_result_spec_blinded_sig()

struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_blinded_sig ( const char *  name,
struct GNUNET_CRYPTO_BlindedSignature **  b_sig 
)

Blinded signature expected.

Parameters
namename of the field in the table
[out]b_sigwhere to store the blinded signature
Returns
array entry for the result specification to use

Definition at line 2265 of file pq_result_helper.c.

2268{
2269 struct GNUNET_PQ_ResultSpec res = {
2271 .cleaner = &clean_blinded_sig,
2272 .dst = (void *) b_sig,
2273 .fname = name
2274 };
2275
2276 return res;
2277}
static void clean_blinded_sig(void *cls, void *rd)
Function called to clean up memory allocated by a GNUNET_PQ_ResultConverter.
static enum GNUNET_GenericReturnValue extract_blinded_sig(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.

References clean_blinded_sig(), GNUNET_PQ_ResultSpec::conv, extract_blinded_sig(), GNUNET_PQ_ResultSpec::fname, name, and res.

Here is the call graph for this function:

◆ extract_unblinded_sig()

static enum GNUNET_GenericReturnValue extract_unblinded_sig ( void *  cls,
PGresult *  result,
int  row,
const char *  fname,
size_t *  dst_size,
void *  dst 
)
static

Extract data from a Postgres database result at row row.

Parameters
clsclosure
resultwhere to extract data from
rowthe row to extract data from
fnamename (or prefix) of the fields to extract from
[in,out]dst_sizewhere to store size of result, may be NULL
[out]dstwhere to store the result
Returns
GNUNET_YES if all results could be extracted GNUNET_SYSERR if a result was invalid (non-existing field or NULL)

Definition at line 2294 of file pq_result_helper.c.

2300{
2301 struct GNUNET_CRYPTO_UnblindedSignature **sig = dst;
2303 size_t len;
2304 const char *res;
2305 int fnum;
2306 uint32_t be[2];
2307
2308 (void) cls;
2309 (void) dst_size;
2310 fnum = PQfnumber (result,
2311 fname);
2312 if (fnum < 0)
2313 {
2314 GNUNET_break (0);
2315 return GNUNET_SYSERR;
2316 }
2317 if (PQgetisnull (result,
2318 row,
2319 fnum))
2320 return GNUNET_NO;
2321
2322 /* if a field is null, continue but
2323 * remember that we now return a different result */
2324 len = PQgetlength (result,
2325 row,
2326 fnum);
2327 res = PQgetvalue (result,
2328 row,
2329 fnum);
2330 if (len < sizeof (be))
2331 {
2332 GNUNET_break (0);
2333 return GNUNET_SYSERR;
2334 }
2335 GNUNET_memcpy (&be,
2336 res,
2337 sizeof (be));
2338 if (0x00 != ntohl (be[1])) /* magic marker: unblinded */
2339 {
2340 GNUNET_break (0);
2341 return GNUNET_SYSERR;
2342 }
2343 res += sizeof (be);
2344 len -= sizeof (be);
2346 ubs->rc = 1;
2347 ubs->cipher = ntohl (be[0]);
2348 switch (ubs->cipher)
2349 {
2351 break;
2355 len);
2356 if (NULL == ubs->details.rsa_signature)
2357 {
2358 GNUNET_break (0);
2359 GNUNET_free (ubs);
2360 return GNUNET_SYSERR;
2361 }
2362 *sig = ubs;
2363 return GNUNET_OK;
2365 if (sizeof (ubs->details.cs_signature) != len)
2366 {
2367 GNUNET_break (0);
2368 GNUNET_free (ubs);
2369 return GNUNET_SYSERR;
2370 }
2372 res,
2373 len);
2374 *sig = ubs;
2375 return GNUNET_OK;
2376 }
2377 GNUNET_break (0);
2378 GNUNET_free (ubs);
2379 return GNUNET_SYSERR;
2380}
Type of (unblinded) signatures.
union GNUNET_CRYPTO_UnblindedSignature::@18 details
Details, depending on cipher.
struct GNUNET_CRYPTO_RsaSignature * rsa_signature
If we use GNUNET_CRYPTO_BSA_RSA in cipher.
unsigned int rc
Reference counter.
struct GNUNET_CRYPTO_CsSignature cs_signature
If we use GNUNET_CRYPTO_BSA_CS in cipher.
enum GNUNET_CRYPTO_BlindSignatureAlgorithm cipher
Type of the signature.

References GNUNET_CRYPTO_UnblindedSignature::cipher, GNUNET_CRYPTO_UnblindedSignature::cs_signature, GNUNET_CRYPTO_UnblindedSignature::details, GNUNET_break, GNUNET_CRYPTO_BSA_CS, GNUNET_CRYPTO_BSA_INVALID, GNUNET_CRYPTO_BSA_RSA, GNUNET_CRYPTO_rsa_signature_decode(), GNUNET_free, GNUNET_memcpy, GNUNET_new, GNUNET_NO, GNUNET_OK, GNUNET_SYSERR, GNUNET_CRYPTO_UnblindedSignature::rc, res, result, and GNUNET_CRYPTO_UnblindedSignature::rsa_signature.

Referenced by GNUNET_PQ_result_spec_unblinded_sig().

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

◆ clean_unblinded_sig()

static void clean_unblinded_sig ( void *  cls,
void *  rd 
)
static

Function called to clean up memory allocated by a GNUNET_PQ_ResultConverter.

Parameters
clsclosure
rdresult data to clean up

Definition at line 2391 of file pq_result_helper.c.

2393{
2394 struct GNUNET_CRYPTO_UnblindedSignature **ub_sig = rd;
2395
2396 (void) cls;
2398}
void GNUNET_CRYPTO_unblinded_sig_decref(struct GNUNET_CRYPTO_UnblindedSignature *ub_sig)
Decrement reference counter of a ub_sig, and free it if it reaches zero.

References GNUNET_CRYPTO_unblinded_sig_decref(), and rd.

Referenced by GNUNET_PQ_result_spec_unblinded_sig().

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

◆ GNUNET_PQ_result_spec_unblinded_sig()

struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_unblinded_sig ( const char *  name,
struct GNUNET_CRYPTO_UnblindedSignature **  ub_sig 
)

Unblinded signature expected.

Parameters
namename of the field in the table
[out]ub_sigwhere to store the unblinded signature
Returns
array entry for the result specification to use

Definition at line 2402 of file pq_result_helper.c.

2405{
2406 struct GNUNET_PQ_ResultSpec res = {
2408 .cleaner = &clean_unblinded_sig,
2409 .dst = (void *) ub_sig,
2410 .fname = name
2411 };
2412
2413 return res;
2414}
static enum GNUNET_GenericReturnValue extract_unblinded_sig(void *cls, PGresult *result, int row, const char *fname, size_t *dst_size, void *dst)
Extract data from a Postgres database result at row row.
static void clean_unblinded_sig(void *cls, void *rd)
Function called to clean up memory allocated by a GNUNET_PQ_ResultConverter.

References clean_unblinded_sig(), GNUNET_PQ_ResultSpec::conv, extract_unblinded_sig(), GNUNET_PQ_ResultSpec::fname, name, and res.

Here is the call graph for this function: