SystemSourceStorageAcl.php 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. <?php
  2. Lib::loadClass('Core_AclSimpleSchemaBase');
  3. Lib::loadClass('ParseOgcFilter');
  4. class Schema_SystemSourceStorageAcl extends Core_AclSimpleSchemaBase {
  5. public $_simpleSchema = [
  6. 'root' => [
  7. '@namespace' => 'default_objects/SystemSource',
  8. '@primaryKey' => 'idZasob',
  9. 'idZasob' => [ '@type' => 'xsd:integer' ],
  10. 'nsPrefix' => [ '@type' => 'xsd:string' ],
  11. 'name' => [ '@type' => 'xsd:string' ],
  12. 'description' => [ '@type' => 'xsd:string' ],
  13. 'A_RECORD_CREATE_AUTHOR' => [ '@type' => 'xsd:string' , '@label' => 'autor' ],
  14. 'A_RECORD_CREATE_DATE' => [ '@type' => 'xsd:date' , '@label' => 'utworzono' ],
  15. 'A_RECORD_UPDATE_AUTHOR' => [ '@type' => 'xsd:string' , '@label' => 'zaktualizował' ],
  16. 'A_RECORD_UPDATE_DATE' => [ '@type' => 'xsd:date', '@label' => 'zaktualizowano' ],
  17. 'SystemObject' => [ '@ref' => 'default_objects/SystemObject', '@maxOccurs' => 'unbounded' ]
  18. ]
  19. ];
  20. public $_rootTableName = 'CRM_#CACHE_ACL_SOURCE';
  21. public $_version = '1';
  22. public function updateCache() {
  23. DBG::simpleLog('schema', "SystemSource::updateCache...");
  24. // DB::getPDO()->execSql(" drop table if exists `{$this->_rootTableName}` "); // TODO: DBG
  25. DB::getPDO()->execSql("
  26. create table if not exists `{$this->_rootTableName}` (
  27. `idZasob` int(11) NOT NULL,
  28. `nsPrefix` varchar(255) DEFAULT '',
  29. `name` varchar(255) DEFAULT '',
  30. `description` varchar(255) DEFAULT '',
  31. `hasConfig` tinyint(1) DEFAULT 0,
  32. `A_RECORD_CREATE_AUTHOR` varchar(20) NOT NULL,
  33. `A_RECORD_CREATE_DATE` datetime DEFAULT NULL,
  34. `A_RECORD_UPDATE_AUTHOR` varchar(20) NOT NULL DEFAULT '',
  35. `A_RECORD_UPDATE_DATE` datetime DEFAULT NULL,
  36. UNIQUE KEY `idZasob` (idZasob)
  37. ) ENGINE=MyISAM DEFAULT CHARSET=latin2
  38. ");
  39. // database from config files
  40. $host = V::get('SERVER_NAME', '', $_SERVER);
  41. if (!$host) die('Missing SERVER_NAME!');
  42. function hideConfPass($line) {
  43. if (false !== ($pos = strpos($line, "pass' =>"))) {
  44. return substr($line, 0, $pos + 9) . "*****";
  45. }
  46. return $line;
  47. }
  48. foreach (glob(APP_PATH_CONFIG . "/.cnf--zasob_*-{$host}.ini.php", GLOB_NOSORT) as $file) {
  49. $fname = basename($file);
  50. // DBG::nicePrint($fname, '$fname');
  51. $idZasob = (int)substr($fname, strlen('.cnf--zasob_'), strpos($fname, '-', strlen('.cnf--zasob_') + 1) - strlen('.cnf--zasob_'));// '.cnf--zasob_931-...'
  52. // DBG::nicePrint($idZasob, '$idZasob');
  53. if (!$idZasob) continue;
  54. $conf = parse_ini_file($file, true);
  55. if (!$conf) continue;
  56. if (in_array(V::get('type', '', $conf), ['mysql', 'pgsql', 'mssql'])) {
  57. DB::getPDO()->insertOrUpdate($this->_rootTableName, [
  58. 'idZasob' => $idZasob,
  59. 'nsPrefix' => "zasob_{$idZasob}",
  60. 'name' => V::get('database', $idZasob, $conf),
  61. 'hasConfig' => 1,
  62. '@insert' => [
  63. 'A_RECORD_CREATE_AUTHOR' => User::getLogin(),
  64. 'A_RECORD_CREATE_DATE' => 'NOW()',
  65. ],
  66. '@update' => [
  67. 'A_RECORD_UPDATE_AUTHOR' => User::getLogin(),
  68. 'A_RECORD_UPDATE_DATE' => 'NOW()',
  69. ]
  70. ]);
  71. }
  72. // DBG::nicePrint(implode("\n", array_map( hideConfPass, explode("\n", var_export($conf, true)) ) ), '$conf');
  73. }
  74. // source from CRM_LISTA_ZASOBOW
  75. foreach (DB::getPDO()->fetchAll("
  76. select z.`ID`, z.`DESC`, z.OPIS
  77. from CRM_LISTA_ZASOBOW z
  78. where z.`TYPE` in ('BAZA_DANYCH', 'DATABASE_MYSQL', 'DATABASE_POSTGRESQL')
  79. and z.A_STATUS not in ('DELETED')
  80. ") as $item) {
  81. $desc = V::get('DESC', $item['ID'], $item);
  82. DB::getPDO()->insertOrUpdate($this->_rootTableName, [
  83. 'idZasob' => $item['ID'],
  84. 'nsPrefix' => "zasob_{$item['ID']}",
  85. 'name' => $desc,
  86. 'description' => V::get('OPIS', $desc, $item),
  87. '@insert' => [
  88. 'A_RECORD_CREATE_AUTHOR' => User::getLogin(),
  89. 'A_RECORD_CREATE_DATE' => 'NOW()',
  90. 'hasConfig' => 0,
  91. ],
  92. '@update' => [
  93. 'A_RECORD_UPDATE_AUTHOR' => User::getLogin(),
  94. 'A_RECORD_UPDATE_DATE' => 'NOW()',
  95. ]
  96. ]);
  97. }
  98. $idMainDb = DB::getPDO()->getZasobId();
  99. DB::getPDO()->update($this->_rootTableName, 'idZasob', $idMainDb, [
  100. 'nsPrefix' => 'default_db'
  101. ]);
  102. // default_objects: StorageAcl, AntAcl, ...
  103. $id = DB::getPDO()->fetchValue(" select idZasob from `{$this->_rootTableName}` where name = 'default_objects' ");
  104. if (!$id) {
  105. $item = DB::getPDO()->fetchFirst("
  106. select z.`ID`
  107. from CRM_LISTA_ZASOBOW z
  108. where z.`TYPE` in ('BAZA_DANYCH')
  109. and z.A_STATUS not in ('DELETED')
  110. and z.`DESC` = 'default_objects'
  111. ");
  112. if ($item) {
  113. $id = $item['ID'];
  114. } else {
  115. $idMainDbParent = DB::getPDO()->fetchValue(" select PARENT_ID from CRM_LISTA_ZASOBOW where ID = '" . DB::getPDO()->getZasobId() . "' ");
  116. $id = DB::getPDO()->insert('CRM_LISTA_ZASOBOW', [
  117. 'DESC' => 'default_objects',
  118. 'TYPE' => 'BAZA_DANYCH',
  119. 'OPIS' => "Obiekty systemowe",
  120. 'PARENT_ID' => $idMainDbParent,
  121. 'A_RECORD_CREATE_AUTHOR' => User::getLogin(),
  122. 'A_RECORD_CREATE_DATE' => 'NOW()',
  123. 'A_ADM_COMPANY' => 'system',// edit not allowed
  124. ]);
  125. }
  126. }
  127. if (!$id) throw new Exception("Missing default_objects ID");
  128. DB::getPDO()->insertOrUpdate($this->_rootTableName, [
  129. 'idZasob' => $id,
  130. 'nsPrefix' => 'default_objects',
  131. 'name' => 'default_objects',
  132. 'description' => "Obiekty systemowe",
  133. 'hasConfig' => 1,
  134. '@insert' => [
  135. 'A_RECORD_CREATE_AUTHOR' => User::getLogin(),
  136. 'A_RECORD_CREATE_DATE' => 'NOW()',
  137. ],
  138. '@update' => [
  139. 'A_RECORD_UPDATE_AUTHOR' => User::getLogin(),
  140. 'A_RECORD_UPDATE_DATE' => 'NOW()',
  141. ]
  142. ]);
  143. }
  144. public function getTotal($params = []) {
  145. return DB::getPDO()->fetchValue(" select count(1) as cnt from `{$this->_rootTableName}` ");
  146. }
  147. public function getItem($pk, $params = []) {
  148. $sqlPk = DB::getPDO()->quote($pk, PDO::PARAM_INT);
  149. $item = DB::getPDO()->fetchFirst("
  150. select t.*
  151. from `{$this->_rootTableName}` t
  152. where t.idZasob = {$sqlPk}
  153. ");
  154. return $item;
  155. }
  156. public function getItems($params = []) {
  157. $sqlWhere = [];
  158. if (array_key_exists('f_hasConfig', $params)) {
  159. $sqlWhere[] = "t.hasConfig = " . DB::getPDO()->convertValueToSqlSafe($params['f_hasConfig']);
  160. }
  161. $sqlWhere = (!empty($sqlWhere)) ? "where " . implode(" and ", $sqlWhere) : "";
  162. $items = DB::getPDO()->fetchAll("
  163. select t.*
  164. from `{$this->_rootTableName}` t
  165. {$sqlWhere}
  166. ");
  167. $currSortCol = V::get('order_by', 'ID', $params);
  168. $currSortFlip = strtolower(V::get('order_dir', 'desc', $params));
  169. // TODO: validate $currSortCol is in field list
  170. // TODO: validate $currSortFlip ('asc' or 'desc')
  171. $aliasMap = array();
  172. foreach ($this->_simpleSchema['root'] as $key => $field) {
  173. if ('@' === substr($key, 0, 1)) continue;
  174. $aliasMap[ $key ] = $key;// (!empty($field['@alias'])) ? $field['@alias'] : $key;
  175. }
  176. // TODO: if (!array_key_exists($currSortCol, $aliasMap)) throw new Exception("field name not allowed to sort");
  177. $currSortCol = (array_key_exists($currSortCol, $aliasMap)) ? $aliasMap[$currSortCol] : null;
  178. if (!empty($currSortCol) && ('asc' == $currSortFlip || 'desc' == $currSortFlip)) {
  179. usort($items, function ($itemA, $itemB) use ($currSortCol, $currSortFlip) {
  180. $a = strtolower(V::get($currSortCol, '', $itemA));
  181. $b = strtolower(V::get($currSortCol, '', $itemB));
  182. if ($a == $b) return 0;
  183. else if ('asc' == $currSortFlip) return ($a < $b) ? -1 : 1;
  184. else if ('desc' == $currSortFlip) return ($a > $b) ? -1 : 1;
  185. throw new Exception("BUG - Wrong sort param - order dir");
  186. });
  187. }
  188. $limit = V::get('limit', 0, $params);
  189. $limit = ($limit < 0) ? 0 : $limit;
  190. $offset = V::get('limitstart', 0, $params);
  191. $offset = ($offset < 0) ? 0 : $offset;
  192. return array_slice($items, $offset, ($limit > 0) ? $limit : null, $preserve_keys = true);
  193. }
  194. }