#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&&)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&&)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 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 data = file.ReadSerializer_64(Endianness::LE, file.Size()); file.Release(); vars.Resize(data.Read()); 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; } }