| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- <?php
- //
- // synchronizacja do serwera postgres GIS
- //
- include_once('se-lib/DB_Dump.php');
- include_once('se-lib/UsersHelper.php');
- include_once('se-lib/Data_Source.php');
- class SYNC_DATABASES {
- //plan
- // jakie tabele
- // synchronizujemy struktury - pierw nasze do gis, potem z gis do nas
- // dodajemy triggery do remote dla A_RECORD_UPDATE_DATE i A_RECORD_UPDATE_AUTHOR i CREATE_DATE i CREATE_AUTHOR + do HISTA? potem
- // ewentualnie do tabeli mowiacej o stanie synchronizacji _SYNC_DATABASE_TABLE_STATE
- // todo
-
-
- function set_table_to_sync($table) {
- $this->set_table_to_sync[]=$table;
- }
-
-
- function set_local_db_id($id) {
- $this->local_db_id=$id;
- $this->db = DB::getDB($id);
- }
-
- function set_remote_db_id($id) {
- $this->remote_db_id=$id;
- $this->gdb = DB::getDB($id);
- }
-
-
-
-
- function get_last_sync_date($table) {
- $sql="select TABLE_NAME, unix_timestamp(LAST_SYNCED) as LAST_SYNCED from _SYNC_DATABASE_TABLE_STATE
- where DATABASE_SYNCED_ID='".$this->remote_db_id."' and DATABASE_LOCAL_ID='".$this->local_db_id."' and TABLE_NAME='".$table."'
- order by ID desc limit 1
- ";
- $res=DB::query($sql);
- DEBUG_S(-3,'Get date',$sql,__FILE__,__FUNCTION__,__LINE__);
- while($h=DB::fetch($res)) {
- return $h->LAST_SYNCED;
-
- }
- return 0;
- }
-
-
- function set_last_sync_date($table,$now) {
- $sql="insert into _SYNC_DATABASE_TABLE_STATE ( TABLE_NAME, LAST_SYNCED , DATABASE_SYNCED_ID , DATABASE_LOCAL_ID )
- values ('".$table."' , from_unixtime('".$now."') , '".$this->remote_db_id."' , '".$this->local_db_id."')";
- DEBUG_S(-3,'update sync date',$sql,__FILE__,__FUNCTION__,__LINE__);
- DB::query($sql);
- $sql="update _SYNC_DATABASE_TABLE_STATE set LAST_SYNCED=from_unixtime('".$now."') where TABLE_NAME='".$table."'
- and DATABASE_SYNCED_ID='".$this->remote_db_id."' and DATABASE_LOCAL_ID='".$this->local_db_id."' ";
- DEBUG_S(-3,'update sync date',$sql,__FILE__,__FUNCTION__,__LINE__);
- }
- function sync_struct() {
-
- $struct_rem=$this->gdb->STRUCTURE_GENERATE($this->set_table_to_sync,null,null);
- DEBUG_S(-3,'Structure rem',$struct_rem,__FILE__,__FUNCTION__,__LINE__);
- $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));
-
- $struct_loc=$this->db->STRUCTURE_GENERATE($this->set_table_to_sync,null,null);
- DEBUG_S(-3,'Structure local',$struct_loc,__FILE__,__FUNCTION__,__LINE__);
- $this->gdb->STRUCTURE_GENERATE_PARSE($struct_loc,array('SKIP-PROCEDURE','SKIP-FUNCTION','SKIP-VIEW','SKIP-PRIMARY-KEY','getDB'=>$this->remote_db_id));
- foreach($this->set_table_to_sync as $table) {
- $this->db->MAKE_SE_AND_HIST_FIELDS_FOR_TABLE($table);
- $this->gdb->MAKE_SE_AND_HIST_FIELDS_FOR_TABLE($table);
- }
-
-
- }
-
-
- function get_current_time() {
- $this->currtime_loc=$this->db->get_current_time();
- $this->currtime_rem=$this->gdb->get_current_time();
- DEBUG_S(-3,'Times curr',array($this->currtime_loc,$this->currtime_rem),__FILE__,__FUNCTION__,__LINE__);
- }
-
-
- function sync_data() {
- // $struct_loc=$this->db->STRUCTURE_GENERATE(array('_SYNC_DATABASE_TABLE_STATE'),null,null);
- // $this->gdb->STRUCTURE_GENERATE_PARSE($struct_loc,array('SKIP-PROCEDURE','SKIP-FUNCTION','SKIP-VIEW'));
-
- foreach($this->set_table_to_sync as $table) {
- unset($this->ids_rem);
- unset($this->ids_loc);
- //Przegrywamy danych ktorych nie ma
- //Synchronizujemy zmiany
- //Zaznaczmy poczatkowa zakresu synchronizacji (wszystko co potem, bedzie znowu musialo isc do synchronizacji)
- //To samo po stronie lokalnej i zdalnej
- //Wez dane z jednej i drugiej strony po dacie i wrzuc na druga strone zawsze (lecimy po historii)
- //$LAST_SYNCED=$this->db->get_last_sync_date($table);
- $LAST_SYNCED_loc=$this->db->get_last_sync_date($table,$this->remote_db_id,$this->local_db_id);
- $LAST_SYNCED_rem=$this->gdb->get_last_sync_date($table,$this->local_db_id,$this->remote_db_id);
- self::get_current_time();
- $loc_key=$this->db->show_index_value($table);
- $rem_key=$this->gdb->show_index_value($table);
- 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__);
- $ids_rem=$this->gdb->get_by_data_column($table,'A_RECORD_UPDATE_DATE',$LAST_SYNCED_rem,$this->currtime_rem,$loc_key);
- while($h=$this->gdb->fetch($ids_rem)) {
- $this->ids_rem[$h->$rem_key]=$h;
- }
- $ids_loc=$this->db->get_by_data_column($table,'A_RECORD_UPDATE_DATE',$LAST_SYNCED_loc,$this->currtime_loc,$rem_key);
- while($h=$this->db->fetch($ids_loc)) {
- $this->ids_loc[$h->$loc_key]=$h;
- }
- // DEBUG_S(-3,'this->ids_rem',$this->ids_rem,__FILE__,__FUNCTION__,__LINE__);
- // DEBUG_S(-3,'this->ids_loc',$this->ids_loc,__FILE__,__FUNCTION__,__LINE__);
- DEBUG_S(-3,'structure',$this->db->describe_table_value($table),__FILE__,__FUNCTION__,__LINE__);
- // die('test');
- // $ds_loc = new Data_Source($this->local_db_id);
- // $ds_loc->setTable($table);
- //1) insert new data (data without remote primary key) and vice_versa
-
- DEBUG_S(-3,'Jade z REM do LOCAL',null,__FILE__,__FUNCTION__,__LINE__);
- foreach($this->ids_rem as $ind=>$val) {
- if(empty($val->$loc_key)) {
- //nowe rekordy ze zdalnego
- // echo "<br> Adding to ".$table." ".print_r($val);
- //DEBUG_S(-3,'Dodajemy to tabeli',$val,__FILE__,__FUNCTION__,__LINE__);
- $last_id=$this->db->ADD_NEW_OBJ($table,$this->db->MAKE_DB_OBJ($table,$val),'die_on_error') or die('Blad dodania: '.__LINE__." ".$sql);
- $sql='update "'.$table.'" set "'.$loc_key.'"=\''.$last_id.'\' where "'.$rem_key.'"='.$val->$rem_key;
- DEBUG_S(-3,'notified new obj to rem',$sql,__FILE__,__FUNCTION__,__LINE__);
- $this->gdb->query($sql);
- // echo "<br>";
-
-
- } else {
- if(empty($this->ids_loc[$val->$loc_key])) {
- DEBUG_S(-3,"Brak klucza w loc ".$loc_key." (".$val->$loc_key.") - robie UPDATE w LOC ",$val,__FILE__,__FUNCTION__,__LINE__);
- $res=$this->db->UPDATE_OBJ($table,$this->db->MAKE_DB_OBJ($table,$val),null,'skip_author') ;
- DEBUG_S(-3,'Res od aktualizacji',$res,__FILE__,__FUNCTION__,__LINE__);
- }
-
- }
- }
- DEBUG_S(-3,'Jade z LOCAL(se) do REM(gis)',null,__FILE__,__FUNCTION__,__LINE__);
- //insert lokalnych nowych do zdalnego
- foreach($this->ids_loc as $ind=>$val) {
- if(!($val->$rem_key)) {
- //nowe rekordy ze zdalnego
- $val_loc_key=$val->$loc_key;
- //echo "<br> Adding to ".$table." local key of(".$loc_key.") is ".$val->$loc_key." " .print_r($val);
- //DEBUG_S(-3,'Dodajemy to tabeli',$val,__FILE__,__FUNCTION__,__LINE__);
- $last_id=$this->gdb->ADD_NEW_OBJ($table,$this->gdb->MAKE_DB_OBJ($table,$val),'dieonerror');
- $sql='update `'.$table.'` set `'.$rem_key.'`=\''.$last_id.'\' where `'.$loc_key.'`='.$val_loc_key;
- DEBUG_S(-3,'notified new obj to rem',array($sql,$last_id),__FILE__,__FUNCTION__,__LINE__);
- $this->db->query($sql);
- // echo "<br>";
-
-
- } else {
- if(empty($this->ids_rem[$val->$rem_key])) {
- 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__);
-
- $res=$this->gdb->UPDATE_OBJ($table,$this->gdb->MAKE_DB_OBJ($table,$val),null,'skip_author') ;
- DEBUG_S(-3,'Res od aktualizacji',$res,__FILE__,__FUNCTION__,__LINE__);
- }
-
- }
- }
-
-
- //self::set_last_sync_date($table,$this->currtime_loc);
- $this->db->set_last_sync_date($table,$this->currtime_loc,$this->remote_db_id,$this->local_db_id);
- $this->gdb->set_last_sync_date($table,$this->currtime_rem,$this->local_db_id,$this->remote_db_id);
- }
- }
-
-
-
- }
- $sd = new SYNC_DATABASES;
- $sd->set_local_db_id(36);
- $sd->set_remote_db_id(13102);
- //$sd->set_table_to_sync('opt_tuby');
- //$sd->set_table_to_sync('opt_porty');
- //$sd->set_table_to_sync('opt_przelacznice_mufy');
- //$sd->set_table_to_sync('opt_tacki');
- //$sd->set_table_to_sync('opt_spawy');
- //$sd->set_table_to_sync('opt_wlokna');
-
- //$sd->set_table_to_sync('Rozdzielcza_lokalizacje'); //
- //$sd->set_table_to_sync('Rozdzielcza_wezly'); //
- $sd->set_table_to_sync('solectwa_poligon'); //
- $sd->set_table_to_sync('Kabel_TPSA_dzierzawa'); //
- $sd->set_table_to_sync('Rozdzielcza_Przeciski_110mm');
- $sd->set_table_to_sync('Rozdzielcza_Wykop_przedmiar_na_mikrorurki');
- $sd->set_table_to_sync('Rozdzielcza_Zabruki');
- $sd->set_table_to_sync('Rozdzielcza_koszty_dodatkowe_wsg84');
- $sd->set_table_to_sync('Rozdzielcza_rurociag_wsg84');
- $sd->set_table_to_sync('Rozdzielcza_wewn_kabel_ethernet');
- $sd->set_table_to_sync('Studnie');
- $sd->set_table_to_sync('pod_816_3');
- $sd->set_table_to_sync('gminy_wsg84');
- $sd->set_table_to_sync('solectwa_poligon');
- $sd->set_table_to_sync('Rozdzielcza_Kabel_Swiatlowodowy_wsg84');
- $sd->set_table_to_sync('Rozdzielcza_PionyKablowe');
- $sd->set_table_to_sync('Rozdzielcza_Mikrokanalizacja_do_klienta');
- $sd->set_table_to_sync('BUILDINGS');
- $sd->set_table_to_sync('USERS2_MARKETING');
- $sd->set_table_to_sync('TELBOXES');
- $sd->set_table_to_sync('Rozdzielcza_rurociag_wsg84');
- $sd->set_table_to_sync('MK_Rewiry');
- $sd->set_table_to_sync('IN7_MK_BAZA_DYSTRYBUCJI');
- $sd->sync_struct();
- $sd->sync_data();
- die('Temporary die at line 19 call bindera');
|