Commit 97501ec0 authored by Marc Egger's avatar Marc Egger
Browse files

Refs #10120 import form on request Dirty & delete stale formElements as a precaution

parent 2e7081ee
Pipeline #3636 failed with stages
in 51 seconds
......@@ -113,18 +113,21 @@ class Dirty {
throw new \CodeException("Missing 'form' in SIP. There might be something broken.", ERROR_DIRTY_MISSING_FORM_IN_SIP);
}
// Connect to Database
$this->store = Store::getInstance();
$this->dbIndexQfq = $this->store->getVar(SYSTEM_DB_INDEX_QFQ, STORE_SYSTEM);
$this->dbIndexData = empty($sipVars[PARAM_DB_INDEX_DATA]) ? $this->store->getVar(SYSTEM_DB_INDEX_DATA, STORE_SYSTEM) : $sipVars[PARAM_DB_INDEX_DATA];
$this->doDbArray($this->dbIndexData, $this->dbIndexQfq);
// import form file. If it was changed, throw exception.
FormAsFile::importForm($sipVars[SIP_FORM], $this->dbArray[$this->dbIndexQfq]);
$recordId = empty($sipVars[SIP_RECORD_ID]) ? 0 : $sipVars[SIP_RECORD_ID];
if ($recordId == 0) {
// For r=0 (new) , 'dirty' will always succeed.
return [API_STATUS => 'success', API_MESSAGE => ''];
}
$this->store = Store::getInstance();
$this->dbIndexQfq = $this->store->getVar(SYSTEM_DB_INDEX_QFQ, STORE_SYSTEM);
$this->dbIndexData = empty($sipVars[PARAM_DB_INDEX_DATA]) ? $this->store->getVar(SYSTEM_DB_INDEX_DATA, STORE_SYSTEM) : $sipVars[PARAM_DB_INDEX_DATA];
$this->doDbArray($this->dbIndexData, $this->dbIndexQfq);
$tableVars = $this->dbArray[$this->dbIndexQfq]->sql("SELECT `tableName`, `primaryKey`, `dirtyMode`, `recordLockTimeoutSeconds` FROM `Form` WHERE `name`=?", ROW_EXPECT_1, [$sipVars[SIP_FORM]], "Form not found: '" . $sipVars[SIP_FORM] . "'");
if (empty($tableVars[F_PRIMARY_KEY])) {
$tableVars[F_PRIMARY_KEY] = F_PRIMARY_KEY_DEFAULT;
......
......@@ -8,14 +8,18 @@ use IMATHUZH\Qfq\Core\Helper\HelperFile;
use IMATHUZH\Qfq\Core\Helper\OnString;
use IMATHUZH\Qfq\Core\Helper\SqlQuery;
// TODO: exportAllForms() mit deleteFiles true testen
// TODO: Testen: QFQ komplett neu installiert => form dir existiert mit allen form files aktuell. QFQ neu installation mit existierenden forms => alte forms sind noch da. QFQ update => alte forms noch da, updates an FormEditor ersichtlich
// TODO: Testen: Dies sollte schon erfuellt sein, testen: bevor ein form/formelement im form editor gespeichert wird, soll es vom file geladen werden (Save.php). Falls das file importiert wurde, gibt es eine fehlermeldung.
// TODO: insertForm(): update filestats at the end instead of with form insert
// TODO: Testen:
// QFQ komplett neu installiert => form dir existiert mit allen form files aktuell.
// QFQ neu installation mit existierenden forms => alte forms sind noch da.
// QFQ update => alte forms noch da, updates an FormEditor ersichtlich
// DONE: Testen: bevor ein form/formelement im form editor gespeichert wird, soll es vom file geladen werden (Save.php). Falls das file importiert wurde, gibt es eine fehlermeldung.
// TODO: Testen: anfrage nach dirty, form file ueberpruefen (importieren)
// TODO: Testen: Dirty tabelle ist aussergewoehnlich voll. werden die records nicht abgeraeumt wegen formAsFile?
// TODO: Testen: ausporbieren was passiert wenn ich in Form-Editor auf speicher druecke nachdem ich in einem anderen tab das geanderte form file in die DB lade.
// TODO: Testen: importAllForms() wird nur ausgefuehrt, wenn der Report Form/FormElement aufruft
// TODO: Fix all broken tests... one easy solution?
// TODO: Carsten Fragen: Habe keine Unittests zu QuickFormQuery->doForm gefunden. Wird nicht getestet. FormAsFile nicht testen oder vielleicht nur mit selenium?
// TODO: Carsten Fragen: Form backups erstellen vor deleteFormFile und exportForm?
// TODO: Carsten Fragen: "git rm" anstatt "rm" benutzen falls ordner ein git repo? Einziger unterschied: macht "git add"
// TODO: Carsten Fragen: Form Copy ist broken. Aber jetzt auch unnötig, da man einfach die files kopieren kann.
......@@ -145,7 +149,7 @@ class FormAsFile
}
$formFromFile = json_decode($fileContents, true);
// Delete old form from DB if it exists
// Delete old form with that name from DB if it exists.
if (array_key_exists(F_ID, $formFromDb)) {
$formId = $formFromDb[$F_ID];
self::deleteFormDBWithId($formId, $database);
......@@ -162,6 +166,9 @@ class FormAsFile
list($sqlFormInsert, $parameterArrayFormInsert) = SqlQuery::insertRecord(TABLE_NAME_FORM, $insertValues);
$formId = $database->sql($sqlFormInsert, ROW_REGULAR, $parameterArrayFormInsert);
// Delete stale formElements with the new form id (these should not exist, but better make sure)
self::deleteFormElementsDBWithFormId($formId, $database);
// Insert FormElements to DB and collect container ids
$containerIds = []; // array(container_name => id)
foreach ($formFromFile[FORM_FILE_FORM_ELEMENT] as &$formElementFromFile) {
......@@ -549,6 +556,20 @@ class FormAsFile
$F_ID = F_ID; // can't use constants in strings directly
$TABLE_NAME_FORM = TABLE_NAME_FORM; // can't use constants in strings directly
$database->sql("DELETE FROM `$TABLE_NAME_FORM` WHERE `$F_ID`=? LIMIT 1", ROW_REGULAR, [$formId]);
self::deleteFormElementsDBWithFormId($formId, $database);
}
/**
* Delete form elements with given formId from DB
*
* @param $formId
* @param Database $database
* @throws \CodeException
* @throws \DbException
* @throws \UserFormException
*/
private static function deleteFormElementsDBWithFormId(int $formId, Database $database): void
{
$TABLE_NAME_FORM_ELEMENT = TABLE_NAME_FORM_ELEMENT; // can't use constants in strings directly
$FE_FORM_ID = FE_FORM_ID; // can't use constants in strings directly
$database->sql("DELETE FROM `$TABLE_NAME_FORM_ELEMENT` WHERE `$FE_FORM_ID`=?", ROW_REGULAR, [$formId]);
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment