/* * Copyright 2013 (c) Anna Schumaker. */ #ifndef OCARINA_DATABASE_H #define OCARINA_DATABASE_H #include #include #include #include #include class DatabaseEntry { public: bool valid; DatabaseEntry(); virtual std::string primary_key() = 0; virtual void write(File &) = 0; virtual void read(File &) = 0; }; class IndexEntry : public DatabaseEntry { public: std::string key; std::set values; IndexEntry(); IndexEntry(const std::string &, unsigned int); ~IndexEntry(); std::string primary_key(); void write(File &); void read(File &); #ifdef CONFIG_TEST void print(); #endif /* CONFIG_TEST */ void insert(unsigned int); void remove(unsigned int); }; template class Database { private: std::vector _db; std::map _keys; unsigned int _size; bool _autosave; File _file; void autosave(); public: typedef typename std::vector::iterator iterator; typedef typename std::vector::const_iterator const_iterator; Database(std::string, bool); ~Database(); void save(); void load(); unsigned int insert(T); void remove(unsigned int); unsigned int size(); unsigned int actual_size(); iterator begin(); iterator end(); iterator next(iterator &); iterator at(unsigned int); iterator find(const std::string &); }; static inline void index_insert(Database &db, const std::string &key, unsigned int val) { Database::iterator it = db.find(key); if (it == db.end()) { db.insert(IndexEntry(key, val)); } else it->insert(val); } static inline void index_remove(Database &db, const std::string &key, unsigned int val) { Database::iterator it = db.find(key); if (it != db.end()) { it->remove(val); if (it->values.size() == 0) db.remove(it - db.begin()); } } #include "database.hpp" #endif /* OCARINA_DATABASE_H */