diff options
Diffstat (limited to 'src/sq')
-rw-r--r-- | src/sq/sq_query_helper.c | 163 | ||||
-rw-r--r-- | src/sq/sq_result_helper.c | 170 | ||||
-rw-r--r-- | src/sq/test_sq.c | 36 |
3 files changed, 50 insertions, 319 deletions
diff --git a/src/sq/sq_query_helper.c b/src/sq/sq_query_helper.c index e9070e147..711e63816 100644 --- a/src/sq/sq_query_helper.c +++ b/src/sq/sq_query_helper.c @@ -36,7 +36,7 @@ * so immediately suitable for passing to `sqlite3_bind`-functions. * @return #GNUNET_SYSERR on error, #GNUNET_OK on success */ -static int +static enum GNUNET_GenericReturnValue qconv_amount (void *cls, const void *data, size_t data_len, @@ -59,18 +59,16 @@ qconv_amount (void *cls, } -/** - * Generate query parameter for a currency, consisting of the - * components "value", "fraction" in this order. The - * types must be a 64-bit integer and a 64-bit integer. - * - * @param x pointer to the query parameter to pass - */ struct GNUNET_SQ_QueryParam TALER_SQ_query_param_amount (const struct TALER_Amount *x) { - struct GNUNET_SQ_QueryParam res = - { &qconv_amount, NULL, x, sizeof (*x), 2 }; + struct GNUNET_SQ_QueryParam res = { + .conv = &qconv_amount, + .data = x, + .size = sizeof (*x), + .num_params = 2 + }; + return res; } @@ -86,7 +84,7 @@ TALER_SQ_query_param_amount (const struct TALER_Amount *x) * so immediately suitable for passing to `sqlite3_bind`-functions. * @return #GNUNET_SYSERR on error, #GNUNET_OK on success */ -static int +static enum GNUNET_GenericReturnValue qconv_amount_nbo (void *cls, const void *data, size_t data_len, @@ -97,6 +95,7 @@ qconv_amount_nbo (void *cls, struct TALER_Amount amount_hbo; (void) cls; + (void) data_len; TALER_amount_ntoh (&amount_hbo, amount); return qconv_amount (cls, @@ -107,18 +106,16 @@ qconv_amount_nbo (void *cls, } -/** - * Generate query parameter for a currency, consisting of the - * components "value", "fraction" in this order. The - * types must be a 64-bit integer and a 64-bit integer. - * - * @param x pointer to the query parameter to pass - */ struct GNUNET_SQ_QueryParam TALER_SQ_query_param_amount_nbo (const struct TALER_AmountNBO *x) { - struct GNUNET_SQ_QueryParam res = - { &qconv_amount_nbo, NULL, x, sizeof (*x), 2 }; + struct GNUNET_SQ_QueryParam res = { + .conv = &qconv_amount_nbo, + .data = x, + .size = sizeof (*x), + .num_params = 2 + }; + return res; } @@ -134,7 +131,7 @@ TALER_SQ_query_param_amount_nbo (const struct TALER_AmountNBO *x) * so immediately suitable for passing to `sqlite3_bind`-functions. * @return #GNUNET_SYSERR on error, #GNUNET_OK on success */ -static int +static enum GNUNET_GenericReturnValue qconv_json (void *cls, const void *data, size_t data_len, @@ -153,7 +150,7 @@ qconv_json (void *cls, if (SQLITE_OK != sqlite3_bind_text (stmt, (int) off, str, - strlen (str) + 1, + strlen (str), SQLITE_TRANSIENT)) return GNUNET_SYSERR; GNUNET_free (str); @@ -161,126 +158,16 @@ qconv_json (void *cls, } -/** - * Generate query parameter for a JSON object (stored as a string - * in the DB). Note that @a x must really be a JSON object or array, - * passing just a value (string, integer) is not supported and will - * result in an abort. - * - * @param x pointer to the json object to pass - */ struct GNUNET_SQ_QueryParam TALER_SQ_query_param_json (const json_t *x) { - struct GNUNET_SQ_QueryParam res = - { &qconv_json, NULL, x, sizeof (*x), 1 }; - return res; -} - - -/** - * Function called to convert input argument into SQL parameters. - * - * @param cls closure - * @param data pointer to input argument, here a `struct TALER_Amount` - * @param data_len number of bytes in @a data (if applicable) - * @param stmt sqlite statement to 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 -qconv_round_time (void *cls, - const void *data, - size_t data_len, - sqlite3_stmt *stmt, - unsigned int off) -{ - const struct GNUNET_TIME_Absolute *at = data; - struct GNUNET_TIME_Absolute tmp; + struct GNUNET_SQ_QueryParam res = { + .conv = &qconv_json, + .data = x, + .size = sizeof (*x), + .num_params = 1 + }; - (void) cls; - GNUNET_assert (sizeof (struct GNUNET_TIME_AbsoluteNBO) == data_len); - GNUNET_break (NULL == cls); - tmp = *at; - GNUNET_assert (GNUNET_OK == - GNUNET_TIME_round_abs (&tmp)); - if (SQLITE_OK != sqlite3_bind_int64 (stmt, - (int) off, - (sqlite3_int64) at->abs_value_us)) - return GNUNET_SYSERR; - return GNUNET_OK; -} - - -/** - * Generate query parameter for an absolute time value. - * In contrast to - * #GNUNET_SQ_query_param_absolute_time(), this function - * will abort (!) if the time given is not rounded! - * The database must store a 64-bit integer. - * - * @param x pointer to the query parameter to pass - */ -struct GNUNET_SQ_QueryParam -TALER_SQ_query_param_absolute_time (const struct GNUNET_TIME_Absolute *x) -{ - struct GNUNET_SQ_QueryParam res = - { &qconv_round_time, NULL, x, sizeof (*x), 1 }; - return res; -} - - -/** - * Function called to convert input argument into SQL parameters. - * - * @param cls closure - * @param data pointer to input argument, here a `struct TALER_Amount` - * @param data_len number of bytes in @a data (if applicable) - * @param stmt sqlite statement to 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 -qconv_round_time_abs (void *cls, - const void *data, - size_t data_len, - sqlite3_stmt *stmt, - unsigned int off) -{ - const struct GNUNET_TIME_AbsoluteNBO *at = data; - struct GNUNET_TIME_Absolute tmp; - - (void) cls; - GNUNET_assert (sizeof (struct GNUNET_TIME_AbsoluteNBO) == data_len); - GNUNET_break (NULL == cls); - tmp = GNUNET_TIME_absolute_ntoh (*at); - GNUNET_assert (GNUNET_OK == - GNUNET_TIME_round_abs (&tmp)); - if (SQLITE_OK != sqlite3_bind_int64 (stmt, - (int) off, - (sqlite3_int64) tmp.abs_value_us)) - return GNUNET_SYSERR; - return GNUNET_OK; -} - - -/** - * Generate query parameter for an absolute time value. - * In contrast to - * #GNUNET_SQ_query_param_absolute_time(), this function - * will abort (!) if the time given is not rounded! - * The database must store a 64-bit integer. - * - * @param x pointer to the query parameter to pass - */ -struct GNUNET_SQ_QueryParam -TALER_SQ_query_param_absolute_time_nbo (const struct - GNUNET_TIME_AbsoluteNBO *x) -{ - struct GNUNET_SQ_QueryParam res = - { &qconv_round_time_abs, NULL, x, sizeof (*x), 1 }; return res; } diff --git a/src/sq/sq_result_helper.c b/src/sq/sq_result_helper.c index bc52913b5..9d80837bd 100644 --- a/src/sq/sq_result_helper.c +++ b/src/sq/sq_result_helper.c @@ -23,7 +23,7 @@ #include <gnunet/gnunet_util_lib.h> #include <gnunet/gnunet_sq_lib.h> #include "taler_sq_lib.h" -#include "taler_amount_lib.h" +#include "taler_util.h" /** @@ -38,7 +38,7 @@ * #GNUNET_YES if all results could be extracted * #GNUNET_SYSERR if a result was invalid (non-existing field or NULL) */ -static int +static enum GNUNET_GenericReturnValue extract_amount (void *cls, sqlite3_stmt *result, unsigned int column, @@ -68,13 +68,6 @@ extract_amount (void *cls, } -/** - * Currency amount expected. - * - * @param currency the currency to use for @a amount - * @param[out] amount where to store the result - * @return array entry for the result specification to use - */ struct GNUNET_SQ_ResultSpec TALER_SQ_result_spec_amount (const char *currency, struct TALER_Amount *amount) @@ -103,7 +96,7 @@ TALER_SQ_result_spec_amount (const char *currency, * #GNUNET_YES if all results could be extracted * #GNUNET_SYSERR if a result was invalid (non-existing field or NULL) */ -static int +static enum GNUNET_GenericReturnValue extract_amount_nbo (void *cls, sqlite3_stmt *result, unsigned int column, @@ -113,11 +106,15 @@ extract_amount_nbo (void *cls, struct TALER_AmountNBO *amount = dst; struct TALER_Amount amount_hbo; size_t amount_hbo_size = sizeof (struct TALER_Amount); - if (GNUNET_YES != extract_amount (cls, - result, - column, - &amount_hbo_size, - &amount_hbo)) + + (void) cls; + (void) dst_size; + if (GNUNET_YES != + extract_amount (cls, + result, + column, + &amount_hbo_size, + &amount_hbo)) { GNUNET_break (0); return GNUNET_SYSERR; @@ -128,13 +125,6 @@ extract_amount_nbo (void *cls, } -/** - * Currency amount expected. - * - * @param currency the currency to use for @a amount - * @param[out] amount where to store the result - * @return array entry for the result specification to use - */ struct GNUNET_SQ_ResultSpec TALER_SQ_result_spec_amount_nbo (const char *currency, struct TALER_AmountNBO *amount) @@ -163,7 +153,7 @@ TALER_SQ_result_spec_amount_nbo (const char *currency, * #GNUNET_YES if all results could be extracted * #GNUNET_SYSERR if a result was invalid (non-existing field or NULL) */ -static int +static enum GNUNET_GenericReturnValue extract_json (void *cls, sqlite3_stmt *result, unsigned int column, @@ -244,138 +234,4 @@ TALER_SQ_result_spec_json (json_t **jp) } -/** - * Extract amount data from a SQLite database - * - * @param cls closure - * @param result where to extract data from - * @param column column to extract data from - * @param[in,out] dst_size where to store size of result, may be NULL - * @param[out] dst where to store the result - * @return - * #GNUNET_YES if all results could be extracted - * #GNUNET_SYSERR if a result was invalid (non-existing field or NULL) - */ -static int -extract_round_time (void *cls, - sqlite3_stmt *result, - unsigned int column, - size_t *dst_size, - void *dst) -{ - struct GNUNET_TIME_Absolute *udst = dst; - struct GNUNET_TIME_Absolute tmp; - - (void) cls; - if (SQLITE_INTEGER != sqlite3_column_type (result, - (int) column)) - { - GNUNET_break (0); - return GNUNET_SYSERR; - } - GNUNET_assert (NULL != dst); - if (sizeof (struct GNUNET_TIME_Absolute) != *dst_size) - { - GNUNET_break (0); - return GNUNET_SYSERR; - } - tmp.abs_value_us = sqlite3_column_int64 (result, - (int) column); - GNUNET_break (GNUNET_OK == - GNUNET_TIME_round_abs (&tmp)); - *udst = tmp; - return GNUNET_OK; -} - - -/** - * Rounded absolute time expected. - * In contrast to #GNUNET_SQ_query_param_absolute_time_nbo(), - * this function ensures that the result is rounded and can - * be converted to JSON. - * - * @param[out] at where to store the result - * @return array entry for the result specification to use - */ -struct GNUNET_SQ_ResultSpec -TALER_SQ_result_spec_absolute_time (struct GNUNET_TIME_Absolute *at) -{ - struct GNUNET_SQ_ResultSpec res = { - .conv = &extract_round_time, - .dst = (void *) at, - .dst_size = sizeof (struct GNUNET_TIME_Absolute), - .num_params = 1 - }; - - return res; -} - - -/** - * Extract amount data from a SQLite database - * - * @param cls closure - * @param result where to extract data from - * @param column column to extract data from - * @param[in,out] dst_size where to store size of result, may be NULL - * @param[out] dst where to store the result - * @return - * #GNUNET_YES if all results could be extracted - * #GNUNET_SYSERR if a result was invalid (non-existing field or NULL) - */ -static int -extract_round_time_nbo (void *cls, - sqlite3_stmt *result, - unsigned int column, - size_t *dst_size, - void *dst) -{ - struct GNUNET_TIME_AbsoluteNBO *udst = dst; - struct GNUNET_TIME_Absolute tmp; - - (void) cls; - if (SQLITE_INTEGER != sqlite3_column_type (result, - (int) column)) - { - GNUNET_break (0); - return GNUNET_SYSERR; - } - GNUNET_assert (NULL != dst); - if (sizeof (struct GNUNET_TIME_AbsoluteNBO) != *dst_size) - { - GNUNET_break (0); - return GNUNET_SYSERR; - } - tmp.abs_value_us = sqlite3_column_int64 (result, - (int) column); - GNUNET_break (GNUNET_OK == - GNUNET_TIME_round_abs (&tmp)); - *udst = GNUNET_TIME_absolute_hton (tmp); - return GNUNET_OK; -} - - -/** - * Rounded absolute time expected. - * In contrast to #GNUNET_SQ_result_spec_absolute_time_nbo(), - * this function ensures that the result is rounded and can - * be converted to JSON. - * - * @param[out] at where to store the result - * @return array entry for the result specification to use - */ -struct GNUNET_SQ_ResultSpec -TALER_SQ_result_spec_absolute_time_nbo (struct GNUNET_TIME_AbsoluteNBO *at) -{ - struct GNUNET_SQ_ResultSpec res = { - .conv = &extract_round_time_nbo, - .dst = (void *) at, - .dst_size = sizeof (struct GNUNET_TIME_AbsoluteNBO), - .num_params = 1 - }; - - return res; -} - - /* end of sq/sq_result_helper.c */ diff --git a/src/sq/test_sq.c b/src/sq/test_sq.c index 308b65b06..8f464faf3 100644 --- a/src/sq/test_sq.c +++ b/src/sq/test_sq.c @@ -33,8 +33,6 @@ run_queries (sqlite3 *db) struct TALER_Amount hamount; struct TALER_AmountNBO namount; json_t *json; - struct GNUNET_TIME_Absolute htime = GNUNET_TIME_absolute_get (); - struct GNUNET_TIME_AbsoluteNBO ntime; sqlite3_stmt *test_insert; sqlite3_stmt *test_select; struct GNUNET_SQ_PrepareStatement ps[] = { @@ -44,10 +42,8 @@ run_queries (sqlite3 *db) ",namount_val" ",namount_frac" ",json" - ",htime" - ",ntime" ") VALUES " - "($1, $2, $3, $4, $5, $6, $7)", + "($1, $2, $3, $4, $5)", &test_insert), GNUNET_SQ_make_prepare ("SELECT" " hamount_val" @@ -55,8 +51,6 @@ run_queries (sqlite3 *db) ",namount_val" ",namount_frac" ",json" - ",htime" - ",ntime" " FROM test_sq", &test_select), GNUNET_SQ_PREPARE_END @@ -69,21 +63,21 @@ run_queries (sqlite3 *db) TALER_amount_hton (&namount, &hamount); json = json_object (); - json_object_set_new (json, "foo", json_integer (42)); GNUNET_assert (NULL != json); - GNUNET_TIME_round_abs (&htime); - ntime = GNUNET_TIME_absolute_hton (htime); - - GNUNET_assert (GNUNET_OK == GNUNET_SQ_prepare (db, - ps)); + GNUNET_assert (0 == + json_object_set_new (json, + "foo", + json_integer (42))); + GNUNET_assert (NULL != json); + GNUNET_assert (GNUNET_OK == + GNUNET_SQ_prepare (db, + ps)); { struct GNUNET_SQ_QueryParam params_insert[] = { TALER_SQ_query_param_amount (&hamount), TALER_SQ_query_param_amount_nbo (&namount), TALER_SQ_query_param_json (json), - TALER_SQ_query_param_absolute_time (&htime), - TALER_SQ_query_param_absolute_time_nbo (&ntime), GNUNET_SQ_query_param_end }; GNUNET_SQ_reset (db, @@ -99,8 +93,6 @@ run_queries (sqlite3 *db) struct TALER_AmountNBO nresult_amount; struct TALER_Amount nresult_amount_converted; json_t *result_json; - struct GNUNET_TIME_Absolute hresult_time; - struct GNUNET_TIME_AbsoluteNBO nresult_time; struct GNUNET_SQ_QueryParam params_select[] = { GNUNET_SQ_query_param_end }; @@ -110,8 +102,6 @@ run_queries (sqlite3 *db) TALER_SQ_result_spec_amount_nbo ("EUR", &nresult_amount), TALER_SQ_result_spec_json (&result_json), - TALER_SQ_result_spec_absolute_time (&hresult_time), - TALER_SQ_result_spec_absolute_time_nbo (&nresult_time), GNUNET_SQ_result_spec_end }; @@ -134,9 +124,7 @@ run_queries (sqlite3 *db) (0 != TALER_amount_cmp (&hamount, &nresult_amount_converted)) || (1 != json_equal (json, - result_json)) || - (htime.abs_value_us != hresult_time.abs_value_us) || - (ntime.abs_value_us__ != nresult_time.abs_value_us__)) + result_json)) ) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Result from database doesn't match input\n"); @@ -162,14 +150,14 @@ main (int argc, ",namount_val INT8 NOT NULL" ",namount_frac INT8 NOT NULL" ",json VARCHAR NOT NULL" - ",htime INT8 NOT NULL" - ",ntime INT8 NOT NULL" ")"), GNUNET_SQ_EXECUTE_STATEMENT_END }; sqlite3 *db; int ret; + (void) argc; + (void) argv; GNUNET_log_setup ("test-pq", "WARNING", NULL); |