Files
EHS/src/db/DbObject.cpp

146 lines
2.8 KiB
C++

#include "ehs/db/DbObject.h"
#include "ehs/db/DbTable.h"
#include "ehs/Serializer.h"
#include "ehs/db/Database.h"
#include "ehs/io/Directory_LNX.h"
#include "ehs/io/File.h"
namespace ehs
{
DbObject::DbObject()
: id(0), parent(nullptr)
{
}
DbObject::DbObject(const UInt_64 id)
: id(id), parent(nullptr)
{
}
DbObject::DbObject(DbObject&& obj) noexcept
: id(obj.id), parent(obj.parent), vars((Array<DbVar>&&)obj.vars)
{
obj.id = 0;
obj.parent = nullptr;
}
DbObject::DbObject(const DbObject& obj)
: id(obj.id), parent(obj.parent), vars(obj.vars)
{
}
DbObject& DbObject::operator=(DbObject&& obj) noexcept
{
if (this == &obj)
return *this;
id = obj.id;
parent = obj.parent;
vars = (Array<DbVar>&&)obj.vars;
for (UInt_64 i = 0; i < vars.Size(); ++i)
vars[i].parent = this;
obj.id = 0;
obj.parent = nullptr;
return *this;
}
DbObject& DbObject::operator=(const DbObject& obj)
{
if (this == &obj)
return *this;
id = obj.id;
parent = obj.parent;
vars = obj.vars;
for (UInt_64 i = 0; i < vars.Size(); ++i)
vars[i].parent = this;
return *this;
}
UInt_64 DbObject::GetId() const
{
return id;
}
bool DbObject::HasVariable(const UInt_64 hashId) const
{
for (UInt_64 i = 0; i < vars.Size(); ++i)
if (vars[i].GetHashId() == hashId)
return true;
return false;
}
DbVar* DbObject::GetVariable(const UInt_64 hashId) const
{
for (UInt_64 i = 0; i < vars.Size(); ++i)
if (vars[i].GetHashId() == hashId)
return &vars[i];
return nullptr;
}
DbVar* DbObject::GetVariable(const Str_8& id) const
{
return GetVariable(id.Hash_64());
}
void DbObject::Save() const
{
if (!IsLoaded())
return;
Serializer<UInt_64> data(Endianness::LE);
data.Write(vars.Size());
for (UInt_64 i = 0; i < vars.Size(); ++i)
vars[i].Serialize(data);
Directory::CreateRecursive(parent->parent->GetDirectory() + "/" + parent->GetId());
File file(parent->parent->GetDirectory() + "/" + parent->GetId() + "/" + Str_8::FromNum(id) + ".eho", Mode::WRITE, Disposition::CREATE_PERSISTENT);
file.SeekBeginning();
file.WriteSerializer_64(data);
}
void DbObject::Load()
{
if (IsLoaded())
return;
File file(parent->parent->GetDirectory() + "/" + parent->GetId() + "/" + Str_8::FromNum(id) + ".eho", Mode::READ, Disposition::OPEN);
Serializer<UInt_64> data = file.ReadSerializer_64(Endianness::LE, file.Size());
file.Release();
vars.Resize(data.Read<UInt_64>());
for (UInt_64 i = 0; i < vars.Size(); ++i)
{
vars[i].parent = this;
vars[i].Deserialize(data);
}
}
bool DbObject::IsLoaded() const
{
return vars.Size();
}
void DbObject::Free()
{
vars.Clear();
}
void DbObject::CreateVariable(DbVarTmpl* master)
{
vars.Push(DbVar(master->GetHashId(), master));
vars[vars.End()].parent = this;
}
}