ocarina/include/database.hpp
Anna Schumaker dd92ee853f database: Add a way for databases to have unique keys
The library will need databases that have unique values (such as the
artist or album tables).  This patch adds support for that in my
existing database code.

Signed-off-by: Anna Schumaker <schumaker.anna@gmail.com>
2014-04-06 19:56:54 -04:00

131 lines
2.2 KiB
C++

/*
* Copyright 2013 (c) Anna Schumaker.
*
* DO NOT INCLUDE THIS FILE DIRECTLY. THIS IS A TEMPLATE DEFINITION FILE
* AND ONLY MEANT TO BE INCLUDED BY include/database.h!
*/
#ifndef OCARINA_DATABASE_HPP
#define OCARINA_DATABASE_HPP
template <class T>
Database<T> :: Database(std::string filepath, DatabaseFlags f)
: _size(0), file(filepath, FILE_TYPE_DATA), flags(f)
{
}
template <class T>
Database<T> :: ~Database()
{
}
template <class T>
void Database<T> :: save()
{
if (file.open(OPEN_WRITE) == false)
return;
file << db.size() << std::endl;
for (unsigned int i = 0; i < db.size(); i++) {
file << db[i].valid << " ";
if (db[i].valid == true)
db[i].write(file);
file << std::endl;
}
file.close();
}
template <class T>
void Database<T> :: load()
{
unsigned int db_size;
if (file.open(OPEN_READ) == false)
return;
file >> db_size;
db.resize(db_size);
for (unsigned int i = 0; i < db_size; i++) {
file >> db[i].valid;
if (db[i].valid == true) {
db[i].read(file);
_size++;
}
}
file.close();
}
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;
}
}
db.push_back(val);
_size++;
return db.size() - 1;
}
template <class T>
void Database<T> :: remove(unsigned int id)
{
db[id].valid = false;
_size--;
}
template <class T>
unsigned int Database<T> :: size()
{
return _size;
}
template <class T>
unsigned int Database<T> :: num_rows()
{
return db.size();
}
template <class T>
unsigned int Database<T> :: first()
{
for (unsigned int i = 0; i < db.size(); i++) {
if (db[i].valid == true)
return i;
}
return db.size();
}
template <class T>
unsigned int Database<T> :: last()
{
for (unsigned int i = db.size() - 1; i >= 0; i--) {
if (db[i].valid == true)
return i;
}
return db.size();
}
template <class T>
unsigned int Database<T> :: next(unsigned int id)
{
for (unsigned int i = id + 1; i < db.size(); i++) {
if (db[i].valid == true)
return i;
}
return db.size();
}
template <class T>
T &Database<T> :: operator[](unsigned int id)
{
return db[id];
}
#endif /* OCARINA_DATABASE_HPP */