Merge branch 'master' of gnunet.org:gnunet
[oweals/gnunet.git] / src / sq / sq_exec.c
1 /*
2   This file is part of GNUnet
3   Copyright (C) 2018 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 /**
19  * @file sq/sq_exec.c
20  * @brief helper functions for executing SQL statements
21  * @author Christian Grothoff
22  */
23 #include "platform.h"
24 #include "gnunet_sq_lib.h"
25
26
27 /**
28  * Create a `struct GNUNET_SQ_ExecuteStatement` where errors are fatal.
29  *
30  * @param sql actual SQL statement
31  * @return initialized struct
32  */
33 struct GNUNET_SQ_ExecuteStatement
34 GNUNET_SQ_make_execute (const char *sql)
35   {
36   struct GNUNET_SQ_ExecuteStatement es = {
37     .sql = sql,
38     .ignore_errors = GNUNET_NO
39   };
40
41   return es;
42 }
43
44
45
46 /**
47  * Create a `struct GNUNET_SQ_ExecuteStatement` where errors should
48  * be tolerated.
49  *
50  * @param sql actual SQL statement
51  * @return initialized struct
52  */
53 struct GNUNET_SQ_ExecuteStatement
54 GNUNET_SQ_make_try_execute (const char *sql)
55 {
56   struct GNUNET_SQ_ExecuteStatement es = {
57     .sql = sql,
58     .ignore_errors = GNUNET_YES
59   };
60
61   return es;
62 }
63
64
65 /**
66  * Request execution of an array of statements @a es from Postgres.
67  *
68  * @param dbh database to execute the statements over
69  * @param es #GNUNET_PQ_PREPARED_STATEMENT_END-terminated array of prepared
70  *            statements.
71  * @return #GNUNET_OK on success (modulo statements where errors can be ignored)
72  *         #GNUNET_SYSERR on error
73  */
74 int
75 GNUNET_SQ_exec_statements (sqlite3 *dbh,
76                            const struct GNUNET_SQ_ExecuteStatement *es)
77 {
78   for (unsigned int i=0;NULL != es[i].sql;i++)
79   {
80     char *emsg = NULL;
81
82     if (SQLITE_OK !=
83         sqlite3_exec (dbh,
84                       es[i].sql,
85                       NULL,
86                       NULL,
87                       &emsg))
88     {
89       if (es[i].ignore_errors)
90       {
91         GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
92                     "Failed to run SQL `%s': %s\n",
93                     es[i].sql,
94                     emsg);
95       }
96       else
97       {
98         GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
99                     "Failed to run SQL `%s': %s\n",
100                     es[i].sql,
101                     emsg);
102         sqlite3_free (emsg);
103         return GNUNET_SYSERR;
104       }
105       sqlite3_free (emsg);
106     }
107   }
108   return GNUNET_OK;
109 }
110
111 /* end of sq_exec */