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:
Anna Schumaker 2013-11-27 16:34:31 -05:00 committed by Anna Schumaker
parent c2bc99ad9b
commit f0533ef663
3 changed files with 37 additions and 27 deletions

View File

@ -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();

View File

@ -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>

View File

@ -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++)