summaryrefslogtreecommitdiff
path: root/src/sq/sq_query_helper.c
diff options
context:
space:
mode:
authorJonathan Buchanan <jonathan.russ.buchanan@gmail.com>2020-06-02 14:20:55 -0400
committerChristian Grothoff <christian@grothoff.org>2020-07-05 16:50:13 +0200
commit83319e1782da625a0a323bd5cfbf9b155e929a06 (patch)
treebcd4d4fc00da2595a8d3171412e0f375571e3c61 /src/sq/sq_query_helper.c
parentef0e79927cbd64832b7351074cf71853212a331b (diff)
downloadexchange-83319e1782da625a0a323bd5cfbf9b155e929a06.tar.gz
exchange-83319e1782da625a0a323bd5cfbf9b155e929a06.tar.bz2
exchange-83319e1782da625a0a323bd5cfbf9b155e929a06.zip
implemented the other functions for taler_sq_lib
Diffstat (limited to 'src/sq/sq_query_helper.c')
-rw-r--r--src/sq/sq_query_helper.c216
1 files changed, 215 insertions, 1 deletions
diff --git a/src/sq/sq_query_helper.c b/src/sq/sq_query_helper.c
index 8116622a5..8e3853553 100644
--- a/src/sq/sq_query_helper.c
+++ b/src/sq/sq_query_helper.c
@@ -45,6 +45,7 @@ qconv_amount_nbo (void *cls,
{
const struct TALER_AmountNBO *amount = data;
+ (void) cls;
GNUNET_assert (sizeof (struct TALER_AmountNBO) == data_len);
if (SQLITE_OK != sqlite3_bind_int64 (stmt,
(int) off,
@@ -59,7 +60,7 @@ qconv_amount_nbo (void *cls,
/**
- * Generate query parameter for a currency, consisting of the three
+ * 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.
*
@@ -74,4 +75,217 @@ TALER_SQ_query_param_amount_nbo (const struct TALER_AmountNBO *x)
}
+/**
+ * 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_amount (void *cls,
+ const void *data,
+ size_t data_len,
+ sqlite3_stmt *stmt,
+ unsigned int off)
+{
+ const struct TALER_Amount *amount_hbo = data;
+ struct TALER_AmountNBO amount;
+
+ (void) cls;
+ GNUNET_assert (sizeof (struct TALER_AmountNBO) == data_len);
+ TALER_amount_hton (&amount,
+ amount_hbo);
+ return qconv_amount_nbo (cls,
+ &amount,
+ sizeof (struct TALER_AmountNBO),
+ stmt,
+ off);
+}
+
+
+/**
+ * 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 };
+ 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_json (void *cls,
+ const void *data,
+ size_t data_len,
+ sqlite3_stmt *stmt,
+ unsigned int off)
+{
+ const json_t *json = data;
+ char *str;
+
+ (void) cls;
+ (void) data_len;
+ str = json_dumps (json, JSON_COMPACT);
+ if (NULL == str)
+ return GNUNET_SYSERR;
+
+ if (SQLITE_OK != sqlite3_bind_text (stmt,
+ (int) off,
+ str,
+ strlen (str) + 1,
+ SQLITE_TRANSIENT))
+ return GNUNET_SYSERR;
+ GNUNET_free (str);
+ return GNUNET_OK;
+}
+
+
+/**
+ * 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_TIME_AbsoluteNBO buf;
+
+ (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));
+ buf = GNUNET_TIME_absolute_hton (tmp);
+ if (SQLITE_OK != sqlite3_bind_int64 (stmt,
+ (int) off,
+ (sqlite3_int64) buf.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) 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_nbo (const struct
+ GNUNET_TIME_AbsoluteNBO *x)
+{
+ struct GNUNET_SQ_QueryParam res =
+ { &qconv_round_time_abs, NULL, x, sizeof (*x), 1 };
+ return res;
+}
+
+
/* end of sq/sq_query_helper.c */