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)); $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 '.$table,array($LAST_SYNCED_loc,$LAST_SYNCED_rem),__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 "
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 "
"; } 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 "
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 "
"; } 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('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');