40 #define DB_CHUNK_SIZE 1 * 1024 * 1024 46 #define G_LOG_DOMAIN "md manage" 51 #define BUSY_TIMEOUT 1000 57 sqlv (
int,
char*, va_list);
121 static char string[20];
124 if (snprintf (
string, 19,
"%i", max) < 0)
126 g_warning (
"%s: snprintf failed\n", __FUNCTION__);
186 return OPENVAS_STATE_DIR
"/mgr/tasks.db";
206 mgr_dir = g_build_filename (OPENVAS_STATE_DIR,
"mgr", NULL);
207 ret = g_mkdir_with_parents (mgr_dir, 0755 );
211 g_warning (
"%s: failed to create mgr directory: %s\n",
225 g_warning (
"%s: failed to stat database: %s\n",
230 else if (state.st_mode & (S_IXUSR | S_IRWXG | S_IRWXO))
232 g_warning (
"%s: database permissions are too loose, repairing\n",
237 g_warning (
"%s: chmod failed: %s\n",
246 #if SQLITE_VERSION_NUMBER < 3008003 247 sqlite3_test_control (SQLITE_TESTCTRL_PRNG_RESET);
253 g_warning (
"%s: sqlite3_open failed: %s\n",
261 g_debug (
" %s: db open, max retry sleep time is %i\n",
263 OPENVAS_SQLITE_SLEEP_MAX);
265 sqlite3_file_control (
task_db, NULL, SQLITE_FCNTL_CHUNK_SIZE, &chunk_size);
267 sql (
"PRAGMA journal_mode=WAL;");
268 sql (
"PRAGMA journal_size_limit=134217728;");
279 if (sqlite3_close (
task_db) == SQLITE_BUSY)
287 g_warning (
"%s: attempt to close db with open statement(s)\n",
307 return sqlite3_changes (
task_db);
316 return sqlite3_last_insert_rowid (
task_db);
331 va_start (args, sql);
332 if (
sqlv (1, sql, args) == -1)
356 unsigned int retries;
358 sqlite3_stmt *sqlite_stmt;
362 formatted = g_strdup_vprintf (sql, args);
365 g_debug (
" sql: %s\n", formatted);
368 sqlite3_busy_timeout (
task_db, 0);
375 ret = sqlite3_prepare_v2 (
task_db, (
char*) formatted, -1, &sqlite_stmt,
377 if (ret == SQLITE_BUSY || ret == SQLITE_LOCKED)
381 if ((retries > 10) && (OPENVAS_SQLITE_SLEEP_MAX > 0))
383 OPENVAS_SQLITE_SLEEP_MAX));
395 (*stmt)->stmt = sqlite_stmt;
396 if (ret == SQLITE_OK)
398 if (sqlite_stmt == NULL)
400 g_warning (
"%s: sqlite3_prepare failed with NULL stmt: %s\n",
409 g_warning (
"%s: sqlite3_prepare failed: %s\n",
435 unsigned int retries;
438 sqlite3_busy_timeout (
task_db, 0);
444 ret = sqlite3_step (stmt->
stmt);
445 if (ret == SQLITE_BUSY)
449 if ((retries > 10) && (OPENVAS_SQLITE_SLEEP_MAX > 0))
451 OPENVAS_SQLITE_SLEEP_MAX));
461 if (ret == SQLITE_DONE)
463 if (ret == SQLITE_ROW)
465 g_warning (
"%s: sqlite3_step failed: %s\n",
487 explain_sql = g_strconcat (
"EXPLAIN QUERY PLAN ", sql, NULL);
490 g_warning (
"%s : Failed to prepare EXPLAIN statement", __FUNCTION__);
491 g_free (explain_sql);
498 if (explain_ret == 1)
499 g_debug (
"%s : %s|%s|%s|%s",
501 sqlite3_column_text (explain_stmt->
stmt, 0),
502 sqlite3_column_text (explain_stmt->
stmt, 1),
503 sqlite3_column_text (explain_stmt->
stmt, 2),
504 sqlite3_column_text (explain_stmt->
stmt, 3));
505 else if (explain_ret == 0)
509 g_warning (
"%s : Failed to get EXPLAIN row", __FUNCTION__);
511 g_free (explain_sql);
517 g_free (explain_sql);
530 sql (
"BEGIN EXCLUSIVE;");
550 sql (
"BEGIN IMMEDIATE;");
596 if (iterator->
done) abort ();
597 return sqlite3_column_type (iterator->
stmt->
stmt, col) == SQLITE_NULL;
611 if (iterator->
done) abort ();
612 return (
const char*) sqlite3_column_name (iterator->
stmt->
stmt, col);
625 if (iterator->
done) abort ();
626 return sqlite3_column_count (iterator->
stmt->
stmt);
646 unsigned int retries;
651 ret = sqlite3_bind_blob (stmt->
stmt,
656 if (ret == SQLITE_BUSY)
658 if ((retries > 10) && (OPENVAS_SQLITE_SLEEP_MAX > 0))
660 OPENVAS_SQLITE_SLEEP_MAX));
664 if (ret == SQLITE_OK)
break;
665 g_warning (
"%s: sqlite3_bind_blob failed: %s\n",
685 unsigned int retries;
690 ret = sqlite3_bind_int64 (stmt->
stmt, position, *value);
691 if (ret == SQLITE_BUSY)
693 if ((retries > 10) && (OPENVAS_SQLITE_SLEEP_MAX > 0))
695 OPENVAS_SQLITE_SLEEP_MAX));
699 if (ret == SQLITE_OK)
break;
700 g_warning (
"%s: sqlite3_bind_int64 failed: %s\n",
720 unsigned int retries;
725 ret = sqlite3_bind_double (stmt->
stmt, position, *value);
726 if (ret == SQLITE_BUSY)
728 if ((retries > 10) && (OPENVAS_SQLITE_SLEEP_MAX > 0))
730 OPENVAS_SQLITE_SLEEP_MAX));
734 if (ret == SQLITE_OK)
break;
735 g_warning (
"%s: sqlite3_bind_double failed: %s\n",
757 unsigned int retries;
762 ret = sqlite3_bind_text (stmt->
stmt,
767 if (ret == SQLITE_BUSY)
769 if ((retries > 10) && (OPENVAS_SQLITE_SLEEP_MAX > 0))
771 OPENVAS_SQLITE_SLEEP_MAX));
775 if (ret == SQLITE_OK)
break;
776 g_warning (
"%s: sqlite3_bind_text failed: %s\n",
793 sqlite3_finalize (stmt->
stmt);
807 unsigned int retries;
808 sqlite3_clear_bindings (stmt->
stmt);
813 ret = sqlite3_reset (stmt->
stmt);
814 if (ret == SQLITE_BUSY)
816 if ((retries > 10) && (OPENVAS_SQLITE_SLEEP_MAX > 0))
818 OPENVAS_SQLITE_SLEEP_MAX));
822 if (ret == SQLITE_DONE || ret == SQLITE_OK)
break;
823 if (ret == SQLITE_ERROR || ret == SQLITE_MISUSE)
825 g_warning (
"%s: sqlite3_reset failed: %s\n",
845 return sqlite3_column_double (stmt->
stmt, position);
859 return (
const char*) sqlite3_column_text (stmt->
stmt, position);
873 return sqlite3_column_int (stmt->
stmt, position);
887 return sqlite3_column_int64 (stmt->
stmt, position);
int sql_bind_double(sql_stmt_t *stmt, int position, double *value)
Bind a double value to a statement.
int sql_is_open()
Check whether the database is open.
void sql_close_fork()
Close the database in a forked process.
sqlite3 * task_db
Handle on the database.
int sql_begin_immediate_giveup()
Begin an exclusive transaction.
const char * sql_greatest()
Get keyword for "greatest" SQL function.
#define BUSY_TIMEOUT
Busy timeout, in milliseconds.
#define DB_CHUNK_SIZE
Chunk size for SQLite memory allocation.
int sql_prepare_internal(int retry, int log, const char *sql, va_list args, sql_stmt_t **stmt)
Prepare a statement.
const char * iterator_column_name(iterator_t *iterator, int col)
Get a column name from an iterator.
int sql_explain_internal(const char *sql, va_list args)
Write debug messages with the query plan for an SQL query to the log.
int sql_column_int(sql_stmt_t *stmt, int position)
Return a column as an integer from a prepared statement.
int sql_giveup(char *sql,...)
Perform an SQL statement, giving up if database is busy or locked.
int sql_changes()
Get the number of rows changed or inserted in last statement.
resource_t sql_last_insert_id()
Get the ID of the last inserted row.
void sql_begin_immediate()
Begin an exclusive transaction.
void sql_begin_exclusive()
Begin an exclusive transaction.
int sql_cancel_internal()
Cancels the current SQL statement.
void sql_commit()
Commit a transaction.
const char * sql_database()
Return file name of current database.
int sql_bind_int64(sql_stmt_t *stmt, int position, long long int *value)
Bind an int64 value to a statement.
void sql_close()
Close the database.
int sql_open(const char *database)
Open the database.
int sql_begin_exclusive_giveup()
Begin an exclusive transaction, giving up on failure.
void sql_rollback()
Roll a transaction back.
int sql_exec_internal(int retry, sql_stmt_t *stmt)
Execute a prepared statement.
sql_stmt_t * stmt
SQL statement.
const char * sql_select_limit(int max)
Setup a LIMIT argument.
const char * sql_schema()
Get main schema name.
const char * sql_ilike_op()
Get case insensitive LIKE operator.
int openvas_usleep(unsigned int microseconds)
Sleep for some number of microseconds, handling interrupts.
int sql_reset(sql_stmt_t *stmt)
Reset a prepared statement.
const char * sql_regexp_op()
Get regular expression operator.
int iterator_column_count(iterator_t *iterator)
Get number of columns from an iterator.
const char * sql_column_text(sql_stmt_t *stmt, int position)
Return a column as text from a prepared statement.
int sqlv(int, char *, va_list)
Perform an SQL statement.
int sql_bind_text(sql_stmt_t *stmt, int position, const gchar *value, gsize value_size)
Bind a text value to a statement.
gchar * sql
SQL statement.
long long int sql_column_int64(sql_stmt_t *stmt, int position)
Return a column as an int64 from a prepared statement.
const char * sql_default_database()
Return name of default database file.
void sqli(resource_t *resource, char *sql,...)
Perform an SQL statement, retrying if database is busy or locked.
int iterator_null(iterator_t *iterator, int col)
Get whether a column is NULL.
int sql_bind_blob(sql_stmt_t *stmt, int position, const void *value, int value_size)
Bind a blob to a statement.
void sql_finalize(sql_stmt_t *stmt)
Free a prepared statement.
double sql_column_double(sql_stmt_t *stmt, int position)
Return a column as a double from a prepared statement.
int sql_is_sqlite3()
Get whether backend is SQLite3.
long long int resource_t
A resource, like a task or target.