void todoList::sDelete() { QString recurstr; QString recurtype; if (_todoList->altId() == 1) { recurstr = "SELECT MAX(todoitem_due_date) AS max" " FROM todoitem" " WHERE todoitem_recurring_todoitem_id=:id" " AND todoitem_id!=:id;" ; recurtype = "TODO"; } /* TODO: can't delete incidents from here. why not? else if (_todoList->altId() == 2) { recurstr = "SELECT MAX(incdt_timestamp) AS max" " FROM incdt" " WHERE incdt_recurring_incdt_id=:id;" ; recurtype = "INCDT"; } */ bool deleteAll = false; bool createMore = false; if (! recurstr.isEmpty()) { XSqlQuery recurq; recurq.prepare(recurstr); recurq.bindValue(":id", _todoList->id()); recurq.exec(); if (recurq.first()) { QMessageBox askdelete(QMessageBox::Question, tr("Delete Recurring Item?"), tr("<p>This is a recurring item. Do you want to " "delete just this one item or delete all open " "items in this recurrence?"), QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::Cancel, this); askdelete.setDefaultButton(QMessageBox::Cancel); int ret = askdelete.exec(); if (ret == QMessageBox::Cancel) return; else if (ret == QMessageBox::YesToAll) deleteAll = true; // user said delete one but the only one that exists is the base else if (ret == QMessageBox::Yes && recurq.value("max").isNull()) createMore = true; } else if (recurq.lastError().type() != QSqlError::NoError) { systemError(this, recurq.lastError().text(), __FILE__, __LINE__); return; } } else if (QMessageBox::warning(this, tr("Delete List Item?"), tr("<p>Are you sure that you want to " "completely delete the selected item?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No) return; QString procname; int procresult = 0; if (deleteAll) { procname = "deleteOpenRecurringItems"; q.prepare("SELECT deleteOpenRecurringItems(:id, :type, NULL, TRUE)" " AS result;"); q.bindValue(":id", _todoList->id()); q.bindValue(":type", recurtype); q.exec(); if (q.first()) procresult = q.value("result").toInt(); } if (procresult >= 0 && createMore) { procname = "createRecurringItems"; q.prepare("SELECT createRecurringItems(:id, :type) AS result;"); q.bindValue(":id", _todoList->id()); q.bindValue(":type", recurtype); q.exec(); if (q.first()) procresult = q.value("result").toInt(); } // not elseif - error handling for 1 or 2 queries if (procresult < 0) { systemError(this, storedProcErrorLookup(procname, procresult)); return; } else if (q.lastError().type() != QSqlError::NoError) { systemError(this, q.lastError().databaseText(), __FILE__, __LINE__); return; } if (_todoList->altId() == 1) q.prepare("SELECT deleteTodoItem(:todoitem_id) AS result;"); else if (_todoList->altId() == 3) q.prepare("DELETE FROM prjtask" " WHERE (prjtask_id=:todoitem_id); "); else if (_todoList->altId() == 4) q.prepare("SELECT deleteProject(:todoitem_id) AS result"); else return; q.bindValue(":todoitem_id", _todoList->id()); q.exec(); if (q.first()) { int result = q.value("result").toInt(); if (result < 0) { systemError(this, storedProcErrorLookup("deleteTodoItem", result)); return; } } else if (q.lastError().type() != QSqlError::NoError) { systemError(this, q.lastError().databaseText(), __FILE__, __LINE__); return; } sFillList(); }
void todoList::sDelete() { XSqlQuery todoDelete; QString recurstr; QString recurtype; if (list()->altId() == 1) { recurstr = "SELECT MAX(todoitem_due_date) AS max" " FROM todoitem" " WHERE todoitem_recurring_todoitem_id=:id" " AND todoitem_id!=:id;" ; recurtype = "TODO"; } bool deleteAll = false; bool deleteOne = false; if (! recurstr.isEmpty()) { XSqlQuery recurq; recurq.prepare(recurstr); recurq.bindValue(":id", list()->id()); recurq.exec(); if (recurq.first() && !recurq.value("max").isNull()) { QMessageBox askdelete(QMessageBox::Question, tr("Delete Recurring Item?"), tr("<p>This is a recurring item. Do you want to " "delete just this one item or delete all open " "items in this recurrence?"), QMessageBox::Yes | QMessageBox::YesToAll | QMessageBox::Cancel, this); askdelete.setDefaultButton(QMessageBox::Cancel); int ret = askdelete.exec(); if (ret == QMessageBox::Cancel) return; else if (ret == QMessageBox::YesToAll) deleteAll = true; // user said delete one but the only one that exists is the parent ToDo else if (ret == QMessageBox::Yes) deleteOne = true; } else if (recurq.lastError().type() != QSqlError::NoError) { systemError(this, recurq.lastError().text(), __FILE__, __LINE__); return; } else if (QMessageBox::warning(this, tr("Delete List Item?"), tr("<p>Are you sure that you want to " "completely delete the selected item?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No) return; } else if (QMessageBox::warning(this, tr("Delete List Item?"), tr("<p>Are you sure that you want to " "completely delete the selected item?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No) return; int procresult = 0; if (deleteAll) // Delete all todos in the recurring series { todoDelete.prepare("SELECT deleteOpenRecurringItems(:id, :type, NULL, true)" " AS result;"); todoDelete.bindValue(":id", list()->id()); todoDelete.bindValue(":type", recurtype); todoDelete.exec(); if (todoDelete.first()) procresult = todoDelete.value("result").toInt(); if (procresult < 0) { systemError(this, storedProcErrorLookup("deleteOpenRecurringItems", procresult)); return; } else if (todoDelete.lastError().type() != QSqlError::NoError) { systemError(this, todoDelete.lastError().databaseText(), __FILE__, __LINE__); return; } } if (deleteOne) // The base todo in a recurring series has been seleted. Have to move // recurrence to the next item else we hit foreign key errors. // Make the next item on the list the parent in the series { todoDelete.prepare("UPDATE todoitem SET todoitem_recurring_todoitem_id =(" " SELECT MIN(todoitem_id) FROM todoitem" " WHERE todoitem_recurring_todoitem_id=:id" " AND todoitem_id!=:id)" " WHERE todoitem_recurring_todoitem_id=:id" " AND todoitem_id!=:id;"); todoDelete.bindValue(":id", list()->id()); todoDelete.exec(); if (todoDelete.lastError().type() != QSqlError::NoError) { systemError(this, todoDelete.lastError().databaseText(), __FILE__, __LINE__); return; } } if (list()->altId() == 1) todoDelete.prepare("SELECT deleteTodoItem(:todoitem_id) AS result;"); else if (list()->altId() == 3) todoDelete.prepare("DELETE FROM prjtask" " WHERE (prjtask_id=:todoitem_id); "); else if (list()->altId() == 4) todoDelete.prepare("SELECT deleteProject(:todoitem_id) AS result"); else return; todoDelete.bindValue(":todoitem_id", list()->id()); todoDelete.exec(); if (todoDelete.first()) { int result = todoDelete.value("result").toInt(); if (result < 0) { systemError(this, storedProcErrorLookup("deleteTodoItem", result)); return; } } else if (todoDelete.lastError().type() != QSqlError::NoError) { systemError(this, todoDelete.lastError().databaseText(), __FILE__, __LINE__); return; } sFillList(); }