summaryrefslogtreecommitdiff
path: root/src/pq/pq_common.h
blob: 36ba62a403a91fedf8f19ee90c6fcf004c06f7ef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/*
  This file is part of TALER
  Copyright (C) 2023 Taler Systems SA

  TALER is free software; you can redistribute it and/or modify it under the
  terms of the GNU General Public License as published by the Free Software
  Foundation; either version 3, or (at your option) any later version.

  TALER is distributed in the hope that it will be useful, but WITHOUT ANY
  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
  A PARTICULAR PURPOSE.  See the GNU General Public License for more details.

  You should have received a copy of the GNU General Public License along with
  TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
*/
/**
 * @file pq/pq_common.h
 * @brief common defines for the pq functions
 * @author Özgür Kesim
 */
#ifndef TALER_PQ_COMMON_H_
#define TALER_PQ_COMMON_H_

#include "platform.h"
/**
 * Internal types that are supported as TALER-exchange-specific array types.
 *
 * To support a new type,
 *   1. add a new entry into this list,
 *   2. for query-support, implement the size calculation and memory copying in
 *      qconv_array() accordingly, in pq_query_helper.c
 *   3. provide a query-API for arrays of the type, by calling
 *      query_param_array_generic with the appropriate parameters,
 *      in pq_query_helper.c
 *   4. for result-support, implement memory copying by adding another case
 *      to extract_array_generic, in pq_result_helper.c
 *   5. provide a result-spec-API for arrays of the type,
 *      in pq_result_helper.c
 *   6. expose the API's in taler_pq_lib.h
 */
enum TALER_PQ_ArrayType
{
  TALER_PQ_array_of_blinded_denom_sig,
  TALER_PQ_array_of_blinded_coin_hash,
  TALER_PQ_array_of_denom_hash,
  /* TODO[oec]: Next up: TALER_PQ_array_of_amount, */
  TALER_PQ_array_of_MAX,       /* must be last */
};

/**
 * The header for a postgresql array in binary format. note that this a
 * simplified special case of the general structure (which contains pointers),
 * as we only support one-dimensional arrays.
 */
struct TALER_PQ_ArrayHeader_P
{
  uint32_t ndim;     /* number of dimensions. we only support ndim = 1 */
  uint32_t has_null;
  uint32_t oid;
  uint32_t dim;      /* size of the array */
  uint32_t lbound;   /* index value of first element in the db (default: 1). */
} __attribute__((packed));

/**
 * Memory representation of an taler amount record for Postgres.
 *
 * All values need to be in network-byte-order.
 */
struct TALER_PQ_Amount_P
{
  uint32_t oid_v; /* oid of .v  */
  uint32_t sz_v;  /* size of .v */
  uint64_t v;     /* value      */
  uint32_t oid_f; /* oid of .f  */
  uint32_t sz_f;  /* size of .f */
  uint32_t f;     /* fraction   */
} __attribute__((packed));

/**
 * Create a `struct TALER_PQ_Amount_P` for initialization
 *
 * @param db postgres-context of type `struct GNUNET_PQ_Context *`
 * @param amount amount of type `struct TALER_Amount *`
 */
#define MAKE_TALER_PQ_AMOUNT_P(db,amount) \
  { \
    .oid_v = htonl (GNUNET_PQ_get_oid ((db), GNUNET_PQ_DATATYPE_INT8)), \
    .oid_f = htonl (GNUNET_PQ_get_oid ((db), GNUNET_PQ_DATATYPE_INT4)), \
    .sz_v = htonl (sizeof((amount)->value)), \
    .sz_f = htonl (sizeof((amount)->fraction)), \
    .v = GNUNET_htonll ((amount)->value), \
    .f = htonl ((amount)->fraction) \
  }

#endif  /* TALER_PQ_COMMON_H_ */
/* end of pg/pq_common.h */