environment.c 2.6 KB

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