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');