int sqlite3_intarray_create(sqlite3_intarray_module *module, char *zName, sqlite3_intarray **ppReturn) { int rc = SQLITE_OK; #ifndef SQLITE_OMIT_VIRTUALTABLE sqlite3_intarray *p; p = (sqlite3_intarray*)sqlite3_malloc(sizeof(*p)); if (!p) { sqlite3_free(zName); return SQLITE_NOMEM; } memset(p, 0, sizeof(*p)); p->module = module; p->zName = zName; rc = intarrayMapPut(&module->arrayMap, p); if (rc != SQLITE_OK) { sqlite3_free(zName); sqlite3_free(p); return rc; } p->commitState = sqlite3_get_autocommit(module->db) ? 1 : 0; rc = create_vtable(p); if (rc != SQLITE_OK) { intarrayMapRemove(&module->arrayMap, p); sqlite3_free(zName); sqlite3_free(p); } else { *ppReturn = p; } #endif return rc; }
/** @SYMTestCaseID SYSLIB-SQLITE3-UT-4001 @SYMTestCaseDesc sqlite3_exec() tests. List of called SQLITE3 functions: - sqlite3_exec; - sqlite3_errcode; - sqlite3_errmsg; - sqlite3_last_insert_rowid; - sqlite3_changes; - sqlite3_total_changes; - sqlite3_get_autocommit; @SYMTestPriority High @SYMTestActions sqlite3_exec() tests. @SYMTestExpectedResults Test must not fail @SYMREQ REQ8782 */ static void TestExec() { int err; sqlite_int64 lastrowid; int val; TEST(TheDb != 0); err = sqlite3_exec(TheDb, "CREATE TABLE A(F1 INTEGER, F2 BIGINT, F3 REAL, F4 TEXT, F5 BLOB)", &exec_callback, 0, 0); TEST2(err, SQLITE_OK); err = sqlite3_exec(TheDb, "INSERT INTO A VALUES(1, 1234567891234, 56.12, 'TEXT', x'313233343536')", &exec_callback, 0, 0); TEST2(err, SQLITE_OK); err = sqlite3_errcode(TheDb); TEST2(err, SQLITE_OK); (void)sqlite3_errmsg(TheDb); lastrowid = sqlite3_last_insert_rowid(TheDb); TEST(lastrowid > 0LL); val = sqlite3_changes(TheDb); TEST2(val, 1); val = sqlite3_total_changes(TheDb); TEST(val >= 1); val = sqlite3_get_autocommit(TheDb); TEST(val != 0); }
bool MSQLite::IsAutoCommitOn(void) { if(sqlite3_get_autocommit(mDatabase)==1) { return true; } return false; }
int DMM::commit() { if (sqlite3_get_autocommit(db)) return -1; // NO-OP in auto-commit mode return queryNoReturn("COMMIT"); }
/* call-seq: db.transaction_active? * * Returns +true+ if there is a transaction active, and +false+ otherwise. * */ static VALUE transaction_active_p(VALUE self) { sqlite3RubyPtr ctx; Data_Get_Struct(self, sqlite3Ruby, ctx); REQUIRE_OPEN_DB(ctx); return sqlite3_get_autocommit(ctx->db) ? Qfalse : Qtrue; }
static ERL_NIF_TERM do_get_autocommit(ErlNifEnv *env, esqlite_connection *conn) { if(sqlite3_get_autocommit(conn->db) != 0) { return make_atom(env, "true"); } else { return make_atom(env, "false"); } }
static int begin(connection_t *conn) { int err = 0; if (sqlite3_get_autocommit(conn->sqlite)) { err = run(conn, "BEGIN TRANSACTION"); } else { err = 0; } return err; }
SWIGEXPORT jint JNICALL Java_com_almworks_sqlite4java__1SQLiteSwiggedJNI_sqlite3_1get_1autocommit(JNIEnv *jenv, jclass jcls, jlong jarg1) { jint jresult = 0 ; sqlite3 *arg1 = (sqlite3 *) 0 ; int result; (void)jenv; (void)jcls; arg1 = *(sqlite3 **)&jarg1; result = (int)sqlite3_get_autocommit(arg1); jresult = (jint)result; return jresult; }
/* ** Evaluate a pragma. ** ** Unknown pragmas are silently ignored. */ int xjd1DeleteStep(xjd1_stmt *pStmt){ Command *pCmd = pStmt->pCmd; int rc = XJD1_OK; int inAutocommit; sqlite3 *db; sqlite3_stmt *pQuery = 0; sqlite3_stmt *pIns = 0; char *zSql; assert( pCmd!=0 ); assert( pCmd->eCmdType==TK_DELETE ); db = pStmt->pConn->db; inAutocommit = sqlite3_get_autocommit(db); if( pCmd->u.del.pWhere==0 ){ zSql = sqlite3_mprintf("DELETE FROM \"%w\"", pCmd->u.del.zName); sqlite3_exec(db, zSql, 0, 0, 0); sqlite3_free(zSql); return XJD1_OK; } zSql = sqlite3_mprintf("%sCREATE TEMP TABLE _t1(x INTEGER PRIMARY KEY)", inAutocommit ? "BEGIN;" : ""); sqlite3_exec(db, zSql, 0, 0, 0); sqlite3_free(zSql); zSql = sqlite3_mprintf("SELECT rowid, x FROM \"%w\"", pCmd->u.del.zName); sqlite3_prepare_v2(db, zSql, -1, &pQuery, 0); sqlite3_prepare_v2(db, "INSERT INTO _t1(x) VALUES(?1)", -1, &pIns, 0); if( pQuery ){ while( SQLITE_ROW==sqlite3_step(pQuery) ){ const char *zJson = (const char*)sqlite3_column_text(pQuery, 1); pStmt->pDoc = xjd1JsonParse(zJson, -1); if( xjd1ExprTrue(pCmd->u.del.pWhere) ){ sqlite3_bind_int64(pIns, 1, sqlite3_column_int64(pQuery, 0)); sqlite3_step(pIns); sqlite3_reset(pIns); } xjd1JsonFree(pStmt->pDoc); pStmt->pDoc = 0; } } sqlite3_finalize(pQuery); sqlite3_finalize(pIns); sqlite3_free(zSql); zSql = sqlite3_mprintf( "DELETE FROM \"%w\" WHERE rowid IN _t1;" "DROP TABLE _t1;%s", pCmd->u.del.zName, inAutocommit ? "COMMIT;" : ""); sqlite3_exec(db, zSql, 0, 0, 0); sqlite3_free(zSql); return rc; }
static int db_autocommit(lua_State *T) { struct db *db; luaL_checktype(T, 1, LUA_TUSERDATA); db = db_unbox(T, 1); if (db == NULL) return db_closed(T); if (db->T != NULL) return db_busy(T); lua_pushboolean(T, sqlite3_get_autocommit(db->handle)); return 1; }
bool SqLiteDataProvider::inTransaction() const { if (!mIsConnected) { const std::string error = "not connected to the database!"; LOG_ERROR(error); throw std::runtime_error(error); } // The sqlite3_get_autocommit() interface returns non-zero or zero if the // given database connection is or is not in autocommit mode, respectively. // Autocommit mode is on by default. Autocommit mode is disabled by a BEGIN // statement. Autocommit mode is re-enabled by a COMMIT or ROLLBACK. const int ret = sqlite3_get_autocommit(mDb); return ret == 0; }
void db_deinit (void) { debug_enter ("db_deinit"); if (FALSE == sqlite3_get_autocommit (db)) g_warning ("Fatal: DB not in auto-commit mode. This is a bug. Data may be lost!"); if (statements) { g_hash_table_destroy (statements); statements = NULL; } if (SQLITE_OK != sqlite3_close (db)) g_warning ("DB close failed: %s", sqlite3_errmsg (db)); db = NULL; debug_exit ("db_deinit"); }
int DMM::prepare(sqlite3_stmt **outStatement, const char *inQuery, va_list args) { int rv = SQLITE_OK; char *q = sqlite3_vmprintf(inQuery, args); // If we are in auto-commit mode and this is a mutating operation, start a transaction if (sqlite3_get_autocommit(db)) { // Ain't this sophisticated! if ((strstr(q, "INSERT ") == q) || (strstr(q, "UPDATE ") == q) || (strstr(q, "DELETE ") == q)) { rv = queryNoReturn("BEGIN"); } } const char *tail = NULL; int sqlrv = sqlite3_prepare(db, q, static_cast<int>(strlen(q)), outStatement, &tail); sqlite3_free(q); return sqlrv; }
int sqlite3_intarray_bind(sqlite3_intarray *pIntArray, int nElements, sqlite3_int64 *aElements, void (*xFree)(void*), int bOrdered, int bUnique, int ensureTableExists) { int rc = SQLITE_OK; #ifndef SQLITE_OMIT_VIRTUALTABLE rc = drop_array_content(pIntArray); if (rc != SQLITE_OK) return rc; if (ensureTableExists && (pIntArray->commitState < 0 || pIntArray->connectCount <= 0)) { rc = create_vtable(pIntArray); if (rc == SQLITE_OK) { pIntArray->connectCount = 1; pIntArray->commitState = sqlite3_get_autocommit(pIntArray->module->db) ? 1 : 0; } /* ignore rc (duplicate table exists); todo: discern other errors */ /*if (rc != SQLITE_OK) return rc;*/ rc = SQLITE_OK; } pIntArray->n = nElements; pIntArray->a = aElements; pIntArray->xFree = xFree; pIntArray->ordered = bOrdered; pIntArray->unique = bUnique; #endif return rc; }
bool SQLiteDatabase::isAutoCommitOn() const { return sqlite3_get_autocommit(m_db); }
/* opening or creation of database */ void db_init (void) { gint res; debug_enter ("db_init"); db_open (); /* create info table/check versioning info */ debug1 (DEBUG_DB, "current DB schema version: %d", db_get_schema_version ()); if (-1 == db_get_schema_version ()) { /* no schema version available -> first installation without tables... */ db_set_schema_version (SCHEMA_TARGET_VERSION); /* nothing exists yet, tables will be created below */ } if (SCHEMA_TARGET_VERSION < db_get_schema_version ()) g_error ("Fatal: The cache database was created by a newer version of Liferea than this one!"); if (SCHEMA_TARGET_VERSION > db_get_schema_version ()) { /* do table migration */ if (db_get_schema_version () < 5) g_error ("This version of Liferea doesn't support migrating from such an old DB file!"); if (db_get_schema_version () == 5 || db_get_schema_version () == 6) { debug0 (DEBUG_DB, "dropping triggers in preparation of database migration"); db_exec ("BEGIN; " "DROP TRIGGER item_removal; " "DROP TRIGGER item_insert; " "END;"); } if (db_get_schema_version () == 5) { /* 1.4.9 -> 1.4.10 adding parent_item_id to itemset relation */ debug0 (DEBUG_DB, "migrating from schema version 5 to 6 (this drops all comments)"); db_exec ("BEGIN; " "DELETE FROM itemsets WHERE comment = 1; " "DELETE FROM items WHERE comment = 1; " "CREATE TEMPORARY TABLE itemsets_backup(item_id,node_id,read,comment); " "INSERT INTO itemsets_backup SELECT item_id,node_id,read,comment FROM itemsets; " "DROP TABLE itemsets; " "CREATE TABLE itemsets (" " item_id INTEGER," " parent_item_id INTEGER," " node_id TEXT," " read INTEGER," " comment INTEGER," " PRIMARY KEY (item_id, node_id)" "); " "INSERT INTO itemsets SELECT item_id,0,node_id,read,comment FROM itemsets_backup; " "DROP TABLE itemsets_backup; " "REPLACE INTO info (name, value) VALUES ('schemaVersion',6); " "END;"); } if (db_get_schema_version () == 6) { /* 1.4.15 -> 1.4.16 adding parent_node_id to itemset relation */ debug0 (DEBUG_DB, "migrating from schema version 6 to 7 (this drops all comments)"); db_exec ("BEGIN; " "DELETE FROM itemsets WHERE comment = 1; " "DELETE FROM items WHERE comment = 1; " "CREATE TEMPORARY TABLE itemsets_backup(item_id,node_id,read,comment); " "INSERT INTO itemsets_backup SELECT item_id,node_id,read,comment FROM itemsets; " "DROP TABLE itemsets; " "CREATE TABLE itemsets (" " item_id INTEGER," " parent_item_id INTEGER," " node_id TEXT," " parent_node_id TEXT," " read INTEGER," " comment INTEGER," " PRIMARY KEY (item_id, node_id)" "); " "INSERT INTO itemsets SELECT item_id,0,node_id,node_id,read,comment FROM itemsets_backup; " "DROP TABLE itemsets_backup; " "REPLACE INTO info (name, value) VALUES ('schemaVersion',7); " "END;"); } if (db_get_schema_version () == 7) { /* 1.7.1 -> 1.7.2 dropping the itemsets and attention_stats relation */ db_exec ("BEGIN; " "CREATE TEMPORARY TABLE items_backup(" " item_id, " " title, " " read, " " updated, " " popup, " " marked, " " source, " " source_id, " " valid_guid, " " description, " " date, " " comment_feed_id, " " comment); " "INSERT into items_backup SELECT ROWID, title, read, updated, popup, marked, source, source_id, valid_guid, description, date, comment_feed_id, comment FROM items; " "DROP TABLE items; " "CREATE TABLE items (" " item_id INTEGER," " parent_item_id INTEGER," " node_id TEXT," " parent_node_id TEXT," " title TEXT," " read INTEGER," " updated INTEGER," " popup INTEGER," " marked INTEGER," " source TEXT," " source_id TEXT," " valid_guid INTEGER," " description TEXT," " date INTEGER," " comment_feed_id INTEGER," " comment INTEGER," " PRIMARY KEY (item_id)" ");" "INSERT INTO items SELECT itemsets.item_id, parent_item_id, node_id, parent_node_id, title, itemsets.read, updated, popup, marked, source, source_id, valid_guid, description, date, comment_feed_id, itemsets.comment FROM items_backup JOIN itemsets ON itemsets.item_id = items_backup.item_id; " "DROP TABLE items_backup; " "DROP TABLE itemsets; " "REPLACE INTO info (name, value) VALUES ('schemaVersion',8); " "END;" ); db_exec ("DROP TABLE attention_stats"); /* this is unconditional, no checks and backups needed */ } if (db_get_schema_version () == 8) { gchar *sql; sqlite3_stmt *stmt; /* 1.7.3 -> 1.7.4 change search folder handling */ db_exec ("BEGIN; " "DROP TABLE view_state; " "DROP TABLE update_state; " "CREATE TABLE search_folder_items (" " node_id STRING," " item_id INTEGER," " PRIMARY KEY (node_id, item_id)" ");" "REPLACE INTO info (name, value) VALUES ('schemaVersion',9); " "END;" ); debug0 (DEBUG_DB, "Removing all views."); sql = sqlite3_mprintf("SELECT name FROM sqlite_master WHERE type='view';"); res = sqlite3_prepare_v2 (db, sql, -1, &stmt, NULL); sqlite3_free (sql); if (SQLITE_OK != res) { debug1 (DEBUG_DB, "Could not determine views (error=%d)", res); } else { sqlite3_reset (stmt); while (sqlite3_step (stmt) == SQLITE_ROW) { const gchar *viewName = sqlite3_column_text (stmt, 0) + strlen("view_"); gchar *copySql = g_strdup_printf("INSERT INTO search_folder_items (node_id, item_id) SELECT '%s',item_id FROM view_%s;", viewName, viewName); db_exec (copySql); db_view_remove (viewName); g_free (copySql); } sqlite3_finalize (stmt); } } if (db_get_schema_version () == 9) { /* A parent node id to search folder relation to allow cleanups */ db_exec ("BEGIN; " "DROP TABLE search_folder_items; " "CREATE TABLE search_folder_items (" " node_id STRING," " parent_node_id STRING," " item_id INTEGER," " PRIMARY KEY (node_id, item_id)" ");" "REPLACE INTO info (name, value) VALUES ('schemaVersion',10); " "END;" ); searchFolderRebuild = TRUE; } } if (SCHEMA_TARGET_VERSION != db_get_schema_version ()) g_error ("Fatal: DB schema version not up-to-date! Running with --debug-db could give some hints about the problem!"); /* Vacuuming... */ db_vacuum (); /* Schema creation */ debug_start_measurement (DEBUG_DB); db_begin_transaction (); /* 1. Create tables if they do not exist yet */ db_exec ("CREATE TABLE items (" " item_id INTEGER," " parent_item_id INTEGER," " node_id TEXT," /* FIXME: migrate node ids to real integers */ " parent_node_id TEXT," /* FIXME: migrate node ids to real integers */ " title TEXT," " read INTEGER," " updated INTEGER," " popup INTEGER," " marked INTEGER," " source TEXT," " source_id TEXT," " valid_guid INTEGER," " description TEXT," " date INTEGER," " comment_feed_id TEXT," " comment INTEGER," " PRIMARY KEY (item_id)" ");"); db_exec ("CREATE INDEX items_idx ON items (source_id);"); db_exec ("CREATE INDEX items_idx2 ON items (comment_feed_id);"); db_exec ("CREATE INDEX items_idx3 ON items (node_id);"); db_exec ("CREATE INDEX items_idx4 ON items (item_id);"); db_exec ("CREATE INDEX items_idx5 ON items (parent_item_id);"); db_exec ("CREATE INDEX items_idx6 ON items (parent_node_id);"); db_exec ("CREATE TABLE metadata (" " item_id INTEGER," " nr INTEGER," " key TEXT," " value TEXT," " PRIMARY KEY (item_id, nr)" ");"); db_exec ("CREATE INDEX metadata_idx ON metadata (item_id);"); db_exec ("CREATE TABLE subscription (" " node_id STRING," " source STRING," " orig_source STRING," " filter_cmd STRING," " update_interval INTEGER," " default_interval INTEGER," " discontinued INTEGER," " available INTEGER," " PRIMARY KEY (node_id)" ");"); db_exec ("CREATE TABLE subscription_metadata (" " node_id STRING," " nr INTEGER," " key TEXT," " value TEXT," " PRIMARY KEY (node_id, nr)" ");"); db_exec ("CREATE INDEX subscription_metadata_idx ON subscription_metadata (node_id);"); db_exec ("CREATE TABLE node (" " node_id STRING," " parent_id STRING," " title STRING," " type INTEGER," " expanded INTEGER," " view_mode INTEGER," " sort_column INTEGER," " sort_reversed INTEGER," " PRIMARY KEY (node_id)" ");"); db_exec ("CREATE TABLE search_folder_items (" " node_id STRING," " parent_node_id STRING," " item_id INTEGER," " PRIMARY KEY (node_id, item_id)" ");"); db_end_transaction (); debug_end_measurement (DEBUG_DB, "table setup"); /* 2. Removing old triggers */ db_exec ("DROP TRIGGER item_insert;"); db_exec ("DROP TRIGGER item_update;"); db_exec ("DROP TRIGGER item_removal;"); db_exec ("DROP TRIGGER subscription_removal;"); /* 3. Cleanup of DB */ /* Note: do not check on subscriptions here, as non-subscription node types (e.g. news bin) do contain items too. */ debug0 (DEBUG_DB, "Checking for items without a feed list node...\n"); db_exec ("DELETE FROM items WHERE comment = 0 AND node_id NOT IN " "(SELECT node_id FROM node);"); debug0 (DEBUG_DB, "Checking for comments without parent item...\n"); db_exec ("BEGIN; " " CREATE TEMP TABLE tmp_id ( id );" " INSERT INTO tmp_id SELECT item_id FROM items WHERE comment = 1 AND parent_item_id NOT IN (SELECT item_id FROM items WHERE comment = 0);" /* limit to 1000 items as it is very slow */ " DELETE FROM items WHERE item_id IN (SELECT id FROM tmp_id LIMIT 1000);" " DROP TABLE tmp_id;" "END;"); debug0 (DEBUG_DB, "Checking for search folder items without a feed list node...\n"); db_exec ("DELETE FROM search_folder_items WHERE parent_node_id NOT IN " "(SELECT node_id FROM node);"); debug0 (DEBUG_DB, "Checking for search folder items without a search folder...\n"); db_exec ("DELETE FROM search_folder_items WHERE node_id NOT IN " "(SELECT node_id FROM node);"); debug0 (DEBUG_DB, "Checking for search folder with comments...\n"); db_exec ("DELETE FROM search_folder_items WHERE comment = 1;"); debug0 (DEBUG_DB, "DB cleanup finished. Continuing startup."); /* 4. Creating triggers (after cleanup so it is not slowed down by triggers) */ /* This trigger does explicitely not remove comments! */ db_exec ("CREATE TRIGGER item_removal DELETE ON items " "BEGIN " " DELETE FROM metadata WHERE item_id = old.item_id; " " DELETE FROM search_folder_items WHERE item_id = old.item_id; " "END;"); db_exec ("CREATE TRIGGER subscription_removal DELETE ON subscription " "BEGIN " " DELETE FROM node WHERE node_id = old.node_id; " " DELETE FROM subscription_metadata WHERE node_id = old.node_id; " " DELETE FROM search_folder_items WHERE parent_node_id = old.node_id; " "END;"); /* Note: view counting triggers are set up in the view preparation code (see db_view_create()) */ /* prepare statements */ db_new_statement ("itemsetLoadStmt", "SELECT item_id FROM items WHERE node_id = ?"); db_new_statement ("itemsetLoadOffsetStmt", "SELECT item_id FROM items WHERE comment = 0 LIMIT ? OFFSET ?"); db_new_statement ("itemsetReadCountStmt", "SELECT COUNT(item_id) FROM items " "WHERE read = 0 AND node_id = ?"); db_new_statement ("itemsetItemCountStmt", "SELECT COUNT(item_id) FROM items " "WHERE node_id = ?"); db_new_statement ("itemsetRemoveStmt", "DELETE FROM items WHERE item_id = ? OR (comment = 1 AND parent_item_id = ?)"); db_new_statement ("itemsetRemoveAllStmt", "DELETE FROM items WHERE node_id = ? OR (comment = 1 AND parent_node_id = ?)"); db_new_statement ("itemsetMarkAllPopupStmt", "UPDATE items SET popup = 0 WHERE node_id = ?"); db_new_statement ("itemLoadStmt", "SELECT " "title," "read," "updated," "popup," "marked," "source," "source_id," "valid_guid," "description," "date," "comment_feed_id," "comment," "item_id," "parent_item_id, " "node_id, " "parent_node_id " " FROM items WHERE item_id = ?"); db_new_statement ("itemUpdateStmt", "REPLACE INTO items (" "title," "read," "updated," "popup," "marked," "source," "source_id," "valid_guid," "description," "date," "comment_feed_id," "comment," "item_id," "parent_item_id," "node_id," "parent_node_id" ") values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); db_new_statement ("itemStateUpdateStmt", "UPDATE items SET read=?, marked=?, updated=? " "WHERE item_id=?"); db_new_statement ("duplicatesFindStmt", "SELECT item_id FROM items WHERE source_id = ?"); db_new_statement ("duplicateNodesFindStmt", "SELECT node_id FROM items WHERE item_id IN " "(SELECT item_id FROM items WHERE source_id = ?)"); db_new_statement ("duplicatesMarkReadStmt", "UPDATE items SET read = 1, updated = 0 WHERE source_id = ?"); db_new_statement ("metadataLoadStmt", "SELECT key,value,nr FROM metadata WHERE item_id = ? ORDER BY nr"); db_new_statement ("metadataUpdateStmt", "REPLACE INTO metadata (item_id,nr,key,value) VALUES (?,?,?,?)"); db_new_statement ("subscriptionUpdateStmt", "REPLACE INTO subscription (" "node_id," "source," "orig_source," "filter_cmd," "update_interval," "default_interval," "discontinued," "available" ") VALUES (?,?,?,?,?,?,?,?)"); db_new_statement ("subscriptionRemoveStmt", "DELETE FROM subscription WHERE node_id = ?"); db_new_statement ("subscriptionLoadStmt", "SELECT " "node_id," "source," "orig_source," "filter_cmd," "update_interval," "default_interval," "discontinued," "available " "FROM subscription"); db_new_statement ("subscriptionMetadataLoadStmt", "SELECT key,value,nr FROM subscription_metadata WHERE node_id = ? ORDER BY nr"); db_new_statement ("subscriptionMetadataUpdateStmt", "REPLACE INTO subscription_metadata (node_id,nr,key,value) VALUES (?,?,?,?)"); db_new_statement ("nodeUpdateStmt", "REPLACE INTO node (node_id,parent_id,title,type,expanded,view_mode,sort_column,sort_reversed) VALUES (?,?,?,?,?,?,?,?)"); db_new_statement ("itemUpdateSearchFoldersStmt", "REPLACE INTO search_folder_items (node_id, parent_node_id, item_id) VALUES (?,?,?)"); db_new_statement ("itemRemoveFromSearchFolderStmt", "DELETE FROM search_folder_items WHERE node_id =? AND item_id = ?;"); db_new_statement ("searchFolderLoadStmt", "SELECT item_id FROM search_folder_items WHERE node_id = ?;"); db_new_statement ("searchFolderCountStmt", "SELECT count(item_id) FROM search_folder_items WHERE node_id = ?;"); db_new_statement ("nodeIdListStmt", "SELECT node_id FROM node;"); db_new_statement ("nodeRemoveStmt", "DELETE FROM node WHERE node_id = ?;"); g_assert (sqlite3_get_autocommit (db)); debug_exit ("db_init"); }
int get_autocommit_sync(db_t *db) { return sqlite3_get_autocommit(db->sqlite_db); }
bool SqliteDatabase::isAutoCommit() const { return (sqlite3_get_autocommit(dbPtr.get()) != 0); }
int Sqlite3Session::GetTransactionLevel() const { int autocommit = sqlite3_get_autocommit(db); return (autocommit ? 0 : 1); }
bool DB::Connection::inTransaction() { return sqlite3_get_autocommit(_db)==0; }
bool SessionImpl::isAutoCommit(const std::string&) { Poco::Mutex::ScopedLock l(_mutex); return (0 != sqlite3_get_autocommit(_pDB)); }
bool CppSQLite3DB::IsAutoCommitOn() { checkDB(); return sqlite3_get_autocommit(mpDB) ? true : false; }
/** * @brief DB_Init * * @return */ int DB_Init() { char *to_ospath; isDBActive = qfalse; db_mode = Cvar_Get("db_mode", "0", CVAR_ARCHIVE | CVAR_LATCH); db_url = Cvar_Get("db_url", "etl.db", CVAR_ARCHIVE | CVAR_LATCH); // filename in path (not real DB URL for now) if (db_mode->integer < 1 || db_mode->integer > 2) { Com_Printf("... DBMS is disabled\n"); return 0; // return 0! - see isDBActive } Com_Printf("SQLite3 libversion %s - database URL '%s' - %s\n", sqlite3_libversion(), db_url->string, db_mode->integer == 1 ? "in-memory" : "in file"); if (!db_url->string[0]) // FIXME: check extension db { Com_Printf("... can't init database - empty URL\n"); return 1; } to_ospath = FS_BuildOSPath(Cvar_VariableString("fs_homepath"), db_url->string, ""); to_ospath[strlen(to_ospath) - 1] = '\0'; if (FS_SV_FileExists(db_url->string)) { int result; Com_Printf("... loading existing database '%s'\n", to_ospath); if (db_mode->integer == 1) { // init memory table //result = sqlite3_open(":memory:", &db); // memory table, not shared see https://www.sqlite.org/inmemorydb.html result = sqlite3_open("file::memory:?cache=shared", &db); // In-memory databases with shared cache if (result != SQLITE_OK) { Com_Printf("... failed to open memory database - error: %s\n", sqlite3_errstr(result)); (void) sqlite3_close(db); return 1; } // load from disk into memory result = DB_LoadOrSaveDb(db, to_ospath, 0); if (result != SQLITE_OK) { Com_Printf("... WARNING can't load database file %s\n", db_url->string); return 1; } } else if (db_mode->integer == 2) { result = sqlite3_open(to_ospath, &db); if (result != SQLITE_OK) { Com_Printf("... failed to open file database - error: %s\n", sqlite3_errstr(result)); (void) sqlite3_close(db); return 1; } } else { Com_Printf("... failed to open database - unknown mode\n"); return 1; } Com_Printf("... database file '%s' loaded\n", to_ospath); } else // create new { int result; Com_Printf("... no database file '%s' found ... creating now\n", to_ospath); result = DB_Create(); if (result != 0) { Com_Printf("... WARNING can't create database [%i]\n", result); return 1; } // save memory db to disk if (db_mode->integer == 1) { result = DB_SaveMemDB(); if (result != SQLITE_OK) { Com_Printf("... WARNING can't save memory database file [%i]\n", result); return 1; } } } Com_Printf("SQLite3 ET: L [%i] database '%s' init - autocommit %i\n", ETL_DBMS_VERSION, to_ospath, sqlite3_get_autocommit(db)); isDBActive = qtrue; return 0; }