浏览代码

added SchemaVersionUpgrade

Piotr Labudda 8 年之前
父节点
当前提交
74c7310e59
共有 1 个文件被更改,包括 334 次插入0 次删除
  1. 334 0
      SE/se-lib/SchemaVersionUpgrade.php

+ 334 - 0
SE/se-lib/SchemaVersionUpgrade.php

@@ -0,0 +1,334 @@
+<?php
+
+// CRM_CONFIG:
+// - Schema_SystemObjectFieldStorageAcl__version	3
+// - Schema_SystemObjectStorageAcl__version	2
+// - RefConfig__version	2
+
+// Instance - `CRM_INSTANCE_CONFIG`
+// Ref - `CRM_REF_CONFIG`
+// SystemObject - `CRM_#CACHE_ACL_OBJECT`
+// SystemObjectField - `CRM_#CACHE_ACL_OBJECT_FIELD`, `CRM_#CACHE_ACL_OBJECT_FIELD_enum`
+
+class SchemaVersionUpgrade {
+
+	static $REF_DB_SCHEMA_VERSION = 2;
+	static $SYSTEM_OBJECT_DB_SCHEMA_VERSION = 2;
+	static $SYSTEM_OBJECT_FIELD_DB_SCHEMA_VERSION = 2;
+
+	static function _getDBVersion() {
+		return (int)DB::getPDO()->fetchValue(" select `CONF_VAL` from `CRM_CONFIG` where `CONF_KEY` = 'SchemaVersionUpgrade__version' ");
+	}
+	static function _updateDBVersion($version) {
+		DB::getPDO()->execSql(" REPLACE INTO CRM_CONFIG (`CONF_KEY`,`CONF_VAL`) VALUES ('SchemaVersionUpgrade__version', '{$version}') ");
+	}
+	static function upgradeSchema() {
+		static $_DB_SCHEMA_VERSION = null;
+		if (!$_DB_SCHEMA_VERSION) DBG::log("DBG: SchemaVersionUpgrade: Brak VERSION w static");
+		if (!$_DB_SCHEMA_VERSION) $_DB_SCHEMA_VERSION = V::get('_DB_SCHEMA_VERSION', 0, $_SESSION, 'int');
+		if (!$_DB_SCHEMA_VERSION) DBG::log("DBG: SchemaVersionUpgrade: Brak VERSION w sesji");
+		if (!$_DB_SCHEMA_VERSION) $_DB_SCHEMA_VERSION = self::_getDBVersion();
+		if (!$_DB_SCHEMA_VERSION) DBG::log("DBG: SchemaVersionUpgrade: Brak VERSION w bazie danych");
+		if (!$_DB_SCHEMA_VERSION) {
+			self::_fixRefConfigDatabaseSchema();
+			self::_fixSystemObjectDatabaseSchema();
+			self::_fixSystemObjectFieldDatabaseSchema();
+			$_DB_SCHEMA_VERSION = 4;
+			$_SESSION['_DB_SCHEMA_VERSION'] = 4;
+			self::_updateDBVersion(4);
+		}
+		if ($_DB_SCHEMA_VERSION < 5) {
+			self::_upgradeFrom4To5();
+			$_DB_SCHEMA_VERSION = 5;
+			$_SESSION['_DB_SCHEMA_VERSION'] = 5;
+			self::_updateDBVersion(5);
+		}
+		// if ($_DB_SCHEMA_VERSION < 6) {
+		// 	self::_upgradeFrom5To6();
+		// 	$_DB_SCHEMA_VERSION = 6;
+		// 	$_SESSION['_DB_SCHEMA_VERSION'] = 6;
+		// 	self::_updateDBVersion(6);
+		// }
+		// if ($_DB_SCHEMA_VERSION < 7) {
+		// 	self::_upgradeFrom6To7();
+		// 	$_DB_SCHEMA_VERSION = 7;
+		// 	$_SESSION['_DB_SCHEMA_VERSION'] = 7;
+		// 	self::_updateDBVersion(7);
+		// }
+		// if ($_DB_SCHEMA_VERSION < 8) {
+		// 	self::_upgradeFrom7To8();
+		// 	$_DB_SCHEMA_VERSION = 8;
+		// 	$_SESSION['_DB_SCHEMA_VERSION'] = 8;
+		// 	self::_updateDBVersion(8);
+		// }
+	}
+
+	static function _getRefConfigDBVersion() {
+		return (int)DB::getPDO()->fetchValue(" select `CONF_VAL` from `CRM_CONFIG` where `CONF_KEY` = 'RefConfig__version' ");
+	}
+	static function _updateRefConfigDBVersion($version) {
+		DB::getPDO()->execSql(" REPLACE INTO CRM_CONFIG (`CONF_KEY`,`CONF_VAL`) VALUES ('RefConfig__version', '{$version}') ");
+	}
+	static function _fixRefConfigDatabaseSchema() {
+		static $_REF_DB_SCHEMA_VERSION;
+		DBG::log("_fixRefConfigDatabaseSchema \$_REF_DB_SCHEMA_VERSION({$_REF_DB_SCHEMA_VERSION})");
+		if (!$_REF_DB_SCHEMA_VERSION) {
+			$_REF_DB_SCHEMA_VERSION = self::_getRefConfigDBVersion();
+			if (2 === self::$REF_DB_SCHEMA_VERSION && $_REF_DB_SCHEMA_VERSION < self::$REF_DB_SCHEMA_VERSION) {
+				DB::getPDO()->execSql("
+					CREATE TABLE IF NOT EXISTS `CRM_REF_CONFIG` (
+						`ID` INT NOT NULL AUTO_INCREMENT
+						, `ROOT_OBJECT_NS` VARCHAR(255) NOT NULL
+						, `CHILD_NAME` VARCHAR(255) NOT NULL
+						, `CHILD_NS` VARCHAR(255) NOT NULL
+						, `A_STATUS` enum('WAITING', 'NORMAL', 'DELETED') NOT NULL DEFAULT 'WAITING'
+						, `VERSION` int(11) NOT NULL DEFAULT 0
+						, `A_LAST_ACTION_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
+						, `SOURCE` enum('table', 'view', 'backRef') NOT NULL DEFAULT 'table'
+						, PRIMARY KEY (`ID`)
+					) ENGINE = MyISAM DEFAULT CHARSET=latin2;
+				");
+
+				try { // upgrade from version 0.1
+					DB::getPDO()->execSql(" ALTER TABLE `CRM_REF_CONFIG` ADD `SOURCE` enum('table', 'view', 'backRef') not null default 'table' ");
+				} catch (Exception $e) {
+					DBG::log($e);
+				}
+				try { // upgrade from version 0.2
+					DB::getPDO()->execSql(" ALTER TABLE `CRM_REF_CONFIG` CHANGE `SOURCE` `SOURCE` enum('table', 'view', 'backRef') not null default 'table' ");
+				} catch (Exception $e) {
+					DBG::log($e);
+				}
+
+				DB::getPDO()->execSql("
+					update CRM_REF_CONFIG
+					set CHILD_NS = REPLACE(REPLACE(CHILD_NS, '__x3A__', '/'), ':', '/')
+					where CHILD_NS = CHILD_NAME
+				");
+				self::_updateRefConfigDBVersion(2);
+			}
+		}
+	}
+
+	static function _getSystemObjectDBVersion() {
+		return (int)DB::getPDO()->fetchValue(" select `CONF_VAL` from `CRM_CONFIG` where `CONF_KEY` = 'Schema_SystemObjectStorageAcl__version' ");
+	}
+	static function _updateSystemObjectDBVersion($version) {
+		DB::getPDO()->execSql(" REPLACE INTO CRM_CONFIG (`CONF_KEY`,`CONF_VAL`) VALUES ('Schema_SystemObjectStorageAcl__version', '{$version}') ");
+	}
+	static function _fixSystemObjectDatabaseSchema() {
+		$dbVersion = self::_getSystemObjectDBVersion();
+		if (!$dbVersion || $dbVersion < 2) { // version is 1 - upgrade to 2
+			DB::getPDO()->execSql("
+				create table if not exists `CRM_#CACHE_ACL_OBJECT` (
+					`idZasob` int(11) DEFAULT NULL,
+					`idDatabase` int(11) NOT NULL,
+					`namespace` varchar(255) DEFAULT '',
+					`_rootTableName` varchar(255) DEFAULT '',
+					`_type` varchar(255) DEFAULT '',
+					`hasStruct` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'has structure',
+					`isStructInstalled` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'has installed structure',
+					`isObjectActive` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'object is active',
+					`description` varchar(255) DEFAULT '',
+					`primaryKey` varchar(255) DEFAULT '',
+					`hasWriteGroupField` tinyint(1) NOT NULL DEFAULT 0,
+					`hasReadGroupField` tinyint(1) NOT NULL DEFAULT 0,
+					`hasOwnerField` tinyint(1) NOT NULL DEFAULT 0,
+					UNIQUE KEY `idZasob` (idZasob),
+					UNIQUE KEY `namespace` (namespace),
+					KEY `isObjectActive` (isObjectActive)
+				) ENGINE=MyISAM	DEFAULT CHARSET=latin2
+			");
+			try {
+				DB::getPDO()->execSql(" ALTER TABLE `CRM_#CACHE_ACL_OBJECT` ADD `primaryKey` VARCHAR(255) NOT NULL DEFAULT '' AFTER `description` ");
+			} catch (Exception $e) {
+				DBG::log($e);
+			}
+			try {
+				DB::getPDO()->execSql(" ALTER TABLE `CRM_#CACHE_ACL_OBJECT` ADD `hasWriteGroupField` tinyint(1) NOT NULL DEFAULT 0 ");
+			} catch (Exception $e) {
+				DBG::log($e);
+			}
+			try {
+				DB::getPDO()->execSql(" ALTER TABLE `CRM_#CACHE_ACL_OBJECT` ADD `hasReadGroupField` tinyint(1) NOT NULL DEFAULT 0 ");
+			} catch (Exception $e) {
+				DBG::log($e);
+			}
+			try {
+				DB::getPDO()->execSql(" ALTER TABLE `CRM_#CACHE_ACL_OBJECT` ADD `hasOwnerField` tinyint(1) NOT NULL DEFAULT 0 ");
+			} catch (Exception $e) {
+				DBG::log($e);
+			}
+
+			self::fixSystemObjectCoreTablesStructInstalled();
+
+			$dbVersion = 2; self::_updateSystemObjectDBVersion($dbVersion);
+		}
+
+		// self::$SYSTEM_OBJECT_DB_SCHEMA_VERSION
+
+		// if ($dbVersion < 3) {
+		//	// sql ...
+		// 	$dbVersion = 3; self::_updateSystemObjectDBVersion($dbVersion);
+		// }
+	}
+	static function fixSystemObjectCoreTablesStructInstalled() { // Fix hasWriteGroupField, hasReadGroupField, hasOwnerField
+		// TODO: mv to updateCache function - required after clear cache tables
+		DB::getPDO()->execSql("
+			CREATE TABLE IF NOT EXISTS `tmp_cache_acl_fields` (
+			  `table_name` varchar(64) NOT NULL DEFAULT '',
+			  `column_name` varchar(64) NOT NULL DEFAULT '',
+			  UNIQUE KEY `table_2` (`table_name`,`column_name`),
+			  KEY `table` (`table_name`)
+			) ENGINE=MyISAM DEFAULT CHARSET=latin2
+		");
+		DB::getPDO()->execSql("
+			CREATE TABLE IF NOT EXISTS `tmp_cache_acl_group_fields` (
+			  `table_name` varchar(64) NOT NULL DEFAULT '',
+			  `has_write` tinyint(1) NOT NULL DEFAULT 0,
+			  `has_read` tinyint(1) NOT NULL DEFAULT 0,
+			  `has_owner` tinyint(1) NOT NULL DEFAULT 0,
+			  UNIQUE KEY `table_name` (`table_name`)
+			) ENGINE=MyISAM DEFAULT CHARSET=latin2
+		");
+		DB::getPDO()->execSql(" TRUNCATE TABLE `tmp_cache_acl_fields` ");
+		DB::getPDO()->execSql(" TRUNCATE TABLE `tmp_cache_acl_group_fields` ");
+		DB::getPDO()->execSql("
+			insert into tmp_cache_acl_group_fields(table_name, has_write, has_read, has_owner)
+				select c.TABLE_NAME as table_name
+					, IF(c.COLUMN_NAME = 'A_ADM_COMPANY', 1, 0) as has_write
+					, IF(c.COLUMN_NAME = 'A_CLASSIFIED', 1, 0) as has_read
+					, IF(c.COLUMN_NAME = 'L_APPOITMENT_USER', 1, 0) as has_owner
+				from information_schema.COLUMNS c
+					where c.TABLE_SCHEMA = 'SES_USERS2'
+				  and c.COLUMN_NAME in ('A_ADM_COMPANY', 'A_CLASSIFIED', 'L_APPOITMENT_USER')
+				ON DUPLICATE KEY UPDATE
+					has_write = has_write + IF(c.COLUMN_NAME = 'A_ADM_COMPANY', 1, 0),
+					has_read = has_read + IF(c.COLUMN_NAME = 'A_CLASSIFIED', 1, 0),
+					has_owner = has_owner + IF(c.COLUMN_NAME = 'L_APPOITMENT_USER', 1, 0)
+		");
+
+		DB::getPDO()->execSql("
+			update `CRM_#CACHE_ACL_OBJECT` c
+				join `tmp_cache_acl_group_fields` t on (t.table_name = c._rootTableName)
+			set
+				c.hasWriteGroupField = t.has_write,
+				c.hasReadGroupField = t.has_read,
+				c.hasOwnerField = t.has_owner
+		");
+	}
+
+	static function _getSystemObjectFieldDBVersion() {
+		return (int)DB::getPDO()->fetchValue(" select `CONF_VAL` from `CRM_CONFIG` where `CONF_KEY` = 'Schema_SystemObjectFieldStorageAcl__version' ");
+	}
+	static function _updateSystemObjectFieldDBVersion($version) {
+		DB::getPDO()->execSql(" REPLACE INTO CRM_CONFIG (`CONF_KEY`,`CONF_VAL`) VALUES ('Schema_SystemObjectFieldStorageAcl__version', '{$version}') ");
+	}
+	static function _fixSystemObjectFieldDatabaseSchema() {
+		$version = self::_getSystemObjectFieldDBVersion();
+		if ($version < 2) {
+			DBG::log("UPDATE Schema_SystemObjectFieldStorageAcl__version");
+			DB::getPDO()->execSql("
+				create table if not exists `CRM_#CACHE_ACL_OBJECT_FIELD` (
+					`namespace` varchar(255) DEFAULT '',
+					`fieldNamespace` varchar(255) DEFAULT '',
+					`idZasob` int(11) DEFAULT NULL,
+					`idDatabase` int(11) NOT NULL,
+					`_rootTableName` varchar(255) DEFAULT '',
+					`objectNamespace` varchar(255) DEFAULT '',
+					`xsdType` varchar(255) DEFAULT '',
+					`xsdRestrictions` varchar(1000) DEFAULT '',
+					`appInfo` varchar(1000) DEFAULT '',
+					`minOccurs` int(11) DEFAULT '0',
+					`maxOccurs` varchar(11) DEFAULT '1' COMMENT '0..unbounded',
+					`isActive` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'installed',
+					`description` varchar(255) DEFAULT '',
+					`isLocal` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'is in _rootTableName',
+					`sortPrio` int(11) NOT NULL DEFAULT 0,
+					UNIQUE KEY `idZasob` (idZasob),
+					PRIMARY KEY (`namespace`),
+					KEY `isActive` (isActive)
+				) ENGINE=MyISAM DEFAULT CHARSET=latin2
+			");
+			try {
+				DB::getPDO()->execSql(" ALTER TABLE `CRM_#CACHE_ACL_OBJECT_FIELD` ADD `appInfo` VARCHAR(1000) NOT NULL DEFAULT '' AFTER `xsdRestrictions` ");
+			} catch (Exception $e) {
+				DBG::log($e);
+			}
+			try {
+				DB::getPDO()->execSql(" ALTER TABLE `CRM_#CACHE_ACL_OBJECT_FIELD` ADD `isLocal` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'is in _rootTableName' AFTER `description` ");
+			} catch (Exception $e) {
+				DBG::log($e);
+			}
+			try {
+				DB::getPDO()->execSql(" ALTER TABLE `CRM_#CACHE_ACL_OBJECT_FIELD` ADD `sortPrio` int(11) NOT NULL DEFAULT 0 AFTER `isLocal` ");
+				DB::getPDO()->execSql("
+					UPDATE `CRM_#CACHE_ACL_OBJECT_FIELD`
+					SET sortPrio = idZasob
+					WHERE idZasob > 0
+				");
+				DB::getPDO()->execSql("
+					UPDATE `CRM_#CACHE_ACL_OBJECT_FIELD` c
+						LEFT JOIN `CRM_LISTA_ZASOBOW` z on ( z.ID = c.idZasob )
+					SET c.sortPrio = z.SORT_PRIO
+					WHERE c.idZasob > 0
+						and z.ID is not null
+				");
+			} catch (Exception $e) {
+				DBG::log($e);
+			}
+			DB::getPDO()->execSql("
+				create table if not exists `CRM_#CACHE_ACL_OBJECT_FIELD_enum` (
+					`namespace` varchar(255) DEFAULT '' COMMENT 'concat obj ns / field ns / value',
+					`fieldNamespace` varchar(255) DEFAULT '',
+					`objectNamespace` varchar(255) DEFAULT '',
+					`value` varchar(255) DEFAULT '',
+					`label` varchar(255) DEFAULT '',
+					`isActive` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'installed',
+					`sortPrio` tinyint NOT NULL DEFAULT 0,
+					KEY `objectNamespace` (`objectNamespace`),
+					KEY `fieldNamespace` (`fieldNamespace`),
+					KEY `isActive` (isActive),
+					UNIQUE `enum_uniq_value` (`objectNamespace`, `fieldNamespace`, `value`, `isActive`)
+				) ENGINE=MyISAM DEFAULT CHARSET=latin2
+			");
+			try {
+				DB::getPDO()->execSql(" DELETE from `CRM_#CACHE_ACL_OBJECT_FIELD_enum` where isActive = 0 ");
+				DB::getPDO()->execSql(" ALTER TABLE `CRM_#CACHE_ACL_OBJECT_FIELD_enum` ADD UNIQUE `enum_uniq_value` (`objectNamespace`, `fieldNamespace`, `value`, `isActive`) ");
+			} catch (Exception $e) {
+				DBG::log($e);
+			}
+			try {
+				DB::getPDO()->execSql(" ALTER TABLE `CRM_#CACHE_ACL_OBJECT_FIELD_enum` ADD `sortPrio` tinyint NOT NULL DEFAULT 0 ");
+			} catch (Exception $e) {
+				DBG::log($e);
+			}
+			self::_updateSystemObjectFieldDBVersion(self::$SYSTEM_OBJECT_FIELD_DB_SCHEMA_VERSION);
+		}
+
+		// if ($version < $SYSTEM_OBJECT_FIELD_DB_SCHEMA_VERSION) {
+		//
+		// }
+	}
+
+	static function _upgradeFrom4To5() {
+		try {
+			DB::getPDO()->execSql(" ALTER TABLE `CRM_INSTANCE_CONFIG` ADD `SOURCE` enum('table', 'view') not null default 'table' ");
+		} catch (Exception $e) {
+			DBG::log($e);
+		}
+		try {
+			DB::getPDO()->execSql(" ALTER TABLE `CRM_INSTANCE_CONFIG` ADD `VERSION` int(11) not null default 0 ");
+		} catch (Exception $e) {
+			DBG::log($e);
+		}
+	}
+
+	// static function _upgradeFrom5To6() {
+	// }
+	// static function _upgradeFrom6To7() {
+	// }
+	// static function _upgradeFrom7To8() {
+	// }
+
+}