Added the ability to delete a recipe by name or id.
This commit is contained in:
parent
fefa913e94
commit
7fb11b3412
|
@ -160,7 +160,7 @@ void NewRecipeDialog::on_removeTagButton_clicked(){
|
|||
return;
|
||||
}
|
||||
RecipeTag tag = this->tags[ui->tagsComboBox->currentIndex()];
|
||||
string content = "Are you sure you wish to delete the following tag:\n"+tag.getValue();
|
||||
string content = "Are you sure you wish to delete the following tag:\n"+tag.getValue()+"\nThis will delete the tag for all recipes that use it.";
|
||||
QMessageBox::StandardButton reply = QMessageBox::question(this, QString("Delete Tag"), QString(content.c_str()));
|
||||
if (reply == QMessageBox::Yes){
|
||||
this->recipeDB->deleteTag(tag);
|
||||
|
|
|
@ -22,11 +22,11 @@ OpenRecipeDialog::~OpenRecipeDialog()
|
|||
|
||||
void OpenRecipeDialog::populateRecipesTable(){
|
||||
vector<Recipe> recipes = this->recipeDB->retrieveAllRecipes();
|
||||
printf("Found %d recipes:\n", recipes.size());
|
||||
for (Recipe r : recipes){
|
||||
r.print();
|
||||
printf("\n------------------\n");
|
||||
}
|
||||
// printf("Found %d recipes:\n", recipes.size());
|
||||
// for (Recipe r : recipes){
|
||||
// r.print();
|
||||
// printf("\n------------------\n");
|
||||
// }
|
||||
this->recipeTableModel.setRecipes(recipes);
|
||||
ui->recipeTableView->show();
|
||||
}
|
||||
|
|
|
@ -97,6 +97,9 @@
|
|||
<property name="sortingEnabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<attribute name="verticalHeaderVisible">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
|
|
3
main.cpp
3
main.cpp
|
@ -48,6 +48,9 @@ int main(int argc, char *argv[])
|
|||
// printf("Accepted the dialog.\n");
|
||||
// }
|
||||
|
||||
bool success = recipeDB.deleteRecipe(4);
|
||||
printf("Success: %d\n", success);
|
||||
recipeDB.selectFrom("recipe", "recipeId, name", "").printData();
|
||||
w.loadFromRecipe(recipeDB.retrieveRecipe("Generic Bread"));
|
||||
|
||||
return a.exec();
|
||||
|
|
|
@ -46,6 +46,20 @@ ResultTable Database::selectFrom(string tableName, string columnNames, string co
|
|||
return this->executeSQL(query);
|
||||
}
|
||||
|
||||
bool Database::deleteFrom(string tableName, string conditions){
|
||||
if (tableName.empty()){
|
||||
return false;
|
||||
}
|
||||
string query = "DELETE FROM " + tableName + " " + conditions + ";";
|
||||
ResultTable t = this->executeSQL(query);
|
||||
if (t.getReturnCode() != SQLITE_DONE){
|
||||
fprintf(stderr, "Can't delete from table %s.Return code: %d\n%s\n", tableName.c_str(), t.getReturnCode(), sqlite3_errmsg(this->db));
|
||||
exit(EXIT_FAILURE);
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
void Database::openConnection(){
|
||||
this->returnCode = sqlite3_open(this->filename.c_str(), &this->db);
|
||||
if (this->returnCode || this->db == NULL){
|
||||
|
|
|
@ -26,6 +26,7 @@ public:
|
|||
ResultTable executeSQL(string statement);
|
||||
bool insertInto(string tableName, vector<string> columnNames, vector<string> values);
|
||||
ResultTable selectFrom(string tableName, string columnNames, string conditions);
|
||||
bool deleteFrom(string tableName, string conditions);
|
||||
|
||||
bool tableExists(string tableName);
|
||||
int getLastInsertedRowId();
|
||||
|
|
|
@ -5,6 +5,12 @@ RecipeDatabase::RecipeDatabase(string filename) : Database(filename){
|
|||
}
|
||||
|
||||
bool RecipeDatabase::storeRecipe(Recipe recipe){
|
||||
//Some primary checks to avoid garbage in the database.
|
||||
if (recipe.getName().empty() ||
|
||||
recipe.getInstruction().getHTML().empty() ||
|
||||
recipe.getIngredients().empty()){
|
||||
return false;
|
||||
}
|
||||
//Store a recipe, if it doesn't already exist. This first tries to create the recipe entry, then all subsequent supporting table entries.
|
||||
this->executeSQL("BEGIN;");
|
||||
ResultTable t = this->selectFrom("recipe", "*", "WHERE name="+surroundString(recipe.getName(), "'"));
|
||||
|
@ -233,7 +239,54 @@ vector<RecipeTag> RecipeDatabase::retrieveAllTags(){
|
|||
}
|
||||
|
||||
bool RecipeDatabase::deleteRecipe(string name){
|
||||
ResultTable t = this->selectFrom("recipe", "recipeId", "WHERE name="+name);
|
||||
if (t.rowCount() != 1){
|
||||
return false;
|
||||
}
|
||||
string recipeId = t.valueAt(0, 0);
|
||||
return this->deleteRecipe(std::stoi(recipeId));
|
||||
}
|
||||
|
||||
bool RecipeDatabase::deleteRecipe(int recipeId){
|
||||
string idString = std::to_string(recipeId);
|
||||
if (this->selectFrom("recipe", "recipeId", "WHERE recipeId="+idString).isEmpty()){
|
||||
return false;
|
||||
}
|
||||
this->executeSQL("BEGIN;");
|
||||
bool tagsDeleted = this->deleteFrom("recipeTag", "WHERE recipeId="+idString);
|
||||
bool recipeIngredientDeleted = this->deleteFrom("recipeIngredient", "WHERE recipeId="+idString);
|
||||
bool recipeDeleted = this->deleteFrom("recipe", "WHERE recipeId="+idString);
|
||||
if (tagsDeleted && recipeIngredientDeleted && recipeDeleted){
|
||||
this->executeSQL("COMMIT;");
|
||||
return true;
|
||||
} else {
|
||||
this->executeSQL("ROLLBACK;");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool RecipeDatabase::deleteIngredient(string name){
|
||||
ResultTable t = this->selectFrom("recipeIngredient", "recipeId", "WHERE ingredientId=("
|
||||
"SELECT ingredientId"
|
||||
"FROM ingredient"
|
||||
"WHERE name="+name+")");
|
||||
if (!t.isEmpty()){
|
||||
//There is at least one recipe dependent on the ingredient.
|
||||
return false;
|
||||
}
|
||||
return this->deleteFrom("ingredient", "WHERE name="+name);
|
||||
}
|
||||
|
||||
bool RecipeDatabase::deleteUnitOfMeasure(string name){
|
||||
ResultTable t = this->selectFrom("recipeIngredient", "recipeId", "WHERE unitName="+name);
|
||||
if (!t.isEmpty()){
|
||||
return false;
|
||||
}
|
||||
return this->deleteFrom("unitOfMeasure", "WHERE name="+name);
|
||||
}
|
||||
|
||||
bool RecipeDatabase::deleteTag(RecipeTag tag){
|
||||
return this->deleteFrom("recipeTag", "WHERE tagName="+tag.getValue());
|
||||
}
|
||||
|
||||
void RecipeDatabase::ensureTablesExist(){
|
||||
|
|
|
@ -41,7 +41,10 @@ class RecipeDatabase : public Database
|
|||
|
||||
//Deletion.
|
||||
bool deleteRecipe(string name);
|
||||
void deleteTag(RecipeTag tag);
|
||||
bool deleteRecipe(int recipeId);
|
||||
bool deleteIngredient(string name);
|
||||
bool deleteUnitOfMeasure(string name);
|
||||
bool deleteTag(RecipeTag tag);
|
||||
private:
|
||||
|
||||
//Utility methods.
|
||||
|
|
|
@ -45,8 +45,6 @@ QVariant RecipeTableModel::headerData(int section, Qt::Orientation orientation,
|
|||
return "Name";
|
||||
case 1:
|
||||
return "Created On";
|
||||
case 2:
|
||||
|
||||
default:
|
||||
return QVariant();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue