GNUnet debian-0.26.1
 
Loading...
Searching...
No Matches
pq_connect.c
Go to the documentation of this file.
1/*
2 This file is part of GNUnet
3 Copyright (C) 2017, 2019, 2020, 2021, 2023 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 */
26#include "platform.h"
27#include "pq.h"
28#include <pthread.h>
29
30
36static void
38{
39 if (NULL == db->conn)
40 return;
41 PQfinish (db->conn);
42 db->conn = NULL;
43 db->prepared_check_patch = false;
44 db->prepared_get_oid_by_name = false;
45}
46
47
57{
58 PGresult *res;
59
60 if (db->prepared_check_patch)
61 return GNUNET_OK;
62 res = PQprepare (db->conn,
63 "gnunet_pq_check_patch",
64 "SELECT"
65 " applied_by"
66 " FROM _v.patches"
67 " WHERE patch_name = $1"
68 " LIMIT 1",
69 1,
70 NULL);
71 if (PGRES_COMMAND_OK !=
72 PQresultStatus (res))
73 {
75 "Failed to run SQL logic to setup database versioning logic: %s/%s\n",
76 PQresultErrorMessage (res),
77 PQerrorMessage (db->conn));
78 PQclear (res);
80 return GNUNET_SYSERR;
81 }
82 PQclear (res);
83 db->prepared_check_patch = true;
84 return GNUNET_OK;
85}
86
87
97{
98 PGresult *res;
99
100 if (db->prepared_get_oid_by_name)
101 return GNUNET_OK;
102 res = PQprepare (db->conn,
103 "gnunet_pq_get_oid_by_name",
104 "SELECT typname, oid"
105 " FROM pg_type"
106 " WHERE oid = to_regtype($1)",
107 1,
108 NULL);
109 if (PGRES_COMMAND_OK != PQresultStatus (res))
110 {
112 "Failed to run SQL statement prepare OID lookups: %s/%s\n",
113 PQresultErrorMessage (res),
114 PQerrorMessage (db->conn));
115 PQclear (res);
117 return GNUNET_SYSERR;
118 }
119 PQclear (res);
120 db->prepared_get_oid_by_name = true;
121 return GNUNET_OK;
122}
123
124
138 const char *load_path,
139 unsigned int patch_number)
140{
141 const char *load_path_suffix;
142 size_t slen = strlen (load_path) + 10;
143 char patch_name[slen];
144
145 load_path_suffix = strrchr (load_path,
146 '/');
147 if (NULL == load_path_suffix)
148 load_path_suffix = load_path;
149 else
150 load_path_suffix++; /* skip '/' */
151 GNUNET_snprintf (patch_name,
152 sizeof (patch_name),
153 "%s%04u",
154 load_path_suffix,
155 patch_number);
156 {
157 struct GNUNET_PQ_QueryParam params[] = {
158 GNUNET_PQ_query_param_string (patch_name),
160 };
161 char *applied_by;
162 struct GNUNET_PQ_ResultSpec rs[] = {
163 GNUNET_PQ_result_spec_string ("applied_by",
164 &applied_by),
166 };
167 enum GNUNET_DB_QueryStatus qs;
168
169 if (GNUNET_OK !=
171 {
172 GNUNET_break (0);
173 return GNUNET_SYSERR;
174 }
176 "gnunet_pq_check_patch",
177 params,
178 rs);
179 switch (qs)
180 {
183 "Database version %s already applied by %s\n",
184 patch_name,
185 applied_by);
187 return GNUNET_OK;
189 return GNUNET_NO;
191 GNUNET_break (0);
192 return GNUNET_SYSERR;
194 GNUNET_break (0);
195 return GNUNET_SYSERR;
196 }
197 GNUNET_assert (0);
198 return GNUNET_SYSERR;
199 }
200}
201
202
211static void
213 const PGresult *res)
214{
215 /* do nothing, intentionally */
216 (void) arg;
217 (void) res;
218}
219
220
228static void
230 const char *message)
231{
232 (void) arg;
234 "pq",
235 "%s",
236 message);
237}
238
239
240struct GNUNET_PQ_Context *
242 const char *load_path,
243 const struct GNUNET_PQ_ExecuteStatement *es,
244 const struct GNUNET_PQ_PreparedStatement *ps)
245{
247 load_path,
248 NULL == load_path
249 ? NULL
250 : "",
251 es,
252 ps,
254}
255
256
257struct GNUNET_PQ_Context *
259 const char *load_path,
260 const char *auto_suffix,
261 const struct GNUNET_PQ_ExecuteStatement *es,
262 const struct GNUNET_PQ_PreparedStatement *ps,
264{
265 struct GNUNET_PQ_Context *db;
266 unsigned int elen = 0;
267 unsigned int plen = 0;
268
269 if (NULL != es)
270 while (NULL != es[elen].sql)
271 elen++;
272 if (NULL != ps)
273 while (NULL != ps[plen].name)
274 plen++;
275
277 db->flags = flags;
278 db->config_str = GNUNET_strdup (config_str);
279 if (NULL != load_path)
280 db->load_path = GNUNET_strdup (load_path);
281 if (NULL != auto_suffix)
282 db->auto_suffix = GNUNET_strdup (auto_suffix);
283 if (0 != elen)
284 {
285 db->es = GNUNET_new_array (elen + 1,
287 memcpy (db->es,
288 es,
289 elen * sizeof (struct GNUNET_PQ_ExecuteStatement));
290 }
291 if (0 != plen)
292 {
293 db->ps = GNUNET_new_array (plen + 1,
295 memcpy (db->ps,
296 ps,
297 plen * sizeof (struct GNUNET_PQ_PreparedStatement));
298 }
299 db->channel_map = GNUNET_CONTAINER_multishortmap_create (16,
300 GNUNET_YES);
302 if (NULL == db->conn)
303 {
305 GNUNET_free (db->load_path);
306 GNUNET_free (db->auto_suffix);
307 GNUNET_free (db->config_str);
308 GNUNET_free (db);
309 return NULL;
310 }
311 return db;
312}
313
314
317 const char *buf)
318{
319 struct GNUNET_OS_Process *psql;
321 unsigned long code;
323 char *fn;
324
325 GNUNET_asprintf (&fn,
326 "%s%s.sql",
327 db->load_path,
328 buf);
329 if (GNUNET_YES !=
331 {
333 "SQL resource `%s' does not exist\n",
334 fn);
335 GNUNET_free (fn);
336 return GNUNET_NO;
337 }
338 if (0 != (GNUNET_PQ_FLAG_CHECK_CURRENT & db->flags))
339 return GNUNET_SYSERR;
341 "Applying SQL file `%s' on database %s\n",
342 fn,
343 db->config_str);
345 NULL,
346 NULL,
347 NULL,
348 "psql",
349 "psql",
350 db->config_str,
351 "-f",
352 fn,
353 "-q",
354 "--set",
355 "ON_ERROR_STOP=1",
356 NULL);
357 if (NULL == psql)
358 {
360 "exec",
361 "psql");
362 GNUNET_free (fn);
363 return GNUNET_SYSERR;
364 }
366 &type,
367 &code);
368 if (GNUNET_OK != ret)
369 {
371 "psql on file %s did not finish, killed it!\n",
372 fn);
373 /* can happen if we got a signal, like CTRL-C, before
374 psql was complete */
375 (void) GNUNET_OS_process_kill (psql,
376 SIGKILL);
378 GNUNET_free (fn);
379 return GNUNET_SYSERR;
380 }
382 if ( (GNUNET_OS_PROCESS_EXITED != type) ||
383 (0 != code) )
384 {
386 "Could not run PSQL on file %s: psql exit code was %d\n",
387 fn,
388 (int) code);
389 GNUNET_free (fn);
390 return GNUNET_SYSERR;
391 }
392 GNUNET_free (fn);
393 return GNUNET_OK;
394}
395
396
399 const char *load_suffix)
400{
401 size_t slen = strlen (load_suffix) + 10;
402 char patch_name[slen];
403
405 "Loading SQL resources from `%s'\n",
406 load_suffix);
407 for (unsigned int i = 1; i<10000; i++)
408 {
410
412 load_suffix,
413 i);
414 if (GNUNET_SYSERR == ret)
415 {
416 GNUNET_break (0);
417 return GNUNET_SYSERR;
418 }
419 if (GNUNET_OK == ret)
420 continue; /* patch already applied, skip it */
421
422 GNUNET_snprintf (patch_name,
423 sizeof (patch_name),
424 "%s%04u",
425 load_suffix,
426 i);
428 patch_name);
429 if (GNUNET_NO == ret)
430 break;
431 if ( (GNUNET_SYSERR == ret) &&
432 (0 != (GNUNET_PQ_FLAG_CHECK_CURRENT & db->flags)) )
433 {
434 /* We are only checking, found unapplied patch, bad! */
436 "Database outdated, patch %s missing. Aborting!\n",
437 patch_name);
438 }
439 if (GNUNET_SYSERR == ret)
440 return GNUNET_SYSERR;
441 }
442 return GNUNET_OK;
443}
444
445
446void
448{
449 if (1 ==
450 PQconsumeInput (db->conn))
451 return;
452 if (CONNECTION_BAD != PQstatus (db->conn))
453 return;
455}
456
457
460 struct GNUNET_PQ_Context *db,
461 const char *name,
462 Oid *oid)
463{
464 /* Check if the entry is in the cache already */
465 for (unsigned int i = 0; i < db->oids.num; i++)
466 {
467 /* Pointer comparison */
468 if (name == db->oids.table[i].name)
469 {
470 *oid = db->oids.table[i].oid;
471 return GNUNET_OK;
472 }
473 }
474
475 /* No entry found in cache, ask database */
476 {
477 enum GNUNET_DB_QueryStatus qs;
478 struct GNUNET_PQ_QueryParam params[] = {
481 };
482 struct GNUNET_PQ_ResultSpec spec[] = {
484 oid),
486 };
487
488 GNUNET_assert (NULL != db);
489
491 "gnunet_pq_get_oid_by_name",
492 params,
493 spec);
495 return GNUNET_SYSERR;
496 }
497
498 /* Add the entry to the cache */
499 if (NULL == db->oids.table)
500 {
501 db->oids.table = GNUNET_new_array (8,
502 typeof(*db->oids.table));
503 db->oids.cap = 8;
504 db->oids.num = 0;
505 }
506
507 if (db->oids.cap <= db->oids.num)
508 GNUNET_array_grow (db->oids.table,
509 db->oids.cap,
510 db->oids.cap + 8);
511
512 db->oids.table[db->oids.num].name = name;
513 db->oids.table[db->oids.num].oid = *oid;
514 db->oids.num++;
515
516 return GNUNET_OK;
517}
518
519
530{
531 static const char *typnames[] = {
532 "bool",
533 "int2",
534 "int4",
535 "int8",
536 "bytea",
537 "varchar"
538 };
539 Oid oid;
540
541 for (size_t i = 0; i< sizeof(typnames) / sizeof(*typnames); i++)
542 {
543 if (GNUNET_OK !=
545 typnames[i],
546 &oid))
547 {
549 "pq",
550 "Couldn't retrieve OID for type %s\n",
551 typnames[i]);
552 return GNUNET_SYSERR;
553 }
554 }
555 return GNUNET_OK;
556}
557
558
559void
561{
563 -1);
565 db->conn = PQconnectdb (db->config_str);
566 if ( (NULL == db->conn) ||
567 (CONNECTION_OK != PQstatus (db->conn)) )
568 {
570 "pq",
571 "Database connection to '%s' failed: %s\n",
572 db->config_str,
573 (NULL != db->conn)
574 ? PQerrorMessage (db->conn)
575 : "PQconnectdb returned NULL");
577 return;
578 }
579 PQsetNoticeReceiver (db->conn,
581 db);
582 PQsetNoticeProcessor (db->conn,
584 db);
585 if ( (NULL != db->load_path) &&
586 (NULL != db->auto_suffix) )
587 {
588 PGresult *res;
589 ExecStatusType est;
590
591 res = PQexec (db->conn,
592 "SELECT"
593 " schema_name"
594 " FROM information_schema.schemata"
595 " WHERE schema_name='_v';");
596 est = PQresultStatus (res);
597 if ( (PGRES_COMMAND_OK != est) &&
598 (PGRES_TUPLES_OK != est) )
599 {
601 "Failed to run statement to check versioning schema. Bad!\n");
602 PQclear (res);
604 return;
605 }
606 if (0 == PQntuples (res))
607 {
609
610 PQclear (res);
611 if (0 != (db->flags & GNUNET_PQ_FLAG_DROP))
612 {
614 "Versioning schema does not exist yet. Not attempting drop!\n");
616 return;
617 }
619 "versioning");
620 if (GNUNET_NO == ret)
621 {
623 "Failed to find SQL file to load database versioning logic\n");
625 return;
626 }
627 if (GNUNET_SYSERR == ret)
628 {
630 "Failed to run SQL logic to setup database versioning logic\n");
632 return;
633 }
634 }
635 else
636 {
637 PQclear (res);
638 }
639 }
640
641 /* Prepare statement for OID lookup by name */
642 if (GNUNET_OK !=
644 return;
645
646 /* Reset the OID-cache and retrieve the OIDs for the supported Array types */
647 db->oids.num = 0;
649 {
651 "Failed to retrieve OID information for array types!\n");
653 return;
654 }
655
656 if (NULL != db->auto_suffix)
657 {
658 GNUNET_assert (NULL != db->load_path);
659 if (GNUNET_OK !=
661 return;
662
663 if (GNUNET_SYSERR ==
665 db->auto_suffix))
666 {
667 if (0 == (GNUNET_PQ_FLAG_CHECK_CURRENT & db->flags))
669 "Failed to load SQL statements from `%s*'\n",
670 db->auto_suffix);
672 return;
673 }
674 }
675
676 if ( (NULL != db->es) &&
677 (GNUNET_OK !=
679 db->es)) )
680 {
682 return;
683 }
684 if ( (NULL != db->ps) &&
685 (GNUNET_OK !=
687 db->ps)) )
688 {
690 return;
691 }
693 PQsocket (db->conn));
694}
695
696
697struct GNUNET_PQ_Context *
699 const char *section,
700 const char *load_path_suffix,
701 const struct GNUNET_PQ_ExecuteStatement *es,
702 const struct GNUNET_PQ_PreparedStatement *ps)
703{
705 section,
706 load_path_suffix,
707 es,
708 ps,
710}
711
712
713struct GNUNET_PQ_Context *
715 const char *section,
716 const char *load_path_suffix,
717 const struct GNUNET_PQ_ExecuteStatement *es,
718 const struct GNUNET_PQ_PreparedStatement *ps,
720{
721 struct GNUNET_PQ_Context *db;
722 char *conninfo;
723 char *load_path;
724
725 if (GNUNET_OK !=
727 section,
728 "CONFIG",
729 &conninfo))
730 conninfo = NULL;
731 load_path = NULL;
732 if (GNUNET_OK !=
734 section,
735 "SQL_DIR",
736 &load_path))
737 {
739 section,
740 "SQL_DIR");
741 }
742 if ( (NULL != load_path_suffix) &&
743 (NULL == load_path) )
744 {
746 section,
747 "SQL_DIR");
748 return NULL;
749 }
750 db = GNUNET_PQ_connect2 (conninfo == NULL ? "" : conninfo,
751 load_path,
752 load_path_suffix,
753 es,
754 ps,
755 flags);
757 GNUNET_free (conninfo);
758 return db;
759}
760
761
762void
764{
765 if (NULL == db)
766 return;
767 GNUNET_assert (0 ==
770 if (NULL != db->poller_task)
771 {
772 GNUNET_SCHEDULER_cancel (db->poller_task);
773 db->poller_task = NULL;
774 }
775 GNUNET_free (db->es);
776 GNUNET_free (db->ps);
777 GNUNET_free (db->load_path);
778 GNUNET_free (db->auto_suffix);
779 GNUNET_free (db->config_str);
780 GNUNET_free (db->oids.table);
781 db->oids.table = NULL;
782 db->oids.num = 0;
783 db->oids.cap = 0;
784 PQfinish (db->conn);
785 GNUNET_free (db);
786}
787
788
789/* end of pq/pq_connect.c */
static int ret
Final status code.
Definition gnunet-arm.c:93
static struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
Definition gnunet-arm.c:108
static struct GNUNET_PEERSTORE_Handle * ps
Handle to the PEERSTORE service.
static char * name
Name (label) of the records to list.
static char * res
Currently read line or NULL on EOF.
static uint32_t type
Type string converted to DNS type value.
static struct GNUNET_FS_DirectoryBuilder * db
GNUNET_DB_QueryStatus
Status code returned from functions running database commands.
@ GNUNET_DB_STATUS_SUCCESS_ONE_RESULT
The transaction succeeded, and yielded one result.
@ GNUNET_DB_STATUS_HARD_ERROR
A hard error occurred, retrying will not help.
@ GNUNET_DB_STATUS_SUCCESS_NO_RESULTS
The transaction succeeded, but yielded zero results.
@ GNUNET_DB_STATUS_SOFT_ERROR
A soft error occurred, retrying the transaction may succeed.
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_uint32(const char *name, uint32_t *u32)
uint32_t expected.
enum GNUNET_DB_QueryStatus GNUNET_PQ_eval_prepared_singleton_select(struct GNUNET_PQ_Context *db, const char *statement_name, const struct GNUNET_PQ_QueryParam *params, struct GNUNET_PQ_ResultSpec *rs)
Execute a named prepared statement that is a SELECT statement which must return a single result in co...
Definition pq_eval.c:199
enum GNUNET_GenericReturnValue GNUNET_PQ_exec_statements(struct GNUNET_PQ_Context *db, const struct GNUNET_PQ_ExecuteStatement *es)
Request execution of an array of statements es from Postgres.
Definition pq_exec.c:54
enum GNUNET_GenericReturnValue GNUNET_PQ_prepare_statements(struct GNUNET_PQ_Context *db, const struct GNUNET_PQ_PreparedStatement *ps)
Request creation of prepared statements ps from Postgres.
Definition pq_prepare.c:88
struct GNUNET_PQ_ResultSpec GNUNET_PQ_result_spec_string(const char *name, char **dst)
0-terminated string expected.
#define GNUNET_PQ_query_param_end
End of query parameter specification.
GNUNET_PQ_Options
Flags to control PQ operation.
@ GNUNET_PQ_FLAG_DROP
Dropping database.
@ GNUNET_PQ_FLAG_CHECK_CURRENT
Check database version is current.
@ GNUNET_PQ_FLAG_NONE
Traditional default.
void GNUNET_PQ_cleanup_result(struct GNUNET_PQ_ResultSpec *rs)
Free all memory that was allocated in rs during GNUNET_PQ_extract_result().
Definition pq.c:142
uint32_t oid
struct GNUNET_PQ_QueryParam GNUNET_PQ_query_param_string(const char *ptr)
Generate query parameter for a string.
#define GNUNET_PQ_result_spec_end
End of result parameter specification.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_filename(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, char **value)
Get a configuration value that should be the name of a file or directory.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_string(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, char **value)
Get a configuration value that should be a string.
enum GNUNET_GenericReturnValue GNUNET_DISK_file_test_read(const char *fil)
Check that fil corresponds to a filename and the file has read permissions.
Definition disk.c:540
struct GNUNET_CONTAINER_MultiShortmap * GNUNET_CONTAINER_multishortmap_create(unsigned int len, int do_not_copy_keys)
Create a multi peer map (hash map for public keys of peers).
void GNUNET_CONTAINER_multishortmap_destroy(struct GNUNET_CONTAINER_MultiShortmap *map)
Destroy a hash map.
unsigned int GNUNET_CONTAINER_multishortmap_size(const struct GNUNET_CONTAINER_MultiShortmap *map)
Get the number of key-value pairs in the map.
#define GNUNET_log(kind,...)
#define GNUNET_log_from(kind, comp,...)
GNUNET_GenericReturnValue
Named constants for return values.
@ GNUNET_OK
@ GNUNET_YES
@ GNUNET_NO
@ GNUNET_SYSERR
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
void GNUNET_log_config_missing(enum GNUNET_ErrorType kind, const char *section, const char *option)
Log error message about missing configuration option.
#define GNUNET_log_strerror_file(level, cmd, filename)
Log an error message at log-level 'level' that indicates a failure of the command 'cmd' with the mess...
@ GNUNET_ERROR_TYPE_WARNING
@ GNUNET_ERROR_TYPE_ERROR
@ GNUNET_ERROR_TYPE_DEBUG
@ GNUNET_ERROR_TYPE_INFO
int int GNUNET_asprintf(char **buf, const char *format,...) __attribute__((format(printf
Like asprintf, just portable.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define GNUNET_array_grow(arr, size, tsize)
Grow a well-typed (!) array.
int GNUNET_snprintf(char *buf, size_t size, const char *format,...) __attribute__((format(printf
Like snprintf, just aborts if the buffer is of insufficient size.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_new_array(n, type)
Allocate a size n array with structs or unions of the given type.
#define GNUNET_free(ptr)
Wrapper around free.
struct GNUNET_OS_Process * GNUNET_OS_start_process(enum GNUNET_OS_InheritStdioFlags std_inheritance, struct GNUNET_DISK_PipeHandle *pipe_stdin, struct GNUNET_DISK_PipeHandle *pipe_stdout, struct GNUNET_DISK_PipeHandle *pipe_stderr, const char *filename,...)
Start a process.
enum GNUNET_GenericReturnValue GNUNET_OS_process_wait_status(struct GNUNET_OS_Process *proc, enum GNUNET_OS_ProcessStatusType *type, unsigned long *code)
Retrieve the status of a process, waiting on it if dead.
GNUNET_OS_ProcessStatusType
Process status types.
void GNUNET_OS_process_destroy(struct GNUNET_OS_Process *proc)
Cleans up process structure contents (OS-dependent) and deallocates it.
int GNUNET_OS_process_kill(struct GNUNET_OS_Process *proc, int sig)
Sends a signal to the process.
@ GNUNET_OS_INHERIT_STD_NONE
No standard streams should be inherited.
@ GNUNET_OS_PROCESS_EXITED
The process exited with a return code.
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition scheduler.c:980
shared internal data structures of libgnunetpq
void GNUNET_PQ_event_reconnect_(struct GNUNET_PQ_Context *db, int fd)
Internal API.
Definition pq_event.c:434
static enum GNUNET_GenericReturnValue check_patch_applied(struct GNUNET_PQ_Context *db, const char *load_path, unsigned int patch_number)
Check if the patch with patch_number from the given load_path was already applied on the db.
Definition pq_connect.c:137
void GNUNET_PQ_reconnect(struct GNUNET_PQ_Context *db)
Reinitialize the database db.
Definition pq_connect.c:560
struct GNUNET_PQ_Context * GNUNET_PQ_connect_with_cfg(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *load_path_suffix, const struct GNUNET_PQ_ExecuteStatement *es, const struct GNUNET_PQ_PreparedStatement *ps)
Connect to a postgres database using the configuration option "CONFIG" in section.
Definition pq_connect.c:698
static enum GNUNET_GenericReturnValue prepare_check_patch(struct GNUNET_PQ_Context *db)
Prepare the "gnunet_pq_check_patch" statement.
Definition pq_connect.c:56
struct GNUNET_PQ_Context * GNUNET_PQ_connect2(const char *config_str, const char *load_path, const char *auto_suffix, const struct GNUNET_PQ_ExecuteStatement *es, const struct GNUNET_PQ_PreparedStatement *ps, enum GNUNET_PQ_Options flags)
Create a connection to the Postgres database using config_str for the configuration.
Definition pq_connect.c:258
static void pq_notice_receiver_cb(void *arg, const PGresult *res)
Function called by libpq whenever it wants to log something.
Definition pq_connect.c:212
static void reset_connection(struct GNUNET_PQ_Context *db)
Close connection to db and mark it as uninitialized.
Definition pq_connect.c:37
static enum GNUNET_GenericReturnValue prepare_get_oid_by_name(struct GNUNET_PQ_Context *db)
Prepare the "gnunet_pq_get_oid_by_name" statement.
Definition pq_connect.c:96
void GNUNET_PQ_reconnect_if_down(struct GNUNET_PQ_Context *db)
Reinitialize the database db if the connection is down.
Definition pq_connect.c:447
void GNUNET_PQ_disconnect(struct GNUNET_PQ_Context *db)
Disconnect from the database, destroying the prepared statements and releasing other associated resou...
Definition pq_connect.c:763
struct GNUNET_PQ_Context * GNUNET_PQ_connect_with_cfg2(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *load_path_suffix, const struct GNUNET_PQ_ExecuteStatement *es, const struct GNUNET_PQ_PreparedStatement *ps, enum GNUNET_PQ_Options flags)
Connect to a postgres database using the configuration option "CONFIG" in section.
Definition pq_connect.c:714
static void pq_notice_processor_cb(void *arg, const char *message)
Function called by libpq whenever it wants to log something.
Definition pq_connect.c:229
enum GNUNET_GenericReturnValue GNUNET_PQ_get_oid_by_name(struct GNUNET_PQ_Context *db, const char *name, Oid *oid)
Returns the oid for a given datatype by name.
Definition pq_connect.c:459
enum GNUNET_GenericReturnValue GNUNET_PQ_exec_sql(struct GNUNET_PQ_Context *db, const char *buf)
Execute SQL statements from buf against db.
Definition pq_connect.c:316
static enum GNUNET_GenericReturnValue load_initial_oids(struct GNUNET_PQ_Context *db)
Load the initial set of OIDs for the supported array-datatypes.
Definition pq_connect.c:529
struct GNUNET_PQ_Context * GNUNET_PQ_connect(const char *config_str, const char *load_path, const struct GNUNET_PQ_ExecuteStatement *es, const struct GNUNET_PQ_PreparedStatement *ps)
Create a connection to the Postgres database using config_str for the configuration.
Definition pq_connect.c:241
enum GNUNET_GenericReturnValue GNUNET_PQ_run_sql(struct GNUNET_PQ_Context *db, const char *load_suffix)
Within the db context, run all the SQL files in the load path where the name starts with the load_suf...
Definition pq_connect.c:398
Handle to Postgres database.
Definition pq.h:36
struct GNUNET_PQ_ExecuteStatement * es
Statements to execute upon connection.
Definition pq.h:45
enum GNUNET_PQ_Options flags
Flags controlling the connection.
Definition pq.h:106
char * load_path
Path to load SQL files from.
Definition pq.h:70
char * config_str
Configuration to use to connect to the DB.
Definition pq.h:65
char * auto_suffix
Suffix to append to path to load on startup.
Definition pq.h:75
Information needed to run a list of SQL statements using GNUNET_PQ_exec_statements().
Information needed to prepare a list of SQL statements using GNUNET_PQ_prepare_statements().
Description of a DB query parameter.
Description of a DB result cell.