exchange

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

pg_lookup_serial_by_table.c (16885B)


      1 /*
      2    This file is part of TALER
      3    Copyright (C) 2022-2024 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 pg_lookup_serial_by_table.c
     18  * @brief Low-level (statement-level) Postgres database access for the exchange
     19  * @author Christian Grothoff
     20  */
     21 #include "taler/platform.h"
     22 #include "taler/taler_error_codes.h"
     23 #include "taler/taler_dbevents.h"
     24 #include "taler/taler_pq_lib.h"
     25 #include "pg_lookup_serial_by_table.h"
     26 #include "pg_helper.h"
     27 
     28 
     29 /**
     30  * Assign statement to @a n and PREPARE
     31  * @a sql under name @a n.
     32  */
     33 #define XPREPARE(n,sql) \
     34         statement = n;        \
     35         PREPARE (pg, n, sql);
     36 
     37 
     38 enum GNUNET_DB_QueryStatus
     39 TEH_PG_lookup_serial_by_table (void *cls,
     40                                enum TALER_EXCHANGEDB_ReplicatedTable table,
     41                                uint64_t *serial)
     42 {
     43   struct PostgresClosure *pg = cls;
     44   struct GNUNET_PQ_QueryParam params[] = {
     45     GNUNET_PQ_query_param_end
     46   };
     47   struct GNUNET_PQ_ResultSpec rs[] = {
     48     GNUNET_PQ_result_spec_uint64 ("serial",
     49                                   serial),
     50     GNUNET_PQ_result_spec_end
     51   };
     52   const char *statement = NULL;
     53 
     54   switch (table)
     55   {
     56   case TALER_EXCHANGEDB_RT_DENOMINATIONS:
     57     XPREPARE ("select_serial_by_table_denominations",
     58               "SELECT"
     59               " denominations_serial AS serial"
     60               " FROM denominations"
     61               " ORDER BY denominations_serial DESC"
     62               " LIMIT 1;");
     63     break;
     64   case TALER_EXCHANGEDB_RT_DENOMINATION_REVOCATIONS:
     65     XPREPARE ("select_serial_by_table_denomination_revocations",
     66               "SELECT"
     67               " denom_revocations_serial_id AS serial"
     68               " FROM denomination_revocations"
     69               " ORDER BY denom_revocations_serial_id DESC"
     70               " LIMIT 1;");
     71     break;
     72   case TALER_EXCHANGEDB_RT_WIRE_TARGETS:
     73     XPREPARE ("select_serial_by_table_wire_targets",
     74               "SELECT"
     75               " wire_target_serial_id AS serial"
     76               " FROM wire_targets"
     77               " ORDER BY wire_target_serial_id DESC"
     78               " LIMIT 1;");
     79     break;
     80   case TALER_EXCHANGEDB_RT_KYC_TARGETS:
     81     XPREPARE ("select_serial_by_table_kyc_targets",
     82               "SELECT"
     83               " kyc_target_serial_id AS serial"
     84               " FROM kyc_targets"
     85               " ORDER BY kyc_target_serial_id DESC"
     86               " LIMIT 1;");
     87     break;
     88   case TALER_EXCHANGEDB_RT_RESERVES:
     89     XPREPARE ("select_serial_by_table_reserves",
     90               "SELECT"
     91               " reserve_uuid AS serial"
     92               " FROM reserves"
     93               " ORDER BY reserve_uuid DESC"
     94               " LIMIT 1;");
     95     break;
     96   case TALER_EXCHANGEDB_RT_RESERVES_IN:
     97     XPREPARE ("select_serial_by_table_reserves_in",
     98               "SELECT"
     99               " reserve_in_serial_id AS serial"
    100               " FROM reserves_in"
    101               " ORDER BY reserve_in_serial_id DESC"
    102               " LIMIT 1;");
    103     break;
    104   case TALER_EXCHANGEDB_RT_KYCAUTHS_IN:
    105     XPREPARE ("select_serial_by_table_kycauths_in",
    106               "SELECT"
    107               " kycauth_in_serial_id AS serial"
    108               " FROM kycauths_in"
    109               " ORDER BY kycauths_in_serial_id DESC"
    110               " LIMIT 1;");
    111     break;
    112   case TALER_EXCHANGEDB_RT_RESERVES_CLOSE:
    113     XPREPARE ("select_serial_by_table_reserves_close",
    114               "SELECT"
    115               " close_uuid AS serial"
    116               " FROM reserves_close"
    117               " ORDER BY close_uuid DESC"
    118               " LIMIT 1;");
    119     break;
    120   case TALER_EXCHANGEDB_RT_RESERVES_OPEN_REQUESTS:
    121     XPREPARE ("select_serial_by_table_reserves_open_requests",
    122               "SELECT"
    123               " open_request_uuid AS serial"
    124               " FROM reserves_open_requests"
    125               " ORDER BY open_request_uuid DESC"
    126               " LIMIT 1;");
    127     break;
    128   case TALER_EXCHANGEDB_RT_RESERVES_OPEN_DEPOSITS:
    129     XPREPARE ("select_serial_by_table_reserves_open_deposits",
    130               "SELECT"
    131               " reserve_open_deposit_uuid AS serial"
    132               " FROM reserves_open_deposits"
    133               " ORDER BY reserve_open_deposit_uuid DESC"
    134               " LIMIT 1;");
    135     break;
    136   case TALER_EXCHANGEDB_RT_AUDITORS:
    137     XPREPARE ("select_serial_by_table_auditors",
    138               "SELECT"
    139               " auditor_uuid AS serial"
    140               " FROM auditors"
    141               " ORDER BY auditor_uuid DESC"
    142               " LIMIT 1;");
    143     break;
    144   case TALER_EXCHANGEDB_RT_AUDITOR_DENOM_SIGS:
    145     XPREPARE ("select_serial_by_table_auditor_denom_sigs",
    146               "SELECT"
    147               " auditor_denom_serial AS serial"
    148               " FROM auditor_denom_sigs"
    149               " ORDER BY auditor_denom_serial DESC"
    150               " LIMIT 1;");
    151     break;
    152   case TALER_EXCHANGEDB_RT_EXCHANGE_SIGN_KEYS:
    153     XPREPARE ("select_serial_by_table_exchange_sign_keys",
    154               "SELECT"
    155               " esk_serial AS serial"
    156               " FROM exchange_sign_keys"
    157               " ORDER BY esk_serial DESC"
    158               " LIMIT 1;");
    159     break;
    160   case TALER_EXCHANGEDB_RT_SIGNKEY_REVOCATIONS:
    161     XPREPARE ("select_serial_by_table_signkey_revocations",
    162               "SELECT"
    163               " signkey_revocations_serial_id AS serial"
    164               " FROM signkey_revocations"
    165               " ORDER BY signkey_revocations_serial_id DESC"
    166               " LIMIT 1;");
    167     break;
    168   case TALER_EXCHANGEDB_RT_KNOWN_COINS:
    169     XPREPARE ("select_serial_by_table_known_coins",
    170               "SELECT"
    171               " known_coin_id AS serial"
    172               " FROM known_coins"
    173               " ORDER BY known_coin_id DESC"
    174               " LIMIT 1;");
    175     break;
    176   case TALER_EXCHANGEDB_RT_REFRESH:
    177     XPREPARE ("select_serial_by_table_refresh",
    178               "SELECT"
    179               " refresh_id AS serial"
    180               " FROM refresh"
    181               " ORDER BY refresh_id DESC"
    182               " LIMIT 1;");
    183     break;
    184   case TALER_EXCHANGEDB_RT_BATCH_DEPOSITS:
    185     XPREPARE ("select_serial_by_table_batch_deposits",
    186               "SELECT"
    187               " batch_deposit_serial_id AS serial"
    188               " FROM batch_deposits"
    189               " ORDER BY batch_deposit_serial_id DESC"
    190               " LIMIT 1;");
    191     break;
    192   case TALER_EXCHANGEDB_RT_COIN_DEPOSITS:
    193     XPREPARE ("select_serial_by_table_coin_deposits",
    194               "SELECT"
    195               " coin_deposit_serial_id AS serial"
    196               " FROM coin_deposits"
    197               " ORDER BY coin_deposit_serial_id DESC"
    198               " LIMIT 1;");
    199     break;
    200   case TALER_EXCHANGEDB_RT_REFUNDS:
    201     XPREPARE ("select_serial_by_table_refunds",
    202               "SELECT"
    203               " refund_serial_id AS serial"
    204               " FROM refunds"
    205               " ORDER BY refund_serial_id DESC"
    206               " LIMIT 1;");
    207     break;
    208   case TALER_EXCHANGEDB_RT_WIRE_OUT:
    209     XPREPARE ("select_serial_by_table_wire_out",
    210               "SELECT"
    211               " wireout_uuid AS serial"
    212               " FROM wire_out"
    213               " ORDER BY wireout_uuid DESC"
    214               " LIMIT 1;");
    215     break;
    216   case TALER_EXCHANGEDB_RT_AGGREGATION_TRACKING:
    217     XPREPARE ("select_serial_by_table_aggregation_tracking",
    218               "SELECT"
    219               " aggregation_serial_id AS serial"
    220               " FROM aggregation_tracking"
    221               " ORDER BY aggregation_serial_id DESC"
    222               " LIMIT 1;");
    223     break;
    224   case TALER_EXCHANGEDB_RT_WIRE_FEE:
    225     XPREPARE ("select_serial_by_table_wire_fee",
    226               "SELECT"
    227               " wire_fee_serial AS serial"
    228               " FROM wire_fee"
    229               " ORDER BY wire_fee_serial DESC"
    230               " LIMIT 1;");
    231     break;
    232   case TALER_EXCHANGEDB_RT_GLOBAL_FEE:
    233     XPREPARE ("select_serial_by_table_global_fee",
    234               "SELECT"
    235               " global_fee_serial AS serial"
    236               " FROM global_fee"
    237               " ORDER BY global_fee_serial DESC"
    238               " LIMIT 1;");
    239     break;
    240   case TALER_EXCHANGEDB_RT_RECOUP:
    241     XPREPARE ("select_serial_by_table_recoup",
    242               "SELECT"
    243               " recoup_uuid AS serial"
    244               " FROM recoup"
    245               " ORDER BY recoup_uuid DESC"
    246               " LIMIT 1;");
    247     break;
    248   case TALER_EXCHANGEDB_RT_RECOUP_REFRESH:
    249     XPREPARE ("select_serial_by_table_recoup_refresh",
    250               "SELECT"
    251               " recoup_refresh_uuid AS serial"
    252               " FROM recoup_refresh"
    253               " ORDER BY recoup_refresh_uuid DESC"
    254               " LIMIT 1;");
    255     break;
    256   case TALER_EXCHANGEDB_RT_EXTENSIONS:
    257     XPREPARE ("select_serial_by_table_extensions",
    258               "SELECT"
    259               " extension_id AS serial"
    260               " FROM extensions"
    261               " ORDER BY extension_id DESC"
    262               " LIMIT 1;");
    263     break;
    264   case TALER_EXCHANGEDB_RT_POLICY_DETAILS:
    265     XPREPARE ("select_serial_by_table_policy_details",
    266               "SELECT"
    267               " policy_details_serial_id AS serial"
    268               " FROM policy_details"
    269               " ORDER BY policy_details_serial_id DESC"
    270               " LIMIT 1;");
    271     break;
    272   case TALER_EXCHANGEDB_RT_POLICY_FULFILLMENTS:
    273     XPREPARE ("select_serial_by_table_policy_fulfillments",
    274               "SELECT"
    275               " fulfillment_id AS serial"
    276               " FROM policy_fulfillments"
    277               " ORDER BY fulfillment_id DESC"
    278               " LIMIT 1;");
    279     break;
    280   case TALER_EXCHANGEDB_RT_PURSE_REQUESTS:
    281     XPREPARE ("select_serial_by_table_purse_requests",
    282               "SELECT"
    283               " purse_requests_serial_id AS serial"
    284               " FROM purse_requests"
    285               " ORDER BY purse_requests_serial_id DESC"
    286               " LIMIT 1;")
    287     break;
    288   case TALER_EXCHANGEDB_RT_PURSE_DECISION:
    289     XPREPARE ("select_serial_by_table_purse_decision",
    290               "SELECT"
    291               " purse_decision_serial_id AS serial"
    292               " FROM purse_decision"
    293               " ORDER BY purse_decision_serial_id DESC"
    294               " LIMIT 1;");
    295     break;
    296   case TALER_EXCHANGEDB_RT_PURSE_MERGES:
    297     XPREPARE ("select_serial_by_table_purse_merges",
    298               "SELECT"
    299               " purse_merge_request_serial_id AS serial"
    300               " FROM purse_merges"
    301               " ORDER BY purse_merge_request_serial_id DESC"
    302               " LIMIT 1;");
    303     break;
    304   case TALER_EXCHANGEDB_RT_PURSE_DEPOSITS:
    305     XPREPARE ("select_serial_by_table_purse_deposits",
    306               "SELECT"
    307               " purse_deposit_serial_id AS serial"
    308               " FROM purse_deposits"
    309               " ORDER BY purse_deposit_serial_id DESC"
    310               " LIMIT 1;");
    311     break;
    312   case TALER_EXCHANGEDB_RT_ACCOUNT_MERGES:
    313     XPREPARE ("select_serial_by_table_account_merges",
    314               "SELECT"
    315               " account_merge_request_serial_id AS serial"
    316               " FROM account_merges"
    317               " ORDER BY account_merge_request_serial_id DESC"
    318               " LIMIT 1;");
    319     break;
    320   case TALER_EXCHANGEDB_RT_HISTORY_REQUESTS:
    321     XPREPARE ("select_serial_by_table_history_requests",
    322               "SELECT"
    323               " history_request_serial_id AS serial"
    324               " FROM history_requests"
    325               " ORDER BY history_request_serial_id DESC"
    326               " LIMIT 1;");
    327     break;
    328   case TALER_EXCHANGEDB_RT_CLOSE_REQUESTS:
    329     XPREPARE ("select_serial_by_table_close_requests",
    330               "SELECT"
    331               " close_request_serial_id AS serial"
    332               " FROM close_requests"
    333               " ORDER BY close_request_serial_id DESC"
    334               " LIMIT 1;");
    335     break;
    336   case TALER_EXCHANGEDB_RT_WADS_OUT:
    337     XPREPARE ("select_serial_by_table_wads_out",
    338               "SELECT"
    339               " wad_out_serial_id AS serial"
    340               " FROM wads_out"
    341               " ORDER BY wad_out_serial_id DESC"
    342               " LIMIT 1;");
    343     break;
    344   case TALER_EXCHANGEDB_RT_WADS_OUT_ENTRIES:
    345     XPREPARE ("select_serial_by_table_wads_out_entries",
    346               "SELECT"
    347               " wad_out_entry_serial_id AS serial"
    348               " FROM wad_out_entries"
    349               " ORDER BY wad_out_entry_serial_id DESC"
    350               " LIMIT 1;");
    351     break;
    352   case TALER_EXCHANGEDB_RT_WADS_IN:
    353     XPREPARE ("select_serial_by_table_wads_in",
    354               "SELECT"
    355               " wad_in_serial_id AS serial"
    356               " FROM wads_in"
    357               " ORDER BY wad_in_serial_id DESC"
    358               " LIMIT 1;");
    359     break;
    360   case TALER_EXCHANGEDB_RT_WADS_IN_ENTRIES:
    361     XPREPARE ("select_serial_by_table_wads_in_entries",
    362               "SELECT"
    363               " wad_in_entry_serial_id AS serial"
    364               " FROM wad_in_entries"
    365               " ORDER BY wad_in_entry_serial_id DESC"
    366               " LIMIT 1;");
    367     break;
    368   case TALER_EXCHANGEDB_RT_PROFIT_DRAINS:
    369     XPREPARE ("select_serial_by_table_profit_drains",
    370               "SELECT"
    371               " profit_drain_serial_id AS serial"
    372               " FROM profit_drains"
    373               " ORDER BY profit_drain_serial_id DESC"
    374               " LIMIT 1;");
    375     statement = "select_serial_by_table_profit_drains";
    376     break;
    377   case TALER_EXCHANGEDB_RT_AML_STAFF:
    378     XPREPARE ("select_serial_by_table_aml_staff",
    379               "SELECT"
    380               " aml_staff_uuid AS serial"
    381               " FROM aml_staff"
    382               " ORDER BY aml_staff_uuid DESC"
    383               " LIMIT 1;");
    384     statement = "select_serial_by_table_aml_staff";
    385     break;
    386   case TALER_EXCHANGEDB_RT_PURSE_DELETION:
    387     XPREPARE ("select_serial_by_table_purse_deletion",
    388               "SELECT"
    389               " purse_deletion_serial_id AS serial"
    390               " FROM purse_deletion"
    391               " ORDER BY purse_deletion_serial_id DESC"
    392               " LIMIT 1;");
    393     statement = "select_serial_by_table_purse_deletion";
    394     break;
    395   case TALER_EXCHANGEDB_RT_WITHDRAW:
    396     XPREPARE ("select_serial_by_table_withdraw",
    397               "SELECT"
    398               " withdraw_id AS serial"
    399               " FROM withdraw"
    400               " ORDER BY withdraw_id DESC"
    401               " LIMIT 1;");
    402     statement = "select_serial_by_table_withdraw";
    403     break;
    404   case TALER_EXCHANGEDB_RT_LEGITIMIZATION_MEASURES:
    405     XPREPARE ("select_serial_by_table_legitimization_measures",
    406               "SELECT"
    407               " legitimization_measure_serial_id AS serial"
    408               " FROM legitimization_measures"
    409               " ORDER BY legitimization_measure_serial_id DESC"
    410               " LIMIT 1;");
    411     break;
    412   case TALER_EXCHANGEDB_RT_LEGITIMIZATION_OUTCOMES:
    413     XPREPARE ("select_serial_by_table_legitimization_outcomes",
    414               "SELECT"
    415               " outcome_serial_id AS serial"
    416               " FROM legitimization_outcomes"
    417               " ORDER BY outcome_serial_id DESC"
    418               " LIMIT 1;");
    419     break;
    420   case TALER_EXCHANGEDB_RT_LEGITIMIZATION_PROCESSES:
    421     XPREPARE ("select_serial_by_table_legitimization_processes",
    422               "SELECT"
    423               " legitimization_process_serial_id AS serial"
    424               " FROM legitimization_processes"
    425               " ORDER BY legitimization_process_serial_id DESC"
    426               " LIMIT 1;");
    427     break;
    428   case TALER_EXCHANGEDB_RT_KYC_ATTRIBUTES:
    429     XPREPARE ("select_serial_by_table_kyc_attributes",
    430               "SELECT"
    431               " kyc_attributes_serial_id AS serial"
    432               " FROM kyc_attributes"
    433               " ORDER BY kyc_attributes_serial_id DESC"
    434               " LIMIT 1;");
    435     statement = "select_serial_by_table_kyc_attributes";
    436     break;
    437   case TALER_EXCHANGEDB_RT_AML_HISTORY:
    438     XPREPARE ("select_serial_by_table_aml_history",
    439               "SELECT"
    440               " aml_history_serial_id AS serial"
    441               " FROM aml_history"
    442               " ORDER BY aml_history_serial_id DESC"
    443               " LIMIT 1;");
    444     statement = "select_serial_by_table_aml_history";
    445     break;
    446   case TALER_EXCHANGEDB_RT_KYC_EVENTS:
    447     XPREPARE ("select_serial_by_table_kyc_events",
    448               "SELECT"
    449               " kyc_event_serial_id AS serial"
    450               " FROM kyc_events"
    451               " ORDER BY kyc_event_serial_id DESC"
    452               " LIMIT 1;");
    453     break;
    454   }
    455   if (NULL == statement)
    456   {
    457     GNUNET_break (0);
    458     return GNUNET_DB_STATUS_HARD_ERROR;
    459   }
    460   return GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
    461                                                    statement,
    462                                                    params,
    463                                                    rs);
    464 }
    465 
    466 
    467 #undef XPREPARE