From f0533ef66350e0d055bd52c0e718c7307ea761fd Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Wed, 27 Nov 2013 16:34:31 -0500 Subject: [PATCH] database: Make all databases unique I require entries to have a "primary key" that is stored in a map to make it easy to find database rows by key. Signed-off-by: Anna Schumaker --- include/database.h | 11 ++++------- include/database.hpp | 24 +++++++++++++++--------- tests/database/database.cpp | 29 ++++++++++++++++++----------- 3 files changed, 37 insertions(+), 27 deletions(-) diff --git a/include/database.h b/include/database.h index 6b62b629..186e3e98 100644 --- a/include/database.h +++ b/include/database.h @@ -7,6 +7,7 @@ #include #include +#include #include @@ -15,6 +16,7 @@ public: bool valid; DatabaseEntry(); + virtual const std::string &primary_key() = 0; virtual void write(File &) = 0; virtual void read(File &) = 0; #ifdef CONFIG_DEBUG @@ -23,21 +25,16 @@ public: }; -enum DatabaseFlags { - DB_NORMAL, - DB_UNIQUE, -}; - template class Database { private: std::vector db; + std::map keys; unsigned int _size; File file; - DatabaseFlags flags; public: - Database(std::string, DatabaseFlags); + Database(std::string); ~Database(); void save(); void load(); diff --git a/include/database.hpp b/include/database.hpp index d63e7890..6188d2e2 100644 --- a/include/database.hpp +++ b/include/database.hpp @@ -8,8 +8,8 @@ #define OCARINA_DATABASE_HPP template -Database :: Database(std::string filepath, DatabaseFlags f) - : _size(0), file(filepath, FILE_TYPE_DATA), flags(f) +Database :: Database(std::string filepath) + : _size(0), file(filepath, FILE_TYPE_DATA) { } @@ -81,16 +81,22 @@ void Database :: print() template unsigned int Database :: insert(T val) { - if (flags == DB_UNIQUE) { - for (unsigned int i = first(); i < size(); i = next(i)) { - if (val == db[i]) - return i; - } - } + unsigned int id; + std::map::iterator it; + + it = keys.find(val.primary_key()); + if (it != keys.end()) + return it->second; + + /* + * Check primary key stuff here + */ + id = db.size(); db.push_back(val); + keys.insert(std::pair(val.primary_key(), id)); db[_size].valid = true; _size++; - return db.size() - 1; + return id; } template diff --git a/tests/database/database.cpp b/tests/database/database.cpp index 314df1ba..5e72a4bf 100644 --- a/tests/database/database.cpp +++ b/tests/database/database.cpp @@ -4,16 +4,19 @@ #include #include +#include + class DBTest : public DatabaseEntry { public: unsigned int value; + std::string key; DBTest(); DBTest(unsigned int); + const std::string &primary_key(); void write(File &); void read(File &); void print(); - bool operator==(DBTest &); }; DBTest :: DBTest() @@ -22,7 +25,11 @@ DBTest :: DBTest() DBTest :: DBTest(unsigned int val) { + std::stringstream ss; + value = val; + ss << value; + key = ss.str(); } void DBTest :: write(File &file) @@ -40,9 +47,9 @@ void DBTest :: print() :: print("%u", value); } -bool DBTest :: operator==(DBTest &rhs) +const std::string &DBTest :: primary_key() { - return value == rhs.value; + return key; } @@ -80,7 +87,7 @@ void test_deletion(Database &db) void test_0() { print("Test 0\n"); - Database db("test.db", DB_NORMAL); + Database db("test.db"); test_insertion(db); test_deletion(db); @@ -95,7 +102,7 @@ void test_0() void test_1() { print("\nTest 1\n"); - Database db("test.db", DB_NORMAL); + Database db("test.db"); db.load(); print_db(db); } @@ -106,7 +113,7 @@ void test_1() void test_2() { print("\nTest 2\n"); - Database db("", DB_NORMAL); + Database db(""); test_insertion(db); db.save(); @@ -118,7 +125,7 @@ void test_2() void test_3() { print("\nTest 3\n"); - Database db("", DB_NORMAL); + Database db(""); db.load(); } @@ -128,7 +135,7 @@ void test_3() void test_4() { print("\nTest 4\n"); - Database db("", DB_UNIQUE); + Database db(""); for (unsigned int i = 0; i < 100; i++) db.insert(DBTest(i % 5)); @@ -142,7 +149,7 @@ void test_4() void test_5() { print("\nTest 5\n"); - Database db("", DB_NORMAL); + Database db(""); for (unsigned int i = 0; i < 10; i++) db.insert(DBTest(i)); db.print(); @@ -154,7 +161,7 @@ void test_5() void test_6() { print("\nTest 6\n"); - Database db("", DB_NORMAL); + Database db(""); for (unsigned int i = 0; i < 10; i++) db.insert(DBTest(i)); print_db(db); @@ -168,7 +175,7 @@ void test_6() void test_7() { print("\nTest 7\n"); - Database db("", DB_NORMAL); + Database db(""); print_db(db); for (unsigned int i = 0; i < 10; i++)