int spmemvfs_open_db( spmemvfs_db_t * db, const char * path, spmembuffer_t * mem ) { int ret = 0; spmembuffer_link_t * iter = NULL; memset( db, 0, sizeof( spmemvfs_db_t ) ); iter = (spmembuffer_link_t*)calloc( sizeof( spmembuffer_link_t ), 1 ); iter->path = strdup( path ); iter->mem = mem; sqlite3_mutex_enter( g_spmemvfs_env->mutex ); { iter->next = g_spmemvfs_env->head; g_spmemvfs_env->head = iter; } sqlite3_mutex_leave( g_spmemvfs_env->mutex ); ret = sqlite3_open_v2( path, &(db->handle), SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, SPMEMVFS_NAME ); if( 0 == ret ) { db->mem = mem; } else { sqlite3_mutex_enter( g_spmemvfs_env->mutex ); { iter = spmembuffer_link_remove( &(g_spmemvfs_env->head), path ); if( NULL != iter ) spmembuffer_link_free( iter ); } sqlite3_mutex_leave( g_spmemvfs_env->mutex ); } return ret; }
static spmembuffer_t * load_cb( void * arg, const char * path ) { spmembuffer_t * ret = NULL; spmemvfs_env_t * env = (spmemvfs_env_t*)arg; sqlite3_mutex_enter( env->mutex ); { spmembuffer_link_t * toFind = spmembuffer_link_remove( &( env->head ), path ); if( NULL != toFind ) { ret = toFind->mem; free( toFind->path ); free( toFind ); } } sqlite3_mutex_leave( env->mutex ); return ret; }