Mysql.php 53 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000
  1. <?php
  2. require_once dirname(__FILE__) . '/../../' . 'Lib.php';
  3. Lib::loadClass( 'Core_Database' );
  4. class Core_Database_Mysql extends Core_Database {
  5. function __construct($host, $user, $password, $database, $names = '', $params = array()) {
  6. parent::__construct($host, $user, $password, $database, $names, $params);
  7. $this->_conn = @mysql_pconnect($host, $user, $password);
  8. if (!is_resource($this->_conn)) {
  9. $this->_set_error('CREATE CONNECTION FAILED');
  10. return;
  11. }
  12. if (false === mysql_select_db($database, $this->_conn)) {
  13. $this->_set_error('SELECT DATABASE FAILED');
  14. return;
  15. }
  16. if ($names != '') {
  17. $this->query(" SET NAMES '$names' ");
  18. }
  19. }
  20. function getConnection() {
  21. return $this->_conn;
  22. }
  23. function getVersion($version) {
  24. if (!$this->_version) {
  25. $sql = "SHOW VARIABLES LIKE 'version';";
  26. $res = $this->query($sql);
  27. if ($r = $this->fetch($res)) {
  28. // [Variable_name] => version, [Value] => 4.0.26-log
  29. $this->_version = $r->Value;
  30. }
  31. }
  32. return $this->_version;
  33. }
  34. /**
  35. * Wykonuje podane zapytanie i zwraca wynik mysql_query().
  36. */
  37. function query( $query, $msg = 'Query ERROR.' ) {
  38. $null = null;
  39. if (!$this->_conn) { return $null; }
  40. $res = mysql_query($query, $this->_conn);
  41. if (!$res) {
  42. $this->_set_error('SQL QUERY FAILED: '.mysql_error($this->_conn));
  43. return $null;
  44. }
  45. return $res;
  46. }
  47. function fetch( $res ) {
  48. $ret = null;
  49. if ($res) $ret = mysql_fetch_object( $res );
  50. return $ret;
  51. }
  52. function fetch_row( $res ) {
  53. $ret = null;
  54. if ($res) $ret = mysql_fetch_row( $res );
  55. return $ret;
  56. }
  57. function fetch_assoc( $res ) {
  58. $ret = null;
  59. if ($res) $ret = mysql_fetch_assoc( $res );
  60. return $ret;
  61. }
  62. function fetch_array($res) {
  63. $ret = null;
  64. if ($res) $ret = mysql_fetch_array($res);
  65. return $ret;
  66. }
  67. function count( $res ) {
  68. return mysql_num_rows( $res );
  69. }
  70. function num_rows( $res ) {
  71. return mysql_num_rows( $res );
  72. }
  73. function insert_id() {
  74. return mysql_insert_id( $this->_conn );
  75. }
  76. function show_tables() {
  77. $sql="show tables";
  78. $res = $this->query($sql);
  79. return $res;
  80. }
  81. function describe_table($table) {
  82. $sql='SHOW FIELDS FROM `'.$table.'`';
  83. $res = $this->query($sql);
  84. return $res;
  85. }
  86. function STRUCTURE_GENERATE($TABLES,$null=null,$TABLES_STRUCTURE_DATA,$flags=array()){
  87. DEBUG_S(-3,'flags',$flags,__FILE__,__FUNCTION__,__LINE__);
  88. //global $this;
  89. //! try to create info for functions and procedures -> ['__SCHEMA_FUNCTIONS__ARRAY__']
  90. $sql="show function status where Db='".$this->getDatabaseName()."';";
  91. DEBUG_S(-3,'sql function detail :: ',$sql_,__FILE__,__FUNCTION__,__LINE__) ;
  92. $result=$this->query($sql) or die1('\nProblem z '.$sql);
  93. while($h=mysql_fetch_object($result)) {
  94. $sql_="show create function `{$h->Name}`" ;
  95. DEBUG_S(-3,'sql function detail :: ',$sql_,__FILE__,__FUNCTION__,__LINE__) ;
  96. $result_=$this->query($sql_) or die1('\nProblem z '.$sql);
  97. while($h_=mysql_fetch_object($result_)) {
  98. $TABLES_IMPORT['__SCHEMA_FUNCTIONS__ARRAY__']['FUNCTION'][$h->Name]=$h_;
  99. }
  100. }
  101. $sql="show PROCEDURE status where Db='".$this->getDatabaseName()."';";
  102. DEBUG_S(-3,'sql function detail :: ',$sql_,__FILE__,__FUNCTION__,__LINE__) ;
  103. $result=$this->query($sql) or die1('\nProblem z '.$sql);
  104. while($h=mysql_fetch_object($result)) {
  105. $sql_="show create PROCEDURE `{$h->Name}`" ;
  106. DEBUG_S(-3,'sql PROCEDURE detail :: ',$sql_,__FILE__,__FUNCTION__,__LINE__) ;
  107. $result_=$this->query($sql_) or die1('\nProblem z '.$sql);
  108. while($h_=mysql_fetch_object($result_)) {
  109. $TABLES_IMPORT['__SCHEMA_FUNCTIONS__ARRAY__']['PROCEDURE'][$h->Name]=$h_;
  110. }
  111. }
  112. DEBUG_S(-3,'struktury funkcji: __SCHEMA_FUNCTIONS__ARRAY__ ',$TABLES_IMPORT['__SCHEMA_FUNCTIONS__ARRAY__'],__FILE__,__FUNCTION__,__LINE__) ;
  113. //die1('stop function during dev.');
  114. foreach($TABLES as $TABLE ){
  115. $sql="show tables like '".$TABLE."' ;" ;
  116. DEBUG_S(-3,'//! Listing possible tables to write to config',$sql,__FILE__,__FUNCTION__,__LINE__);
  117. $result=$this->query($sql) or die1('\nProblem z '.$sql);
  118. if(mysql_num_rows($result)==0) {
  119. // nie ma tabeli - trzeba zapisac
  120. DEBUG_S(-3," BRAK TABELI ".$TABLE,null,__FILE__,__FUNCTION__,__LINE__);
  121. //die1();
  122. if(isset($TABLES_IMPORT[$TABLE])) {
  123. DEBUG_S(-3," Table already imported - problem in twice declared table ".$TABLE,null,__FILE__,__FUNCTION__,__LINE__);
  124. die1();
  125. }
  126. } else {
  127. $sql="show full tables like '".$TABLE."' ;" ;
  128. $result=$this->query($sql) or die1('\nProblem z '.$sql);
  129. while($h=mysql_fetch_object($result)) {
  130. $TABLES_IMPORT[$TABLE]['Table_type']=$h->{'Table_type'};
  131. DEBUG_S(-3,'//! Reading to conf if table is WIEV or not :sql/result',array($sql,$h->{'Table_type'}),__FILE__,__FUNCTION__,__LINE__);
  132. }
  133. $FLAG_CONTABLE=false;
  134. if( ($TABLES_IMPORT[$TABLE]['Table_type']=='BASE TABLE')
  135. || ( in_array('with_view', $flags) && $TABLES_IMPORT[$TABLE]['Table_type']=='VIEW' )
  136. ) {
  137. $FLAG_CONTABLE=true;
  138. $sql=" describe `".$TABLE."` ;" ;
  139. //echo "\n ".$sql;
  140. $result=$this->query($sql) or die1('\nProblem z '.$sql);
  141. while($h=mysql_fetch_object($result)) {
  142. $TABLES_IMPORT[$TABLE]['FIELDS'][]=$h;
  143. }
  144. $sql=" show index from `".$TABLE."` ;" ;
  145. $result=$this->query($sql) or die1('\nProblem z '.$sql);
  146. $TMP_KEYNAME=array();
  147. while($h=mysql_fetch_object($result)) {
  148. if(isset($h->Column_name)) { $h->Column_name="`".$h->Column_name."`";
  149. if(!isset($TMP_KEYNAME[$h->Key_name])) $TMP_KEYNAME[$h->Key_name]=$h->Column_name;
  150. else $TMP_KEYNAME[$h->Key_name].=",".$h->Column_name;
  151. }
  152. //if(isset($TABLES_IMPORT[$TABLE]['INDEX'][$h->Key_name])) {
  153. // $TABLES_IMPORT[$TABLE]['INDEX'][$h->Key_name]->Column_name.=", ".$h->Column_name." ";
  154. //} else {
  155. //}
  156. $TABLES_IMPORT[$TABLE]['INDEX'][$h->Key_name]=$h;
  157. $TABLES_IMPORT[$TABLE]['INDEX'][$h->Key_name]->Column_name=$TMP_KEYNAME[$h->Key_name];
  158. }
  159. if(in_array($TABLE,$TABLES_STRUCTURE_DATA)) { //bedziemy dodawac dane tej tabeli
  160. $sql=" select * from `".$TABLE."` ;" ;
  161. $result=$this->query($sql) or die1('\nProblem z '.$sql);
  162. while($h=mysql_fetch_object($result)) {
  163. $TABLES_IMPORT[$TABLE]['VALUES'][]=$h;
  164. }
  165. }
  166. DEBUG_S(-3,"Dane tabeli KOMORKI ".$TABLE." ",$TABLES_IMPORT[$TABLE]['FIELDS'],__FILE__, __FUNCTION__, __LINE__);
  167. DEBUG_S(-3,"Dane tabeli INDEKSY ".$TABLE." ",$TABLES_IMPORT[$TABLE]['INDEX'],__FILE__, __FUNCTION__, __LINE__);
  168. if(isset($TABLES_IMPORT[$TABLE]['VALUES'])) DEBUG_S(-3,"Dane tabeli VALUES ".$TABLE." ",$TABLES_IMPORT[$TABLE]['VALUES'],__FILE__, __FUNCTION__, __LINE__);
  169. //! reading triggers to conf -> $TABLES_IMPORT[$TABLE]['TRIGGERS']
  170. $sql=" show triggers like '".$TABLE."' ;" ;
  171. $result=$this->query($sql) or die1('\nProblem z '.$sql);
  172. while($h=mysql_fetch_object($result)) {
  173. $sql_="show create trigger {$h->Trigger} ;" ;
  174. echo $sql_;
  175. $result_=$this->query($sql_) or die1('\nProblem z '.$sql_);
  176. while($h_=mysql_fetch_object($result_)) {
  177. DEBUG_S(-3,"Dane tabeli h_ ".$TABLE." ",$h_,__FILE__, __FUNCTION__, __LINE__);
  178. $TABLES_IMPORT[$TABLE]['TRIGGERS'][$h->Trigger]=$h_;
  179. }
  180. }
  181. if(isset($TABLES_IMPORT[$TABLE]['TRIGGERS'])) DEBUG_S(-3,"Dane tabeli TRIGGERS ".$TABLE." ",$TABLES_IMPORT[$TABLE]['TRIGGERS'],__FILE__, __FUNCTION__, __LINE__);
  182. }
  183. if(($TABLES_IMPORT[$TABLE]['Table_type']=='VIEW')) {
  184. $FLAG_CONTABLE=true;
  185. $sql_="show create view `{$TABLE}` ;" ;
  186. //echo $sql_;
  187. $result_=$this->query($sql_) or die1('\nProblem z '.$sql_);
  188. while($h_=mysql_fetch_object($result_)) {
  189. DEBUG_S(-3,"//! trying to fetch create view fom".$TABLE." sql/res",array($sql_,$h_),__FILE__, __FUNCTION__, __LINE__);
  190. $TABLES_IMPORT[$TABLE]['VIEW']=$h_;
  191. }
  192. } if(!$FLAG_CONTABLE) {
  193. DEBUG_S(-3,"Unknown table type ! ".$TABLE." ".$TABLES_IMPORT[$TABLE]['Table_type'],$TABLES_IMPORT[$TABLE],__FILE__, __FUNCTION__, __LINE__);
  194. die1();
  195. }
  196. }
  197. }
  198. //print_r($TABLES_IMPORT);
  199. function func_sort_tables_import($a,$b){
  200. if($a['Table_type']==$b['Table_type']) return 0;
  201. else if($a['Table_type']=='VIEW') return 1;
  202. else return -1;
  203. }
  204. uasort($TABLES_IMPORT,'func_sort_tables_import');
  205. DEBUG_S(-3,'Wygenerowane struktury (TABLES_IMPORT)',$TABLES_IMPORT,__FILE__,__FUNCTION__,__LINE__);
  206. return($TABLES_IMPORT);
  207. }
  208. function SHOW_TABLE_STATUS_LIKE($table) {
  209. $records=$this->query("SHOW TABLE STATUS LIKE '".$table."'");
  210. if ($record = $this->fetch_assoc($records)) {
  211. // DEBUG_S(-3,'SHOW_TABLE_STATUS_LIKE',$record,__FILE__,__FUNCTION__,__LINE__);
  212. return $record;
  213. }
  214. }
  215. function affected_rows() {
  216. return mysql_affected_rows( $this->_conn );
  217. }
  218. function _( $str ) {
  219. return mysql_real_escape_string( $str, $this->_conn );
  220. }
  221. function error() {
  222. return "#".mysql_errno($this->_conn).": ".mysql_error($this->_conn);
  223. }
  224. function get_by_id( $table, $id ) {
  225. $null = null;
  226. $sql = "select p.*
  227. from `".$table."` as p
  228. where p.`ID`='".$id."'
  229. ";
  230. $res = $this->query( $sql );
  231. if ($r = $this->fetch( $res )) {
  232. return $r;
  233. }
  234. return $null;
  235. }
  236. /**
  237. * @returns int
  238. * 1 - changed but without add hist
  239. * 2 - changed and add hist
  240. * 0 - nothing to change
  241. * -1 - sql errors
  242. * -2 - error id not exists in DB
  243. * -3 - error ID not set
  244. *
  245. * TODO: sprawdzac czy w hist mozna odczytac aktualny stan, jesli nie to dodac caly rekord do HIST, jako 'procesy-fix-hist-data'
  246. */
  247. public function UPDATE_OBJ($table, $sql_obj) {
  248. if (!isset($sql_obj->ID) || $sql_obj->ID <= 0) {
  249. return -3;
  250. }
  251. $id = $sql_obj->ID;
  252. // check id record $id exists
  253. if (($curr_obj = $this->get_by_id( $table, $sql_obj->ID )) == null) {
  254. return -2;
  255. }
  256. // check if enything changed
  257. $changed = false;
  258. $fields_to_change = get_object_vars($sql_obj);
  259. foreach ($fields_to_change as $k => $v) {
  260. if ($k == 'ID') continue;
  261. if ($v == $curr_obj->$k) {// === ?
  262. unset($sql_obj->$k);
  263. } else {
  264. $changed = true;
  265. }
  266. }
  267. if ($changed == false) {
  268. return 0;// record not changed
  269. }
  270. $sql_arr = array();
  271. // TODO: add admin columns if exists in table - search in session
  272. $admin_col = array();
  273. $admin_col []= 'A_RECORD_CREATE_DATE';
  274. $admin_col []= 'A_RECORD_CREATE_AUTHOR';
  275. // ...
  276. $sql_obj->A_RECORD_UPDATE_DATE = date('Y-m-d-H:i');
  277. $sql_obj->A_RECORD_UPDATE_AUTHOR = User::getName();
  278. foreach (get_object_vars($sql_obj) as $k => $v) {
  279. if (strtoupper($v) == 'NOW()') {
  280. $v = 'NOW()';
  281. } else if (strtoupper($v) == 'NULL') {
  282. $v = 'NULL';
  283. } else if (substr($v, 0, strlen('GeomFromText')) == 'GeomFromText') {
  284. } else {
  285. $v = $this->_($v);
  286. $v = "'{$v}'";
  287. }
  288. $sql_arr [] = "`{$k}`={$v}";
  289. }
  290. $sql = "update `{$table}` set ".implode(",", $sql_arr)." where `ID`='{$id}' limit 1; ";
  291. $this->query($sql);
  292. if ($this->has_errors()) {
  293. return -1;
  294. }
  295. $ret = $this->affected_rows();
  296. if ($ret) {
  297. $sql_obj->ID_USERS2 = $sql_obj->ID;
  298. unset($sql_obj->ID);
  299. $new_id = $this->ADD_NEW_OBJ("{$table}_HIST", $sql_obj);
  300. if ($new_id) {
  301. $ret += 1;
  302. }
  303. }
  304. return $ret;
  305. }
  306. function ADD_NEW_OBJ( $table, $sql_obj ) {
  307. $sql_arr = array();
  308. // TODO: add admin columns if exists in table - search in session
  309. $admin_col = array();
  310. $admin_col []= 'ID';
  311. $admin_col []= 'A_RECORD_CREATE_DATE';
  312. $admin_col []= 'A_RECORD_CREATE_AUTHOR';
  313. $admin_col []= 'A_RECORD_UPDATE_DATE';
  314. $admin_col []= 'A_RECORD_UPDATE_AUTHOR';
  315. // ...
  316. $sql_arr["`ID`"] = "NULL";// add default value for ID, NULL in all inserts
  317. if (substr($table, 0, -5) == '_HIST') {
  318. $sql_obj->A_RECORD_UPDATE_DATE = date('Y-m-d-H:i');
  319. $sql_obj->A_RECORD_UPDATE_AUTHOR = User::getName();
  320. } else {
  321. $sql_obj->A_RECORD_CREATE_DATE = date('Y-m-d-H:i');
  322. $sql_obj->A_RECORD_CREATE_AUTHOR = User::getName();
  323. }
  324. foreach (get_object_vars($sql_obj) as $k => $v) {
  325. if (strtoupper($v) == 'NOW()') {
  326. $v = 'NOW()';
  327. } else if (strtoupper($v) == 'NULL' && substr($table, -5) != '_HIST') {
  328. $v = 'NULL';
  329. } else {
  330. $v = $this->_($v);
  331. $v = "'{$v}'";
  332. }
  333. $sql_arr ["`{$k}`"] = $v;
  334. }
  335. $sql = "insert into `{$table}` (".implode(",", array_keys($sql_arr)).") values (".implode(",", array_values($sql_arr))."); ";
  336. $this->query($sql);
  337. if ($this->has_errors()) {
  338. //echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">db errors: (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($this->get_errors());echo'</pre>';
  339. }
  340. $ret_id = $this->insert_id();
  341. if (substr($table, -5) == '_HIST') {
  342. return $ret_id;
  343. }
  344. if ($ret_id) {
  345. $sql_obj->ID_USERS2 = $ret_id;
  346. unset($sql_obj->ID);
  347. $new_id_hist = $this->ADD_NEW_OBJ($table . '_HIST', $sql_obj);
  348. // error jesli nie udalo sie dodac rekordu do tabeli _HIST
  349. }
  350. return $ret_id;
  351. }
  352. function add_index($tbl,$column) {
  353. $sql="alter table `".$tbl."` add index(`".$column."`) ; ";
  354. self::query($sql);
  355. }
  356. function STRUCTURE_GENERATE_PARSE($config_base_structure_unserialized) {
  357. foreach($config_base_structure_unserialized as $TABLE=>$ARR_TABLE) { //dla kazdej tabeli
  358. set_time_limit(36000);
  359. //! if($TABLE<>'_CRM_PROCES_USER_STATS_wiev') continue; //trigger development
  360. //! try to sync __SCHEMA_FUNCTIONS__ARRAY__
  361. if($TABLE=='__SCHEMA_FUNCTIONS__ARRAY__') {
  362. DEBUG_S(-3,'Try to synchronize functions and procedures',$ARR_TABLE,__FILE__,__FUNCTION__,__LINE__);
  363. //BEGIN PROCEDURE
  364. $sql=" SHOW PROCEDURE STATUS; ;" ; //listujemy nasze procedury
  365. DEBUG_S(-3,'Looking for PROCEDURE ',$sql,__FILE__,__FUNCTION__,__LINE__);
  366. $result=$this->query($sql) or die1('\nProblem z '.$sql);
  367. while($h=mysql_fetch_object($result)) {
  368. if($h->Db<>$this->getDatabaseName()) continue;
  369. set_time_limit(36000);
  370. $sql_="show create PROCEDURE {$h->Name} ;" ;
  371. //echo $sql_;
  372. $result_=$this->query($sql_) or die1('\nProblem z '.$sql_);
  373. while($h_=mysql_fetch_object($result_)) {
  374. $FIELDS_CHECKED['FOUNDS'][$h->Name]=$h_;
  375. if(!isset($ARR_TABLE['PROCEDURE'][$h->Name])) {
  376. DEBUG_S(-3,'We have some more functions - we will not delete them:'.$h->Name,null,__FILE__,__FUNCTION__,__LINE__);
  377. //$FIELDS_CHECKED['TO_DELETE'][$h->Name]=$h_;
  378. }
  379. }
  380. }
  381. DEBUG_S(-3,'Try to unserialize PROCEDURE and install to db:',$ARR_TABLE['PROCEDURE'],__FILE__,__FUNCTION__,__LINE__);
  382. foreach($ARR_TABLE['PROCEDURE'] as $TRIGGER_INDEX=>$TRIGGER_OBJECT) {
  383. if(!isset($FIELDS_CHECKED['FOUNDS'][$TRIGGER_INDEX])) { $FIELDS_CHECKED['TO_CREATE'][$TRIGGER_INDEX]=$TRIGGER_OBJECT;
  384. DEBUG_S(-3,'We have object to create '.$TRIGGER_INDEX,$TRIGGER_OBJECT,__FILE__,__FUNCTION__,__LINE__);
  385. }
  386. }
  387. //staramy sie zaktualizowac stare triggery, pod warunkiem, ze sie roznia
  388. foreach($FIELDS_CHECKED['FOUNDS'] as $TRIGGER_INDEX=>$TRIGGER_OBJECT) {
  389. DEBUG_S(-3,'OBJ/OBJ for '.$TRIGGER_INDEX,array($TRIGGER_OBJECT->{'Create Procedure'},$ARR_TABLE['PROCEDURE'][$TRIGGER_INDEX]->{'Create Procedure'}),__FILE__, __FUNCTION__, __LINE__);
  390. if(isset($ARR_TABLE['PROCEDURE'][$TRIGGER_INDEX])) //we first try to find if this trigger exists or delete it
  391. if($TRIGGER_OBJECT->{'Create Procedure'}<>$ARR_TABLE['PROCEDURE'][$TRIGGER_INDEX]->{'Create Procedure'} ) {
  392. DEBUG_S(-3,"Data are different ({$TRIGGER_INDEX}). We add object to be created as new.",__FILE__, __FUNCTION__, __LINE__);
  393. $FIELDS_CHECKED['TO_CREATE'][$TRIGGER_INDEX]=$ARR_TABLE['PROCEDURE'][$TRIGGER_INDEX];
  394. $FIELDS_CHECKED['TO_DELETE'][$TRIGGER_INDEX]=true;
  395. }
  396. }
  397. if(isset($FIELDS_CHECKED['TO_DELETE'])) {
  398. DEBUG_S(-3,'We have some data to delete',$FIELDS_CHECKED['TO_DELETE'],__FILE__,__FUNCTION__,__LINE__);
  399. foreach($FIELDS_CHECKED['TO_DELETE'] as $TRIGGER_INDEX=>$TRIGGER_OBJECT ) {
  400. $sql="DROP PROCEDURE IF EXISTS `{$TRIGGER_INDEX}`; ";
  401. DEBUG_S(-3,' sql to delete '.$TRIGGER_INDEX,$sql,__FILE__,__FUNCTION__,__LINE__);
  402. $result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL:',$sql,__FILE__, __FUNCTION__, __LINE__) or die1();
  403. }
  404. }
  405. //tworzymy brakujace procedury
  406. foreach ($FIELDS_CHECKED['TO_CREATE'] as $TRIGGER_INDEX=>$TRIGGER_OBJECT) {
  407. $sql=$TRIGGER_OBJECT->{'Create Procedure'};
  408. DEBUG_S(-3,'Try to add new '.$TRIGGER_INDEX,$sql,__FILE__,__FUNCTION__,__LINE__);
  409. $result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL:',$sql,__FILE__, __FUNCTION__, __LINE__) or die1();
  410. }
  411. unset($FIELDS_CHECKED);
  412. //EOF PROCEDURE
  413. //BEGIN FUNCTION
  414. $sql=" SHOW FUNCTION STATUS ;" ; //listujemy nasze procedury
  415. DEBUG_S(-3,'Looking for FUNCTION ',$sql,__FILE__,__FUNCTION__,__LINE__);
  416. $result=$this->query($sql) or die1('\nProblem z '.$sql);
  417. while($h=mysql_fetch_object($result)) {
  418. set_time_limit(36000);
  419. $sql_="show create FUNCTION {$h->Name} ;" ;
  420. //echo $sql_;
  421. $result_=$this->query($sql_) or die1('\nProblem z '.$sql_);
  422. while($h_=mysql_fetch_object($result_)) {
  423. $FIELDS_CHECKED['FOUNDS'][$h->Name]=$h_;
  424. if(!isset($ARR_TABLE['FUNCTION'][$h->Name])) {
  425. DEBUG_S(-3,'We have some more functions - we will not delete them:'.$h->Name,null,__FILE__,__FUNCTION__,__LINE__);
  426. // $FIELDS_CHECKED['TO_DELETE'][$h->Name]=$h_;
  427. }
  428. }
  429. }
  430. DEBUG_S(-3,'Try to unserialize FUNCTION and install to db:',$ARR_TABLE['FUNCTION'],__FILE__,__FUNCTION__,__LINE__);
  431. foreach($ARR_TABLE['FUNCTION'] as $TRIGGER_INDEX=>$TRIGGER_OBJECT) {
  432. if(!isset($FIELDS_CHECKED['FOUNDS'][$TRIGGER_INDEX])) { $FIELDS_CHECKED['TO_CREATE'][$TRIGGER_INDEX]=$TRIGGER_OBJECT;
  433. DEBUG_S(-3,'We have object to create '.$TRIGGER_INDEX,$TRIGGER_OBJECT,__FILE__,__FUNCTION__,__LINE__);
  434. }
  435. }
  436. //staramy sie zaktualizowac stare triggery, pod warunkiem, ze sie roznia
  437. foreach($FIELDS_CHECKED['FOUNDS'] as $TRIGGER_INDEX=>$TRIGGER_OBJECT) {
  438. DEBUG_S(-3,'OBJ/OBJ for '.$TRIGGER_INDEX,array($TRIGGER_OBJECT->{'Create Function'},$ARR_TABLE['FUNCTION'][$TRIGGER_INDEX]->{'Create Function'}),__FILE__, __FUNCTION__, __LINE__);
  439. if(isset($ARR_TABLE['FUNCTION'][$TRIGGER_INDEX])) //we first try to find if this trigger exists or delete it
  440. if($TRIGGER_OBJECT->{'Create Function'}<>$ARR_TABLE['FUNCTION'][$TRIGGER_INDEX]->{'Create Function'} ) {
  441. DEBUG_S(-3,"Data are different ({$TRIGGER_INDEX}). We add object to be created as new.",__FILE__, __FUNCTION__, __LINE__);
  442. $FIELDS_CHECKED['TO_CREATE'][$TRIGGER_INDEX]=$ARR_TABLE['FUNCTION'][$TRIGGER_INDEX];
  443. $FIELDS_CHECKED['TO_DELETE'][$TRIGGER_INDEX]=true;
  444. }
  445. }
  446. if(isset($FIELDS_CHECKED['TO_DELETE'])) {
  447. DEBUG_S(-3,'We have some data to delete',$FIELDS_CHECKED['TO_DELETE'],__FILE__,__FUNCTION__,__LINE__);
  448. foreach($FIELDS_CHECKED['TO_DELETE'] as $TRIGGER_INDEX=>$TRIGGER_OBJECT ) {
  449. $sql="DROP FUNCTION IF EXISTS `{$TRIGGER_INDEX}`; ";
  450. DEBUG_S(-3,' sql to delete '.$TRIGGER_INDEX,$sql,__FILE__,__FUNCTION__,__LINE__);
  451. $result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL:',$sql,__FILE__, __FUNCTION__, __LINE__) or die1();
  452. }
  453. }
  454. //tworzymy brakujace procedury
  455. foreach ($FIELDS_CHECKED['TO_CREATE'] as $TRIGGER_INDEX=>$TRIGGER_OBJECT) {
  456. $sql=$TRIGGER_OBJECT->{'Create Function'};
  457. DEBUG_S(-3,'Try to add new '.$TRIGGER_INDEX,$sql,__FILE__,__FUNCTION__,__LINE__);
  458. $result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL:',$sql,__FILE__, __FUNCTION__, __LINE__) or die1();
  459. }
  460. unset($FIELDS_CHECKED);
  461. //EOF FUNCTION
  462. //die1('app in devel');
  463. continue; //no go to another table in loop
  464. } //eof
  465. //! detect if src table is TABLE or VIEW
  466. // foreach($TABLES as $TABLE ){
  467. $sql="show full tables like '".$TABLE."' ;" ;
  468. DEBUG_S(-3,'SQL:'.$this->getDatabaseName(),$sql,__FILE__, __FUNCTION__, __LINE__) ;
  469. $result=$this->query($sql) or die1('\nProblem z '.$sql);
  470. while($h=mysql_fetch_object($result)) {
  471. $FIELDS_CHECKED['Table_type']=$h->{'Table_type'};
  472. }
  473. if(mysql_num_rows($result)==0) {
  474. // nie ma tabeli - trzeba zapisac
  475. if($ARR_TABLE['Table_type']=='BASE TABLE') {
  476. //DEBUG_S(-3,"\n BRAK TABELI dodajemy : ".$TABLE."!!!",null,__FILE__,__FUNCTION__,__LINE__);
  477. $sql="create table ".$TABLE." ( ".$ARR_TABLE['FIELDS'][0]->Field." ".$ARR_TABLE['FIELDS'][0]->Type ; // ID int(11) NOT NULL AUTO_INCREMENT,
  478. if($ARR_TABLE['FIELDS'][0]->Null=='NO') $sql.=" not null "; else $sql.=" null ";
  479. //if($ARR_TABLE['FIELDS'][0]->Extra=='auto_increment') $sql.=" AUTO_INCREMENT "; else $sql.=" ";
  480. $sql.=" ) DEFAULT CHARSET=latin2 ";
  481. DEBUG_S(-3,"Brak tabeli: ".$TABLE." dodajemy sql:",$sql,__FILE__,__FUNCTION__,__LINE__) ;
  482. $this->query($sql) or die1('\nProblem z CREATE '.$sql);
  483. if($TABLE=='CRM_LISTA_ZASOBOW') {
  484. $sql=" alter table `".$TABLE."` AUTO_INCREMENT=1000 ";
  485. $this->query($sql) or die1('\nProblem z AUTO INCREMENT '.$sql);
  486. }
  487. } else if($ARR_TABLE['Table_type']=='VIEW') {
  488. $sql=$ARR_TABLE['VIEW']->{'Create View'};
  489. DEBUG_S(-3,"Brak widoku: ".$TABLE." dodajemy sql:",$sql,__FILE__,__FUNCTION__,__LINE__) ;
  490. $this->query($sql) or die1('\nProblem ze '.$sql);
  491. }
  492. } else {
  493. //try to detect if types are the same
  494. if($ARR_TABLE['Table_type']<>$FIELDS_CHECKED['Table_type']) die1('Todo: ERROR VIEW/TABLE different types ');
  495. if($ARR_TABLE['Table_type']=='VIEW') {
  496. if(isset($ARR_TABLE['VIEW'])) {
  497. $sql_="show create view `{$TABLE}` ;" ;
  498. echo $sql_;
  499. $result_=$this->query($sql_) or die1('\nProblem z '.$sql_);
  500. while($h_=mysql_fetch_object($result_)) {
  501. DEBUG_S(-3,"//! get current view info ".$TABLE." sql/res",array($sql_,$h_),__FILE__, __FUNCTION__, __LINE__);
  502. $FIELDS_CHECKED['VIEW']=$h_;
  503. }
  504. //ereg_replace(, , )
  505. if(strtolower($FIELDS_CHECKED['VIEW']->{'Create View'})<>strtolower($ARR_TABLE['VIEW']->{'Create View'})) {
  506. $sql="drop view `{$TABLE}`";
  507. $this->query($sql) or die1('\nProblem ze '.$sql);
  508. $sql_=$ARR_TABLE['VIEW']->{'Create View'};
  509. DEBUG_S(-3,"//! Views are different for ".$TABLE." . Dropping old view and adding new (old/new/sql/sql):",array(strtolower($FIELDS_CHECKED['VIEW']->{'Create View'}),$ARR_TABLE['VIEW']->{'Create View'},$sql,$sql_,$h_),__FILE__, __FUNCTION__, __LINE__);
  510. $this->query($sql_) or die1('\nProblem ze '.$sql_);
  511. }
  512. }
  513. }
  514. }
  515. //always create
  516. if($ARR_TABLE['Table_type']=='BASE TABLE') {
  517. set_time_limit(36000);
  518. $sql=" describe `".$TABLE."` ;" ;
  519. DEBUG_S(-3,'SQL:describe '.$TABLE,$sql,__FILE__, __FUNCTION__, __LINE__) ;
  520. $result=$this->query($sql) or die1('\nProblem z '.$sql);
  521. $FIELDS_CHECKED=""; unset($FIELDS_CHECKED);
  522. foreach($ARR_TABLE['FIELDS'] as $TSTIND=>$TST_VAL) { //tu robie tabelke do odhaczania z niej zmiennych
  523. $FIELDS_CHECKED['FIELD_IN_CONFIG_TO_BE_PASSED'][$TST_VAL->Field]=1;
  524. $FIELDS_CHECKED['FIELD_IN_CONFIG_THAT_EXISTS'][$TST_VAL->Field]=1;
  525. }
  526. DEBUG_S(-3,'FIELDS_CHECKED',$FIELDS_CHECKED,__FILE__, __FUNCTION__, __LINE__) ;
  527. $var_passed=false;
  528. while($h=mysql_fetch_object($result)) {
  529. //tu sprawdzamy czy sa wszystkie kolumny i maja takie same typy
  530. $FIELDS_CHECKED['FIELD_FROM_DB'][$h->Field]=1;
  531. if(!isset($FIELDS_CHECKED['FIELD_IN_CONFIG_THAT_EXISTS'][$h->Field])) {
  532. DEBUG_S(-3,'Za duzo o komorke '.$h->Field,$FIELDS_CHECKED,__FILE__, __FUNCTION__, __LINE__) ;
  533. $FIELDS_CHECKED['FIELD_IN_CONFIG_THAT_NOT_EXISTS'][$h->Field]=1;
  534. }
  535. foreach($ARR_TABLE['FIELDS'] as $TSTIND=>$TST_VAL) { //tu sprawdzam czy kolumna jest i jaka
  536. // echo "\n Tst ".$TST_VAL->Field." ==? ".$h->Field;
  537. if($TST_VAL->Field==$h->Field) {
  538. $FIELDS_CHECKED['FIELD_FOUND_IN_REMOTE_DB'][$h->Field]=1;
  539. if(isset($FIELDS_CHECKED['FIELD_IN_CONFIG_TO_BE_PASSED'][$h->Field])) //jezeli byla komorka ramowa
  540. unset($FIELDS_CHECKED['FIELD_IN_CONFIG_TO_BE_PASSED'][$h->Field]);
  541. }
  542. }
  543. //$TABLES_IMPORT[$TABLE]['FIELDS']=$h;
  544. }
  545. if(!empty($FIELDS_CHECKED['FIELD_IN_CONFIG_TO_BE_PASSED'])) DEBUG_S(-3,'Brakuje komorek dla '.$TABLE." ",array($FIELDS_CHECKED['FIELD_IN_CONFIG_TO_BE_PASSED']),__FILE__, __FUNCTION__, __LINE__);
  546. DEBUG_S(-3,'FIELDS_CHECKED',$FIELDS_CHECKED,__FILE__, __FUNCTION__, __LINE__) ;
  547. //dodajemy brakujace komorki
  548. if(count($FIELDS_CHECKED['FIELD_IN_CONFIG_TO_BE_PASSED'])>0) {
  549. foreach($FIELDS_CHECKED['FIELD_IN_CONFIG_TO_BE_PASSED'] as $FIELD_TO_ADD=>$VAL ){
  550. set_time_limit(36000);
  551. //echo "\n Trying to add column: ".$FIELD_TO_ADD;
  552. if(isset($INDEX_OF_CONFIG_TABLE)) unset($INDEX_OF_CONFIG_TABLE);
  553. foreach($ARR_TABLE['FIELDS'] as $TSTIND=>$TST_VAL) { //trzeba znalezc numer ID indeksu brakujacej komorki
  554. if($TST_VAL->Field==$FIELD_TO_ADD) $INDEX_OF_CONFIG_TABLE=$TSTIND;
  555. }
  556. // $sql="create table ".$TABLE." ( ".$ARR_TABLE['FIELDS'][0]->Field." ".$ARR_TABLE['FIELDS'][0]->Type ; // ID int(11) NOT NULL AUTO_INCREMENT,
  557. //if($ARR_TABLE['FIELDS'][0]->Extra=='auto_increment') $sql.=" AUTO_INCREMENT "; else $sql.=" ";
  558. $sql="alter table `".$TABLE."` add `".$FIELD_TO_ADD."` ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type." ";
  559. if(($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Default)) {
  560. if(($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Default=='NULL')||($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Default=='CURRENT_TIMESTAMP'))
  561. $sql.=" DEFAULT ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Default." ";// (".$INDEX_OF_CONFIG_TABLE.")";
  562. else $sql.=" DEFAULT '".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Default."' ";// (".$INDEX_OF_CONFIG_TABLE.")";
  563. }
  564. if($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Null=='NO') $sql.=" not null "; else $sql.=" null ";
  565. $sql.=" ;";
  566. echo "\n ".$sql;
  567. $this->query($sql) or DEBUG_S(-3,'Problem z sql',$sql,__FILE__, __FUNCTION__, __LINE__) or die1();
  568. }
  569. } //eof dodajemy brakujace komorki
  570. //Sprawdzamy czy sa zgodne typy komorek...
  571. $sql=" describe `".$TABLE."` ;" ;
  572. DEBUG_S(-3,'describe '.$TABLE,$sql,__FILE__, __FUNCTION__, __LINE__) ;
  573. $result=$this->query($sql) or die1('\nProblem z '.$sql);
  574. while($h=mysql_fetch_object($result)) {
  575. set_time_limit(36000);
  576. $FIELDS_CHECKED['FIELD_FOUND_IN_REMOTE_DB_PROFILE'][$h->Field]=$h;
  577. }
  578. DEBUG_S(-3,'FIELDS_CHECKED',$FIELDS_CHECKED,__FILE__, __FUNCTION__, __LINE__) ;
  579. foreach($FIELDS_CHECKED['FIELD_FOUND_IN_REMOTE_DB_PROFILE'] as $FIELD_TO_CHK=>$VAL) {
  580. if(isset($INDEX_OF_CONFIG_TABLE)) unset($INDEX_OF_CONFIG_TABLE);
  581. foreach($ARR_TABLE['FIELDS'] as $TSTIND=>$TST_VAL) { //trzeba znalezc numer ID indeksu brakujacej komorki
  582. if($TST_VAL->Field==$FIELD_TO_CHK) $INDEX_OF_CONFIG_TABLE=$TSTIND;
  583. }
  584. if(isset($FIELDS_CHECKED['FIELD_IN_CONFIG_THAT_NOT_EXISTS'][$FIELD_TO_CHK])) continue; //jezeli komorki nie ma i jest tylko lokalnie - ignorujemy!
  585. // to jakis glupi warunek ?
  586. if(!isset($INDEX_OF_CONFIG_TABLE)) die1('Nie znaleziono indeksu w konfiguracji dla '.$TABLE.' i komorki '.$FIELD_TO_CHK);
  587. // echo "\nsprawdzamy wszystkie wlasciwosci dla db ".$TABLE." ".$FIELD_TO_CHK." col ".$INDEX_OF_CONFIG_TABLE;
  588. $CHK_TYPES_ARS=array('Type','Null','Default');
  589. $sql="";
  590. // echo "\n if ".$VAL->Type." =? ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type ;
  591. if($VAL->Type!=$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type) {
  592. //! aktualizujemy typy
  593. $sql=" alter table `".$TABLE."` CHANGE `".$FIELD_TO_CHK."` `".$FIELD_TO_CHK."` ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type." ; ";
  594. if(strstr($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, 'char(')&& strstr($VAL->Type, 'char(')){
  595. $src_char_len=ereg_replace('[^0-9]', '',$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type );
  596. $dst_char_len=ereg_replace('[^0-9]', '',$VAL->Type );
  597. if($src_char_len>$dst_char_len) {
  598. DEBUG_S(-3,'Aktualizacja rozszerzajaca zakres pola CHAR : CUR_CHAR_LEN ='.$src_char_len." and dest=".$dst_char_len ,$sql,__FILE__, __FUNCTION__, __LINE__);
  599. $result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL:',$sql,__FILE__, __FUNCTION__, __LINE__) or die1('\nProblem z '.$sql);
  600. } else {
  601. DEBUG_S(-3,'celowe pominiecie - aktualizacja moze skasowac dane w bazie!!! :',$sql,__FILE__, __FUNCTION__, __LINE__);
  602. // die1();
  603. }
  604. } else if(strstr($VAL->Type, 'enum(') && strstr($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, 'enum(' )) { //jezeli zmienia sie ENUM na inne ENUM
  605. preg_match('/^enum\((.*)\)$/', $ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, $src_char_len);
  606. preg_match('/^enum\((.*)\)$/', $VAL->Type, $dst_char_len);
  607. $src_char_len=explode(',', $src_char_len[1]);$dst_char_len=explode(',', $dst_char_len[1]);
  608. foreach($src_char_len as $var) {
  609. if( !in_array($var, $dst_char_len)) $dst_char_len[]=$var;
  610. }
  611. $dst_char_len="enum(".implode(",", $dst_char_len).")";
  612. $sql=" alter table `".$TABLE."` CHANGE `".$FIELD_TO_CHK."` `".$FIELD_TO_CHK."` ".$dst_char_len." ; ";
  613. DEBUG_S(-3,'Uzupelniamy strukture o ewentualnie brakujace elementy (sql,wynik polaczenia,import.strukt.,akt_strukt.)',array($sql,$dst_char_len,$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type,$VAL->Type),__FILE__, __FUNCTION__, __LINE__);
  614. $result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL:',$sql,__FILE__, __FUNCTION__, __LINE__) or die1('\nProblem z '.$sql);
  615. } else if(strstr($VAL->Type, 'set(') && strstr($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, 'set(' )) { //jezeli zmienia sie ENUM na inne ENUM
  616. preg_match('/^set\((.*)\)$/', $ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, $src_char_len);
  617. preg_match('/^set\((.*)\)$/', $VAL->Type, $dst_char_len);
  618. $src_char_len=explode(',', $src_char_len[1]);$dst_char_len=explode(',', $dst_char_len[1]);
  619. foreach($src_char_len as $var) {
  620. if( !in_array($var, $dst_char_len)) $dst_char_len[]=$var;
  621. }
  622. $dst_char_len="set(".implode(",", $dst_char_len).")";
  623. $sql=" alter table `".$TABLE."` CHANGE `".$FIELD_TO_CHK."` `".$FIELD_TO_CHK."` ".$dst_char_len." ; ";
  624. DEBUG_S(-3,'Uzupelniamy strukture o ewentualnie brakujace elementy (sql,wynik polaczenia,import.strukt.,akt_strukt.)',array($sql,$dst_char_len,$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type,$VAL->Type),__FILE__, __FUNCTION__, __LINE__);
  625. $result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL:',$sql,__FILE__, __FUNCTION__, __LINE__) or die1('\nProblem z '.$sql);
  626. } else if(strstr($VAL->Type, 'int(') && strstr($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, 'int(' )) {
  627. preg_match('/^int\((.*)\)$/', $ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, $src_char_len);
  628. preg_match('/^int\((.*)\)$/', $VAL->Type, $dst_char_len);
  629. if($src_char_len[1]>$dst_char_len[1]) {
  630. $sql=" alter table `".$TABLE."` CHANGE `".$FIELD_TO_CHK."` `".$FIELD_TO_CHK."` ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type." ; ";
  631. DEBUG_S(-3,'Aktualizacja rozszerzajaca zakres pola INT ma byc ='.$src_char_len[1]." byla dest=".$dst_char_len[1] ,$sql,__FILE__, __FUNCTION__, __LINE__);
  632. // $result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL:',$sql,__FILE__, __FUNCTION__, __LINE__) or die1('\nProblem z '.$sql);
  633. } else {
  634. DEBUG_S(-3,'Pominieta Aktualizacja zawiezajaca zakres pola INT ma byc ='.$src_char_len[1]." byla dest=".$dst_char_len[1] ,$sql,__FILE__, __FUNCTION__, __LINE__);
  635. }
  636. } else if( ( strstr($VAL->Type, 'char(') || strstr($VAL->Type, 'varchar(') ) && strstr($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, 'text' )
  637. || ( strstr($VAL->Type, 'bigint(') ) && strstr($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, 'longblob' )
  638. || ( strstr($VAL->Type, 'mediumtext') ) && strstr($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, 'longblob' )
  639. || ( strstr($VAL->Type, 'decimal(42') ) && strstr($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, 'decimal(41' )
  640. || ( strstr($VAL->Type, 'decimal(43') ) && strstr($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type, 'decimal(41' )
  641. ) {
  642. $sql=" alter table `".$TABLE."` CHANGE `".$FIELD_TO_CHK."` `".$FIELD_TO_CHK."` ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type." ; ";
  643. DEBUG_S(-3,'Aktualizacja rozszerzajaca zakres pola varchar/char() do text()',$sql,__FILE__, __FUNCTION__, __LINE__);
  644. $result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL:',$sql,__FILE__, __FUNCTION__, __LINE__) or die1('\nProblem z '.$sql);
  645. // DEBUG_S(-3,'Pominieta Aktualizacja zawiezajaca zakres pola INT ma byc ='.$src_char_len[1]." byla dest=".$dst_char_len[1] ,$sql,__FILE__, __FUNCTION__, __LINE__);
  646. } else {
  647. DEBUG_S(-3,'Celowe zabicie z uwagi na niebezpieczenstwo zmiany typu: sql/old/new',array($sql,$VAL->Type,$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type),__FILE__, __FUNCTION__, __LINE__);
  648. die1();
  649. $result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL:',$sql,__FILE__, __FUNCTION__, __LINE__) or die1('\nProblem z '.$sql);
  650. }
  651. }
  652. if($VAL->Null!=$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Null)
  653. if($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Null=='YES') {
  654. $sql=" alter table `".$TABLE."` CHANGE `".$FIELD_TO_CHK."` `".$FIELD_TO_CHK."` ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type." NULL ; ";
  655. $result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL ',$sql,__FILE__, __FUNCTION__, __LINE__) or DIE();
  656. } else {
  657. $sql=" alter table `".$TABLE."` CHANGE `".$FIELD_TO_CHK."` `".$FIELD_TO_CHK."` ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type." NOT NULL ; ";
  658. $result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL ',$sql,__FILE__, __FUNCTION__, __LINE__) or DIE();
  659. }
  660. if($VAL->Default!=$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Default) {
  661. if($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Default=='CURRENT_TIMESTAMP')
  662. $sql=" alter table `".$TABLE."` CHANGE `".$FIELD_TO_CHK."` `".$FIELD_TO_CHK."` ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type." DEFAULT ".str_replace("'","",$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Default)." ; ";
  663. else if(empty($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Default))
  664. $sql=" alter table `".$TABLE."` CHANGE `".$FIELD_TO_CHK."` `".$FIELD_TO_CHK."` ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type." ; ";
  665. else $sql=" alter table `".$TABLE."` CHANGE `".$FIELD_TO_CHK."` `".$FIELD_TO_CHK."` ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type." DEFAULT '".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Default."' ; ";
  666. $result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL ',$sql,__FILE__, __FUNCTION__, __LINE__) or DIE();
  667. }
  668. //autoincrement:
  669. if(($VAL->Extra!=$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Extra)&&$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Extra=='auto_increment' ) {
  670. //sprawdzmy czy nie ma w tabeli klucza z PRIMARY z ID
  671. $sql="show keys from `".$TABLE."`";
  672. $result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL ',$sql,__FILE__, __FUNCTION__, __LINE__) or DIE();
  673. $TEST_IF_HAS_PRIMARY=false;
  674. while($tst=mysql_fetch_object($result)) { //dla kazdego klucza
  675. if($tst->Column_name==$FIELD_TO_CHK) //sprawdz czy jest klucz do tej kolumny
  676. if($tst->Key_name=='PRIMARY') $TEST_IF_HAS_PRIMARY=true; //jezeli jest primary, to flagujemy
  677. }
  678. if($TEST_IF_HAS_PRIMARY==false) { //bedziemy dodawac primary key
  679. $sql="ALTER TABLE `".$TABLE."` ADD PRIMARY KEY ( `".$FIELD_TO_CHK."` )";
  680. $result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL ',$sql,__FILE__, __FUNCTION__, __LINE__) or DIE();
  681. }
  682. $sql=" alter table `".$TABLE."` CHANGE `".$FIELD_TO_CHK."` `".$FIELD_TO_CHK."` ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Type." ".$ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE]->Extra." ; ";
  683. echo "\n SQL auto_increment ".$sql ;
  684. $result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL ',$sql,__FILE__, __FUNCTION__, __LINE__) or DIE();
  685. }
  686. //foreach($ARR_TABLE['FIELDS'][$INDEX_OF_CONFIG_TABLE] as $TST_FIELD_IND=>$TST_FIELD_VAL) {
  687. // echo "\n TST2 ".$TST_FIELD_IND." ?= ".$FIELDS_CHECKED['FIELD_FOUND_IN_REMOTE_DB_PROFILE'][$TST_FIELD_IND]->$TST_FIELD_IND;
  688. //}
  689. }
  690. //print_r($FIELDS_CHECKED);
  691. $sql=" show index from `".$TABLE."` ;" ;
  692. echo "\n ".$sql;
  693. $result=$this->query($sql) or die1('\nProblem z '.$sql);
  694. while($h=mysql_fetch_object($result)) {
  695. set_time_limit(36000);
  696. $FIELDS_CHECKED['INDEX_FOUND_IN_TABLES'][$h->Key_name]=$h;
  697. }
  698. foreach($ARR_TABLE['INDEX'] as $FOUND_INDEX_NAME=>$FOUND_INDEX_ARR){
  699. $FIELDS_CHECKED['INDEX_TO_BE_FOUND_IN_TABLES'][$FOUND_INDEX_NAME]=$FOUND_INDEX_ARR;
  700. }
  701. DEBUG_S(-3,'Znaleziono indeksy w tabeli '.$TABLE." FOUND/TO_BE_FOUND",array($FIELDS_CHECKED['INDEX_FOUND_IN_TABLES'],$FIELDS_CHECKED['INDEX_TO_BE_FOUND_IN_TABLES']),__FILE__, __FUNCTION__, __LINE__);
  702. //teraz wygaszam znalezione indeksy
  703. foreach($ARR_TABLE['INDEX'] as $FOUND_INDEX_NAME=>$FOUND_INDEX_ARR){
  704. echo "\n If jest ".$FOUND_INDEX_NAME;
  705. if(isset($FIELDS_CHECKED['INDEX_FOUND_IN_TABLES'][$FOUND_INDEX_NAME]))
  706. unset($FIELDS_CHECKED['INDEX_TO_BE_FOUND_IN_TABLES'][$FOUND_INDEX_NAME]);
  707. }
  708. //print_r($FIELDS_CHECKED['INDEX_TO_BE_FOUND_IN_TABLES']);
  709. //brakujace klucze dodajemy
  710. foreach($FIELDS_CHECKED['INDEX_TO_BE_FOUND_IN_TABLES'] as $FOUND_INDEX_NAME=>$FOUND_INDEX_ARR) {
  711. if($FOUND_INDEX_NAME=='PRIMARY') {
  712. $FOUND_INDEX_ARR->Column_name=str_replace('`','',$FOUND_INDEX_ARR->Column_name);
  713. $sql="ALTER TABLE `".$TABLE."` ADD PRIMARY KEY ( `".$FOUND_INDEX_ARR->Column_name."` ) ;";
  714. echo "\n 927: ".$sql;
  715. $result=$this->query($sql) or print_r($FIELDS_CHECKED) && die1('\nProblem z '.$sql);
  716. $sql="ALTER TABLE `".$TABLE."` CHANGE `".$FOUND_INDEX_ARR->Column_name."` `".$FOUND_INDEX_ARR->Column_name."` ".$FIELDS_CHECKED['FIELD_FOUND_IN_REMOTE_DB_PROFILE'][$FOUND_INDEX_ARR->Column_name]->Type." AUTO_INCREMENT ; ";
  717. echo "\n ".$sql;
  718. $result=$this->query($sql) or print_r($FIELDS_CHECKED) && die1('\nProblem z '.$sql);
  719. $result=$this->query($sql) or print_r($FIELDS_CHECKED) && die1('\nProblem z '.$sql);
  720. } else if($FOUND_INDEX_ARR->Non_unique==1) {
  721. $sql="ALTER TABLE `".$TABLE."` ADD KEY `".$FOUND_INDEX_ARR->Key_name."` ( ".$FOUND_INDEX_ARR->Column_name." ) ;" ;
  722. echo "\n ".$sql;
  723. $result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL:',$sql,__FILE__, __FUNCTION__, __LINE__) or die1();
  724. } else {
  725. set_time_limit(36000);
  726. //@2013-01-17 poprawka do kluczy bledu w stylu ALTER TABLE `IN7_PRODUKTY_CECHY` ADD UNIQUE `UNIK_CECHY_PRODUKTU` ( CECHA_ID, PRODUKT_ID , DESC ) ;
  727. $CORRECT_INDEX_FOUNDKEY="";
  728. if(!strstr($FOUND_INDEX_ARR->Column_name,'`')) {
  729. $explode=explode(' ',$FOUND_INDEX_ARR->Column_name);
  730. foreach($explode as $exploded) {
  731. $exploded=str_replace(',','',$exploded); //wywalenie przecinkow
  732. if((!strstr($exploded,' '))&&(strlen($exploded)>1))
  733. if($CORRECT_INDEX_FOUNDKEY) $CORRECT_INDEX_FOUNDKEY.=" , `".$exploded."` ";
  734. else $CORRECT_INDEX_FOUNDKEY.=" `".$exploded."` ";
  735. }
  736. } else $CORRECT_INDEX_FOUNDKEY=$FOUND_INDEX_ARR->Column_name;
  737. // $CORRECT_INDEX_FOUNDKEY=$FOUND_INDEX_ARR->Column_name;
  738. $sql="ALTER TABLE `".$TABLE."` ADD UNIQUE `".$FOUND_INDEX_ARR->Key_name."` ( ".$CORRECT_INDEX_FOUNDKEY." ) ;" ;
  739. echo "\n ".$sql;
  740. $result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL:',$sql,__FILE__, __FUNCTION__, __LINE__) or die1();
  741. }
  742. }
  743. flush();
  744. //print_r($FIELDS_CHECKED);
  745. unset($FIELDS_CHECKED);
  746. $sql=" show triggers like '".$TABLE."' ;" ; //listujemy nasze triggery z tej tabeli
  747. DEBUG_S(-3,'Looking for triggers in '.$TABLE,$sql,__FILE__,__FUNCTION__,__LINE__);
  748. $result=$this->query($sql) or die1('\nProblem z '.$sql);
  749. while($h=mysql_fetch_object($result)) {
  750. set_time_limit(36000);
  751. $sql_="show create trigger {$h->Trigger} ;" ;
  752. //echo $sql_;
  753. $result_=$this->query($sql_) or die1('\nProblem z '.$sql_);
  754. while($h_=mysql_fetch_object($result_)) {
  755. $FIELDS_CHECKED['TRIGGER_FOUNDS'][$h->Trigger]=$h_;
  756. if(!isset($ARR_TABLE['TRIGGERS'][$h->Trigger])) $FIELDS_CHECKED['TRIGGER_TO_DELETE'][$h->Trigger]=$h_;
  757. }
  758. }
  759. DEBUG_S(-3,'Try to unserialize trigger and install to db:',$ARR_TABLE['TRIGGERS'],__FILE__,__FUNCTION__,__LINE__);
  760. //! try to synchronize triggers $TABLE=>$ARR_TABLE
  761. foreach($ARR_TABLE['TRIGGERS'] as $TRIGGER_INDEX=>$TRIGGER_OBJECT) {
  762. if(!isset($FIELDS_CHECKED['TRIGGER_FOUNDS'][$TRIGGER_INDEX])) $FIELDS_CHECKED['TRIGGER_TO_CREATE'][$TRIGGER_INDEX]=$TRIGGER_OBJECT;
  763. }
  764. //staramy sie zaktualizowac stare triggery, pod warunkiem, ze sie roznia
  765. foreach($FIELDS_CHECKED['TRIGGER_FOUNDS'] as $TRIGGER_INDEX=>$TRIGGER_OBJECT) {
  766. DEBUG_S(-3,'TRIGGER_OBJECT/$TRIGGER_OBJECT for '.$TRIGGER_INDEX,array($TRIGGER_OBJECT,$ARR_TABLE['TRIGGERS'][$TRIGGER_INDEX]),__FILE__, __FUNCTION__, __LINE__);
  767. if(isset($ARR_TABLE['TRIGGERS'][$TRIGGER_INDEX])) //we first try to find if this trigger exists or delete it
  768. if($TRIGGER_OBJECT->{'SQL Original Statement'}<>$ARR_TABLE['TRIGGERS'][$TRIGGER_INDEX]->{'SQL Original Statement'} ) {
  769. DEBUG_S(-3,"Triggers are different ({$TRIGGER_INDEX}). We add object to be created as new.",__FILE__, __FUNCTION__, __LINE__);
  770. $FIELDS_CHECKED['TRIGGER_TO_CREATE'][$TRIGGER_INDEX]=$ARR_TABLE['TRIGGERS'][$TRIGGER_INDEX];
  771. $FIELDS_CHECKED['TRIGGER_TO_DELETE'][$TRIGGER_INDEX]=true;
  772. }
  773. }
  774. if(isset($FIELDS_CHECKED['TRIGGER_TO_DELETE'])) {
  775. DEBUG_S(-3,'We have some triggers to delete',$FIELDS_CHECKED['TRIGGER_TO_DELETE'],__FILE__,__FUNCTION__,__LINE__);
  776. foreach($FIELDS_CHECKED['TRIGGER_TO_DELETE'] as $TRIGGER_INDEX=>$TRIGGER_OBJECT ) {
  777. $sql="DROP TRIGGER IF EXISTS `{$TRIGGER_INDEX}`; ";
  778. DEBUG_S(-3,' sql to delete trigger '.$TRIGGER_INDEX,$sql,__FILE__,__FUNCTION__,__LINE__);
  779. $result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL:',$sql,__FILE__, __FUNCTION__, __LINE__) or die1();
  780. }
  781. }
  782. //tworzymy brakujace procedury
  783. foreach ($FIELDS_CHECKED['TRIGGER_TO_CREATE'] as $TRIGGER_INDEX=>$TRIGGER_OBJECT) {
  784. //$sql="DROP TRIGGER IF EXISTS `{$TRIGGER_INDEX}`; ";
  785. //DEBUG_S(-3,'Delete old trigger '.$TRIGGER_INDEX,$sql,__FILE__,__FUNCTION__,__LINE__);
  786. // $result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL:',array($sql,mysql_error() ),__FILE__, __FUNCTION__, __LINE__) or die1();
  787. // $result=$this->query("show create trigger {$TRIGGER_INDEX}") or DEBUG_S(-3,'Problem ze SQL:'.mysql_error(),$sql,__FILE__, __FUNCTION__, __LINE__) or die1();
  788. $sql=$TRIGGER_OBJECT->{'SQL Original Statement'};
  789. DEBUG_S(-3,'Try to add new trigger '.$TRIGGER_INDEX,$sql,__FILE__,__FUNCTION__,__LINE__);
  790. $result=$this->query($sql) or DEBUG_S(-3,'Problem ze SQL:',$sql,__FILE__, __FUNCTION__, __LINE__) or die1();
  791. }
  792. }
  793. //tu bedziemy dodawac wartosci insert :
  794. $sql="select count(*) as ilosc from `".$TABLE."` ;" ;
  795. DEBUG_S(-3,'SQL: licze czy cos jest w tabeli ',$sql,__FILE__, __FUNCTION__, __LINE__) ;
  796. $result=$this->query($sql) or die1('\nProblem z '.$sql);
  797. $ilosc=0;
  798. //while($h=mysql_fetch_object($result)) {
  799. // $ilosc=$h->ilosc;
  800. //}
  801. //if($ilosc>0) {
  802. // DEBUG_S(-2,'Nie trzeba dodawac rekordow - juz jakies sa w tabeli: ilosc : ',$ilosc,__FILE__,__FUNCTION__,__LINE__);
  803. // continue ;
  804. //} else {
  805. if(!empty($ARR_TABLE['VALUES']))
  806. foreach($ARR_TABLE['VALUES'] as $ROW) {
  807. $sql="insert ignore into `".$TABLE."` values ( ";
  808. $vals="";
  809. foreach($ROW as $FIELD=>$VAL) {
  810. if(!$vals) $vals.="'".$VAL."'" ; else $vals.=" , '".$VAL."' ";
  811. }
  812. $sql.=$vals." ) ;";
  813. $this->query($sql) or die1('\nProblem z '.$sql);
  814. DEBUG_S(-3,'Dodanie rekordu do tabeli ',$sql,__FILE__,__FUNCTION__,__LINE__);
  815. }
  816. //}
  817. }
  818. }
  819. }