31 #include <arpa/inet.h> 34 #include <netinet/in.h> 35 #include <postgresql/libpq-fe.h> 39 #include <openvas/base/array.h> 45 #define G_LOG_DOMAIN "md manage" 129 static char string[20];
132 if (snprintf (
string, 19,
"%i", max) < 0)
134 g_warning (
"%s: snprintf failed\n", __FUNCTION__);
150 sql_stmt_param_add (
sql_stmt_t *stmt,
const char *param_value,
151 int param_size,
int param_format)
153 array_add (stmt->
param_values, g_strndup (param_value, param_size));
166 memset (stmt, 0,
sizeof (*stmt));
168 stmt->
param_lengths = g_array_new (FALSE, TRUE,
sizeof (
int));
169 stmt->
param_formats = g_array_new (FALSE, TRUE,
sizeof (
int));
215 log_notice (
void *arg,
const char *message)
217 g_debug (
"%s", message);
253 PostgresPollingStatusType poll_status;
256 conn_info = g_strdup_printf (
"dbname='%s' application_name='%s'",
261 conn = PQconnectStart (conn_info);
265 g_warning (
"%s: PQconnectStart failed to allocate conn\n",
269 if (PQstatus (
conn) == CONNECTION_BAD)
271 g_warning (
"%s: PQconnectStart to '%s' failed: %s\n",
274 PQerrorMessage (
conn));
278 socket = PQsocket (
conn);
281 g_warning (
"%s: PQsocket 0\n", __FUNCTION__);
285 poll_status = PGRES_POLLING_WRITING;
287 g_debug (
"%s: polling\n", __FUNCTION__);
291 if (poll_status == PGRES_POLLING_READING)
293 fd_set readfds, writefds;
298 FD_SET (socket, &readfds);
299 ret = select (socket + 1, &readfds, &writefds, NULL, NULL);
304 g_warning (
"%s: write select failed: %s\n",
305 __FUNCTION__, strerror (errno));
310 else if (poll_status == PGRES_POLLING_WRITING)
312 fd_set readfds, writefds;
317 FD_SET (socket, &writefds);
318 ret = select (socket + 1, &readfds, &writefds, NULL, NULL);
323 g_warning (
"%s: read select failed: %s\n",
324 __FUNCTION__, strerror (errno));
329 else if (poll_status == PGRES_POLLING_FAILED)
331 g_warning (
"%s: PQconnectPoll failed\n",
335 else if (poll_status == PGRES_POLLING_OK)
339 poll_status = PQconnectPoll (
conn);
342 PQsetNoticeProcessor (
conn, log_notice, NULL);
344 g_debug (
"%s: db: %s\n", __FUNCTION__, PQdb (
conn));
345 g_debug (
"%s: user: %s\n", __FUNCTION__, PQuser (
conn));
346 g_debug (
"%s: host: %s\n", __FUNCTION__, PQhost (
conn));
347 g_debug (
"%s: port: %s\n", __FUNCTION__, PQport (
conn));
348 g_debug (
"%s: socket: %i\n", __FUNCTION__, PQsocket (
conn));
349 g_debug (
"%s: postgres version: %i\n", __FUNCTION__, PQserverVersion (
conn));
397 return sql_int (
"SELECT LASTVAL ();");
415 assert (
sql && strlen (
sql) && (
sql[strlen (
sql) - 1] !=
';'));
419 new_sql = g_strdup_printf (
"%s RETURNING id;",
sql);
423 va_start (args,
sql);
424 sql_x_ret =
sql_x (new_sql, args, &stmt);
464 sql_stmt_init (*stmt);
465 (*stmt)->sql = g_strdup_vprintf (
sql, args);
468 g_debug (
" sql: %s\n", (*stmt)->sql);
492 result = PQexecParams (
conn,
500 if (PQresultStatus (result) != PGRES_TUPLES_OK
501 && PQresultStatus (result) != PGRES_COMMAND_OK)
505 sqlstate = PQresultErrorField (result, PG_DIAG_SQLSTATE);
506 g_debug (
"%s: sqlstate: %s\n", __FUNCTION__, sqlstate);
507 if (sqlstate && (strcmp (sqlstate,
"57014") == 0))
510 g_debug (
"%s: canceled SQL: %s\n", __FUNCTION__, stmt->
sql);
515 g_warning (
"%s: PQexec failed: %s (%i)\n",
517 PQresultErrorMessage (result),
518 PQresultStatus (result));
519 g_warning (
"%s: SQL: %s\n", __FUNCTION__, stmt->
sql);
557 explain_sql = g_strconcat (
"EXPLAIN ",
sql, NULL);
561 g_warning (
"%s : Failed to prepare EXPLAIN statement", __FUNCTION__);
562 g_free (explain_sql);
569 if (explain_ret == 1)
572 PQgetvalue (explain_stmt->
result,
575 else if (explain_ret == 0)
579 g_warning (
"%s : Failed to get EXPLAIN row", __FUNCTION__);
581 g_free (explain_sql);
587 g_free (explain_sql);
601 sql (
"SELECT pg_advisory_xact_lock (1);");
617 if (
sql_int (
"SELECT pg_try_advisory_xact_lock (1);"))
726 bind_param (
sql_stmt_t *stmt,
int position,
const void *param_value,
727 int param_size,
int param_format)
731 g_critical (
"%s: binding out of order: parameter %i after %i",
737 sql_stmt_param_add (stmt, param_value, param_size, param_format);
754 bind_param (stmt, position, value, value_size, 1);
773 bind_param (stmt, position, &actual,
sizeof (actual), 1);
790 string = g_strdup_printf (
"%f", *value);
791 bind_param (stmt, position,
string, strlen (
string), 0);
813 value_size == -1 ? strlen (value) : value_size,
852 sql_stmt_init (stmt);
915 switch (PQftype (stmt->
result, position))
918 return strcmp (cell,
"f") ? 1 : 0;
945 switch (PQftype (stmt->
result, position))
948 return strcmp (cell,
"f") ? 1 : 0;
964 char errbuf[256] =
"";
966 cancel = PQgetCancel (
conn);
969 if (PQcancel (cancel, errbuf, 256))
972 PQfreeCancel (cancel);
976 PQfreeCancel (cancel);
int executed
Whether statement has been executed.
const char * sql_schema()
Get main schema name.
const char * sql_select_limit(int max)
Setup a LIMIT argument.
array_t * param_values
Parameter values.
int sql_int(char *sql,...)
Get a particular cell from a SQL query, as an int.
int sql_reset(sql_stmt_t *stmt)
Reset a prepared statement.
int sql_bind_int64(sql_stmt_t *stmt, int position, long long int *value)
Bind an int64 value to a statement.
int sql_begin_exclusive_giveup()
Begin an exclusive transaction, giving up on failure.
int sql_is_open()
Check whether the database is open.
void sql_begin_exclusive()
Begin an exclusive transaction.
int sql_prepare_internal(int retry, int log, const char *sql, va_list args, sql_stmt_t **stmt)
Prepare a statement.
int sql_giveup(char *sql,...)
Perform an SQL statement, giving up if database is busy or locked.
void sql_commit()
Commit a transaction.
void sql(char *sql,...)
Perform an SQL statement, retrying if database is busy or locked.
int sql_bind_blob(sql_stmt_t *stmt, int position, const void *value, int value_size)
Bind a blob to a statement.
const char * sql_default_database()
Return name of default database.
void sql_close_fork()
Close the database in a forked process.
int sql_open(const char *database)
Open the database.
int sql_begin_immediate_giveup()
Begin an immediate transaction.
int log_errors
Whether to log errors.
int sql_explain_internal(const char *sql, va_list args)
Write debug messages with the query plan for an SQL query to the log.
void sql_finalize(sql_stmt_t *stmt)
Free a prepared statement.
sql_stmt_t * stmt
SQL statement.
const char * sql_greatest()
Get keyword for "greatest" SQL function.
int sql_cancel_internal()
Cancels the current SQL statement.
int sql_is_sqlite3()
Get whether backend is SQLite3.
const char * sql_regexp_op()
Get regular expression operator.
long long int sql_column_int64(sql_stmt_t *stmt, int position)
Return a column as an int64 from a prepared statement.
int sql_changes()
Return 0.
void sql_close()
Close the database.
int sql_x(char *, va_list args, sql_stmt_t **)
Get a particular cell from a SQL query.
const char * sql_column_text(sql_stmt_t *stmt, int position)
Return a column as text from a prepared statement.
void sql_begin_immediate()
Begin an immediate transaction.
int sql_bind_text(sql_stmt_t *stmt, int position, const gchar *value, gsize value_size)
Bind a text value to a statement.
const char * sql_database()
Return name of current database.
GArray * param_lengths
Parameter lengths (int's).
int iterator_null(iterator_t *iterator, int col)
Get whether a column is NULL.
int sql_exec_internal(int retry, sql_stmt_t *stmt)
Execute a prepared statement.
int sql_bind_double(sql_stmt_t *stmt, int position, double *value)
Bind a double value to a statement.
double sql_column_double(sql_stmt_t *stmt, int position)
Return a column as a double from a prepared statement.
int sql_column_int(sql_stmt_t *stmt, int position)
Return a column as an integer from a prepared statement.
gchar * sql
SQL statement.
int current_row
Row position in results.
int iterator_column_count(iterator_t *iterator)
Get number of columns from an iterator.
GArray * param_formats
Parameter formats (int's).
PGconn * conn
Handle on the database.
PGresult * result
Result set.
void sqli(resource_t *resource, char *sql,...)
Perform an SQL statement, retrying if database is busy or locked.
void sql_rollback()
Roll a transaction back.
const char * iterator_column_name(iterator_t *iterator, int col)
Get a column name from an iterator.
resource_t sql_last_insert_id()
Get the ID of the last inserted row.
const char * sql_ilike_op()
Get case insensitive LIKE operator.
long long int resource_t
A resource, like a task or target.