#include "environment.h" // RAMdisk path for MDB volatile store. #define MDB_RAMDISK_PATH TMPDIR "/lsup_mem_graph" /** * Static handles. */ #define DEFAULT_CTX_LABEL "urn:lsup:default" /** @brief Environment "singleton". */ LSUP_Env *LSUP_default_env = NULL; LSUP_Env * LSUP_env_new ( const char *default_ctx, const char *mdb_path, const char *mdb_ramdisk_path, const LSUP_NSMap *nsmap) { LSUP_Env *env; MALLOC_GUARD (env, NULL); // Default store context. LSUP_Term *default_ctx_uri = LSUP_uri_new (default_ctx); env->default_ctx = LSUP_buffer_new_from_term (default_ctx_uri); LSUP_term_free (default_ctx_uri); log_info ("Setting up default context."); // Permanent store. if (LSUP_mdbstore_setup (mdb_path, false) != LSUP_OK) return NULL; env->mdbstore = LSUP_mdbstore_new (mdb_path, env->default_ctx); if (UNLIKELY (!env->mdbstore)) return NULL; log_info ("Initialized persistent back end at %s.", mdb_path); // RAM disk store. if (LSUP_mdbstore_setup (mdb_ramdisk_path, true) != LSUP_OK) return NULL; env->mdbstore_ramdisk = LSUP_mdbstore_new ( mdb_ramdisk_path, env->default_ctx); if (UNLIKELY (!env->mdbstore_ramdisk)) return NULL; log_info ("Initialized RAM disk back end at %s.", mdb_ramdisk_path); return env; } LSUP_rc LSUP_init (void) { LSUP_rc rc = LSUP_NOACTION; if (LSUP_default_env == NULL) { #ifdef DEBUG // In debug mode, always use max logging. int loglevel = LOG_TRACE; #else char *_loglevel = getenv ("LSUP_LOGLEVEL"); int loglevel = (_loglevel == NULL) ? LOG_WARN : atoi (_loglevel); #endif log_set_level (loglevel); // Default permanent store path. char *mdb_path = getenv ("LSUP_MDB_STORE_PATH"); if (!mdb_path) { mdb_path = DEFAULT_ENV_PATH; log_warn ( "`LSUP_MDB_STORE_PATH' environment variable is not " "set. The default location %s will be used as the graph " "store.", mdb_path ); } LSUP_default_env = LSUP_env_new ( DEFAULT_CTX_LABEL, mdb_path, MDB_RAMDISK_PATH, NULL); if (!LSUP_default_env) rc = LSUP_DB_ERR; atexit (LSUP_done); rc = LSUP_OK; } return rc; } void LSUP_env_free (LSUP_Env *env) { LSUP_mdbstore_free (env->mdbstore); LSUP_mdbstore_free (env->mdbstore_ramdisk); LSUP_buffer_free (env->default_ctx); LSUP_nsmap_free (env->nsm); free (env); } void LSUP_done (void) { LSUP_env_free (LSUP_default_env); }