SystemSourceStorageAcl.php 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  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}.inc.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. {
  55. $fun = include $file;
  56. if (!is_callable($fun)) throw new Exception("Config func is not callable");
  57. $conf = $fun('secret-p5-password');
  58. }
  59. if (!$conf) continue;
  60. if (in_array(V::get('type', '', $conf), ['mysql', 'pgsql', 'mssql'])) {
  61. DB::getPDO()->insertOrUpdate($this->_rootTableName, [
  62. 'idZasob' => $idZasob,
  63. 'nsPrefix' => "zasob_{$idZasob}",
  64. 'name' => V::get('database', $idZasob, $conf),
  65. 'hasConfig' => 1,
  66. '@insert' => [
  67. 'A_RECORD_CREATE_AUTHOR' => User::getLogin(),
  68. 'A_RECORD_CREATE_DATE' => 'NOW()',
  69. ],
  70. '@update' => [
  71. 'A_RECORD_UPDATE_AUTHOR' => User::getLogin(),
  72. 'A_RECORD_UPDATE_DATE' => 'NOW()',
  73. ]
  74. ]);
  75. }
  76. // DBG::nicePrint(implode("\n", array_map( hideConfPass, explode("\n", var_export($conf, true)) ) ), '$conf');
  77. }
  78. foreach (glob(APP_PATH_CONFIG . "/.cnf--zasob_*-{$host}.ini.php", GLOB_NOSORT) as $file) {
  79. $fname = basename($file);
  80. // DBG::nicePrint($fname, '$fname');
  81. $idZasob = (int)substr($fname, strlen('.cnf--zasob_'), strpos($fname, '-', strlen('.cnf--zasob_') + 1) - strlen('.cnf--zasob_'));// '.cnf--zasob_931-...'
  82. // DBG::nicePrint($idZasob, '$idZasob');
  83. if (!$idZasob) continue;
  84. $conf = parse_ini_file($file, true);
  85. if (!$conf) continue;
  86. if (in_array(V::get('type', '', $conf), ['mysql', 'pgsql', 'mssql'])) {
  87. DB::getPDO()->insertOrUpdate($this->_rootTableName, [
  88. 'idZasob' => $idZasob,
  89. 'nsPrefix' => "zasob_{$idZasob}",
  90. 'name' => V::get('database', $idZasob, $conf),
  91. 'hasConfig' => 1,
  92. '@insert' => [
  93. 'A_RECORD_CREATE_AUTHOR' => User::getLogin(),
  94. 'A_RECORD_CREATE_DATE' => 'NOW()',
  95. ],
  96. '@update' => [
  97. 'A_RECORD_UPDATE_AUTHOR' => User::getLogin(),
  98. 'A_RECORD_UPDATE_DATE' => 'NOW()',
  99. ]
  100. ]);
  101. }
  102. // DBG::nicePrint(implode("\n", array_map( hideConfPass, explode("\n", var_export($conf, true)) ) ), '$conf');
  103. }
  104. // source from CRM_LISTA_ZASOBOW
  105. foreach (DB::getPDO()->fetchAll("
  106. select z.`ID`, z.`DESC`, z.OPIS
  107. from CRM_LISTA_ZASOBOW z
  108. where z.`TYPE` in ('BAZA_DANYCH', 'DATABASE_MYSQL', 'DATABASE_POSTGRESQL')
  109. and z.A_STATUS not in ('DELETED')
  110. ") as $item) {
  111. $desc = V::get('DESC', $item['ID'], $item);
  112. DB::getPDO()->insertOrUpdate($this->_rootTableName, [
  113. 'idZasob' => $item['ID'],
  114. 'nsPrefix' => "zasob_{$item['ID']}",
  115. 'name' => $desc,
  116. 'description' => V::get('OPIS', $desc, $item),
  117. '@insert' => [
  118. 'A_RECORD_CREATE_AUTHOR' => User::getLogin(),
  119. 'A_RECORD_CREATE_DATE' => 'NOW()',
  120. 'hasConfig' => 0,
  121. ],
  122. '@update' => [
  123. 'A_RECORD_UPDATE_AUTHOR' => User::getLogin(),
  124. 'A_RECORD_UPDATE_DATE' => 'NOW()',
  125. ]
  126. ]);
  127. }
  128. $idMainDb = DB::getPDO()->getZasobId();
  129. DB::getPDO()->update($this->_rootTableName, 'idZasob', $idMainDb, [
  130. 'nsPrefix' => 'default_db'
  131. ]);
  132. // default_objects: StorageAcl, AntAcl, ...
  133. $id = DB::getPDO()->fetchValue(" select idZasob from `{$this->_rootTableName}` where name = 'default_objects' ");
  134. if (!$id) {
  135. $item = DB::getPDO()->fetchFirst("
  136. select z.`ID`
  137. from CRM_LISTA_ZASOBOW z
  138. where z.`TYPE` in ('BAZA_DANYCH')
  139. and z.A_STATUS not in ('DELETED')
  140. and z.`DESC` = 'default_objects'
  141. ");
  142. if ($item) {
  143. $id = $item['ID'];
  144. } else {
  145. $idMainDbParent = DB::getPDO()->fetchValue(" select PARENT_ID from CRM_LISTA_ZASOBOW where ID = '" . DB::getPDO()->getZasobId() . "' ");
  146. $id = DB::getPDO()->insert('CRM_LISTA_ZASOBOW', [
  147. 'DESC' => 'default_objects',
  148. 'TYPE' => 'BAZA_DANYCH',
  149. 'OPIS' => "Obiekty systemowe",
  150. 'PARENT_ID' => $idMainDbParent,
  151. 'A_RECORD_CREATE_AUTHOR' => User::getLogin(),
  152. 'A_RECORD_CREATE_DATE' => 'NOW()',
  153. 'A_ADM_COMPANY' => 'system',// edit not allowed
  154. ]);
  155. }
  156. }
  157. if (!$id) throw new Exception("Missing default_objects ID");
  158. DB::getPDO()->insertOrUpdate($this->_rootTableName, [
  159. 'idZasob' => $id,
  160. 'nsPrefix' => 'default_objects',
  161. 'name' => 'default_objects',
  162. 'description' => "Obiekty systemowe",
  163. 'hasConfig' => 1,
  164. '@insert' => [
  165. 'A_RECORD_CREATE_AUTHOR' => User::getLogin(),
  166. 'A_RECORD_CREATE_DATE' => 'NOW()',
  167. ],
  168. '@update' => [
  169. 'A_RECORD_UPDATE_AUTHOR' => User::getLogin(),
  170. 'A_RECORD_UPDATE_DATE' => 'NOW()',
  171. ]
  172. ]);
  173. }
  174. public function getTotal($params = []) {
  175. return DB::getPDO()->fetchValue(" select count(1) as cnt from `{$this->_rootTableName}` ");
  176. }
  177. public function getItem($pk, $params = []) {
  178. $sqlPk = DB::getPDO()->quote($pk, PDO::PARAM_INT);
  179. $item = DB::getPDO()->fetchFirst("
  180. select t.*
  181. from `{$this->_rootTableName}` t
  182. where t.idZasob = {$sqlPk}
  183. ");
  184. return $item;
  185. }
  186. public function getItems($params = []) {
  187. $sqlWhere = [];
  188. if (array_key_exists('f_hasConfig', $params)) {
  189. $sqlWhere[] = "t.hasConfig = " . DB::getPDO()->convertValueToSqlSafe($params['f_hasConfig']);
  190. }
  191. $sqlWhere = (!empty($sqlWhere)) ? "where " . implode(" and ", $sqlWhere) : "";
  192. $items = DB::getPDO()->fetchAll("
  193. select t.*
  194. from `{$this->_rootTableName}` t
  195. {$sqlWhere}
  196. ");
  197. $currSortCol = V::get('order_by', 'ID', $params);
  198. $currSortFlip = strtolower(V::get('order_dir', 'desc', $params));
  199. // TODO: validate $currSortCol is in field list
  200. // TODO: validate $currSortFlip ('asc' or 'desc')
  201. $aliasMap = array();
  202. foreach ($this->_simpleSchema['root'] as $key => $field) {
  203. if ('@' === substr($key, 0, 1)) continue;
  204. $aliasMap[ $key ] = $key;// (!empty($field['@alias'])) ? $field['@alias'] : $key;
  205. }
  206. // TODO: if (!array_key_exists($currSortCol, $aliasMap)) throw new Exception("field name not allowed to sort");
  207. $currSortCol = (array_key_exists($currSortCol, $aliasMap)) ? $aliasMap[$currSortCol] : null;
  208. if (!empty($currSortCol) && ('asc' == $currSortFlip || 'desc' == $currSortFlip)) {
  209. usort($items, function ($itemA, $itemB) use ($currSortCol, $currSortFlip) {
  210. $a = strtolower(V::get($currSortCol, '', $itemA));
  211. $b = strtolower(V::get($currSortCol, '', $itemB));
  212. if ($a == $b) return 0;
  213. else if ('asc' == $currSortFlip) return ($a < $b) ? -1 : 1;
  214. else if ('desc' == $currSortFlip) return ($a > $b) ? -1 : 1;
  215. throw new Exception("BUG - Wrong sort param - order dir");
  216. });
  217. }
  218. $limit = V::get('limit', 0, $params);
  219. $limit = ($limit < 0) ? 0 : $limit;
  220. $offset = V::get('limitstart', 0, $params);
  221. $offset = ($offset < 0) ? 0 : $offset;
  222. return array_slice($items, $offset, ($limit > 0) ? $limit : null, $preserve_keys = true);
  223. }
  224. }