Piotr Labudda 8 лет назад
Родитель
Сommit
8b296aa304
3 измененных файлов с 119 добавлено и 75 удалено
  1. 38 48
      SE/se-lib/ACL.php
  2. 67 7
      SE/se-lib/RefConfig.php
  3. 14 20
      SE/se-lib/Route/Storage/AclReinstall.php

+ 38 - 48
SE/se-lib/ACL.php

@@ -6,8 +6,6 @@ Lib::loadClass('RefConfig');
 
 class ACL {
 
-	public static $REF_TABLE_VERSION = 2;
-
 	/**
 	 * Ids List of Proces Init for given tabel (skip filters)
 	 */
@@ -218,7 +216,7 @@ class ACL {
 		return Core_AclHelper::parseNamespaceUrl($namespace);
 	}
 
-	public static function getRefTable($rootObjectNamespace, $childName) { // CRM_REF_CONFIG
+	public static function getRefTable($rootObjectNamespace, $childName) { // TODO: mv to RefConfig
 		static $cacheRefTables = array();
 
 		DBG::log("DBG get ref table ({$rootObjectNamespace}, {$childName}) ...");
@@ -236,55 +234,56 @@ class ACL {
 			default: throw new Exception("Expected ref type for field '{$childName}' in object '{$rootObjectNamespace}'");
 		}
 
-		$refInfo = self::getRefConfig($rootObjectNamespace, $childName, $childNamespace);
-
-		if ('view' === $refInfo['SOURCE']) {
-			$refTableName = "CRM__#REF_TABLE__{$refInfo['ID']}_VIEW"; // view created by ACL::generateRefSelectSqlByFlatRelationCache
-		} else if ('backRef' === $refInfo['SOURCE']) {
-			$refTableName = "CRM__#REF_TABLE__{$refInfo['ID']}_VIEW"; // view created by ACL::generateRefSelectSqlByFlatRelationCache
-		} else if ('table' === $refInfo['SOURCE']) {
-			$refTableName = "CRM__#REF_TABLE__{$refInfo['ID']}";
-			if ('WAITING' == $refInfo['A_STATUS']) {
-				DB::getPDO()->execSql("
-					CREATE TABLE IF NOT EXISTS `{$refTableName}` (
-						`PRIMARY_KEY` int(11) NOT NULL
-						, `REMOTE_PRIMARY_KEY` int(11) NOT NULL
-						, `REMOTE_TYPENAME` varchar(255) NOT NULL DEFAULT ''
-						, `A_STATUS` enum('WAITING', 'NORMAL', 'DELETED') NOT NULL DEFAULT 'WAITING'
-						, `TRANSACTION_ID` int(11) NOT NULL
-						, `A_LAST_ACTION_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
-						, KEY `PRIMARY_KEY` (`PRIMARY_KEY`)
-						, KEY `REMOTE_PRIMARY_KEY` (`REMOTE_PRIMARY_KEY`)
-						, KEY `TRANSACTION_ID` (`TRANSACTION_ID`)
-					) ENGINE=MyISAM DEFAULT CHARSET=latin2 COMMENT='{$rootObjectNamespace} #REF $childName ({$childNamespace})';
-				");
-				$refInfo['A_STATUS'] = "NORMAL";
-				$refInfo['VERSION'] = self::$REF_TABLE_VERSION;
-				$affected = DB::getPDO()->update("CRM_REF_CONFIG", 'ID', $refInfo['ID'], [
-					'A_STATUS' => $refInfo['A_STATUS'],
-					'VERSION' => $refInfo['VERSION']
-				]);
+		$refConfig = RefConfig::fetch($rootObjectNamespace, $childName, $childNamespace);
+
+		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, $childNamespace);
+			}
+		} 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, $childNamespace);
+			}
+		} else if ('table' === $refConfig->source) {
+			$refTableName = "CRM__#REF_TABLE__{$refConfig->id}";
+			if ('WAITING' == $refConfig->status) {
+				RefConfig::createRefTable($rootObjectNamespace, $childName);
+				$refConfig = RefConfig::fetch($rootObjectNamespace, $childName, $childNamespace);
 			}
 		} else {
-			throw new Exception("Not Implemented ref SOURCE = '{$refInfo['SOURCE']}'");
+			throw new Exception("Not Implemented ref SOURCE = '{$refConfig->source}'");
 		}
 
-		if ('0' === (string)$refInfo['VERSION']) {
-			DBG::log($refInfo, 'array', "BUG RefConfig VERSION = 0 (ID: {$refInfo['VERSION']})");
+		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 ($refInfo['VERSION'] < self::$REF_TABLE_VERSION) {
-			if (1 == $refInfo['VERSION']) $refInfo = self::upgradeRefConfigFrom1to2($refInfo);
+		if ($refConfig->version < RefConfig::$REF_TABLE_VERSION) {
+			if (1 == $refConfig->version) {
+				RefConfig::createRefTable($rootObjectNamespace, $childName);
+				$refConfig = RefConfig::fetch($rootObjectNamespace, $childName, $childNamespace);
+			}
 		}
-		if ($refInfo['VERSION'] < self::$REF_TABLE_VERSION) throw new Exception("TODO: ref table {$refInfo['ID']} require upgrade - field '{$childName}' in object '{$rootObjectNamespace}'");
+		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;
 		return $refTableName;
 	}
 	public static function getRefSource($rootObjectNamespace, $childName) { // CRM_REF_CONFIG
 		$rootObjectNamespace = ACL::getBaseNamespace($rootObjectNamespace);
-		$refInfo = self::getRefConfig($rootObjectNamespace, $childName);
-		return V::get('SOURCE', 'table', $refInfo);
+		$refConfig = RefConfig::fetch($rootObjectNamespace, $childName);
+		return $refConfig->source;
 	}
 	public static function decodeAppInfoJson($appInfoJsonString) {
 		$appInfo = @json_decode($appInfoJsonString, $assoc = true);
@@ -427,15 +426,6 @@ class ACL {
 		DBG::log($sql, 'sql', "generateRefSelectSqlByFlatRelationCache");
 		return $sql;
 	}
-	public static function getRefConfig($rootObjectNamespace, $childName, $childNamespace = null) { // CRM_REF_CONFIG
-		$refConfig = RefConfig::fetch($rootObjectNamespace, $childName, $childNamespace)->toArray();
-		return [
-			'ID' => $refConfig['id'],
-			'A_STATUS' => $refConfig['status'],
-			'VERSION' => $refConfig['version'],
-			'SOURCE' => $refConfig['source']
-		];
-	}
 	public static function upgradeRefConfigFrom1to2($refInfo) {
 		if (1 == $refInfo['VERSION']) {
 			if ('table' === $refInfo['SOURCE'] && 'NORMAL' == $refInfo['A_STATUS']) {

+ 67 - 7
SE/se-lib/RefConfig.php

@@ -31,12 +31,15 @@ Lib::loadClass('ACL');
 
 class RefConfig {
 
+	static $REF_TABLE_VERSION = 2;
+
 	static function isActive($objectNamespace, $childTypeName) {
 		$refInfo = self::fetch($objectNamespace, $childTypeName);
 		return ('NORMAL' === $refInfo->status);
 	}
 
-	static function fetch($rootObjectNamespace, $childName, $childNamespace = null) {
+	/** 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
 		if (!$childTypeName) $childTypeName = Api_WfsNs::namespaceFromTypeName($fieldName);
 		$rootObjectNamespace = ACL::getBaseNamespace($rootObjectNamespace);
 		if (!$childNamespace) {
@@ -167,14 +170,14 @@ class RefConfig {
 		// if (!$oldRefActive) return; // if old not installed / adtivated then just fix struct and install
 
 		$newRefSource = $newField->source;
-		$oldRefConf = self::fetch($objectNamespace, $childTypeName);
-		$oldRefSource = $oldRefConf->source;
+		$refConfig = self::fetch($objectNamespace, $childTypeName);
+		$oldRefSource = $refConfig->source;
 		if ($newRefSource !== $oldRefSource) DBG::log("RefConfig::update Change ref source from '{$oldRefSource}' to '{$newRefSource}'");
 		{ // always update ref config at reinstall - drop / create ref tables (table or view)
 			switch ($newRefSource) {
-				case 'table': return self::installRefTable($objectNamespace, $childTypeName, $newField, $oldRefConf);
-				case 'view': return self::installRefView($objectNamespace, $childTypeName, $newField, $oldRefConf);
-				case 'backRef': return self::installBackRef($objectNamespace, $childTypeName, $newField, $oldRefConf);
+				case 'table': return self::installRefTable($objectNamespace, $childTypeName, $newField, $refConfig);
+				case 'view': return self::installRefView($objectNamespace, $childTypeName, $newField, $refConfig);
+				case 'backRef': return self::installBackRef($objectNamespace, $childTypeName, $newField, $refConfig);
 			}
 		}
 		if ($newRefSource !== $oldRefSource) {
@@ -186,10 +189,52 @@ class RefConfig {
 		}
 	}
 
+	static function createRefTable($objectNamespace, $childTypeName, Type_RefConfig $refConfig = null) {
+		if (!$refConfig) $refConfig = self::fetch($objectNamespace, $childTypeName);
+		$refTableName = "CRM__#REF_TABLE__{$refConfig->id}";
+		DB::getPDO()->execSql("
+			CREATE TABLE IF NOT EXISTS `{$refTableName}` (
+				`PRIMARY_KEY` int(11) NOT NULL
+				, `REMOTE_PRIMARY_KEY` int(11) NOT NULL
+				, `REMOTE_TYPENAME` varchar(255) NOT NULL DEFAULT ''
+				, `A_STATUS` enum('WAITING', 'NORMAL', 'DELETED') NOT NULL DEFAULT 'WAITING'
+				, `TRANSACTION_ID` int(11) NOT NULL
+				, `A_LAST_ACTION_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
+				, KEY `PRIMARY_KEY` (`PRIMARY_KEY`)
+				, KEY `REMOTE_PRIMARY_KEY` (`REMOTE_PRIMARY_KEY`)
+				, KEY `TRANSACTION_ID` (`TRANSACTION_ID`)
+			) ENGINE=MyISAM DEFAULT CHARSET=latin2 COMMENT='{$objectNamespace} #REF {$childTypeName}';
+		");
+		$affected = DB::getPDO()->update("CRM_REF_CONFIG", 'ID', $refConfig->id, [
+			'A_STATUS' => "NORMAL",
+			// 'VERSION' => self::$REF_TABLE_VERSION
+		]);
+		self::upgradeRefTableFrom1to2($refConfig);
+	}
+	static function upgradeRefTableFrom1to2(Type_RefConfig $refConfig) { // TODO: rm ACL::upgradeRefConfigFrom1to2
+		if (1 == $refConfig->version) {
+			if ('table' === $refConfig->source && 'NORMAL' == $refConfig->status) {
+				$refTableName = "CRM__#REF_TABLE__{$refConfig->id}";
+				try {
+					DB::getPDO()->execSql(" CREATE INDEX `TRANSACTION_ID` ON `{$refTableName}` (`TRANSACTION_ID`) ");
+				} catch (Exception $e) {
+					DBG::log($e);
+				}
+			}
+			$affected = DB::getPDO()->update("CRM_REF_CONFIG", 'ID', $refConfig->id, [
+				'VERSION' => 2
+			]);
+		}
+		// TODO: return array_merge($refConfig, [ 'VERSION' => 2 ]);
+	}
+
 	static function installRefTable($objectNamespace, $childTypeName, Type_Field $newField, Type_RefConfig $refConfig = null) {
 		if (!$refConfig) $refConfig = self::fetch($objectNamespace, $childTypeName);
+		self::createRefTable($objectNamespace, $childTypeName, $refConfig);
 		$affected = DB::getPDO()->update("CRM_REF_CONFIG", 'ID', $refConfig->id, [
-			'SOURCE' => 'table',
+			'SOURCE' => "table",
+			'A_STATUS' => "NORMAL",
+			'VERSION' => self::$REF_TABLE_VERSION,
 		]);
 	}
 
@@ -201,6 +246,7 @@ class RefConfig {
 
 		$affected = DB::getPDO()->update("CRM_REF_CONFIG", 'ID', $refConfig->id, [
 			'SOURCE' => 'view',
+			'A_STATUS' => "NORMAL",
 		]);
 	}
 
@@ -380,4 +426,18 @@ class RefConfig {
 		return $sql;
 	}
 
+	static function remove(Type_RefConfig $refConfig) {
+		DB::getPDO()->update('CRM_REF_CONFIG', 'ID', $refConfig->id, [
+			'A_STATUS' => 'DELETED',
+			'A_LAST_ACTION_DATE' => 'NOW()',
+		]);
+	}
+
+	static function reactivate(Type_RefConfig $refConfig) {
+		DB::getPDO()->update('CRM_REF_CONFIG', 'ID', $refConfig->id, [ // TODO: update ref table, update source -- fixed below by RefConfig::update
+			'A_STATUS' => 'WAITING',
+			'A_LAST_ACTION_DATE' => 'NOW()',
+		]);
+	}
+
 }

+ 14 - 20
SE/se-lib/Route/Storage/AclReinstall.php

@@ -300,31 +300,25 @@ class Route_Storage_AclReinstall extends RouteBase {
 		DBG::nicePrint($fieldNsList, '$fieldNsList');
 
 		if ('AntAcl' === $item['_type']) { // fix ref config status (turn on/off)
-			foreach ($childRefList as $childRef) { // [ namespace, A_STATUS ]
-				if ($childRef->status !== 'DELETED' && !in_array($childRef->childName, $fieldNsList)) {
-					UI::alert('danger', "remove ref config for '{$childRef->childName}' ...");
-					if (!$childRef->id) throw new Exception("Missing ref config ID");
-					DB::getPDO()->update('CRM_REF_CONFIG', 'ID', $childRef->id, [
-						'A_STATUS' => 'DELETED',
-						'A_LAST_ACTION_DATE' => 'NOW()',
-					]);
+			foreach ($childRefList as $refConfig) { // [ namespace, A_STATUS ]
+				if ($refConfig->status !== 'DELETED' && !in_array($refConfig->childName, $fieldNsList)) {
+					UI::alert('danger', "remove ref config for '{$refConfig->childName}' ...");
+					if (!$refConfig->id) throw new Exception("Missing ref config ID");
+					RefConfig::remove($refConfig);
 				}
-				else if ($childRef->status !== 'DELETED' && in_array($childRef->childName, $fieldNsList)) {
-					UI::alert('info', "ref config for '{$childRef->childName}' active - OK");
+				else if ($refConfig->status !== 'DELETED' && in_array($refConfig->childName, $fieldNsList)) {
+					UI::alert('info', "ref config for '{$refConfig->childName}' active - OK");
 				}
-				else if ($childRef->status === 'DELETED' && in_array($childRef->childName, $fieldNsList)) {
-					UI::alert('warning', "activate ref config for '{$childRef->childName}' ...");
-					if (!$childRef->id) throw new Exception("Missing ref config ID");
-					DB::getPDO()->update('CRM_REF_CONFIG', 'ID', $childRef->id, [ // TODO: update ref table, update source -- fixed below
-						'A_STATUS' => 'NORMAL',
-						'A_LAST_ACTION_DATE' => 'NOW()',
-					]);
+				else if ($refConfig->status === 'DELETED' && in_array($refConfig->childName, $fieldNsList)) {
+					UI::alert('warning', "activate ref config for '{$refConfig->childName}' ...");
+					if (!$refConfig->id) throw new Exception("Missing ref config ID");
+					RefConfig::reactivate($refConfig);
 				}
-				else if ($childRef->status === 'DELETED' && !in_array($childRef->childName, $fieldNsList)) {
-					UI::alert('info', "ref config for '{$childRef->childName}' removed - OK");
+				else if ($refConfig->status === 'DELETED' && !in_array($refConfig->childName, $fieldNsList)) {
+					UI::alert('info', "ref config for '{$refConfig->childName}' removed - OK");
 				}
 				else {
-					UI::alert('danger', "Not implemented action for '{$childRef->childName}'");
+					UI::alert('danger', "Not implemented action for '{$refConfig->childName}'");
 				}
 			}
 			// TODO: create missing refConfig - field is not in $childRefList