From 428b9d0055a1a971cbf733c7ab5d1c37851e8ff6 Mon Sep 17 00:00:00 2001 From: Roly Rudy Gutierrez Pinto Date: Thu, 7 Jun 2018 15:41:10 -0400 Subject: [PATCH] HOR-4481 --- workflow/engine/bin/tasks/cliUpgrade.php | 6 +- workflow/engine/bin/tasks/cliWorkspaces.php | 58 +++++- workflow/engine/classes/WorkspaceTools.php | 179 +++++++++++++++++- .../model/map/AppDataChangeLogMapBuilder.php | 2 + .../classes/model/om/BaseAppDataChangeLog.php | 60 +++++- .../model/om/BaseAppDataChangeLogPeer.php | 23 ++- workflow/engine/config/schema.xml | 1 + workflow/engine/data/mysql/insert.sql | 1 + workflow/engine/data/mysql/schema.sql | 3 +- .../src/ProcessMaker/ChangeLog/ChangeLog.php | 1 + 10 files changed, 318 insertions(+), 16 deletions(-) diff --git a/workflow/engine/bin/tasks/cliUpgrade.php b/workflow/engine/bin/tasks/cliUpgrade.php index 3c80ad393..c1762bbbf 100644 --- a/workflow/engine/bin/tasks/cliUpgrade.php +++ b/workflow/engine/bin/tasks/cliUpgrade.php @@ -8,6 +8,7 @@ CLI::taskDescription("Upgrade workspaces.\n\n This command should be run after u CLI::taskOpt('buildACV', 'If this option is enabled, the Cache View is built.', 'ACV', 'buildACV'); CLI::taskOpt('noxml', 'If this option is enabled, the XML files translation is not built.', 'NoXml', 'no-xml'); +CLI::taskOpt('include_dyn_content', "Include the DYN_CONTENT_HISTORY value. Ex: --include_dyn_content", 'i', 'include_dyn_content'); CLI::taskRun("run_upgrade"); /*----------------------------------********---------------------------------*/ CLI::taskName('unify-database'); @@ -107,6 +108,9 @@ function run_upgrade($command, $args) $countWorkspace = 0; $buildCacheView = array_key_exists('buildACV', $args); $flagUpdateXml = !array_key_exists('noxml', $args); + $optionMigrateHistoryData = [ + 'includeDynContent' => array_key_exists('include_dyn_content', $args) + ]; foreach ($workspaces as $index => $workspace) { if (empty(config("system.workspace"))) { @@ -125,7 +129,7 @@ function run_upgrade($command, $args) try { $countWorkspace++; CLI::logging("Upgrading workspaces ($countWorkspace/$count): " . CLI::info($workspace->name) . "\n"); - $workspace->upgrade($buildCacheView, $workspace->name, false, 'en', ['updateXml' => $flagUpdateXml, 'updateMafe' => $first]); + $workspace->upgrade($buildCacheView, $workspace->name, false, 'en', ['updateXml' => $flagUpdateXml, 'updateMafe' => $first], $optionMigrateHistoryData); $workspace->close(); $first = false; $flagUpdateXml = false; diff --git a/workflow/engine/bin/tasks/cliWorkspaces.php b/workflow/engine/bin/tasks/cliWorkspaces.php index ff2010595..b91fcece2 100644 --- a/workflow/engine/bin/tasks/cliWorkspaces.php +++ b/workflow/engine/bin/tasks/cliWorkspaces.php @@ -50,6 +50,7 @@ CLI::taskOpt("workspace", "Specify which workspace to restore if multiple worksp Ex: -wworkflow.", "w:", "workspace="); CLI::taskOpt("lang", "Specify the language which will be used to rebuild the case cache list. If this option isn't included, then 'en' (English) will be used by default.", "l:", "lang="); CLI::taskOpt("port", "Specify the port number used by MySQL. If not specified, then the port 3306 will be used by default.", "p:"); +CLI::taskOpt('include_dyn_content', "Include the DYN_CONTENT_HISTORY value. Ex: --include_dyn_content", 'd', 'include_dyn_content'); CLI::taskRun("run_workspace_restore"); CLI::taskName('cacheview-repair'); @@ -342,6 +343,18 @@ EOT CLI::taskArg('workspace'); CLI::taskRun("regenerate_pmtable_classes"); +/** + * Migrate the data from APP_HISTORY table to the new table APP_DATA_CHANGE_LOG. + */ +CLI::taskName('migrate-history-data'); +CLI::taskDescription(<< array_key_exists('include_dyn_content', $args) + ]; if ($info) { WorkspaceTools::getBackupInfo($filename); } else { @@ -865,7 +881,7 @@ function run_workspace_restore($args, $opts) CLI::error("Please, you should use -m parameter to restore them.\n"); return; } - WorkspaceTools::restore($filename, $workspace, $dstWorkspace, $overwrite, $lang, $port); + WorkspaceTools::restore($filename, $workspace, $dstWorkspace, $overwrite, $lang, $port, $optionMigrateHistoryData); } } } else { @@ -1268,3 +1284,43 @@ function regenerate_pmtable_classes($args, $opts) throw new Exception("No workspace specified for updating generated class files."); } } + +/** + * This method migrates data from APP_HISTORY table to APP_DATA_CHANGE_LOG table. + * + * @param array $args + * @param string $opts + */ +function migrate_history_data($args, $opts) +{ + foreach ($args as $key => $value) { + if ($args[$key] === '--include_dyn_content' || $args[$key] === '-i') { + unset($args[$key]); + $opts['include_dyn_content'] = ''; + } + } + $option = ''; + $removedDynContentHistory = true; + $exist = array_key_exists('include_dyn_content', $opts); + if ($exist) { + $removedDynContentHistory = false; + $option = '--include_dyn_content'; + } + if (count($args) === 1) { + $start = microtime(true); + CLI::logging("> Migrating history data...\n"); + + Bootstrap::setConstantsRelatedWs($args[0]); + + $workspaceTools = new WorkspaceTools($args[0]); + $workspaceTools->migrateAppHistoryToAppDataChangeLog(true, $removedDynContentHistory); + + $stop = microtime(true); + CLI::logging("<*> Migrating history data took " . ($stop - $start) . " seconds.\n"); + } else { + $workspaces = get_workspaces_from_args($args); + foreach ($workspaces as $workspace) { + passthru(PHP_BINARY . ' processmaker migrate-history-data ' . $workspace->name . ' ' . $option); + } + } +} diff --git a/workflow/engine/classes/WorkspaceTools.php b/workflow/engine/classes/WorkspaceTools.php index baf8ae6ec..63999ed0e 100644 --- a/workflow/engine/classes/WorkspaceTools.php +++ b/workflow/engine/classes/WorkspaceTools.php @@ -2,10 +2,11 @@ use Illuminate\Database\QueryException; use Illuminate\Support\Facades\DB; +use ProcessMaker\ChangeLog\ChangeLog; use ProcessMaker\Core\Installer; use ProcessMaker\Core\System; -use ProcessMaker\Util\FixReferencePath; use ProcessMaker\Plugins\Adapters\PluginAdapter; +use ProcessMaker\Util\FixReferencePath; /** * class workspaceTools. @@ -221,7 +222,7 @@ class WorkspaceTools * * @return void */ - public function upgrade($buildCacheView = false, $workSpace = null, $onedb = false, $lang = 'en', array $arrayOptTranslation = null) + public function upgrade($buildCacheView = false, $workSpace = null, $onedb = false, $lang = 'en', array $arrayOptTranslation = null, $optionMigrateHistoryData = []) { if ($workSpace === null) { $workSpace = config("system.workspace"); @@ -339,6 +340,13 @@ class WorkspaceTools $this->migrateSingleton($workSpace); $stop = microtime(true); CLI::logging("<*> Migrating and populating plugin singleton data took " . ($stop - $start) . " seconds.\n"); + + $includeDynContent = isset($optionMigrateHistoryData['includeDynContent']) && $optionMigrateHistoryData['includeDynContent'] === true; + $start = microtime(true); + CLI::logging("> Migrating history data...\n"); + $this->migrateAppHistoryToAppDataChangeLog(false, !$includeDynContent); + $stop = microtime(true); + CLI::logging("<*> Migrating history data took " . ($stop - $start) . " seconds.\n"); } /** @@ -1806,7 +1814,7 @@ class WorkspaceTools * @param string $lang for define the language * @param string $port of database if is empty take 3306 */ - public static function restore($filename, $srcWorkspace, $dstWorkspace = null, $overwrite = true, $lang = 'en', $port = '') + public static function restore($filename, $srcWorkspace, $dstWorkspace = null, $overwrite = true, $lang = 'en', $port = '', $optionMigrateHistoryData = []) { $backup = new Archive_Tar($filename); //Get a temporary directory in the upgrade directory @@ -2054,6 +2062,12 @@ class WorkspaceTools //Updating generated class files for PM Tables passthru(PHP_BINARY . ' processmaker regenerate-pmtable-classes ' . $workspace->name); + $includeDynContent = isset($optionMigrateHistoryData['includeDynContent']) && $optionMigrateHistoryData['includeDynContent'] === true; + $start = microtime(true); + CLI::logging("> Migrating history data...\n"); + $workspace->migrateAppHistoryToAppDataChangeLog(false, !$includeDynContent); + $stop = microtime(true); + CLI::logging("<*> Migrating history data took " . ($stop - $start) . " seconds.\n"); } CLI::logging("Removing temporary files\n"); @@ -4194,4 +4208,163 @@ class WorkspaceTools $this->setLastContentMigrateTable(true); } } + + /** + * Migrate the contents of table APP_HISTORY to table APP_DATA_CHANGE_LOG. + * + * @param boolean $force + * @param boolean $removedDynContentHistory + * @return void + */ + public function migrateAppHistoryToAppDataChangeLog($force = false, $removedDynContentHistory = false) + { + $this->initPropel(true); + + $conf = new Configurations(); + $exist = $conf->exists('MIGRATED_APP_HISTORY', 'history'); + if ($exist === true && $force === false) { + $config = (object) $conf->load('MIGRATED_APP_HISTORY', 'history'); + if ($config->updated) { + CLI::logging("> This was previously updated.\n"); + return; + } + } + + $remove = "" + . "CONCAT( " + . " SUBSTRING_INDEX(A.HISTORY_DATA, ':', 1), " + . " ':', " + . " CAST( " + . " SUBSTRING( " + . " SUBSTRING_INDEX(A.HISTORY_DATA, ':{', 1), " + . " LOCATE(':', A.HISTORY_DATA)+1 " + . " ) AS SIGNED " + . " )-1, " + . " SUBSTRING( " + . " CONCAT( " + . " SUBSTRING_INDEX(A.HISTORY_DATA, 's:19:\"DYN_CONTENT_HISTORY\";s:', 1), " + . " SUBSTRING( " + . " SUBSTRING( " + . " A.HISTORY_DATA, " + . " LOCATE('s:19:\"DYN_CONTENT_HISTORY\";s:', A.HISTORY_DATA)+29 " + . " ), " + . " LOCATE( " + . " '\";', " + . " SUBSTRING( " + . " A.HISTORY_DATA, " + . " LOCATE('s:19:\"DYN_CONTENT_HISTORY\";s:', A.HISTORY_DATA)+29 " + . " ) " + . " )+2 " + . " ) " + . " ), " + . " LOCATE(':{', A.HISTORY_DATA) " + . " ) " + . ") "; + + $select = "" + . "SELECT " + . "A.HISTORY_DATE AS 'DATE', " + . "B.APP_NUMBER AS 'APP_NUMBER', " + . "A.DEL_INDEX AS 'DEL_INDEX', " + . "C.PRO_ID AS 'PRO_ID', " + . "D.TAS_ID AS 'TAS_ID', " + . "E.USR_ID AS 'USR_ID', " + . "IF( " + . " A.OBJ_TYPE='DYNAFORM', " + . " " . ChangeLog::DYNAFORM . ", " + . " IF( " + . " A.OBJ_TYPE='OUTPUT_DOCUMENT', " + . " " . ChangeLog::OUTPUT_DOCUMENT . ", " + . " IF( " + . " A.OBJ_TYPE='INPUT_DOCUMENT', " + . " " . ChangeLog::INPUT_DOCUMENT . ", " + . " IF( " + . " A.OBJ_TYPE='ASSIGN_TASK', " + . " " . ChangeLog::TRIGGER . ", " + . " IF( " + . " A.OBJ_TYPE='EXTERNAL', " + . " " . ChangeLog::EXTERNAL_STEP . ", " + . " 0 " + . " ) " + . " ) " + . " ) " + . " ) " + . ") AS 'OBJECT_TYPE', " + . "IF( " + . " F.DYN_ID IS NOT NULL, " + . " F.DYN_ID, " + . " IF( " + . " G.OUT_DOC_ID IS NOT NULL, " + . " G.OUT_DOC_ID, " + . " IF( " + . " H.INP_DOC_ID IS NOT NULL, " + . " H.INP_DOC_ID, " + . " 0 " + . " ) " + . " ) " + . ") AS 'OBJECT_ID', " + . "IF( " + . " A.DYN_UID='-1' OR A.DYN_UID='-2', " + . " 0," + . " A.DYN_UID " + . ") AS 'OBJECT_UID', " + . "IF( " + . " A.DYN_UID='-1', " + . " " . ChangeLog::BEFORE_ASSIGNMENT . ", " + . " IF( " + . " A.DYN_UID='-2', " + . " " . ChangeLog::UNKNOW_STEP . ", " + . " " . ChangeLog::UNKNOW_STEP . " " + . " ) " + . ") AS 'EXECUTED_AT', " + . "" . ChangeLog::FromWeb . " AS 'SOURCE_ID', " + . "IF(LOCATE('DYN_CONTENT_HISTORY',A.HISTORY_DATA)>0 AND " . ($removedDynContentHistory ? 'true' : 'false') . "=true, " . $remove . ", A.HISTORY_DATA) AS 'DATA', " + . "IF(LOCATE('SYS_SKIN',B.APP_DATA)>0, SUBSTRING_INDEX(SUBSTRING(B.APP_DATA, LOCATE('SYS_SKIN',B.APP_DATA)+16),'\"',1), '') AS 'SKIN', " + . "IF(LOCATE('SYS_LANG',B.APP_DATA)>0, SUBSTRING(B.APP_DATA, LOCATE('SYS_LANG',B.APP_DATA)+15,2), '') AS 'LANGUAGE', " + . "1 AS ROW_MIGRATION " + . "FROM " . $this->dbName . ".APP_HISTORY AS A " + . "LEFT JOIN " . $this->dbName . ".APPLICATION AS B ON (B.APP_UID=A.APP_UID) " + . "LEFT JOIN " . $this->dbName . ".PROCESS AS C ON (C.PRO_UID=A.PRO_UID) " + . "LEFT JOIN " . $this->dbName . ".TASK AS D ON (D.TAS_UID=A.TAS_UID) " + . "LEFT JOIN " . $this->dbName . ".USERS AS E ON (E.USR_UID=A.USR_UID) " + . "LEFT JOIN " . $this->dbName . ".DYNAFORM AS F ON (F.DYN_UID=A.DYN_UID) " + . "LEFT JOIN " . $this->dbName . ".OUTPUT_DOCUMENT AS G ON (G.OUT_DOC_UID=A.DYN_UID) " + . "LEFT JOIN " . $this->dbName . ".INPUT_DOCUMENT AS H ON (H.INP_DOC_UID=A.DYN_UID) "; + + $delete = "" + . "DELETE FROM " . $this->dbName . ".APP_DATA_CHANGE_LOG " + . "WHERE " + . "ROW_MIGRATION=1"; + + $insert = "" + . "INSERT INTO " . $this->dbName . ".APP_DATA_CHANGE_LOG ( " + . " DATE, " + . " APP_NUMBER, " + . " DEL_INDEX, " + . " PRO_ID, " + . " TAS_ID, " + . " USR_ID, " + . " OBJECT_TYPE, " + . " OBJECT_ID, " + . " OBJECT_UID, " + . " EXECUTED_AT, " + . " SOURCE_ID, " + . " DATA, " + . " SKIN, " + . " LANGUAGE, " + . " ROW_MIGRATION " + . ") " + . $select; + + $con = Propel::getConnection("workflow"); + $stmt = $con->createStatement(); + $stmt->executeQuery($delete); + CLI::logging("-> Table cleaning finished for " . $this->dbName . ".APP_DATA_CHANGE_LOG\n"); + $stmt = $con->createStatement(); + $stmt->executeQuery($insert); + CLI::logging("-> Completed migration in table " . $this->dbName . ".APP_DATA_CHANGE_LOG\n"); + + $conf->aConfig = ['updated' => true]; + $conf->saveConfig('MIGRATED_APP_HISTORY', 'history'); + } } diff --git a/workflow/engine/classes/model/map/AppDataChangeLogMapBuilder.php b/workflow/engine/classes/model/map/AppDataChangeLogMapBuilder.php index 792637993..dd6164bec 100644 --- a/workflow/engine/classes/model/map/AppDataChangeLogMapBuilder.php +++ b/workflow/engine/classes/model/map/AppDataChangeLogMapBuilder.php @@ -95,6 +95,8 @@ class AppDataChangeLogMapBuilder $tMap->addColumn('LANGUAGE', 'Language', 'string', CreoleTypes::VARCHAR, false, 32); + $tMap->addColumn('ROW_MIGRATION', 'RowMigration', 'int', CreoleTypes::INTEGER, false, null); + } // doBuild() } // AppDataChangeLogMapBuilder diff --git a/workflow/engine/classes/model/om/BaseAppDataChangeLog.php b/workflow/engine/classes/model/om/BaseAppDataChangeLog.php index 677b596e6..e810d7a76 100644 --- a/workflow/engine/classes/model/om/BaseAppDataChangeLog.php +++ b/workflow/engine/classes/model/om/BaseAppDataChangeLog.php @@ -117,6 +117,12 @@ abstract class BaseAppDataChangeLog extends BaseObject implements Persistent */ protected $language = ''; + /** + * The value for the row_migration field. + * @var int + */ + protected $row_migration = 0; + /** * Flag to prevent endless save loop, if this object is referenced * by another object which falls in this transaction. @@ -317,6 +323,17 @@ abstract class BaseAppDataChangeLog extends BaseObject implements Persistent return $this->language; } + /** + * Get the [row_migration] column value. + * + * @return int + */ + public function getRowMigration() + { + + return $this->row_migration; + } + /** * Set the value of [change_log_id] column. * @@ -654,6 +671,28 @@ abstract class BaseAppDataChangeLog extends BaseObject implements Persistent } // setLanguage() + /** + * Set the value of [row_migration] column. + * + * @param int $v new value + * @return void + */ + public function setRowMigration($v) + { + + // Since the native PHP type for this column is integer, + // we will cast the input value to an int (if it is not). + if ($v !== null && !is_int($v) && is_numeric($v)) { + $v = (int) $v; + } + + if ($this->row_migration !== $v || $v === 0) { + $this->row_migration = $v; + $this->modifiedColumns[] = AppDataChangeLogPeer::ROW_MIGRATION; + } + + } // setRowMigration() + /** * Hydrates (populates) the object variables with values from the database resultset. * @@ -701,12 +740,14 @@ abstract class BaseAppDataChangeLog extends BaseObject implements Persistent $this->language = $rs->getString($startcol + 14); + $this->row_migration = $rs->getInt($startcol + 15); + $this->resetModified(); $this->setNew(false); // FIXME - using NUM_COLUMNS may be clearer. - return $startcol + 15; // 15 = AppDataChangeLogPeer::NUM_COLUMNS - AppDataChangeLogPeer::NUM_LAZY_LOAD_COLUMNS). + return $startcol + 16; // 16 = AppDataChangeLogPeer::NUM_COLUMNS - AppDataChangeLogPeer::NUM_LAZY_LOAD_COLUMNS). } catch (Exception $e) { throw new PropelException("Error populating AppDataChangeLog object", $e); @@ -957,6 +998,9 @@ abstract class BaseAppDataChangeLog extends BaseObject implements Persistent case 14: return $this->getLanguage(); break; + case 15: + return $this->getRowMigration(); + break; default: return null; break; @@ -992,6 +1036,7 @@ abstract class BaseAppDataChangeLog extends BaseObject implements Persistent $keys[12] => $this->getData(), $keys[13] => $this->getSkin(), $keys[14] => $this->getLanguage(), + $keys[15] => $this->getRowMigration(), ); return $result; } @@ -1068,6 +1113,9 @@ abstract class BaseAppDataChangeLog extends BaseObject implements Persistent case 14: $this->setLanguage($value); break; + case 15: + $this->setRowMigration($value); + break; } // switch() } @@ -1151,6 +1199,10 @@ abstract class BaseAppDataChangeLog extends BaseObject implements Persistent $this->setLanguage($arr[$keys[14]]); } + if (array_key_exists($keys[15], $arr)) { + $this->setRowMigration($arr[$keys[15]]); + } + } /** @@ -1222,6 +1274,10 @@ abstract class BaseAppDataChangeLog extends BaseObject implements Persistent $criteria->add(AppDataChangeLogPeer::LANGUAGE, $this->language); } + if ($this->isColumnModified(AppDataChangeLogPeer::ROW_MIGRATION)) { + $criteria->add(AppDataChangeLogPeer::ROW_MIGRATION, $this->row_migration); + } + return $criteria; } @@ -1304,6 +1360,8 @@ abstract class BaseAppDataChangeLog extends BaseObject implements Persistent $copyObj->setLanguage($this->language); + $copyObj->setRowMigration($this->row_migration); + $copyObj->setNew(true); diff --git a/workflow/engine/classes/model/om/BaseAppDataChangeLogPeer.php b/workflow/engine/classes/model/om/BaseAppDataChangeLogPeer.php index 2b5b4a8ba..d9fcdbdfe 100644 --- a/workflow/engine/classes/model/om/BaseAppDataChangeLogPeer.php +++ b/workflow/engine/classes/model/om/BaseAppDataChangeLogPeer.php @@ -25,7 +25,7 @@ abstract class BaseAppDataChangeLogPeer const CLASS_DEFAULT = 'classes.model.AppDataChangeLog'; /** The total number of columns. */ - const NUM_COLUMNS = 15; + const NUM_COLUMNS = 16; /** The number of lazy-loaded columns. */ const NUM_LAZY_LOAD_COLUMNS = 0; @@ -76,6 +76,9 @@ abstract class BaseAppDataChangeLogPeer /** the column name for the LANGUAGE field */ const LANGUAGE = 'APP_DATA_CHANGE_LOG.LANGUAGE'; + /** the column name for the ROW_MIGRATION field */ + const ROW_MIGRATION = 'APP_DATA_CHANGE_LOG.ROW_MIGRATION'; + /** The PHP to DB Name Mapping */ private static $phpNameMap = null; @@ -87,10 +90,10 @@ abstract class BaseAppDataChangeLogPeer * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' */ private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('ChangeLogId', 'Date', 'AppNumber', 'DelIndex', 'ProId', 'TasId', 'UsrId', 'ObjectType', 'ObjectId', 'ObjectUid', 'ExecutedAt', 'SourceId', 'Data', 'Skin', 'Language', ), - BasePeer::TYPE_COLNAME => array (AppDataChangeLogPeer::CHANGE_LOG_ID, AppDataChangeLogPeer::DATE, AppDataChangeLogPeer::APP_NUMBER, AppDataChangeLogPeer::DEL_INDEX, AppDataChangeLogPeer::PRO_ID, AppDataChangeLogPeer::TAS_ID, AppDataChangeLogPeer::USR_ID, AppDataChangeLogPeer::OBJECT_TYPE, AppDataChangeLogPeer::OBJECT_ID, AppDataChangeLogPeer::OBJECT_UID, AppDataChangeLogPeer::EXECUTED_AT, AppDataChangeLogPeer::SOURCE_ID, AppDataChangeLogPeer::DATA, AppDataChangeLogPeer::SKIN, AppDataChangeLogPeer::LANGUAGE, ), - BasePeer::TYPE_FIELDNAME => array ('CHANGE_LOG_ID', 'DATE', 'APP_NUMBER', 'DEL_INDEX', 'PRO_ID', 'TAS_ID', 'USR_ID', 'OBJECT_TYPE', 'OBJECT_ID', 'OBJECT_UID', 'EXECUTED_AT', 'SOURCE_ID', 'DATA', 'SKIN', 'LANGUAGE', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ) + BasePeer::TYPE_PHPNAME => array ('ChangeLogId', 'Date', 'AppNumber', 'DelIndex', 'ProId', 'TasId', 'UsrId', 'ObjectType', 'ObjectId', 'ObjectUid', 'ExecutedAt', 'SourceId', 'Data', 'Skin', 'Language', 'RowMigration', ), + BasePeer::TYPE_COLNAME => array (AppDataChangeLogPeer::CHANGE_LOG_ID, AppDataChangeLogPeer::DATE, AppDataChangeLogPeer::APP_NUMBER, AppDataChangeLogPeer::DEL_INDEX, AppDataChangeLogPeer::PRO_ID, AppDataChangeLogPeer::TAS_ID, AppDataChangeLogPeer::USR_ID, AppDataChangeLogPeer::OBJECT_TYPE, AppDataChangeLogPeer::OBJECT_ID, AppDataChangeLogPeer::OBJECT_UID, AppDataChangeLogPeer::EXECUTED_AT, AppDataChangeLogPeer::SOURCE_ID, AppDataChangeLogPeer::DATA, AppDataChangeLogPeer::SKIN, AppDataChangeLogPeer::LANGUAGE, AppDataChangeLogPeer::ROW_MIGRATION, ), + BasePeer::TYPE_FIELDNAME => array ('CHANGE_LOG_ID', 'DATE', 'APP_NUMBER', 'DEL_INDEX', 'PRO_ID', 'TAS_ID', 'USR_ID', 'OBJECT_TYPE', 'OBJECT_ID', 'OBJECT_UID', 'EXECUTED_AT', 'SOURCE_ID', 'DATA', 'SKIN', 'LANGUAGE', 'ROW_MIGRATION', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, ) ); /** @@ -100,10 +103,10 @@ abstract class BaseAppDataChangeLogPeer * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 */ private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('ChangeLogId' => 0, 'Date' => 1, 'AppNumber' => 2, 'DelIndex' => 3, 'ProId' => 4, 'TasId' => 5, 'UsrId' => 6, 'ObjectType' => 7, 'ObjectId' => 8, 'ObjectUid' => 9, 'ExecutedAt' => 10, 'SourceId' => 11, 'Data' => 12, 'Skin' => 13, 'Language' => 14, ), - BasePeer::TYPE_COLNAME => array (AppDataChangeLogPeer::CHANGE_LOG_ID => 0, AppDataChangeLogPeer::DATE => 1, AppDataChangeLogPeer::APP_NUMBER => 2, AppDataChangeLogPeer::DEL_INDEX => 3, AppDataChangeLogPeer::PRO_ID => 4, AppDataChangeLogPeer::TAS_ID => 5, AppDataChangeLogPeer::USR_ID => 6, AppDataChangeLogPeer::OBJECT_TYPE => 7, AppDataChangeLogPeer::OBJECT_ID => 8, AppDataChangeLogPeer::OBJECT_UID => 9, AppDataChangeLogPeer::EXECUTED_AT => 10, AppDataChangeLogPeer::SOURCE_ID => 11, AppDataChangeLogPeer::DATA => 12, AppDataChangeLogPeer::SKIN => 13, AppDataChangeLogPeer::LANGUAGE => 14, ), - BasePeer::TYPE_FIELDNAME => array ('CHANGE_LOG_ID' => 0, 'DATE' => 1, 'APP_NUMBER' => 2, 'DEL_INDEX' => 3, 'PRO_ID' => 4, 'TAS_ID' => 5, 'USR_ID' => 6, 'OBJECT_TYPE' => 7, 'OBJECT_ID' => 8, 'OBJECT_UID' => 9, 'EXECUTED_AT' => 10, 'SOURCE_ID' => 11, 'DATA' => 12, 'SKIN' => 13, 'LANGUAGE' => 14, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ) + BasePeer::TYPE_PHPNAME => array ('ChangeLogId' => 0, 'Date' => 1, 'AppNumber' => 2, 'DelIndex' => 3, 'ProId' => 4, 'TasId' => 5, 'UsrId' => 6, 'ObjectType' => 7, 'ObjectId' => 8, 'ObjectUid' => 9, 'ExecutedAt' => 10, 'SourceId' => 11, 'Data' => 12, 'Skin' => 13, 'Language' => 14, 'RowMigration' => 15, ), + BasePeer::TYPE_COLNAME => array (AppDataChangeLogPeer::CHANGE_LOG_ID => 0, AppDataChangeLogPeer::DATE => 1, AppDataChangeLogPeer::APP_NUMBER => 2, AppDataChangeLogPeer::DEL_INDEX => 3, AppDataChangeLogPeer::PRO_ID => 4, AppDataChangeLogPeer::TAS_ID => 5, AppDataChangeLogPeer::USR_ID => 6, AppDataChangeLogPeer::OBJECT_TYPE => 7, AppDataChangeLogPeer::OBJECT_ID => 8, AppDataChangeLogPeer::OBJECT_UID => 9, AppDataChangeLogPeer::EXECUTED_AT => 10, AppDataChangeLogPeer::SOURCE_ID => 11, AppDataChangeLogPeer::DATA => 12, AppDataChangeLogPeer::SKIN => 13, AppDataChangeLogPeer::LANGUAGE => 14, AppDataChangeLogPeer::ROW_MIGRATION => 15, ), + BasePeer::TYPE_FIELDNAME => array ('CHANGE_LOG_ID' => 0, 'DATE' => 1, 'APP_NUMBER' => 2, 'DEL_INDEX' => 3, 'PRO_ID' => 4, 'TAS_ID' => 5, 'USR_ID' => 6, 'OBJECT_TYPE' => 7, 'OBJECT_ID' => 8, 'OBJECT_UID' => 9, 'EXECUTED_AT' => 10, 'SOURCE_ID' => 11, 'DATA' => 12, 'SKIN' => 13, 'LANGUAGE' => 14, 'ROW_MIGRATION' => 15, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, ) ); /** @@ -234,6 +237,8 @@ abstract class BaseAppDataChangeLogPeer $criteria->addSelectColumn(AppDataChangeLogPeer::LANGUAGE); + $criteria->addSelectColumn(AppDataChangeLogPeer::ROW_MIGRATION); + } const COUNT = 'COUNT(APP_DATA_CHANGE_LOG.CHANGE_LOG_ID)'; diff --git a/workflow/engine/config/schema.xml b/workflow/engine/config/schema.xml index b83c05482..94ba93a4b 100644 --- a/workflow/engine/config/schema.xml +++ b/workflow/engine/config/schema.xml @@ -5781,6 +5781,7 @@ + diff --git a/workflow/engine/data/mysql/insert.sql b/workflow/engine/data/mysql/insert.sql index cfceb08c0..25c18def4 100644 --- a/workflow/engine/data/mysql/insert.sql +++ b/workflow/engine/data/mysql/insert.sql @@ -61536,6 +61536,7 @@ INSERT INTO CONFIGURATION (CFG_UID,OBJ_UID,CFG_VALUE,PRO_UID,USR_UID,APP_UID) VA ('AUDIT_LOG','log','s:5:"false";','','',''), ('ENTERPRISE_SETTING_ENCRYPT','','a:2:{s:7:"current";s:6:"sha256";s:8:"previous";s:3:"md5";}','','',''), ('ENVIRONMENT_SETTINGS','','a:1:{s:18:"directoryStructure";i:2;}','','',''), +('MIGRATED_APP_HISTORY', 'history', 'a:1:{s:7:\"updated\";b:1;}', '', '', ''), ('MIGRATED_CONTENT','content','a:12:{i:0;s:7:"Groupwf";i:1;s:7:"Process";i:2;s:10:"Department";i:3;s:4:"Task";i:4;s:13:"InputDocument";i:5;s:11:"Application";i:6;s:11:"AppDocument";i:7;s:8:"Dynaform";i:8;s:14:"OutputDocument";i:9;s:11:"ReportTable";i:10;s:8:"Triggers";i:11;s:41:"\\ProcessMaker\\BusinessModel\\WebEntryEvent";}','','',''), ('MIGRATED_LIST','list','true','list','list','list'), ('MIGRATED_LIST_UNASSIGNED','list','true','list','list','list'), diff --git a/workflow/engine/data/mysql/schema.sql b/workflow/engine/data/mysql/schema.sql index 253471d9b..ef578628c 100644 --- a/workflow/engine/data/mysql/schema.sql +++ b/workflow/engine/data/mysql/schema.sql @@ -2303,7 +2303,7 @@ CREATE TABLE `ADDONS_MANAGER` `ADDON_NICK` VARCHAR(255) NOT NULL, `ADDON_DOWNLOAD_FILENAME` VARCHAR(1024), `ADDON_DESCRIPTION` VARCHAR(2048), - `ADDON_STATE` VARCHAR(255) NOT NULL DEFAULT '', + `ADDON_STATE` VARCHAR(255) default '' NOT NULL, `ADDON_STATE_CHANGED` DATETIME, `ADDON_STATUS` VARCHAR(255) NOT NULL, `ADDON_VERSION` VARCHAR(255) NOT NULL, @@ -3222,6 +3222,7 @@ CREATE TABLE `APP_DATA_CHANGE_LOG` `DATA` MEDIUMTEXT NOT NULL, `SKIN` VARCHAR(32) default '', `LANGUAGE` VARCHAR(32) default '', + `ROW_MIGRATION` INTEGER default 0, PRIMARY KEY (`CHANGE_LOG_ID`), KEY `indexAppNumber`(`APP_NUMBER`), KEY `indexDelIndex`(`DEL_INDEX`), diff --git a/workflow/engine/src/ProcessMaker/ChangeLog/ChangeLog.php b/workflow/engine/src/ProcessMaker/ChangeLog/ChangeLog.php index 2620a6c97..66ca7c50f 100644 --- a/workflow/engine/src/ProcessMaker/ChangeLog/ChangeLog.php +++ b/workflow/engine/src/ProcessMaker/ChangeLog/ChangeLog.php @@ -571,6 +571,7 @@ class ChangeLog $appDataChangeLog->setData($this->getData()); $appDataChangeLog->setSkin($this->getSkin()); $appDataChangeLog->setLanguage($this->getLanguage()); + $appDataChangeLog->setRowMigration(0); $appDataChangeLog->save(); return $this; }