getStorageList(); if (empty($storageList)) throw new Exception("No storage defined"); $storageMenu = array(); foreach ($storageList as $storage) { $menuItem = array(); $menuItem['id'] = $id = $storage['ID']; $menuItem['nazwa'] = $storage['DESC']; $menuItem['typ'] = $storage['TYPE']; $menuItem['tabele i widoki'] = '' . "tabele" . ''; //$menuItem['views'] = '' . "views" . ''; $menuItem['raw info'] = '' . "raw info" . ''; $menuItem['xsd'] = '' . "xsd" . ''; $storageMenu[] = $menuItem; } $this->navView(); DBG::table("storageMenu", $storageMenu, __CLASS__, __FUNCTION__, __LINE__); } catch (Exception $e) { SE_Layout::alert('danger', "Error #" . $e->getCode() . "|" . $e->getLine() . ": " . $e->getMessage()); } SE_Layout::dol(); } public function tableListAction() { SE_Layout::gora(); SE_Layout::menu(); try { $idStorage = V::get('idStorage', 0, $_REQUEST, 'int'); if (empty($idStorage)) throw new Exception("No id storage"); $storageList = $this->getStorageList(); if (empty($storageList)) throw new Exception("No storage defined"); if (!array_key_exists($idStorage, $storageList)) throw new Exception("No id storage not exists"); $this->navView(); $storagePdo = DB::getStorage($idStorage); $viewRealList = $storagePdo->getViewList(); $tableRealList = $storagePdo->getTableList(); $tableZasobList = array(); foreach (DB::getPDO()->fetchAllByKey(" select z.ID, z.`DESC`, z.A_STATUS from CRM_LISTA_ZASOBOW z where z.PARENT_ID = '{$idStorage}' ", $key = 'DESC') as $ind => $row) { $tableZasobList[strtolower($ind)] = $row; } $emptyItem = array(); $emptyItem['nazwa'] = '';//->urlTblStruct = $this->buildActionUrl('tableStruct', array('storageId'=>$storageId, 'tblName'=>$tblName)); $emptyItem['type'] = ''; $emptyItem['dodaj zasób'] = '';//->urlTblAddToZasoby = $this->buildAjaxActionUrl('addTableToZasoby', $urlParams); $emptyItem['struktura'] = '';//->urlTblRawStruct = $this->buildActionUrl('tableStructRaw', array('storageId'=>$storageId, 'tblName'=>$tblName)); $emptyItem['objectTest'] = '';//->urlObjectTest = $this->buildActionUrl('objectTest', array('storageId'=>$storageId, 'tblName'=>$tblName)); $emptyItem['xsd'] = '';//->urlTableXsd = $this->buildActionUrl('tableXsd', array('storageId'=>$storageId, 'tblName'=>$tblName, 'HEADER_NOT_INIT'=>'YES')); $emptyItem['id_zasob'] = '';//->zasobId = $zasobTableId; $emptyItem['isHist'] = '';//->isHistTable = ('_HIST' == substr($tblName, -5)) ? true : false; $emptyItem['uwagi'] = ''; $tableList = array(); foreach ($tableRealList as $row) { $tblName = $row['table_name']; $tblItem = V::cloneArray($emptyItem); $tblItem['nazwa'] = $tblName; $tblItem['type'] = $row['table_type']; $tblItem['struktura'] = '' . "struct" . ''; $tblItem['xsd'] = '' . "xsd" . ''; $tblItem['objectTest'] = '' . "objectTest" . ''; $tblItem['isHist'] = ('_hist' == substr($tblName, -5)); $tblItem['uwagi'] = ''; $tblZasob = V::get($tblName, '', $tableZasobList); if ($tblZasob) { $tableZasobList[$tblName]['_checked'] = true; $tblItem['id_zasob'] = $tblZasob['ID']; } else { $tblItem['uwagi'] .= 'TODO: ADD ZASOB'; $tblItem['dodaj zasób'] = 'TODO: ADD ZASOB'; } $tableList[] = $tblItem; } foreach ($viewRealList as $row) { $tblName = $row['table_name']; $tblItem = V::cloneArray($emptyItem); $tblItem['nazwa'] = $tblName; $tblItem['type'] = $row['table_type']; $tblItem['struktura'] = '' . "struct" . ''; $tblItem['uwagi'] = ''; $tblZasob = V::get($tblName, '', $tableZasobList); if ($tblZasob) { $tableZasobList[$tblName]['_checked'] = true; $tblItem['id_zasob'] = $tblZasob['ID']; } else { $tblItem['uwagi'] .= 'TODO: ADD ZASOB'; $tblItem['dodaj zasób'] = 'TODO: ADD ZASOB'; } $tableList[] = $tblItem; } foreach ($tableZasobList as $tblName => $row) { if (!$row['_checked']) { $tblItem = V::cloneArray($emptyItem); $tblItem['nazwa'] = $tblName; $tblItem['id_zasob'] = $row['ID']; $tblItem['type'] = 'unknown'; $tblItem['uwagi'] = 'TODO: nie istnieje w bazie danych'; $tableList[] = $tblItem; } } DBG::table("tableList", $tableList, __CLASS__, __FUNCTION__, __LINE__); } catch (Exception $e) { SE_Layout::alert('danger', "Error #" . $e->getCode() . "|" . $e->getLine() . ": " . $e->getMessage()); } SE_Layout::dol(); } public function rawInfoAction() { SE_Layout::gora(); SE_Layout::menu(); try { $idStorage = V::get('idStorage', 0, $_REQUEST, 'int'); if (empty($idStorage)) throw new Exception("No id storage"); $storageList = $this->getStorageList(); if (empty($storageList)) throw new Exception("No storage defined"); if (!array_key_exists($idStorage, $storageList)) throw new Exception("No id storage not exists"); $this->navView(); $storagePdo = DB::getStorage($idStorage); $rawInfo = $storagePdo->getTableListWithInfo(); DBG::table("rawInfo", $rawInfo, __CLASS__, __FUNCTION__, __LINE__); } catch (Exception $e) { SE_Layout::alert('danger', "Error #" . $e->getCode() . "|" . $e->getLine() . ": " . $e->getMessage()); } SE_Layout::dol(); } public function tableStructAction() { SE_Layout::gora(); SE_Layout::menu(); try { $idStorage = V::get('idStorage', 0, $_REQUEST, 'int'); if (empty($idStorage)) throw new Exception("No id storage"); $storageList = $this->getStorageList(); if (empty($storageList)) throw new Exception("No storage defined"); if (!array_key_exists($idStorage, $storageList)) throw new Exception("No id storage not exists"); $tblName = V::get('table', '', $_REQUEST, 'word'); if (empty($tblName)) throw new Exception("No table name"); $this->navView(); $storagePdo = DB::getStorage($idStorage); $tblStruct = $storagePdo->getTableStruct($tblName); DBG::table("tblStruct", $tblStruct, __CLASS__, __FUNCTION__, __LINE__); } catch (Exception $e) { SE_Layout::alert('danger', "Error #" . $e->getCode() . "|" . $e->getLine() . ": " . $e->getMessage()); } SE_Layout::dol(); } public function xsdAction() { $idStorage = V::get('idStorage', 0, $_REQUEST, 'int'); $storage = DB::getStorage($idStorage); $tableRealList = $storage->getTableList(); $srvName = $_SERVER['SERVER_NAME']; $storageZasobId = $storage->getZasobId(); $objNs = "p5_{$storageZasobId}_{$tblName}"; $objNsUri = "https://biuro.biall-net.pl/api/{$storageZasobId}/{$tblName}"; $p5TypePrefix = "p5Type"; $p5TypeNsUri = "http://biuro.biall-net.pl/p5/schema/types"; $p5TypeNsLocation = "http://biuro.biall-net.pl/p5/schema/types.xsd"; header('Content-type: text/plain; charset=utf-8');// TODO: test //header('Content-type: application/xml; charset=utf-8'); $xmlWriter = new XMLWriter(); $xmlWriter->openUri('php://output'); $xmlWriter->setIndent(true); if (!$xmlWriter) throw new HttpException("Error no XMLWriter", 404); $xmlWriter->startDocument('1.0', 'UTF-8'); $xmlWriter->startElement('xs:schema'); $xmlWriter->writeAttribute('xmlns:xs', 'http://www.w3.org/2001/XMLSchema'); $xmlWriter->writeAttribute('xmlns:vc', 'http://www.w3.org/2007/XMLSchema-versioning'); $xmlWriter->writeAttribute("xmlns:{$p5TypePrefix}", $p5TypeNsUri); $xmlWriter->writeAttribute('elementFormDefault', 'qualified'); $xmlWriter->writeAttribute('targetNamespace', $objNsUri); $xmlWriter->writeAttribute('vc:minVersion', '1.1'); $xmlWriter->startElement('xs:import'); $xmlWriter->writeAttribute('namespace', $p5TypeNsUri); $xmlWriter->writeAttribute('schemaLocation', $p5TypeNsLocation); $xmlWriter->endElement();// xs:import foreach ($tableRealList as $tbl) { $tblName = $tbl['table_name']; $this->tableXsdViewXmlWriter($xmlWriter, $idStorage, $tblName); } $xmlWriter->endElement();// xs:schema $xmlWriter->endDocument(); } public function tableXsdAction() { $idStorage = V::get('idStorage', '', $_GET); $tblName = V::get('table', '', $_GET, 'word'); if (empty($tblName)) die("Wrong table name"); header('Content-type: text/plain; charset=utf-8');// TODO: test $storage = DB::getStorage($idStorage); $storageZasobId = $storage->getZasobId(); $objNs = "p5_{$storageZasobId}_{$tblName}"; $objNsUri = "https://biuro.biall-net.pl/api/{$storageZasobId}/{$tblName}"; $p5TypePrefix = "p5Type"; $p5TypeNsUri = "http://biuro.biall-net.pl/p5/schema/types"; $p5TypeNsLocation = "http://biuro.biall-net.pl/p5/schema/types.xsd"; //header('Content-type: application/xml; charset=utf-8'); $xmlWriter = new XMLWriter(); $xmlWriter->openUri('php://output'); $xmlWriter->setIndent(true); if (!$xmlWriter) throw new HttpException("Error no XMLWriter", 404); $xmlWriter->startDocument('1.0', 'UTF-8'); $xmlWriter->startElement('xs:schema'); $xmlWriter->writeAttribute('xmlns:xs', 'http://www.w3.org/2001/XMLSchema'); $xmlWriter->writeAttribute('xmlns:vc', 'http://www.w3.org/2007/XMLSchema-versioning'); $xmlWriter->writeAttribute("xmlns:{$p5TypePrefix}", $p5TypeNsUri); $xmlWriter->writeAttribute('elementFormDefault', 'qualified'); $xmlWriter->writeAttribute('targetNamespace', $objNsUri); $xmlWriter->writeAttribute('vc:minVersion', '1.1'); $xmlWriter->startElement('xs:import'); $xmlWriter->writeAttribute('namespace', $p5TypeNsUri); $xmlWriter->writeAttribute('schemaLocation', $p5TypeNsLocation); $xmlWriter->endElement();// xs:import $this->tableXsdViewXmlWriter($xmlWriter, $idStorage, $tblName); $xmlWriter->endElement();// xs:schema $xmlWriter->endDocument(); } public function tableXsdViewXmlWriter(&$xmlWriter, $idStorage, $tblName) { $storage = DB::getStorage($idStorage); $schema = Schema_TableFactory::build($tblName, $idStorage, $_SERVER['SERVER_NAME']); $struct = $schema->getStruct(); DBG::_('DBG', '>1', "struct", $struct, __CLASS__, __FUNCTION__, __LINE__); $typeName = "{$tblName}Type"; $xmlWriter->startElement('xs:complexType'); $xmlWriter->writeAttribute('name', $typeName); $xmlWriter->startElement('xs:sequence'); foreach ($struct as $field) { $xmlWriter->startElement('xs:element'); $xmlWriter->writeAttribute('name', $field['name']); $xmlWriter->writeAttribute('minOccurs', 0);// TODO: set minOccurs by default, etc. if ($field['is_nullable']) $xmlWriter->writeAttribute('nillable', 'true'); if (null !== $field['default_value']) { $xmlWriter->writeAttribute('default', $field['default_value']); } else if (null === $field['default_value'] && $field['is_nullable']) { $xmlWriter->writeAttribute('default', $field['default_value']); } else { // TODO: Schema BUG? } if (empty($field['p5_restrictions'])) { $xmlWriter->writeAttribute('type', "p5Type:{$field['p5_type']}"); } else { $xmlWriter->startElement('xs:simpleType'); $xmlWriter->writeAttribute('base', "p5Type:{$field['p5_type']}"); $xmlWriter->startElement('xs:restriction'); if (!empty($field['p5_restrictions']['enumeration'])) { foreach ($field['p5_restrictions']['enumeration'] as $enumValue) { $xmlWriter->startElement('xs:enumeration'); $xmlWriter->writeAttribute('value', $enumValue); $xmlWriter->endElement();// xs:enumeration } } else { // TODO: another restrictions... } $xmlWriter->endElement();// xs:restriction $xmlWriter->endElement();// xs:simpleType } $xmlWriter->endElement();// xs:element } $xmlWriter->endElement();// xs:sequence $xmlWriter->endElement();// xs:complexType return; // $pKeyField = 'ID';//$storageObject->getPrimaryKeyFieldName(); //DBG::_(true, true, "struct", $struct, __CLASS__, __FUNCTION__, __LINE__); foreach ($struct as $field) { $fldName = $vField->getName(); $fldType = $vField->getType(); $xsdType = $fldType->getTypeForXsd(); if ($fldType->hasDefault()) { $fldDefault = $fldType->getDefault(); if (!empty($fldDefault) || '0' === $fldDefault) { $elNode->setAttribute('default', $fldDefault); } } $fldRestrictions = $fldType->getRestrictions(); if (empty($fldRestrictions)) { $elNode->setAttribute('type', "{$p5TypePrefix}:{$xsdType}"); } else { $sType = $dom->createElementNS('http://www.w3.org/2001/XMLSchema', 'xs:simpleType'); $elNode->appendChild($sType); $sTypeRes = $dom->createElementNS('http://www.w3.org/2001/XMLSchema', 'xs:restriction'); $sType->appendChild($sTypeRes); $sTypeRes->setAttribute('base', "{$p5TypePrefix}:{$xsdType}"); $enumList = $fldType->getEnumeration(); if (empty($enumList)) { foreach ($fldRestrictions as $restricionName => $restrictionValue) { if ('maxLength' == $restricionName) { $sTypeResMaxLength = $dom->createElementNS('http://www.w3.org/2001/XMLSchema', 'xs:maxLength'); $sTypeRes->appendChild($sTypeResMaxLength); $sTypeResMaxLength->setAttribute('value', $restrictionValue); } else if ('minLength' == $restricionName) { $sTypeResMinLength = $dom->createElementNS('http://www.w3.org/2001/XMLSchema', 'xs:minLength'); $sTypeRes->appendChild($sTypeResMinLength); $sTypeResMinLength->setAttribute('value', $restrictionValue); } else if ('pattern' == $restricionName) { $sTypeResPattern = $dom->createElementNS('http://www.w3.org/2001/XMLSchema', 'xs:pattern'); $sTypeRes->appendChild($sTypeResPattern); $sTypeResPattern->setAttribute('value', $restrictionValue); } else if ('fractionDigits' == $restricionName) { $sTypeResFractionDigits = $dom->createElementNS('http://www.w3.org/2001/XMLSchema', 'xs:fractionDigits'); $sTypeRes->appendChild($sTypeResFractionDigits); $sTypeResFractionDigits->setAttribute('value', $restrictionValue); } else if ('totalDigits' == $restricionName) { $sTypeResTotalDigits = $dom->createElementNS('http://www.w3.org/2001/XMLSchema', 'xs:totalDigits'); $sTypeRes->appendChild($sTypeResTotalDigits); $sTypeResTotalDigits->setAttribute('value', $restrictionValue); } else if ('maxExclusive' == $restricionName) { $sTypeResMaxExclusive = $dom->createElementNS('http://www.w3.org/2001/XMLSchema', 'xs:maxExclusive'); $sTypeRes->appendChild($sTypeResMaxExclusive); $sTypeResMaxExclusive->setAttribute('value', $restrictionValue); } else if ('minExclusive' == $restricionName) { $sTypeResMinExclusive = $dom->createElementNS('http://www.w3.org/2001/XMLSchema', 'xs:minExclusive'); $sTypeRes->appendChild($sTypeResMinExclusive); $sTypeResMinExclusive->setAttribute('value', $restrictionValue); } else if ('maxInclusive' == $restricionName) { $sTypeResMaxInclusive = $dom->createElementNS('http://www.w3.org/2001/XMLSchema', 'xs:maxInclusive'); $sTypeRes->appendChild($sTypeResMaxInclusive); $sTypeResMaxInclusive->setAttribute('value', $restrictionValue); } else if ('minInclusive' == $restricionName) { $sTypeResMinInclusive = $dom->createElementNS('http://www.w3.org/2001/XMLSchema', 'xs:minInclusive'); $sTypeRes->appendChild($sTypeResMinInclusive); $sTypeResMinInclusive->setAttribute('value', $restrictionValue); } /* TODO: xsd restrictions: enumeration Defines a list of acceptable values fractionDigits Specifies the maximum number of decimal places allowed. Must be equal to or greater than zero length Specifies the exact number of characters or list items allowed. Must be equal to or greater than zero maxExclusive Specifies the upper bounds for numeric values (the value must be less than this value) maxInclusive Specifies the upper bounds for numeric values (the value must be less than or equal to this value) maxLength Specifies the maximum number of characters or list items allowed. Must be equal to or greater than zero minExclusive Specifies the lower bounds for numeric values (the value must be greater than this value) minInclusive Specifies the lower bounds for numeric values (the value must be greater than or equal to this value) minLength Specifies the minimum number of characters or list items allowed. Must be equal to or greater than zero pattern Defines the exact sequence of characters that are acceptable totalDigits Specifies the exact number of digits allowed. Must be greater than zero whiteSpace Specifies how white space (line feeds, tabs, spaces, and carriage returns) is handled */ } } else { foreach ($enumList as $enumValue) { $sTypeResEnum = $dom->createElementNS('http://www.w3.org/2001/XMLSchema', 'xs:enumeration'); $sTypeRes->appendChild($sTypeResEnum); $sTypeResEnum->setAttribute('value', $enumValue); } } } } $elNode = $dom->createElementNS('http://www.w3.org/2001/XMLSchema', 'xs:element'); $rootNode->appendChild($elNode); $elNode->setAttribute('name', $tblName); $elNode->setAttribute('type', "{$objNs}:{$typeName}"); header('Content-type: application/xml'); echo $dom->saveXML(); exit; } public function navView() { $backLabel = 'back'; $backLink = 'index.php?_route=Storage'; $backDisabled = true; $currentLabel = 'Storage'; $currentLink = 'index.php?_route=Storage'; if ($task = V::get('_task', '', $_REQUEST)) { $currentLink = "index.php?_route=Storage&_task={$task}"; $backDisabled = false; $idStorage = V::get('idStorage', 0, $_REQUEST, 'int'); $tblName = V::get('table', '', $_REQUEST, 'word'); switch ($task) { case 'tableList': case 'viewList': case 'rawInfo': $backLabel = 'Storage'; $backLink = 'index.php?_route=Storage'; $currentLink = "index.php?_route=Storage&_task={$task}&idStorage={$idStorage}"; break; case 'tableStruct': $backLabel = "Tabele [{$idStorage}]"; $backLink = "index.php?_route=Storage&_task=tableList&idStorage={$idStorage}"; $currentLink = "index.php?_route=Storage&_task={$task}&idStorage={$idStorage}&table={$tblName}"; break; } switch ($task) { case 'tableList': $currentLabel = "Tabele [{$idStorage}]"; break; case 'viewList': $currentLabel = "Widoki [{$idStorage}]"; break; case 'rawInfo': $currentLabel = "Raw info [{$idStorage}]"; break; case 'tableStruct': $currentLabel = "Struktura tabeli '{$tblName}'"; break; } } ?> prepare(" select z.ID, z.`DESC`, z.`TYPE` from CRM_LISTA_ZASOBOW z where z.TYPE in('BAZA_DANYCH','DATABASE_MYSQL','DATABASE_POSTGRESQL') "); $sth->execute(); $rows = $sth->fetchAll(); foreach ($rows as $row) { $storageList[$row['ID']] = $row; } return $storageList; } }