Pgsql.php 49 KB

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