DBPriv *DBPrivOpenDB(const char *dbpath, ARG_UNUSED dbid id) { DBPriv *db = xcalloc(1, sizeof(DBPriv)); pthread_mutex_init(&db->cursor_lock, NULL); if (!OpenTokyoDatabase(dbpath, &db->hdb)) { Log(LOG_LEVEL_ERR, "Could not open Tokyo database at path '%s'. (OpenTokyoDatabase: %s)", dbpath, ErrorMessage(db->hdb)); int errcode = tchdbecode(db->hdb); if(errcode != TCEMETA && errcode != TCEREAD) { goto err; } tchdbdel(db->hdb); return DB_PRIV_DATABASE_BROKEN; } return db; err: pthread_mutex_destroy(&db->cursor_lock); tchdbdel(db->hdb); free(db); return NULL; }
DBPriv *DBPrivOpenDB(const char *dbpath) { DBPriv *db = xcalloc(1, sizeof(DBPriv)); pthread_mutex_init(&db->cursor_lock, NULL); if (!OpenTokyoDatabase(dbpath, &db->hdb)) { CfOut(cf_error, "", "!! Could not open database %s: %s", dbpath, ErrorMessage(db->hdb)); int errcode = tchdbecode(db->hdb); if(errcode != TCEMETA && errcode != TCEREAD) { goto err; } tchdbdel(db->hdb); CfOut(cf_error, "", "!! Database \"%s\" is broken, recreating...", dbpath); DBPathMoveBroken(dbpath); if (!OpenTokyoDatabase(dbpath, &db->hdb)) { CfOut(cf_error, "", "!! Could not open database %s after recreate: %s", dbpath, ErrorMessage(db->hdb)); goto err; } } return db; err: pthread_mutex_destroy(&db->cursor_lock); tchdbdel(db->hdb); free(db); return NULL; }