diff options
author | Christian Grothoff <christian@grothoff.org> | 2021-12-14 16:04:32 +0100 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2021-12-14 16:04:40 +0100 |
commit | 1a1fafbd438f3f21a15c990d904e192b045d2391 (patch) | |
tree | cdd32023fd1d7c530caeae0487528d7eaac2aa29 /src/sq | |
parent | bf54ee30d4727217264f470321cc2f91facf63cc (diff) |
introducing GNUNET_TIME_Timestamp, recoup now with amounts
Diffstat (limited to 'src/sq')
-rw-r--r-- | src/sq/sq_query_helper.c | 160 | ||||
-rw-r--r-- | src/sq/sq_result_helper.c | 154 |
2 files changed, 26 insertions, 288 deletions
diff --git a/src/sq/sq_query_helper.c b/src/sq/sq_query_helper.c index ad5207e27..d4b2d060d 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, @@ -108,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; } @@ -135,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, @@ -162,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; - - (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; -} + struct GNUNET_SQ_QueryParam res = { + .conv = &qconv_json, + .data = x, + .size = sizeof (*x), + .num_params = 1 + }; - -/** - * 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 7cd8e80b4..bacb7743a 100644 --- a/src/sq/sq_result_helper.c +++ b/src/sq/sq_result_helper.c @@ -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, @@ -132,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) @@ -167,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, @@ -248,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 */ |