InstallerHelper.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512
  1. <?php
  2. class InstallerHelper {
  3. /*
  4. //class to support install plugins
  5. // now supports to declare controled tree of objects :
  6. // ROOT
  7. [MYSQL_SCHEMA]
  8. [__SCHEMA_FUNCTIONS__ARRAY__] => Array
  9. (
  10. [FUNCTION] => Array
  11. (
  12. [CRM_LISTA_ZASOBOW_tree_detect_kierownik] => stdClass Object
  13. (
  14. [Function] => CRM_LISTA_ZASOBOW_tree_detect_kierownik
  15. [sql_mode] =>
  16. [Create Function] => CREATE DEFINER=`root`@`localhost` FUNCTION `CRM_LISTA_ZASOBOW_tree_detect_kierownik`(`node` INT) RETURNS text CHARSET latin2
  17. [character_set_client] => latin1
  18. [collation_connection] => latin1_swedish_ci
  19. [Database Collation] => latin2_general_ci
  20. [PROCEDURE] => Array
  21. (
  22. [JOINL3COLUMN] => stdClass Object
  23. (
  24. [Procedure] => JOINL3COLUMN
  25. [sql_mode] =>
  26. [Create Procedure] => string() like CREATE DEFINER=`root`@`localhost` PROCEDURE `JOINL3COLUMN`( TEST_BASE varchar(255), TEST_TABLE varchar(255),
  27. [character_set_client] => latin2
  28. [collation_connection] => latin2_general_ci
  29. [Database Collation] => latin2_general_ci
  30. )
  31. )
  32. )
  33. [TABLES]
  34. [NAME]
  35. [Table_type] => BASE TABLE
  36. [FIELDS] => Array
  37. (
  38. [0] => stdClass Object
  39. (
  40. [Field] => ID (name)
  41. [Type] => int(10)
  42. [Null] => NO
  43. [Key] => PRI
  44. [Default] =>
  45. [Extra] => auto_increment
  46. )
  47. [INDEX] => Array
  48. (
  49. [PRIMARY] => stdClass Object
  50. (
  51. [Table] => BUILDINGS
  52. [Non_unique] => 0
  53. [Key_name] => PRIMARY
  54. [Seq_in_index] => 1
  55. [Column_name] => `ID`
  56. [Collation] => A
  57. [Cardinality] => 1302
  58. [Sub_part] =>
  59. [Packed] =>
  60. [Null] =>
  61. [Index_type] => BTREE
  62. [Comment] =>
  63. )
  64. [VALUES] => Array
  65. (
  66. [0] => stdClass Object
  67. (
  68. [ID] => 1
  69. [NAZWA] => MIANOWNIK
  70. [PYTANIE] => KTO CO
  71. [OPIS] => KTO WYKONUJE
  72. [FORM_TREAT] => X
  73. )
  74. [1] => stdClass Object
  75. (
  76. [ID] => 2
  77. [NAZWA] => DOPEŁNIACZ
  78. [PYTANIE] => KOGO CZEGO
  79. [OPIS] => KOGO CZEGO
  80. [FORM_TREAT] => R
  81. )
  82. [_CRM_PROCES_USER_STATS_wiev] => Array
  83. (
  84. [Table_type] => VIEW
  85. [VIEW] => stdClass Object
  86. (
  87. [View] => _CRM_PROCES_USER_STATS_wiev
  88. [Create View] => CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `_CRM_PROCES_USER_STATS_wiev` AS select concat(`au`.`ID`,`cw`.`ID`) AS `ID`,`cps`.`ID` AS `ID_PROCES`,left(`cps`.`DESC`,50) AS `DESC`,`au`.`ADM_ACCOUNT` AS `ADM_ACCOUNT`,`cps`.`path` AS `path`,'TEORETYCZNY' AS `TEST_TYPE`,`cps`.`SCQuest` AS `SCQuest`,max(`ct`.`OCENA`) AS `OCENA`,max(`ct`.`TEST_END`) AS `TEST_END` from ((((`ADMIN_USERS` `au` left join `CRM_AUTH_PROFILE` `cap` on(((`cap`.`REMOTE_ID` = `au`.`ID`) and (`cap`.`REMOTE_TABLE` = 'ADMIN_USERS') and (`cap`.`A_STATUS` in ('NORMAL','WAITING'))))) left join `CRM_WSKAZNIK` `cw` on(((`cw`.`ID_ZASOB` = `cap`.`ID_ZASOB`) and (`cw`.`A_STATUS` in ('NORMAL','WAITING'))))) left join `CRM_TESTY` `ct` on(((`ct`.`ID_PROCES_INIT` = `cw`.`ID_PROCES`) and (`ct`.`ID_TESTER` = `au`.`ID`) and (`ct`.`TEST_TYPE` = 'TEORETYCZNY')))) left join `_CRM_PROCES_INIT_STATS` `cps` on((`cps`.`ID` = `cw`.`ID_PROCES`))) where ((`au`.`A_STATUS` = 'NORMAL') and (`cps`.`SCQuest` > 0)) group by `au`.`ID`,`cps`.`ID` union select concat(`au`.`ID`,`cw`.`ID`) AS `ID`,`cps`.`ID` AS `ID_PROCES`,left(`cps`.`DESC`,50) AS `DESC`,`au`.`ADM_ACCOUNT` AS `ADM_ACCOUNT`,`cps`.`path` AS `path`,'PRAKTYCZNY' AS `TEST_TYPE`,`cps`.`SCQuestPract` AS `SCQuestPract`,max(`ct`.`OCENA`) AS `OCENA`,max(`ct`.`TEST_END`) AS `TEST_END` from ((((`ADMIN_USERS` `au` left join `CRM_AUTH_PROFILE` `cap` on(((`cap`.`REMOTE_ID` = `au`.`ID`) and (`cap`.`REMOTE_TABLE` = 'ADMIN_USERS') and (`cap`.`A_STATUS` in ('NORMAL','WAITING'))))) left join `CRM_WSKAZNIK` `cw` on(((`cw`.`ID_ZASOB` = `cap`.`ID_ZASOB`) and (`cw`.`A_STATUS` in ('NORMAL','WAITING'))))) left join `CRM_TESTY` `ct` on(((`ct`.`ID_PROCES_INIT` = `cw`.`ID_PROCES`) and (`ct`.`ID_TESTER` = `au`.`ID`) and (`ct`.`TEST_TYPE` = 'PRAKTYCZNY')))) left join `_CRM_PROCES_INIT_STATS` `cps` on((`cps`.`ID` = `cw`.`ID_PROCES`))) where ((`au`.`A_STATUS` = 'NORMAL') and (`cps`.`SCQuestPract` > 0)) group by `au`.`ID`,`cps`.`ID` order by `ADM_ACCOUNT`,`path`,`OCENA` desc
  89. [character_set_client] => utf8
  90. [collation_connection] => utf8_general_ci
  91. )
  92. )
  93. */
  94. // protected $parent;
  95. var $required_childs; //potrzebne dzieci
  96. var $allowed_childs; //dostepne dzieci
  97. var $required_attrs; //potrzebne wartosci
  98. var $allowed_attrs; //dostepne opcje
  99. var $attrs ; //opcje ustawione
  100. var $childs=array(); //dzieci
  101. var $object_type; //nazwa typu obiektu
  102. var $attr_relation;
  103. public function __construct($object_type,$parent=null) {
  104. echo "<br> constr ".$obj_type;
  105. if(empty($object_type)) {
  106. self::add_allowed_childs('MYSQL_SCHEMA');
  107. self::makeoptions();
  108. self::set_type('ROOT');
  109. } else self::set_type($object_type,$parent);
  110. }
  111. function makeoptions() { //make required->possible
  112. foreach ($this->required_attrs as $opt) {
  113. if(!in_array($opt, $this->allowed_attrs)) self::add_allowed_attrs($opt);
  114. }
  115. foreach ($this->required_childs as $opt) {
  116. if(!in_array($opt, $this->allowed_childs)) self::add_allowed_childs($opt);
  117. }
  118. }
  119. function set_option($name,$value) {
  120. if(in_array($name, $this->allowed_attrs))
  121. $this->attrs[$name]=$value;
  122. else die('Not allowed attr!'.$name. " , allowed options(".implode(',', $this->allowed_attrs).") or childs (".implode(',', $this->allowed_childs).")");
  123. echo "<br> obj type ".$this->object_type;
  124. self::attr_relation_parse();
  125. return $this;
  126. }
  127. function add_required_option($name) {
  128. if(!in_array($name, $this->required_attrs))
  129. $this->required_attrs[]=$name;
  130. }
  131. function add_allowed_attrs($name) {
  132. if(!in_array($name, $this->allowed_attrs))
  133. $this->allowed_attrs[]=$name;
  134. }
  135. function add_allowed_childs($name) {
  136. if(!in_array($name,$this->allowed_childs))
  137. $this->allowed_childs[]=$name;
  138. }
  139. function add_required_child($name) {
  140. if(!in_array($name, $this->required_childs))
  141. $this->required_childs[]=$name;
  142. }
  143. protected function set_type($name,$parent) {
  144. //if(!empty($parent) && ($name<>'ROOT'))
  145. //$this->object_type=$parent."::".$name;
  146. $this->object_type=$name;
  147. }
  148. function create_parent_object($name) {
  149. if(empty($name)) die('Set obj type to create parent!');
  150. // $this->childs[]=new self($name,$this->object_type);
  151. // return current($this->childs);
  152. $new=new self($name,$this->object_type);
  153. $this->childs[]=$new;
  154. return $new;
  155. }
  156. function new_child($name) {
  157. foreach($this->required_attrs as $opt) {
  158. if(!isset($this->attrs[$opt])) {
  159. echo "<br> Error - not all requested attrs were set: (".$opt.") are set ".implode(',', $this->attrs);
  160. $this;
  161. }
  162. }
  163. if(in_array($name,$this->allowed_childs)) {
  164. echo "<br> executing child ".$name." using class ".$this->object_type;
  165. $classname=$this->object_type;
  166. //return self::$name($name);
  167. return $classname::$name($name);
  168. }
  169. else echo "<br> Error - not possible option ".$name." only ".implode(',', $this->allowed_childs);
  170. }
  171. protected function add_attr_relation($attr_name,$attr_value,$attr_require) {
  172. $this->attr_relation[$attr_name][$attr_value]=$attr_require;
  173. }
  174. function attr_relation_parse() {
  175. foreach($this->attrs as $name=>$val) {
  176. if(isset($this->attr_relation[$name])) {
  177. foreach($this->attr_relation[$name] as $val_test=>$require) {
  178. if($val==$val_test) self::add_required_option($require);
  179. }
  180. }
  181. }
  182. }
  183. function get_info($obj) {
  184. var_dump($obj);
  185. }
  186. function __installer_menu() {
  187. //TODO
  188. $_GET['ID_ROOT_DB_NEW_TABLE'] = V::get('ID_ROOT_DB_NEW_TABLE', '', $_GET);
  189. $_GET['ID_ROOT_FUNCTIONS_NEW_FUNCTION'] = V::get('ID_ROOT_FUNCTIONS_NEW_FUNCTION', '', $_GET);
  190. $_GET['ID_ROOT_PROCES_NEW_PROCES'] = V::get('ID_ROOT_PROCES_NEW_PROCES', '', $_GET);
  191. $_GET['ID_FUNCTION_ADD_PROCESS'] = V::get('ID_FUNCTION_ADD_PROCESS', '', $_GET);
  192. }
  193. function __install($obj) {
  194. if(empty($obj))
  195. $cur=$this;
  196. foreach($cur->childs as $id=>$obj) {
  197. DEBUG_S(-3,'Instalacja modulu '.$id." uzywajac klasy ".$obj->object_type,$obj);
  198. $klasa=$obj->object_type;
  199. MYSQL_SCHEMA::__install($obj);
  200. }
  201. //DB::query($sql);
  202. //TODO uzyj funkcji do zarejestrowania komorek tej tabeli w ZASOBACH
  203. //TODO zglos funkcje ID w zasobach
  204. //TODO zarejestruj jakis proces w systemie do obslugi tej tabeli - dedykowany proces do uzycia funkcji oraz uzycia komorek (wskaz numer procesu gdzie go wstawic)
  205. //TODO wybierz jakies stanowisko do podpiecia tego procesu
  206. }
  207. }
  208. class ROOT extends InstallerHelper {
  209. function MYSQL_SCHEMA($name) {
  210. $obj=self::create_parent_object($name);
  211. $obj->add_allowed_childs('TABLES');
  212. $obj->add_allowed_childs('__SCHEMA_FUNCTIONS__ARRAY__');
  213. // $obj->add_required_option('TABLE_NAME');
  214. $obj->makeoptions();
  215. return $obj;
  216. }
  217. }
  218. class MYSQL_SCHEMA extends ROOT {
  219. function TABLES($name) { //parent do MYSQL_SCHEMA
  220. $obj=self::create_parent_object($name);
  221. $obj->add_required_option('NAME');
  222. $obj->add_required_option('Table_type');
  223. $obj->add_allowed_childs('VALUES');
  224. $obj->add_allowed_childs('INDEX');
  225. $obj->add_required_child('FIELDS');
  226. $obj->makeoptions();
  227. return $obj;
  228. }
  229. function __install($obj) {
  230. $i=0;
  231. foreach($obj->childs as $id=>$obj_) {
  232. $i++;
  233. DEBUG_S(-3,'Installer MYSQL Instalacja modulu '.$cur->object_type." uzywajac klasy ".$obj_->object_type,$obj_,__FILE__,__FUNCTION__,__LINE__);
  234. $klasa=$obj_->object_type;
  235. $ret[$i]=$klasa::__install($obj_);
  236. }
  237. DEBUG_S(-3,'Installer MYSQL Instalacja modulu - RESULT',$ret,__FILE__,__FUNCTION__,__LINE__);
  238. foreach($ret as $id=>$obj_) {
  239. foreach($obj_ as $id_=>$obj__) {
  240. if($id_=='SQL_NEW_TABLE') echo "<HR> SQL : ".$obj__;
  241. if($id_=='SQL_ALTER_TABLE') {
  242. foreach($obj__ as $obj___) {
  243. echo "<HR> SQL : ".$obj___;
  244. }
  245. }
  246. }
  247. }
  248. return $ret;
  249. }
  250. }
  251. class TABLES extends MYSQL_SCHEMA {
  252. function INDEX($name) { //parent do MYSQL_SCHEMA
  253. $obj=self::create_parent_object($name);
  254. $obj->add_required_option('Non_unique');
  255. $obj->add_required_option('Key_name');
  256. $obj->add_required_child('Column_name'); //kolumny
  257. $obj->makeoptions();
  258. return $obj;
  259. }
  260. function FIELDS($name) { //parent do MYSQL_SCHEMA
  261. $obj=self::create_parent_object($name);
  262. $obj->add_required_option('Field');
  263. $obj->add_required_option('Null');
  264. $obj->add_required_option('Key');
  265. $obj->add_required_option('Default');
  266. $obj->add_required_option('Extra');
  267. $obj->add_required_child('Type');
  268. $obj->makeoptions();
  269. return $obj;
  270. }
  271. function __install($obj) {
  272. $return->SQL_NEW_TABLE="create table if not exists ".$obj->attrs['NAME']." ( ";
  273. $i=0;
  274. foreach($obj->childs as $id=>$obj_) {
  275. $i++;
  276. DEBUG_S(-3,'Installer MYSQL::TABLE Instalacja modulu '.$cur->object_type." uzywajac klasy ".$obj_->object_type,$obj_);
  277. $klasa=$obj_->object_type;
  278. $obj_type=$obj_->object_type;
  279. $ret[$i]->$obj_type=$klasa::__install($obj_);
  280. if($obj_->object_type=='FIELDS') {
  281. $ret[$i]->SQL=" `{$obj_->attrs['Field']}` {$ret[$i]->FIELDS} ";
  282. if(!empty($obj_->attrs['Default'])) $ret[$i]->SQL=" default ".$obj_->attrs['Default']." ";
  283. if(!isset($return->SQL_FIELDS)) $return->SQL_FIELDS=$ret[$i]->SQL; else $return->SQL_FIELDS.=",".$ret[$i]->SQL;
  284. $return->SQL_ALTER_TABLE[]="alter ignore table ".$obj->attrs['NAME']." add ".$ret[$i]->SQL;
  285. }
  286. // $ret[$i]->TYPE
  287. }
  288. $return->SQL_NEW_TABLE.=$return->SQL_FIELDS." ) ";
  289. DEBUG_S(-3,'Installer MYSQL::TABLE zwrocil ',array($ret,$return),__FILE__,__FUNCTION__,__LINE__);
  290. return $return;
  291. }
  292. }
  293. class INDEX extends TABLES {
  294. function Column_name($name) {
  295. $obj=self::create_parent_object($name);
  296. $obj->add_required_option('column'); //column to index
  297. $obj->add_allowed_attrs('Non_unique'); //column to index
  298. $obj->makeoptions();
  299. return $obj;
  300. }
  301. function __install($obj) {
  302. if(isset($obj->attrs['Non_unique']))
  303. $return->CREATE_SQL="add unique `{$obj->attrs['Key_name']}` (";
  304. else
  305. $return->CREATE_SQL="add key `{$obj->attrs['Key_name']}` (";
  306. $i=0;
  307. foreach($obj->childs as $id=>$obj_) {
  308. $i++;
  309. DEBUG_S(-3,'Installer MYSQL::TABLE:INDEX Instalacja modulu w przygotowaniu '.$cur->object_type." uzywajac klasy ".$obj_->object_type,$obj_,__FILE__,__FUNCTION__,__LINE__);
  310. $ret[$i]->COLUMNS=$obj_->attrs['column'];
  311. if(isset($column)) $column.=",`".$obj_->attrs['column']."`"; else $column="`".$obj_->attrs['column']."`";
  312. }
  313. $return->CREATE_SQL.=$column.")";
  314. return $return;
  315. // return $ret;
  316. }
  317. }
  318. class FIELDS extends TABLES { //typ typy komorek
  319. function Type($name) {
  320. $obj=self::create_parent_object($name);
  321. $obj->add_allowed_childs('varchar');
  322. $obj->add_allowed_childs('enum');
  323. $obj->add_allowed_childs('int');
  324. $obj->add_allowed_childs('text');
  325. $obj->makeoptions();
  326. return $obj;
  327. }
  328. function __install($obj) {
  329. foreach($obj->childs as $id=>$obj) { //tylko jeden wiersz jest
  330. DEBUG_S(-3,'Installer MYSQL::TABLE:FIELDS Instalacja modulu '.$cur->object_type." uzywajac klasy ".$obj->object_type,$obj);
  331. $klasa=$obj->object_type;
  332. $ret=$klasa::__install($obj);
  333. if(!empty($ret)) $return=$ret->TYPE."".$ret->SQL_SIZE."";
  334. DEBUG_S(-3,' - zwrocil ',$sql);
  335. return $return;
  336. }
  337. }
  338. }
  339. class Type extends FIELDS { //typ typy komorek
  340. function int($name) {
  341. $obj=self::create_parent_object($name);
  342. $obj->add_required_option('M'); //as in mysql documentation - it is the size of cell
  343. $obj->makeoptions();
  344. return $obj;
  345. }
  346. function varchar($name) {
  347. $obj=self::create_parent_object($name);
  348. $obj->add_required_option('M'); //as in mysql documentation - it is the size of cell
  349. $obj->makeoptions();
  350. return $obj;
  351. }
  352. function text($name) {
  353. $obj=self::create_parent_object($name);
  354. $obj->makeoptions();
  355. return $obj;
  356. }
  357. function __install($obj) {
  358. foreach($obj->childs as $id=>$obj) {
  359. DEBUG_S(-3,'Installer MYSQL::TABLE:FIELDS::TYPE Instalacja modulu '.$cur->object_type." uzywajac klasy ".$obj->object_type,$obj);
  360. if(isset($obj->attrs['M'])) {
  361. $ret->SQL_SIZE="(".$obj->attrs['M'].")";
  362. $ret->TYPE=$obj->object_type;
  363. } else $ret->TYPE=$obj->object_type;
  364. return $ret;
  365. }
  366. }
  367. }