finish backchannel message delivery
[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 */