exchange

Base system with REST service to issue digital coins, run by the payment service provider
Log | Files | Refs | Submodules | README | LICENSE

sq_query_helper.c (5161B)


      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 "taler/platform.h"
     22 #include <sqlite3.h>
     23 #include <gnunet/gnunet_util_lib.h>
     24 #include <gnunet/gnunet_sq_lib.h>
     25 #include "taler/taler_sq_lib.h"
     26 
     27 
     28 /**
     29  * Function called to convert input argument into SQL parameters.
     30  *
     31  * @param cls closure
     32  * @param data pointer to input argument, here a `struct TALER_Amount`
     33  * @param data_len number of bytes in @a data (if applicable)
     34  * @param stmt sqlite statement to parameters for
     35  * @param off offset of the argument to bind in @a stmt, numbered from 1,
     36  *            so immediately suitable for passing to `sqlite3_bind`-functions.
     37  * @return #GNUNET_SYSERR on error, #GNUNET_OK on success
     38  */
     39 static enum GNUNET_GenericReturnValue
     40 qconv_amount (void *cls,
     41               const void *data,
     42               size_t data_len,
     43               sqlite3_stmt *stmt,
     44               unsigned int off)
     45 {
     46   const struct TALER_Amount *amount = data;
     47 
     48   (void) cls;
     49   GNUNET_assert (sizeof (struct TALER_Amount) == data_len);
     50   if (SQLITE_OK != sqlite3_bind_int64 (stmt,
     51                                        (int) off,
     52                                        (sqlite3_int64) amount->value))
     53     return GNUNET_SYSERR;
     54   if (SQLITE_OK != sqlite3_bind_int64 (stmt,
     55                                        (int) off + 1,
     56                                        (sqlite3_int64) amount->fraction))
     57     return GNUNET_SYSERR;
     58   return GNUNET_OK;
     59 }
     60 
     61 
     62 struct GNUNET_SQ_QueryParam
     63 TALER_SQ_query_param_amount (const struct TALER_Amount *x)
     64 {
     65   struct GNUNET_SQ_QueryParam res = {
     66     .conv = &qconv_amount,
     67     .data = x,
     68     .size = sizeof (*x),
     69     .num_params = 2
     70   };
     71 
     72   return res;
     73 }
     74 
     75 
     76 /**
     77  * Function called to convert input argument into SQL parameters.
     78  *
     79  * @param cls closure
     80  * @param data pointer to input argument, here a `struct TALER_AmountNBO`
     81  * @param data_len number of bytes in @a data (if applicable)
     82  * @param stmt sqlite statement to parameters for
     83  * @param off offset of the argument to bind in @a stmt, numbered from 1,
     84  *            so immediately suitable for passing to `sqlite3_bind`-functions.
     85  * @return #GNUNET_SYSERR on error, #GNUNET_OK on success
     86  */
     87 static enum GNUNET_GenericReturnValue
     88 qconv_amount_nbo (void *cls,
     89                   const void *data,
     90                   size_t data_len,
     91                   sqlite3_stmt *stmt,
     92                   unsigned int off)
     93 {
     94   const struct TALER_AmountNBO *amount = data;
     95   struct TALER_Amount amount_hbo;
     96 
     97   (void) cls;
     98   (void) data_len;
     99   TALER_amount_ntoh (&amount_hbo,
    100                      amount);
    101   return qconv_amount (cls,
    102                        &amount_hbo,
    103                        sizeof (struct TALER_Amount),
    104                        stmt,
    105                        off);
    106 }
    107 
    108 
    109 struct GNUNET_SQ_QueryParam
    110 TALER_SQ_query_param_amount_nbo (const struct TALER_AmountNBO *x)
    111 {
    112   struct GNUNET_SQ_QueryParam res = {
    113     .conv = &qconv_amount_nbo,
    114     .data = x,
    115     .size = sizeof (*x),
    116     .num_params = 2
    117   };
    118 
    119   return res;
    120 }
    121 
    122 
    123 /**
    124  * Function called to convert input argument into SQL parameters.
    125  *
    126  * @param cls closure
    127  * @param data pointer to input argument, here a `struct TALER_Amount`
    128  * @param data_len number of bytes in @a data (if applicable)
    129  * @param stmt sqlite statement to parameters for
    130  * @param off offset of the argument to bind in @a stmt, numbered from 1,
    131  *            so immediately suitable for passing to `sqlite3_bind`-functions.
    132  * @return #GNUNET_SYSERR on error, #GNUNET_OK on success
    133  */
    134 static enum GNUNET_GenericReturnValue
    135 qconv_json (void *cls,
    136             const void *data,
    137             size_t data_len,
    138             sqlite3_stmt *stmt,
    139             unsigned int off)
    140 {
    141   const json_t *json = data;
    142   char *str;
    143 
    144   (void) cls;
    145   (void) data_len;
    146   str = json_dumps (json, JSON_COMPACT);
    147   if (NULL == str)
    148     return GNUNET_SYSERR;
    149 
    150   if (SQLITE_OK != sqlite3_bind_text (stmt,
    151                                       (int) off,
    152                                       str,
    153                                       strlen (str),
    154                                       SQLITE_TRANSIENT))
    155     return GNUNET_SYSERR;
    156   GNUNET_free (str);
    157   return GNUNET_OK;
    158 }
    159 
    160 
    161 struct GNUNET_SQ_QueryParam
    162 TALER_SQ_query_param_json (const json_t *x)
    163 {
    164   struct GNUNET_SQ_QueryParam res = {
    165     .conv = &qconv_json,
    166     .data = x,
    167     .size = sizeof (*x),
    168     .num_params = 1
    169   };
    170 
    171   return res;
    172 }
    173 
    174 
    175 /* end of sq/sq_query_helper.c */