From bbd7f90332fa9df514cb14bb24f2187c78db432a Mon Sep 17 00:00:00 2001 From: Christophe Genevey Metat Date: Fri, 20 May 2016 15:29:50 +0000 Subject: libgnunetmy query helper --- po/POTFILES.in | 1 + src/include/gnunet_my_lib.h | 79 ++++++++++++- src/my/my.c | 18 +-- src/my/my_query_helper.c | 283 +++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 367 insertions(+), 14 deletions(-) diff --git a/po/POTFILES.in b/po/POTFILES.in index 7e20cb025..a31609cdd 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -227,6 +227,7 @@ src/multicast/gnunet-service-multicast.c src/multicast/multicast_api.c src/my/my.c src/my/my_query_helper.c +src/my/my_result_helper.c src/mysql/mysql.c src/namecache/gnunet-namecache.c src/namecache/gnunet-service-namecache.c diff --git a/src/include/gnunet_my_lib.h b/src/include/gnunet_my_lib.h index 9a26022c8..8d60bf78c 100644 --- a/src/include/gnunet_my_lib.h +++ b/src/include/gnunet_my_lib.h @@ -120,7 +120,6 @@ struct GNUNET_MY_QueryParam GNUNET_MY_query_param_fixed_size (const void *ptr, size_t ptr_size); - /** * Run a prepared SELECT statement. * @@ -212,6 +211,84 @@ struct GNUNET_MY_ResultSpec GNUNET_MY_result_spec_fixed_size (void *ptr, size_t ptr_size); +/** + * Generate query parameter for a string + * + *@param ptr pointer to the string query parameter to pass + */ +struct GNUNET_MY_QueryParam +GNUNET_MY_query_param_string (const char *ptr); + +/** + * Generate fixed-size query parameter with size determined + * by variable type. + * + * @param x pointer to the query parameter to pass + */ +#define GNUNET_MY_query_param_auto_from_type(x) GNUNET_MY_query_param_fixed_size ((x), sizeof (*(x))) + +/** + * Generate query parameter for an RSA public key. The + * database must contain a BLOB type in the respective position. + * + * @param x the query parameter to pass + * @return array entry for the query parameters to use + */ +struct GNUNET_MY_QueryParam +GNUNET_MY_query_param_rsa_public_key (const struct GNUNET_CRYPTO_RsaPublicKey *x); + +/** + * Generate query parameter for an RSA signature. The + * database must contain a BLOB type in the respective position + * + *@param x the query parameter to pass + *@return array entry for the query parameters to use + */ +struct GNUNET_MY_QueryParam +GNUNET_MY_query_param_rsa_signature (const struct GNUNET_CRYPTO_RsaSignature *x); + +/** + * Generate query parameter for an absolute time value. + * The database must store a 64-bit integer. + * + *@param x pointer to the query parameter to pass + *@return array entry for the query parameters to use + */ +struct GNUNET_MY_QueryParam +GNUNET_MY_query_param_absolute_time (const struct GNUNET_TIME_Absolute *x); + +/** + * Generate query parameter for an absolute time value. + * The database must store a 64-bit integer. + * + *@param x pointer to the query parameter to pass + */ +struct GNUNET_MY_QueryParam +GNUNET_MY_query_param_absolute_time_nbo (const struct GNUNET_TIME_AbsoluteNBO *x); + +/** + * Generate query parameter for an uint16_t in host byte order. + * + * @param x pointer to the query parameter to pass + */ +struct GNUNET_MY_QueryParam +GNUNET_MY_query_param_uint16 (const uint16_t *x); + +/** + * Generate query parameter for an uint32_t in host byte order + * + *@param x pointer to the query parameter to pass + */ +struct GNUNET_MY_QueryParam +GNUNET_MY_query_param_uint32 (const uint32_t *x); + +/** + * Generate query parameter for an uint64_t in host byte order + * + *@param x pointer to the query parameter to pass + */ +struct GNUNET_MY_QueryParam +GNUNET_MY_query_param_uint64 (const uint64_t *x); /** * We expect a fixed-size result, with size determined by the type of `* dst` diff --git a/src/my/my.c b/src/my/my.c index 71d30dd16..89d8c3370 100644 --- a/src/my/my.c +++ b/src/my/my.c @@ -109,30 +109,30 @@ GNUNET_MY_extract_result (MYSQL_BIND * result, int row, struct GNUNET_MY_ResultSpec *specs) { - unsigned int i ; - int had_null = GNUNET_NO ; - int ret ; + unsigned int i; + int had_null = GNUNET_NO; + int ret; for(i = 0 ; NULL != specs[i].conv ; i++) { - struct GNUNET_MY_ResultSpec * spec ; + struct GNUNET_MY_ResultSpec *spec; - spec = &specs[i] ; + spec = &specs[i]; ret = spec->conv(spec->conv_cls, NULL, //wait GNUNET_MY_QueryParam result); if(ret == GNUNET_SYSERR) - return GNUNET_SYSERR ; + return GNUNET_SYSERR; if(spec->result_size != NULL) *spec->result_size = spec->dst_size; } if(GNUNET_YES == had_null) - return GNUNET_NO ; + return GNUNET_NO; - return GNUNET_OK ; + return GNUNET_OK; } -/* end of my.c */ +/* end of my.c */ \ No newline at end of file diff --git a/src/my/my_query_helper.c b/src/my/my_query_helper.c index 057c32d9f..3b5d90179 100644 --- a/src/my/my_query_helper.c +++ b/src/my/my_query_helper.c @@ -36,7 +36,7 @@ * @return -1 on error */ static int -pq_conv_fixed_size (void *cls, +my_conv_fixed_size (void *cls, const struct GNUNET_MY_QueryParam *qp, MYSQL_BIND *qbind) { @@ -53,14 +53,14 @@ pq_conv_fixed_size (void *cls, * @a ptr_size bytes. * * @param ptr pointer to the query parameter to pass - * @oaran ptr_size number of bytes in @a ptr + * @param ptr_size number of bytes in @a ptr */ struct GNUNET_MY_QueryParam GNUNET_MY_query_param_fixed_size (const void *ptr, size_t ptr_size) { struct GNUNET_MY_QueryParam qp = { - &pq_conv_fixed_size, + &my_conv_fixed_size, NULL, 1, ptr, @@ -70,4 +70,279 @@ GNUNET_MY_query_param_fixed_size (const void *ptr, } -/* end of my_query_helper.c */ +/** + * Generate query parameter for a string + * + *@param ptr pointer to the string query parameter to pass + */ +struct GNUNET_MY_QueryParam +GNUNET_MY_query_param_string (const char *ptr) +{ + return GNUNET_MY_query_param_fixed_size(ptr, + strlen(ptr)); +} + +/** + * Function called to convert input argument into SQL parameters + * + *@param cls closure + *@param pq data about the query + * @param qbind array of parameters to initialize + *@return -1 on error + */ +static int +my_conv_uint16 (void *cls, + const struct GNUNET_MY_QueryParam * qp, + MYSQL_BIND *qbind) +{ + const uint16_t *u_hbo = qp->data; + uint16_t *u_nbo; + + GNUNET_assert (1 == qp->num_params); + + u_nbo = GNUNET_new (uint16_t); + *u_nbo = htons (*u_hbo); + qbind->buffer = (void *) u_nbo; + qbind->buffer_length = sizeof(uint16_t); + qbind->buffer_type = 1; + + return 1; +} + +/** + * Generate query parameter for an uint16_t in host byte order. + * + * @param x pointer to the query parameter to pass + */ +struct GNUNET_MY_QueryParam +GNUNET_MY_query_param_uint16 (const uint16_t *x) +{ + struct GNUNET_MY_QueryParam res = { + &my_conv_uint16, + NULL, + 1, + x, + sizeof (*x) + }; + + return res; +} + +/** + * Function called to convert input argument into SQL parameters + * + *@param cls closure + *@param pq data about the query + * @param qbind array of parameters to initialize + *@return -1 on error + */ +static int +my_conv_uint32 (void *cls, + const struct GNUNET_MY_QueryParam *qp, + MYSQL_BIND *qbind) +{ + const uint32_t *u_hbo = qp->data; + uint32_t * u_nbo; + + GNUNET_assert (1 == qp->num_params); + + u_nbo = GNUNET_new (uint32_t); + *u_nbo = htonl (*u_hbo); + + qbind->buffer = (void *) u_nbo; + qbind->buffer_length = sizeof(uint32_t); + qbind->buffer_type = 1; + + return 1; +} + +/** + * Generate query parameter for an uint32_t in host byte order + * + *@param x pointer to the query parameter to pass + */ +struct GNUNET_MY_QueryParam +GNUNET_MY_query_param_uint32 (const uint32_t *x) +{ + struct GNUNET_MY_QueryParam res = { + &my_conv_uint32, + NULL, + 1, + x, + sizeof (*x) + }; + + return res; +} + +/** + * Function called to convert input argument into SQL parameters + * + *@param cls closure + *@param pq data about the query + * @param qbind array of parameters to initialize + *@return -1 on error + */ +static int +my_conv_uint64 (void *cls, + const struct GNUNET_MY_QueryParam *qp, + MYSQL_BIND * qbind) +{ + const uint64_t * u_hbo = qp->data; + uint64_t *u_nbo; + + GNUNET_assert (1 == qp->num_params); + + u_nbo = GNUNET_new(uint64_t); + *u_nbo = GNUNET_htonll (*u_hbo); + + qbind->buffer = (void *) u_nbo; + qbind->buffer_length = sizeof (uint64_t); + qbind->buffer_type = 1; + + return 1; +} + +/** + * Generate query parameter for an uint64_t in host byte order + * + *@param x pointer to the query parameter to pass + */ +struct GNUNET_MY_QueryParam +GNUNET_MY_query_param_uint64 (const uint64_t *x) +{ + struct GNUNET_MY_QueryParam res = { + &my_conv_uint64, + NULL, + 1, + x, + sizeof(*x) + }; + + return res; +} + +/** + * Function called to convert input argument into SQL parameters + * + *@param cls closure + *@param pq data about the query + * @param qbind array of parameters to initialize + *@return -1 on error + */ +static int +my_conv_rsa_public_key (void *cls, + const struct GNUNET_MY_QueryParam *qp, + MYSQL_BIND * qbind) + { + const struct GNUNET_CRYPTO_RsaPublicKey *rsa = qp->data; + char *buf; + size_t buf_size; + + GNUNET_assert(1 == qp->num_params); + + buf_size = GNUNET_CRYPTO_rsa_public_key_encode (rsa, &buf); + + qbind->buffer = (void *)buf; + qbind->buffer_length = buf_size - 1; + qbind->buffer_type = 1; + + return 1; + } + + /** + * Generate query parameter for an RSA public key. The + * database must contain a BLOB type in the respective position. + * + * @param x the query parameter to pass + * @return array entry for the query parameters to use + */ +struct GNUNET_MY_QueryParam +GNUNET_MY_query_param_rsa_public_key (const struct GNUNET_CRYPTO_RsaPublicKey *x) +{ + struct GNUNET_MY_QueryParam res = { + &my_conv_rsa_public_key, + NULL, + 1, + x, + 0 + }; + + return res; +} + +/** + * Function called to convert input argument into SQL parameters + * + *@param cls closure + *@param pq data about the query + * @param qbind array of parameters to initialize + *@return -1 on error + */ +static int +my_conv_rsa_signature (void *cls, + const struct GNUNET_MY_QueryParam *qp, + MYSQL_BIND * qbind) +{ + const struct GNUNET_CRYPTO_RsaSignature *sig = qp->data; + char *buf; + size_t buf_size; + + GNUNET_assert(1 == qp->num_params); + + buf_size = GNUNET_CRYPTO_rsa_signature_encode(sig, + &buf); + + qbind->buffer = (void *)buf; + qbind->buffer_length = buf_size - 1; + qbind->buffer_type = 1; + + return 1; +} + +/** + * Generate query parameter for an RSA signature. The + * database must contain a BLOB type in the respective position + * + *@param x the query parameter to pass + *@return array entry for the query parameters to use + */ +struct GNUNET_MY_QueryParam +GNUNET_MY_query_param_rsa_signature (const struct GNUNET_CRYPTO_RsaSignature *x) +{ + struct GNUNET_MY_QueryParam res = { + &my_conv_rsa_signature, + NULL, + 1, + (x), + 0 + }; + return res; +} + +/** + * Generate query parameter for an absolute time value. + * The database must store a 64-bit integer. + * + *@param x pointer to the query parameter to pass + *@return array entry for the query parameters to use + */ +struct GNUNET_MY_QueryParam +GNUNET_MY_query_param_absolute_time (const struct GNUNET_TIME_Absolute *x) +{ + return GNUNET_MY_query_param_uint64 (&x->abs_value_us); +} + +/** + * Generate query parameter for an absolute time value. + * The database must store a 64-bit integer. + * + *@param x pointer to the query parameter to pass + */ +struct GNUNET_MY_QueryParam +GNUNET_MY_query_param_absolute_time_nbo (const struct GNUNET_TIME_AbsoluteNBO *x) +{ + return GNUNET_MY_query_param_auto_from_type (&x->abs_value_us__); +} + +/* end of my_query_helper.c */ \ No newline at end of file -- cgit v1.2.3