Quellcode durchsuchen

export field enum values to `*_enum` table

Piotr Labudda vor 9 Jahren
Ursprung
Commit
5e0bbdb51a

+ 23 - 3
SE/schema/ant-object/default_db.TEST_PERMS/TestPermsAnt/TestPermsAnt.xsd

@@ -22,14 +22,34 @@
                     </xsd:element>
                     <xsd:element minOccurs="0" maxOccurs="1" name="KATALOG_LINK" type="p5:www_link"/>
                     <xsd:element minOccurs="0" maxOccurs="1" name="WWW" type="p5:www_link"/>
-                    <xsd:element minOccurs="0" maxOccurs="1" name="ADM_ADMIN_LEVEL" type="xsd:string"/>
+                    <xsd:element minOccurs="0" maxOccurs="1" name="ADM_ADMIN_LEVEL">
+                      <xsd:simpleType>
+                          <xsd:restriction base="p5:enum">
+                              <xsd:enumeration value="0"/>
+                              <xsd:enumeration value="1"/>
+                              <xsd:enumeration value="2"/>
+                              <xsd:enumeration value="3"/>
+                              <xsd:enumeration value="4"/>
+                              <xsd:enumeration value="5"/>
+                              <xsd:enumeration value="6"/>
+                          </xsd:restriction>
+                      </xsd:simpleType>
+                    </xsd:element>
                     <xsd:element minOccurs="0" maxOccurs="1" name="ADM_PASSWD" type="xsd:string"/>
-                    <xsd:element minOccurs="0" maxOccurs="1" name="A_STATUS" type="xsd:string"/>
+                    <xsd:element minOccurs="0" maxOccurs="1" name="A_STATUS">
+                      <xsd:simpleType>
+                          <xsd:restriction base="p5:enum">
+                              <xsd:enumeration value="WAITING"/>
+                              <xsd:enumeration value="NORMAL"/>
+                              <xsd:enumeration value="OFF_HARD"/>
+                          </xsd:restriction>
+                      </xsd:simpleType>
+                    </xsd:element>
                     <xsd:element minOccurs="0" maxOccurs="1" name="EMAIL" type="xsd:string"/>
                     <xsd:element minOccurs="0" maxOccurs="1" name="ADM_ANAME" type="xsd:string"/>
                     <xsd:element minOccurs="0" maxOccurs="1" name="PARENT_ID" type="xsd:integer"/>
                     <xsd:element minOccurs="0" maxOccurs="1" name="OPIS" type="xsd:string"/>
-                    <xsd:element minOccurs="0" maxOccurs="1" name="the_geom" type="gml:PolygonPropertyType"/>
+                    <xsd:element minOccurs="0" maxOccurs="1" name="the_geom" type="gml:PolygonPropertyType" nillable="true"/>
                     <xsd:element minOccurs="0" maxOccurs="1" name="A_ADM_COMPANY" type="xsd:string"/>
                     <xsd:element minOccurs="0" maxOccurs="1" name="A_CLASSIFIED" type="xsd:string"/>
                     <xsd:element minOccurs="0" maxOccurs="1" name="A_RECORD_CREATE_AUTHOR" type="xsd:string"/>

+ 65 - 0
SE/se-lib/Schema/SystemObjectFieldStorageAcl.php

@@ -54,7 +54,22 @@ class Schema_SystemObjectFieldStorageAcl extends Core_AclSimpleSchemaBase {
         KEY `isActive` (isActive)
       ) ENGINE=MyISAM  DEFAULT CHARSET=latin2
     ");
+    // DB::getPDO()->execSql(" drop table if exists `{$this->_rootTableName}_enum` ");// TODO: DBG
+    DB::getPDO()->execSql("
+      create table if not exists `{$this->_rootTableName}_enum` (
+        `namespace` varchar(255) DEFAULT '' COMMENT 'concat obj ns / field ns / value',
+        `fieldNamespace` varchar(255) DEFAULT '',
+        `objectNamespace` varchar(255) DEFAULT '',
+        `value` varchar(255) DEFAULT '',
+        `label` varchar(255) DEFAULT '',
+        `isActive` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'installed',
+        KEY `objectNamespace` (`objectNamespace`),
+        KEY `fieldNamespace` (`fieldNamespace`),
+        KEY `isActive` (isActive)
+      ) ENGINE=MyISAM  DEFAULT CHARSET=latin2
+    ");
     DB::getPDO()->update($this->_rootTableName, 'objectNamespace', $namespace, ['isActive' => 0]);
+    DB::getPDO()->update("{$this->_rootTableName}_enum", 'objectNamespace', $namespace, ['isActive' => 0]);
     $sysObjectStorage = SchemaFactory::loadDefaultObject('SystemObject');
     if (!$namespace) throw new Exception("Missing namespace '{$namespace}'");
     $objectItem = $sysObjectStorage->getItem($namespace);
@@ -176,6 +191,11 @@ class Schema_SystemObjectFieldStorageAcl extends Core_AclSimpleSchemaBase {
 		DBG::nicePrint($xsdType, '$xsdType');
     if (empty($xsdType['struct'])) throw new Exception("Field list not found for '{$item['namespace']}'");
     foreach ($xsdType['struct'] as $fieldName => $x) {
+      $listEnum = [];
+      if (!empty($x['restrictions']['enumeration'])) {
+        $listEnum = $x['restrictions']['enumeration'];
+        unset($x['restrictions']['enumeration']);
+      }
       DB::getPDO()->insertOrUpdate($this->_rootTableName, [
         'namespace' => "{$item['namespace']}/{$fieldName}",
         'objectNamespace' => $item['namespace'],
@@ -188,6 +208,19 @@ class Schema_SystemObjectFieldStorageAcl extends Core_AclSimpleSchemaBase {
         'maxOccurs' => $x['maxOccurs'],
         'isActive' => 1
       ]);
+      if (!empty($listEnum)) {
+        DBG::nicePrint($listEnum, '$listEnum');
+        foreach ($listEnum as $value => $label) {
+          DB::getPDO()->insertOrUpdate("{$this->_rootTableName}_enum", [
+            'namespace' => "{$item['namespace']}/{$fieldName}/@{$value}",
+            'fieldNamespace' => $fieldName,
+            'objectNamespace' => $item['namespace'],
+            'value' => $value,
+            'label' => $label,
+            'isActive' => 1
+          ]);
+        }
+      }
     }
     SchemaFactory::loadDefaultObject('SystemObject')->updateItem([
       'namespace' => $item['namespace'],
@@ -235,6 +268,11 @@ class Schema_SystemObjectFieldStorageAcl extends Core_AclSimpleSchemaBase {
     DBG::nicePrint($xsdInfo, '$xsdInfo');
 
     foreach ($xsdInfo as $fieldName => $x) {
+      $listEnum = [];
+      if (!empty($x['restrictions']['enumeration'])) {
+        $listEnum = $x['restrictions']['enumeration'];
+        unset($x['restrictions']['enumeration']);
+      }
       DB::getPDO()->insertOrUpdate($this->_rootTableName, [
         'namespace' => "{$item['namespace']}/{$fieldName}",
         'fieldNamespace' => $fieldName,
@@ -245,6 +283,19 @@ class Schema_SystemObjectFieldStorageAcl extends Core_AclSimpleSchemaBase {
         'xsdType' => $x['type'],
         'xsdRestrictions' => json_encode($x['restrictions']),
       ]);
+      if (!empty($listEnum)) {
+        DBG::nicePrint($listEnum, '$listEnum');
+        foreach ($listEnum as $value => $label) {
+          DB::getPDO()->insertOrUpdate("{$this->_rootTableName}_enum", [
+            'namespace' => "{$item['namespace']}/{$fieldName}/@{$value}",
+            'fieldNamespace' => $fieldName,
+            'objectNamespace' => $item['namespace'],
+            'value' => $value,
+            'label' => $label,
+            'isActive' => 1
+          ]);
+        }
+      }
     }
     SchemaFactory::loadDefaultObject('SystemObject')->updateItem([
       'namespace' => $item['namespace'],
@@ -453,6 +504,20 @@ class Schema_SystemObjectFieldStorageAcl extends Core_AclSimpleSchemaBase {
   }
 
   public function buildFeatureFromSqlRow($item) {
+    if ('p5:enum' == V::get('xsdType', '', $item)) {
+      $xsdRestrictions = @json_decode($item['xsdRestrictions'], $assoc = true);
+      $xsdRestrictions['enumeration'] = [];
+      foreach (DB::getPDO()->fetchAll("
+        select t.value, t.label
+        from `{$this->_rootTableName}_enum` t
+        where t.objectNamespace = '{$item['objectNamespace']}'
+          and t.fieldNamespace = '{$item['fieldNamespace']}'
+          and t.isActive = 1
+      ") as $enum) {
+        $xsdRestrictions['enumeration'][ $enum['value'] ] = $enum['label'];
+      }
+      $item['xsdRestrictions'] = json_encode($xsdRestrictions);
+    }
     return $item;
   }
 

+ 1 - 1
SE/se-lib/Schema/SystemObjectStorageAcl.php

@@ -364,7 +364,7 @@ class Schema_SystemObjectStorageAcl extends Core_AclSimpleSchemaBase {
     $pkField = $this->getPrimaryKeyField();
     $pk = V::get($pkField, null, $itemPatch);
     if (null === $pk) throw new Exception("BUG missing primary key field for '{$this->_namespace}' updateItem");
-    DBG::log(['TODO: updateItem', $itemPatch]);
+    DBG::log(['updateItem $itemPatch', $itemPatch]);
     unset($itemPatch[$pkField]);
     if (empty($itemPatch)) return 0;
     foreach ($itemPatch as $fieldName => $value) {