2022-10-25 17:08:36 -03:00
|
|
|
#include "models/entity.h"
|
|
|
|
|
2022-11-01 01:04:41 -03:00
|
|
|
const char* obelisk::Entity::createTable()
|
2022-10-25 17:08:36 -03:00
|
|
|
{
|
2022-11-01 01:04:41 -03:00
|
|
|
return R"(
|
|
|
|
CREATE TABLE "entity" (
|
|
|
|
"id" INTEGER NOT NULL UNIQUE,
|
|
|
|
"name" TEXT NOT NULL CHECK(trim(name) != '') UNIQUE,
|
|
|
|
PRIMARY KEY("id" AUTOINCREMENT)
|
|
|
|
);
|
|
|
|
)";
|
2022-10-25 17:08:36 -03:00
|
|
|
}
|
|
|
|
|
2022-11-26 00:32:06 -03:00
|
|
|
obelisk::Entity obelisk::Entity::selectEntity(sqlite3* dbConnection,
|
|
|
|
std::string name)
|
|
|
|
{
|
|
|
|
// TODO: check if database is open
|
|
|
|
sqlite3_stmt* ppStmt = nullptr;
|
|
|
|
const char* pzTail = nullptr;
|
|
|
|
|
|
|
|
auto result = sqlite3_prepare_v2(dbConnection,
|
|
|
|
"SELECT id, name FROM entity WHERE name=?;",
|
|
|
|
-1,
|
|
|
|
&ppStmt,
|
|
|
|
&pzTail);
|
|
|
|
if (result != SQLITE_OK)
|
|
|
|
{
|
|
|
|
// TODO: something went wrong throw an error
|
|
|
|
}
|
|
|
|
|
|
|
|
if (pzTail != nullptr)
|
|
|
|
{
|
|
|
|
// TODO: Something was not used... throw an error
|
|
|
|
}
|
|
|
|
|
|
|
|
result = sqlite3_bind_text(ppStmt, 1, name.c_str(), -1, SQLITE_TRANSIENT);
|
|
|
|
if (result != SQLITE_OK)
|
|
|
|
{
|
|
|
|
// TODO: Something is wrong... throw an error
|
|
|
|
}
|
|
|
|
|
|
|
|
result = sqlite3_step(ppStmt);
|
|
|
|
if (result != SQLITE_DONE)
|
|
|
|
{
|
|
|
|
// TODO: Something is wrong... throw an error
|
|
|
|
}
|
|
|
|
|
|
|
|
if (result == SQLITE_ROW)
|
|
|
|
{
|
|
|
|
auto id = sqlite3_column_int(ppStmt, 0);
|
|
|
|
std::string name((char*) sqlite3_column_text(ppStmt, 1));
|
|
|
|
|
|
|
|
result = sqlite3_finalize(ppStmt);
|
|
|
|
if (result != SQLITE_OK)
|
|
|
|
{
|
|
|
|
// TODO: Something is wrong... throw an error
|
|
|
|
}
|
|
|
|
return Entity(id, name);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
result = sqlite3_finalize(ppStmt);
|
|
|
|
if (result != SQLITE_OK)
|
|
|
|
{
|
|
|
|
// TODO: Something is wrong... throw an error
|
|
|
|
}
|
|
|
|
return Entity();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int obelisk::Entity::insertEntity(sqlite3* dbConnection)
|
|
|
|
{
|
|
|
|
// TODO: check if database is open
|
|
|
|
|
|
|
|
if (selectEntity(dbConnection, getName()).getId() != 0)
|
|
|
|
{
|
|
|
|
// TODO: already exists in database, throw an error? Or skip past it?
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
sqlite3_stmt* ppStmt = nullptr;
|
|
|
|
const char* pzTail = nullptr;
|
|
|
|
|
|
|
|
auto result = sqlite3_prepare_v2(dbConnection,
|
|
|
|
"INSERT INTO entity (name) VALUES (?);",
|
|
|
|
-1,
|
|
|
|
&ppStmt,
|
|
|
|
&pzTail);
|
|
|
|
if (result != SQLITE_OK)
|
|
|
|
{
|
|
|
|
// TODO: something went wrong throw an error
|
|
|
|
}
|
|
|
|
|
|
|
|
if (pzTail != nullptr)
|
|
|
|
{
|
|
|
|
// TODO: Something was not used... throw an error
|
|
|
|
}
|
|
|
|
|
|
|
|
result
|
|
|
|
= sqlite3_bind_text(ppStmt, 1, getName().c_str(), -1, SQLITE_TRANSIENT);
|
|
|
|
if (result != SQLITE_OK)
|
|
|
|
{
|
|
|
|
// TODO: Something is wrong... throw an error
|
|
|
|
}
|
|
|
|
|
|
|
|
result = sqlite3_step(ppStmt);
|
|
|
|
if (result != SQLITE_DONE)
|
|
|
|
{
|
|
|
|
// TODO: Something is wrong... throw an error
|
|
|
|
}
|
|
|
|
|
|
|
|
setId((int) sqlite3_last_insert_rowid(dbConnection));
|
|
|
|
|
|
|
|
result = sqlite3_finalize(ppStmt);
|
|
|
|
if (result != SQLITE_OK)
|
|
|
|
{
|
|
|
|
// TODO: Something is wrong... throw an error
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int& obelisk::Entity::getId()
|
2022-10-25 17:08:36 -03:00
|
|
|
{
|
|
|
|
return id_;
|
|
|
|
}
|
|
|
|
|
|
|
|
void obelisk::Entity::setId(int id)
|
|
|
|
{
|
|
|
|
id_ = id;
|
|
|
|
}
|
|
|
|
|
2022-11-26 00:32:06 -03:00
|
|
|
std::string& obelisk::Entity::getName()
|
2022-10-25 17:08:36 -03:00
|
|
|
{
|
|
|
|
return name_;
|
|
|
|
}
|
|
|
|
|
|
|
|
void obelisk::Entity::setName(std::string name)
|
|
|
|
{
|
2022-11-01 01:04:41 -03:00
|
|
|
name_ = name;
|
2022-10-25 17:08:36 -03:00
|
|
|
}
|