uncrustify as demanded.
[oweals/gnunet.git] / src / pq / pq_prepare.c
1 /*
2    This file is part of GNUnet
3    Copyright (C) 2017 GNUnet e.V.
4
5    GNUnet is free software: you can redistribute it and/or modify it
6    under the terms of the GNU Affero General Public License as published
7    by the Free Software Foundation, either version 3 of the License,
8    or (at your option) any later version.
9
10    GNUnet is distributed in the hope that it will be useful, but
11    WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Affero General Public License for more details.
14
15    You should have received a copy of the GNU Affero General Public License
16    along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
18      SPDX-License-Identifier: AGPL3.0-or-later
19  */
20 /**
21  * @file pq/pq_prepare.c
22  * @brief functions to connect to libpq (PostGres)
23  * @author Christian Grothoff
24  */
25 #include "platform.h"
26 #include "gnunet_util_lib.h"
27 #include "gnunet_pq_lib.h"
28
29
30 /**
31  * Create a `struct GNUNET_PQ_PreparedStatement`.
32  *
33  * @param name name of the statement
34  * @param sql actual SQL statement
35  * @param num_args number of arguments in the statement
36  * @return initialized struct
37  */
38 struct GNUNET_PQ_PreparedStatement
39 GNUNET_PQ_make_prepare(const char *name,
40                        const char *sql,
41                        unsigned int num_args)
42 {
43   struct GNUNET_PQ_PreparedStatement ps = {
44     .name = name,
45     .sql = sql,
46     .num_arguments = num_args
47   };
48
49   return ps;
50 }
51
52
53 /**
54  * Request creation of prepared statements @a ps from Postgres.
55  *
56  * @param connection connection to prepare the statements for
57  * @param ps #GNUNET_PQ_PREPARED_STATEMENT_END-terminated array of prepared
58  *            statements.
59  * @return #GNUNET_OK on success,
60  *         #GNUNET_SYSERR on error
61  */
62 int
63 GNUNET_PQ_prepare_statements(PGconn *connection,
64                              const struct GNUNET_PQ_PreparedStatement *ps)
65 {
66   for (unsigned int i = 0; NULL != ps[i].name; i++)
67     {
68       PGresult *ret;
69
70       GNUNET_log_from(GNUNET_ERROR_TYPE_DEBUG,
71                       "pq",
72                       "Preparing SQL statement `%s' as `%s'\n",
73                       ps[i].sql,
74                       ps[i].name);
75       ret = PQprepare(connection,
76                       ps[i].name,
77                       ps[i].sql,
78                       ps[i].num_arguments,
79                       NULL);
80       if (PGRES_COMMAND_OK != PQresultStatus(ret))
81         {
82           GNUNET_log_from(GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
83                           "pq",
84                           _("PQprepare (`%s' as `%s') failed with error: %s\n"),
85                           ps[i].sql,
86                           ps[i].name,
87                           PQerrorMessage(connection));
88           PQclear(ret);
89           return GNUNET_SYSERR;
90         }
91       PQclear(ret);
92     }
93   return GNUNET_OK;
94 }
95
96
97 /* end of pq/pq_prepare.c */