| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342 |
- <?php
- Lib::loadClass('Core_AclHelper');
- class ACL {
- public static $REF_TABLE_VERSION = 1;
- /**
- * Ids List of Proces Init for given tabel (skip filters)
- */
- public static function getTableProcesInitIds($idTable) {
- $procesInitList = self::getTableProcesInitList($idTable);
- return array_keys($procesInitList);
- }
- /**
- * List of Proces Init for given table (skip filters)
- */
- public static function getTableProcesInitList($idTable) {
- $tableProcesInitList = array();
- $sqlIdProcesListSql = <<<SQL
- select tpv.`ID_PROCES`
- from `CRM_PROCES_idx_TABLE_TO_PROCES_VIEW` tpv
- where tpv.`ID_TABLE`='{$idTable}'
- SQL;
- $fetchTableProcesInitListSql = <<<SQL
- -- time ~0.07 -- no goto and return
- select p.`ID`, p.`DESC`
- from `CRM_PROCES` p
- where p.`ID` in(
- select i.`idx_PROCES_INIT_ID`
- from `CRM_PROCES_idx` i
- where i.`ID_PROCES` in({$sqlIdProcesListSql})
- )
- and p.`TYPE`='PROCES_INIT'
- order by p.`SORT_PRIO`
- SQL;
- /*
- SELECT p.`ID` , p.`DESC`
- FROM `CRM_PROCES` p
- WHERE p.`ID`
- IN (
- SELECT i.`idx_PROCES_INIT_ID`
- 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'
- )
- )
- AND p.`TYPE` = 'PROCES_INIT'
- order by p.`SORT_PRIO`
- */
- $fetchTableProcesInitListSql = <<<SQL
- -- time ~0.15s
- select p.`ID`, p.`DESC`
- from `CRM_PROCES` p
- where p.`ID` in(
- select i.`idx_PROCES_INIT_ID`
- from `CRM_PROCES_idx` i
- where i.`ID_PROCES` in({$sqlIdProcesListSql})
- union
- select ig.`idx_PROCES_INIT_ID`
- from `CRM_PROCES_idx` i
- join `CRM_PROCES_idx` ig on(ig.`ID_PROCES`=i.`idx_PROCES_WITH_GROUPS_ID`)
- where i.`ID_PROCES` in({$sqlIdProcesListSql})
- )
- and p.`TYPE`='PROCES_INIT'
- order by p.`SORT_PRIO`
- SQL;
- $fetchTableProcesInitListSql = <<<SQL
- -- time ~0.14
- select p.`ID`, p.`DESC`
- from `CRM_PROCES` p
- where p.`ID` in(
- select i.`idx_PROCES_INIT_ID`
- from `CRM_PROCES_idx` i
- where i.`ID_PROCES` in({$sqlIdProcesListSql})
- or i.`ID_PROCES` in(
- select ig.`idx_PROCES_WITH_GROUPS_ID`
- from `CRM_PROCES_idx` ig
- where ig.`ID_PROCES` in({$sqlIdProcesListSql})
- )
- )
- and p.`TYPE`='PROCES_INIT'
- order by p.`SORT_PRIO`
- SQL;
- //echo'<pre>$fetchTableProcesInitListSql('.$idTable.') ';print_r($fetchTableProcesInitListSql);echo'</pre>';
- $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 = <<<SQL
- select i.`ID_PROCES`
- , i.`PARENT_ID`
- , i.`TYPE`
- , i.`idx_PROCES_INIT_ID`
- , i.`idx_MAIN_PROCES_INIT_ID`
- , i.`idx_PROCES_WITH_GROUPS_ID`
- , IF(i.`TYPE`='GOTO_AND_RETURN_LVL2'
- , (select ig.`idx_PROCES_INIT_ID`
- from `CRM_PROCES_idx` ig
- where ig.`ID_PROCES`=i.`PARENT_ID`
- limit 1)
- , 0
- ) as idx_GOTO_LVL2_INIT_ID
- from `CRM_PROCES_idx` i
- where i.`ID_PROCES` in({$sqlIds})
- and i.`idx_MAIN_PROCES_INIT_ID` in({$sqlIds})
- SQL;
- DBG::_('DBG_MAP', '1', "MAP SQL", $sql, __CLASS__, __FUNCTION__, __LINE__);
- $db = DB::getDB();
- $res = $db->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 = <<<SQL
- select count(*) as cnt
- from `CRM_PROCES_idx_GROUP_to_INIT_VIEW` giv
- where giv.`ID_GROUP` = '{$idGroup}'
- and giv.`ID_PROCES_INIT` = '{$idProcesInit}'
- SQL;
- $db = DB::getDB();
- $res = $db->query($checkProcesAccessSql);
- if ($r = $db->fetch($res)) {
- if ($r->cnt > 0) {
- $isAllowed = true;
- }
- }
- 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) { // 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 '',
- `tableName` varchar(255) NOT NULL DEFAULT '',
- `_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 getInstanceTable($namespace) {
- $conf = self::getInstanceConfig($namespace);
- if (!empty($conf['tableName'])) return $conf['tableName'];
- $rootNs = $conf['rootNamespace'];
- $rootConf = self::getInstanceConfig($rootNs);
- $instanceTableName = "CRM__#INSTANCE_TABLE__{$rootConf['id']}";
- if (!empty($rootConf['tableName'])) {
- $affected = DB::getPDO()->update("CRM_INSTANCE_CONFIG", 'rootNamespace', $rootNs, [
- 'tableName' => $instanceTableName
- ]);
- return $rootConf['tableName'];
- }
- // 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, [
- 'tableName' => $instanceTableName
- ]);
- return $instanceTableName;
- }
- }
|