environment.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #include "environment.h"
  2. // FIXME find a better cross-platform path.
  3. #define DEFAULT_ENV_PATH "./mdb_store"
  4. // RAMdisk path for MDB volatile store.
  5. #define MDB_RAMDISK_PATH TMPDIR "/lsup_mem_graph"
  6. /**
  7. * Static handles.
  8. */
  9. #define DEFAULT_CTX_LABEL "urn:lsup:default"
  10. /** @brief Environment "singleton".
  11. */
  12. LSUP_Env *LSUP_default_env = NULL;
  13. LSUP_Env *
  14. LSUP_env_new (
  15. const char *default_ctx, const char *mdb_path,
  16. const char *mdb_ramdisk_path, const LSUP_NSMap *nsmap)
  17. {
  18. LSUP_Env *env;
  19. CALLOC_GUARD (env, NULL);
  20. // Default store context.
  21. LSUP_Term *default_ctx_uri = LSUP_uri_new (default_ctx);
  22. env->default_ctx = LSUP_buffer_new_from_term (default_ctx_uri);
  23. LSUP_term_free (default_ctx_uri);
  24. log_info ("Set up default context.");
  25. // Permanent store.
  26. if (LSUP_mdbstore_setup (mdb_path, false) != LSUP_OK) return NULL;
  27. env->mdb_store = LSUP_mdbstore_new (mdb_path, env->default_ctx);
  28. if (UNLIKELY (!env->mdb_store)) return NULL;
  29. log_info ("Initialized persistent back end at %s.", mdb_path);
  30. // RAM disk store.
  31. if (LSUP_mdbstore_setup (mdb_ramdisk_path, true) != LSUP_OK)
  32. return NULL;
  33. env->mdb_store_ramdisk = LSUP_mdbstore_new (
  34. mdb_ramdisk_path, env->default_ctx);
  35. if (UNLIKELY (!env->mdb_store_ramdisk)) return NULL;
  36. log_info ("Initialized RAM disk back end at %s.", mdb_ramdisk_path);
  37. // Get default namespace from store.
  38. RCNL (LSUP_mdbstore_nsm_get (env->mdb_store, &env->nsm));
  39. return env;
  40. }
  41. LSUP_rc
  42. LSUP_init (void)
  43. {
  44. LSUP_rc rc = LSUP_NOACTION;
  45. if (LSUP_default_env == NULL) {
  46. #ifdef DEBUG
  47. // In debug mode, always use max logging.
  48. int loglevel = LOG_DEBUG;
  49. #else
  50. char *_loglevel = getenv ("LSUP_LOGLEVEL");
  51. int loglevel = (_loglevel == NULL) ? LOG_INFO : atoi (_loglevel);
  52. #endif
  53. log_set_level (loglevel);
  54. // Default permanent store path.
  55. char *mdb_path = getenv ("LSUP_MDB_STORE_PATH");
  56. if (!mdb_path) {
  57. mdb_path = DEFAULT_ENV_PATH;
  58. log_warn (
  59. "`LSUP_MDB_STORE_PATH' environment variable is not "
  60. "set. The default location %s will be used as the graph "
  61. "store.", mdb_path
  62. );
  63. }
  64. LSUP_default_env = LSUP_env_new (
  65. DEFAULT_CTX_LABEL, mdb_path, MDB_RAMDISK_PATH, NULL);
  66. if (!LSUP_default_env) rc = LSUP_DB_ERR;
  67. atexit (LSUP_done);
  68. rc = LSUP_OK;
  69. }
  70. return rc;
  71. }
  72. void
  73. LSUP_env_free (LSUP_Env *env)
  74. {
  75. LSUP_mdbstore_free (env->mdb_store);
  76. LSUP_mdbstore_free (env->mdb_store_ramdisk);
  77. LSUP_buffer_free (env->default_ctx);
  78. LSUP_nsmap_free (env->nsm);
  79. free (env);
  80. }
  81. void
  82. LSUP_done (void)
  83. { LSUP_env_free (LSUP_default_env); }