#define _XOPEN_SOURCE 500 #include #include #include #include "lmdb.h" #include "volksdata/core.h" bool VOLK_env_is_init = false; /** @brief Warning messages. * * The message corresponding to the rc is found by * warning_msg[rc - VOLK_MIN_WARNING]. #VOLK_strerror() facilitates this. */ char *warning_msg[] = { "VOLK_NOACTION: No action or change of state occurred.", "VOLK_NORESULT: No result.", "VOLK_END: End of the loop reached.", "VOLK_CONFLICT: A conflict prevented a resource from being updated.", }; /** @brief error messages. * * Note that all error values are < 0 so it is possible to set conditions to * be triggered only by error return values. * * The message corresponding to the rc is found by * err_msg[rc - VOLK_MIN_ERROR]. #VOLK_strerror() facilitates this. */ char *err_msg[] = { "VOLK_ERROR: Runtime error.", "VOLK_PARSE_ERR: Error parsing input.", "VOLK_VALUE_ERR: Invalid input.", "VOLK_TXN_ERR: MDB transaction error.", "VOLK_DB_ERR: Database error.", "VOLK_NOT_IMPL_ERR: Feature is not implemented.", "VOLK_IO_ERR: Input/Output error.", "VOLK_MEM_ERR: Memory error.", "VOLK_CONFLICT_ERR: A resource conflict interrupted the operation.", "VOLK_ENV_ERR: Environment not initialized. Did you call VOLK_init()?", }; char *VOLK_root_path = __FILE__; // This is trimmed to root path on init. VOLK_rc mkdir_p (const char *_path, mode_t mode) { char *path = strdup (_path); char *p; // Trim any trailing slash(es). for (p = path + strlen (path) - 1; p > path; p--) if (*p == '/') *p = '\0'; else break; errno = 0; VOLK_rc rc = VOLK_NOACTION; /* Iterate the string */ for (p = path + 1; *p; p++) { if (*p == '/') { /* Temporarily truncate */ *p = '\0'; if (mkdir (path, mode) != 0 && errno != EEXIST) goto finally; *p = '/'; } } if (mkdir (path, mode) != 0) { if (errno != EEXIST) rc = errno; } else { rc = VOLK_OK; } finally: LOG_TRACE("Path: %s", path); LOG_TRACE("errno: %d", errno); LOG_TRACE("rc: %d", rc); free (path); return rc; } int unlink_cb( const char *fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf) { LOG_DEBUG("Removing %s", fpath); int rv = remove(fpath); if (rv) perror(fpath); return rv; } int rm_r(const char *path) { return nftw(path, unlink_cb, 64, FTW_DEPTH | FTW_PHYS); } const char * VOLK_strerror (VOLK_rc rc) { if (rc >= VOLK_MIN_ERROR && rc <= VOLK_MAX_ERROR) return err_msg[rc - VOLK_MIN_ERROR]; if (rc >= VOLK_MIN_WARNING && rc <= VOLK_MAX_WARNING) return warning_msg[rc - VOLK_MIN_WARNING]; return mdb_strerror (rc); } /* Inline extern functions. */ int utf8_encode (const uint32_t utf, unsigned char *out);