2013-08-11 10:41:22 -04:00
|
|
|
/*
|
|
|
|
* 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>
|
2013-09-17 16:09:01 -04:00
|
|
|
Database<T> :: Database(std::string filepath, DatabaseFlags f)
|
|
|
|
: _size(0), file(filepath, FILE_TYPE_DATA), flags(f)
|
2013-08-11 10:41:22 -04:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class T>
|
|
|
|
Database<T> :: ~Database()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class T>
|
2013-08-14 21:09:11 -04:00
|
|
|
void Database<T> :: save()
|
|
|
|
{
|
2013-08-14 21:50:08 -04:00
|
|
|
if (file.open(OPEN_WRITE) == false)
|
|
|
|
return;
|
2013-08-14 21:09:11 -04:00
|
|
|
|
|
|
|
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;
|
2013-08-14 21:50:08 -04:00
|
|
|
if (file.open(OPEN_READ) == false)
|
|
|
|
return;
|
2013-08-14 21:09:11 -04:00
|
|
|
|
|
|
|
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();
|
|
|
|
}
|
|
|
|
|
2013-09-29 22:32:08 -04:00
|
|
|
template <class T>
|
|
|
|
void Database<T> :: print()
|
|
|
|
{
|
|
|
|
:: print("Database size: %u\n", db.size());
|
|
|
|
:: print("Valid rows: %u\n", _size);
|
|
|
|
for (unsigned int i = 0; i < db.size(); i++) {
|
|
|
|
if (db[i].valid == true) {
|
|
|
|
:: print("db[%u] = ", i);
|
|
|
|
db[i].print();
|
|
|
|
}
|
|
|
|
:: print("\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-08-14 21:09:11 -04:00
|
|
|
template <class T>
|
2013-08-11 10:41:22 -04:00
|
|
|
unsigned int Database<T> :: insert(T val)
|
|
|
|
{
|
2013-09-17 16:09:01 -04:00
|
|
|
if (flags == DB_UNIQUE) {
|
|
|
|
for (unsigned int i = first(); i < size(); i = next(i)) {
|
|
|
|
if (val == db[i])
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
}
|
2013-08-11 10:41:22 -04:00
|
|
|
db.push_back(val);
|
|
|
|
_size++;
|
|
|
|
return db.size() - 1;
|
|
|
|
}
|
|
|
|
|
2013-08-11 21:09:11 -04:00
|
|
|
template <class T>
|
|
|
|
void Database<T> :: remove(unsigned int id)
|
|
|
|
{
|
|
|
|
db[id].valid = false;
|
|
|
|
_size--;
|
|
|
|
}
|
|
|
|
|
2013-08-11 10:41:22 -04:00
|
|
|
template <class T>
|
2013-08-11 20:18:51 -04:00
|
|
|
unsigned int Database<T> :: size()
|
2013-08-11 10:41:22 -04:00
|
|
|
{
|
|
|
|
return _size;
|
|
|
|
}
|
|
|
|
|
2013-08-11 20:18:51 -04:00
|
|
|
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];
|
|
|
|
}
|
|
|
|
|
2013-08-11 10:41:22 -04:00
|
|
|
#endif /* OCARINA_DATABASE_HPP */
|