浏览代码

added ACL::getRefTable

Piotr Labudda 9 年之前
父节点
当前提交
18c1e9302a
共有 1 个文件被更改,包括 91 次插入5 次删除
  1. 91 5
      SE/se-lib/ACL.php

+ 91 - 5
SE/se-lib/ACL.php

@@ -1,8 +1,11 @@
 <?php
 
+Lib::loadClass('Core_AclHelper');
 
 class ACL {
 
+	public static $REF_TABLE_VERSION = 1;
+
 	/**
 	 * Ids List of Proces Init for given tabel (skip filters)
 	 */
@@ -35,19 +38,19 @@ SQL;
 SQL;
 		/*
 			SELECT p.`ID` , p.`DESC`
-			FROM  `CRM_PROCES` p
+			FROM `CRM_PROCES` p
 			WHERE p.`ID`
 			IN (
 					SELECT i.`idx_PROCES_INIT_ID`
-					FROM  `CRM_PROCES_idx` i
+					FROM `CRM_PROCES_idx` i
 					WHERE i.`ID_PROCES`
 					IN (
 							SELECT tpv.`ID_PROCES`
-							FROM  `CRM_PROCES_idx_TABLE_TO_PROCES_VIEW` tpv
-							WHERE tpv.`ID_TABLE` =  '13051'
+							FROM `CRM_PROCES_idx_TABLE_TO_PROCES_VIEW` tpv
+							WHERE tpv.`ID_TABLE` = '13051'
 					)
 			)
-			AND p.`TYPE` =  'PROCES_INIT'
+			AND p.`TYPE` = 'PROCES_INIT'
 			order by p.`SORT_PRIO`
 		*/
 		$fetchTableProcesInitListSql = <<<SQL
@@ -167,4 +170,87 @@ SQL;
 		}
 		return $isAllowed;
 	}
+
+	public static function getAclByNamespace($namespace, $forceTblAclInit = false) {
+		return Core_AclHelper::getAclByNamespace($namespace, $forceTblAclInit);
+	}
+
+	public static function parseNamespaceUrl($namespace) {// returns assoc array: [ 'name', 'url', 'prefix', 'sourceName' ]
+		return Core_AclHelper::parseNamespaceUrl($namespace);
+	}
+
+	public static function getRefTable($rootObjectNamespace, $childName) {
+		static $cacheRefTables = array();
+		$cacheKey = "{$rootObjectNamespace}/{$childName}";
+		if (array_key_exists($cacheKey, $cacheRefTables)) return $cacheRefTables[$cacheKey];
+
+		$rootAcl = self::getAclByNamespace($rootObjectNamespace);
+		$childXsdType = $rootAcl->getXsdFieldType($childName);
+		if ('ref_uri:' !== substr($childXsdType, 0, 8)) throw new Exception("Expected ref type for field '{$childName}' in object '{$rootObjectNamespace}'");
+		$childNamespace = substr($childXsdType, 8);
+		$childAcl = self::getAclByNamespace($childNamespace);
+
+		$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
+				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()->exec("
+				CREATE TABLE `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
+					, PRIMARY KEY (`ID`)
+				) ENGINE = MyISAM DEFAULT CHARSET=latin2;
+			");
+		}
+		if (empty($refInfo)) {
+			$refInfo = [ 'ID' => 0, 'A_STATUS' => 'WAITING', 'VERSION' => 0 ];
+			$refInfo['ID'] = DB::getPDO()->insert("CRM_REF_CONFIG", [
+				'ROOT_OBJECT_NS' => $rootObjectNamespace,
+				'CHILD_NAME' => $childName,
+				'CHILD_NS' => $childNamespace
+			]);
+		}
+		if (!$refInfo['ID']) throw new Exception("Ref table not found in ref config table for field '{$childName}' in object '{$rootObjectNamespace}'");
+
+		$refTableName = "CRM__#REF_TABLE__{$refInfo['ID']}";
+		if ('WAITING' == $refInfo['A_STATUS']) {
+			DB::getPDO()->exec("
+				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'
+					, `A_RECORD_UPDATE_DATE` timestamp ON UPDATE CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
+					, `TRANACTION_ID` int(11) NOT NULL
+					, KEY `PRIMARY_KEY` (`PRIMARY_KEY`)
+					, KEY `REMOTE_PRIMARY_KEY` (`REMOTE_PRIMARY_KEY`)
+				) ENGINE=MyISAM DEFAULT CHARSET=latin2;
+			");
+			$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']
+			]);
+		}
+
+		if ($refInfo['VERSION'] < self::$REF_TABLE_VERSION) throw new Exception("TODO: ref table {$refInfo['ID']} require upgrade - field '{$childName}' in object '{$rootObjectNamespace}'");
+
+		$cacheRefTables[$cacheKey] = $refTableName;
+		return $refTableName;
+	}
+
 }