Data File Mappings
ci / checks (push) Successful in 2h3m59s

This commit is contained in:
khodowany
2026-09-16 23:55:09 -05:00
parent 079c024ca9
commit aa1273b07d
13 changed files with 291 additions and 271 deletions
+48 -16
View File
@@ -40,6 +40,24 @@ auto text_value(noto::sqlite_value const &value) -> std::string {
return text == nullptr ? std::string{} : *text;
}
auto close_catalogue_query(noto::connection &connection, noto::statement &statement, std::expected<void, modulus::error> status) -> boost::asio::awaitable<std::expected<void, modulus::error>> {
auto finalized = co_await statement.async_finalize();
if (!finalized) {
modulus::log_error("catalogue query finalization failed: " + finalized.error().describe());
if (status) {
status = std::unexpected(finalized.error());
}
}
auto closed = co_await connection.async_close();
if (!closed) {
modulus::log_error("catalogue connection close failed: " + closed.error().describe());
if (status) {
status = std::unexpected(closed.error());
}
}
co_return status;
}
auto execute_schema_statement(noto::connection &connection, std::string statement) -> boost::asio::awaitable<std::expected<void, modulus::error>> {
auto result = co_await connection.async_execute(std::move(statement));
if (!result) {
@@ -465,7 +483,7 @@ auto vamp_zero::async_load_performance_library(boost::asio::any_io_executor exec
co_return std::unexpected(connected.error());
}
auto selected =
co_await connection.async_execute("SELECT id, title, composer, part, source_path, source_json, key_signature FROM "
co_await connection.async_prepare("SELECT id, title, composer, part, source_path, source_json, key_signature FROM "
"songs ORDER BY title COLLATE NOCASE, part COLLATE NOCASE");
if (!selected) {
auto close = co_await connection.async_close();
@@ -475,18 +493,25 @@ auto vamp_zero::async_load_performance_library(boost::asio::any_io_executor exec
co_return std::unexpected(selected.error());
}
auto parts = std::vector<vamp_zero::library_part>{};
for (auto const &row : selected->rows) {
auto status = std::expected<void, modulus::error>{};
for (;;) {
auto next = co_await selected->async_step();
if (!next) {
status = std::unexpected(next.error());
break;
}
if (!*next) {
break;
}
auto const &row = **next;
if (row.size() < 7U) {
continue;
}
auto source_json = text_value(row[5]);
auto parsed = vamp_zero::parse_score_document(source_json, text_value(row[4]));
if (!parsed) {
auto close = co_await connection.async_close();
if (!close) {
modulus::log_error("database close failed after parse error: " + close.error().describe());
}
co_return std::unexpected(parsed.error());
status = std::unexpected(parsed.error());
break;
}
parts.push_back({
.id = text_value(row[0]),
@@ -500,7 +525,7 @@ auto vamp_zero::async_load_performance_library(boost::asio::any_io_executor exec
.total_pages = vamp_zero::score_page_count(*parsed),
});
}
auto closed = co_await connection.async_close();
auto closed = co_await close_catalogue_query(connection, *selected, std::move(status));
if (!closed) {
co_return std::unexpected(closed.error());
}
@@ -514,7 +539,7 @@ auto vamp_zero::async_load_practice_library(boost::asio::any_io_executor executo
if (!connected) {
co_return std::unexpected(connected.error());
}
auto selected = co_await connection.async_execute("SELECT id, practice_type_id, practice_type_title, lesson_group_id, lesson_group_title, title, composer, "
auto selected = co_await connection.async_prepare("SELECT id, practice_type_id, practice_type_title, lesson_group_id, lesson_group_title, title, composer, "
"key_signature, source_path, source_json FROM practice_exercises ORDER BY practice_type_id COLLATE NOCASE, "
"lesson_group_id COLLATE NOCASE, source_path COLLATE NOCASE, title COLLATE NOCASE, id COLLATE NOCASE");
if (!selected) {
@@ -525,18 +550,25 @@ auto vamp_zero::async_load_practice_library(boost::asio::any_io_executor executo
co_return std::unexpected(selected.error());
}
auto exercises = std::vector<vamp_zero::practice_exercise>{};
for (auto const &row : selected->rows) {
auto status = std::expected<void, modulus::error>{};
for (;;) {
auto next = co_await selected->async_step();
if (!next) {
status = std::unexpected(next.error());
break;
}
if (!*next) {
break;
}
auto const &row = **next;
if (row.size() < 10U) {
continue;
}
auto source_json = text_value(row[9]);
auto parsed = vamp_zero::parse_score_document(source_json, text_value(row[8]));
if (!parsed) {
auto close = co_await connection.async_close();
if (!close) {
modulus::log_error("database close failed after practice parse error: " + close.error().describe());
}
co_return std::unexpected(parsed.error());
status = std::unexpected(parsed.error());
break;
}
auto type_id = text_value(row[1]);
auto lesson_id = text_value(row[3]);
@@ -566,7 +598,7 @@ auto vamp_zero::async_load_practice_library(boost::asio::any_io_executor executo
.variants = {std::move(variant)},
});
}
auto closed = co_await connection.async_close();
auto closed = co_await close_catalogue_query(connection, *selected, std::move(status));
if (!closed) {
co_return std::unexpected(closed.error());
}