From fa0d298afafdc81d00164765903161205cf09a7e Mon Sep 17 00:00:00 2001
From: Loek Le Blansch <loek@pipeframe.xyz>
Date: Sat, 14 Dec 2024 16:24:08 +0100
Subject: move DB fix from `loek/doxygen` to `loek/savemgr`

---
 src/crepe/facade/DB.cpp           | 13 ++++-------
 src/crepe/facade/DB.h             |  2 --
 src/crepe/manager/SaveManager.cpp | 49 +++++++++++++++++++--------------------
 src/crepe/manager/SaveManager.h   |  6 ++---
 4 files changed, 31 insertions(+), 39 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/facade/DB.cpp b/src/crepe/facade/DB.cpp
index 95cf606..2232a21 100644
--- a/src/crepe/facade/DB.cpp
+++ b/src/crepe/facade/DB.cpp
@@ -21,12 +21,6 @@ DB::DB(const string & path) {
 	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)));
-
-	// create cursor
-	libdb::DBC * cursor;
-	ret = this->db->cursor(this->db.get(), NULL, &cursor, 0);
-	if (ret != 0) throw runtime_error(format("db->cursor: {}", libdb::db_strerror(ret)));
-	this->cursor = {cursor, [](libdb::DBC * cursor) { cursor->close(cursor); }};
 }
 
 libdb::DBT DB::to_thing(const string & thing) const noexcept {
@@ -42,10 +36,10 @@ 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);
+	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("cursor->get: {}", libdb::db_strerror(ret));
+	string err = format("db->get: {}", libdb::db_strerror(ret));
 	if (ret == DB_NOTFOUND) throw out_of_range(err);
 	else throw runtime_error(err);
 }
@@ -54,7 +48,7 @@ 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 runtime_error(format("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) {
@@ -65,3 +59,4 @@ bool DB::has(const std::string & key) {
 	}
 	return true;
 }
+
diff --git a/src/crepe/facade/DB.h b/src/crepe/facade/DB.h
index 115c0f1..84cdf19 100644
--- a/src/crepe/facade/DB.h
+++ b/src/crepe/facade/DB.h
@@ -61,8 +61,6 @@ public:
 private:
 	//! RAII wrapper around \c DB struct
 	std::unique_ptr<libdb::DB, std::function<void(libdb::DB *)>> db;
-	//! RAII wrapper around \c DBC struct
-	std::unique_ptr<libdb::DBC, std::function<void(libdb::DBC *)>> cursor;
 
 private:
 	/**
diff --git a/src/crepe/manager/SaveManager.cpp b/src/crepe/manager/SaveManager.cpp
index 691ea2f..f313ed2 100644
--- a/src/crepe/manager/SaveManager.cpp
+++ b/src/crepe/manager/SaveManager.cpp
@@ -128,10 +128,33 @@ template void SaveManager::set(const string &, const int64_t &);
 template void SaveManager::set(const string &, const float &);
 template void SaveManager::set(const string &, const double &);
 
+template <typename T>
+T SaveManager::get(const string & key) {
+	return this->deserialize<T>(this->get_db().get(key));
+}
+template uint8_t SaveManager::get(const string &);
+template int8_t SaveManager::get(const string &);
+template uint16_t SaveManager::get(const string &);
+template int16_t SaveManager::get(const string &);
+template uint32_t SaveManager::get(const string &);
+template int32_t SaveManager::get(const string &);
+template uint64_t SaveManager::get(const string &);
+template int64_t SaveManager::get(const string &);
+template float SaveManager::get(const string &);
+template double SaveManager::get(const string &);
+template string SaveManager::get(const string &);
+
 template <typename T>
 ValueBroker<T> SaveManager::get(const string & key, const T & default_value) {
 	if (!this->has(key)) this->set<T>(key, default_value);
-	return this->get<T>(key);
+	T value;
+	return {
+		[this, key](const T & target) { this->set<T>(key, target); },
+		[this, key, value]() mutable -> const T & {
+			value = this->get<T>(key);
+			return value;
+		},
+	};
 }
 template ValueBroker<uint8_t> SaveManager::get(const string &, const uint8_t &);
 template ValueBroker<int8_t> SaveManager::get(const string &, const int8_t &);
@@ -144,27 +167,3 @@ template ValueBroker<int64_t> SaveManager::get(const string &, const int64_t &);
 template ValueBroker<float> SaveManager::get(const string &, const float &);
 template ValueBroker<double> SaveManager::get(const string &, const double &);
 template ValueBroker<string> SaveManager::get(const string &, const string &);
-
-template <typename T>
-ValueBroker<T> SaveManager::get(const string & key) {
-	T value;
-	return {
-		[this, key](const T & target) { this->set<T>(key, target); },
-		[this, key, value]() mutable -> const T & {
-			DB & db = this->get_db();
-			value = this->deserialize<T>(db.get(key));
-			return value;
-		},
-	};
-}
-template ValueBroker<uint8_t> SaveManager::get(const string &);
-template ValueBroker<int8_t> SaveManager::get(const string &);
-template ValueBroker<uint16_t> SaveManager::get(const string &);
-template ValueBroker<int16_t> SaveManager::get(const string &);
-template ValueBroker<uint32_t> SaveManager::get(const string &);
-template ValueBroker<int32_t> SaveManager::get(const string &);
-template ValueBroker<uint64_t> SaveManager::get(const string &);
-template ValueBroker<int64_t> SaveManager::get(const string &);
-template ValueBroker<float> SaveManager::get(const string &);
-template ValueBroker<double> SaveManager::get(const string &);
-template ValueBroker<string> SaveManager::get(const string &);
diff --git a/src/crepe/manager/SaveManager.h b/src/crepe/manager/SaveManager.h
index 61a978d..1e34bc0 100644
--- a/src/crepe/manager/SaveManager.h
+++ b/src/crepe/manager/SaveManager.h
@@ -36,17 +36,17 @@ public:
 	ValueBroker<T> get(const std::string & key, const T & default_value);
 
 	/**
-	 * \brief Get a read/write reference to a value
+	 * \brief Get a value directly
 	 *
 	 * \param key  The value key
 	 *
-	 * \return Read/write reference to the value
+	 * \return The value
 	 *
 	 * \note Attempting to read this value before it is initialized (i.e. set) will result in an
 	 * exception
 	 */
 	template <typename T>
-	ValueBroker<T> get(const std::string & key);
+	T get(const std::string & key);
 
 	/**
 	 * \brief Set a value directly
-- 
cgit v1.2.3


From 154ed5353ef18eb46cc31744e8bf1bc54afd5acc Mon Sep 17 00:00:00 2001
From: Loek Le Blansch <loek@pipeframe.xyz>
Date: Sat, 14 Dec 2024 16:24:25 +0100
Subject: `make format`

---
 src/crepe/facade/DB.cpp | 1 -
 src/test/DBTest.cpp     | 1 -
 2 files changed, 2 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/facade/DB.cpp b/src/crepe/facade/DB.cpp
index 2232a21..ae2d4bc 100644
--- a/src/crepe/facade/DB.cpp
+++ b/src/crepe/facade/DB.cpp
@@ -59,4 +59,3 @@ bool DB::has(const std::string & key) {
 	}
 	return true;
 }
-
diff --git a/src/test/DBTest.cpp b/src/test/DBTest.cpp
index 0c98e10..7f2c339 100644
--- a/src/test/DBTest.cpp
+++ b/src/test/DBTest.cpp
@@ -35,4 +35,3 @@ TEST_F(DBTest, MultipleKeys) {
 	EXPECT_EQ(db.get("foo"), "foo");
 	EXPECT_EQ(db.get("bar"), "bar");
 }
-
-- 
cgit v1.2.3