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 <schumaker.anna@gmail.com>
This commit is contained in:
parent
c2bc99ad9b
commit
f0533ef663
|
@ -7,6 +7,7 @@
|
|||
#include <file.h>
|
||||
#include <print.h>
|
||||
|
||||
#include <map>
|
||||
#include <vector>
|
||||
|
||||
|
||||
|
@ -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 T>
|
||||
class Database {
|
||||
private:
|
||||
std::vector<T> db;
|
||||
std::map<const std::string, unsigned int> keys;
|
||||
unsigned int _size;
|
||||
File file;
|
||||
DatabaseFlags flags;
|
||||
|
||||
public:
|
||||
Database(std::string, DatabaseFlags);
|
||||
Database(std::string);
|
||||
~Database();
|
||||
void save();
|
||||
void load();
|
||||
|
|
|
@ -8,8 +8,8 @@
|
|||
#define OCARINA_DATABASE_HPP
|
||||
|
||||
template <class T>
|
||||
Database<T> :: Database(std::string filepath, DatabaseFlags f)
|
||||
: _size(0), file(filepath, FILE_TYPE_DATA), flags(f)
|
||||
Database<T> :: Database(std::string filepath)
|
||||
: _size(0), file(filepath, FILE_TYPE_DATA)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -81,16 +81,22 @@ void Database<T> :: print()
|
|||
template <class T>
|
||||
unsigned int Database<T> :: 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<std::string, unsigned int>::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<std::string, unsigned int>(val.primary_key(), id));
|
||||
db[_size].valid = true;
|
||||
_size++;
|
||||
return db.size() - 1;
|
||||
return id;
|
||||
}
|
||||
|
||||
template <class T>
|
||||
|
|
|
@ -4,16 +4,19 @@
|
|||
#include <database.h>
|
||||
#include <print.h>
|
||||
|
||||
#include <sstream>
|
||||
|
||||
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<DBTest> &db)
|
|||
void test_0()
|
||||
{
|
||||
print("Test 0\n");
|
||||
Database<DBTest> db("test.db", DB_NORMAL);
|
||||
Database<DBTest> db("test.db");
|
||||
|
||||
test_insertion(db);
|
||||
test_deletion(db);
|
||||
|
@ -95,7 +102,7 @@ void test_0()
|
|||
void test_1()
|
||||
{
|
||||
print("\nTest 1\n");
|
||||
Database<DBTest> db("test.db", DB_NORMAL);
|
||||
Database<DBTest> db("test.db");
|
||||
db.load();
|
||||
print_db(db);
|
||||
}
|
||||
|
@ -106,7 +113,7 @@ void test_1()
|
|||
void test_2()
|
||||
{
|
||||
print("\nTest 2\n");
|
||||
Database<DBTest> db("", DB_NORMAL);
|
||||
Database<DBTest> db("");
|
||||
|
||||
test_insertion(db);
|
||||
db.save();
|
||||
|
@ -118,7 +125,7 @@ void test_2()
|
|||
void test_3()
|
||||
{
|
||||
print("\nTest 3\n");
|
||||
Database<DBTest> db("", DB_NORMAL);
|
||||
Database<DBTest> db("");
|
||||
db.load();
|
||||
}
|
||||
|
||||
|
@ -128,7 +135,7 @@ void test_3()
|
|||
void test_4()
|
||||
{
|
||||
print("\nTest 4\n");
|
||||
Database<DBTest> db("", DB_UNIQUE);
|
||||
Database<DBTest> 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<DBTest> db("", DB_NORMAL);
|
||||
Database<DBTest> 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<DBTest> db("", DB_NORMAL);
|
||||
Database<DBTest> 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<DBTest> db("", DB_NORMAL);
|
||||
Database<DBTest> db("");
|
||||
print_db(db);
|
||||
|
||||
for (unsigned int i = 0; i < 10; i++)
|
||||
|
|
Loading…
Reference in New Issue