mirror of
https://github.com/gnosygnu/xowa.git
synced 2024-10-27 20:34:16 +00:00
Wikibase: Add wbase_prop table for datatype
This commit is contained in:
parent
b1ad1411e4
commit
b3566def7e
@ -20,6 +20,7 @@ import gplx.dbs.*; import gplx.dbs.cfgs.*; import gplx.xowa.wikis.data.tbls.*; i
|
|||||||
import gplx.xowa.wikis.data.site_stats.*;
|
import gplx.xowa.wikis.data.site_stats.*;
|
||||||
import gplx.xowa.htmls.core.dbs.*; import gplx.xowa.addons.wikis.searchs.dbs.*;
|
import gplx.xowa.htmls.core.dbs.*; import gplx.xowa.addons.wikis.searchs.dbs.*;
|
||||||
import gplx.xowa.addons.wikis.htmls.css.dbs.*;
|
import gplx.xowa.addons.wikis.htmls.css.dbs.*;
|
||||||
|
import gplx.xowa.xtns.wbases.dbs.*;
|
||||||
public class Xow_db_file {
|
public class Xow_db_file {
|
||||||
protected Xow_db_file(Db_cfg_tbl cfg_tbl, Xowd_core_db_props props, Xob_info_session info_session, Xob_info_file info_file, Xow_db_file_schema_props schema_props, int id, byte tid, Io_url url, String ns_ids, int part_id, Guid_adp guid, Db_conn conn, byte cmd_mode) {
|
protected Xow_db_file(Db_cfg_tbl cfg_tbl, Xowd_core_db_props props, Xob_info_session info_session, Xob_info_file info_file, Xow_db_file_schema_props schema_props, int id, byte tid, Io_url url, String ns_ids, int part_id, Guid_adp guid, Db_conn conn, byte cmd_mode) {
|
||||||
this.id = id; this.tid = tid; this.url = url; this.ns_ids = ns_ids; this.part_id = part_id; this.guid = guid; this.db_props = props;
|
this.id = id; this.tid = tid; this.url = url; this.ns_ids = ns_ids; this.part_id = part_id; this.guid = guid; this.db_props = props;
|
||||||
@ -39,6 +40,7 @@ public class Xow_db_file {
|
|||||||
this.tbl__cat_link = new Xowd_cat_link_tbl(conn, schema_is_1);
|
this.tbl__cat_link = new Xowd_cat_link_tbl(conn, schema_is_1);
|
||||||
this.tbl__wbase_qid = new Xowd_wbase_qid_tbl(conn, schema_is_1, schema_props == null ? Bool_.N : schema_props.Wbase__qid__src_ttl_has_spaces());
|
this.tbl__wbase_qid = new Xowd_wbase_qid_tbl(conn, schema_is_1, schema_props == null ? Bool_.N : schema_props.Wbase__qid__src_ttl_has_spaces());
|
||||||
this.tbl__wbase_pid = new Xowd_wbase_pid_tbl(conn, schema_is_1);
|
this.tbl__wbase_pid = new Xowd_wbase_pid_tbl(conn, schema_is_1);
|
||||||
|
this.tbl__wbase_prop = new Xowb_prop_tbl(conn);
|
||||||
this.info_session = info_session;
|
this.info_session = info_session;
|
||||||
this.info_file = info_file;
|
this.info_file = info_file;
|
||||||
this.schema_props = schema_props;
|
this.schema_props = schema_props;
|
||||||
@ -69,6 +71,7 @@ public class Xow_db_file {
|
|||||||
public Xowd_site_stats_tbl Tbl__site_stats() {return tbl__site_stats;} private final Xowd_site_stats_tbl tbl__site_stats;
|
public Xowd_site_stats_tbl Tbl__site_stats() {return tbl__site_stats;} private final Xowd_site_stats_tbl tbl__site_stats;
|
||||||
public Xowd_wbase_qid_tbl Tbl__wbase_qid() {return tbl__wbase_qid;} private final Xowd_wbase_qid_tbl tbl__wbase_qid;
|
public Xowd_wbase_qid_tbl Tbl__wbase_qid() {return tbl__wbase_qid;} private final Xowd_wbase_qid_tbl tbl__wbase_qid;
|
||||||
public Xowd_wbase_pid_tbl Tbl__wbase_pid() {return tbl__wbase_pid;} private final Xowd_wbase_pid_tbl tbl__wbase_pid;
|
public Xowd_wbase_pid_tbl Tbl__wbase_pid() {return tbl__wbase_pid;} private final Xowd_wbase_pid_tbl tbl__wbase_pid;
|
||||||
|
public Xowb_prop_tbl Tbl__wbase_prop() {return tbl__wbase_prop;} private final Xowb_prop_tbl tbl__wbase_prop;
|
||||||
public Xob_info_session Info_session() {
|
public Xob_info_session Info_session() {
|
||||||
if (info_session == null) // NOTE: null when load; !null when make
|
if (info_session == null) // NOTE: null when load; !null when make
|
||||||
info_session = Xob_info_session.Load(tbl__cfg);
|
info_session = Xob_info_session.Load(tbl__cfg);
|
||||||
|
@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
*/
|
*/
|
||||||
package gplx.xowa.xtns.wbases.claims.enums; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wbases.*; import gplx.xowa.xtns.wbases.claims.*;
|
package gplx.xowa.xtns.wbases.claims.enums; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wbases.*; import gplx.xowa.xtns.wbases.claims.*;
|
||||||
public class Wbase_claim_type_ {
|
public class Wbase_claim_type_ {
|
||||||
public static final byte // NOT_SERIALIZED
|
public static final byte // SERIALIZED:wbase_prop|datatype
|
||||||
Tid__unknown = 0
|
Tid__unknown = 0
|
||||||
, Tid__value = 1
|
, Tid__value = 1
|
||||||
, Tid__bad = 1
|
, Tid__bad = 1
|
||||||
@ -27,8 +27,13 @@ public class Wbase_claim_type_ {
|
|||||||
, Tid__globecoordinate = 5
|
, Tid__globecoordinate = 5
|
||||||
, Tid__monolingualtext = 6
|
, Tid__monolingualtext = 6
|
||||||
, Tid__entity = 7
|
, Tid__entity = 7
|
||||||
|
, Tid__property = 8
|
||||||
|
, Tid__math = 9
|
||||||
|
, Tid__url = 10
|
||||||
|
, Tid__externalid = 11
|
||||||
|
, Tid__commonsmedia = 12
|
||||||
;
|
;
|
||||||
public static final Wbase_enum_hash Reg = new Wbase_enum_hash("claim.data_type", 8);
|
public static final Wbase_enum_hash Reg = new Wbase_enum_hash("claim.data_type", 13);
|
||||||
public static final Wbase_enum_itm
|
public static final Wbase_enum_itm
|
||||||
Itm__unknown = New(Tid__unknown , "unknown")
|
Itm__unknown = New(Tid__unknown , "unknown")
|
||||||
, Itm__bad = New(Tid__bad , "bad") // NOTE: wikidata identifies several entries as "bad"; Q1615351|'s-Graveland, Q107538|Baco; DATE:2013-10-20
|
, Itm__bad = New(Tid__bad , "bad") // NOTE: wikidata identifies several entries as "bad"; Q1615351|'s-Graveland, Q107538|Baco; DATE:2013-10-20
|
||||||
@ -38,6 +43,11 @@ public class Wbase_claim_type_ {
|
|||||||
, Itm__globecoordinate = New(Tid__globecoordinate , "globecoordinate" , "globe-coordinate")
|
, Itm__globecoordinate = New(Tid__globecoordinate , "globecoordinate" , "globe-coordinate")
|
||||||
, Itm__monolingualtext = New(Tid__monolingualtext , "monolingualtext")
|
, Itm__monolingualtext = New(Tid__monolingualtext , "monolingualtext")
|
||||||
, Itm__entity = New(Tid__entity , "wikibase-entityid" , "wikibase-item")
|
, Itm__entity = New(Tid__entity , "wikibase-entityid" , "wikibase-item")
|
||||||
|
, Itm__property = New(Tid__property , "wikibase-property") // EX:wd:Property:P1646
|
||||||
|
, Itm__url = New(Tid__url , "url") // EX:wd:Property:P1019
|
||||||
|
, Itm__commonsmedia = New(Tid__commonsmedia , "commonsMedia") // EX:wd:Property:P14
|
||||||
|
, Itm__externalid = New(Tid__externalid , "external-id") // EX:wd:Property:P1003
|
||||||
|
, Itm__math = New(Tid__math , "math") // EX:wd:Property:P2534
|
||||||
;
|
;
|
||||||
private static Wbase_enum_itm New(byte tid, String key) {return New(tid, key, key);}
|
private static Wbase_enum_itm New(byte tid, String key) {return New(tid, key, key);}
|
||||||
private static Wbase_enum_itm New(byte tid, String key, String scrib) {return Reg.Add(new Wbase_claim_type(tid, key, scrib));}
|
private static Wbase_enum_itm New(byte tid, String key, String scrib) {return Reg.Add(new Wbase_claim_type(tid, key, scrib));}
|
||||||
|
@ -25,6 +25,7 @@ public class Wbase_enum_hash {
|
|||||||
this.ary_len = ary_len;
|
this.ary_len = ary_len;
|
||||||
}
|
}
|
||||||
public String Name() {return name;} private final String name;
|
public String Name() {return name;} private final String name;
|
||||||
|
public int Len() {return ary_len;}
|
||||||
public Wbase_enum_itm Add(byte tid, String key) {return Add(new Wbase_enum_itm(tid, key));}
|
public Wbase_enum_itm Add(byte tid, String key) {return Add(new Wbase_enum_itm(tid, key));}
|
||||||
public Wbase_enum_itm Add(Wbase_enum_itm rv) {
|
public Wbase_enum_itm Add(Wbase_enum_itm rv) {
|
||||||
hash_by_bry.Add(rv.Key_bry(), rv);
|
hash_by_bry.Add(rv.Key_bry(), rv);
|
||||||
|
62
400_xowa/src/gplx/xowa/xtns/wbases/dbs/Xowb_prop_tbl.java
Normal file
62
400_xowa/src/gplx/xowa/xtns/wbases/dbs/Xowb_prop_tbl.java
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
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.xowa.xtns.wbases.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wbases.*;
|
||||||
|
import gplx.dbs.*; import gplx.dbs.utls.*;
|
||||||
|
import gplx.xowa.xtns.wbases.claims.enums.*;
|
||||||
|
public class Xowb_prop_tbl implements Db_tbl {
|
||||||
|
private final Dbmeta_fld_list flds = new Dbmeta_fld_list();
|
||||||
|
private final String fld__wbp_pid, fld__wbp_datatype;
|
||||||
|
private final Db_conn conn;
|
||||||
|
private Db_stmt stmt_insert;
|
||||||
|
public Xowb_prop_tbl(Db_conn conn) {
|
||||||
|
this.conn = conn;
|
||||||
|
this.tbl_name = "wbase_prop";
|
||||||
|
this.fld__wbp_pid = flds.Add_str("wbp_pid", 16); // EX: "p1"; NOTE: String, not int to conform to wbase_pid
|
||||||
|
this.fld__wbp_datatype = flds.Add_int("wbp_datatype"); // EX: 12=commonsMedia; SEE:Wbase_claim_type_
|
||||||
|
conn.Rls_reg(this);
|
||||||
|
}
|
||||||
|
public String Tbl_name() {return tbl_name;} private final String tbl_name;
|
||||||
|
public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds));}
|
||||||
|
public void Insert_bgn() {conn.Txn_bgn("wbase_prop__insert"); stmt_insert = conn.Stmt_insert(tbl_name, flds);}
|
||||||
|
public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);}
|
||||||
|
public void Insert_cmd_by_batch(byte[] pid, int datatype) {
|
||||||
|
stmt_insert.Clear().Val_bry_as_str(fld__wbp_pid, pid).Val_int(fld__wbp_datatype, datatype).Exec_insert();
|
||||||
|
}
|
||||||
|
public Ordered_hash Select_all() {
|
||||||
|
Ordered_hash rv = Ordered_hash_.New();
|
||||||
|
Db_rdr rdr = conn.Stmt_select_all(tbl_name, flds).Exec_select__rls_auto();
|
||||||
|
try {
|
||||||
|
while (rdr.Move_next()) {
|
||||||
|
Select_all__add(rv, rdr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally {rdr.Rls();}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
private void Select_all__add(Ordered_hash hash, Db_rdr rdr) {
|
||||||
|
byte[] pid = rdr.Read_bry_by_str(fld__wbp_pid);
|
||||||
|
byte datatype_id = (byte)rdr.Read_int(fld__wbp_datatype);
|
||||||
|
Wbase_enum_itm datatype_itm = Wbase_claim_type_.Reg.Get_itm_or((byte)datatype_id, null);
|
||||||
|
if (datatype_itm == null) {
|
||||||
|
Gfo_usr_dlg_.Instance.Warn_many("", "", "wbase:invalid prop datatype_id; pid=~{0} datatype=~{1}", pid, datatype_id);
|
||||||
|
datatype_itm = Wbase_claim_type_.Itm__string;
|
||||||
|
}
|
||||||
|
hash.Add(pid, datatype_itm);
|
||||||
|
}
|
||||||
|
public void Rls() {}
|
||||||
|
}
|
@ -23,7 +23,7 @@ public abstract class Xob_wdata_pid_base extends Xob_itm_dump_base implements Xo
|
|||||||
public Xob_wdata_pid_base Ctor(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki); return this;}
|
public Xob_wdata_pid_base Ctor(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki); return this;}
|
||||||
public abstract String Page_wkr__key();
|
public abstract String Page_wkr__key();
|
||||||
public abstract void Pid_bgn();
|
public abstract void Pid_bgn();
|
||||||
public abstract void Pid_add(byte[] src_lang, byte[] src_ttl, byte[] trg_ttl);
|
public abstract void Pid_add(byte[] src_lang, byte[] src_ttl, byte[] trg_ttl, byte[] datatype);
|
||||||
public abstract void Pid_end();
|
public abstract void Pid_end();
|
||||||
public void Page_wkr__bgn() {
|
public void Page_wkr__bgn() {
|
||||||
this.Init_dump(this.Page_wkr__key(), wiki.Tdb_fsys_mgr().Site_dir().GenSubDir_nest("data", "pid")); // NOTE: must pass in correct make_dir in order to delete earlier version (else make_dirs will append)
|
this.Init_dump(this.Page_wkr__key(), wiki.Tdb_fsys_mgr().Site_dir().GenSubDir_nest("data", "pid")); // NOTE: must pass in correct make_dir in order to delete earlier version (else make_dirs will append)
|
||||||
@ -43,11 +43,12 @@ public abstract class Xob_wdata_pid_base extends Xob_itm_dump_base implements Xo
|
|||||||
public void Parse_jdoc(Json_doc jdoc) {
|
public void Parse_jdoc(Json_doc jdoc) {
|
||||||
Wdata_doc_parser wdoc_parser = app.Wiki_mgr().Wdata_mgr().Wdoc_parser(jdoc);
|
Wdata_doc_parser wdoc_parser = app.Wiki_mgr().Wdata_mgr().Wdoc_parser(jdoc);
|
||||||
byte[] qid = wdoc_parser.Parse_qid(jdoc);
|
byte[] qid = wdoc_parser.Parse_qid(jdoc);
|
||||||
|
byte[] datatype = jdoc.Root_nde().Get_as_bry(Wdata_dict_mainsnak.Itm__datatype.Key_str());
|
||||||
Ordered_hash list = wdoc_parser.Parse_langvals(qid, jdoc, Bool_.Y);
|
Ordered_hash list = wdoc_parser.Parse_langvals(qid, jdoc, Bool_.Y);
|
||||||
int len = list.Count();
|
int len = list.Count();
|
||||||
for (int i = 0; i < len; ++i) {
|
for (int i = 0; i < len; ++i) {
|
||||||
Wdata_langtext_itm label = (Wdata_langtext_itm)list.Get_at(i);
|
Wdata_langtext_itm label = (Wdata_langtext_itm)list.Get_at(i);
|
||||||
this.Pid_add(label.Lang(), label.Text(), qid);
|
this.Pid_add(label.Lang(), label.Text(), qid, datatype);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public void Page_wkr__end() {this.Pid_end();}
|
public void Page_wkr__end() {this.Pid_end();}
|
||||||
|
@ -59,6 +59,7 @@ public class Xob_wdata_pid_base_tst {
|
|||||||
public static String json_(String entity_id, String grp_key, String[] grp_vals) {
|
public static String json_(String entity_id, String grp_key, String[] grp_vals) {
|
||||||
Bry_bfr bfr = Bry_bfr_.New();
|
Bry_bfr bfr = Bry_bfr_.New();
|
||||||
bfr.Add_str_a7("{ 'entity':'").Add_str_u8(entity_id).Add_byte(Byte_ascii.Apos).Add_byte_nl();
|
bfr.Add_str_a7("{ 'entity':'").Add_str_u8(entity_id).Add_byte(Byte_ascii.Apos).Add_byte_nl();
|
||||||
|
bfr.Add_str_a7(", 'datatype':'commonsMedia'\n");
|
||||||
bfr.Add_str_a7(", '").Add_str_u8(grp_key).Add_str_a7("':").Add_byte_nl();
|
bfr.Add_str_a7(", '").Add_str_u8(grp_key).Add_str_a7("':").Add_byte_nl();
|
||||||
int len = grp_vals.length;
|
int len = grp_vals.length;
|
||||||
for (int i = 0; i < len; i += 2) {
|
for (int i = 0; i < len; i += 2) {
|
||||||
|
@ -17,20 +17,42 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
*/
|
*/
|
||||||
package gplx.xowa.xtns.wbases.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wbases.*;
|
package gplx.xowa.xtns.wbases.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wbases.*;
|
||||||
import gplx.xowa.wikis.data.*; import gplx.dbs.*; import gplx.xowa.wikis.dbs.*; import gplx.xowa.wikis.data.tbls.*;
|
import gplx.xowa.wikis.data.*; import gplx.dbs.*; import gplx.xowa.wikis.dbs.*; import gplx.xowa.wikis.data.tbls.*;
|
||||||
|
import gplx.xowa.xtns.wbases.dbs.*; import gplx.xowa.xtns.wbases.claims.enums.*;
|
||||||
public class Xob_wdata_pid_sql extends Xob_wdata_pid_base {
|
public class Xob_wdata_pid_sql extends Xob_wdata_pid_base {
|
||||||
private Xowd_wbase_pid_tbl tbl;
|
private Xowd_wbase_pid_tbl tbl__pid;
|
||||||
|
private Xowb_prop_tbl tbl__prop;
|
||||||
|
private final Ordered_hash datatype_hash = Ordered_hash_.New_bry();
|
||||||
@Override public String Page_wkr__key() {return gplx.xowa.bldrs.Xob_cmd_keys.Key_wbase_pid;}
|
@Override public String Page_wkr__key() {return gplx.xowa.bldrs.Xob_cmd_keys.Key_wbase_pid;}
|
||||||
@Override public void Pid_bgn() {
|
@Override public void Pid_bgn() {
|
||||||
Xow_db_mgr db_mgr = wiki.Data__core_mgr();
|
Xow_db_mgr db_mgr = wiki.Data__core_mgr();
|
||||||
tbl = db_mgr.Db__wbase().Tbl__wbase_pid();
|
|
||||||
tbl.Create_tbl();
|
// init datatype_hash
|
||||||
tbl.Insert_bgn();
|
Wbase_enum_hash enum_hash = Wbase_claim_type_.Reg;
|
||||||
|
byte len = (byte)enum_hash.Len();
|
||||||
|
for (byte i = 0; i < len; i++) {
|
||||||
|
Wbase_claim_type claim_type = (Wbase_claim_type)enum_hash.Get_itm_or(i, null);
|
||||||
|
datatype_hash.Add(Bry_.new_u8(claim_type.Key_for_scrib()), claim_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
// init wbase_pid
|
||||||
|
tbl__pid = db_mgr.Db__wbase().Tbl__wbase_pid();
|
||||||
|
tbl__pid.Create_tbl();
|
||||||
|
tbl__pid.Insert_bgn();
|
||||||
|
|
||||||
|
// init wbase_prop
|
||||||
|
tbl__prop = db_mgr.Db__wbase().Tbl__wbase_prop();
|
||||||
|
tbl__prop.Create_tbl();
|
||||||
|
tbl__prop.Insert_bgn();
|
||||||
}
|
}
|
||||||
@Override public void Pid_add(byte[] lang_key, byte[] ttl, byte[] pid) {
|
@Override public void Pid_add(byte[] lang_key, byte[] ttl, byte[] pid, byte[] datatype_bry) {
|
||||||
tbl.Insert_cmd_by_batch(lang_key, ttl, pid);
|
tbl__pid.Insert_cmd_by_batch(lang_key, ttl, pid);
|
||||||
|
|
||||||
|
Wbase_claim_type claim_type = (Wbase_claim_type)datatype_hash.Get_by_or_fail(datatype_bry);
|
||||||
|
tbl__prop.Insert_cmd_by_batch(pid, claim_type.Tid());
|
||||||
}
|
}
|
||||||
@Override public void Pid_end() {
|
@Override public void Pid_end() {
|
||||||
tbl.Insert_end();
|
tbl__pid.Insert_end();
|
||||||
tbl.Create_idx();
|
tbl__pid.Create_idx();
|
||||||
|
tbl__prop.Insert_end();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,7 @@ public class Xob_wdata_pid_txt extends Xob_wdata_pid_base {
|
|||||||
@Override public void Pid_bgn() {
|
@Override public void Pid_bgn() {
|
||||||
pid_bldr = new Wdata_idx_bldr_pid(this, bldr, wiki, dump_fil_len);
|
pid_bldr = new Wdata_idx_bldr_pid(this, bldr, wiki, dump_fil_len);
|
||||||
} Wdata_idx_bldr_pid pid_bldr;
|
} Wdata_idx_bldr_pid pid_bldr;
|
||||||
@Override public void Pid_add(byte[] lang_key, byte[] prop_key, byte[] qid) {
|
@Override public void Pid_add(byte[] lang_key, byte[] prop_key, byte[] qid, byte[] datatype) {
|
||||||
pid_bldr.Add(lang_key, prop_key, qid);
|
pid_bldr.Add(lang_key, prop_key, qid);
|
||||||
}
|
}
|
||||||
@Override public void Pid_end() {
|
@Override public void Pid_end() {
|
||||||
|
Loading…
Reference in New Issue
Block a user