Line data Source code
1 : /*
2 : This file is part of TALER
3 : Copyright (C) 2014-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.c
18 : * @brief Low-level (statement-level) Postgres database access for the auditor
19 : * @author Christian Grothoff
20 : * @author Gabor X Toth
21 : */
22 : struct TALER_AUDITORDB_PostgresContext;
23 : #define GNUNET_PQ_RECONNECT_CALLBACK_CLOSURE \
24 : struct TALER_AUDITORDB_PostgresContext
25 : #include "taler/taler_pq_lib.h"
26 : #include <pthread.h>
27 : #include "auditordb_lib.h"
28 : #include "pg_helper.h"
29 :
30 :
31 : /**
32 : * Function called each time we connect or reconnect to the
33 : * database. Gives the application a chance to run some
34 : * per-connection initialization logic.
35 : *
36 : * @param pg database conntext in the auditor
37 : * @param pq database connection handle
38 : */
39 : static void
40 32 : reconnect_cb (struct TALER_AUDITORDB_PostgresContext *pg,
41 : struct GNUNET_PQ_Context *pq)
42 : {
43 32 : struct GNUNET_PQ_ExecuteStatement es[] = {
44 32 : GNUNET_PQ_make_try_execute ("SET search_path TO auditor;"),
45 : GNUNET_PQ_EXECUTE_STATEMENT_END
46 : };
47 :
48 32 : if (GNUNET_OK !=
49 32 : GNUNET_PQ_exec_statements (pq,
50 : es))
51 : {
52 0 : GNUNET_break (0);
53 0 : return;
54 : }
55 32 : pg->prep_gen++;
56 : }
57 :
58 :
59 : /**
60 : * Connect to the db if the connection does not exist yet.
61 : *
62 : * @param[in,out] pg the database state
63 : * @return #GNUNET_OK on success
64 : */
65 : static enum GNUNET_GenericReturnValue
66 32 : setup_connection (struct TALER_AUDITORDB_PostgresContext *pg)
67 : {
68 : struct GNUNET_PQ_Context *db_conn;
69 :
70 32 : if (NULL != pg->conn)
71 0 : return GNUNET_OK;
72 32 : db_conn = GNUNET_PQ_init (pg->cfg,
73 : "auditordb-postgres",
74 : &reconnect_cb,
75 : pg);
76 32 : if (NULL == db_conn)
77 0 : return GNUNET_SYSERR;
78 32 : if (0 == pg->prep_gen)
79 : {
80 0 : GNUNET_PQ_disconnect (db_conn);
81 0 : return GNUNET_SYSERR;
82 : }
83 32 : pg->conn = db_conn;
84 32 : return GNUNET_OK;
85 : }
86 :
87 :
88 : struct TALER_AUDITORDB_PostgresContext *
89 32 : TALER_AUDITORDB_connect (const struct GNUNET_CONFIGURATION_Handle *cfg)
90 : {
91 : struct TALER_AUDITORDB_PostgresContext *pg;
92 :
93 32 : pg = GNUNET_new (struct TALER_AUDITORDB_PostgresContext);
94 32 : pg->cfg = cfg;
95 32 : if (GNUNET_OK !=
96 32 : TALER_config_get_currency (cfg,
97 : "exchange",
98 : &pg->currency))
99 : {
100 0 : GNUNET_free (pg);
101 0 : return NULL;
102 : }
103 32 : if (GNUNET_OK !=
104 32 : setup_connection (pg))
105 : {
106 0 : TALER_AUDITORDB_disconnect (pg);
107 0 : return NULL;
108 : }
109 32 : return pg;
110 : }
111 :
112 :
113 : void
114 32 : TALER_AUDITORDB_disconnect (struct TALER_AUDITORDB_PostgresContext *pg)
115 : {
116 32 : if (NULL == pg)
117 0 : return;
118 32 : if (NULL != pg->conn)
119 32 : GNUNET_PQ_disconnect (pg->conn);
120 32 : GNUNET_free (pg->currency);
121 32 : GNUNET_free (pg);
122 : }
123 :
124 :
125 : /* end of plugin_auditordb_postgres.c */
|