@@ -13,47 +13,21 @@ function __construct($manager) {
1313 $ this ->manager = $ manager ;
1414 $ this ->source = $ this ->manager ->getDB ('source ' );
1515 $ this ->target = $ this ->manager ->getDB ('target ' );
16- }
17-
18- public function getKey ($ connection , $ table ) {
19- $ keys = $ this ->{$ connection }->select ("show indexes from $ table " );
20- $ ukey = [];
21- foreach ($ keys as $ key ) {
22- if ($ key ['Key_name ' ] === 'PRIMARY ' ) {
23- $ ukey [] = $ key ['Column_name ' ];
24- }
25- }
26- return $ ukey ;
27- }
28-
29- public function checkKeys ($ table , $ sourceKey , $ targetKey ) {
30- if (empty ($ sourceKey ) || empty ($ targetKey )) {
31- throw new DataException ("No primary key found in table ` $ table` " );
32- }
33- if ($ sourceKey != $ targetKey ) {
34- throw new DataException ("Unmatched primary keys in table ` $ table` " );
35- }
36- return true ;
16+ $ this ->distTableData = new DistTableData ($ manager );
17+ $ this ->localTableData = new LocalTableData ($ manager );
3718 }
3819
3920 public function getIterator ($ connection , $ table ) {
4021 return new TableIterator ($ this ->{$ connection }, $ table );
4122 }
4223
43- public function getDataDiff ($ key , $ table ) {
44- $ sourceIterator = $ this ->getIterator ('source ' , $ table );
45- $ targetIterator = $ this ->getIterator ('target ' , $ table );
46- $ differ = new ArrayDiff ($ key , $ sourceIterator , $ targetIterator );
47- return $ differ ->getDiff ();
48- }
49-
5024 public function getNewData ($ table ) {
5125 Logger::info ("Now getting new data from table ` $ table` " );
5226 $ diffSequence = [];
5327 $ iterator = $ this ->getIterator ('source ' , $ table );
54- $ key = $ this ->getKey ('source ' , $ table );
28+ $ key = $ this ->manager -> getKey ('source ' , $ table );
5529 while ($ iterator ->hasNext ()) {
56- $ data = $ iterator ->next (ArrayDiff::SIZE );
30+ $ data = $ iterator ->next (ArrayDiff::$ size );
5731 foreach ($ data as $ entry ) {
5832 $ diffSequence [] = new InsertData ($ table , [
5933 'keys ' => array_only ($ entry , $ key ),
@@ -68,9 +42,9 @@ public function getOldData($table) {
6842 Logger::info ("Now getting old data from table ` $ table` " );
6943 $ diffSequence = [];
7044 $ iterator = $ this ->getIterator ('target ' , $ table );
71- $ key = $ this ->getKey ('target ' , $ table );
45+ $ key = $ this ->manager -> getKey ('target ' , $ table );
7246 while ($ iterator ->hasNext ()) {
73- $ data = $ iterator ->next (ArrayDiff::SIZE );
47+ $ data = $ iterator ->next (ArrayDiff::$ size );
7448 foreach ($ data as $ entry ) {
7549 $ diffSequence [] = new DeleteData ($ table , [
7650 'keys ' => array_only ($ entry , $ key ),
@@ -82,22 +56,27 @@ public function getOldData($table) {
8256 }
8357
8458 public function getDiff ($ table ) {
85- Logger::info ("Now calculating data diff for table ` $ table` " );
86- $ sourceKey = $ this ->getKey ('source ' , $ table );
87- $ targetKey = $ this ->getKey ('target ' , $ table );
59+ $ server1 = $ this ->source ->getConfig ('host ' ).': ' .$ this ->source ->getConfig ('port ' );
60+ $ server2 = $ this ->target ->getConfig ('host ' ).': ' .$ this ->target ->getConfig ('port ' );
61+ $ sourceKey = $ this ->manager ->getKey ('source ' , $ table );
62+ $ targetKey = $ this ->manager ->getKey ('target ' , $ table );
8863 $ this ->checkKeys ($ table , $ sourceKey , $ targetKey );
89- $ diffs = $ this ->getDataDiff ($ sourceKey , $ table );
90- $ diffSequence = [];
91- foreach ($ diffs as $ name => $ diff ) {
92- if ($ diff ['diff ' ] instanceof \Diff \DiffOp \DiffOpRemove) {
93- $ diffSequence [] = new DeleteData ($ table , $ diff );
94- } else if (is_array ($ diff ['diff ' ])) {
95- $ diffSequence [] = new UpdateData ($ table , $ diff );
96- } else if ($ diff ['diff ' ] instanceof \Diff \DiffOp \DiffOpAdd) {
97- $ diffSequence [] = new InsertData ($ table , $ diff );
98- }
64+
65+ if ($ server1 == $ server2 ) {
66+ return $ this ->localTableData ->getDiff ($ table , $ sourceKey );
67+ } else {
68+ return $ this ->distTableData ->getDiff ($ table , $ sourceKey );
9969 }
100- return $ diffSequence ;
70+ }
71+
72+ private function checkKeys ($ table , $ sourceKey , $ targetKey ) {
73+ if (empty ($ sourceKey ) || empty ($ targetKey )) {
74+ throw new DataException ("No primary key found in table ` $ table` " );
75+ }
76+ if ($ sourceKey != $ targetKey ) {
77+ throw new DataException ("Unmatched primary keys in table ` $ table` " );
78+ }
79+ return true ;
10180 }
10281
10382}
0 commit comments