diff options
Diffstat (limited to 'src/crepe/facade/DB.cpp')
| -rw-r--r-- | src/crepe/facade/DB.cpp | 30 | 
1 files changed, 13 insertions, 17 deletions
| diff --git a/src/crepe/facade/DB.cpp b/src/crepe/facade/DB.cpp index 80047a6..ae2d4bc 100644 --- a/src/crepe/facade/DB.cpp +++ b/src/crepe/facade/DB.cpp @@ -1,6 +1,5 @@  #include <cstring> -#include "Exception.h"  #include "util/Log.h"  #include "DB.h" @@ -15,19 +14,13 @@ DB::DB(const string & path) {  	// init database struct  	libdb::DB * db;  	if ((ret = libdb::db_create(&db, NULL, 0)) != 0) -		throw Exception("db_create: {}", libdb::db_strerror(ret)); +		throw runtime_error(format("db_create: {}", libdb::db_strerror(ret)));  	this->db = {db, [](libdb::DB * db) { db->close(db, 0); }};  	// load or create database file -	ret = this->db->open(this->db.get(), NULL, path.c_str(), NULL, -						 libdb::DB_BTREE, DB_CREATE, 0); -	if (ret != 0) throw Exception("db->open: {}", libdb::db_strerror(ret)); - -	// create cursor -	libdb::DBC * cursor; -	ret = this->db->cursor(this->db.get(), NULL, &cursor, 0); -	if (ret != 0) throw Exception("db->cursor: {}", libdb::db_strerror(ret)); -	this->cursor = {cursor, [](libdb::DBC * cursor) { cursor->close(cursor); }}; +	const char * file = path.empty() ? NULL : path.c_str(); +	ret = this->db->open(this->db.get(), NULL, file, NULL, libdb::DB_BTREE, DB_CREATE, 0); +	if (ret != 0) throw runtime_error(format("db->open: {}", libdb::db_strerror(ret)));  }  libdb::DBT DB::to_thing(const string & thing) const noexcept { @@ -43,22 +36,25 @@ string DB::get(const string & key) {  	libdb::DBT db_val;  	memset(&db_val, 0, sizeof(libdb::DBT)); -	int ret = this->cursor->get(this->cursor.get(), &db_key, &db_val, DB_FIRST); -	if (ret != 0) throw Exception("cursor->get: {}", libdb::db_strerror(ret)); -	return {static_cast<char *>(db_val.data), db_val.size}; +	int ret = this->db->get(this->db.get(), NULL, &db_key, &db_val, 0); +	if (ret == 0) return {static_cast<char *>(db_val.data), db_val.size}; + +	string err = format("db->get: {}", libdb::db_strerror(ret)); +	if (ret == DB_NOTFOUND) throw out_of_range(err); +	else throw runtime_error(err);  }  void DB::set(const string & key, const string & value) {  	libdb::DBT db_key = this->to_thing(key);  	libdb::DBT db_val = this->to_thing(value);  	int ret = this->db->put(this->db.get(), NULL, &db_key, &db_val, 0); -	if (ret != 0) throw Exception("cursor->get: {}", libdb::db_strerror(ret)); +	if (ret != 0) throw runtime_error(format("db->get: {}", libdb::db_strerror(ret)));  } -bool DB::has(const std::string & key) noexcept { +bool DB::has(const std::string & key) {  	try {  		this->get(key); -	} catch (...) { +	} catch (std::out_of_range &) {  		return false;  	}  	return true; |