瀏覽代碼

fixed backRef table create

Piotr Labudda 8 年之前
父節點
當前提交
e26a3a9011
共有 2 個文件被更改,包括 11 次插入53 次删除
  1. 2 50
      SE/se-lib/ACL.php
  2. 9 3
      SE/se-lib/RefConfig.php

+ 2 - 50
SE/se-lib/ACL.php

@@ -232,57 +232,9 @@ class ACL {
 
 
 		// $item = SchemaFactory::loadDefaultObject('SystemObject')->getItem($rootObjectNamespace, [ 'propertyName' => '*,field' ]);
 		// $item = SchemaFactory::loadDefaultObject('SystemObject')->getItem($rootObjectNamespace, [ 'propertyName' => '*,field' ]);
 		if (!($rootAcl instanceof AntAclBase)) throw new Exception("Ref allowed only for AntAcl objects");
 		if (!($rootAcl instanceof AntAclBase)) throw new Exception("Ref allowed only for AntAcl objects");
-		$fieldInfo = $rootAcl->_getField($childName); // throws Exception if field not exists
 
 
-		$refConfig = RefConfig::fetch($rootObjectNamespace, $childName);
-
-		// TODO: CASE: Obj: A, B not installed, Ref: A->B; Install A / cannot install Ref A->B / require install B first / then go back and reinstall A
-		// TODO: What if primaryKey type != int ?
-		// TODO: require 2 pass for Install every object - first install all base Obj, then reinstall fixes Ref config
-		// \--- TODO: or split Reinstall obj action to: 1. Reinstall base Obj and 2. Install Ref tables
-
-		if ('view' === $refConfig->source) {
-			$refTableName = "CRM__#REF_TABLE__{$refConfig->id}_VIEW"; // view created by ACL::generateRefSelectSqlByFlatRelationCache
-			if ('WAITING' == $refConfig->status) {
-				if (!($rootAcl instanceof AntAclBase)) throw new Exception("Ref allowed only for AntAcl objects");
-				$fieldInfo = $rootAcl->_getField($childName);
-				$typeField = Type_Field::build($fieldInfo);
-				RefConfig::installRefView($rootObjectNamespace, $childName, $typeField, $refConfig);
-				$refConfig = RefConfig::fetch($rootObjectNamespace, $childName);
-			}
-		} else if ('backRef' === $refConfig->source) {
-			$refTableName = "CRM__#REF_TABLE__{$refConfig->id}_VIEW"; // view created by ACL::generateRefSelectSqlByFlatRelationCache
-			if ('WAITING' == $refConfig->status) {
-				throw new Exception("Install backRef view for '{$rootObjectNamespace}' to '{$childName}'");
-				// if (!($rootAcl instanceof AntAclBase)) throw new Exception("Ref allowed only for AntAcl objects");
-				// $fieldInfo = $rootAcl->_getField($childName);
-				// $typeField = Type_Field::build($fieldInfo);
-				// RefConfig::installRefView($rootObjectNamespace, $childName, $typeField, $refConfig);
-				// $refConfig = RefConfig::fetch($rootObjectNamespace, $childName);
-			}
-		} else if ('table' === $refConfig->source) {
-			$refTableName = "CRM__#REF_TABLE__{$refConfig->id}";
-			if ('WAITING' == $refConfig->status) {
-				RefConfig::createRefTable($rootObjectNamespace, $childName);
-				$refConfig = RefConfig::fetch($rootObjectNamespace, $childName);
-			}
-		} else {
-			throw new Exception("Not Implemented ref SOURCE = '{$refConfig->source}'");
-		}
-
-		if ('0' === (string)$refConfig->version) {
-			DBG::log($refConfig, 'array', "BUG RefConfig VERSION = 0 (ID: {$refConfig->version})");
-			throw new Exception("Wystąpiły błędy w konfiguracji tabeli powiązań - zainstaluj ponownie obiekt");
-		}
-		if ($refConfig->version < RefConfig::$REF_TABLE_VERSION) {
-			if (1 == $refConfig->version) {
-				RefConfig::createRefTable($rootObjectNamespace, $childName);
-				$refConfig = RefConfig::fetch($rootObjectNamespace, $childName);
-			}
-		}
-		if ($refConfig->version < RefConfig::$REF_TABLE_VERSION) throw new Exception("TODO: ref table {$refConfig->id} require upgrade - field '{$childName}' in object '{$rootObjectNamespace}'");
-
-		$cacheRefTables[$cacheKey] = $refTableName;
+		$refConfig = RefConfig::getRefConfig($rootObjectNamespace, $childName);
+		$cacheRefTables[$cacheKey] = $refConfig->tableName;
 		return $refTableName;
 		return $refTableName;
 	}
 	}
 	public static function getRefSource($rootObjectNamespace, $childName) { // CRM_REF_CONFIG
 	public static function getRefSource($rootObjectNamespace, $childName) { // CRM_REF_CONFIG

+ 9 - 3
SE/se-lib/RefConfig.php

@@ -248,7 +248,8 @@ class RefConfig {
 	static function installBackRef($objectNamespace, $childTypeName, Type_Field $newField, Type_RefConfig $refConfig = null) {
 	static function installBackRef($objectNamespace, $childTypeName, Type_Field $newField, Type_RefConfig $refConfig = null) {
 		$viewSelectSql = self::generateRefSelectSqlByBackRef($objectNamespace, $childTypeName);
 		$viewSelectSql = self::generateRefSelectSqlByBackRef($objectNamespace, $childTypeName);
 		if (!$refConfig) $refConfig = self::fetch($objectNamespace, $childTypeName);
 		if (!$refConfig) $refConfig = self::fetch($objectNamespace, $childTypeName);
-		DB::getPDO()->execSql(" CREATE OR REPLACE DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `{$refConfig->tableName}` AS {$viewSelectSql} ");
+		$backRefTableViewName = Type_RefConfig::generateTableName($refConfig->id, 'backRef');
+		DB::getPDO()->execSql(" CREATE OR REPLACE DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `{$backRefTableViewName}` AS {$viewSelectSql} ");
 
 
 		$affected = DB::getPDO()->update("CRM_REF_CONFIG", 'ID', $refConfig->id, [
 		$affected = DB::getPDO()->update("CRM_REF_CONFIG", 'ID', $refConfig->id, [
 			'SOURCE' => 'backRef',
 			'SOURCE' => 'backRef',
@@ -273,8 +274,13 @@ class RefConfig {
 		// }
 		// }
 		$childNs = Api_WfsNs::namespaceFromTypeName($childName);
 		$childNs = Api_WfsNs::namespaceFromTypeName($childName);
 		$rootTypeName = Api_WfsNs::typeName($rootObjectNamespace);
 		$rootTypeName = Api_WfsNs::typeName($rootObjectNamespace);
-		$backRefTable = ACL::getRefTable($childNs, $rootTypeName);
-		DBG::nicePrint($backRefTable, "ACL::getRefTable({$childNs}, {$rootTypeName})");
+		// $refConfig = self::getRefConfig($childNs, $rootTypeName); // NOTE: Uwaga getRefConfig recurence loop
+		$refConfig = self::fetch($childNs, $rootTypeName);
+		if ('WAITING' == $refConfig->status || $refConfig->version < self::$REF_TABLE_VERSION) {
+			throw new Exception("Error: Install/Update ref table from {$objectNamespace} to {$childTypeName} first");
+		}
+		$backRefTable = $refConfig->tableName;
+		DBG::log($backRefTable, 'array', "ACL::getRefTable({$childNs}, {$rootTypeName})");
 
 
 		// TODO: check if ref_config is not backRef to avoid loop // $refInfo = self::getRefConfig($fieldNs, $item['typeName'], $item['typeName']);
 		// TODO: check if ref_config is not backRef to avoid loop // $refInfo = self::getRefConfig($fieldNs, $item['typeName'], $item['typeName']);