void batchItem::sSave() { if (_mode == cReschedule) { RecurrenceWidget::RecurrenceChangePolicy cp = _recur->getChangePolicy(); if (cp == RecurrenceWidget::NoPolicy) return; if (_recur->isRecurring() && _recur->parentId() < 0) _recur->setParent(_batchid, _recur->parentType()); XSqlQuery beginq("BEGIN;"); XSqlQuery rollbackq; rollbackq.prepare("ROLLBACK;"); XSqlQuery schedq(_db); schedq.prepare("UPDATE xtbatch.batch" " SET batch_scheduled=CAST(:date AS DATE) + CAST(:time AS TIME)," " batch_started=NULL, batch_completed=NULL," " batch_recurring_batch_id=:parentid" " WHERE (batch_id=:batchid);"); schedq.bindValue(":date", _scheduledDate->date()); schedq.bindValue(":time", _scheduledTime->time()); if (_recur->isRecurring()) schedq.bindValue(":parentid", _recur->parentId()); schedq.bindValue(":batchid", _batchid); schedq.exec(); if (schedq.lastError().type() != QSqlError::NoError) { rollbackq.exec(); QMessageBox::critical(this, tr("Error rescheduling job at %1::%2") .arg(__FILE__, __LINE__), schedq.lastError().databaseText()); return; } QString errmsg; if (! _recur->save(true, cp, &errmsg)) { rollbackq.exec(); QMessageBox::critical(this, "Error Saving Recurrence", errmsg); return; } XSqlQuery commitq("COMMIT;"); } done(_batchid); }
bool RecurrenceWidget::save(bool externaltxn, RecurrenceChangePolicy cp, QString *message) { if (! message) message = new QString(); if (DEBUG) qDebug("%s::save(%d, %d, %p) entered with id %d type %s", qPrintable(objectName()), externaltxn, cp, message, _parentId, qPrintable(_parentType)); if (! modified()) return true; if (_parentId < 0 || _parentType.isEmpty()) { *message = tr("Could not save Recurrence information. The " "parent object/event has not been set."); if (! externaltxn) QMessageBox::warning(this, tr("Missing Data"), *message); else qWarning("%s", qPrintable(*message)); return false; } if (! externaltxn && cp == NoPolicy) { cp = getChangePolicy(); if (cp == NoPolicy) return false; } else if (externaltxn && cp == NoPolicy) { *message = tr("You must choose how open events are to be handled"); qWarning("%s", qPrintable(*message)); return false; } XSqlQuery rollbackq; if (! externaltxn) { XSqlQuery beginq("BEGIN;"); rollbackq.prepare("ROLLBACK;"); } XSqlQuery recurq; if (isRecurring()) { if (_id > 0) { if (cp == ChangeFuture) { XSqlQuery futureq; futureq.prepare("SELECT splitRecurrence(:parent_id, :parent_type," " :splitdate) AS newrecurid;"); futureq.bindValue(":parent_id", _parentId); futureq.bindValue(":parent_type", _parentType); futureq.bindValue(":splitdate", startDate()); futureq.exec(); if (futureq.first()) { int result = futureq.value("newrecurid").toInt(); if (result > 0) { _id = result; futureq.prepare("SELECT recur_parent_id" " FROM recur" " WHERE recur_id=:recur_id;"); futureq.bindValue(":recur_id", _id); futureq.exec(); if (futureq.first()) _parentId = futureq.value("recur_parent_id").toInt(); } else if (result < 0) { *message = storedProcErrorLookup("splitRecurrence", result); if (! externaltxn) { rollbackq.exec(); QMessageBox::warning(this, tr("Processing Error"), *message); } else qWarning("%s", qPrintable(*message)); return false; } } // one check for potentially 2 queries if (futureq.lastError().type() != QSqlError::NoError) { *message = futureq.lastError().text(); if (! externaltxn) { rollbackq.exec(); QMessageBox::warning(this, tr("Database Error"), *message); } else qWarning("%s", qPrintable(*message)); return false; } } recurq.prepare("UPDATE recur SET" " recur_parent_id=:recur_parent_id," " recur_parent_type=UPPER(:recur_parent_type)," " recur_period=:recur_period," " recur_freq=:recur_freq," " recur_start=:recur_start," " recur_end=:recur_end," " recur_max=:recur_max" " WHERE (recur_id=:recurid)" " RETURNING recur_id;"); recurq.bindValue(":recurid", _id); } else { recurq.prepare("INSERT INTO recur (" " recur_parent_id, recur_parent_type," " recur_period, recur_freq," " recur_start, recur_end," " recur_max" ") VALUES (" " :recur_parent_id, UPPER(:recur_parent_type)," " :recur_period, :recur_freq," " :recur_start, :recur_end," " :recur_max" ") RETURNING recur_id;"); } recurq.bindValue(":recur_parent_id", _parentId); recurq.bindValue(":recur_parent_type", _parentType); recurq.bindValue(":recur_period", periodCode()); recurq.bindValue(":recur_freq", frequency()); recurq.bindValue(":recur_start", startDateTime()); if (endDate() < _eot.date()) recurq.bindValue(":recur_end", endDateTime()); recurq.bindValue(":recur_max", max()); recurq.exec(); if (recurq.first()) { _id = recurq.value("recur_id").toInt(); _prevParentId = _parentId; _prevParentType = _parentType; _prevEndDateTime = endDateTime(); _prevFrequency = frequency(); _prevMax = max(); _prevPeriod = period(); _prevRecurring = isRecurring(); _prevStartDateTime = startDateTime(); } } else // ! isRecurring() { recurq.prepare("DELETE FROM recur" " WHERE ((recur_parent_id=:recur_parent_id)" " AND (UPPER(recur_parent_type)=UPPER(:recur_parent_type)));"); recurq.bindValue(":recur_parent_id", _parentId); recurq.bindValue(":recur_parent_type", _parentType); recurq.exec(); } if (recurq.lastError().type() != QSqlError::NoError) { *message = recurq.lastError().text(); if (! externaltxn) { rollbackq.exec(); QMessageBox::warning(this, tr("Database Error"), *message); } else qWarning("%s", qPrintable(*message)); return false; } if (cp == ChangeFuture) { int procresult = -1; QString procname = "deleteOpenRecurringItems"; XSqlQuery cfq; cfq.prepare("SELECT deleteOpenRecurringItems(:parentId, :parentType," " :splitdate, false) AS result;"); cfq.bindValue(":parentId", _parentId); cfq.bindValue(":parentType", _parentType); cfq.bindValue(":splitdate", startDate()); cfq.exec(); if (cfq.first()) { procresult = cfq.value("result").toInt(); if (procresult >= 0) { QString procname = "createOpenRecurringItems"; cfq.prepare("SELECT createRecurringItems(:parentId, :parentType)" " AS result;"); cfq.bindValue(":parentId", _parentId); cfq.bindValue(":parentType", _parentType); cfq.exec(); if (cfq.first()) procresult = cfq.value("result").toInt(); } } // error handling for either 1 or 2 queries so not elseif // check cfq.lastError() first to avoid misreporting db errs as -1 if (cfq.lastError().type() != QSqlError::NoError) { *message = cfq.lastError().text(); if (! externaltxn) { rollbackq.exec(); QMessageBox::critical(this, tr("Database Error"), *message); } else qWarning("%s", qPrintable(*message)); return false; } else if (procresult < 0) { *message = storedProcErrorLookup(procname, procresult); if (! externaltxn) { rollbackq.exec(); QMessageBox::critical(this, tr("Processing Error"), *message); } else qWarning("%s", qPrintable(*message)); return false; } } if (! externaltxn) XSqlQuery commitq("COMMIT;"); return true; }
void todoItem::sSave() { RecurrenceWidget::RecurrenceChangePolicy cp = _recurring->getChangePolicy(); if (cp == RecurrenceWidget::NoPolicy) return; QString storedProc; XSqlQuery beginq("BEGIN;"); XSqlQuery rollbackq; rollbackq.prepare("ROLLBACK;"); if (_mode == cNew) { q.prepare( "SELECT createTodoItem(:todoitem_id, :username, :name, :description, " " :incdt_id, :crmacct_id, :ophead_id, :started, :due, :status, " " :assigned, :completed, :priority, :notes, :owner, :cntct_id) AS result;"); storedProc = "createTodoItem"; } else if (_mode == cEdit) { q.prepare( "SELECT updateTodoItem(:todoitem_id, " " :username, :name, :description, " " :incdt_id, :crmacct_id, :ophead_id, :started, :due, :status, " " :assigned, :completed, :priority, :notes, :active, :owner, :cntct_id) AS result;"); storedProc = "updateTodoItem"; } q.bindValue(":todoitem_id", _todoitemid); q.bindValue(":owner", _owner->username()); q.bindValue(":username", _assignedTo->username()); if(_assigned->date().isValid()) q.bindValue(":assigned", _assigned->date()); q.bindValue(":name", _name->text()); q.bindValue(":description", _description->text()); if (_incident->id() > 0) q.bindValue(":incdt_id", _incident->id()); // else NULL if (_crmacct->id() > 0) q.bindValue(":crmacct_id", _crmacct->id()); // else NULL q.bindValue(":started", _started->date()); q.bindValue(":due", _due->date()); q.bindValue(":assigned", _assigned->date()); q.bindValue(":completed", _completed->date()); if(_priority->isValid()) q.bindValue(":priority", _priority->id()); q.bindValue(":notes", _notes->toPlainText()); q.bindValue(":active", QVariant(_active->isChecked())); if(_ophead->id() > 0) q.bindValue(":ophead_id", _ophead->id()); QString status; if (_completed->date().isValid()) status = "C"; else if (_deferred->isChecked()) status = "D"; else if (_pending->isChecked()) status = "P"; else if (_started->date().isValid()) status = "I"; else status = "N"; q.bindValue(":status", status); if (_cntct->isValid()) q.bindValue(":cntct_id", _cntct->id()); q.exec(); if (q.first()) { int result = q.value("result").toInt(); if (result < 0) { systemError(this, storedProcErrorLookup(storedProc, result), __FILE__, __LINE__); rollbackq.exec(); return; } } else if (q.lastError().type() != QSqlError::NoError) { rollbackq.exec(); systemError(this, q.lastError().databaseText(), __FILE__, __LINE__); return; } // TODO: make this part of {create,update}TodoItem? if (_recurring->isRecurring()) { XSqlQuery recurq; recurq.prepare("UPDATE todoitem" " SET todoitem_recurring_todoitem_id=:parent_id" " WHERE todoitem_id=:id;"); recurq.bindValue(":parent_id", _recurring->parentId()); recurq.bindValue(":id", _todoitemid); if (! recurq.exec()) { rollbackq.exec(); systemError(this, recurq.lastError().text(), __FILE__, __LINE__); return; } } QString errmsg; if (! _recurring->save(true, cp, &errmsg)) { rollbackq.exec(); systemError(this, errmsg, __FILE__, __LINE__); return; } XSqlQuery commitq("COMMIT;"); done(_todoitemid); }