|
@@ -32,20 +32,71 @@ Lib::loadClass('ACL');
|
|
|
class RefConfig {
|
|
class RefConfig {
|
|
|
|
|
|
|
|
static $REF_TABLE_VERSION = 2;
|
|
static $REF_TABLE_VERSION = 2;
|
|
|
|
|
+ static $REF_DB_SCHEMA_VERSION = 2;
|
|
|
|
|
|
|
|
static function isActive($objectNamespace, $childTypeName) {
|
|
static function isActive($objectNamespace, $childTypeName) {
|
|
|
$refInfo = self::fetch($objectNamespace, $childTypeName);
|
|
$refInfo = self::fetch($objectNamespace, $childTypeName);
|
|
|
return ('NORMAL' === $refInfo->status);
|
|
return ('NORMAL' === $refInfo->status);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ static function _getDBVersion() {
|
|
|
|
|
+ return (int)DB::getPDO()->fetchValue(" select `CONF_VAL` from `CRM_CONFIG` where `CONF_KEY` = 'RefConfig__version' ");
|
|
|
|
|
+ }
|
|
|
|
|
+ static function _updateDBVersion($version) {
|
|
|
|
|
+ DB::getPDO()->execSql(" REPLACE INTO CRM_CONFIG (`CONF_KEY`,`CONF_VAL`) VALUES ('RefConfig__version', '{$version}') ");
|
|
|
|
|
+ }
|
|
|
|
|
+ static function _fixDatabaseSchema() {
|
|
|
|
|
+ static $_REF_DB_SCHEMA_VERSION;
|
|
|
|
|
+ DBG::log("_fixDatabaseSchema \$_REF_DB_SCHEMA_VERSION({$_REF_DB_SCHEMA_VERSION})");
|
|
|
|
|
+ if (!$_REF_DB_SCHEMA_VERSION) {
|
|
|
|
|
+ $_REF_DB_SCHEMA_VERSION = self::_getDBVersion();
|
|
|
|
|
+ if (2 === self::$REF_DB_SCHEMA_VERSION && $_REF_DB_SCHEMA_VERSION < self::$REF_DB_SCHEMA_VERSION) {
|
|
|
|
|
+ DB::getPDO()->execSql("
|
|
|
|
|
+ CREATE TABLE IF NOT EXISTS `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
|
|
|
|
|
+ , `SOURCE` enum('table', 'view', 'backRef') NOT NULL DEFAULT 'table'
|
|
|
|
|
+ , PRIMARY KEY (`ID`)
|
|
|
|
|
+ ) ENGINE = MyISAM DEFAULT CHARSET=latin2;
|
|
|
|
|
+ ");
|
|
|
|
|
+
|
|
|
|
|
+ try { // upgrade from version 0.1
|
|
|
|
|
+ DB::getPDO()->execSql(" ALTER TABLE `CRM_REF_CONFIG` ADD `SOURCE` enum('table', 'view', 'backRef') not null default 'table' ");
|
|
|
|
|
+ } catch (Exception $e) {
|
|
|
|
|
+ DBG::log($e);
|
|
|
|
|
+ }
|
|
|
|
|
+ try { // upgrade from version 0.2
|
|
|
|
|
+ DB::getPDO()->execSql(" ALTER TABLE `CRM_REF_CONFIG` CHANGE `SOURCE` `SOURCE` enum('table', 'view', 'backRef') not null default 'table' ");
|
|
|
|
|
+ } catch (Exception $e) {
|
|
|
|
|
+ DBG::log($e);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ DB::getPDO()->execSql("
|
|
|
|
|
+ update CRM_REF_CONFIG
|
|
|
|
|
+ set CHILD_NS = REPLACE(REPLACE(CHILD_NS, '__x3A__', '/'), ':', '/')
|
|
|
|
|
+ where CHILD_NS = CHILD_NAME
|
|
|
|
|
+ ");
|
|
|
|
|
+ self::_updateDBVersion(2);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/** static function fetch(Type_Namespace $rootObjectNamespace, Type_TypeName $childName, Type_Namespace $childNamespace = null): Type_RefConfig */
|
|
/** 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
|
|
static function fetch($rootObjectNamespace, $childName, $childNamespace = null) { // @returns Type_RefConfig
|
|
|
- if (!$childTypeName) $childTypeName = Api_WfsNs::namespaceFromTypeName($fieldName);
|
|
|
|
|
|
|
+ self::_fixDatabaseSchema();
|
|
|
|
|
+
|
|
|
$rootObjectNamespace = ACL::getBaseNamespace($rootObjectNamespace);
|
|
$rootObjectNamespace = ACL::getBaseNamespace($rootObjectNamespace);
|
|
|
|
|
+ if (!$childNamespace && false !== strpos($childName, '__x3A__') && false !== strpos($childName, ':')) $childNamespace = Api_WfsNs::namespaceFromTypeName($childName);
|
|
|
if (!$childNamespace) {
|
|
if (!$childNamespace) {
|
|
|
$rootAcl = ACL::getAclByNamespace($rootObjectNamespace);
|
|
$rootAcl = ACL::getAclByNamespace($rootObjectNamespace);
|
|
|
$childXsdType = $rootAcl->getXsdFieldType($childName);
|
|
$childXsdType = $rootAcl->getXsdFieldType($childName);
|
|
|
- list($typePrefix, $childNamespace) = explode(':', $childXsdType, 2);
|
|
|
|
|
|
|
+ list($typePrefix, $childTypeName) = explode(':', $childXsdType, 2);
|
|
|
|
|
+ $childNamespace = Api_WfsNs::namespaceFromTypeName($childTypeName);
|
|
|
DBG::log(['$childXsdType' => $childXsdType, '$typePrefix' => $typePrefix, '$childNamespace' => $childNamespace], 'array', "DBG get ref table ...");
|
|
DBG::log(['$childXsdType' => $childXsdType, '$typePrefix' => $typePrefix, '$childNamespace' => $childNamespace], 'array', "DBG get ref table ...");
|
|
|
switch ($typePrefix) {
|
|
switch ($typePrefix) {
|
|
|
case 'ref_uri': $childAcl = ACL::getAclByNamespace($childNamespace); break;
|
|
case 'ref_uri': $childAcl = ACL::getAclByNamespace($childNamespace); break;
|
|
@@ -53,44 +104,23 @@ class RefConfig {
|
|
|
default: throw new Exception("Expected ref type for field '{$childName}' in object '{$rootObjectNamespace}'");
|
|
default: throw new Exception("Expected ref type for field '{$childName}' in object '{$rootObjectNamespace}'");
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- $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, c.SOURCE
|
|
|
|
|
- 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()->execSql("
|
|
|
|
|
- CREATE TABLE IF NOT EXISTS `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;
|
|
|
|
|
- ");
|
|
|
|
|
- try {
|
|
|
|
|
- DB::getPDO()->execSql(" ALTER TABLE `CRM_REF_CONFIG` ADD `SOURCE` enum('table', 'view') not null default 'table' ");
|
|
|
|
|
- } catch (Exception $e) {
|
|
|
|
|
- DBG::log($e);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- try {
|
|
|
|
|
- DB::getPDO()->execSql(" ALTER TABLE `CRM_REF_CONFIG` CHANGE `SOURCE` `SOURCE` enum('table', 'view', 'backRef') not null default 'table' ");
|
|
|
|
|
- } catch (Exception $e) {
|
|
|
|
|
- DBG::log($e);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ $refInfo = DB::getPDO()->fetchFirst("
|
|
|
|
|
+ select c.ID, c.A_STATUS, c.VERSION, c.SOURCE
|
|
|
|
|
+ from `CRM_REF_CONFIG` c
|
|
|
|
|
+ where c.ROOT_OBJECT_NS = :ROOT_OBJECT_NS
|
|
|
|
|
+ and c.CHILD_NAME = :CHILD_NAME
|
|
|
|
|
+ and c.CHILD_NS = :CHILD_NS
|
|
|
|
|
+ ", [
|
|
|
|
|
+ ':ROOT_OBJECT_NS' => $rootObjectNamespace,
|
|
|
|
|
+ ':CHILD_NAME' => $childName,
|
|
|
|
|
+ ':CHILD_NS' => $childNamespace,
|
|
|
|
|
+ ]);
|
|
|
if (empty($refInfo)) {
|
|
if (empty($refInfo)) {
|
|
|
- $refInfo = [ 'ID' => 0, 'A_STATUS' => 'WAITING', 'VERSION' => 0, 'SOURCE' => 'table' ];
|
|
|
|
|
|
|
+ $refInfo = [ 'ID' => 0, 'A_STATUS' => 'WAITING', 'VERSION' => self::$REF_TABLE_VERSION, 'SOURCE' => 'table',
|
|
|
|
|
+ 'ROOT_OBJECT_NS' => $rootObjectNamespace,
|
|
|
|
|
+ 'CHILD_NAME' => $childName,
|
|
|
|
|
+ 'CHILD_NS' => $childNamespace,
|
|
|
|
|
+ ];
|
|
|
$refInfo['ID'] = DB::getPDO()->insert("CRM_REF_CONFIG", [
|
|
$refInfo['ID'] = DB::getPDO()->insert("CRM_REF_CONFIG", [
|
|
|
'ROOT_OBJECT_NS' => $rootObjectNamespace,
|
|
'ROOT_OBJECT_NS' => $rootObjectNamespace,
|
|
|
'CHILD_NAME' => $childName,
|
|
'CHILD_NAME' => $childName,
|
|
@@ -99,19 +129,6 @@ class RefConfig {
|
|
|
]);
|
|
]);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // { // TODO: fix source if ref for `SystemObjects__x3A__*` and defined flat_relation_cache - move to AclReinstall?
|
|
|
|
|
- // if ('SystemObjects__x3A__' === substr($childNamespace, 0, strlen('SystemObjects__x3A__'))) {
|
|
|
|
|
- // if ('table' === $refInfo['SOURCE']) {
|
|
|
|
|
- // $toUpdate = [
|
|
|
|
|
- // 'SOURCE' => 'view',
|
|
|
|
|
- // 'A_STATUS' => 'WAITING',
|
|
|
|
|
- // ];
|
|
|
|
|
- // DB::getPDO()->update('CRM_REF_CONFIG', 'ID', $refInfo['ID'], $toUpdate);
|
|
|
|
|
- // $refInfo = array_merge($refInfo, $toUpdate);
|
|
|
|
|
- // }
|
|
|
|
|
- // }
|
|
|
|
|
- // }
|
|
|
|
|
-
|
|
|
|
|
if (!$refInfo['ID']) throw new Exception("Ref table not found in ref config table for field '{$childName}' in object '{$rootObjectNamespace}'");
|
|
if (!$refInfo['ID']) throw new Exception("Ref table not found in ref config table for field '{$childName}' in object '{$rootObjectNamespace}'");
|
|
|
return Type_RefConfig::build($refInfo);
|
|
return Type_RefConfig::build($refInfo);
|
|
|
}
|
|
}
|