exchange

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

lookup_serial_by_table.c (16905B)


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