superedit-SYNC_DATABASES.php 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. <?php
  2. //
  3. // synchronizacja do serwera postgres GIS
  4. //
  5. include_once('se-lib/DB_Dump.php');
  6. include_once('se-lib/UsersHelper.php');
  7. include_once('se-lib/Data_Source.php');
  8. class SYNC_DATABASES {
  9. //plan
  10. // jakie tabele
  11. // synchronizujemy struktury - pierw nasze do gis, potem z gis do nas
  12. // dodajemy triggery do remote dla A_RECORD_UPDATE_DATE i A_RECORD_UPDATE_AUTHOR i CREATE_DATE i CREATE_AUTHOR + do HISTA? potem
  13. // ewentualnie do tabeli mowiacej o stanie synchronizacji _SYNC_DATABASE_TABLE_STATE
  14. // todo
  15. function set_table_to_sync($table) {
  16. $this->set_table_to_sync[]=$table;
  17. }
  18. function set_local_db_id($id) {
  19. $this->local_db_id=$id;
  20. $this->db = DB::getDB($id);
  21. }
  22. function set_remote_db_id($id) {
  23. $this->remote_db_id=$id;
  24. $this->gdb = DB::getDB($id);
  25. }
  26. function get_last_sync_date($table) {
  27. $sql="select TABLE_NAME, unix_timestamp(LAST_SYNCED) as LAST_SYNCED from _SYNC_DATABASE_TABLE_STATE
  28. where DATABASE_SYNCED_ID='".$this->remote_db_id."' and DATABASE_LOCAL_ID='".$this->local_db_id."' and TABLE_NAME='".$table."'
  29. order by ID desc limit 1
  30. ";
  31. $res=DB::query($sql);
  32. DEBUG_S(-3,'Get date',$sql,__FILE__,__FUNCTION__,__LINE__);
  33. while($h=DB::fetch($res)) {
  34. return $h->LAST_SYNCED;
  35. }
  36. return 0;
  37. }
  38. function set_last_sync_date($table,$now) {
  39. $sql="insert into _SYNC_DATABASE_TABLE_STATE ( TABLE_NAME, LAST_SYNCED , DATABASE_SYNCED_ID , DATABASE_LOCAL_ID )
  40. values ('".$table."' , from_unixtime('".$now."') , '".$this->remote_db_id."' , '".$this->local_db_id."')";
  41. DEBUG_S(-3,'update sync date',$sql,__FILE__,__FUNCTION__,__LINE__);
  42. DB::query($sql);
  43. $sql="update _SYNC_DATABASE_TABLE_STATE set LAST_SYNCED=from_unixtime('".$now."') where TABLE_NAME='".$table."'
  44. and DATABASE_SYNCED_ID='".$this->remote_db_id."' and DATABASE_LOCAL_ID='".$this->local_db_id."' ";
  45. DEBUG_S(-3,'update sync date',$sql,__FILE__,__FUNCTION__,__LINE__);
  46. }
  47. function sync_struct() {
  48. $struct_rem=$this->gdb->STRUCTURE_GENERATE($this->set_table_to_sync,null,null);
  49. DEBUG_S(-3,'Structure rem',$struct_rem,__FILE__,__FUNCTION__,__LINE__);
  50. $this->db->STRUCTURE_GENERATE_PARSE($struct_rem,array('SKIP-PROCEDURE','SKIP-FUNCTION','SKIP-VIEW','SKIP-PRIMARY-KEY','getDB'=>$this->local_db_id,'CONFIRM_SQL_UPDATE'=>1));
  51. $struct_loc=$this->db->STRUCTURE_GENERATE($this->set_table_to_sync,null,null);
  52. DEBUG_S(-3,'Structure local',$struct_loc,__FILE__,__FUNCTION__,__LINE__);
  53. $this->gdb->STRUCTURE_GENERATE_PARSE($struct_loc,array('SKIP-PROCEDURE','SKIP-FUNCTION','SKIP-VIEW','SKIP-PRIMARY-KEY','getDB'=>$this->remote_db_id));
  54. foreach($this->set_table_to_sync as $table) {
  55. $this->db->MAKE_SE_AND_HIST_FIELDS_FOR_TABLE($table);
  56. $this->gdb->MAKE_SE_AND_HIST_FIELDS_FOR_TABLE($table);
  57. }
  58. }
  59. function get_current_time() {
  60. $this->currtime_loc=$this->db->get_current_time();
  61. $this->currtime_rem=$this->gdb->get_current_time();
  62. DEBUG_S(-3,'Times curr',array($this->currtime_loc,$this->currtime_rem),__FILE__,__FUNCTION__,__LINE__);
  63. }
  64. function sync_data() {
  65. // $struct_loc=$this->db->STRUCTURE_GENERATE(array('_SYNC_DATABASE_TABLE_STATE'),null,null);
  66. // $this->gdb->STRUCTURE_GENERATE_PARSE($struct_loc,array('SKIP-PROCEDURE','SKIP-FUNCTION','SKIP-VIEW'));
  67. foreach($this->set_table_to_sync as $table) {
  68. unset($this->ids_rem);
  69. unset($this->ids_loc);
  70. //Przegrywamy danych ktorych nie ma
  71. //Synchronizujemy zmiany
  72. //Zaznaczmy poczatkowa zakresu synchronizacji (wszystko co potem, bedzie znowu musialo isc do synchronizacji)
  73. //To samo po stronie lokalnej i zdalnej
  74. //Wez dane z jednej i drugiej strony po dacie i wrzuc na druga strone zawsze (lecimy po historii)
  75. //$LAST_SYNCED=$this->db->get_last_sync_date($table);
  76. $LAST_SYNCED_loc=$this->db->get_last_sync_date($table,$this->remote_db_id,$this->local_db_id);
  77. $LAST_SYNCED_rem=$this->gdb->get_last_sync_date($table,$this->local_db_id,$this->remote_db_id);
  78. self::get_current_time();
  79. $loc_key=$this->db->show_index_value($table);
  80. $rem_key=$this->gdb->show_index_value($table);
  81. DEBUG_S(-3,'Last synced for (last_sync_loc,last_sync_rem,loc_key,rem_key) '.$table,array($LAST_SYNCED_loc,$LAST_SYNCED_rem,$loc_key,$rem_key),__FILE__,__FUNCTION__,__LINE__);
  82. $ids_rem=$this->gdb->get_by_data_column($table,'A_RECORD_UPDATE_DATE',$LAST_SYNCED_rem,$this->currtime_rem,$loc_key);
  83. while($h=$this->gdb->fetch($ids_rem)) {
  84. $this->ids_rem[$h->$rem_key]=$h;
  85. }
  86. $ids_loc=$this->db->get_by_data_column($table,'A_RECORD_UPDATE_DATE',$LAST_SYNCED_loc,$this->currtime_loc,$rem_key);
  87. while($h=$this->db->fetch($ids_loc)) {
  88. $this->ids_loc[$h->$loc_key]=$h;
  89. }
  90. // DEBUG_S(-3,'this->ids_rem',$this->ids_rem,__FILE__,__FUNCTION__,__LINE__);
  91. // DEBUG_S(-3,'this->ids_loc',$this->ids_loc,__FILE__,__FUNCTION__,__LINE__);
  92. DEBUG_S(-3,'structure',$this->db->describe_table_value($table),__FILE__,__FUNCTION__,__LINE__);
  93. // die('test');
  94. // $ds_loc = new Data_Source($this->local_db_id);
  95. // $ds_loc->setTable($table);
  96. //1) insert new data (data without remote primary key) and vice_versa
  97. DEBUG_S(-3,'Jade z REM do LOCAL',null,__FILE__,__FUNCTION__,__LINE__);
  98. foreach($this->ids_rem as $ind=>$val) {
  99. if(empty($val->$loc_key)) {
  100. //nowe rekordy ze zdalnego
  101. // echo "<br> Adding to ".$table." ".print_r($val);
  102. //DEBUG_S(-3,'Dodajemy to tabeli',$val,__FILE__,__FUNCTION__,__LINE__);
  103. $last_id=$this->db->ADD_NEW_OBJ($table,$this->db->MAKE_DB_OBJ($table,$val),'die_on_error') or die('Blad dodania: '.__LINE__." ".$sql);
  104. $sql='update "'.$table.'" set "'.$loc_key.'"=\''.$last_id.'\' where "'.$rem_key.'"='.$val->$rem_key;
  105. DEBUG_S(-3,'notified new obj to rem',$sql,__FILE__,__FUNCTION__,__LINE__);
  106. $this->gdb->query($sql);
  107. // echo "<br>";
  108. } else {
  109. if(empty($this->ids_loc[$val->$loc_key])) {
  110. DEBUG_S(-3,"Brak klucza w loc ".$loc_key." (".$val->$loc_key.") - robie UPDATE w LOC ",$val,__FILE__,__FUNCTION__,__LINE__);
  111. $res=$this->db->UPDATE_OBJ($table,$this->db->MAKE_DB_OBJ($table,$val),null,'skip_author') ;
  112. DEBUG_S(-3,'Res od aktualizacji',$res,__FILE__,__FUNCTION__,__LINE__);
  113. }
  114. }
  115. }
  116. DEBUG_S(-3,'Jade z LOCAL(se) do REM(gis)',null,__FILE__,__FUNCTION__,__LINE__);
  117. //insert lokalnych nowych do zdalnego
  118. foreach($this->ids_loc as $ind=>$val) {
  119. if(!($val->$rem_key)) {
  120. //nowe rekordy ze zdalnego
  121. $val_loc_key=$val->$loc_key;
  122. //echo "<br> Adding to ".$table." local key of(".$loc_key.") is ".$val->$loc_key." " .print_r($val);
  123. //DEBUG_S(-3,'Dodajemy to tabeli',$val,__FILE__,__FUNCTION__,__LINE__);
  124. $last_id=$this->gdb->ADD_NEW_OBJ($table,$this->gdb->MAKE_DB_OBJ($table,$val),'dieonerror');
  125. $sql='update `'.$table.'` set `'.$rem_key.'`=\''.$last_id.'\' where `'.$loc_key.'`='.$val_loc_key;
  126. DEBUG_S(-3,'notified new obj to rem',array($sql,$last_id),__FILE__,__FUNCTION__,__LINE__);
  127. $this->db->query($sql);
  128. // echo "<br>";
  129. } else {
  130. if(empty($this->ids_rem[$val->$rem_key])) {
  131. DEBUG_S(-3,"Brak klucza w rem ".$rem_key." (".$val->$rem_key.") - robie UPDATE w REM",array($val,$this->gdb->MAKE_DB_OBJ($table,$val)),__FILE__,__FUNCTION__,__LINE__);
  132. $res=$this->gdb->UPDATE_OBJ($table,$this->gdb->MAKE_DB_OBJ($table,$val),null,'skip_author') ;
  133. DEBUG_S(-3,'Res od aktualizacji',$res,__FILE__,__FUNCTION__,__LINE__);
  134. }
  135. }
  136. }
  137. //self::set_last_sync_date($table,$this->currtime_loc);
  138. $this->db->set_last_sync_date($table,$this->currtime_loc,$this->remote_db_id,$this->local_db_id);
  139. $this->gdb->set_last_sync_date($table,$this->currtime_rem,$this->local_db_id,$this->remote_db_id);
  140. }
  141. }
  142. }
  143. $sd = new SYNC_DATABASES;
  144. $sd->set_local_db_id(36);
  145. $sd->set_remote_db_id(13102);
  146. //$sd->set_table_to_sync('opt_tuby');
  147. //$sd->set_table_to_sync('opt_porty');
  148. //$sd->set_table_to_sync('opt_przelacznice_mufy');
  149. //$sd->set_table_to_sync('opt_tacki');
  150. //$sd->set_table_to_sync('opt_spawy');
  151. //$sd->set_table_to_sync('opt_wlokna');
  152. //$sd->set_table_to_sync('Rozdzielcza_lokalizacje'); //
  153. //$sd->set_table_to_sync('Rozdzielcza_wezly'); //
  154. $sd->set_table_to_sync('solectwa_poligon'); //
  155. $sd->set_table_to_sync('Kabel_TPSA_dzierzawa'); //
  156. $sd->set_table_to_sync('Rozdzielcza_Przeciski_110mm');
  157. $sd->set_table_to_sync('Rozdzielcza_Wykop_przedmiar_na_mikrorurki');
  158. $sd->set_table_to_sync('Rozdzielcza_Zabruki');
  159. $sd->set_table_to_sync('Rozdzielcza_koszty_dodatkowe_wsg84');
  160. $sd->set_table_to_sync('Rozdzielcza_rurociag_wsg84');
  161. $sd->set_table_to_sync('Rozdzielcza_wewn_kabel_ethernet');
  162. $sd->set_table_to_sync('Studnie');
  163. $sd->set_table_to_sync('pod_816_3');
  164. $sd->set_table_to_sync('gminy_wsg84');
  165. $sd->set_table_to_sync('solectwa_poligon');
  166. $sd->set_table_to_sync('Rozdzielcza_Kabel_Swiatlowodowy_wsg84');
  167. $sd->set_table_to_sync('Rozdzielcza_PionyKablowe');
  168. $sd->set_table_to_sync('Rozdzielcza_Mikrokanalizacja_do_klienta');
  169. $sd->set_table_to_sync('BUILDINGS');
  170. $sd->set_table_to_sync('USERS2_MARKETING');
  171. $sd->set_table_to_sync('TELBOXES');
  172. $sd->set_table_to_sync('Rozdzielcza_rurociag_wsg84');
  173. $sd->set_table_to_sync('MK_Rewiry');
  174. $sd->set_table_to_sync('IN7_MK_BAZA_DYSTRYBUCJI');
  175. $sd->sync_struct();
  176. $sd->sync_data();
  177. die('Temporary die at line 19 call bindera');