LCOV - code coverage report
Current view: top level - backenddb - pg_lookup_token_family_key.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 37 43 86.0 %
Date: 2025-06-23 16:22:09 Functions: 1 1 100.0 %

          Line data    Source code
       1             : /*
       2             :    This file is part of TALER
       3             :    Copyright (C) 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 backenddb/pg_lookup_token_family_key.c
      18             :  * @brief Implementation of the lookup_token_family_key function for Postgres
      19             :  * @author Christian Blättler
      20             :  */
      21             : #include "platform.h"
      22             : #include <gnunet/gnunet_pq_lib.h>
      23             : #include <gnunet/gnunet_time_lib.h>
      24             : #include <string.h>
      25             : #include <taler/taler_error_codes.h>
      26             : #include <taler/taler_dbevents.h>
      27             : #include <taler/taler_pq_lib.h>
      28             : #include "pg_lookup_token_family_key.h"
      29             : #include "pg_helper.h"
      30             : 
      31             : 
      32             : enum GNUNET_DB_QueryStatus
      33          10 : TMH_PG_lookup_token_family_key (
      34             :   void *cls,
      35             :   const char *instance_id,
      36             :   const char *token_family_slug,
      37             :   struct GNUNET_TIME_Timestamp valid_at,
      38             :   struct GNUNET_TIME_Timestamp sign_until,
      39             :   struct TALER_MERCHANTDB_TokenFamilyKeyDetails *details)
      40             : {
      41          10 :   struct PostgresClosure *pg = cls;
      42          10 :   struct GNUNET_PQ_QueryParam params[] = {
      43          10 :     GNUNET_PQ_query_param_string (instance_id),
      44          10 :     GNUNET_PQ_query_param_string (token_family_slug),
      45          10 :     GNUNET_PQ_query_param_timestamp (&valid_at),
      46          10 :     GNUNET_PQ_query_param_timestamp (&sign_until),
      47             :     GNUNET_PQ_query_param_end
      48             :   };
      49             : 
      50          10 :   check_connection (pg);
      51          10 :   PREPARE (pg,
      52             :            "lookup_token_family_key",
      53             :            "SELECT"
      54             :            " h_pub"
      55             :            ",pub"
      56             :            ",priv"
      57             :            ",cipher_choice"
      58             :            ",mtfk.signature_validity_start"
      59             :            ",mtfk.signature_validity_end"
      60             :            ",mtfk.private_key_deleted_at"
      61             :            ",slug"
      62             :            ",name"
      63             :            ",description"
      64             :            ",description_i18n"
      65             :            ",mtf.valid_after"
      66             :            ",mtf.valid_before"
      67             :            ",duration"
      68             :            ",validity_granularity"
      69             :            ",start_offset"
      70             :            ",kind"
      71             :            ",issued"
      72             :            ",used"
      73             :            " FROM merchant_token_families mtf"
      74             :            " LEFT JOIN merchant_token_family_keys mtfk"
      75             :            "  USING (token_family_serial)"
      76             :            " JOIN merchant_instances mi"
      77             :            "   USING (merchant_serial)"
      78             :            " WHERE mi.merchant_id=$1"
      79             :            "   AND slug=$2"
      80             :            "   AND COALESCE ($3 >= mtfk.signature_validity_start, TRUE)"
      81             :            "   AND COALESCE ($3 <= mtfk.signature_validity_end, TRUE)"
      82             :            "   AND COALESCE ($4 <= mtfk.private_key_deleted_at, TRUE)"
      83             :            " ORDER BY mtfk.signature_validity_start ASC"
      84             :            " LIMIT 1");
      85             : 
      86          10 :   if (NULL == details)
      87             :   {
      88           0 :     struct GNUNET_PQ_ResultSpec rs_null[] = {
      89             :       GNUNET_PQ_result_spec_end
      90             :     };
      91             : 
      92           0 :     return GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
      93             :                                                      "lookup_token_family_key",
      94             :                                                      params,
      95             :                                                      rs_null);
      96             :   }
      97             : 
      98             :   {
      99             :     char *kind;
     100             :     enum GNUNET_DB_QueryStatus qs;
     101          10 :     struct GNUNET_PQ_ResultSpec rs[] = {
     102          10 :       GNUNET_PQ_result_spec_allow_null (
     103             :         GNUNET_PQ_result_spec_blind_sign_pub ("pub",
     104             :                                               &details->pub.public_key),
     105             :         NULL),
     106          10 :       GNUNET_PQ_result_spec_allow_null (
     107             :         GNUNET_PQ_result_spec_blind_sign_priv ("priv",
     108             :                                                &details->priv.private_key),
     109             :         NULL),
     110          10 :       GNUNET_PQ_result_spec_allow_null (
     111             :         GNUNET_PQ_result_spec_timestamp ("signature_validity_start",
     112             :                                          &details->signature_validity_start),
     113             :         NULL),
     114          10 :       GNUNET_PQ_result_spec_allow_null (
     115             :         GNUNET_PQ_result_spec_timestamp ("signature_validity_end",
     116             :                                          &details->signature_validity_end),
     117             :         NULL),
     118          10 :       GNUNET_PQ_result_spec_allow_null (
     119             :         GNUNET_PQ_result_spec_timestamp ("private_key_deleted_at",
     120             :                                          &details->private_key_deleted_at),
     121             :         NULL),
     122          10 :       GNUNET_PQ_result_spec_string ("slug",
     123             :                                     &details->token_family.slug),
     124          10 :       GNUNET_PQ_result_spec_string ("name",
     125             :                                     &details->token_family.name),
     126          10 :       GNUNET_PQ_result_spec_string ("cipher_choice",
     127             :                                     &details->token_family.cipher_spec),
     128          10 :       GNUNET_PQ_result_spec_string ("description",
     129             :                                     &details->token_family.description),
     130          10 :       TALER_PQ_result_spec_json ("description_i18n",
     131             :                                  &details->token_family.description_i18n),
     132          10 :       GNUNET_PQ_result_spec_timestamp ("valid_after",
     133             :                                        &details->token_family.valid_after),
     134          10 :       GNUNET_PQ_result_spec_timestamp ("valid_before",
     135             :                                        &details->token_family.valid_before),
     136          10 :       GNUNET_PQ_result_spec_relative_time ("duration",
     137             :                                            &details->token_family.duration),
     138          10 :       GNUNET_PQ_result_spec_relative_time ("validity_granularity",
     139             :                                            &details->token_family.
     140             :                                            validity_granularity),
     141          10 :       GNUNET_PQ_result_spec_relative_time ("start_offset",
     142             :                                            &details->token_family.start_offset),
     143          10 :       GNUNET_PQ_result_spec_string ("kind",
     144             :                                     &kind),
     145          10 :       GNUNET_PQ_result_spec_uint64 ("issued",
     146             :                                     &details->token_family.issued),
     147          10 :       GNUNET_PQ_result_spec_uint64 ("used",
     148             :                                     &details->token_family.used),
     149             :       GNUNET_PQ_result_spec_end
     150             :     };
     151             : 
     152          10 :     memset (details,
     153             :             0,
     154             :             sizeof (*details));
     155          10 :     qs = GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
     156             :                                                    "lookup_token_family_key",
     157             :                                                    params,
     158             :                                                    rs);
     159          10 :     if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT == qs)
     160             :     {
     161          10 :       if (0 == strcmp (kind,
     162             :                        "discount"))
     163           0 :         details->token_family.kind = TALER_MERCHANTDB_TFK_Discount;
     164          10 :       else if (0 == strcmp (kind,
     165             :                             "subscription"))
     166          10 :         details->token_family.kind = TALER_MERCHANTDB_TFK_Subscription;
     167             :       else
     168             :       {
     169           0 :         GNUNET_free (kind);
     170           0 :         GNUNET_break (0);
     171           0 :         return GNUNET_DB_STATUS_HARD_ERROR;
     172             :       }
     173          10 :       GNUNET_free (kind);
     174             :     }
     175          10 :     return qs;
     176             :   }
     177             : }

Generated by: LCOV version 1.16