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