update_product.c (5236B)
1 /* 2 This file is part of TALER 3 Copyright (C) 2022, 2024, 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/update_product.c 18 * @brief Implementation of the update_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/update_product.h" 25 #include "helper.h" 26 27 28 enum GNUNET_DB_QueryStatus 29 TALER_MERCHANTDB_update_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 ssize_t *no_cat, 37 bool *no_product, 38 bool *lost_reduced, 39 bool *sold_reduced, 40 bool *stocked_reduced, 41 bool *no_group, 42 bool *no_pot) 43 { 44 struct GNUNET_PQ_QueryParam params[] = { 45 GNUNET_PQ_query_param_string (product_id), /* $1 */ 46 GNUNET_PQ_query_param_string (pd->description), 47 TALER_PQ_query_param_json (pd->description_i18n), /* $3 */ 48 GNUNET_PQ_query_param_string (pd->unit), 49 GNUNET_PQ_query_param_string (pd->image), /* $5 */ 50 TALER_PQ_query_param_json (pd->taxes), /* $6 */ 51 TALER_PQ_query_param_array_amount_with_currency ( 52 pd->price_array_length, 53 pd->price_array, 54 pg->conn), /* $7 */ 55 GNUNET_PQ_query_param_uint64 (&pd->total_stock), /* $8 */ 56 GNUNET_PQ_query_param_uint32 (&pd->total_stock_frac), /* $9 */ 57 GNUNET_PQ_query_param_bool (pd->allow_fractional_quantity), /* $10 */ 58 GNUNET_PQ_query_param_uint32 (&pd->fractional_precision_level), 59 GNUNET_PQ_query_param_uint64 (&pd->total_lost), 60 TALER_PQ_query_param_json (pd->address), /* $13 */ 61 GNUNET_PQ_query_param_timestamp (&pd->next_restock), 62 GNUNET_PQ_query_param_uint32 (&pd->minimum_age), 63 GNUNET_PQ_query_param_array_uint64 (num_cats, 64 cats, 65 pg->conn), /* $16 */ 66 GNUNET_PQ_query_param_string (pd->product_name), /* $17 */ 67 (0 == pd->product_group_id) 68 ? GNUNET_PQ_query_param_null () 69 : GNUNET_PQ_query_param_uint64 (&pd->product_group_id), 70 (0 == pd->money_pot_id) 71 ? GNUNET_PQ_query_param_null () 72 : GNUNET_PQ_query_param_uint64 (&pd->money_pot_id), /* $19 */ 73 GNUNET_PQ_query_param_bool (pd->price_is_net), 74 GNUNET_PQ_query_param_end 75 }; 76 uint64_t ncat; 77 bool cats_found = true; 78 struct GNUNET_PQ_ResultSpec rs[] = { 79 GNUNET_PQ_result_spec_bool ("no_product", 80 no_product), 81 GNUNET_PQ_result_spec_bool ("lost_reduced", 82 lost_reduced), 83 GNUNET_PQ_result_spec_bool ("sold_reduced", 84 sold_reduced), 85 GNUNET_PQ_result_spec_bool ("stocked_reduced", 86 stocked_reduced), 87 GNUNET_PQ_result_spec_allow_null ( 88 GNUNET_PQ_result_spec_uint64 ("no_cat", 89 &ncat), 90 &cats_found), 91 GNUNET_PQ_result_spec_bool ("no_group", 92 no_group), 93 GNUNET_PQ_result_spec_bool ("no_pot", 94 no_pot), 95 GNUNET_PQ_result_spec_end 96 }; 97 enum GNUNET_DB_QueryStatus qs; 98 99 if ( (pd->total_stock < pd->total_lost + pd->total_sold) || 100 (pd->total_lost < pd->total_lost 101 + pd->total_sold) /* integer overflow */) 102 { 103 GNUNET_break (0); 104 return GNUNET_DB_STATUS_HARD_ERROR; 105 } 106 GNUNET_assert (NULL != pg->current_merchant_id); 107 GNUNET_assert (0 == strcmp (instance_id, 108 pg->current_merchant_id)); 109 check_connection (pg); 110 TMH_PQ_prepare_anon (pg, 111 "SELECT" 112 " out_lost_reduced AS lost_reduced" 113 ",out_sold_reduced AS sold_reduced" 114 ",out_stocked_reduced AS stocked_reduced" 115 ",out_no_product AS no_product" 116 ",out_no_cat AS no_cat" 117 ",out_no_group AS no_group" 118 ",out_no_pot AS no_pot" 119 " FROM merchant_do_update_product" 120 "($1,$2,$3::TEXT::JSONB,$4,$5,$6::TEXT::JSONB,$7,$8" 121 ",$9,$10,$11,$12,$13::TEXT::JSONB,$14,$15,$16,$17" 122 ",$18,$19,$20);"); 123 qs = GNUNET_PQ_eval_prepared_singleton_select (pg->conn, 124 "", 125 params, 126 rs); 127 GNUNET_PQ_cleanup_query_params_closures (params); 128 *no_cat = (cats_found) ? -1 : (ssize_t) ncat; 129 return qs; 130 }