sq_query_helper.c (5133B)
1 /* 2 This file is part of TALER 3 Copyright (C) 2020 Taler Systems SA 4 5 TALER is free software; you can redistribute it and/or modify it under the 6 terms of the GNU General Public License as published by the Free Software 7 Foundation; either version 3, or (at your option) any later version. 8 9 TALER is distributed in the hope that it will be useful, but WITHOUT ANY 10 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR 11 A PARTICULAR PURPOSE. See the GNU General Public License for more details. 12 13 You should have received a copy of the GNU General Public License along with 14 TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/> 15 */ 16 /** 17 * @file sq/sq_query_helper.c 18 * @brief helper functions for Taler-specific SQLite3 interactions 19 * @author Jonathan Buchanan 20 */ 21 #include <sqlite3.h> 22 #include <gnunet/gnunet_util_lib.h> 23 #include <gnunet/gnunet_sq_lib.h> 24 #include "taler/taler_sq_lib.h" 25 26 27 /** 28 * Function called to convert input argument into SQL parameters. 29 * 30 * @param cls closure 31 * @param data pointer to input argument, here a `struct TALER_Amount` 32 * @param data_len number of bytes in @a data (if applicable) 33 * @param stmt sqlite statement to parameters for 34 * @param off offset of the argument to bind in @a stmt, numbered from 1, 35 * so immediately suitable for passing to `sqlite3_bind`-functions. 36 * @return #GNUNET_SYSERR on error, #GNUNET_OK on success 37 */ 38 static enum GNUNET_GenericReturnValue 39 qconv_amount (void *cls, 40 const void *data, 41 size_t data_len, 42 sqlite3_stmt *stmt, 43 unsigned int off) 44 { 45 const struct TALER_Amount *amount = data; 46 47 (void) cls; 48 GNUNET_assert (sizeof (struct TALER_Amount) == data_len); 49 if (SQLITE_OK != sqlite3_bind_int64 (stmt, 50 (int) off, 51 (sqlite3_int64) amount->value)) 52 return GNUNET_SYSERR; 53 if (SQLITE_OK != sqlite3_bind_int64 (stmt, 54 (int) off + 1, 55 (sqlite3_int64) amount->fraction)) 56 return GNUNET_SYSERR; 57 return GNUNET_OK; 58 } 59 60 61 struct GNUNET_SQ_QueryParam 62 TALER_SQ_query_param_amount (const struct TALER_Amount *x) 63 { 64 struct GNUNET_SQ_QueryParam res = { 65 .conv = &qconv_amount, 66 .data = x, 67 .size = sizeof (*x), 68 .num_params = 2 69 }; 70 71 return res; 72 } 73 74 75 /** 76 * Function called to convert input argument into SQL parameters. 77 * 78 * @param cls closure 79 * @param data pointer to input argument, here a `struct TALER_AmountNBO` 80 * @param data_len number of bytes in @a data (if applicable) 81 * @param stmt sqlite statement to parameters for 82 * @param off offset of the argument to bind in @a stmt, numbered from 1, 83 * so immediately suitable for passing to `sqlite3_bind`-functions. 84 * @return #GNUNET_SYSERR on error, #GNUNET_OK on success 85 */ 86 static enum GNUNET_GenericReturnValue 87 qconv_amount_nbo (void *cls, 88 const void *data, 89 size_t data_len, 90 sqlite3_stmt *stmt, 91 unsigned int off) 92 { 93 const struct TALER_AmountNBO *amount = data; 94 struct TALER_Amount amount_hbo; 95 96 (void) cls; 97 (void) data_len; 98 TALER_amount_ntoh (&amount_hbo, 99 amount); 100 return qconv_amount (cls, 101 &amount_hbo, 102 sizeof (struct TALER_Amount), 103 stmt, 104 off); 105 } 106 107 108 struct GNUNET_SQ_QueryParam 109 TALER_SQ_query_param_amount_nbo (const struct TALER_AmountNBO *x) 110 { 111 struct GNUNET_SQ_QueryParam res = { 112 .conv = &qconv_amount_nbo, 113 .data = x, 114 .size = sizeof (*x), 115 .num_params = 2 116 }; 117 118 return res; 119 } 120 121 122 /** 123 * Function called to convert input argument into SQL parameters. 124 * 125 * @param cls closure 126 * @param data pointer to input argument, here a `struct TALER_Amount` 127 * @param data_len number of bytes in @a data (if applicable) 128 * @param stmt sqlite statement to parameters for 129 * @param off offset of the argument to bind in @a stmt, numbered from 1, 130 * so immediately suitable for passing to `sqlite3_bind`-functions. 131 * @return #GNUNET_SYSERR on error, #GNUNET_OK on success 132 */ 133 static enum GNUNET_GenericReturnValue 134 qconv_json (void *cls, 135 const void *data, 136 size_t data_len, 137 sqlite3_stmt *stmt, 138 unsigned int off) 139 { 140 const json_t *json = data; 141 char *str; 142 143 (void) cls; 144 (void) data_len; 145 str = json_dumps (json, JSON_COMPACT); 146 if (NULL == str) 147 return GNUNET_SYSERR; 148 149 if (SQLITE_OK != sqlite3_bind_text (stmt, 150 (int) off, 151 str, 152 strlen (str), 153 SQLITE_TRANSIENT)) 154 return GNUNET_SYSERR; 155 GNUNET_free (str); 156 return GNUNET_OK; 157 } 158 159 160 struct GNUNET_SQ_QueryParam 161 TALER_SQ_query_param_json (const json_t *x) 162 { 163 struct GNUNET_SQ_QueryParam res = { 164 .conv = &qconv_json, 165 .data = x, 166 .size = sizeof (*x), 167 .num_params = 1 168 }; 169 170 return res; 171 } 172 173 174 /* end of sq/sq_query_helper.c */