浏览代码

use SchemaVersionUpgrade

Piotr Labudda 8 年之前
父节点
当前提交
8498d8d873

+ 24 - 53
SE/se-lib/ACL.php

@@ -292,9 +292,12 @@ class ACL {
 		$appInfo = DB::getPDO()->fetchValue("
 			select f.appInfo
 			from `CRM_#CACHE_ACL_OBJECT_FIELD` f
-			where f.objectNamespace = '{$rootObjectNamespace}'
-				and f.fieldNamespace = '{$childName}'
-		");
+			where f.objectNamespace = :objectNamespace
+				and f.fieldNamespace = :fieldNamespace
+		", [
+			':objectNamespace' => $rootObjectNamespace,
+			':fieldNamespace' => $childName,
+		]);
 		if (!$appInfo) throw new Exception("Missing app:info for field '{$rootObjectNamespace}/{$childName}'");
 		$appInfo = ACL::decodeAppInfoJson($appInfo);
 		if (empty($appInfo)) throw new Exception("Empty app:info for field '{$rootObjectNamespace}/{$childName}'");
@@ -462,68 +465,36 @@ class ACL {
 		throw new Exception("TODO: fetch back refs from '{$namespace}' where primaryKey({$primaryKey}) by refTable({$refTable})");
 	}
 
-	public static function generateIsInstanceFunctionBody($namespace, $item = null) {
-		if (!$item) $item = SchemaFactory::loadDefaultObject('SystemObject')->getItem($namespace, [ 'propertyName' => '*,field' ]);
-		if (!in_array( $item['_type'], [ 'AntAcl' ] )) return null;
-		$sqlFunBody = " RETURN 1; ";
-		$localFieldsWithRestrictions = array_filter($item['field'], function ($field) {
-			if (!$field['isLocal']) return false;
-			if (empty($field['xsdRestrictions'])) return false;
-			if ('[]' == $field['xsdRestrictions']) return false;
-			return true;
-		});
-		// TODO: get fields with minOccurs > 1 (may require select by ref)
-		$sqlTablePrefix = 'root';
-		$sqlWhereFromRestrictions = (!empty($localFieldsWithRestrictions))
-		?	array_reduce(
-				array_map(function ($field) use ($sqlTablePrefix) {
-					$sqlRestrictions = [];
-					// 'xsdRestrictions' => '{"enumeration":{"PROCES":"PROCES"}}',
-					$restrictions = @json_decode($field['xsdRestrictions'], $assoc = true);
-					if (!empty($restrictions)) {
-						if (!empty($restrictions['enumeration'])) {
-							$sqlRestrictions[] = "{$sqlTablePrefix}.`{$field['fieldNamespace']}` in (" . implode(",", array_map([DB::getPDO(), 'quote'], array_keys($restrictions['enumeration']))) . ")";
-						}
-					}
-					return $sqlRestrictions;
-				}, $localFieldsWithRestrictions),
-				function ($ret, $cur) {
-					return array_merge($ret, array_filter($cur, ['V', 'filterNotEmpty']));
-				},
-				[]
-			)
-		:	'';
-		DBG::nicePrint($localFieldsWithRestrictions, "\$localFieldsWithRestrictions");
-		DBG::nicePrint($sqlWhereFromRestrictions, "\$sqlWhereFromRestrictions");
-		$sqlWhereFromRestrictions = (!empty($sqlWhereFromRestrictions)) ? implode(" and ", $sqlWhereFromRestrictions) : "1=1";
-		$pkField = 'ID'; // TODO: primaryKeyField into SystemObject structure
-		$rootTableName = $item['_rootTableName'];
-		$sqlFunBody = (!empty($sqlWhereFromRestrictions))
-		?	" RETURN IF(
-				(select count(1) as cnt from `{$rootTableName}` root where root.`{$pkField}` = pk and {$sqlWhereFromRestrictions}) > 0
-				, 1, 0)
-			"
-		:	" RETURN 1; ";
-		return $sqlFunBody;
+	static function generateSqlWhereFromFieldsWithRestrictions($fieldsRestrictions, $sqlTablePrefix = 't') {
+		return InstanceConfig::generateSqlWhereFromFieldsWithRestrictions($fieldsRestrictions, $sqlTablePrefix);
+	}
+	static function generateSqlWhereFromFieldRestrictions($fields, $sqlTablePrefix = 't') {
+		return InstanceConfig::generateSqlWhereFromFieldRestrictions($fields, $sqlTablePrefix);
+	}
+	static function generateIsInstanceFunctionBody($namespace, $item = null) {
+		return InstanceConfig::generateIsInstanceFunctionBody($namespace, $item);
+	}
+	static function generateIsInstanceView($namespace, $item = null) {
+		return InstanceConfig::generateIsInstanceView($namespace, $item);
 	}
 
-	public static function getInstanceId($namespace) {
-		return InstanceConfig::getInstanceConfig($namespace)['id'];
+	static function getInstanceId($namespace) {
+		return InstanceConfig::getInstanceId($namespace);
 	}
-	public static function getInstanceConfig($namespace) { // @returns { id, namespace, rootNamespace, idInstanceBase, _createdAt }
+	static function getInstanceConfig($namespace) { // @returns { id, namespace, rootNamespace, idInstanceBase, _createdAt }
 		return InstanceConfig::getInstanceConfig($namespace);
 	}
-	public static function getInstanceTable($namespace) { // @returns tableName with struct { pk, idInstance, _createdAt }
+	static function getInstanceTable($namespace) { // @returns tableName with struct { pk, idInstance, _createdAt }
 		return InstanceConfig::getInstanceTable($namespace);
 	}
 
-	public static function getRootNamespace($namespace) { // TODO: works only for relative urls! - mv to Acl->getRootNamespace
+	static function getRootNamespace($namespace) { // TODO: works only for relative urls! - mv to Acl->getRootNamespace
 		return InstanceConfig::getRootNamespace($namespace);
 	}
-	public static function getNamespaceSiblings($namespace) {
+	static function getNamespaceSiblings($namespace) {
 		return InstanceConfig::getNamespaceSiblings($namespace);
 	}
-	public static function getFeatureNamespaces($namespace, $pk) {
+	static function getFeatureNamespaces($namespace, $pk) {
 		return InstanceConfig::getFeatureNamespaces($namespace, $pk);
 	}
 

+ 111 - 0
SE/se-lib/InstanceConfig.php

@@ -1,5 +1,7 @@
 <?php
 
+Lib::loadClass('SchemaVersionUpgrade');
+
 class InstanceConfig {
 
 	static function createInstanceConfigTable() {
@@ -48,7 +50,12 @@ class InstanceConfig {
 		return $instanceTableName;
 	}
 
+	static function getInstanceId($namespace) {
+		return self::getInstanceConfig($namespace)['id'];
+	}
+
 	static function getInstanceConfig($namespace) { // @returns { id, namespace, rootNamespace, idInstanceBase, _createdAt }
+		SchemaVersionUpgrade::upgradeSchema();
 		try {
 			$conf = self::fetchInstanceConfig($namespace);
 		} catch (Exception $e) {
@@ -127,4 +134,108 @@ class InstanceConfig {
 		]));
 	}
 
+	static function generateSqlWhereFromFieldsWithRestrictions($fieldsRestrictions, $sqlTablePrefix = 't') { // @param $fieldsRestrictions Array [ fieldName => xsdRestrictions | Null ]
+		// TODO: add @param $acl to check if field is local, and if not then generate remote query (join)
+		if (empty($fieldsRestrictions)) return '';
+		$fieldsWithRestrictions = array_filter($fieldsRestrictions, ['V', 'filterNotEmpty']);
+		if (empty($fieldsWithRestrictions)) return '';
+
+		return array_reduce(
+			array_map(function ($fieldName, $xsdRestriction) use ($sqlTablePrefix) {
+				$sqlRestrictions = [];
+				if (false !== strpos($fieldName, ':')) return $sqlRestrictions; // SKIP ref fields - TODO: generate remote query, require $acl
+				if (!empty($xsdRestriction)) {
+					if (!empty($xsdRestriction['enumeration'])) {
+						$sqlRestrictions[] = "{$sqlTablePrefix}.`{$fieldName}` in (" . implode(",", array_map([DB::getPDO(), 'quote'], array_keys($xsdRestriction['enumeration']))) . ")";
+					}
+				}
+				return $sqlRestrictions;
+			}, array_keys($fieldsWithRestrictions), array_values($fieldsWithRestrictions)),
+			function ($ret, $cur) {
+				return array_merge($ret, array_filter($cur, ['V', 'filterNotEmpty']));
+			},
+			[]
+		);
+	}
+
+	static function generateSqlWhereFromFieldRestrictions($fields, $sqlTablePrefix = 't') {
+		return (!empty($fields))
+			?	array_reduce(
+					array_map(function ($field) use ($sqlTablePrefix) {
+						$sqlRestrictions = [];
+						// 'xsdRestrictions' => '{"enumeration":{"PROCES":"PROCES"}}',
+						$restrictions = @json_decode($field['xsdRestrictions'], $assoc = true);
+						if (!empty($restrictions)) {
+							if (!empty($restrictions['enumeration'])) {
+								$sqlRestrictions[] = "{$sqlTablePrefix}.`{$field['fieldNamespace']}` in (" . implode(",", array_map([DB::getPDO(), 'quote'], array_keys($restrictions['enumeration']))) . ")";
+							}
+						}
+						return $sqlRestrictions;
+					}, $fields),
+					function ($ret, $cur) {
+						return array_merge($ret, array_filter($cur, ['V', 'filterNotEmpty']));
+					},
+					[]
+				)
+			:	''
+		;
+	}
+
+	static function generateIsInstanceFunctionBody($namespace, $item = null) {
+		if (!$item) $item = SchemaFactory::loadDefaultObject('SystemObject')->getItem($namespace, [ 'propertyName' => '*,field' ]);
+		if (!in_array( $item['_type'], [ 'AntAcl' ] )) return null;
+		$localFieldsWithRestrictions = array_filter($item['field'], function ($field) {
+			if (!$field['isLocal']) return false;
+			if (empty($field['xsdRestrictions'])) return false;
+			if ('[]' == $field['xsdRestrictions']) return false;
+			return true;
+		});
+		// TODO: get fields with minOccurs > 1 (may require select by ref)
+		$sqlTablePrefix = 'root';
+		DBG::nicePrint($localFieldsWithRestrictions, "\$localFieldsWithRestrictions");
+		$sqlWhereFromRestrictions = ACL::generateSqlWhereFromFieldRestrictions($localFieldsWithRestrictions, $sqlTablePrefix);
+		DBG::nicePrint($sqlWhereFromRestrictions, "\$sqlWhereFromRestrictions");
+		$sqlWhereFromRestrictions = (!empty($sqlWhereFromRestrictions)) ? implode(" and ", $sqlWhereFromRestrictions) : "1=1";
+		$pkField = 'ID'; // TODO: primaryKeyField into SystemObject structure
+		$rootTableName = $item['_rootTableName'];
+		$sqlFunBody = ("1=1" !== $sqlWhereFromRestrictions)
+		?	" RETURN IF(
+				(select count(1) as cnt from `{$rootTableName}` root where root.`{$pkField}` = pk and {$sqlWhereFromRestrictions}) > 0
+				, 1, 0)
+			"
+		:	" RETURN 1; ";
+		return $sqlFunBody;
+	}
+
+	static function generateIsInstanceView($namespace, $item = null) {
+		if (!$item) $item = SchemaFactory::loadDefaultObject('SystemObject')->getItem($namespace, [ 'propertyName' => '*,field' ]);
+		if (!in_array( $item['_type'], [ 'AntAcl' ] )) return null;
+		$idInstance = self::getInstanceId($namespace);
+
+		$localFieldsWithRestrictions = array_filter($item['field'], function ($field) {
+			if (!$field['isLocal']) return false;
+			if (empty($field['xsdRestrictions'])) return false;
+			if ('[]' == $field['xsdRestrictions']) return false;
+			return true;
+		});
+		// TODO: get fields with minOccurs > 1 (may require select by ref)
+
+		$fieldsWithRestrictions = array_reduce($localFieldsWithRestrictions, function ($ret, $field) {
+			$fieldName = $field['fieldNamespace'];
+			$restrictions = @json_decode($field['xsdRestrictions'], $assoc = true);
+			$ret[$fieldName] = (!empty($restrictions)) ? $restrictions : null;
+			return $ret;
+		}, []);
+		$sqlTablePrefix = "instance_{$idInstance}";
+		$sqlListWhere = self::generateSqlWhereFromFieldsWithRestrictions($fieldsWithRestrictions, $sqlTablePrefix);
+		$sqlWhere = (!empty($sqlListWhere)) ? implode("\n\t  and ", $sqlListWhere) : "1=1";
+		$rootTableName = $item['_rootTableName'];
+		$primaryKey = 'ID'; // TODO: primaryKeyField into SystemObject structure // TODO: is in struct, read from `primaryKey`? field
+		return implode("\n\t", [
+			"select {$primaryKey}",
+			"from `{$rootTableName}` `{$sqlTablePrefix}`",
+			"where {$sqlWhere}",
+		]);
+	}
+
 }

+ 2 - 49
SE/se-lib/RefConfig.php

@@ -4,6 +4,7 @@ Lib::loadClass('Type_Field');
 Lib::loadClass('Type_RefConfig');
 Lib::loadClass('Api_WfsNs');
 Lib::loadClass('ACL');
+Lib::loadClass('SchemaVersionUpgrade');
 
 /*
 	RefStorage - for ref data manipulation
@@ -32,63 +33,15 @@ Lib::loadClass('ACL');
 class RefConfig {
 
 	static $REF_TABLE_VERSION = 2;
-	static $REF_DB_SCHEMA_VERSION = 2;
 
 	static function isActive($objectNamespace, $childTypeName) {
 		$refInfo = self::fetch($objectNamespace, $childTypeName);
 		return ('NORMAL' === $refInfo->status);
 	}
 
-	static function _getDBVersion() {
-		return (int)DB::getPDO()->fetchValue(" select `CONF_VAL` from `CRM_CONFIG` where `CONF_KEY` = 'RefConfig__version' ");
-	}
-	static function _updateDBVersion($version) {
-		DB::getPDO()->execSql(" REPLACE INTO CRM_CONFIG (`CONF_KEY`,`CONF_VAL`) VALUES ('RefConfig__version', '{$version}') ");
-	}
-	static function _fixDatabaseSchema() {
-		static $_REF_DB_SCHEMA_VERSION;
-		DBG::log("_fixDatabaseSchema \$_REF_DB_SCHEMA_VERSION({$_REF_DB_SCHEMA_VERSION})");
-		if (!$_REF_DB_SCHEMA_VERSION) {
-			$_REF_DB_SCHEMA_VERSION = self::_getDBVersion();
-			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::_updateDBVersion(2);
-			}
-		}
-	}
-
 	/** static function fetch(Type_Namespace $rootObjectNamespace, Type_TypeName $childName, Type_Namespace $childNamespace = null): Type_RefConfig */
 	static function fetch($rootObjectNamespace, $childName, $childNamespace = null) { // @returns Type_RefConfig
-		self::_fixDatabaseSchema();
+		SchemaVersionUpgrade::upgradeSchema();
 
 		$rootObjectNamespace = ACL::getBaseNamespace($rootObjectNamespace);
 		if (!$childNamespace && false !== strpos($childName, '__x3A__') && false !== strpos($childName, ':')) $childNamespace = Api_WfsNs::namespaceFromTypeName($childName);

+ 11 - 15
SE/se-lib/Route/Storage/AclReinstall.php

@@ -342,24 +342,20 @@ class Route_Storage_AclReinstall extends RouteBase {
 			}
 		}
 
-		{
+		{ // TODO: RMME? function is too slow for join query
 			if ('AntAcl' === $item['_type']) {
-				$dbName = DB::getPDO()->getDatabaseName();
-				$sqlFunBody = ACL::generateIsInstanceFunctionBody($namespace, $item);
-				DBG::nicePrint($sqlFunBody, "\$sqlFunBody");
 				$idInstance = ACL::getInstanceId($namespace);
 				DB::getPDO()->execSql(" DROP FUNCTION IF EXISTS `{$dbName}`.`isInstance_{$idInstance}` ");
-				// CREATE
-				//     [DEFINER = { user | CURRENT_USER }]
-				//     FUNCTION sp_name ([func_parameter[,...]])
-				//     RETURNS type
-				//     [characteristic ...] routine_body
-				DB::getPDO()->execSql("
-					CREATE DEFINER=`root`@`localhost`
-					FUNCTION `{$dbName}`.`isInstance_{$idInstance}` ( pk INT(11) )
-					RETURNS TINYINT(1)
-					{$sqlFunBody}
-				");
+			}
+		}
+		{ // TODO: mv to updateCache
+			if ('AntAcl' === $item['_type']) {
+				$idInstance = ACL::getInstanceId($namespace);
+				$dbName = DB::getPDO()->getDatabaseName();
+				$sqlIsInstanceView = ACL::generateIsInstanceView($namespace, $item); // TODO: generate instance view for every object (namespace)
+				DBG::nicePrint($sqlIsInstanceView, "\$sqlIsInstanceView idInstance({$idInstance})");
+				DB::getPDO()->execSql(" DROP VIEW IF EXISTS `{$dbName}`.`CRM__#INSTANCE_TABLE__{$idInstance}_VIEW` ");
+				DB::getPDO()->execSql(" CREATE VIEW `{$dbName}`.`CRM__#INSTANCE_TABLE__{$idInstance}_VIEW` AS {$sqlIsInstanceView} ");
 			}
 		}
 	}

+ 2 - 80
SE/se-lib/Schema/SystemObjectFieldStorageAcl.php

@@ -3,6 +3,7 @@
 Lib::loadClass('Core_AclSimpleSchemaBase');
 Lib::loadClass('ParseOgcFilter');
 Lib::loadClass('Router');
+Lib::loadClass('SchemaVersionUpgrade');
 
 class Schema_SystemObjectFieldStorageAcl extends Core_AclSimpleSchemaBase {
 
@@ -38,86 +39,7 @@ class Schema_SystemObjectFieldStorageAcl extends Core_AclSimpleSchemaBase {
 
 	public function __construct($simpleSchema = null) {
 		parent::__construct($simpleSchema);
-		$version = (int)DB::getPDO()->fetchValue(" select CONF_VAL from CRM_CONFIG where CONF_KEY='Schema_SystemObjectFieldStorageAcl__version' ");
-		if ($version < $this->_version) {
-			DBG::log("UPDATE Schema_SystemObjectFieldStorageAcl__version");
-			DB::getPDO()->execSql("
-				create table if not exists `{$this->_rootTableName}` (
-					`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 `{$this->_rootTableName}` ADD `appInfo` VARCHAR(1000) NOT NULL DEFAULT '' AFTER `xsdRestrictions` ");
-			} catch (Exception $e) {
-				DBG::log($e);
-			}
-			try {
-				DB::getPDO()->execSql(" ALTER TABLE `{$this->_rootTableName}` 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 `{$this->_rootTableName}` ADD `sortPrio` int(11) NOT NULL DEFAULT 0 AFTER `isLocal` ");
-				DB::getPDO()->execSql("
-					UPDATE `{$this->_rootTableName}`
-					SET sortPrio = idZasob
-					WHERE idZasob > 0
-				");
-				DB::getPDO()->execSql("
-					UPDATE `{$this->_rootTableName}` 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 `{$this->_enumRootTableName}` (
-					`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 `{$this->_enumRootTableName}` where isActive = 0 ");
-				DB::getPDO()->execSql(" ALTER TABLE `{$this->_enumRootTableName}` ADD UNIQUE `enum_uniq_value` (`objectNamespace`, `fieldNamespace`, `value`, `isActive`) ");
-			} catch (Exception $e) {
-				DBG::log($e);
-			}
-			try {
-				DB::getPDO()->execSql(" ALTER TABLE `{$this->_enumRootTableName}` ADD `sortPrio` tinyint NOT NULL DEFAULT 0 ");
-			} catch (Exception $e) {
-				DBG::log($e);
-			}
-			DB::getPDO()->execSql(" REPLACE INTO CRM_CONFIG (`CONF_KEY`,`CONF_VAL`) VALUES ('Schema_SystemObjectFieldStorageAcl__version', '{$this->_version}') ");
-		}
+		SchemaVersionUpgrade::upgradeSchema();
 	}
 
 	public static function getAntAclXsdBasePath($typeName) {

+ 3 - 110
SE/se-lib/Schema/SystemObjectStorageAcl.php

@@ -3,6 +3,7 @@
 Lib::loadClass('Core_AclSimpleSchemaBase');
 Lib::loadClass('ParseOgcFilter');
 Lib::loadClass('Router');
+Lib::loadClass('SchemaVersionUpgrade');
 
 class Schema_SystemObjectStorageAcl extends Core_AclSimpleSchemaBase {
 
@@ -32,69 +33,10 @@ class Schema_SystemObjectStorageAcl extends Core_AclSimpleSchemaBase {
 	];
 	// public $_rootTableName = 'CRM_LISTA_ZASOBOW';
 	public $_rootTableName = 'CRM_#CACHE_ACL_OBJECT';
-	public $_version = '2';
 
 	public function __construct($simpleSchema = null) {
 		parent::__construct($simpleSchema);
-
-		$dbVersion = $this->getDBVersion();
-		if (!$dbVersion || $dbVersion < 2) { // version is 1 - upgrade to 2
-			DB::getPDO()->execSql("
-				create table if not exists `{$this->_rootTableName}` (
-					`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 `{$this->_rootTableName}` ADD `primaryKey` VARCHAR(255) NOT NULL DEFAULT '' AFTER `description` ");
-			} catch (Exception $e) {
-				DBG::log($e);
-			}
-			try {
-				DB::getPDO()->execSql(" ALTER TABLE `{$this->_rootTableName}` ADD `hasWriteGroupField` tinyint(1) NOT NULL DEFAULT 0 ");
-			} catch (Exception $e) {
-				DBG::log($e);
-			}
-			try {
-				DB::getPDO()->execSql(" ALTER TABLE `{$this->_rootTableName}` ADD `hasReadGroupField` tinyint(1) NOT NULL DEFAULT 0 ");
-			} catch (Exception $e) {
-				DBG::log($e);
-			}
-			try {
-				DB::getPDO()->execSql(" ALTER TABLE `{$this->_rootTableName}` ADD `hasOwnerField` tinyint(1) NOT NULL DEFAULT 0 ");
-			} catch (Exception $e) {
-				DBG::log($e);
-			}
-
-			$this->_fixCoreTablesStructInstalled();
-
-			$dbVersion = 2; $this->updateDBVersion($dbVersion);
-		}
-
-		// if ($dbVersion < 3) {
-		//	// sql ...
-		// 	$dbVersion = 3; $this->updateDBVersion($dbVersion);
-		// }
-	}
-	function getDBVersion() {
-		return (int)DB::getPDO()->fetchValue(" select `CONF_VAL` from `CRM_CONFIG` where `CONF_KEY` = 'Schema_SystemObjectStorageAcl__version' ");
-	}
-	function updateDBVersion($version) {
-		DB::getPDO()->execSql(" REPLACE INTO CRM_CONFIG (`CONF_KEY`,`CONF_VAL`) VALUES ('Schema_SystemObjectStorageAcl__version', '{$version}') ");
+		SchemaVersionUpgrade::upgradeSchema();
 	}
 
 	public function updateCache($idDatabase = null) {
@@ -348,56 +290,7 @@ class Schema_SystemObjectStorageAcl extends Core_AclSimpleSchemaBase {
 		//	 }
 		// }
 
-		$this->_fixCoreTablesStructInstalled();
-	}
-
-	function _fixCoreTablesStructInstalled() { // Fix hasWriteGroupField, hasReadGroupField, hasOwnerField
-		// TODO: mv to updateCache function - required after clear cache tables
-		// public function hasWriteGroupField() { // return $this->hasField('A_ADM_COMPANY');
-		// public function hasReadGroupField() { // return $this->hasField('A_CLASSIFIED');
-		// public function hasOwnerField() { // return $this->hasField('L_APPOITMENT_USER');
-		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
-		");
+		SchemaVersionUpgrade::fixSystemObjectCoreTablesStructInstalled();
 	}
 
 	public function _parseWhere($params = []) {