/* * Copyright 2013 (c) Anna Schumaker. */ #ifndef OCARINA_DATABASE_H #define OCARINA_DATABASE_H #include #include #include #include #include template class DatabaseEntry { public: bool valid; DatabaseEntry(); virtual T &primary_key() = 0; virtual void write(File &) = 0; virtual void read(File &) = 0; #ifdef CONFIG_DEBUG virtual void print() = 0; #endif /* CONFIG_DEBUG */ }; class IndexEntry : public DatabaseEntry { public: std::string key; std::set values; IndexEntry(); IndexEntry(const std::string &, unsigned int); ~IndexEntry(); const std::string &primary_key(); void write(File &); void read(File &); void print(); void insert(unsigned int); void remove(unsigned int); }; template class Database { private: std::vector db; std::map keys; unsigned int _size; File file; public: Database(std::string); ~Database(); void save(); void load(); #ifdef CONFIG_DEBUG void clear(); void print(); void print_keys(); #endif /* CONFIG_DEBUG */ unsigned int insert(T); void remove(unsigned int); unsigned int size(); unsigned int num_rows(); unsigned int first(); unsigned int last(); unsigned int next(unsigned int); unsigned int find_index(const std::string &); T &find(const std::string &); T &operator[](unsigned int); }; template static inline void index_insert(Database &db, const std::string &key, unsigned int val) { try { db.find(key).insert(val); } catch (...) { db.insert(IndexEntry(key, val)); } } template static inline void index_remove(Database &db, const std::string &key, unsigned int val) { unsigned int i = db.find_index(key); db[i].remove(val); if (db[i].values.size() == 0) db.remove(db.find_index(key)); } #include "database.hpp" #endif /* OCARINA_DATABASE_H */