From 60cacb4babb46ae2ab22ae0b7b7357012887460d Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Sun, 24 Apr 2022 15:44:35 +0200 Subject: Better viewer. Set license to GPL 3. --- src/database.cc | 108 ++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 82 insertions(+), 26 deletions(-) (limited to 'src/database.cc') diff --git a/src/database.cc b/src/database.cc index 5ae045a..9e34a09 100644 --- a/src/database.cc +++ b/src/database.cc @@ -12,7 +12,7 @@ * * Qookie is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Qookie is distributed in the hope that it will be useful, @@ -58,7 +58,7 @@ std::deque Database::getRecipes() sqlite3_stmt *statement; if(sqlite3_prepare_v2(db, sql.data(), sql.length(), &statement, 0) != SQLITE_OK) { - std::cerr << "Open database failed\n"; + std::cerr << "sqlite3_prepare_v2 failed: " << sqlite3_errmsg(db) << '\n'; return {}; } @@ -73,10 +73,12 @@ std::deque Database::getRecipes() item.id = sqlite3_column_int(statement, 0); int title_size = sqlite3_column_bytes(statement, 1); - item.title.append((const char*)sqlite3_column_blob(statement, 1), title_size); + item.title.append((const char*)sqlite3_column_blob(statement, 1), + title_size); int image_size = sqlite3_column_bytes(statement, 2); - item.image.append((const char*)sqlite3_column_blob(statement, 2), image_size); + item.image.append((const char*)sqlite3_column_blob(statement, 2), + image_size); } else { @@ -90,38 +92,92 @@ std::deque Database::getRecipes() Recipe Database::getRecipe(int id) { - // TODO + bool found{false}; + Recipe recipe; - std::string sql = "select id, title, image from recipe where id=" + id; - sqlite3_stmt *statement; - if(sqlite3_prepare_v2(db, sql.data(), sql.length(), &statement, 0) != SQLITE_OK) { - std::cerr << "Open database failed\n"; - return {}; + std::string sql = + "select id, title, image, instructions from recipe where id=" + + std::to_string(id); + sqlite3_stmt *statement; + if(sqlite3_prepare_v2(db, sql.data(), sql.length(), &statement, 0) != SQLITE_OK) + { + std::cerr << "sqlite3_prepare_v2 failed: " << sqlite3_errmsg(db) << '\n'; + return {}; + } + + int result = 0; + while(true) + { + result = sqlite3_step(statement); + + if(result == SQLITE_ROW) + { + recipe.id = sqlite3_column_int(statement, 0); + + int title_size = sqlite3_column_bytes(statement, 1); + recipe.title.append((const char*)sqlite3_column_blob(statement, 1), + title_size); + + int image_size = sqlite3_column_bytes(statement, 2); + recipe.image.append((const char*)sqlite3_column_blob(statement, 2), + image_size); + + int instructions_size = sqlite3_column_bytes(statement, 3); + recipe.instructions.append((const char*)sqlite3_column_blob(statement, 3), + instructions_size); +} + else + { + break; + } + found = true; + } } - int result = 0; - while(true) + if(!found) { - Recipe item; - result = sqlite3_step(statement); + std::cerr << "id " << id << " not found\n"; + return {}; + } - if(result == SQLITE_ROW) + { + std::string sql = + "select amount, unit, item from ingredients where recipe_id=" + + std::to_string(id);// + " order by position asc"; + sqlite3_stmt *statement; + if(sqlite3_prepare_v2(db, sql.data(), sql.length(), &statement, 0) != SQLITE_OK) { - item.id = sqlite3_column_int(statement, 0); - - int title_size = sqlite3_column_bytes(statement, 1); - item.title.append((const char*)sqlite3_column_blob(statement, 1), title_size); - - int image_size = sqlite3_column_bytes(statement, 2); - item.image.append((const char*)sqlite3_column_blob(statement, 2), image_size); + std::cerr << "sqlite3_prepare_v2 failed: " << sqlite3_errmsg(db) << '\n'; + return {}; } - else + + int result = 0; + while(true) { - break; + Ingredient ingredient; + result = sqlite3_step(statement); + + if(result == SQLITE_ROW) + { + ingredient.amount = sqlite3_column_double(statement, 0); + + int unit_size = sqlite3_column_bytes(statement, 1); + ingredient.unit.append((const char*)sqlite3_column_blob(statement, 1), + unit_size); + + int item_size = sqlite3_column_bytes(statement, 2); + ingredient.item.append((const char*)sqlite3_column_blob(statement, 2), + item_size); + + recipe.ingredients.push_back(ingredient); + } + else + { + break; + } } - return item; } - return {}; // Not found + return recipe; } -- cgit v1.2.3