check result from 'ikarus_default_value' SQLite function creation
Signed-off-by: Folling <mail@folling.io>
This commit is contained in:
parent
66309bd471
commit
b884deab07
1 changed files with 49 additions and 127 deletions
|
|
@ -18,11 +18,8 @@
|
||||||
constexpr char const * DB_PROJECT_ID_KEY = "project_id";
|
constexpr char const * DB_PROJECT_ID_KEY = "project_id";
|
||||||
constexpr char const * DB_PROJECT_NAME_KEY = "project_name";
|
constexpr char const * DB_PROJECT_NAME_KEY = "project_name";
|
||||||
|
|
||||||
auto create_impl(
|
auto create_impl(std::string_view path, std::string_view name, IkarusErrorData * error_out)
|
||||||
std::string_view path,
|
-> std::unique_ptr<sqlitecpp::Connection> {
|
||||||
std::string_view name,
|
|
||||||
IkarusErrorData * error_out
|
|
||||||
) -> std::unique_ptr<sqlitecpp::Connection> {
|
|
||||||
IKARUS_VTRYRV_OR_FAIL(
|
IKARUS_VTRYRV_OR_FAIL(
|
||||||
auto db,
|
auto db,
|
||||||
nullptr,
|
nullptr,
|
||||||
|
|
@ -65,14 +62,13 @@ auto create_impl(
|
||||||
nullptr,
|
nullptr,
|
||||||
"failed to set project id",
|
"failed to set project id",
|
||||||
IkarusErrorInfo_Database_QueryFailed,
|
IkarusErrorInfo_Database_QueryFailed,
|
||||||
db->execute(
|
db->execute("INSERT INTO `metadata`(`key`, `value`) VALUES(?, ?)", DB_PROJECT_NAME_KEY, name).on_error(close_db)
|
||||||
"INSERT INTO `metadata`(`key`, `value`) VALUES(?, ?)",
|
|
||||||
DB_PROJECT_NAME_KEY,
|
|
||||||
name
|
|
||||||
)
|
|
||||||
.on_error(close_db)
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
IKARUS_TRYRV_OR_FAIL(
|
||||||
|
nullptr,
|
||||||
|
"failed to create custom `ikarus_default_value` SQLite function: {}",
|
||||||
|
IkarusErrorInfo_Database_QueryFailed,
|
||||||
db->create_function(
|
db->create_function(
|
||||||
"ikarus_default_value",
|
"ikarus_default_value",
|
||||||
1,
|
1,
|
||||||
|
|
@ -80,50 +76,32 @@ auto create_impl(
|
||||||
nullptr,
|
nullptr,
|
||||||
[](sqlite3_context * ctx, int argc, sqlite3_value ** argv) {
|
[](sqlite3_context * ctx, int argc, sqlite3_value ** argv) {
|
||||||
if (sqlite3_value_type(argv[0]) != SQLITE_TEXT) {
|
if (sqlite3_value_type(argv[0]) != SQLITE_TEXT) {
|
||||||
sqlite3_result_error(
|
sqlite3_result_error(ctx, "expected the 'schema' parameter to be of type text", SQLITE_MISMATCH);
|
||||||
ctx,
|
|
||||||
"expected the 'schema' parameter to be of type text",
|
|
||||||
SQLITE_MISMATCH
|
|
||||||
);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto const schema_json =
|
auto const schema_json = reinterpret_cast<char const *>(sqlite3_value_text(argv[0]));
|
||||||
reinterpret_cast<char const *>(sqlite3_value_text(argv[0]));
|
|
||||||
|
|
||||||
auto schema_res = IkarusValueSchema::from_json_str(schema_json);
|
auto schema_res = IkarusValueSchema::from_json_str(schema_json);
|
||||||
|
|
||||||
if (schema_res.is_error()) {
|
if (schema_res.is_error()) {
|
||||||
sqlite3_result_error(
|
sqlite3_result_error(ctx, "failed to parse schema", SQLITE_ERROR);
|
||||||
ctx,
|
|
||||||
"failed to parse schema",
|
|
||||||
SQLITE_ERROR
|
|
||||||
);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto schema = std::move(schema_res).unwrap_value();
|
auto schema = std::move(schema_res).unwrap_value();
|
||||||
|
|
||||||
auto default_value_json =
|
auto default_value_json = IkarusValue::to_json(schema.default_value()).dump();
|
||||||
IkarusValue::to_json(schema.default_value()).dump();
|
|
||||||
|
|
||||||
sqlite3_result_text(
|
sqlite3_result_text(ctx, default_value_json.data(), default_value_json.size(), SQLITE_TRANSIENT);
|
||||||
ctx,
|
|
||||||
default_value_json.data(),
|
|
||||||
default_value_json.size(),
|
|
||||||
SQLITE_TRANSIENT
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
return std::move(db);
|
return std::move(db);
|
||||||
}
|
}
|
||||||
|
|
||||||
IkarusProject * ikarus_project_create(
|
IkarusProject * ikarus_project_create(char const * path, char const * name, IkarusErrorData * error_out) {
|
||||||
char const * path,
|
|
||||||
char const * name,
|
|
||||||
IkarusErrorData * error_out
|
|
||||||
) {
|
|
||||||
IKARUS_FAIL_IF_NULL(path, nullptr);
|
IKARUS_FAIL_IF_NULL(path, nullptr);
|
||||||
IKARUS_FAIL_IF_NULL(name, nullptr);
|
IKARUS_FAIL_IF_NULL(name, nullptr);
|
||||||
IKARUS_FAIL_IF(
|
IKARUS_FAIL_IF(
|
||||||
|
|
@ -147,18 +125,10 @@ IkarusProject * ikarus_project_create(
|
||||||
IKARUS_FAIL_IF(
|
IKARUS_FAIL_IF(
|
||||||
ec && ec != boost::system::errc::no_such_file_or_directory,
|
ec && ec != boost::system::errc::no_such_file_or_directory,
|
||||||
nullptr,
|
nullptr,
|
||||||
fmt::format(
|
fmt::format("unable to check whether path is occupied: {}", ec.message()),
|
||||||
"unable to check whether path is occupied: {}",
|
|
||||||
ec.message()
|
|
||||||
),
|
|
||||||
IkarusErrorInfo_Filesystem_AlreadyExists
|
|
||||||
);
|
|
||||||
IKARUS_FAIL_IF(
|
|
||||||
exists,
|
|
||||||
nullptr,
|
|
||||||
"path is already occupied",
|
|
||||||
IkarusErrorInfo_Filesystem_AlreadyExists
|
IkarusErrorInfo_Filesystem_AlreadyExists
|
||||||
);
|
);
|
||||||
|
IKARUS_FAIL_IF(exists, nullptr, "path is already occupied", IkarusErrorInfo_Filesystem_AlreadyExists);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (auto db = create_impl(fs_path.c_str(), name, error_out); !db) {
|
if (auto db = create_impl(fs_path.c_str(), name, error_out); !db) {
|
||||||
|
|
@ -167,18 +137,9 @@ IkarusProject * ikarus_project_create(
|
||||||
boost::system::error_code ec;
|
boost::system::error_code ec;
|
||||||
boost::filesystem::remove(fs_path, ec);
|
boost::filesystem::remove(fs_path, ec);
|
||||||
|
|
||||||
IKARUS_FAIL_IF(
|
IKARUS_FAIL_IF(ec, nullptr, "failed to remove project db", IkarusErrorInfo_Filesystem_MissingPermissions);
|
||||||
ec,
|
|
||||||
nullptr,
|
|
||||||
"failed to remove project db",
|
|
||||||
IkarusErrorInfo_Filesystem_MissingPermissions
|
|
||||||
);
|
|
||||||
|
|
||||||
IKARUS_FAIL(
|
IKARUS_FAIL(nullptr, "failed to insert project name into metadata: {}", IkarusErrorInfo_Database_QueryFailed);
|
||||||
nullptr,
|
|
||||||
"failed to insert project name into metadata: {}",
|
|
||||||
IkarusErrorInfo_Database_QueryFailed
|
|
||||||
);
|
|
||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -186,10 +147,7 @@ IkarusProject * ikarus_project_create(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
IkarusProject * ikarus_project_create_in_memory(
|
IkarusProject * ikarus_project_create_in_memory(char const * name, IkarusErrorData * error_out) {
|
||||||
char const * name,
|
|
||||||
IkarusErrorData * error_out
|
|
||||||
) {
|
|
||||||
IKARUS_FAIL_IF_NULL(name, nullptr);
|
IKARUS_FAIL_IF_NULL(name, nullptr);
|
||||||
IKARUS_FAIL_IF(
|
IKARUS_FAIL_IF(
|
||||||
cppbase::is_empty_or_blank(name),
|
cppbase::is_empty_or_blank(name),
|
||||||
|
|
@ -212,18 +170,13 @@ IkarusProject * ikarus_project_create_in_memory(
|
||||||
nullptr,
|
nullptr,
|
||||||
"failed to insert project name into metadata: {}",
|
"failed to insert project name into metadata: {}",
|
||||||
IkarusErrorInfo_Database_QueryFailed,
|
IkarusErrorInfo_Database_QueryFailed,
|
||||||
db->execute(
|
db->execute("INSERT INTO `metadata`(`key`, `value`) VALUES(?, ?)", DB_PROJECT_NAME_KEY, name)
|
||||||
"INSERT INTO `metadata`(`key`, `value`) VALUES(?, ?)",
|
|
||||||
DB_PROJECT_NAME_KEY,
|
|
||||||
name
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
return new IkarusProject{name, ":memory:", std::move(db)};
|
return new IkarusProject{name, ":memory:", std::move(db)};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
IkarusProject *
|
IkarusProject * ikarus_project_open(char const * path, IkarusErrorData * error_out) {
|
||||||
ikarus_project_open(char const * path, IkarusErrorData * error_out) {
|
|
||||||
IKARUS_FAIL_IF_NULL(path, nullptr);
|
IKARUS_FAIL_IF_NULL(path, nullptr);
|
||||||
IKARUS_FAIL_IF(
|
IKARUS_FAIL_IF(
|
||||||
cppbase::is_empty_or_blank(path),
|
cppbase::is_empty_or_blank(path),
|
||||||
|
|
@ -252,29 +205,19 @@ ikarus_project_open(char const * path, IkarusErrorData * error_out) {
|
||||||
nullptr,
|
nullptr,
|
||||||
"failed to retrieve project name from metadata: {}",
|
"failed to retrieve project name from metadata: {}",
|
||||||
IkarusErrorInfo_Database_QueryFailed,
|
IkarusErrorInfo_Database_QueryFailed,
|
||||||
db->query_one<std::string>(
|
db->query_one<std::string>("SELECT `value` FROM `metadata` WHERE `key` = ?", DB_PROJECT_NAME_KEY)
|
||||||
"SELECT `value` FROM `metadata` WHERE `key` = ?",
|
|
||||||
DB_PROJECT_NAME_KEY
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
|
|
||||||
return new IkarusProject{name, path, std::move(db)};
|
return new IkarusProject{name, path, std::move(db)};
|
||||||
}
|
}
|
||||||
|
|
||||||
char const * ikarus_project_get_name(
|
char const * ikarus_project_get_name(IkarusProject const * project, IkarusErrorData * error_out) {
|
||||||
IkarusProject const * project,
|
|
||||||
IkarusErrorData * error_out
|
|
||||||
) {
|
|
||||||
IKARUS_FAIL_IF_NULL(project, nullptr);
|
IKARUS_FAIL_IF_NULL(project, nullptr);
|
||||||
|
|
||||||
return project->name.data();
|
return project->name.data();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ikarus_project_set_name(
|
void ikarus_project_set_name(IkarusProject * project, char const * new_name, IkarusErrorData * error_out) {
|
||||||
IkarusProject * project,
|
|
||||||
char const * new_name,
|
|
||||||
IkarusErrorData * error_out
|
|
||||||
) {
|
|
||||||
IKARUS_FAIL_IF_NULL(project, IKARUS_VOID_RETURN);
|
IKARUS_FAIL_IF_NULL(project, IKARUS_VOID_RETURN);
|
||||||
IKARUS_FAIL_IF_NULL(new_name, IKARUS_VOID_RETURN);
|
IKARUS_FAIL_IF_NULL(new_name, IKARUS_VOID_RETURN);
|
||||||
|
|
||||||
|
|
@ -289,18 +232,11 @@ void ikarus_project_set_name(
|
||||||
IKARUS_VOID_RETURN,
|
IKARUS_VOID_RETURN,
|
||||||
"failed to update project name: {}",
|
"failed to update project name: {}",
|
||||||
IkarusErrorInfo_Database_QueryFailed,
|
IkarusErrorInfo_Database_QueryFailed,
|
||||||
project->db->execute(
|
project->db->execute("UPDATE `metadata` SET `value` = ? WHERE `key` = ?", new_name, DB_PROJECT_NAME_KEY)
|
||||||
"UPDATE `metadata` SET `value` = ? WHERE `key` = ?",
|
|
||||||
new_name,
|
|
||||||
DB_PROJECT_NAME_KEY
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
char const * ikarus_project_get_path(
|
char const * ikarus_project_get_path(IkarusProject const * project, IkarusErrorData * error_out) {
|
||||||
IkarusProject const * project,
|
|
||||||
IkarusErrorData * error_out
|
|
||||||
) {
|
|
||||||
IKARUS_FAIL_IF_NULL(project, nullptr);
|
IKARUS_FAIL_IF_NULL(project, nullptr);
|
||||||
|
|
||||||
return project->path.c_str();
|
return project->path.c_str();
|
||||||
|
|
@ -323,18 +259,11 @@ void ikarus_project_get_entities(
|
||||||
IKARUS_VOID_RETURN,
|
IKARUS_VOID_RETURN,
|
||||||
"unable to fetch project entities from database: {}",
|
"unable to fetch project entities from database: {}",
|
||||||
IkarusErrorInfo_Database_QueryFailed,
|
IkarusErrorInfo_Database_QueryFailed,
|
||||||
project->db->query_many_buffered<int64_t>(
|
project->db->query_many_buffered<int64_t>("SELECT `id` FROM `entities`", ids_out, ids_out_size)
|
||||||
"SELECT `id` FROM `entities`",
|
|
||||||
ids_out,
|
|
||||||
ids_out_size
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t ikarus_project_get_entity_count(
|
size_t ikarus_project_get_entity_count(IkarusProject const * project, IkarusErrorData * error_out) {
|
||||||
IkarusProject const * project,
|
|
||||||
IkarusErrorData * error_out
|
|
||||||
) {
|
|
||||||
IKARUS_FAIL_IF_NULL(project, 0);
|
IKARUS_FAIL_IF_NULL(project, 0);
|
||||||
|
|
||||||
IKARUS_VTRYRV_OR_FAIL(
|
IKARUS_VTRYRV_OR_FAIL(
|
||||||
|
|
@ -365,18 +294,11 @@ void ikarus_project_get_blueprints(
|
||||||
,
|
,
|
||||||
"unable to fetch project blueprints from database: {}",
|
"unable to fetch project blueprints from database: {}",
|
||||||
IkarusErrorInfo_Database_QueryFailed,
|
IkarusErrorInfo_Database_QueryFailed,
|
||||||
project->db->query_many_buffered<int64_t>(
|
project->db->query_many_buffered<int64_t>("SELECT `id` FROM `blueprints`", ids_out, ids_out_size)
|
||||||
"SELECT `id` FROM `blueprints`",
|
|
||||||
ids_out,
|
|
||||||
ids_out_size
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t ikarus_project_get_blueprint_count(
|
size_t ikarus_project_get_blueprint_count(IkarusProject const * project, IkarusErrorData * error_out) {
|
||||||
IkarusProject const * project,
|
|
||||||
IkarusErrorData * error_out
|
|
||||||
) {
|
|
||||||
IKARUS_FAIL_IF_NULL(project, 0);
|
IKARUS_FAIL_IF_NULL(project, 0);
|
||||||
|
|
||||||
IKARUS_VTRYRV_OR_FAIL(
|
IKARUS_VTRYRV_OR_FAIL(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue