insert_product.c (4539B)
1 /* 2 This file is part of TALER 3 Copyright (C) 2022-2025 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 src/backenddb/insert_product.c 18 * @brief Implementation of the insert_product function for Postgres 19 * @author Christian Grothoff 20 * @author Iván Ávalos 21 */ 22 #include "platform.h" 23 #include <taler/taler_pq_lib.h> 24 #include "merchant-database/insert_product.h" 25 #include "helper.h" 26 27 28 enum GNUNET_DB_QueryStatus 29 TALER_MERCHANTDB_insert_product ( 30 struct TALER_MERCHANTDB_PostgresContext *pg, 31 const char *instance_id, 32 const char *product_id, 33 const struct TALER_MERCHANTDB_ProductDetails *pd, 34 size_t num_cats, 35 const uint64_t *cats, 36 bool *conflict, 37 ssize_t *no_cat, 38 bool *no_group, 39 bool *no_pot, 40 bool *no_unit) 41 { 42 struct GNUNET_PQ_QueryParam params[] = { 43 GNUNET_PQ_query_param_string (product_id), 44 GNUNET_PQ_query_param_string (pd->description), 45 TALER_PQ_query_param_json (pd->description_i18n), /* $3 */ 46 GNUNET_PQ_query_param_string (pd->unit), 47 GNUNET_PQ_query_param_string (pd->image), 48 TALER_PQ_query_param_json (pd->taxes), /* $6 */ 49 TALER_PQ_query_param_array_amount_with_currency ( 50 pd->price_array_length, 51 pd->price_array, 52 "merchant", 53 pg->conn), /* $7 */ 54 GNUNET_PQ_query_param_uint64 (&pd->total_stock), /* $8 */ 55 GNUNET_PQ_query_param_uint32 (&pd->total_stock_frac), /* $9 */ 56 GNUNET_PQ_query_param_bool (pd->allow_fractional_quantity), 57 GNUNET_PQ_query_param_uint32 (&pd->fractional_precision_level), 58 TALER_PQ_query_param_json (pd->address), /* $12 */ 59 GNUNET_PQ_query_param_timestamp (&pd->next_restock), 60 GNUNET_PQ_query_param_uint32 (&pd->minimum_age), 61 GNUNET_PQ_query_param_array_uint64 (num_cats, 62 cats, 63 pg->conn), /* $15 */ 64 GNUNET_PQ_query_param_string (pd->product_name), 65 (0 == pd->product_group_id) 66 ? GNUNET_PQ_query_param_null () 67 : GNUNET_PQ_query_param_uint64 (&pd->product_group_id), /* $17 */ 68 (0 == pd->money_pot_id) 69 ? GNUNET_PQ_query_param_null () 70 : GNUNET_PQ_query_param_uint64 (&pd->money_pot_id), /* $18 */ 71 GNUNET_PQ_query_param_bool (pd->price_is_net), /* $19 */ 72 GNUNET_PQ_query_param_end 73 }; 74 uint64_t ncat; 75 bool cats_found = true; 76 struct GNUNET_PQ_ResultSpec rs[] = { 77 GNUNET_PQ_result_spec_bool ("conflict", 78 conflict), 79 GNUNET_PQ_result_spec_allow_null ( 80 GNUNET_PQ_result_spec_uint64 ("no_cat", 81 &ncat), 82 &cats_found), 83 GNUNET_PQ_result_spec_bool ("no_group", 84 no_group), 85 GNUNET_PQ_result_spec_bool ("no_pot", 86 no_pot), 87 GNUNET_PQ_result_spec_bool ("no_unit", 88 no_unit), 89 GNUNET_PQ_result_spec_end 90 }; 91 enum GNUNET_DB_QueryStatus qs; 92 93 GNUNET_assert (NULL != pg->current_merchant_id); 94 GNUNET_assert (0 == strcmp (instance_id, 95 pg->current_merchant_id)); 96 TMH_PQ_prepare_anon (pg, 97 "SELECT" 98 " out_conflict AS conflict" 99 ",out_no_cat AS no_cat" 100 ",out_no_group AS no_group" 101 ",out_no_pot AS no_pot" 102 ",out_no_unit AS no_unit" 103 " FROM merchant_do_insert_product" 104 "($1, $2, $3::TEXT::JSONB, $4, $5, $6::TEXT::JSONB, $7" 105 ",$8, $9, $10, $11, $12::TEXT::JSONB, $13, $14, $15" 106 ",$16, $17, $18, $19);"); 107 qs = GNUNET_PQ_eval_prepared_singleton_select (pg->conn, 108 "", 109 params, 110 rs); 111 GNUNET_PQ_cleanup_query_params_closures (params); 112 *no_cat = (cats_found) ? -1 : (ssize_t) ncat; 113 return qs; 114 }