diff options
Diffstat (limited to 'postgresql.c')
-rw-r--r-- | postgresql.c | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/postgresql.c b/postgresql.c new file mode 100644 index 0000000..5f799bf --- /dev/null +++ b/postgresql.c @@ -0,0 +1,123 @@ +/* + qureje is a database managment tool. + Copyright (C) 2022 Alessandro Iezzi <aiezzi AT alessandroiezzi PERIOD it> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +#include <libpq-fe.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "database.h" +#include "utils.h" + +static char * +parameter(const char *key, char *value) +{ + int vsize = 0; + char *param = NULL; + + if (value == NULL || (vsize = strlen(value)) <= 0) return NULL; + + param = strcrt(strlen(key) + vsize + 2); + strcat(param, key); + strcat(param, "="); + strcat(param, value); + strcat(param, " "); + + return param; +} + +static void +prmcat(char *conninfo, char *prm) +{ + if (prm != NULL) { + strcat(conninfo, prm); + free(prm); + } +} + +static char * +create_connection_info(qureje_conn *conn) +{ + int strsize = 0; + char *conninfo, + *prmusr = NULL, + *prmdb = NULL; + + if ((prmusr = parameter("user", conn->user)) != NULL) { + strsize += strlen(prmusr); + } + + if ((prmdb = parameter("dbname", conn->dbname)) != NULL) { + strsize += strlen(prmdb); + } + + conninfo = strcrt(strsize + 1); + + prmcat(conninfo, prmusr); + prmcat(conninfo, prmdb ); + + return conninfo; +} + +int +qureje_psql_connect(qureje_conn *conn) +{ + char *conninfo = NULL; + PGconn *pgconn; + + if (conn == NULL) return 1; + + conninfo = create_connection_info(conn); + /* + * Using an empty connectstring will use default values for everything. + * If set, the environment variables PGHOST, PGDATABASE, PGPORT and + * PGUSER will be used. + */ + pgconn = PQconnectdb(conninfo); + + free(conninfo); + + /* + * This can only happen if there is not enough memory + * to allocate the PGconn structure. + */ + if (pgconn == NULL) { + fprintf(stderr, "Out of memory connecting to PostgreSQL.\n"); + + return 1; + } + + /* check if the connection attempt worked */ + if (PQstatus(pgconn) != CONNECTION_OK) { + fprintf(stderr, "%s\n", PQerrorMessage(pgconn)); + /* + * Even if the connection failed, the PGconn structure has been + * allocated and must be freed. + */ + PQfinish(pgconn); + + return 1; + } + + /* this program expects the database to return data in UTF-8 */ + PQsetClientEncoding(pgconn, "UTF8"); + + conn->conn = pgconn; + + return 0; +} |