summaryrefslogtreecommitdiff
path: root/src/database.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/database.cc')
-rw-r--r--src/database.cc108
1 files changed, 82 insertions, 26 deletions
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<RecipeItem> 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<RecipeItem> 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<RecipeItem> 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;
}