LCOV - code coverage report
Current view: top level - exchangedb - pg_lookup_serial_by_table.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 140 164 85.4 %
Date: 2025-06-05 21:03:14 Functions: 1 1 100.0 %

          Line data    Source code
       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 "platform.h"
      22             : #include "taler_error_codes.h"
      23             : #include "taler_dbevents.h"
      24             : #include "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         172 : TEH_PG_lookup_serial_by_table (void *cls,
      40             :                                enum TALER_EXCHANGEDB_ReplicatedTable table,
      41             :                                uint64_t *serial)
      42             : {
      43         172 :   struct PostgresClosure *pg = cls;
      44         172 :   struct GNUNET_PQ_QueryParam params[] = {
      45             :     GNUNET_PQ_query_param_end
      46             :   };
      47         172 :   struct GNUNET_PQ_ResultSpec rs[] = {
      48         172 :     GNUNET_PQ_result_spec_uint64 ("serial",
      49             :                                   serial),
      50             :     GNUNET_PQ_result_spec_end
      51             :   };
      52         172 :   const char *statement = NULL;
      53             : 
      54         172 :   switch (table)
      55             :   {
      56           4 :   case TALER_EXCHANGEDB_RT_DENOMINATIONS:
      57           6 :     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           4 :     break;
      64           4 :   case TALER_EXCHANGEDB_RT_DENOMINATION_REVOCATIONS:
      65           6 :     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           4 :     break;
      72           4 :   case TALER_EXCHANGEDB_RT_WIRE_TARGETS:
      73           6 :     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           4 :     break;
      80           4 :   case TALER_EXCHANGEDB_RT_KYC_TARGETS:
      81           6 :     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           4 :     break;
      88           4 :   case TALER_EXCHANGEDB_RT_RESERVES:
      89           6 :     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           4 :     break;
      96           4 :   case TALER_EXCHANGEDB_RT_RESERVES_IN:
      97           6 :     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           4 :     break;
     104           0 :   case TALER_EXCHANGEDB_RT_KYCAUTHS_IN:
     105           0 :     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           0 :     break;
     112           4 :   case TALER_EXCHANGEDB_RT_RESERVES_CLOSE:
     113           6 :     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           4 :     break;
     120           4 :   case TALER_EXCHANGEDB_RT_RESERVES_OPEN_REQUESTS:
     121           6 :     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           4 :     break;
     128           4 :   case TALER_EXCHANGEDB_RT_RESERVES_OPEN_DEPOSITS:
     129           6 :     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           4 :     break;
     136           4 :   case TALER_EXCHANGEDB_RT_AUDITORS:
     137           6 :     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           4 :     break;
     144           4 :   case TALER_EXCHANGEDB_RT_AUDITOR_DENOM_SIGS:
     145           6 :     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           4 :     break;
     152           4 :   case TALER_EXCHANGEDB_RT_EXCHANGE_SIGN_KEYS:
     153           6 :     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           4 :     break;
     160           4 :   case TALER_EXCHANGEDB_RT_SIGNKEY_REVOCATIONS:
     161           6 :     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           4 :     break;
     168           4 :   case TALER_EXCHANGEDB_RT_KNOWN_COINS:
     169           6 :     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           4 :     break;
     176           4 :   case TALER_EXCHANGEDB_RT_REFRESH:
     177           6 :     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           4 :     break;
     184           4 :   case TALER_EXCHANGEDB_RT_BATCH_DEPOSITS:
     185           6 :     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           4 :     break;
     192           4 :   case TALER_EXCHANGEDB_RT_COIN_DEPOSITS:
     193           6 :     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           4 :     break;
     200           4 :   case TALER_EXCHANGEDB_RT_REFUNDS:
     201           6 :     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           4 :     break;
     208           4 :   case TALER_EXCHANGEDB_RT_WIRE_OUT:
     209           6 :     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           4 :     break;
     216           4 :   case TALER_EXCHANGEDB_RT_AGGREGATION_TRACKING:
     217           6 :     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           4 :     break;
     224           4 :   case TALER_EXCHANGEDB_RT_WIRE_FEE:
     225           6 :     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           4 :     break;
     232           4 :   case TALER_EXCHANGEDB_RT_GLOBAL_FEE:
     233           6 :     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           4 :     break;
     240           4 :   case TALER_EXCHANGEDB_RT_RECOUP:
     241           6 :     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           4 :     break;
     248           4 :   case TALER_EXCHANGEDB_RT_RECOUP_REFRESH:
     249           6 :     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           4 :     break;
     256           4 :   case TALER_EXCHANGEDB_RT_EXTENSIONS:
     257           6 :     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           4 :     break;
     264           4 :   case TALER_EXCHANGEDB_RT_POLICY_DETAILS:
     265           6 :     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           4 :     break;
     272           4 :   case TALER_EXCHANGEDB_RT_POLICY_FULFILLMENTS:
     273           6 :     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           4 :     break;
     280           4 :   case TALER_EXCHANGEDB_RT_PURSE_REQUESTS:
     281           6 :     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           4 :     break;
     288           4 :   case TALER_EXCHANGEDB_RT_PURSE_DECISION:
     289           6 :     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           4 :     break;
     296           4 :   case TALER_EXCHANGEDB_RT_PURSE_MERGES:
     297           6 :     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           4 :     break;
     304           4 :   case TALER_EXCHANGEDB_RT_PURSE_DEPOSITS:
     305           6 :     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           4 :     break;
     312           4 :   case TALER_EXCHANGEDB_RT_ACCOUNT_MERGES:
     313           6 :     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           4 :     break;
     320           4 :   case TALER_EXCHANGEDB_RT_HISTORY_REQUESTS:
     321           6 :     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           4 :     break;
     328           4 :   case TALER_EXCHANGEDB_RT_CLOSE_REQUESTS:
     329           6 :     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           4 :     break;
     336           4 :   case TALER_EXCHANGEDB_RT_WADS_OUT:
     337           6 :     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           4 :     break;
     344           4 :   case TALER_EXCHANGEDB_RT_WADS_OUT_ENTRIES:
     345           6 :     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           4 :     break;
     352           4 :   case TALER_EXCHANGEDB_RT_WADS_IN:
     353           6 :     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           4 :     break;
     360           4 :   case TALER_EXCHANGEDB_RT_WADS_IN_ENTRIES:
     361           6 :     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           4 :     break;
     368           4 :   case TALER_EXCHANGEDB_RT_PROFIT_DRAINS:
     369           6 :     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           4 :     statement = "select_serial_by_table_profit_drains";
     376           4 :     break;
     377           0 :   case TALER_EXCHANGEDB_RT_AML_STAFF:
     378           0 :     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           0 :     statement = "select_serial_by_table_aml_staff";
     385           0 :     break;
     386           0 :   case TALER_EXCHANGEDB_RT_PURSE_DELETION:
     387           0 :     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           0 :     statement = "select_serial_by_table_purse_deletion";
     394           0 :     break;
     395           4 :   case TALER_EXCHANGEDB_RT_WITHDRAW:
     396           6 :     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           4 :     statement = "select_serial_by_table_withdraw";
     403           4 :     break;
     404           4 :   case TALER_EXCHANGEDB_RT_LEGITIMIZATION_MEASURES:
     405           6 :     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           4 :     break;
     412           4 :   case TALER_EXCHANGEDB_RT_LEGITIMIZATION_OUTCOMES:
     413           6 :     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           4 :     break;
     420           4 :   case TALER_EXCHANGEDB_RT_LEGITIMIZATION_PROCESSES:
     421           6 :     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           4 :     break;
     428           0 :   case TALER_EXCHANGEDB_RT_KYC_ATTRIBUTES:
     429           0 :     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           0 :     statement = "select_serial_by_table_kyc_attributes";
     436           0 :     break;
     437           0 :   case TALER_EXCHANGEDB_RT_AML_HISTORY:
     438           0 :     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           0 :     statement = "select_serial_by_table_aml_history";
     445           0 :     break;
     446           0 :   case TALER_EXCHANGEDB_RT_KYC_EVENTS:
     447           0 :     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           0 :     break;
     454             :   }
     455         172 :   if (NULL == statement)
     456             :   {
     457           0 :     GNUNET_break (0);
     458           0 :     return GNUNET_DB_STATUS_HARD_ERROR;
     459             :   }
     460         172 :   return GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
     461             :                                                    statement,
     462             :                                                    params,
     463             :                                                    rs);
     464             : }
     465             : 
     466             : 
     467             : #undef XPREPARE

Generated by: LCOV version 1.16