+48
-16
@@ -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());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user