mirror of
https://github.com/gnosygnu/xowa.git
synced 2026-03-02 03:49:30 +00:00
v3.1.4.1
This commit is contained in:
@@ -18,12 +18,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
package gplx.dbs.diffs; import gplx.*; import gplx.dbs.*;
|
||||
public class Gfdb_diff_db_ {
|
||||
public static final String
|
||||
Fld__diff_site = "diff_site" // -1 for single-site merge; 0+ for multiple-site merges where 0+ is defined in a registry
|
||||
, Fld__diff_time = "diff_time" // -1 for single-time merge; 0+ for multiple-time merges where 0+ is defined in a registry
|
||||
, Fld__diff_db_trg = "diff_db_trg" // -1 for single-db tables; 0+ for multiple-db tables
|
||||
, Fld__diff_db_src = "diff_db_src" // -1 for I,U,D; 0+ for M
|
||||
, Fld__diff_type = "diff_type" // I,U,D,M
|
||||
, Fld__diff_uid = "diff_uid" // 0+
|
||||
Fld__dif_txn = "dif_txn" // 0+ where 0+ is defined in a tbl
|
||||
, Fld__dif_uid = "dif_uid" // 0+
|
||||
, Fld__dif_type = "dif_type" // I,U,D,M
|
||||
, Fld__dif_db_trg = "dif_db_trg" // -1 for single-db tables; 0+ for multiple-db tables
|
||||
, Fld__dif_db_src = "dff_db_src" // -1 for I,U,D; 0+ for M
|
||||
;
|
||||
public static final byte
|
||||
Tid__insert = 0
|
||||
|
||||
@@ -26,7 +26,7 @@ public class Gfdb_diff_tbl {
|
||||
public final Dbmeta_fld_itm[] Keys;
|
||||
public final Dbmeta_fld_itm[] Vals;
|
||||
public Db_rdr Make_rdr(Db_conn conn) {
|
||||
Db_stmt stmt = conn.Stmt_select(Name, Dbmeta_fld_itm.To_str_ary(Flds));
|
||||
Db_stmt stmt = conn.Stmt_select_order(Name, Dbmeta_fld_itm.To_str_ary(Flds), Dbmeta_fld_itm.Str_ary_empty, Dbmeta_fld_itm.To_str_ary(Keys));
|
||||
return stmt.Exec_select__rls_auto();
|
||||
}
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@ public class Gfdb_rdr_utl_ {
|
||||
int tid = fld.Type().Tid_ansi();
|
||||
switch (tid) {
|
||||
case Dbmeta_fld_tid.Tid__bool: comp = Bool_.Compare (lhs_rdr.Read_bool_by_byte(fld_name), rhs_rdr.Read_bool_by_byte(fld_name)); break;
|
||||
case Dbmeta_fld_tid.Tid__byte: comp = Byte_.Compare (lhs_rdr.Read_byte(fld_name) , rhs_rdr.Read_byte(fld_name)); break;
|
||||
case Dbmeta_fld_tid.Tid__int: comp = Int_.Compare (lhs_rdr.Read_int(fld_name) , rhs_rdr.Read_int(fld_name)); break;
|
||||
case Dbmeta_fld_tid.Tid__long: comp = Long_.Compare (lhs_rdr.Read_long(fld_name) , rhs_rdr.Read_long(fld_name)); break;
|
||||
case Dbmeta_fld_tid.Tid__float: comp = Float_.Compare (lhs_rdr.Read_float(fld_name) , rhs_rdr.Read_float(fld_name)); break;
|
||||
|
||||
@@ -21,10 +21,10 @@ public class Gfdb_diff_bldr {
|
||||
private Gfdb_diff_rdr_comparer rdr_comparer = new Gfdb_diff_rdr_comparer();
|
||||
private Gfdb_diff_wkr diff_wkr;
|
||||
public void Init(Gfdb_diff_wkr diff_wkr) {this.diff_wkr = diff_wkr;}
|
||||
public void Compare(Gfdb_diff_tbl tbl, Db_conn old_conn, Db_conn new_conn) {
|
||||
public void Compare(int txn, Gfdb_diff_tbl tbl, Db_conn old_conn, Db_conn new_conn) {
|
||||
Db_rdr old_rdr = tbl.Make_rdr(old_conn), new_rdr = tbl.Make_rdr(new_conn);
|
||||
rdr_comparer.Init_rdrs(tbl, old_rdr, new_rdr);
|
||||
diff_wkr.Init_rdrs(tbl, old_rdr, new_rdr);
|
||||
diff_wkr.Init_rdrs(txn, tbl, old_rdr, new_rdr);
|
||||
boolean loop = true;
|
||||
while (loop) {
|
||||
int rslt = rdr_comparer.Compare();
|
||||
@@ -35,5 +35,6 @@ public class Gfdb_diff_bldr {
|
||||
case Gfdb_diff_rdr_comparer.Rslt__done: loop = false; break;
|
||||
}
|
||||
}
|
||||
diff_wkr.Term_tbls();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -76,7 +76,7 @@ class Gfdb_diff_bldr_fxt {
|
||||
public void Init__tbl__old(Object[]... rows) {Db_conn_utl.Tbl__new(old_conn, "tbl", flds_ary, rows);}
|
||||
public void Init__tbl__cur(Object[]... rows) {Db_conn_utl.Tbl__new(new_conn, "tbl", flds_ary, rows);}
|
||||
public void Test__bld(String... expd) {
|
||||
bldr.Compare(tbl, old_conn, new_conn);
|
||||
bldr.Compare(-1, tbl, old_conn, new_conn);
|
||||
Tfds.Eq_ary_str(expd, wkr.To_str_ary());
|
||||
}
|
||||
}
|
||||
@@ -84,7 +84,7 @@ class Gfdb_diff_wkr__test implements Gfdb_diff_wkr {
|
||||
private final List_adp list = List_adp_.new_();
|
||||
private final Bry_bfr bfr = Bry_bfr.new_();
|
||||
private Db_rdr old_rdr, new_rdr;
|
||||
public void Init_rdrs(Gfdb_diff_tbl tbl, Db_rdr old_rdr, Db_rdr new_rdr) {
|
||||
public void Init_rdrs(int txn, Gfdb_diff_tbl tbl, Db_rdr old_rdr, Db_rdr new_rdr) {
|
||||
this.old_rdr = old_rdr; this.new_rdr = new_rdr;
|
||||
}
|
||||
public void Term_tbls() {}
|
||||
|
||||
@@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.dbs.diffs.builds; import gplx.*; import gplx.dbs.*; import gplx.dbs.diffs.*;
|
||||
public interface Gfdb_diff_wkr {
|
||||
void Init_rdrs(Gfdb_diff_tbl tbl, Db_rdr old_rdr, Db_rdr new_rdr);
|
||||
void Init_rdrs(int txn, Gfdb_diff_tbl tbl, Db_rdr old_rdr, Db_rdr new_rdr);
|
||||
void Term_tbls();
|
||||
void Handle_same();
|
||||
void Handle_old_missing();
|
||||
|
||||
@@ -19,58 +19,53 @@ package gplx.dbs.diffs.builds; import gplx.*; import gplx.dbs.*; import gplx.dbs
|
||||
import gplx.dbs.metas.*;
|
||||
public class Gfdb_diff_wkr__db implements Gfdb_diff_wkr {
|
||||
private Dbmeta_fld_itm[] val_flds; private int val_flds_len;
|
||||
private Gfdb_diff_tbl tbl;
|
||||
private Db_conn diff_conn; private Db_stmt stmt;
|
||||
private Db_rdr old_rdr, new_rdr;
|
||||
private int uid__upsert, uid__delete; private int prog_interval, prog_count;
|
||||
public void Init_conn(Gfdb_diff_db diff_db, int prog_interval) {this.diff_conn = diff_db.Conn(); this.prog_interval = prog_interval;}
|
||||
public void Init_rdrs(Gfdb_diff_tbl tbl, Db_rdr old_rdr, Db_rdr new_rdr) {
|
||||
private Gfdb_diff_tbl tbl; private Db_rdr old_rdr, new_rdr;
|
||||
private Db_conn dif_conn; private Db_stmt stmt;
|
||||
private int txn, uid, prog_interval, prog_count;
|
||||
public void Init_conn(Gfdb_diff_db diff_db, int prog_interval) {this.dif_conn = diff_db.Conn(); this.prog_interval = prog_interval;}
|
||||
public void Init_rdrs(int txn, Gfdb_diff_tbl tbl, Db_rdr old_rdr, Db_rdr new_rdr) {
|
||||
this.tbl = tbl; this.old_rdr = old_rdr; this.new_rdr = new_rdr;
|
||||
this.val_flds = tbl.Vals; val_flds_len = val_flds.length;
|
||||
this.uid__upsert = 0; uid__delete = 0; this.prog_count = 0;
|
||||
String tbl_name = tbl.Name;
|
||||
Dbmeta_fld_itm[] diff_flds = Gfdb_diff_wkr__db_.New_diff_flds(tbl.Flds);
|
||||
if (!diff_conn.Meta_tbl_exists(tbl_name)) diff_conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, diff_flds));
|
||||
this.stmt = diff_conn.Stmt_insert(tbl_name, Gfdb_diff_wkr__db_.To_str_ary(diff_flds));
|
||||
diff_conn.Txn_bgn("diff_db");
|
||||
}
|
||||
public void Term_tbls() {
|
||||
diff_conn.Txn_end();
|
||||
this.txn = txn; this.uid = -1; this.prog_count = 0;
|
||||
|
||||
String dif_tbl = tbl.Name; Dbmeta_fld_itm[] dif_flds = Gfdb_diff_wkr__db_.New_dif_flds(tbl.Flds);
|
||||
if (!dif_conn.Meta_tbl_exists(dif_tbl)) dif_conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(dif_tbl, dif_flds));
|
||||
this.stmt = dif_conn.Stmt_insert(dif_tbl, Gfdb_diff_wkr__db_.To_str_ary(dif_flds));
|
||||
dif_conn.Txn_bgn("dif_db_tbl_" + dif_tbl);
|
||||
}
|
||||
public void Term_tbls() {dif_conn.Txn_end();}
|
||||
public void Handle_old_missing() {Insert(Gfdb_diff_db_.Tid__insert, ++uid, new_rdr, tbl.Flds);}
|
||||
public void Handle_new_missing() {Insert(Gfdb_diff_db_.Tid__delete, ++uid, old_rdr, tbl.Flds);}
|
||||
public void Handle_same() {
|
||||
if (Gfdb_rdr_utl_.Compare(val_flds, val_flds_len, old_rdr, new_rdr) != CompareAble_.Same)
|
||||
Insert(Gfdb_diff_db_.Tid__update, uid__upsert++, tbl.Flds, new_rdr);
|
||||
Insert(Gfdb_diff_db_.Tid__update, ++uid, new_rdr, tbl.Flds);
|
||||
}
|
||||
public void Handle_old_missing() {Insert(Gfdb_diff_db_.Tid__insert, uid__upsert++, tbl.Flds, new_rdr);}
|
||||
public void Handle_new_missing() {Insert(Gfdb_diff_db_.Tid__delete, uid__delete++, tbl.Keys, old_rdr);}
|
||||
private void Insert(byte diff_type, int uid, Dbmeta_fld_itm[] flds, Db_rdr rdr) {
|
||||
stmt.Val_int (Gfdb_diff_db_.Fld__diff_site , -1)
|
||||
.Val_int (Gfdb_diff_db_.Fld__diff_time , -1)
|
||||
.Val_int (Gfdb_diff_db_.Fld__diff_db_trg , -1)
|
||||
.Val_int (Gfdb_diff_db_.Fld__diff_db_src , -1)
|
||||
.Val_byte (Gfdb_diff_db_.Fld__diff_type , diff_type)
|
||||
.Val_int (Gfdb_diff_db_.Fld__diff_type , uid)
|
||||
;
|
||||
private void Insert(byte dif_type, int uid, Db_rdr rdr, Dbmeta_fld_itm[] flds) {
|
||||
stmt.Clear();
|
||||
stmt.Val_int (Gfdb_diff_db_.Fld__dif_txn , txn)
|
||||
.Val_int (Gfdb_diff_db_.Fld__dif_uid , uid)
|
||||
.Val_int (Gfdb_diff_db_.Fld__dif_type , dif_type)
|
||||
.Val_int (Gfdb_diff_db_.Fld__dif_db_src , -1)
|
||||
.Val_int (Gfdb_diff_db_.Fld__dif_db_trg , -1);
|
||||
Gfdb_rdr_utl_.Stmt_args(stmt, flds, flds.length, rdr);
|
||||
stmt.Exec_insert();
|
||||
if ((++prog_count % prog_interval) == 0) diff_conn.Txn_sav();
|
||||
if ((++prog_count % prog_interval) == 0) dif_conn.Txn_sav();
|
||||
}
|
||||
}
|
||||
class Gfdb_diff_wkr__db_ {
|
||||
public static Dbmeta_fld_itm[] New_diff_flds(Dbmeta_fld_itm[] all_flds) {
|
||||
int len = all_flds.length;
|
||||
int system_flds = 6;
|
||||
Dbmeta_fld_itm[] rv = new Dbmeta_fld_itm[len + system_flds];
|
||||
rv[0] = Dbmeta_fld_itm.new_int (Gfdb_diff_db_.Fld__diff_site);
|
||||
rv[1] = Dbmeta_fld_itm.new_int (Gfdb_diff_db_.Fld__diff_time);
|
||||
rv[2] = Dbmeta_fld_itm.new_int (Gfdb_diff_db_.Fld__diff_db_trg);
|
||||
rv[3] = Dbmeta_fld_itm.new_int (Gfdb_diff_db_.Fld__diff_db_src);
|
||||
rv[4] = Dbmeta_fld_itm.new_byte(Gfdb_diff_db_.Fld__diff_type);
|
||||
rv[5] = Dbmeta_fld_itm.new_int (Gfdb_diff_db_.Fld__diff_uid);
|
||||
public static Dbmeta_fld_itm[] New_dif_flds(Dbmeta_fld_itm[] cur_flds) {
|
||||
int len = cur_flds.length;
|
||||
int sys_flds = 5;
|
||||
Dbmeta_fld_itm[] rv = new Dbmeta_fld_itm[len + sys_flds];
|
||||
rv[0] = Dbmeta_fld_itm.new_int (Gfdb_diff_db_.Fld__dif_txn);
|
||||
rv[1] = Dbmeta_fld_itm.new_int (Gfdb_diff_db_.Fld__dif_uid);
|
||||
rv[2] = Dbmeta_fld_itm.new_byte (Gfdb_diff_db_.Fld__dif_type);
|
||||
rv[3] = Dbmeta_fld_itm.new_int (Gfdb_diff_db_.Fld__dif_db_trg);
|
||||
rv[4] = Dbmeta_fld_itm.new_int (Gfdb_diff_db_.Fld__dif_db_src);
|
||||
for (int i = 0; i < len; ++i) {
|
||||
Dbmeta_fld_itm orig_fld = all_flds[i];
|
||||
Dbmeta_fld_itm diff_fld = new Dbmeta_fld_itm(orig_fld.Name(), orig_fld.Type()).Nullable_y_(); // keep same name and type, but make nullable
|
||||
all_flds[i + system_flds] = diff_fld;
|
||||
Dbmeta_fld_itm cur_fld = cur_flds[i];
|
||||
Dbmeta_fld_itm dif_fld = new Dbmeta_fld_itm(cur_fld.Name(), cur_fld.Type());
|
||||
rv[i + sys_flds] = dif_fld;
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
58
140_dbs/src/gplx/dbs/diffs/tbls/Gdif_txn_tbl.java
Normal file
58
140_dbs/src/gplx/dbs/diffs/tbls/Gdif_txn_tbl.java
Normal file
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012 gnosygnu@gmail.com
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.dbs.diffs.tbls; import gplx.*; import gplx.dbs.*; import gplx.dbs.diffs.*;
|
||||
import gplx.dbs.*;
|
||||
/*
|
||||
reg:
|
||||
id,name,made_by,made_on,meta
|
||||
0,'Diffs for Simple Wikipedia betwee 2015-11-16 and 2015-12-23',gnosygnu,2015-12-23'dif;simplewiki;20151223;20151116'
|
||||
cmd:
|
||||
owner,id,tid,meta
|
||||
0,0,data_comp_tid,page
|
||||
0,1,data_comp_tid,cat_core
|
||||
0,2,data_comp_tid,cat_link
|
||||
txn:
|
||||
reg_id,txn_id,cmd_id,owner_txn
|
||||
0,0,0,-1,page
|
||||
0,1,-1,-1,cat
|
||||
0,2,-1,1,mid
|
||||
0,3,1,2,cat_core
|
||||
0,4,2,2,cat_link
|
||||
*/
|
||||
class Gdif_txn_tbl implements Rls_able {
|
||||
private String tbl_name = "gdif_txn";
|
||||
private String fld_owner, fld_id;
|
||||
private final Dbmeta_fld_list flds = Dbmeta_fld_list.new_();
|
||||
private final Db_conn conn; private Db_stmt stmt_insert;
|
||||
public Gdif_txn_tbl(Db_conn conn) {
|
||||
this.conn = conn;
|
||||
fld_owner = flds.Add_int("txn_owner"); fld_id = flds.Add_int("txn_id");
|
||||
conn.Rls_reg(this);
|
||||
}
|
||||
public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds.To_fld_ary(), Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "main", fld_owner, fld_id)));}
|
||||
public void Insert(int txn_owner, int txn_id) {
|
||||
if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
|
||||
stmt_insert.Clear()
|
||||
.Val_int(fld_owner , txn_owner)
|
||||
.Val_int(fld_id , txn_id)
|
||||
.Exec_insert();
|
||||
}
|
||||
public void Rls() {
|
||||
stmt_insert = Db_stmt_.Rls(stmt_insert);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user