X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fsq%2Fsq_query_helper.c;h=94a3a3f1c868ae8d169f0f9f1ca4507e7e5ff5c9;hb=7e1a12e25b39cbd78569547054f576c1bce478b2;hp=613a0c746d6d2801652031d178d746556e55a534;hpb=3112e64ef06f71b06e9f047f2c6dd1be0941a565;p=oweals%2Fgnunet.git diff --git a/src/sq/sq_query_helper.c b/src/sq/sq_query_helper.c index 613a0c746..94a3a3f1c 100644 --- a/src/sq/sq_query_helper.c +++ b/src/sq/sq_query_helper.c @@ -18,9 +18,39 @@ * @brief helper functions for queries * @author Christian Grothoff */ +#include "platform.h" #include "gnunet_sq_lib.h" +/** + * Function called to convert input argument into SQL parameters. + * + * @param cls closure + * @param data pointer to input argument + * @param data_len number of bytes in @a data (if applicable) + * @param stmt sqlite statement to bind parameters for + * @param off offset of the argument to bind in @a stmt, numbered from 1, + * so immediately suitable for passing to `sqlite3_bind`-functions. + * @return #GNUNET_SYSERR on error, #GNUNET_OK on success + */ +static int +bind_fixed_blob (void *cls, + const void *data, + size_t data_len, + sqlite3_stmt *stmt, + unsigned int off) +{ + if (SQLITE_OK != + sqlite3_bind_blob64 (stmt, + (int) off, + data, + (sqlite3_uint64) data_len, + SQLITE_TRANSIENT)) + return GNUNET_SYSERR; + return GNUNET_OK; +} + + /** * Generate query parameter for a buffer @a ptr of * @a ptr_size bytes. @@ -32,6 +62,50 @@ struct GNUNET_SQ_QueryParam GNUNET_SQ_query_param_fixed_size (const void *ptr, size_t ptr_size) { + struct GNUNET_SQ_QueryParam qp = { + .conv = &bind_fixed_blob, + .data = ptr, + .size = ptr_size, + .num_params = 1 + }; + return qp; +} + + +/** + * Function called to convert input argument into SQL parameters. + * + * @param cls closure + * @param data pointer to input argument + * @param data_len number of bytes in @a data (if applicable) + * @param stmt sqlite statement to bind parameters for + * @param off offset of the argument to bind in @a stmt, numbered from 1, + * so immediately suitable for passing to `sqlite3_bind`-functions. + * @return #GNUNET_SYSERR on error, #GNUNET_OK on success + */ +static int +bind_string (void *cls, + const void *data, + size_t data_len, + sqlite3_stmt *stmt, + unsigned int off) +{ + if (NULL == data) + { + if (SQLITE_OK != + sqlite3_bind_null (stmt, + (int) off)) + return GNUNET_SYSERR; + return GNUNET_OK; + } + if (SQLITE_OK != + sqlite3_bind_text (stmt, + (int) off, + (const char *) data, + -1, + SQLITE_TRANSIENT)) + return GNUNET_SYSERR; + return GNUNET_OK; } @@ -43,6 +117,52 @@ GNUNET_SQ_query_param_fixed_size (const void *ptr, struct GNUNET_SQ_QueryParam GNUNET_SQ_query_param_string (const char *ptr) { + struct GNUNET_SQ_QueryParam qp = { + .conv = &bind_string, + .data = ptr, + .num_params = 1 + }; + return qp; +} + + +/** + * Function called to convert input argument into SQL parameters. + * + * @param cls closure + * @param data pointer to input argument + * @param data_len number of bytes in @a data (if applicable) + * @param stmt sqlite statement to bind parameters for + * @param off offset of the argument to bind in @a stmt, numbered from 1, + * so immediately suitable for passing to `sqlite3_bind`-functions. + * @return #GNUNET_SYSERR on error, #GNUNET_OK on success + */ +static int +bind_rsa_pub (void *cls, + const void *data, + size_t data_len, + sqlite3_stmt *stmt, + unsigned int off) +{ + const struct GNUNET_CRYPTO_RsaPublicKey *rsa = data; + char *buf; + size_t buf_size; + + GNUNET_break (NULL == cls); + buf_size = GNUNET_CRYPTO_rsa_public_key_encode (rsa, + &buf); + if (SQLITE_OK != + sqlite3_bind_blob64 (stmt, + (int) off, + buf, + (sqlite3_uint64) buf_size, + SQLITE_TRANSIENT)) + { + GNUNET_free (buf); + return GNUNET_SYSERR; + } + GNUNET_free (buf); + return GNUNET_OK; } @@ -55,6 +175,52 @@ GNUNET_SQ_query_param_string (const char *ptr) struct GNUNET_SQ_QueryParam GNUNET_SQ_query_param_rsa_public_key (const struct GNUNET_CRYPTO_RsaPublicKey *x) { + struct GNUNET_SQ_QueryParam qp = { + .conv = &bind_rsa_pub, + .data = x, + .num_params = 1 + }; + return qp; +} + + +/** + * Function called to convert input argument into SQL parameters. + * + * @param cls closure + * @param data pointer to input argument + * @param data_len number of bytes in @a data (if applicable) + * @param stmt sqlite statement to bind parameters for + * @param off offset of the argument to bind in @a stmt, numbered from 1, + * so immediately suitable for passing to `sqlite3_bind`-functions. + * @return #GNUNET_SYSERR on error, #GNUNET_OK on success + */ +static int +bind_rsa_sig (void *cls, + const void *data, + size_t data_len, + sqlite3_stmt *stmt, + unsigned int off) +{ + const struct GNUNET_CRYPTO_RsaSignature *sig = data; + char *buf; + size_t buf_size; + + GNUNET_break (NULL == cls); + buf_size = GNUNET_CRYPTO_rsa_signature_encode (sig, + &buf); + if (SQLITE_OK != + sqlite3_bind_blob64 (stmt, + (int) off, + buf, + (sqlite3_uint64) buf_size, + SQLITE_TRANSIENT)) + { + GNUNET_free (buf); + return GNUNET_SYSERR; + } + GNUNET_free (buf); + return GNUNET_OK; } @@ -67,6 +233,46 @@ GNUNET_SQ_query_param_rsa_public_key (const struct GNUNET_CRYPTO_RsaPublicKey *x struct GNUNET_SQ_QueryParam GNUNET_SQ_query_param_rsa_signature (const struct GNUNET_CRYPTO_RsaSignature *x) { + struct GNUNET_SQ_QueryParam qp = { + .conv = &bind_rsa_sig, + .data = x, + .num_params = 1 + }; + return qp; +} + + +/** + * Function called to convert input argument into SQL parameters. + * + * @param cls closure + * @param data pointer to input argument + * @param data_len number of bytes in @a data (if applicable) + * @param stmt sqlite statement to bind parameters for + * @param off offset of the argument to bind in @a stmt, numbered from 1, + * so immediately suitable for passing to `sqlite3_bind`-functions. + * @return #GNUNET_SYSERR on error, #GNUNET_OK on success + */ +static int +bind_abstime (void *cls, + const void *data, + size_t data_len, + sqlite3_stmt *stmt, + unsigned int off) +{ + const struct GNUNET_TIME_Absolute *u = data; + struct GNUNET_TIME_Absolute abs; + + abs = *u; + if (abs.abs_value_us > INT64_MAX) + abs.abs_value_us = INT64_MAX; + GNUNET_assert (sizeof (uint64_t) == data_len); + if (SQLITE_OK != + sqlite3_bind_int64 (stmt, + (int) off, + (sqlite3_int64) abs.abs_value_us)) + return GNUNET_SYSERR; + return GNUNET_OK; } @@ -79,6 +285,47 @@ GNUNET_SQ_query_param_rsa_signature (const struct GNUNET_CRYPTO_RsaSignature *x) struct GNUNET_SQ_QueryParam GNUNET_SQ_query_param_absolute_time (const struct GNUNET_TIME_Absolute *x) { + struct GNUNET_SQ_QueryParam qp = { + .conv = &bind_abstime, + .data = x, + .size = sizeof (struct GNUNET_TIME_Absolute), + .num_params = 1 + }; + return qp; +} + + +/** + * Function called to convert input argument into SQL parameters. + * + * @param cls closure + * @param data pointer to input argument + * @param data_len number of bytes in @a data (if applicable) + * @param stmt sqlite statement to bind parameters for + * @param off offset of the argument to bind in @a stmt, numbered from 1, + * so immediately suitable for passing to `sqlite3_bind`-functions. + * @return #GNUNET_SYSERR on error, #GNUNET_OK on success + */ +static int +bind_nbotime (void *cls, + const void *data, + size_t data_len, + sqlite3_stmt *stmt, + unsigned int off) +{ + const struct GNUNET_TIME_AbsoluteNBO *u = data; + struct GNUNET_TIME_Absolute abs; + + abs = GNUNET_TIME_absolute_ntoh (*u); + if (abs.abs_value_us > INT64_MAX) + abs.abs_value_us = INT64_MAX; + GNUNET_assert (sizeof (uint64_t) == data_len); + if (SQLITE_OK != + sqlite3_bind_int64 (stmt, + (int) off, + (sqlite3_int64) abs.abs_value_us)) + return GNUNET_SYSERR; + return GNUNET_OK; } @@ -91,6 +338,43 @@ GNUNET_SQ_query_param_absolute_time (const struct GNUNET_TIME_Absolute *x) struct GNUNET_SQ_QueryParam GNUNET_SQ_query_param_absolute_time_nbo (const struct GNUNET_TIME_AbsoluteNBO *x) { + struct GNUNET_SQ_QueryParam qp = { + .conv = &bind_nbotime, + .data = x, + .size = sizeof (struct GNUNET_TIME_AbsoluteNBO), + .num_params = 1 + }; + return qp; +} + + +/** + * Function called to convert input argument into SQL parameters. + * + * @param cls closure + * @param data pointer to input argument + * @param data_len number of bytes in @a data (if applicable) + * @param stmt sqlite statement to bind parameters for + * @param off offset of the argument to bind in @a stmt, numbered from 1, + * so immediately suitable for passing to `sqlite3_bind`-functions. + * @return #GNUNET_SYSERR on error, #GNUNET_OK on success + */ +static int +bind_u16 (void *cls, + const void *data, + size_t data_len, + sqlite3_stmt *stmt, + unsigned int off) +{ + const uint16_t *u = data; + + GNUNET_assert (sizeof (uint16_t) == data_len); + if (SQLITE_OK != + sqlite3_bind_int (stmt, + (int) off, + (int) *u)) + return GNUNET_SYSERR; + return GNUNET_OK; } @@ -102,9 +386,45 @@ GNUNET_SQ_query_param_absolute_time_nbo (const struct GNUNET_TIME_AbsoluteNBO *x struct GNUNET_SQ_QueryParam GNUNET_SQ_query_param_uint16 (const uint16_t *x) { + struct GNUNET_SQ_QueryParam qp = { + .conv = &bind_u16, + .data = x, + .size = sizeof (uint16_t), + .num_params = 1 + }; + return qp; } +/** + * Function called to convert input argument into SQL parameters. + * + * @param cls closure + * @param data pointer to input argument + * @param data_len number of bytes in @a data (if applicable) + * @param stmt sqlite statement to bind parameters for + * @param off offset of the argument to bind in @a stmt, numbered from 1, + * so immediately suitable for passing to `sqlite3_bind`-functions. + * @return #GNUNET_SYSERR on error, #GNUNET_OK on success + */ +static int +bind_u32 (void *cls, + const void *data, + size_t data_len, + sqlite3_stmt *stmt, + unsigned int off) +{ + const uint32_t *u = data; + + GNUNET_assert (sizeof (uint32_t) == data_len); + if (SQLITE_OK != + sqlite3_bind_int64 (stmt, + (int) off, + (sqlite3_int64) *u)) + return GNUNET_SYSERR; + return GNUNET_OK; +} + /** * Generate query parameter for an uint32_t in host byte order. * @@ -113,6 +433,43 @@ GNUNET_SQ_query_param_uint16 (const uint16_t *x) struct GNUNET_SQ_QueryParam GNUNET_SQ_query_param_uint32 (const uint32_t *x) { + struct GNUNET_SQ_QueryParam qp = { + .conv = &bind_u32, + .data = x, + .size = sizeof (uint32_t), + .num_params = 1 + }; + return qp; +} + + +/** + * Function called to convert input argument into SQL parameters. + * + * @param cls closure + * @param data pointer to input argument + * @param data_len number of bytes in @a data (if applicable) + * @param stmt sqlite statement to bind parameters for + * @param off offset of the argument to bind in @a stmt, numbered from 1, + * so immediately suitable for passing to `sqlite3_bind`-functions. + * @return #GNUNET_SYSERR on error, #GNUNET_OK on success + */ +static int +bind_u64 (void *cls, + const void *data, + size_t data_len, + sqlite3_stmt *stmt, + unsigned int off) +{ + const uint64_t *u = data; + + GNUNET_assert (sizeof (uint64_t) == data_len); + if (SQLITE_OK != + sqlite3_bind_int64 (stmt, + (int) off, + (sqlite3_int64) *u)) + return GNUNET_SYSERR; + return GNUNET_OK; } @@ -124,6 +481,13 @@ GNUNET_SQ_query_param_uint32 (const uint32_t *x) struct GNUNET_SQ_QueryParam GNUNET_SQ_query_param_uint64 (const uint64_t *x) { + struct GNUNET_SQ_QueryParam qp = { + .conv = &bind_u64, + .data = x, + .size = sizeof (uint64_t), + .num_params = 1 + }; + return qp; } /* end of sq_query_helper.c */