Browse Source

fixed RefConfig child_ns value, update schema version

Piotr Labudda 8 years ago
parent
commit
e0ab97c371
1 changed files with 69 additions and 52 deletions
  1. 69 52
      SE/se-lib/RefConfig.php

+ 69 - 52
SE/se-lib/RefConfig.php

@@ -32,20 +32,71 @@ Lib::loadClass('ACL');
 class RefConfig {
 class RefConfig {
 
 
 	static $REF_TABLE_VERSION = 2;
 	static $REF_TABLE_VERSION = 2;
+	static $REF_DB_SCHEMA_VERSION = 2;
 
 
 	static function isActive($objectNamespace, $childTypeName) {
 	static function isActive($objectNamespace, $childTypeName) {
 		$refInfo = self::fetch($objectNamespace, $childTypeName);
 		$refInfo = self::fetch($objectNamespace, $childTypeName);
 		return ('NORMAL' === $refInfo->status);
 		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(Type_Namespace $rootObjectNamespace, Type_TypeName $childName, Type_Namespace $childNamespace = null): Type_RefConfig */
 	static function fetch($rootObjectNamespace, $childName, $childNamespace = null) { // @returns Type_RefConfig
 	static function fetch($rootObjectNamespace, $childName, $childNamespace = null) { // @returns Type_RefConfig
-		if (!$childTypeName) $childTypeName = Api_WfsNs::namespaceFromTypeName($fieldName);
+		self::_fixDatabaseSchema();
+
 		$rootObjectNamespace = ACL::getBaseNamespace($rootObjectNamespace);
 		$rootObjectNamespace = ACL::getBaseNamespace($rootObjectNamespace);
+		if (!$childNamespace && false !== strpos($childName, '__x3A__') && false !== strpos($childName, ':')) $childNamespace = Api_WfsNs::namespaceFromTypeName($childName);
 		if (!$childNamespace) {
 		if (!$childNamespace) {
 			$rootAcl = ACL::getAclByNamespace($rootObjectNamespace);
 			$rootAcl = ACL::getAclByNamespace($rootObjectNamespace);
 			$childXsdType = $rootAcl->getXsdFieldType($childName);
 			$childXsdType = $rootAcl->getXsdFieldType($childName);
-			list($typePrefix, $childNamespace) = explode(':', $childXsdType, 2);
+			list($typePrefix, $childTypeName) = explode(':', $childXsdType, 2);
+			$childNamespace = Api_WfsNs::namespaceFromTypeName($childTypeName);
 			DBG::log(['$childXsdType' => $childXsdType, '$typePrefix' => $typePrefix, '$childNamespace' => $childNamespace], 'array', "DBG get ref table ...");
 			DBG::log(['$childXsdType' => $childXsdType, '$typePrefix' => $typePrefix, '$childNamespace' => $childNamespace], 'array', "DBG get ref table ...");
 			switch ($typePrefix) {
 			switch ($typePrefix) {
 				case 'ref_uri': $childAcl = ACL::getAclByNamespace($childNamespace); break;
 				case 'ref_uri': $childAcl = ACL::getAclByNamespace($childNamespace); break;
@@ -53,44 +104,23 @@ class RefConfig {
 				default: throw new Exception("Expected ref type for field '{$childName}' in object '{$rootObjectNamespace}'");
 				default: throw new Exception("Expected ref type for field '{$childName}' in object '{$rootObjectNamespace}'");
 			}
 			}
 		}
 		}
-		$refInfo = [];// define $refInfo = [ ID, A_STATUS, VERSION ]
-		try {// check that ref config table exists
-			$sqlRootTableNs = DB::getPDO()->quote($rootObjectNamespace, PDO::PARAM_STR);
-			$sqlChildName = DB::getPDO()->quote($childName, PDO::PARAM_STR);
-			$sqlChildNamespace = DB::getPDO()->quote($childNamespace, PDO::PARAM_STR);
-			$refInfo = DB::getPDO()->fetchFirst("
-				select c.ID, c.A_STATUS, c.VERSION, c.SOURCE
-				from `CRM_REF_CONFIG` c
-				where c.ROOT_OBJECT_NS = {$sqlRootTableNs}
-					and c.CHILD_NAME = {$sqlChildName}
-					and c.CHILD_NS = {$sqlChildNamespace}
-			");
-		} catch (Exception $e) {
-			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
-					, PRIMARY KEY (`ID`)
-				) ENGINE = MyISAM DEFAULT CHARSET=latin2;
-			");
-			try {
-				DB::getPDO()->execSql(" ALTER TABLE `CRM_REF_CONFIG` ADD `SOURCE` enum('table', 'view') not null default 'table' ");
-			} catch (Exception $e) {
-				DBG::log($e);
-			}
-		}
-		try {
-			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);
-		}
+		$refInfo = DB::getPDO()->fetchFirst("
+			select c.ID, c.A_STATUS, c.VERSION, c.SOURCE
+			from `CRM_REF_CONFIG` c
+			where c.ROOT_OBJECT_NS = :ROOT_OBJECT_NS
+				and c.CHILD_NAME = :CHILD_NAME
+				and c.CHILD_NS = :CHILD_NS
+		", [
+			':ROOT_OBJECT_NS' => $rootObjectNamespace,
+			':CHILD_NAME' => $childName,
+			':CHILD_NS' => $childNamespace,
+		]);
 		if (empty($refInfo)) {
 		if (empty($refInfo)) {
-			$refInfo = [ 'ID' => 0, 'A_STATUS' => 'WAITING', 'VERSION' => 0, 'SOURCE' => 'table' ];
+			$refInfo = [ 'ID' => 0, 'A_STATUS' => 'WAITING', 'VERSION' => self::$REF_TABLE_VERSION, 'SOURCE' => 'table',
+				'ROOT_OBJECT_NS' => $rootObjectNamespace,
+				'CHILD_NAME' => $childName,
+				'CHILD_NS' => $childNamespace,
+			];
 			$refInfo['ID'] = DB::getPDO()->insert("CRM_REF_CONFIG", [
 			$refInfo['ID'] = DB::getPDO()->insert("CRM_REF_CONFIG", [
 				'ROOT_OBJECT_NS' => $rootObjectNamespace,
 				'ROOT_OBJECT_NS' => $rootObjectNamespace,
 				'CHILD_NAME' => $childName,
 				'CHILD_NAME' => $childName,
@@ -99,19 +129,6 @@ class RefConfig {
 			]);
 			]);
 		}
 		}
 
 
-		// { // TODO: fix source if ref for `SystemObjects__x3A__*` and defined flat_relation_cache - move to AclReinstall?
-		// 	if ('SystemObjects__x3A__' === substr($childNamespace, 0, strlen('SystemObjects__x3A__'))) {
-		// 		if ('table' === $refInfo['SOURCE']) {
-		// 			$toUpdate = [
-		// 				'SOURCE' => 'view',
-		// 				'A_STATUS' => 'WAITING',
-		// 			];
-		// 			DB::getPDO()->update('CRM_REF_CONFIG', 'ID', $refInfo['ID'], $toUpdate);
-		// 			$refInfo = array_merge($refInfo, $toUpdate);
-		// 		}
-		// 	}
-		// }
-
 		if (!$refInfo['ID']) throw new Exception("Ref table not found in ref config table for field '{$childName}' in object '{$rootObjectNamespace}'");
 		if (!$refInfo['ID']) throw new Exception("Ref table not found in ref config table for field '{$childName}' in object '{$rootObjectNamespace}'");
 		return Type_RefConfig::build($refInfo);
 		return Type_RefConfig::build($refInfo);
 	}
 	}