$fetchTableProcesInitListSql('.$idTable.') ';print_r($fetchTableProcesInitListSql);echo''; $tableProcesInitList = array(); $db = DB::getDB(); $res = $db->query($fetchTableProcesInitListSql); while ($r = $db->fetch($res)) { $tableProcesInitList[$r->ID] = $r->DESC; } return $tableProcesInitList; } public static function getProcesInitMapTreeOnlyIds($ids) { $mapTree = array(); $map = self::getProcesInitMapOnlyIds($ids); foreach ($map as $r) { if ('PROCES_INIT' == $r->TYPE) { $mapTree[$r->ID_PROCES] = array(); } } foreach ($map as $r) { if ('GOTO_AND_RETURN' == $r->TYPE) { $mapTree[$r->idx_MAIN_PROCES_INIT_ID][$r->ID_PROCES] = array(); } } foreach ($map as $r) { if ('GOTO_AND_RETURN_LVL2' == $r->TYPE) { $mapTree[$r->idx_MAIN_PROCES_INIT_ID][$r->idx_GOTO_LVL2_INIT_ID][$r->ID_PROCES] = true; } } return $mapTree; } public static function getProcesInitMapOnlyIds($ids) { $map = array(); $sqlIds = V::filter($ids, array('V', 'filterPositiveInteger')); $sqlIds = implode(',', $sqlIds); if (empty($sqlIds)) return $map; $sql = <<query($sql); while ($r = $db->fetch($res)) { $map[] = $r; } //DBG::table("MAP", $map, __CLASS__, __FUNCTION__, __LINE__); return $map; } public static function canGroupViewProces($idGroup, $idProcesInit) { $isAllowed = false; $idProcesInit = (int)$idProcesInit; if (!$idProcesInit) return false; $checkProcesAccessSql = <<query($checkProcesAccessSql); if ($r = $db->fetch($res)) { if ($r->cnt > 0) { $isAllowed = true; } } return $isAllowed; } public static function getStorageByNamespace($namespace, $forceTblAclInit = false) { Lib::loadClass('Core_AclHelper'); Lib::loadClass('SchemaFactory'); $ns = Core_AclHelper::parseNamespaceUrl($namespace); DBG::log($ns, 'array', "parseNamespaceUrl({$namespace})"); if ('default_db' == $ns['prefix']) { $acl = User::getAcl()->getObjectAcl($ns['prefix'], $ns['name']); } else if ('objects' == $ns['prefix']) { $acl = SchemaFactory::loadDefaultObject($ns['name']); } else if ('default_objects' == $ns['prefix']) { $acl = SchemaFactory::loadDefaultObject($ns['name']); } else if ('default_db__x3A__' == substr($ns['prefix'], 0, 17)) { $rootTableName = strtolower(substr($ns['prefix'], 17)); $acl = SchemaFactory::loadTableObject($rootTableName, $ns['name']); } else { throw new HttpException("Not Implemented", 501); } $acl->init($forceTblAclInit); return $acl; } 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) { // CRM_REF_CONFIG 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 , `A_LAST_ACTION_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP , 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' , `TRANACTION_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`) ) 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'] ]); } 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; } public static function getInstanceId($namespace) { // CRM_INSTANCE_CONFIG $conf = self::getInstanceConfig($namespace); return $conf['id']; } public static function getInstanceConfig($namespace) { // CRM_INSTANCE_CONFIG try { $conf = self::fetchInstanceConfig($namespace); } catch (Exception $e) { DB::getPDO()->execSql(" create table if not exists `CRM_INSTANCE_CONFIG` ( `id` int(11) not null AUTO_INCREMENT, `namespace` varchar(255) NOT NULL DEFAULT '', `rootNamespace` varchar(255) NOT NULL DEFAULT '', `idInstanceBase` int(11) NOT NULL DEFAULT 0, `_createdAt` datetime NOT NULL, UNIQUE KEY `namespace` (`namespace`), KEY `rootNamespace` (`rootNamespace`), PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin2 "); // TODO:?: `_tableInstalled` tinyint(1) not null default 0, $conf = self::fetchInstanceConfig($namespace); } if (!$conf) { $id = DB::getPDO()->insert("CRM_INSTANCE_CONFIG", [ 'namespace' => $namespace, 'rootNamespace' => self::getRootNamespace($namespace), '_createdAt' => 'NOW()', ]); $conf = self::fetchInstanceConfig($namespace); } if (!$conf) throw new Exception("Instance not found in config table '{$namespace}'"); return $conf; } public static function fetchInstanceConfig($namespace) { return DB::getPDO()->fetchFirst(" select c.* from `CRM_INSTANCE_CONFIG` c where c.namespace = '{$namespace}' "); } public static function getRootNamespace($namespace) { // TODO: works only for relative urls! - mv to Acl->getRootNamespace Lib::loadClass('SchemaFactory'); try { $objectItem = SchemaFactory::loadDefaultObject('SystemObject')->getItem($namespace); } catch (Exception $e) { throw new Exception("Object not installed '{$namespace}'"); } if (!$objectItem['isStructInstalled']) throw new Exception("Object structure not installed '{$namespace}'"); if ($objectItem['idDatabase'] != DB::getPDO()->getZasobId()) throw new Exception("Only default_db supported"); // TODO: support more Sources return "default_db/{$objectItem['_rootTableName']}"; } public static function getNamespaceSiblings($namespace) { return array_map(function ($row) { return $row['namespace']; }, DB::getPDO()->fetchAll(" select s.namespace from CRM_INSTANCE_CONFIG c join CRM_INSTANCE_CONFIG s on ( s.rootNamespace = c.rootNamespace and s.namespace != c.rootNamespace ) where c.namespace = :namespace ", [ 'namespace' => $namespace ])); } public static function getFeatureNamespaces($namespace, $pk) { $instanceTable = self::getInstanceTable($namespace); return array_map(function ($row) { return $row['namespace']; }, DB::getPDO()->fetchAll(" select c.namespace from `{$instanceTable}` i join `CRM_INSTANCE_CONFIG` c on ( c.id = i.idInstance ) where i.pk = :pk ", [ 'pk' => $pk, ])); } public static function getInstanceTable($namespace) { $conf = self::getInstanceConfig($namespace); if (!empty($conf['idInstanceBase'])) return "CRM__#INSTANCE_TABLE__{$conf['idInstanceBase']}"; $rootNs = $conf['rootNamespace']; $rootConf = self::getInstanceConfig($rootNs); $instanceTableName = "CRM__#INSTANCE_TABLE__{$rootConf['id']}"; if (!empty($rootConf['idInstance'])) { $affected = DB::getPDO()->update("CRM_INSTANCE_CONFIG", 'rootNamespace', $rootNs, [ 'idInstanceBase' => $rootConf['id'] ]); return $instanceTableName; } // TODO: fetch primaryKeyType - TODO: store primaryKey and primaryKeyType in SystemObject item $pkType = 'int'; DB::getPDO()->exec(" CREATE TABLE IF NOT EXISTS `{$instanceTableName}` ( `pk` int(11) NOT NULL COMMENT 'primary key' , `idInstance` int(11) NOT NULL , `_createdAt` datetime NOT NULL , KEY `pk` (`pk`) , KEY `idInstance` (`idInstance`) ) ENGINE=MyISAM DEFAULT CHARSET=latin2 COMMENT='{$rootNs} #INSTANCE'; "); $affected = DB::getPDO()->update("CRM_INSTANCE_CONFIG", 'rootNamespace', $rootNs, [ 'idInstanceBase' => $rootConf['id'] ]); return $instanceTableName; } // @params $from - ( ACL | tableName | namespace | etc... - only ACL) public static function query($from) { Lib::loadClass('AclQueryBuilder'); $query = new AclQueryBuilder(); $query->from($from); return $query; } /** * @param mixed $object - Core_AclBase or string - namespace * @return Core_AclFields */ public static function getObjectFields($object) { // TODO: try to get structure from `CRM_#CACHE_ACL_OBJECT_FIELD` // if ($object is instance Core_AclBase) { // if ($object->isStructInstalled) then get structure from `CRM_#CACHE_ACL_OBJECT_FIELD` and put into Core_AclFields // else get from $object->getFields() and put into Core_AclFields } }