@ -37,6 +37,7 @@
static struct chat_core_ctx {
static struct chat_core_ctx {
struct UTUN_INSTANCE * inst ;
struct UTUN_INSTANCE * inst ;
sqlite3 * db ;
sqlite3 * db ;
uint8_t shared_db ; /* db == inst->topo_sqlite_db, do not close */
uint64_t my_node_id ;
uint64_t my_node_id ;
/* db_sync instances per channel */
/* db_sync instances per channel */
@ -91,15 +92,20 @@ int chat_core_init(struct UTUN_INSTANCE* inst, const char* db_path) {
if ( ! inst | | ! db_path ) return - 1 ;
if ( ! inst | | ! db_path ) return - 1 ;
memset ( & g_cc , 0 , sizeof ( g_cc ) ) ;
memset ( & g_cc , 0 , sizeof ( g_cc ) ) ;
int rc = sqlite3_open_v2 ( db_path , & g_cc . db ,
if ( inst - > topo_sqlite_db ) {
SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX , NULL ) ;
g_cc . db = inst - > topo_sqlite_db ; g_cc . shared_db = 1 ;
if ( rc ! = SQLITE_OK ) {
DEBUG_INFO ( DEBUG_CATEGORY_CONNECTIVITY , " %s: using shared SQLite db=%p " , CC_ID , ( void * ) g_cc . db ) ;
DEBUG_ERROR ( DEBUG_CATEGORY_CONNECTIVITY , " %s: cannot open DB %s: %s " ,
} else {
CC_ID , db_path , sqlite3_errmsg ( g_cc . db ) ) ;
int rc = sqlite3_open_v2 ( db_path , & g_cc . db ,
sqlite3_close ( g_cc . db ) ; g_cc . db = NULL ; return - 1 ;
SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX , NULL ) ;
if ( rc ! = SQLITE_OK ) {
DEBUG_ERROR ( DEBUG_CATEGORY_CONNECTIVITY , " %s: cannot open DB %s: %s " ,
CC_ID , db_path , sqlite3_errmsg ( g_cc . db ) ) ;
sqlite3_close ( g_cc . db ) ; g_cc . db = NULL ; return - 1 ;
}
sqlite3_exec ( g_cc . db , " PRAGMA journal_mode=WAL " , NULL , NULL , NULL ) ;
sqlite3_exec ( g_cc . db , " PRAGMA foreign_keys=ON " , NULL , NULL , NULL ) ;
}
}
sqlite3_exec ( g_cc . db , " PRAGMA journal_mode=WAL " , NULL , NULL , NULL ) ;
sqlite3_exec ( g_cc . db , " PRAGMA foreign_keys=ON " , NULL , NULL , NULL ) ;
g_cc . inst = inst ;
g_cc . inst = inst ;
g_cc . my_node_id = inst - > node_id ;
g_cc . my_node_id = inst - > node_id ;
@ -229,7 +235,8 @@ void chat_core_destroy(struct UTUN_INSTANCE* inst) {
if ( ! g_cc . initialized ) return ;
if ( ! g_cc . initialized ) return ;
g_cc . initialized = 0 ;
g_cc . initialized = 0 ;
if ( g_cc . db ) { sqlite3_close ( g_cc . db ) ; g_cc . db = NULL ; }
if ( g_cc . db & & ! g_cc . shared_db ) { sqlite3_close ( g_cc . db ) ; }
g_cc . db = NULL ;
g_cc . inst = NULL ;
g_cc . inst = NULL ;
DEBUG_INFO ( DEBUG_CATEGORY_CONNECTIVITY , " %s: destroyed " , CC_ID ) ;
DEBUG_INFO ( DEBUG_CATEGORY_CONNECTIVITY , " %s: destroyed " , CC_ID ) ;
}
}