1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2026-03-02 03:49:30 +00:00
This commit is contained in:
gnosygnu
2015-04-05 21:00:31 -04:00
parent 80b9928b5c
commit 18dcd3f89e
615 changed files with 9826 additions and 8619 deletions

View File

@@ -18,10 +18,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.core.enums; import gplx.*; import gplx.core.*;
class Gfo_enum_grp {
// private OrderedHash itms = OrderedHash_.new_();
public Gfo_enum_grp(UuidAdp uid, String key, int id, String name, int sort, String xtn) {
public Gfo_enum_grp(Guid_adp uid, String key, int id, String name, int sort, String xtn) {
this.uid = uid; this.key = key; this.id = id; this.name = name; this.sort = sort; this.xtn = xtn;
}
public UuidAdp Uid() {return uid;} private UuidAdp uid;
public Guid_adp Uid() {return uid;} private Guid_adp uid;
public String Key() {return key;} private String key;
public int Id() {return id;} private int id;
public String Name() {return name;} private String name;
@@ -29,10 +29,10 @@ class Gfo_enum_grp {
public String Xtn() {return xtn;} private String xtn;
}
class Gfo_enum_itm {
public Gfo_enum_itm(UuidAdp uid, String key, int id, String name, int sort, String xtn) {
public Gfo_enum_itm(Guid_adp uid, String key, int id, String name, int sort, String xtn) {
this.uid = uid; this.key = key; this.id = id; this.name = name; this.sort = sort; this.xtn = xtn;
}
public UuidAdp Uid() {return uid;} private UuidAdp uid;
public Guid_adp Uid() {return uid;} private Guid_adp uid;
public String Key() {return key;} private String key;
public int Id() {return id;} private int id;
public String Name() {return name;} private String name;

View File

@@ -0,0 +1,54 @@
/*
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; import gplx.*;
import gplx.dbs.engines.sqlite.*;
public class Db_attach_cmd {
private final boolean diff_db;
private final Db_conn conn; private final String attach_name; private final Io_url attach_url;
private final ListAdp sql_list = ListAdp_.new_();
Db_attach_cmd(Db_conn conn, String attach_name, Io_url attach_url) {
this.conn = conn; this.attach_name = attach_name; this.attach_url = attach_url;
Sqlite_conn_info conn_info = (Sqlite_conn_info)conn.Conn_info();
this.diff_db = !String_.Eq(conn_info.Url().Raw(), attach_url.Raw());
}
public Db_attach_cmd Add_fmt(String msg, String sql_fmt, Object... sql_args) {
String sql = String_.Format(sql_fmt, sql_args);
sql = String_.Replace(sql, "<attach_db>", diff_db ? attach_name + "." : ""); // replace <attach> with either "attach_db." or "";
sql_list.Add(new Db_exec_sql_by_attach_itm(msg, sql));
return this;
}
public void Exec() {
Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_.I;
if (diff_db) conn.Env_db_attach(attach_name, attach_url);
conn.Txn_bgn(attach_name); // NOTE: BEGIN TRAN must occur after ATTACH else sqlite will throw error
int len = sql_list.Count();
for (int i = 0; i < len; ++i) {
Db_exec_sql_by_attach_itm itm = (Db_exec_sql_by_attach_itm)sql_list.FetchAt(i);
usr_dlg.Plog_many("", "", itm.Msg());
conn.Exec_sql(itm.Sql());
}
conn.Txn_end();
if (diff_db) conn.Env_db_detach(attach_name);
}
public static Db_attach_cmd new_(Db_conn conn, String attach_name, Io_url attach_url) {return new Db_attach_cmd(conn, attach_name, attach_url);}
}
class Db_exec_sql_by_attach_itm {
public Db_exec_sql_by_attach_itm(String msg, String sql) {this.msg = msg; this.sql = sql;}
public String Msg() {return msg;} private final String msg;
public String Sql() {return sql;} private final String sql;
}

View File

@@ -0,0 +1,35 @@
/*
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; import gplx.*;
import gplx.dbs.engines.sqlite.*;
public class Db_attach_rdr {
private final boolean diff_db;
private final Db_conn conn; private final String attach_name; private final Io_url attach_url;
public Db_attach_rdr(Db_conn conn, String attach_name, Io_url attach_url) {
this.conn = conn; this.attach_name = attach_name; this.attach_url = attach_url;
Sqlite_conn_info conn_info = (Sqlite_conn_info)conn.Conn_info();
this.diff_db = !String_.Eq(conn_info.Url().Raw(), attach_url.Raw());
}
public Db_rdr Exec_as_rdr(String sql) {
if (diff_db) conn.Env_db_attach(attach_name, attach_url);
return conn.Exec_sql_as_rdr2(sql);
}
public void Rls() {
if (diff_db) conn.Env_db_detach(attach_name);
}
}

View File

@@ -1,63 +0,0 @@
/*
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.cfgs; import gplx.*; import gplx.dbs.*;
public class Db_cfg_grp {
private OrderedHash itms = OrderedHash_.new_();
public Db_cfg_grp(String grp) {this.grp = grp;}
public String Grp() {return grp;} private String grp;
public void Insert(String key, String val) {
if (itms.Has(key)) throw Err_.new_fmt_("cfg_grp.Insert failed; key={0}", key);
Fsm_cfg_itm itm = new Fsm_cfg_itm(grp, key, val);
itms.Add(key, itm);
}
public void Update(String key, String val) {
Fsm_cfg_itm itm = (Fsm_cfg_itm)itms.Fetch(key);
if (itm == null) throw Err_.new_fmt_("cfg_grp.Update failed; key={0}", key);
itm.Val_(val);
}
public void Upsert(String key, String val) {
Fsm_cfg_itm itm = (Fsm_cfg_itm)itms.Fetch(key);
if (itm == null) {
itm = new Fsm_cfg_itm(grp, key, val);
itms.Add(key, itm);
}
else
itm.Val_(val);
}
public boolean Get_yn_or_y(String key) {return Get_yn_or(key, Bool_.Y);}
public boolean Get_yn_or_n(String key) {return Get_yn_or(key, Bool_.N);}
public boolean Get_yn_or(String key, boolean or) {
String rv = Get_str_or(key, null);
return rv == null ? or : Yn.parse_(rv);
}
public int Get_int_or(String key, int or) {
String rv = Get_str_or(key, null);
return rv == null ? or : Int_.parse_(rv);
}
public String Get_str_or(String key, String or) {
Fsm_cfg_itm itm = (Fsm_cfg_itm)itms.Fetch(key);
return itm == null ? or : itm.Val();
}
public static final Db_cfg_grp Null = new Db_cfg_grp(); Db_cfg_grp() {}
}
class Fsm_cfg_itm {
public Fsm_cfg_itm(String grp, String key, String val) {this.grp = grp; this.key = key; this.val = val;}
public String Grp() {return grp;} private String grp;
public String Key() {return key;} private String key;
public String Val() {return val;} public Fsm_cfg_itm Val_(String v) {val = v; return this;} private String val;
}

View File

@@ -0,0 +1,34 @@
/*
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.cfgs; import gplx.*; import gplx.dbs.*;
public class Db_cfg_hash {
private final String grp; private final OrderedHash hash = OrderedHash_.new_();
public Db_cfg_hash(String grp) {this.grp = grp;}
public int Len() {return hash.Count();}
public Db_cfg_itm Get_at(int i) {return (Db_cfg_itm)hash.FetchAt(i);}
public Db_cfg_itm Get(String key) {
Db_cfg_itm rv = (Db_cfg_itm)hash.Fetch(key);
return rv == null ? Db_cfg_itm.Empty : rv;
}
public void Set(String key, String val) {hash.Del(key); Add(key, val);}
public void Add(String key, String val) {
if (hash.Has(key)) throw Err_.new_fmt_("itm exists; grp={0} key={01}", grp, key);
Db_cfg_itm itm = new Db_cfg_itm(grp, key, val);
hash.Add(key, itm);
}
}

View File

@@ -0,0 +1,59 @@
/*
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.cfgs; import gplx.*; import gplx.dbs.*;
public class Db_cfg_itm {
public Db_cfg_itm(String grp, String key, String val) {this.grp = grp; this.key = key; this.val = val;}
public String Grp() {return grp;} private final String grp;
public String Key() {return key;} private final String key;
public String Val() {return val;} public Db_cfg_itm Val_(String v) {val = v; return this;} private String val;
public String To_str_or(String or) {return val == null ? or : val;}
public byte[] To_bry_or(byte[] or) {try {return val == null ? or : Bry_.new_utf8_(val) ;} catch (Exception e) {throw err_parse(e, Bry_.Cls_val_name);}}
public int To_int_or(int or) {try {return val == null ? or : Int_.parse_or_(val, or) ;} catch (Exception e) {throw err_parse(e, Int_.Cls_val_name);}}
public long To_long_or(long or) {try {return val == null ? or : Long_.parse_or_(val, or) ;} catch (Exception e) {throw err_parse(e, Long_.Cls_val_name);}}
public byte To_byte_or(byte or) {try {return val == null ? or : Byte_.parse_or_(val, or) ;} catch (Exception e) {throw err_parse(e, Byte_.Cls_val_name);}}
public boolean To_yn_or_n() {return To_yn_or(Bool_.N);}
public boolean To_yn_or(boolean or) {try {return val == null ? or : Yn.parse_by_char_or(val, or);} catch (Exception e) {throw err_parse(e, Bool_.Cls_val_name);}}
public DateAdp To_date_or(DateAdp or) {try {return val == null ? or : DateAdp_.parse_gplx(val) ;} catch (Exception e) {throw err_parse(e, DateAdp_.Cls_ref_name);}}
public Guid_adp To_guid_or(Guid_adp or) {try {return val == null ? or : Guid_adp_.parse_(val) ;} catch (Exception e) {throw err_parse(e, Guid_adp_.Cls_ref_name);}}
public boolean To_bool() {Fail_if_null(); try {return Yn.parse_(val) ;} catch (Exception e) {throw err_parse(e, Bool_.Cls_val_name);}}
public byte To_byte() {Fail_if_null(); try {return Byte_.parse_(val) ;} catch (Exception e) {throw err_parse(e, Byte_.Cls_val_name);}}
public int To_int() {Fail_if_null(); try {return Int_.parse_(val) ;} catch (Exception e) {throw err_parse(e, Int_.Cls_val_name);}}
public String To_str() {Fail_if_null(); return val;}
private void Fail_if_null() {if (val == null) throw Err_.new_("cfg.val is empty; grp={0} key={1}", grp, key); }
private Err err_parse(Exception e, String type) {return Err_.new_("cfg.val is not parseable; grp={0} key={1} val={2} type={3}", grp, key, val, type);}
private static final String Grp_none = "";
public static Db_cfg_itm new_str (String key, String val) {return new Db_cfg_itm(Grp_none , key, val);}
public static Db_cfg_itm new_str (String grp, String key, String val) {return new Db_cfg_itm(grp , key, val);}
public static Db_cfg_itm new_bry (String key, byte[] val) {return new Db_cfg_itm(Grp_none , key, String_.new_utf8_(val));}
public static Db_cfg_itm new_bry (String grp, String key, byte[] val) {return new Db_cfg_itm(grp , key, String_.new_utf8_(val));}
public static Db_cfg_itm new_int (String key, int val) {return new Db_cfg_itm(Grp_none , key, Int_.Xto_str(val));}
public static Db_cfg_itm new_int (String grp, String key, int val) {return new Db_cfg_itm(grp , key, Int_.Xto_str(val));}
public static Db_cfg_itm new_long (String key, long val) {return new Db_cfg_itm(Grp_none , key, Long_.Xto_str(val));}
public static Db_cfg_itm new_long (String grp, String key, long val) {return new Db_cfg_itm(grp , key, Long_.Xto_str(val));}
public static Db_cfg_itm new_byte (String key, byte val) {return new Db_cfg_itm(Grp_none , key, Byte_.Xto_str(val));}
public static Db_cfg_itm new_byte (String grp, String key, byte val) {return new Db_cfg_itm(grp , key, Byte_.Xto_str(val));}
public static Db_cfg_itm new_yn (String key, boolean val) {return new Db_cfg_itm(Grp_none , key, Yn.Xto_str(val));}
public static Db_cfg_itm new_yn (String grp, String key, boolean val) {return new Db_cfg_itm(grp , key, Yn.Xto_str(val));}
public static Db_cfg_itm new_DateAdp (String key, DateAdp val) {return new Db_cfg_itm(Grp_none , key, val.XtoStr_fmt_yyyyMMdd_HHmmss());}
public static Db_cfg_itm new_DateAdp (String grp, String key, DateAdp val) {return new Db_cfg_itm(grp , key, val.XtoStr_fmt_yyyyMMdd_HHmmss());}
public static Db_cfg_itm new_guid (String key, Guid_adp val) {return new Db_cfg_itm(Grp_none , key, val.XtoStr());}
public static Db_cfg_itm new_guid (String grp, String key, Guid_adp val) {return new Db_cfg_itm(grp , key, val.XtoStr());}
public static final Db_cfg_itm Empty = new Db_cfg_itm("empty", "empty", null);
}

View File

@@ -16,72 +16,104 @@ 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.cfgs; import gplx.*; import gplx.dbs.*;
import gplx.dbs.*;
public class Db_cfg_tbl {
private String tbl_name; private final Db_meta_fld_list flds = Db_meta_fld_list.new_();
private String fld_grp, fld_key, fld_val;
private Db_conn conn; private Db_stmt stmt_insert, stmt_update, stmt_select;
public Db_conn Conn() {return conn;}
public void Conn_(Db_conn new_conn, boolean created, boolean schema_is_1, String tbl_v1, String tbl_v2) {
this.conn = new_conn; flds.Clear();
String fld_prefix = "";
if (schema_is_1) {
tbl_name = tbl_v1;
fld_prefix = "cfg_";
}
else
tbl_name = tbl_v2;
fld_grp = flds.Add_str(fld_prefix + "grp", 255);
fld_key = flds.Add_str(fld_prefix + "key", 255);
fld_val = flds.Add_str(fld_prefix + "val", 1024);
if (created) {
Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds
, Db_meta_idx.new_unique_by_tbl(tbl_name, "main", fld_grp, fld_key, fld_val)
);
conn.Exec_create_tbl_and_idx(meta);
}
stmt_insert = stmt_update = stmt_select = null;
import gplx.core.primitives.*;
public class Db_cfg_tbl implements RlsAble {
private final String tbl_name; private final Db_meta_fld_list flds = Db_meta_fld_list.new_();
private final String fld_grp, fld_key, fld_val;
private Db_stmt stmt_insert, stmt_update, stmt_select;
public Db_conn Conn() {return conn;} private final Db_conn conn;
public Db_cfg_tbl(Db_conn conn, String tbl_name) {
this.conn = conn; this.tbl_name = tbl_name;
this.fld_grp = flds.Add_str("cfg_grp", 255);
this.fld_key = flds.Add_str("cfg_key", 255);
this.fld_val = flds.Add_str("cfg_val", 1024);
conn.Rls_reg(this);
}
public void Insert(String grp, String key, String val) {
if (stmt_insert == null) stmt_insert = conn.Rls_reg(conn.Stmt_insert(tbl_name, flds));
public void Rls() {
stmt_insert = Db_stmt_.Rls(stmt_insert);
stmt_update = Db_stmt_.Rls(stmt_update);
stmt_select = Db_stmt_.Rls(stmt_select);
}
public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_tbl(tbl_name, "main", fld_grp, fld_key, fld_val)));}
public void Delete_val(String grp, String key) {conn.Stmt_delete(tbl_name, fld_grp, fld_key).Crt_str(fld_grp, grp).Crt_str(fld_key, key).Exec_delete();}
public void Delete_grp(String grp) {conn.Stmt_delete(tbl_name, fld_grp).Crt_str(fld_grp, grp).Exec_delete();}
public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empy).Exec_delete();}
public void Insert_yn (String grp, String key, boolean val) {Insert_str(grp, key, val ? "y" : "n");}
public void Insert_byte (String grp, String key, byte val) {Insert_str(grp, key, Byte_.Xto_str(val));}
public void Insert_int (String grp, String key, int val) {Insert_str(grp, key, Int_.Xto_str(val));}
public void Insert_long (String grp, String key, long val) {Insert_str(grp, key, Long_.Xto_str(val));}
public void Insert_date (String grp, String key, DateAdp val) {Insert_str(grp, key, val.XtoStr_fmt_yyyyMMdd_HHmmss());}
public void Insert_guid (String grp, String key, Guid_adp val) {Insert_str(grp, key, val.XtoStr());}
public void Insert_bry (String grp, String key, byte[] val) {Insert_str(grp, key, String_.new_utf8_(val));}
public void Insert_str (String grp, String key, String val) {
if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
stmt_insert.Clear().Val_str(fld_grp, grp).Val_str(fld_key, key).Val_str(fld_val, val).Exec_insert();
}
public void Update(String grp, String key, String val) {
if (stmt_update == null) stmt_update = conn.Rls_reg(conn.Stmt_update_exclude(tbl_name, flds, fld_grp, fld_key));
}
public void Update_yn (String grp, String key, boolean val) {Update_str(grp, key, val ? "y" : "n");}
public void Update_byte (String grp, String key, byte val) {Update_str(grp, key, Byte_.Xto_str(val));}
public void Update_int (String grp, String key, int val) {Update_str(grp, key, Int_.Xto_str(val));}
public void Update_long (String grp, String key, long val) {Update_str(grp, key, Long_.Xto_str(val));}
public void Update_date (String grp, String key, DateAdp val) {Update_str(grp, key, val.XtoStr_fmt_yyyyMMdd_HHmmss());}
public void Update_guid (String grp, String key, Guid_adp val) {Update_str(grp, key, val.XtoStr());}
public void Update_bry (String grp, String key, byte[] val) {Update_str(grp, key, String_.new_utf8_(val));}
public void Update_str (String grp, String key, String val) {
if (stmt_update == null) stmt_update = conn.Stmt_update_exclude(tbl_name, flds, fld_grp, fld_key);
stmt_update.Clear().Val_str(fld_val, val).Crt_str(fld_grp, grp).Crt_str(fld_key, key).Exec_update();
}
public int Select_as_int_or_fail(String grp, String key) {
int rv = Select_as_int_or(grp, key, Int_.MinValue);
if (rv == Int_.MinValue) throw Err_.new_fmt_("dbs.cfg_tbl.Select_as_int_or_fail: tbl={0} grp={1} key={2}", tbl_name, grp, key);
public void Upsert_str (String grp, String key, String val) {
String cur_val = this.Select_str_or(grp, key, null);
if (cur_val == null) this.Insert_str(grp, key, val);
else this.Update_str(grp, key, val);
}
public boolean Select_yn (String grp, String key) {String val = Select_str(grp, key); return Parse_yn (grp, key, val);}
public byte Select_byte (String grp, String key) {String val = Select_str(grp, key); return Parse_byte (grp, key, val);}
public int Select_int (String grp, String key) {String val = Select_str(grp, key); return Parse_int (grp, key, val);}
public long Select_long (String grp, String key) {String val = Select_str(grp, key); return Parse_long (grp, key, val);}
public byte[] Select_bry (String grp, String key) {String val = Select_str(grp, key); return Parse_bry (grp, key, val);}
public DateAdp Select_date (String grp, String key) {String val = Select_str(grp, key); return Parse_date (grp, key, val);}
public Guid_adp Select_guid (String grp, String key) {String val = Select_str(grp, key); return Parse_guid (grp, key, val);}
public boolean Select_yn_or (String grp, String key, boolean or) {String val = Select_str_or(grp, key, null) ; return val == null ? or : Parse_yn (grp, key, val);}
public byte Select_byte_or (String grp, String key, byte or) {String val = Select_str_or(grp, key, null) ; return val == null ? or : Parse_byte (grp, key, val);}
public int Select_int_or (String grp, String key, int or) {String val = Select_str_or(grp, key, null) ; return val == null ? or : Parse_int (grp, key, val);}
public long Select_long_or (String grp, String key, long or) {String val = Select_str_or(grp, key, null) ; return val == null ? or : Parse_long (grp, key, val);}
public byte[] Select_bry_or (String grp, String key, byte[] or) {String val = Select_str_or(grp, key, null) ; return val == null ? or : Parse_bry (grp, key, val);}
public DateAdp Select_date_or (String grp, String key, DateAdp or) {String val = Select_str_or(grp, key, null) ; return val == null ? or : Parse_date (grp, key, val);}
public Guid_adp Select_guid_or (String grp, String key, Guid_adp or) {String val = Select_str_or(grp, key, null) ; return val == null ? or : Parse_guid (grp, key, val);}
public String Select_str (String grp, String key) {
String rv = Select_str_or(grp, key, null); if (rv == null) throw Err_.new_("cfg.missing; grp={0} key={1}", grp, key);
return rv;
}
public long Select_as_long_or(String grp, String key, long or) {return Long_.parse_or_(Select_as_str_or(grp, key, null), or);}
public byte Select_as_byte_or(String grp, String key, byte or) {return Byte_.parse_or_(Select_as_str_or(grp, key, null), or);}
public int Select_as_int_or(String grp, String key, int or) {return Int_.parse_or_(Select_as_str_or(grp, key, null), or);}
public String Select_as_str_or(String grp, String key, String or) {
if (stmt_select == null) stmt_select = conn.Rls_reg(conn.Stmt_select(tbl_name, String_.Ary(fld_val), fld_grp, fld_key));
Db_rdr rdr = Db_rdr_.Null;
try {
rdr = stmt_select.Clear()
.Crt_str(fld_grp, grp)
.Crt_str(fld_key, key)
.Exec_select_as_rdr();
return rdr.Move_next() ? rdr.Read_str(fld_val) : or;
} finally {rdr.Rls();}
public String Select_str_or (String grp, String key, String or) {
if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, String_.Ary(fld_val), fld_grp, fld_key);
Db_rdr rdr = stmt_select.Clear().Crt_str(fld_grp, grp).Crt_str(fld_key, key).Exec_select__rls_manual();
try {return rdr.Move_next() ? rdr.Read_str(fld_val) : or;} finally {rdr.Rls();}
}
public Db_cfg_grp Select_as_grp(String grp) {
Db_cfg_grp rv = null;
Db_stmt stmt = conn.Stmt_select(tbl_name, flds, fld_grp);
Db_rdr rdr = Db_rdr_.Null;
public Db_cfg_hash Select_as_hash(String grp) {
Db_cfg_hash rv = new Db_cfg_hash(grp);
Db_rdr rdr = conn.Stmt_select(tbl_name, flds, fld_grp).Crt_str(fld_grp, grp).Exec_select__rls_auto();
try {
rdr = stmt.Clear().Crt_str(fld_grp, grp).Exec_select_as_rdr();
while (rdr.Move_next()) {
if (rv == null) rv = new Db_cfg_grp(grp);
rv.Upsert(rdr.Read_str(fld_key), rdr.Read_str(fld_val));
rv.Add(rdr.Read_str(fld_key), rdr.Read_str(fld_val));
}
}
finally {rdr.Rls();}
return rv == null ? Db_cfg_grp.Null : rv;
return rv;
}
public void Rls() {conn.Conn_term();}
// NOTE: Assert guarantees that a value exists in database and returns it (Select + Insert); (1) String val = Assert('grp', 'key', 'val'); (2) Update('grp', 'key', 'val2');
public boolean Assert_yn (String grp, String key, boolean or) {String val = Select_str_or(grp, key, null) ; if (val == null) {Insert_yn (grp, key, or); return or;} return Parse_yn (grp, key, val);}
public byte Assert_byte (String grp, String key, byte or) {String val = Select_str_or(grp, key, null) ; if (val == null) {Insert_byte (grp, key, or); return or;} return Parse_byte (grp, key, val);}
public int Assert_int (String grp, String key, int or) {String val = Select_str_or(grp, key, null) ; if (val == null) {Insert_int (grp, key, or); return or;} return Parse_int (grp, key, val);}
public long Assert_long (String grp, String key, long or) {String val = Select_str_or(grp, key, null) ; if (val == null) {Insert_long (grp, key, or); return or;} return Parse_long (grp, key, val);}
public byte[] Assert_bry (String grp, String key, byte[] or) {String val = Select_str_or(grp, key, null) ; if (val == null) {Insert_bry (grp, key, or); return or;} return Parse_bry (grp, key, val);}
public DateAdp Assert_date (String grp, String key, DateAdp or) {String val = Select_str_or(grp, key, null) ; if (val == null) {Insert_date (grp, key, or); return or;} return Parse_date (grp, key, val);}
public Guid_adp Assert_guid (String grp, String key, Guid_adp or) {String val = Select_str_or(grp, key, null) ; if (val == null) {Insert_guid (grp, key, or); return or;} return Parse_guid (grp, key, val);}
public String Assert_str (String grp, String key, String or) {String val = Select_str_or(grp, key, null) ; if (val == null) {Insert_str (grp, key, or); return or;} return val;}
private boolean Parse_yn (String grp, String key, String val) {try {return Yn.parse_(val) ;} catch (Exception e) {throw err_parse(e, grp, key, val, Bool_.Cls_val_name);}}
private byte Parse_byte (String grp, String key, String val) {try {return Byte_.parse_(val) ;} catch (Exception e) {throw err_parse(e, grp, key, val, Byte_.Cls_val_name);}}
private int Parse_int (String grp, String key, String val) {try {return Int_.parse_(val) ;} catch (Exception e) {throw err_parse(e, grp, key, val, Int_.Cls_val_name);}}
private long Parse_long (String grp, String key, String val) {try {return Long_.parse_(val) ;} catch (Exception e) {throw err_parse(e, grp, key, val, Long_.Cls_val_name);}}
private byte[] Parse_bry (String grp, String key, String val) {try {return Bry_.new_utf8_(val) ;} catch (Exception e) {throw err_parse(e, grp, key, val, Bry_.Cls_val_name);}}
private DateAdp Parse_date (String grp, String key, String val) {try {return DateAdp_.parse_gplx(val) ;} catch (Exception e) {throw err_parse(e, grp, key, val, DateAdp_.Cls_ref_name);}}
private Guid_adp Parse_guid (String grp, String key, String val) {try {return Guid_adp_.parse_(val) ;} catch (Exception e) {throw err_parse(e, grp, key, val, Guid_adp_.Cls_ref_name);}}
private Err err_parse(Exception e, String grp, String key, String val, String type) {return Err_.new_("cfg.val is not parseable; grp={0} key={1} val={2} type={3}", grp, key, val, type);}
}

View File

@@ -18,31 +18,31 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.dbs.schemas; import gplx.*; import gplx.dbs.*;
import gplx.dbs.qrys.*;
public class Schema_loader_mgr_ {
public static final Schema_loader_mgr Null = new Schema_loader_mgr__null();
public static final Schema_loader_mgr Sqlite = new Schema_loader_mgr__sqlite();
public static final Schema_loader_mgr Null = new Schema_loader_mgr__null();
public static final Schema_loader_mgr Sqlite = new Schema_loader_mgr__sqlite();
}
class Schema_loader_mgr__null implements Schema_loader_mgr {
public void Load(Schema_db_mgr db_mgr, Db_conn conn) {}
}
class Schema_loader_mgr__sqlite implements Schema_loader_mgr {
public void Load(Schema_db_mgr db_mgr, Db_conn conn) {
Gfo_usr_dlg_._.Log_many("", "", "db.schema.load.bgn: conn=~{0}", conn.Url().Xto_api());
Gfo_usr_dlg_.I.Log_many("", "", "db.schema.load.bgn: conn=~{0}", conn.Conn_info().Xto_api());
Schema_tbl_mgr tbl_mgr = db_mgr.Tbl_mgr();
Db_qry__select_in_tbl qry = Db_qry__select_in_tbl.new_("sqlite_master", String_.Ary_empty, String_.Ary("type", "name", "sql"), Db_qry__select_in_tbl.Order_by_null);
Db_stmt stmt = Db_stmt_.new_select_as_rdr(conn, qry);
Db_rdr rdr = stmt.Exec_select_as_rdr();
while (rdr.Move_next()) {
int type = Schema_itm_tid.Xto_int(rdr.Read_str(0));
switch (type) {
case Schema_itm_tid.Tid_table:
Schema_tbl_itm tbl_itm = new Schema_tbl_itm(rdr.Read_str(1), rdr.Read_str(2));
tbl_mgr.Add(tbl_itm);
break;
case Schema_itm_tid.Tid_index: break; // noop for now
default: throw Err_.unhandled(type);
Db_rdr rdr = conn.Stmt_new(qry).Exec_select__rls_auto();
try {
while (rdr.Move_next()) {
int type = Schema_itm_tid.Xto_int(rdr.Read_str(0));
switch (type) {
case Schema_itm_tid.Tid_table:
Schema_tbl_itm tbl_itm = new Schema_tbl_itm(rdr.Read_str(1), rdr.Read_str(2));
tbl_mgr.Add(tbl_itm);
break;
case Schema_itm_tid.Tid_index: break; // noop for now
default: throw Err_.unhandled(type);
}
}
}
rdr.Rls();
Gfo_usr_dlg_._.Log_many("", "", "db.schema.load.end");
} finally {rdr.Rls();}
Gfo_usr_dlg_.I.Log_many("", "", "db.schema.load.end");
}
}

View File

@@ -29,7 +29,7 @@ class Schema_update_cmd__tbl_create implements Schema_update_cmd {
public boolean Exec_is_done() {return exec_is_done;} private boolean exec_is_done;
public void Exec(Schema_db_mgr db_mgr, Db_conn conn) {
if (db_mgr.Tbl_mgr().Has(tbl_name)) return;
Gfo_usr_dlg_._.Log_many("", "", "schema.tbl.create: tbl=~{0}", tbl_name);
Gfo_usr_dlg_.I.Log_many("", "", "schema.tbl.create: tbl=~{0}", tbl_name);
Sqlite_engine_.Tbl_create(conn, tbl_name, tbl_sql);
Sqlite_engine_.Idx_create(conn, tbl_idxs);
exec_is_done = true;

View File

@@ -25,7 +25,7 @@ public class Schema_update_mgr {
Schema_update_cmd cmd = (Schema_update_cmd)cmds.FetchAt(i);
try {cmd.Exec(schema_mgr, conn);}
catch (Exception e) {
Gfo_usr_dlg_._.Warn_many("", "", "failed to run update cmd; name=~{0} err=~{1}", cmd.Name(), Err_.Message_gplx_brief(e));
Gfo_usr_dlg_.I.Warn_many("", "", "failed to run update cmd; name=~{0} err=~{1}", cmd.Name(), Err_.Message_gplx_brief(e));
}
}
}

View File

@@ -40,7 +40,7 @@ class Schema_update_mgr_fxt {
public void Test_exec_n(Schema_update_cmd cmd) {Test_exec(cmd, Bool_.N);}
private void Test_exec(Schema_update_cmd cmd, boolean expd) {
update_mgr.Add(cmd);
update_mgr.Update(db_mgr, Db_conn_.Null);
update_mgr.Update(db_mgr, Db_conn_.Empty);
Tfds.Eq(expd, cmd.Exec_is_done());
}
}

View File

@@ -15,7 +15,14 @@ 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.bldrs.oimgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*;
interface Xob_parse_all_db {
void Fetch_next(OrderedHash list, int ns_id, byte[] ttl);
package gplx.fsdb; import gplx.*;
import gplx.dbs.*; import gplx.dbs.cfgs.*;
public class Fsdb_db_file {
public Fsdb_db_file(Io_url url, Db_conn conn) {
this.url = url; this.conn = conn;
this.tbl__core_cfg = new Db_cfg_tbl(conn, "xowa_cfg");
}
public Io_url Url() {return url;} private final Io_url url;
public Db_conn Conn() {return conn;} private final Db_conn conn;
public Db_cfg_tbl Tbl__cfg() {return tbl__core_cfg;} private final Db_cfg_tbl tbl__core_cfg;
}

View File

@@ -0,0 +1,30 @@
/*
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.fsdb; import gplx.*;
import gplx.dbs.*; import gplx.xowa.files.origs.*;
public interface Fsdb_db_mgr {
boolean File__schema_is_1();
boolean File__solo_file();
String File__cfg_tbl_name();
Xof_orig_tbl[] File__orig_tbl_ary();
Fsdb_db_file File__mnt_file();
Fsdb_db_file File__abc_file__at(int mnt_id);
Fsdb_db_file File__atr_file__at(int mnt_id);
Fsdb_db_file File__bin_file__at(int mnt_id, int bin_id, String file_name);
Fsdb_db_file File__bin_file__new(int mnt_id, String file_name);
}

View File

@@ -0,0 +1,44 @@
/*
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.fsdb; import gplx.*;
import gplx.dbs.*; import gplx.xowa.*; import gplx.xowa.wikis.data.*;
public class Fsdb_db_mgr_ {
public static Fsdb_db_mgr new_detect(String domain_str, Io_url wiki_dir, Io_url file_dir) {
Gfo_usr_dlg usr_dlg = Xoa_app_.Usr_dlg();
Fsdb_db_mgr rv = null;
rv = load_or_null(Xowd_db_layout.Itm_few, usr_dlg, wiki_dir, domain_str); if (rv != null) return rv;
rv = load_or_null(Xowd_db_layout.Itm_lot, usr_dlg, wiki_dir, domain_str); if (rv != null) return rv;
rv = load_or_null(Xowd_db_layout.Itm_all, usr_dlg, wiki_dir, domain_str); if (rv != null) return rv;
Io_url url = file_dir.GenSubFil(Fsdb_db_mgr__v1.Mnt_name); // EX: /xowa/file/en.wikipedia.org/wiki.mnt.sqlite3
if (Db_conn_bldr.I.Exists(url)) {
usr_dlg.Log_many("", "", "fsdb.db_core.v1: url=~{0}", url.Raw());
return new Fsdb_db_mgr__v1(file_dir);
}
usr_dlg.Log_many("", "", "fsdb.db_core.none: wiki_dir=~{0} file_dir=~{1}", wiki_dir.Raw(), file_dir.Raw());
return null;
}
private static Fsdb_db_mgr load_or_null(Xowd_db_layout layout, Gfo_usr_dlg usr_dlg, Io_url wiki_dir, String domain_str) {
Io_url main_core_url = wiki_dir.GenSubFil(Fsdb_db_mgr__v2_bldr.Main_core_name(layout, domain_str));
if (!Db_conn_bldr.I.Exists(main_core_url)) return null;
usr_dlg.Log_many("", "", "fsdb.db_core.v2: type=~{0} url=~{1}", layout.Name(), main_core_url.Raw());
Db_conn main_core_conn = Db_conn_bldr.I.Get(main_core_url);
Io_url user_core_url = wiki_dir.GenSubFil(Fsdb_db_mgr__v2_bldr.Make_user_name(domain_str));
Db_conn user_core_conn = Db_conn_bldr.I.Get(user_core_url);
return new Fsdb_db_mgr__v2(Fsdb_db_mgr__v2.Cfg__layout_file__get(main_core_conn), wiki_dir, new Fsdb_db_file(main_core_url, main_core_conn), new Fsdb_db_file(user_core_url, user_core_conn));
}
}

View File

@@ -0,0 +1,50 @@
/*
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.fsdb; import gplx.*;
import gplx.dbs.*; import gplx.fsdb.meta.*; import gplx.xowa.files.origs.*;
public class Fsdb_db_mgr__v1 implements Fsdb_db_mgr {
private final Io_url file_dir;
private final Fsdb_db_file orig_file, mnt_file, abc_file__main, abc_file__user, atr_file__main, atr_file__user;
private final Xof_orig_tbl[] orig_tbl_ary;
public Fsdb_db_mgr__v1(Io_url file_dir) {
this.file_dir = file_dir;
this.orig_file = new_db(file_dir.GenSubFil(Orig_name)); // EX: /xowa/enwiki/wiki.orig#00.sqlite3
this.mnt_file = new_db(file_dir.GenSubFil(Mnt_name)); // EX: /xowa/enwiki/wiki.mnt.sqlite3
this.abc_file__main = new_db(file_dir.GenSubFil_nest(Fsm_mnt_tbl.Mnt_name_main, Abc_name)); // EX: /xowa/enwiki/fsdb.main/fsdb.abc.sqlite3
this.atr_file__main = new_db(file_dir.GenSubFil_nest(Fsm_mnt_tbl.Mnt_name_main, Atr_name)); // EX: /xowa/enwiki/fsdb.main/fsdb.atr.00.sqlite3
this.abc_file__user = new_db(file_dir.GenSubFil_nest(Fsm_mnt_tbl.Mnt_name_user, Abc_name)); // EX: /xowa/enwiki/fsdb.user/fsdb.abc.sqlite3
this.atr_file__user = new_db(file_dir.GenSubFil_nest(Fsm_mnt_tbl.Mnt_name_user, Atr_name)); // EX: /xowa/enwiki/fsdb.user/fsdb.atr.00.sqlite3
this.orig_tbl_ary = new Xof_orig_tbl[] {new Xof_orig_tbl(orig_file.Conn(), this.File__schema_is_1())};
}
public boolean File__schema_is_1() {return Bool_.Y;}
public boolean File__solo_file() {return Bool_.N;}
public String File__cfg_tbl_name() {return "fsdb_cfg";}
public Xof_orig_tbl[] File__orig_tbl_ary() {return orig_tbl_ary;}
public Fsdb_db_file File__mnt_file() {return mnt_file;}
public Fsdb_db_file File__abc_file__at(int mnt_id) {return mnt_id == Fsm_mnt_mgr.Mnt_idx_main ? abc_file__main : abc_file__user;}
public Fsdb_db_file File__atr_file__at(int mnt_id) {return mnt_id == Fsm_mnt_mgr.Mnt_idx_main ? atr_file__main : atr_file__user;}
public Fsdb_db_file File__bin_file__at(int mnt_id, int bin_id, String file_name) {
String bin_name = "fsdb.bin." + Int_.Xto_str_pad_bgn_zero(bin_id, 4) + ".sqlite3";
String mnt_name = mnt_id == Fsm_mnt_mgr.Mnt_idx_main ? Fsm_mnt_tbl.Mnt_name_main : Fsm_mnt_tbl.Mnt_name_user;
Io_url url = file_dir.GenSubFil_nest(mnt_name, bin_name); // EX: /xowa/enwiki/fsdb.main/fsdb.bin.0000.sqlite3
return new Fsdb_db_file(url, Db_conn_bldr.I.Get(url));
}
public Fsdb_db_file File__bin_file__new(int mnt_id, String file_name) {throw Err_.not_implemented_();}
public static final String Orig_name = "wiki.orig#00.sqlite3", Mnt_name = "wiki.mnt.sqlite3", Abc_name = "fsdb.abc.sqlite3", Atr_name= "fsdb.atr.00.sqlite3";
private static Fsdb_db_file new_db(Io_url file) {return new Fsdb_db_file(file, Db_conn_bldr.I.Get(file));}
}

View File

@@ -0,0 +1,63 @@
/*
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.fsdb; import gplx.*;
import gplx.dbs.*; import gplx.dbs.cfgs.*; import gplx.fsdb.meta.*; import gplx.xowa.files.origs.*; import gplx.xowa.wikis.data.*;
public class Fsdb_db_mgr__v2 implements Fsdb_db_mgr {
private final Xowd_db_layout layout; private final Io_url wiki_dir;
private final Fsdb_db_file file_main_core, file_user_core;
private final Xof_orig_tbl[] orig_tbl_ary;
public Fsdb_db_mgr__v2(Xowd_db_layout layout, Io_url wiki_dir, Fsdb_db_file file_main_core, Fsdb_db_file file_user_core) {
this.layout = layout; this.wiki_dir = wiki_dir;
this.file_main_core = file_main_core; this.file_user_core = file_user_core;
this.orig_tbl_ary = new Xof_orig_tbl[]
{ new Xof_orig_tbl(file_main_core.Conn(), this.File__schema_is_1())
, new Xof_orig_tbl(file_user_core.Conn(), this.File__schema_is_1())
};
}
public boolean File__schema_is_1() {return Bool_.N;}
public boolean File__solo_file() {return layout.Tid_is_all_or_few();}
public String File__cfg_tbl_name() {return Cfg_tbl_name;}
public Xof_orig_tbl[] File__orig_tbl_ary() {return orig_tbl_ary;}
public Fsdb_db_file File__mnt_file() {return file_main_core;}
public Fsdb_db_file File__abc_file__at(int mnt_id) {return mnt_id == Fsm_mnt_mgr.Mnt_idx_main ? file_main_core: file_user_core;}
public Fsdb_db_file File__atr_file__at(int mnt_id) {return mnt_id == Fsm_mnt_mgr.Mnt_idx_main ? file_main_core: file_user_core;}
public Fsdb_db_file File__bin_file__at(int mnt_id, int bin_id, String file_name) {
if (mnt_id == Fsm_mnt_mgr.Mnt_idx_user) return file_user_core;
if (layout.Tid_is_all_or_few()) return file_main_core;
Io_url url = wiki_dir.GenSubFil(file_name);
Db_conn conn = Db_conn_bldr.I.Get(url);
return new Fsdb_db_file(url, conn);
}
public Fsdb_db_file File__bin_file__new(int mnt_id, String file_name) {
if (mnt_id == Fsm_mnt_mgr.Mnt_idx_user) return Fsdb_db_mgr__v2_bldr.Make_bin_tbl(file_user_core);
if (layout.Tid_is_all_or_few()) return Fsdb_db_mgr__v2_bldr.Make_bin_tbl(file_main_core);
Io_url url = wiki_dir.GenSubFil(file_name);
Db_conn conn = Db_conn_bldr.I.New(url);
Db_cfg_tbl cfg_tbl = new Db_cfg_tbl(conn, Cfg_tbl_name); cfg_tbl.Create_tbl();
return Fsdb_db_mgr__v2_bldr.Make_bin_tbl(new Fsdb_db_file(url, conn));
}
public static final String Cfg_tbl_name = "xowa_cfg";
public static Xowd_db_layout Cfg__layout_file__get(Db_conn main_core_conn) {
Db_cfg_tbl cfg_tbl = new Db_cfg_tbl(main_core_conn, "xowa_cfg");
return Xowd_db_layout.get_(cfg_tbl.Select_str_or(gplx.xowa.wikis.Xow_cfg_consts.Grp__bldr_fsdb, Cfg_key__layout_file, Xowd_db_layout.Name_few));
}
public static void Cfg__layout_file__set(Db_cfg_tbl cfg_tbl, Xowd_db_layout v) {
cfg_tbl.Insert_str(gplx.xowa.wikis.Xow_cfg_consts.Grp__bldr_fsdb, Cfg_key__layout_file, v.Name());
}
private static final String Cfg_key__layout_file = "layout_file";
}

View File

@@ -0,0 +1,107 @@
/*
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.fsdb; import gplx.*;
import gplx.dbs.*; import gplx.dbs.cfgs.*; import gplx.fsdb.meta.*; import gplx.fsdb.data.*; import gplx.xowa.files.origs.*;
import gplx.xowa.*; import gplx.xowa.wikis.data.*; import gplx.xowa.bldrs.infos.*;
public class Fsdb_db_mgr__v2_bldr {
public Fsdb_db_mgr__v2 Make(Xowe_wiki wiki) {
Xowd_db_layout layout = wiki.Data_mgr__core_mgr().Props().Layout_file();
String domain_str = wiki.Domain_str();
Io_url wiki_dir = wiki.Fsys_mgr().Root_dir();
String main_core_name = Main_core_name(layout, domain_str);
Fsdb_db_file main_core_file = Make_core_file_main(wiki, wiki_dir, main_core_name, layout);
Fsdb_db_file user_core_file = Make_core_file_user(wiki, wiki_dir, Make_user_name(domain_str), main_core_name);
return new Fsdb_db_mgr__v2(layout, wiki_dir, main_core_file, user_core_file);
}
private Fsdb_db_file Make_core_file_main(Xowe_wiki wiki, Io_url wiki_dir, String main_core_name, Xowd_db_layout layout) {
Io_url url = wiki_dir.GenSubFil(main_core_name);
Db_conn conn = layout.Tid_is_all() ? Db_conn_bldr.I.Get(url) : Db_conn_bldr.I.New(url); // if all, use existing (assumes same file name); else, create new
conn.Txn_bgn();
Fsdb_db_file rv = Make_core_file(url, conn, schema_is_1, Fsm_mnt_mgr.Mnt_idx_main);
if (!layout.Tid_is_all()) // do not make cfg data if all
Make_cfg_data(wiki, main_core_name, rv, Main_core_tid(layout), -1);
Fsdb_db_mgr__v2.Cfg__layout_file__set(rv.Tbl__cfg(), layout);
conn.Txn_end();
return rv;
}
private Fsdb_db_file Make_core_file_user(Xowe_wiki wiki, Io_url wiki_dir, String user_file_name, String main_core_name) { // always create file; do not create mnt_tbl;
Io_url url = wiki_dir.GenSubFil(user_file_name);
Db_conn conn = Db_conn_bldr.I.New(url);
conn.Txn_bgn();
Fsdb_db_file rv = Make_core_file(url, conn, schema_is_1, Fsm_mnt_mgr.Mnt_idx_user);
Fsm_bin_tbl dbb_tbl = new Fsm_bin_tbl(conn, schema_is_1, Fsm_mnt_mgr.Mnt_idx_user); dbb_tbl.Insert(0, user_file_name);
Make_bin_tbl(rv);
Make_cfg_data(wiki, main_core_name, rv, Xowd_db_file_.Tid_file_user, -1);
conn.Txn_end();
return rv;
}
private Fsdb_db_file Make_core_file(Io_url core_url, Db_conn core_conn, boolean schema_is_1, int mnt_id) {
Fsdb_db_file rv = new Fsdb_db_file(core_url, core_conn);
Db_cfg_tbl cfg_tbl = rv.Tbl__cfg();
cfg_tbl.Create_tbl();
cfg_tbl.Insert_int(Fsm_cfg_mgr.Grp_core, Fsm_cfg_mgr.Key_next_id , 1); // start next_id at 1
cfg_tbl.Insert_yn(Fsm_cfg_mgr.Grp_core, Fsm_cfg_mgr.Key_schema_thm_page , Bool_.Y); // new dbs automatically have page and time in fsdb_xtn_tm
cfg_tbl.Insert_yn(Fsm_cfg_mgr.Grp_core, Fsm_cfg_mgr.Key_patch_next_id , Bool_.Y); // new dbs automatically have correct next_id
Fsm_mnt_mgr.Patch(cfg_tbl);
Xof_orig_tbl orig_tbl = new Xof_orig_tbl(core_conn, schema_is_1); orig_tbl.Create_tbl();
if (mnt_id == Fsm_mnt_mgr.Mnt_idx_main) {
Fsm_mnt_tbl mnt_tbl = new Fsm_mnt_tbl(core_conn, schema_is_1); mnt_tbl.Create_tbl();
cfg_tbl.Insert_int("core", "mnt.insert_idx", Fsm_mnt_mgr.Mnt_idx_user);
}
Fsm_atr_tbl dba_tbl = new Fsm_atr_tbl(core_conn, schema_is_1); dba_tbl.Create_tbl();
dba_tbl.Insert(mnt_id, core_url.NameAndExt());
Fsm_bin_tbl dbb_tbl = new Fsm_bin_tbl(core_conn, schema_is_1, mnt_id); dbb_tbl.Create_tbl();
Fsd_dir_tbl dir_tbl = new Fsd_dir_tbl(core_conn, schema_is_1); dir_tbl.Create_tbl();
Fsd_fil_tbl fil_tbl = new Fsd_fil_tbl(core_conn, schema_is_1, mnt_id); fil_tbl.Create_tbl();
Fsd_thm_tbl thm_tbl = new Fsd_thm_tbl(core_conn, schema_is_1, mnt_id, Bool_.Y); thm_tbl.Create_tbl();
return rv;
}
public static Fsdb_db_file Make_bin_tbl(Fsdb_db_file file) {
Fsd_bin_tbl bin_tbl = new Fsd_bin_tbl(file.Conn(), schema_is_1); bin_tbl.Create_tbl();
return file;
}
public static String Main_core_name(Xowd_db_layout layout, String wiki_domain) {
switch (layout.Tid()) {
case Xowd_db_layout.Const_all: return Main_core_name_all(wiki_domain);
case Xowd_db_layout.Const_few: return Main_core_name_few(wiki_domain);
case Xowd_db_layout.Const_lot: return Main_core_name_lot(wiki_domain);
default: throw Err_.not_implemented_();
}
}
private static byte Main_core_tid(Xowd_db_layout layout) {
switch (layout.Tid()) {
case Xowd_db_layout.Const_all: return Xowd_db_file_.Tid_core;
case Xowd_db_layout.Const_few: return Xowd_db_file_.Tid_file_solo;
case Xowd_db_layout.Const_lot: return Xowd_db_file_.Tid_file_core;
default: throw Err_.not_implemented_();
}
}
public static void Make_cfg_data(Xowe_wiki wiki, String file_core_name, Fsdb_db_file file, byte file_tid, int part_id) {
Db_cfg_tbl cfg_tbl = file.Tbl__cfg();
Xowd_db_file core_db = wiki.Data_mgr__core_mgr().Db__core();
core_db.Info_session().Save(cfg_tbl);
Xob_info_file info_file = new Xob_info_file(-1, Xowd_db_file_.To_key(file_tid), Xob_info_file.Ns_ids_empty, part_id, Guid_adp_.random_(), 2, file_core_name, file.Url().NameAndExt());
info_file.Save(cfg_tbl);
}
private static String Main_core_name_all(String wiki_domain) {return wiki_domain + ".xowa";} // EX: en.wikipedia.org.xowa
private static String Main_core_name_few(String wiki_domain) {return wiki_domain + "-file.xowa";} // EX: en.wikipedia.org-file.xowa
private static String Main_core_name_lot(String wiki_domain) {return wiki_domain + "-file-core.xowa";} // EX: en.wikipedia.org-file-core.xowa
public static String Make_user_name(String wiki_domain) {return wiki_domain + "-file-user.xowa";} // EX: en.wikipedia.org-file-user.xowa
private static final boolean schema_is_1 = false;
public static final Fsdb_db_mgr__v2_bldr I = new Fsdb_db_mgr__v2_bldr(); Fsdb_db_mgr__v2_bldr() {}
}

View File

@@ -18,76 +18,66 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.fsdb.data; import gplx.*; import gplx.fsdb.*;
import gplx.dbs.*; import gplx.ios.*;
import gplx.dbs.engines.sqlite.*;
public class Fsd_bin_tbl {
private String tbl_name = "file_data_bin"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_();
private String fld_owner_id, fld_owner_tid, fld_part_id, fld_data_url, fld_data;
private Db_conn conn;
private Bry_bfr tmp_bfr = Bry_bfr.reset_(Io_mgr.Len_kb);
public void Conn_(Db_conn new_conn, boolean created, boolean schema_is_1) {
this.conn = new_conn; flds.Clear();
String fld_prefix = "";
if (schema_is_1) {
tbl_name = "fsdb_bin";
fld_prefix = "bin_";
}
fld_owner_id = flds.Add_int(fld_prefix + "owner_id");
fld_owner_tid = flds.Add_byte(fld_prefix + "owner_tid");
fld_part_id = flds.Add_int(fld_prefix + "part_id");
fld_data_url = flds.Add_str(fld_prefix + "data_url", 255);
fld_data = flds.Add_bry(fld_prefix + "data"); // mediumblob
if (created) {
Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds
, Db_meta_idx.new_unique_by_tbl(tbl_name, "pkey", fld_owner_id)
);
conn.Exec_create_tbl_and_idx(meta);
}
public class Fsd_bin_tbl implements RlsAble {
private final String tbl_name = "fsdb_bin"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_();
private final String fld_owner_id, fld_owner_tid, fld_part_id, fld_data_url, fld_data;
private Db_conn conn; private Db_stmt stmt_insert, stmt_select; private final Bry_bfr tmp_bfr = Bry_bfr.reset_(Io_mgr.Len_kb);
public Fsd_bin_tbl(Db_conn conn, boolean schema_is_1) {
this.conn = conn;
fld_owner_id = flds.Add_int_pkey ("bin_owner_id");
fld_owner_tid = flds.Add_byte ("bin_owner_tid");
fld_part_id = flds.Add_int ("bin_part_id");
fld_data_url = flds.Add_str ("bin_data_url", 255);
fld_data = flds.Add_bry ("bin_data"); // mediumblob
conn.Rls_reg(this);
}
public long Insert_rdr(int id, byte tid, long bin_len, Io_stream_rdr bin_rdr) {
synchronized (tmp_bfr) {
Db_stmt stmt = conn.Stmt_insert(tbl_name, flds);
byte[] bin_ary = Io_stream_rdr_.Load_all_as_bry(tmp_bfr, bin_rdr);
long rv = bin_ary.length;
stmt.Clear()
.Val_int(fld_owner_id, id)
.Val_byte(fld_owner_tid, tid)
.Val_int(fld_part_id, Null_part_id)
.Val_str(fld_data_url, Null_data_url)
.Val_bry(bin_ary)
.Exec_insert();
return rv;
}
public void Rls() {
stmt_insert = Db_stmt_.Rls(stmt_insert);
stmt_select = Db_stmt_.Rls(stmt_select);
}
public Io_stream_rdr Select_as_rdr(Db_conn conn, int owner_id) {
Db_rdr rdr = Db_rdr_.Null;
try {
Db_stmt stmt = conn.Stmt_select(tbl_name, String_.Ary(fld_data), fld_owner_id);
rdr = stmt.Clear().Crt_int(fld_owner_id, owner_id).Exec_select_as_rdr();
return rdr.Move_next()
? Io_stream_rdr_.mem_(Read_bin_data(rdr))
: Io_stream_rdr_.Null;
}
finally {rdr.Rls();}
public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds));}
public void Insert_bgn() {conn.Txn_bgn(); stmt_insert = conn.Stmt_insert(tbl_name, flds);}
public void Insert_commit() {conn.Txn_sav();}
public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);}
public void Insert_rdr(int id, byte tid, long bin_len, Io_stream_rdr bin_rdr) {
if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
byte[] bin_ary = null;
synchronized (tmp_bfr) {bin_ary = Io_stream_rdr_.Load_all_as_bry(tmp_bfr, bin_rdr);}
stmt_insert.Clear()
.Val_int(fld_owner_id, id)
.Val_byte(fld_owner_tid, tid)
.Val_int(fld_part_id, Part_id_null)
.Val_str(fld_data_url, Data_url_null)
.Val_bry(fld_data, bin_ary)
.Exec_insert();
}
public Io_stream_rdr Select_as_rdr(int owner_id) {
byte[] rv = Select(owner_id);
return rv == null
? Io_stream_rdr_.Null
: Io_stream_rdr_.mem_(rv);
}
public boolean Select_to_url(int owner_id, Io_url url) {
Db_rdr rdr = Db_rdr_.Null;
byte[] rv = Select(owner_id);
if (rv == null) return false;
Io_mgr._.SaveFilBry(url, rv);
return true;
}
private byte[] Select(int owner_id) {
if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, String_.Ary(fld_data), fld_owner_id);
Db_rdr rdr = stmt_select.Clear().Crt_int(fld_owner_id, owner_id).Exec_select__rls_manual();
try {
Db_stmt stmt = conn.Stmt_select(tbl_name, String_.Ary(fld_data), fld_owner_id);
rdr = stmt.Clear().Crt_int(fld_owner_id, owner_id).Exec_select_as_rdr();
if (rdr.Move_next()) {
byte[] bry = Read_bin_data(rdr);
Io_mgr._.SaveFilBry(url, bry);
return true;
byte[] rv = rdr.Read_bry(fld_data);
return rv == null ? Bry_.Empty : rv; // NOTE: bug in v0.10.1 where .ogg would save as null; return Bry_.Empty instead, else java.io.ByteArrayInputStream would fail on null
}
else
return false;
return null;
}
finally {rdr.Rls();}
}
private byte[] Read_bin_data(Db_rdr rdr) {
byte[] rv = rdr.Read_bry(fld_data);
return rv == null ? Bry_.Empty : rv; // NOTE: bug in v0.10.1 where .ogg would save as null; return Bry_.Empty instead, else java.io.ByteArrayInputStream would fail on null
}
public static final byte Owner_tid_fil = 1, Owner_tid_thm = 2;
public static final int Null_db_bin_id = -1, Null_size = -1, Null_part_id = -1;
public static final String Null_data_url = "";
public static final int Bin_db_id_null = -1, Size_null = -1;
private static final int Part_id_null = -1;
private static final String Data_url_null = "";
}

View File

@@ -17,9 +17,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.fsdb.data; import gplx.*; import gplx.fsdb.*;
public class Fsd_dir_itm {
public Fsd_dir_itm(int id, int owner, String name) {this.id = id; this.owner = owner; this.name = name;}
public int Id() {return id;} private final int id;
public int Owner() {return owner;} private final int owner;
public String Name() {return name;} private final String name;
public static final Fsd_dir_itm Null = new Fsd_dir_itm(0, 0, "");
public Fsd_dir_itm(int dir_id, int owner, byte[] name) {this.dir_id = dir_id; this.owner = owner; this.name = name;}
public int Dir_id() {return dir_id;} private final int dir_id;
public int Owner() {return owner;} private final int owner;
public byte[] Name() {return name;} private final byte[] name;
public static final int Owner_root = 0;
public static final Fsd_dir_itm Null = null;
}

View File

@@ -17,50 +17,47 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.fsdb.data; import gplx.*; import gplx.fsdb.*;
import gplx.dbs.*;
public class Fsd_dir_tbl {
private String tbl_name = "file_data_dir"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_();
private String fld_id, fld_owner_id, fld_name;
private Db_conn conn; private Db_stmt stmt_insert, stmt_update, stmt_select_by_name;
public void Conn_(Db_conn new_conn, boolean created, boolean schema_is_1) {
this.conn = new_conn; flds.Clear();
String fld_prefix = "";
if (schema_is_1) {
tbl_name = "fsdb_dir";
fld_prefix = "dir_";
}
fld_id = flds.Add_int(fld_prefix + "id");
fld_owner_id = flds.Add_int(fld_prefix + "owner_id");
fld_name = flds.Add_str(fld_prefix + "name", 255);
if (created) {
Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds
, Db_meta_idx.new_unique_by_tbl(tbl_name, "pkey", fld_id)
, Db_meta_idx.new_normal_by_tbl(tbl_name, "name", fld_name, fld_owner_id, fld_id)
);
conn.Exec_create_tbl_and_idx(meta);
}
stmt_insert = stmt_update = stmt_select_by_name = null;
public class Fsd_dir_tbl implements RlsAble {
private final String tbl_name = "fsdb_dir"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_();
private final String fld_id, fld_owner_id, fld_name;
private final Db_conn conn; private Db_stmt stmt_insert, stmt_update, stmt_select_by_name;
public Fsd_dir_tbl(Db_conn conn, boolean schema_is_1) {
this.conn = conn;
this.fld_id = flds.Add_int_pkey ("dir_id");
this.fld_owner_id = flds.Add_int ("dir_owner_id");
this.fld_name = flds.Add_str ("dir_name", 255);
conn.Rls_reg(this);
}
public void Insert(int id, String name, int owner_id) {
if (stmt_insert == null) stmt_insert = conn.Rls_reg(conn.Stmt_insert(tbl_name, flds));
public void Rls() {
stmt_insert = Db_stmt_.Rls(stmt_insert);
stmt_update = Db_stmt_.Rls(stmt_update);
stmt_select_by_name = Db_stmt_.Rls(stmt_select_by_name);
}
public void Create_tbl() {
conn.Ddl_create_tbl
( Db_meta_tbl.new_(tbl_name, flds
, Db_meta_idx.new_normal_by_tbl(tbl_name, "name", fld_name, fld_owner_id, fld_id)));
}
public void Insert(int id, byte[] name, int owner_id) {
if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
stmt_insert.Clear()
.Val_int(fld_id, id)
.Val_int(fld_owner_id, owner_id)
.Val_str(fld_name, name)
.Val_bry_as_str(fld_name, name)
.Exec_insert();
}
public void Update(int id, String name, int owner_id) {
if (stmt_update == null) stmt_update = conn.Rls_reg(conn.Stmt_update_exclude(tbl_name, flds, fld_id));
public void Update(int id, byte[] name, int owner_id) {
if (stmt_update == null) stmt_update = conn.Stmt_update_exclude(tbl_name, flds, fld_id);
stmt_update.Clear()
.Val_int(fld_owner_id, owner_id)
.Val_str(fld_name, name)
.Val_bry_as_str(fld_name, name)
.Crt_int(fld_id, id)
.Exec_update();
}
public Fsd_dir_itm Select_itm(String name) {
if (stmt_select_by_name == null) stmt_select_by_name = conn.Rls_reg(conn.Stmt_select(tbl_name, flds, fld_name));
Db_rdr rdr = Db_rdr_.Null;
public Fsd_dir_itm Select_or_null(byte[] name) {
if (stmt_select_by_name == null) stmt_select_by_name = conn.Stmt_select(tbl_name, flds, fld_name);
Db_rdr rdr = stmt_select_by_name.Clear().Crt_bry_as_str(fld_name, name).Exec_select__rls_manual();
try {
rdr = stmt_select_by_name.Clear().Crt_str(fld_name, name).Exec_select_as_rdr();
return rdr.Move_next()
? new Fsd_dir_itm(rdr.Read_int(fld_id), rdr.Read_int(fld_owner_id), name)
: Fsd_dir_itm.Null

View File

@@ -17,16 +17,18 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.fsdb.data; import gplx.*; import gplx.fsdb.*;
public class Fsd_fil_itm {
public int Id() {return id;} private int id;
public int Owner() {return owner;} private int owner;
public int Ext_id() {return ext_id;} private int ext_id;
public String Name() {return name;} private String name;
public int Db_bin_id() {return bin_db_id;} private int bin_db_id;
public int Mnt_id() {return mnt_id;} public Fsd_fil_itm Mnt_id_(int v) {mnt_id = v; return this;} private int mnt_id;
public Fsd_fil_itm Init(int id, int owner, int ext_id, String name, int bin_db_id) {this.id = id; this.owner = owner; this.ext_id = ext_id; this.name = name; this.bin_db_id = bin_db_id; return this;}
public void Init_for_insert(int bin_db_id, int dir_id, int fil_id) {
this.bin_db_id = bin_db_id; this.owner = dir_id; this.id = fil_id;
public Fsd_fil_itm Ctor(int mnt_id, int dir_id, int fil_id, int bin_db_id, byte[] name, int ext_id) {
this.mnt_id = mnt_id; this.dir_id = dir_id; this.fil_id = fil_id; this.bin_db_id = bin_db_id; this.name = name; this.ext_id = ext_id;
return this;
}
public int Mnt_id() {return mnt_id;} private int mnt_id;
public int Fil_id() {return fil_id;} private int fil_id;
public int Dir_id() {return dir_id;} private int dir_id;
public int Bin_db_id() {return bin_db_id;} private int bin_db_id;
public byte[] Name() {return name;} private byte[] name;
public int Ext_id() {return ext_id;} private int ext_id;
public static final Fsd_fil_itm Null = null;
public static byte[] Gen_cache_key(Bry_bfr bfr, int dir_id, byte[] name) {
return bfr.Add_int_variable(dir_id).Add_byte_pipe().Add(name).Xto_bry_and_clear();
}
public static final int Null_id = 0;
public static final Fsd_fil_itm Null = new Fsd_fil_itm().Init(Null_id, 0, 0, "", Fsd_bin_tbl.Null_db_bin_id);
}

View File

@@ -17,80 +17,87 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.fsdb.data; import gplx.*; import gplx.fsdb.*;
import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.dbs.engines.sqlite.*;
public class Fsd_fil_tbl {
private String tbl_name = "file_data_fil"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_();
private String fld_id, fld_owner_id, fld_name, fld_xtn_id, fld_ext_id, fld_size, fld_modified, fld_hash, fld_bin_db_id;
private String Idx_owner;
private Db_conn conn; private Db_stmt stmt_insert, stmt_update, stmt_select_by_name;
public void Conn_(Db_conn new_conn, boolean created, boolean schema_is_1) {
this.conn = new_conn; flds.Clear();
String fld_prefix = "";
if (schema_is_1) {
tbl_name = "fsdb_fil";
fld_prefix = "fil_";
}
fld_id = flds.Add_int(fld_prefix + "id");
fld_owner_id = flds.Add_int(fld_prefix + "owner_id");
fld_xtn_id = flds.Add_int(fld_prefix + "xtn_id");
fld_ext_id = flds.Add_int(fld_prefix + "ext_id");
fld_bin_db_id = flds.Add_int(fld_prefix + "bin_db_id"); // group ints at beginning of table
fld_name = flds.Add_str(fld_prefix + "name", 255);
fld_size = flds.Add_long(fld_prefix + "size");
fld_modified = flds.Add_str(fld_prefix + "modified", 14); // stored as yyyyMMddHHmmss
fld_hash = flds.Add_str(fld_prefix + "hash", 40);
Idx_owner = Db_meta_idx.Bld_idx_name(tbl_name, "owner");
if (created) {
Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds
, Db_meta_idx.new_unique_by_tbl(tbl_name, "pkey", fld_id)
, Db_meta_idx.new_unique_by_name(tbl_name, Idx_owner, fld_owner_id, fld_name, fld_id)
);
conn.Exec_create_tbl_and_idx(meta);
}
stmt_insert = stmt_update = stmt_select_by_name = null;
public class Fsd_fil_tbl implements RlsAble {
private final String tbl_name = "fsdb_fil"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_();
private final String fld_id, fld_owner_id, fld_name, fld_xtn_id, fld_ext_id, fld_size, fld_modified, fld_hash, fld_bin_db_id;
private final String idx_owner;
private Db_conn conn; private Db_stmt stmt_insert, stmt_update, stmt_select_by_name; private int mnt_id;
public Fsd_fil_tbl(Db_conn conn, boolean schema_is_1, int mnt_id) {
this.conn = conn; this.mnt_id = mnt_id;
this.fld_id = flds.Add_int_pkey ("fil_id");
this.fld_owner_id = flds.Add_int ("fil_owner_id");
this.fld_xtn_id = flds.Add_int ("fil_xtn_id");
this.fld_ext_id = flds.Add_int ("fil_ext_id");
this.fld_bin_db_id = flds.Add_int ("fil_bin_db_id"); // group ints at beginning of table
this.fld_name = flds.Add_str ("fil_name", 255);
this.fld_size = flds.Add_long ("fil_size");
this.fld_modified = flds.Add_str ("fil_modified", 14); // stored as yyyyMMddHHmmss
this.fld_hash = flds.Add_str ("fil_hash", 40);
this.idx_owner = Db_meta_idx.Bld_idx_name(tbl_name, "owner");
conn.Rls_reg(this);
}
public void Insert(int id, int owner_id, String name, int xtn_id, int ext_id, long size, DateAdp modified, String hash, int bin_db_id) {
if (stmt_insert == null) stmt_insert = conn.Rls_reg(conn.Stmt_insert(tbl_name, flds));
public void Rls() {
stmt_insert = Db_stmt_.Rls(stmt_insert);
stmt_update = Db_stmt_.Rls(stmt_update);
stmt_select_by_name = Db_stmt_.Rls(stmt_select_by_name);
}
public void Create_tbl() {
conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds
, Db_meta_idx.new_unique_by_name(tbl_name, idx_owner, fld_owner_id, fld_name, fld_id)
));
}
public void Insert(int id, int owner_id, byte[] name, int xtn_id, int ext_id, long size, int bin_db_id) {
if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
stmt_insert.Clear()
.Val_int(fld_id, id)
.Val_int(fld_owner_id, owner_id)
.Val_int(fld_xtn_id, xtn_id)
.Val_int(fld_ext_id, ext_id)
.Val_int(fld_bin_db_id, bin_db_id)
.Val_str(fld_name, name)
.Val_bry_as_str(fld_name, name)
.Val_long(fld_size, size)
.Val_str(fld_modified, Sqlite_engine_.X_date_to_str(modified))
.Val_str(fld_hash, hash)
.Val_str(fld_modified, String_.Empty)
.Val_str(fld_hash, String_.Empty)
.Exec_insert();
}
public void Update(int id, int owner_id, String name, int xtn_id, int ext_id, long size, DateAdp modified, String hash, int bin_db_id) {
if (stmt_update == null) stmt_update = conn.Rls_reg(conn.Stmt_update_exclude(tbl_name, flds, fld_id));
public void Update(int id, int owner_id, byte[] name, int xtn_id, int ext_id, long size, int bin_db_id) {
if (stmt_update == null) stmt_update = conn.Stmt_update_exclude(tbl_name, flds, fld_id);
stmt_update.Clear()
.Val_int(fld_owner_id, owner_id)
.Val_int(fld_xtn_id, xtn_id)
.Val_int(fld_ext_id, ext_id)
.Val_int(fld_bin_db_id, bin_db_id)
.Val_str(fld_name, name)
.Val_bry_as_str(fld_name, name)
.Val_long(fld_size, size)
.Val_str(fld_modified, Sqlite_engine_.X_date_to_str(modified))
.Val_str(fld_hash, hash)
.Crt_int(fld_id, id)
.Exec_update();
}
public Fsd_fil_itm Select_itm_by_name(int dir_id, String fil_name) {
public Fsd_fil_itm Select_or_null(int dir_id, byte[] fil_name) {
if (stmt_select_by_name == null) {
Db_qry__select_cmd qry = Db_qry__select_cmd.new_().From_(tbl_name).Cols_(flds.To_str_ary()).Where_(Db_crt_.eq_many_(fld_owner_id, fld_name)).Indexed_by_(Idx_owner);
stmt_select_by_name = conn.Rls_reg(conn.Stmt_new(qry));
Db_qry__select_cmd qry = Db_qry__select_cmd.new_().From_(tbl_name).Cols_(flds.To_str_ary()).Where_(Db_crt_.eq_many_(fld_owner_id, fld_name)).Indexed_by_(idx_owner);
stmt_select_by_name = conn.Stmt_new(qry);
}
Db_rdr rdr = Db_rdr_.Null;
try {
rdr = stmt_select_by_name.Clear()
Db_rdr rdr = stmt_select_by_name.Clear()
.Crt_int(fld_owner_id, dir_id)
.Crt_str(fld_name, fil_name)
.Exec_select_as_rdr();
return rdr.Move_next()
? new Fsd_fil_itm().Init(rdr.Read_int(fld_id), rdr.Read_int(fld_owner_id), rdr.Read_int(fld_ext_id), rdr.Read_str(fld_name), rdr.Read_int(fld_bin_db_id))
: Fsd_fil_itm.Null;
.Crt_bry_as_str(fld_name, fil_name)
.Exec_select__rls_manual();
try {
return rdr.Move_next() ? new_(mnt_id, rdr) : Fsd_fil_itm.Null;
}
finally {rdr.Rls();}
}
public void Select_all(Bry_bfr key_bfr, gplx.cache.Gfo_cache_mgr_bry cache) {
Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empy).Exec_select__rls_auto();
try {
while (rdr.Move_next()) {
Fsd_fil_itm fil = new_(mnt_id, rdr);
byte[] cache_key = Fsd_fil_itm.Gen_cache_key(key_bfr, fil.Dir_id(), fil.Name());
cache.Add(cache_key, fil);
}
}
finally {rdr.Rls();}
}
private Fsd_fil_itm new_(int mnt_id, Db_rdr rdr) {
return new Fsd_fil_itm().Ctor(mnt_id, rdr.Read_int(fld_owner_id), rdr.Read_int(fld_id), rdr.Read_int(fld_bin_db_id), rdr.Read_bry_by_str(fld_name), rdr.Read_int(fld_ext_id));
}
}

View File

@@ -17,11 +17,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.fsdb.data; import gplx.*; import gplx.fsdb.*;
public class Fsd_img_itm {
public int Id() {return id;} public void Id_(int v) {this.id = v;} private int id;
public int W() {return w;} public void W_(int v) {this.w = v;} private int w;
public int H() {return h;} public void H_(int v) {this.h = v;} private int h;
public int Db_bin_id() {return bin_db_id;} public Fsd_img_itm Db_bin_id_(int v) {bin_db_id = v; return this;} private int bin_db_id;
public Fsd_img_itm Init_by_load(int id, int w, int h) {this.id = id; this.w = w; this.h = h; return this;}
public static final Fsd_img_itm Null = new Fsd_img_itm();
public static final int Bits_default = 8;
public void Ctor(int mnt_id, int dir_id, int fil_id, int bin_db_id) {
this.mnt_id = mnt_id; this.dir_id = dir_id; this.fil_id = fil_id; this.bin_db_id = bin_db_id;
}
public int Mnt_id() {return mnt_id;} private int mnt_id;
public int Fil_id() {return fil_id;} private int fil_id;
public int Dir_id() {return dir_id;} private int dir_id;
public int Bin_db_id() {return bin_db_id;} private int bin_db_id;
}

View File

@@ -17,46 +17,35 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.fsdb.data; import gplx.*; import gplx.fsdb.*;
public class Fsd_thm_itm {
public int Id() {return id;} private int id;
public int Owner_id() {return owner_id;} private int owner_id;
public int W() {return w;} private int w;
public double Time() {return time;} private double time;
public int Page() {return page;} private int page;
public int H() {return h;} private int h;
public long Size() {return size;} private long size;
public String Modified() {return modified;} private String modified;
public String Hash() {return hash;} private String hash;
public int Dir_id() {return dir_id;} private int dir_id;
public int Db_bin_id() {return bin_db_id;} private int bin_db_id;
public int Mnt_id() {return mnt_id;} private int mnt_id;
public int Req_w() {return req_w;} private int req_w;
public double Req_time() {return req_time;} private double req_time;
public int Req_page() {return req_page;} private int req_page;
public void Init_by_load(int bin_db_id, int id, int owner_id, int w, double time, int page, int h, long size, String modified, String hash) {
this.bin_db_id = bin_db_id; this.id = id; this.owner_id = owner_id;
this.w = w; this.time = time; this.page = page; this.h = h; this.size = size; this.modified = modified; this.hash = hash;
public void Ctor(int mnt_id, int dir_id, int fil_id, int thm_id, int bin_db_id, int w, int h, double time, int page, long size, String modified, String hash) {
this.mnt_id = mnt_id; this.dir_id = dir_id; this.fil_id = fil_id; this.thm_id = thm_id; this.bin_db_id = bin_db_id;
this.w = w; this.h = h; this.time = time; this.page = page;
this.size = size; this.modified = modified; this.hash = hash;
}
public void Init_by_insert(int bin_db_id, int dir_id, int fil_id, int thm_id) {this.bin_db_id = bin_db_id; this.dir_id = dir_id; this.owner_id = fil_id; this.id = thm_id;}
public int Mnt_id() {return mnt_id;} private int mnt_id;
public int Dir_id() {return dir_id;} private int dir_id;
public int Fil_id() {return fil_id;} private int fil_id;
public int Thm_id() {return thm_id;} private int thm_id;
public int Db_bin_id() {return bin_db_id;} private int bin_db_id;
public int W() {return w;} private int w;
public int H() {return h;} private int h;
public double Time() {return time;} private double time;
public int Page() {return page;} private int page;
public long Size() {return size;} private long size;
public String Modified() {return modified;} private String modified;
public String Hash() {return hash;} private String hash;
public int Req_w() {return req_w;} private int req_w;
public double Req_time() {return req_time;} private double req_time;
public int Req_page() {return req_page;} private int req_page;
public void Init_by_req(int w, double time, int page) {this.w = w; this.time = time; this.page = page;}
public void Init_by_match(Fsd_thm_itm comp) {
this.req_w = w;
this.req_time = time;
this.req_page = page;
this.id = comp.id;
this.owner_id = comp.owner_id;
this.w = comp.w;
this.time = comp.time;
this.page = comp.page;
this.h = comp.h;
this.size = comp.size;
this.modified = comp.modified;
this.hash = comp.hash;
this.dir_id = comp.dir_id;
this.bin_db_id = comp.bin_db_id;
this.mnt_id = comp.mnt_id;
this.req_w = w; this.req_time = time; this.req_page = page;
this.mnt_id = comp.mnt_id; this.dir_id = comp.dir_id; this.fil_id = comp.fil_id; this.thm_id = comp.thm_id; this.bin_db_id = comp.bin_db_id;
this.w = comp.w; this.h = comp.h; this.time = comp.time; this.page = comp.page;
this.size = comp.size; this.modified = comp.modified; this.hash = comp.hash;
}
public Fsd_thm_itm Mnt_id_(int v) {mnt_id = v; return this;}
public static final Fsd_thm_itm Null = new Fsd_thm_itm();
public static final Fsd_thm_itm Null = null;
public static final Fsd_thm_itm[] Ary_empty = new Fsd_thm_itm[0];
public static Fsd_thm_itm new_() {return new Fsd_thm_itm();} Fsd_thm_itm() {}
}

View File

@@ -16,129 +16,98 @@ 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.fsdb.data; import gplx.*; import gplx.fsdb.*;
import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.dbs.engines.sqlite.*;
import gplx.fsdb.meta.*;
public class Fsd_thm_tbl {
private String tbl_name = "file_data_thm"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_();
private String fld_id, fld_owner_id, fld_w, fld_h, fld_time, fld_page, fld_bin_db_id, fld_size, fld_modified, fld_hash, fld_thumbtime;
private Db_conn conn; private Db_stmt stmt_insert, stmt_select_by_fil_w;
private Fsm_atr_fil atr_fil;
public void Conn_(Db_conn new_conn, boolean created, boolean schema_is_1, Fsm_atr_fil atr_fil) {
this.conn = new_conn; flds.Clear(); this.atr_fil = atr_fil;
String fld_prefix = "";
if (schema_is_1) {
tbl_name = "fsdb_xtn_thm";
fld_prefix = "thm_";
import gplx.dbs.*; import gplx.fsdb.meta.*; import gplx.xowa.files.*;
public class Fsd_thm_tbl implements RlsAble {
private final String tbl_name; private final Db_meta_fld_list flds = Db_meta_fld_list.new_();
private final String fld_id, fld_owner_id, fld_w, fld_h, fld_time, fld_page, fld_bin_db_id, fld_size, fld_modified, fld_hash;
private final Db_conn conn; private Db_stmt stmt_insert, stmt_select_by_fil_w; private int mnt_id; private boolean schema_thm_page;
public Fsd_thm_tbl(Db_conn conn, boolean schema_is_1, int mnt_id, boolean schema_thm_page) {
this.conn = conn; this.mnt_id = mnt_id; this.schema_thm_page = schema_thm_page;
this.tbl_name = schema_is_1 ? "fsdb_xtn_thm" : "fsdb_thm";
this.fld_id = flds.Add_int_pkey ("thm_id");
this.fld_owner_id = flds.Add_int ("thm_owner_id");
this.fld_w = flds.Add_int ("thm_w");
this.fld_h = flds.Add_int ("thm_h");
if (schema_thm_page) {
this.fld_time = flds.Add_double ("thm_time");
this.fld_page = flds.Add_int ("thm_page");
}
fld_id = flds.Add_int(fld_prefix + "id");
fld_owner_id = flds.Add_int(fld_prefix + "owner_id");
fld_w = flds.Add_int(fld_prefix + "w");
fld_h = flds.Add_int(fld_prefix + "h");
fld_time = flds.Add_double(fld_prefix + "time");
fld_page = flds.Add_int(fld_prefix + "page");
fld_bin_db_id = flds.Add_int(fld_prefix + "bin_db_id");
fld_size = flds.Add_long(fld_prefix + "size");
fld_modified = flds.Add_str(fld_prefix + "modified", 14); // stored as yyyyMMddHHmmss
fld_hash = flds.Add_str(fld_prefix + "hash", 40);
if (created) {
Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds
, Db_meta_idx.new_unique_by_tbl(tbl_name, "pkey", fld_id)
, Db_meta_idx.new_unique_by_tbl(tbl_name, "owner", fld_owner_id, fld_id, fld_w, fld_time, fld_page)
);
conn.Exec_create_tbl_and_idx(meta);
else {
this.fld_time = flds.Add_int ("thm_thumbtime");
this.fld_page = Db_meta_fld.Key_null;
}
stmt_insert = stmt_select_by_fil_w = null;
schema_thm_page_init = true;
this.fld_bin_db_id = flds.Add_int ("thm_bin_db_id");
this.fld_size = flds.Add_long ("thm_size");
this.fld_modified = flds.Add_str ("thm_modified", 14); // stored as yyyyMMddHHmmss
this.fld_hash = flds.Add_str ("thm_hash", 40);
conn.Rls_reg(this);
}
private boolean Schema_thm_page() {
if (schema_thm_page_init) {
schema_thm_page = atr_fil.Abc_mgr().Cfg_mgr().Schema_thm_page();
schema_thm_page_init = false;
if (schema_thm_page) {
fld_thumbtime = Db_meta_fld.Key_null;
}
else {
fld_time = Db_meta_fld.Key_null;
fld_page = Db_meta_fld.Key_null;
}
}
return schema_thm_page;
} private boolean schema_thm_page, schema_thm_page_init = true;
public void Insert(int id, int thm_owner_id, int width, int height, double thumbtime, int page, int bin_db_id, long size, DateAdp modified, String hash) {
if (stmt_insert == null) {
String tmp_fld_time = this.Schema_thm_page() ? fld_time : fld_thumbtime;
stmt_insert = conn.Rls_reg(conn.Stmt_insert(tbl_name, fld_id, fld_owner_id, fld_w, fld_h, tmp_fld_time, fld_page, fld_bin_db_id, fld_size, fld_modified, fld_hash));
}
public void Rls() {
stmt_insert = Db_stmt_.Rls(stmt_insert);
stmt_select_by_fil_w = Db_stmt_.Rls(stmt_select_by_fil_w);
}
public void Create_tbl() {
conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds
, Db_meta_idx.new_unique_by_tbl(tbl_name, "owner", fld_owner_id, fld_id, fld_w, fld_time, fld_page)
));
}
public void Insert(int id, int thm_owner_id, int width, int height, double thumbtime, int page, int bin_db_id, long size) {
if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
stmt_insert.Clear()
.Val_int(fld_id, id)
.Val_int(fld_owner_id, thm_owner_id)
.Val_int(fld_w, width)
.Val_int(fld_h, height);
if (this.Schema_thm_page()) {
stmt_insert.Val_double (fld_time, gplx.xowa.files.Xof_lnki_time.Db_save_double(thumbtime));
stmt_insert.Val_int (fld_page, gplx.xowa.files.Xof_lnki_page.Db_save_int(page));
if (schema_thm_page) {
stmt_insert.Val_double (fld_time, Xof_lnki_time.Db_save_double(thumbtime));
stmt_insert.Val_int (fld_page, Xof_lnki_page.Db_save_int(page));
}
else
stmt_insert.Val_int (fld_thumbtime, gplx.xowa.files.Xof_lnki_time.Db_save_int(thumbtime));
stmt_insert.Val_int (fld_time, Xof_lnki_time.Db_save_int(thumbtime));
stmt_insert
.Val_int(fld_bin_db_id, bin_db_id)
.Val_long(fld_size, size)
.Val_str(fld_modified, Sqlite_engine_.X_date_to_str(modified))
.Val_str(fld_hash, hash)
.Val_str(fld_modified, Modified_null_str)
.Val_str(fld_hash, Hash_null)
.Exec_insert();
}
private Db_stmt Select_by_fil_w_stmt() {
Db_qry__select_cmd qry = Db_qry_.select_().From_(tbl_name).Cols_all_();
gplx.core.criterias.Criteria crt
= this.Schema_thm_page()
? Db_crt_.eq_many_(fld_owner_id, fld_w, fld_time, fld_page)
: Db_crt_.eq_many_(fld_owner_id, fld_w, fld_thumbtime)
;
qry.Where_(crt);
return conn.Stmt_new(qry);
}
public boolean Select_itm_by_fil_width(int owner_id, Fsd_thm_itm thm) {
if (stmt_select_by_fil_w == null) stmt_select_by_fil_w = conn.Rls_reg(Select_by_fil_w_stmt());
Db_rdr rdr = Db_rdr_.Null;
public boolean Select_itm_by_fil_width(int dir_id, int fil_id, Fsd_thm_itm thm) {
if (stmt_select_by_fil_w == null) stmt_select_by_fil_w = conn.Stmt_select(tbl_name, flds, String_.Ary_wo_null(fld_owner_id, fld_w, fld_time, fld_page));
stmt_select_by_fil_w.Clear().Crt_int(fld_owner_id, fil_id).Crt_int(fld_w, thm.W());
if (schema_thm_page) {
stmt_select_by_fil_w.Crt_double (fld_time, Xof_lnki_time.Db_save_double(thm.Time()));
stmt_select_by_fil_w.Crt_int (fld_page, Xof_lnki_page.Db_save_int(thm.Page()));
}
else {
stmt_select_by_fil_w.Crt_int (fld_time, Xof_lnki_time.Db_save_int(thm.Time()));
}
Db_rdr rdr = stmt_select_by_fil_w.Exec_select__rls_manual();
try {
stmt_select_by_fil_w.Clear()
.Crt_int(fld_owner_id, owner_id)
.Crt_int(fld_w, thm.W())
;
if (this.Schema_thm_page()) {
stmt_select_by_fil_w.Crt_double(fld_time, gplx.xowa.files.Xof_lnki_time.Db_save_double(thm.Time()));
stmt_select_by_fil_w.Crt_int(fld_page, gplx.xowa.files.Xof_lnki_page.Db_save_int(thm.Page()));
}
else {
stmt_select_by_fil_w.Crt_int(fld_time, gplx.xowa.files.Xof_lnki_time.Db_save_int(thm.Time()));
}
rdr = stmt_select_by_fil_w.Exec_select_as_rdr();
return rdr.Move_next()
? Ctor_by_load(thm, rdr, this.Schema_thm_page())
? Ctor_by_load(thm, rdr, dir_id)
: false;
}
finally {rdr.Rls();}
}
public boolean Select_itm_by_fil_width2(int owner_id, Fsd_thm_itm thm) {
if (stmt_select_by_fil_w == null) stmt_select_by_fil_w = conn.Rls_reg(conn.Stmt_select(tbl_name, flds, fld_owner_id));
Db_rdr rdr = Db_rdr_.Null;
public boolean Select_itm_by_fil_width2(int dir_id, int fil_id, Fsd_thm_itm thm) {
if (stmt_select_by_fil_w == null) stmt_select_by_fil_w = conn.Stmt_select(tbl_name, flds, fld_owner_id);
ListAdp list = ListAdp_.new_();
Db_rdr rdr = stmt_select_by_fil_w.Clear().Crt_int(fld_owner_id, thm.Fil_id()).Exec_select__rls_manual();
try {
ListAdp list = ListAdp_.new_();
rdr = stmt_select_by_fil_w.Clear().Crt_int(fld_owner_id, thm.Owner_id()).Exec_select_as_rdr();
while (rdr.Move_next()) {
Fsd_thm_itm itm = Fsd_thm_itm.new_();
Ctor_by_load(itm, rdr, this.Schema_thm_page());
Ctor_by_load(itm, rdr, dir_id);
list.Add(itm);
}
return Match_nearest(list, thm, schema_thm_page);
}
finally {rdr.Rls();}
}
private boolean Ctor_by_load(Fsd_thm_itm itm, Db_rdr rdr, boolean schema_thm_page) {
int id = rdr.Read_int(fld_id);
int owner_id = rdr.Read_int(fld_owner_id);
int width = rdr.Read_int(fld_w);
int height = rdr.Read_int(fld_h);
private boolean Ctor_by_load(Fsd_thm_itm itm, Db_rdr rdr, int dir_id) {
int thm_id = rdr.Read_int(fld_id);
int fil_id = rdr.Read_int(fld_owner_id);
int w = rdr.Read_int(fld_w);
int h = rdr.Read_int(fld_h);
long size = rdr.Read_long(fld_size);
String modified = rdr.Read_str(fld_modified);
String hash = rdr.Read_str(fld_hash);
@@ -146,18 +115,18 @@ public class Fsd_thm_tbl {
double time = 0;
int page = 0;
if (schema_thm_page) {
time = gplx.xowa.files.Xof_lnki_time.Db_load_double(rdr, fld_time);
page = gplx.xowa.files.Xof_lnki_page.Db_load_int(rdr, fld_page);
time = Xof_lnki_time.Db_load_double(rdr, fld_time);
page = Xof_lnki_page.Db_load_int(rdr, fld_page);
}
else {
time = gplx.xowa.files.Xof_lnki_time.Db_load_int(rdr, fld_thumbtime);
page = gplx.xowa.files.Xof_lnki_page.Null;
time = Xof_lnki_time.Db_load_int(rdr, fld_time);
page = Xof_lnki_page.Null;
}
itm.Init_by_load(bin_db_id, id, owner_id, width, time, page, height, size, modified, hash);
itm.Ctor(mnt_id, dir_id, fil_id, thm_id, bin_db_id, w, h, time, page, size, modified, hash);
return true;
}
public static final DateAdp Modified_null = null;
public static final String Hash_null = "";
public static final String Hash_null = "", Modified_null_str = "";
public static boolean Match_nearest(ListAdp list, Fsd_thm_itm thm, boolean schema_thm_page) {
int len = list.Count(); if (len == 0) return Bool_.N;
list.SortBy(Fsdb_thm_itm_sorter.I);

View File

@@ -1,92 +0,0 @@
/*
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.fsdb.meta; import gplx.*; import gplx.fsdb.*;
import gplx.dbs.*; import gplx.dbs.engines.sqlite.*;
import gplx.fsdb.data.*;
public class Fsm_abc_mgr implements RlsAble {
private Db_conn conn;
public Fsm_atr_mgr Atr_mgr() {return atr_mgr;} private final Fsm_atr_mgr atr_mgr = new Fsm_atr_mgr();
public Fsm_bin_mgr Bin_mgr() {return bin_mgr;} private final Fsm_bin_mgr bin_mgr = new Fsm_bin_mgr();
public Fsm_cfg_mgr Cfg_mgr() {return cfg_mgr;} private final Fsm_cfg_mgr cfg_mgr = new Fsm_cfg_mgr();
public int Next_id() {return cfg_mgr.Next_id();}
private static final String Db_conn_bldr_type = "gplx.fsdb.abc";
public void Init_for_db(boolean schema_is_1, Io_url dir) {
Io_url abc_url = dir.GenSubFil("fsdb.abc.sqlite3");
Db_conn_bldr_data conn_data = Db_conn_bldr.I.Get_or_new(Db_conn_bldr_type, abc_url);
boolean created = conn_data.Created();
conn = conn_data.Conn();
atr_mgr.Init_for_db(conn, created, schema_is_1, dir, this);
bin_mgr.Init_for_db(conn, created, schema_is_1, dir);
cfg_mgr.Init_for_db(conn, created, schema_is_1);
if (created) {
this.Txn_save(); // immediately save new entries in atr,cfg
}
else {
if (!cfg_mgr.Patch_next_id()) Fsdb_db_abc_mgr_.Patch_next_id(this, dir);
}
}
public void Fil_insert(Fsd_fil_itm rv , byte[] dir, byte[] fil, int ext_id, DateAdp modified, String hash, long bin_len, gplx.ios.Io_stream_rdr bin_rdr) {
int bin_db_id = bin_mgr.Get_id_for_insert(bin_len);
int fil_id = atr_mgr.Fil_insert(rv, dir, fil, ext_id, modified, hash, bin_db_id, bin_len, bin_rdr);
bin_len = bin_mgr.Insert(bin_db_id, fil_id, Fsd_bin_tbl.Owner_tid_fil, bin_len, bin_rdr);
bin_mgr.Increment(bin_len);
}
public void Thm_insert(Fsd_thm_itm rv, byte[] dir, byte[] fil, int ext_id, int w, int h, double thumbtime, int page, DateAdp modified, String hash, long bin_len, gplx.ios.Io_stream_rdr bin_rdr) {
int bin_db_id = bin_mgr.Get_id_for_insert(bin_len);
int thm_id = atr_mgr.Thm_insert(rv, dir, fil, ext_id, w, h, thumbtime, page, modified, hash, bin_db_id, bin_len, bin_rdr);
bin_len = bin_mgr.Insert(bin_db_id, thm_id, Fsd_bin_tbl.Owner_tid_thm, bin_len, bin_rdr);
bin_mgr.Increment(bin_len);
}
public void Img_insert(Fsd_img_itm rv, byte[] dir, byte[] fil, int ext_id, DateAdp modified, String hash, long bin_len, gplx.ios.Io_stream_rdr bin_rdr, int img_w, int img_h) {
int bin_db_id = bin_mgr.Get_id_for_insert(bin_len);
rv.Db_bin_id_(bin_db_id);
int fil_id = atr_mgr.Img_insert(rv, String_.new_utf8_(dir), String_.new_utf8_(fil), ext_id, img_w, img_h, modified, hash, bin_db_id, bin_len, bin_rdr);
bin_len = bin_mgr.Insert(bin_db_id, fil_id, Fsd_bin_tbl.Owner_tid_fil, bin_len, bin_rdr);
bin_mgr.Increment(bin_len);
}
public boolean Thm_select_bin(byte[] dir, byte[] fil, Fsd_thm_itm thm) {
Fsd_fil_itm fil_itm = atr_mgr.Fil_select(dir, fil);
return atr_mgr.Thm_select(fil_itm.Id(), thm);
}
public Fsd_fil_itm Fil_select_bin(byte[] dir, byte[] fil, boolean is_thumb, int width, double thumbtime) {
return atr_mgr.Fil_select(dir, fil);
}
public void Txn_open() {
conn.Txn_mgr().Txn_bgn_if_none();
atr_mgr.Txn_open();
bin_mgr.Txn_open();
}
public void Txn_save() {atr_mgr.Txn_save(); bin_mgr.Txn_save(); cfg_mgr.Txn_save();}
public void Rls() {atr_mgr.Rls(); bin_mgr.Rls(); cfg_mgr.Rls(); conn.Conn_term();}
public static final String Cfg_tbl_v1 = "fsdb_cfg", Cfg_tbl_v2 = "file_meta_cfg";
}
class Fsdb_db_abc_mgr_ {
public static void Patch_next_id(Fsm_abc_mgr abc_mgr, Io_url dir) {
if (!String_.Eq(dir.NameOnly(), "fsdb.user")) return;
Fsm_atr_mgr atr_mgr = abc_mgr.Atr_mgr();
Fsm_cfg_mgr cfg_mgr = abc_mgr.Cfg_mgr();
int last_id = -1;
if (atr_mgr.Len() > 0) {
Fsm_atr_fil atr_fil = atr_mgr.Get_at(0);
int max_fil_id = Db_conn_.Select_fld0_as_int_or(atr_fil.Conn(), "SELECT Max(fil_id) AS MaxId FROM fsdb_fil;", -1);
int max_thm_id = Db_conn_.Select_fld0_as_int_or(atr_fil.Conn(), "SELECT Max(thm_id) AS MaxId FROM fsdb_xtn_thm;", -1);
last_id = max_fil_id > max_thm_id ? max_fil_id : max_thm_id;
}
cfg_mgr.Patch_next_id_exec(last_id);
}
}

View File

@@ -16,125 +16,94 @@ 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.fsdb.meta; import gplx.*; import gplx.fsdb.*;
import gplx.core.primitives.*; import gplx.cache.*;
import gplx.dbs.*; import gplx.dbs.engines.sqlite.*;
import gplx.fsdb.data.*;
public class Fsm_atr_fil implements RlsAble {
private Gfo_cache_mgr_bry dir_cache = new Gfo_cache_mgr_bry();
private final Fsd_dir_tbl tbl_dir = new Fsd_dir_tbl(); private final Fsd_fil_tbl tbl_fil = new Fsd_fil_tbl(); private Fsd_thm_tbl tbl_thm = new Fsd_thm_tbl();
private static final String Db_conn_bldr_type = "gplx.fsdb.fsm_atr_fil";
public Fsm_atr_fil(Fsm_abc_mgr abc_mgr, Io_url io_url) {
this.abc_mgr = abc_mgr;
Db_conn_bldr_data conn_data = Db_conn_bldr.I.Get_or_new(Db_conn_bldr_type, io_url);
boolean created = conn_data.Created(); conn = conn_data.Conn();
boolean schema_is_1 = Bool_.Y;
tbl_dir.Conn_(conn, created, schema_is_1);
tbl_fil.Conn_(conn, created, schema_is_1);
tbl_thm.Conn_(conn, created, schema_is_1, this);
import gplx.core.primitives.*; import gplx.cache.*; import gplx.ios.*;
import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; import gplx.fsdb.data.*;
public class Fsm_atr_fil {
private final Fsm_mnt_itm mnt_itm; private final int mnt_id;
private Fsd_dir_tbl tbl_dir; private Fsd_fil_tbl tbl_fil; private Fsd_thm_tbl tbl_thm;
private final Gfo_cache_mgr_bry dir_cache = new Gfo_cache_mgr_bry(); private Gfo_cache_mgr_bry fil_cache; private Bry_bfr fil_cache_key_bfr;
public Fsm_atr_fil(Fsm_mnt_itm mnt_itm, int id, String url_rel, Db_conn conn, boolean schema_is_1, boolean schema_thm_page) {
this.mnt_itm = mnt_itm; this.mnt_id = mnt_itm.Id();
this.id = id; this.url_rel = url_rel; this.conn = conn;
this.tbl_dir = new Fsd_dir_tbl(conn, schema_is_1);
this.tbl_fil = new Fsd_fil_tbl(conn, schema_is_1, mnt_id);
this.tbl_thm = new Fsd_thm_tbl(conn, schema_is_1, mnt_id, schema_thm_page);
}
public Fsm_abc_mgr Abc_mgr() {return abc_mgr;} private Fsm_abc_mgr abc_mgr;
public Db_conn Conn() {return conn;} private Db_conn conn;
public int Id() {return id;} private int id;
public Io_url Url() {return url;} private Io_url url;
public String Path_bgn() {return path_bgn;} private String path_bgn;
public byte Cmd_mode() {return cmd_mode;} public Fsm_atr_fil Cmd_mode_(byte v) {cmd_mode = v; return this;} private byte cmd_mode;
public void Ctor_by_load(int id, Io_url url, String path_bgn, byte cmd_mode) {
this.id = id;
this.url = url;
this.path_bgn = path_bgn;
this.cmd_mode = cmd_mode;
public int Id() {return id;} private final int id;
public String Url_rel() {return url_rel;} private final String url_rel;
public Db_conn Conn() {return conn;} private final Db_conn conn;
public Fsd_fil_itm Select_fil_or_null(byte[] dir, byte[] fil) {
int dir_id = Get_dir_id_or_neg1(dir);
return dir_id == Int_.Neg1 ? Fsd_fil_itm.Null : tbl_fil.Select_or_null(dir_id, fil);
}
public void Rls() {
conn.Txn_mgr().Txn_end_all();
conn.Conn_term();
}
public void Txn_open() {
conn.Txn_mgr().Txn_bgn_if_none();
}
public void Txn_save() {
conn.Txn_mgr().Txn_end_all();
}
public Fsd_fil_itm Fil_select(byte[] dir, byte[] fil) {
Int_obj_ref dir_id_obj = (Int_obj_ref)dir_cache.Get_or_null(dir);
int dir_id = -1;
if (dir_id_obj == null) {
Fsd_dir_itm dir_itm = tbl_dir.Select_itm(String_.new_utf8_(dir));
dir_id = dir_itm == Fsd_dir_itm.Null ? -1 : dir_itm.Id();
dir_cache.Add(dir, Int_obj_ref.new_(dir_id));
}
else
dir_id = dir_id_obj.Val();
if (dir_id == Int_.Neg1) return Fsd_fil_itm.Null;
return tbl_fil.Select_itm_by_name(dir_id, String_.new_utf8_(fil));
}
public boolean Thm_select(int owner_id, Fsd_thm_itm thm) {
return tbl_thm.Select_itm_by_fil_width(owner_id, thm);
}
public int Fil_insert(Fsd_fil_itm rv, String dir, String fil, int ext_id, DateAdp modified, String hash, int bin_db_id, long bin_len, gplx.ios.Io_stream_rdr bin_rdr) {
int dir_id = Dir_id__get_or_insert(dir);
int fil_id = Fil_id__get_or_insert(Xtn_tid_none, dir_id, fil, ext_id, modified, hash, bin_db_id, bin_len);
rv.Init_for_insert(bin_db_id, dir_id, fil_id);
public boolean Select_thm(Fsd_thm_itm rv, int dir_id, int fil_id) {return tbl_thm.Select_itm_by_fil_width(dir_id, fil_id, rv);}
public int Insert_fil(Fsd_fil_itm rv, byte[] dir, byte[] fil, int ext_id, int bin_db_id, long bin_len, Io_stream_rdr bin_rdr) {
int dir_id = Get_dir_id_or_make(dir);
int fil_id = Get_fil_id_or_make(Tid_none, dir_id, fil, ext_id, bin_db_id, bin_len);
rv.Ctor(mnt_id, fil_id, dir_id, bin_db_id, fil, ext_id);
return fil_id;
}
public int Img_insert(Fsd_img_itm rv, String dir, String fil, int ext_id, int img_w, int img_h, DateAdp modified, String hash, int bin_db_id, long bin_len, gplx.ios.Io_stream_rdr bin_rdr) {
int dir_id = Dir_id__get_or_insert(dir);
int fil_id = Fil_id__get_or_insert(Xtn_tid_img, dir_id, fil, ext_id, modified, hash, bin_db_id, bin_len);
rv.Id_(fil_id);
public int Insert_img(Fsd_img_itm rv, byte[] dir, byte[] fil, int ext_id, int img_w, int img_h, int bin_db_id, long bin_len, Io_stream_rdr bin_rdr) {
int dir_id = Get_dir_id_or_make(dir);
int fil_id = Get_fil_id_or_make(Tid_img, dir_id, fil, ext_id, bin_db_id, bin_len);
rv.Ctor(mnt_id, dir_id, fil_id, bin_db_id);
return fil_id;
}
public int Thm_insert(Fsd_thm_itm rv, String dir, String fil, int ext_id, int thm_w, int thm_h, double thumbtime, int page, DateAdp modified, String hash, int bin_db_id, long bin_len, gplx.ios.Io_stream_rdr bin_rdr) {
int dir_id = Dir_id__get_or_insert(dir);
int fil_id = Fil_id__get_or_insert(Xtn_tid_thm, dir_id, fil, ext_id, modified, hash, Fsd_bin_tbl.Null_db_bin_id, Fsd_bin_tbl.Null_size); // NOTE: bin_db_id must be set to NULL
int thm_id = abc_mgr.Next_id();
tbl_thm.Insert(thm_id, fil_id, thm_w, thm_h, thumbtime, page, bin_db_id, bin_len, modified, hash);
rv.Init_by_insert(bin_db_id, dir_id, fil_id, thm_id);
public int Insert_thm(Fsd_thm_itm rv, byte[] dir, byte[] fil, int ext_id, int w, int h, double time, int page, int bin_db_id, long bin_len, Io_stream_rdr bin_rdr) {
int dir_id = Get_dir_id_or_make(dir);
int fil_id = Get_fil_id_or_make(Tid_thm, dir_id, fil, ext_id, Fsd_bin_tbl.Bin_db_id_null, Fsd_bin_tbl.Size_null); // NOTE: bin_db_id must be set to NULL
int thm_id = mnt_itm.Next_id();
tbl_thm.Insert(thm_id, fil_id, w, h, time, page, bin_db_id, bin_len);
rv.Ctor(mnt_id, dir_id, fil_id, thm_id, bin_db_id, w, h, time, page, bin_len, Fsd_thm_tbl.Modified_null_str, Fsd_thm_tbl.Hash_null);
return thm_id;
}
public static Fsm_atr_fil make_(Fsm_abc_mgr abc_mgr, int id, Io_url url, String path_bgn) {
Fsm_atr_fil rv = new Fsm_atr_fil(abc_mgr, url);
rv.id = id;
rv.url = url;
rv.path_bgn = path_bgn;
rv.cmd_mode = Db_cmd_mode.Tid_create;
return rv;
public void Fil_cache_enabled_y_() {
fil_cache = new Gfo_cache_mgr_bry();
fil_cache_key_bfr = Bry_bfr.reset_(255);
tbl_fil.Select_all(fil_cache_key_bfr, fil_cache);
}
private int Dir_id__get_or_insert(String dir_str) {
byte[] dir_bry = Bry_.new_utf8_(dir_str);
private int Get_dir_id_or_neg1(byte[] dir_bry) {
Object rv_obj = dir_cache.Get_or_null(dir_bry);
int rv = -1;
if (rv_obj != null) { // item found
rv = ((Int_obj_ref)rv_obj).Val();
if (rv == -1) // dir was previously -1; occurs when doing select on empty db (no dir, so -1 added) and then doing insert (-1 now needs to be dropped)
dir_cache.Del(dir_bry);
if (rv_obj == null) { // not in mem
Fsd_dir_itm itm = tbl_dir.Select_or_null(dir_bry); // try db
if (itm == Fsd_dir_itm.Null) return -1; // not in db
int dir_id = itm.Dir_id();
dir_cache.Add(dir_bry, Int_obj_ref.new_(dir_id)); // add to mem
return dir_id;
}
else
return ((Int_obj_ref)rv_obj).Val();
}
private int Get_dir_id_or_make(byte[] dir_bry) {
int rv = Get_dir_id_or_neg1(dir_bry);
if (rv == -1) {
Fsd_dir_itm itm = tbl_dir.Select_itm(dir_str);
if (itm == Fsd_dir_itm.Null) {
rv = abc_mgr.Next_id();
tbl_dir.Insert(rv, dir_str, 0); // 0: always assume root owner
}
else {
rv = itm.Id();
}
rv = mnt_itm.Next_id();
tbl_dir.Insert(rv, dir_bry, Fsd_dir_itm.Owner_root);
dir_cache.Add(dir_bry, Int_obj_ref.new_(rv));
}
return rv;
}
private int Fil_id__get_or_insert(int xtn_tid, int dir_id, String fil, int ext_id, DateAdp modified, String hash, int bin_db_id, long bin_len) {
Fsd_fil_itm fil_itm = tbl_fil.Select_itm_by_name(dir_id, fil);
int fil_id = fil_itm.Id();
if (fil_id == Fsd_fil_itm.Null_id) { // new item
fil_id = abc_mgr.Next_id();
tbl_fil.Insert(fil_id, dir_id, fil, xtn_tid, ext_id, bin_len, modified, hash, bin_db_id);
private int Get_fil_id_or_make(int xtn_tid, int dir_id, byte[] fil, int ext_id, int bin_db_id, long bin_len) {
if (fil_cache != null) {
byte[] cache_key = Fsd_fil_itm.Gen_cache_key(fil_cache_key_bfr, dir_id, fil);
Object cache_obj = fil_cache.Get_or_null(cache_key);
if (cache_obj != null) return ((Fsd_fil_itm)cache_obj).Fil_id();
}
else { // existing item
if ( fil_itm.Db_bin_id() == Fsd_bin_tbl.Null_db_bin_id // prv row was previously inserted by thumb
&& xtn_tid != Xtn_tid_thm // cur row is not thumb
Fsd_fil_itm fil_itm = tbl_fil.Select_or_null(dir_id, fil);
int fil_id = -1;
if (fil_itm == Fsd_fil_itm.Null) { // new item
fil_id = mnt_itm.Next_id();
tbl_fil.Insert(fil_id, dir_id, fil, xtn_tid, ext_id, bin_len, bin_db_id);
}
else { // existing item
fil_id = fil_itm.Fil_id();
if ( fil_itm.Bin_db_id() == Fsd_bin_tbl.Bin_db_id_null // prv row was previously inserted by thumb
&& xtn_tid != Tid_thm // cur row is not thumb
) {
tbl_fil.Update(fil_id, dir_id, fil, xtn_tid, ext_id, bin_len, modified, hash, bin_db_id); // update props; note that thumb inserts null props, whereas file will insert real props (EX: bin_db_id)
tbl_fil.Update(fil_id, dir_id, fil, xtn_tid, ext_id, bin_len, bin_db_id); // update props; note that thumb inserts null props, whereas file will insert real props (EX: bin_db_id)
}
}
return fil_id;
}
private static final int Xtn_tid_none = 0, Xtn_tid_thm = 1, Xtn_tid_img = 2;
private static final int Tid_none = 0, Tid_thm = 1, Tid_img = 2;
}

View File

@@ -16,61 +16,19 @@ 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.fsdb.meta; import gplx.*; import gplx.fsdb.*;
import gplx.dbs.*; import gplx.cache.*;
import gplx.fsdb.data.*;
public class Fsm_atr_mgr implements RlsAble {
private Fsm_atr_tbl tbl = new Fsm_atr_tbl();
private Fsm_atr_fil[] itms; private Fsm_atr_fil itms_0;
public int Len() {return itms.length;}
public Fsm_atr_fil Get_at(int i) {return i == Id_0 ? itms_0 : itms[i];}
public Fsd_fil_itm Fil_select(byte[] dir, byte[] fil) {return itms_0.Fil_select(dir, fil);}
public boolean Thm_select(int owner_id, Fsd_thm_itm thm) {return itms_0.Thm_select(owner_id, thm);}
public int Fil_insert(Fsd_fil_itm rv , byte[] dir, byte[] fil, int ext_id, DateAdp modified, String hash, int bin_db_id, long bin_len, gplx.ios.Io_stream_rdr bin_rdr) {
return itms_0.Fil_insert(rv, String_.new_utf8_(dir), String_.new_utf8_(fil), ext_id, modified, hash, bin_db_id, bin_len, bin_rdr);
import gplx.dbs.*; import gplx.fsdb.data.*;
public class Fsm_atr_mgr {
private Fsdb_db_mgr core_mgr; private Fsm_atr_tbl tbl; private Fsm_atr_fil db__core; private Fsm_mnt_itm mnt_itm;
public Fsm_atr_mgr(Fsdb_db_mgr core_mgr, Db_conn conn, Fsm_mnt_itm mnt_itm) {
this.core_mgr = core_mgr; this.mnt_itm = mnt_itm;
this.tbl = new Fsm_atr_tbl(conn, core_mgr.File__schema_is_1());
}
public int Img_insert(Fsd_img_itm rv, String dir, String fil, int ext_id, int img_w, int img_h, DateAdp modified, String hash, int bin_db_id, long bin_len, gplx.ios.Io_stream_rdr bin_rdr) {
return itms_0.Img_insert(rv, dir, fil, ext_id, img_w, img_h, modified, hash, bin_db_id, bin_len, bin_rdr);
public void Ctor_by_load(boolean schema_thm_page) {
this.db__core = tbl.Select_1st_or_fail(mnt_itm, core_mgr, mnt_itm.Id(), schema_thm_page);
}
public int Thm_insert(Fsd_thm_itm rv, byte[] dir, byte[] fil, int ext_id, int width, int height, double thumbtime, int page, DateAdp modified, String hash, int bin_db_id, long bin_len, gplx.ios.Io_stream_rdr bin_rdr) {
return itms_0.Thm_insert(rv, String_.new_utf8_(dir), String_.new_utf8_(fil), ext_id, width, height, thumbtime, page, modified, hash, bin_db_id, bin_len, bin_rdr);
}
public void Txn_open() {
int len = itms.length;
for (int i = 0; i < len; i++) {
Fsm_atr_fil itm = itms[i];
itm.Txn_open();
}
}
public void Txn_save() {
tbl.Commit_all(itms);
int len = itms.length;
for (int i = 0; i < len; i++) {
Fsm_atr_fil itm = itms[i];
itm.Txn_save();
}
}
public void Rls() {
int len = itms.length;
for (int i = 0; i < len; i++) {
Fsm_atr_fil itm = itms[i];
itm.Rls();
}
}
public void Init_for_db(Db_conn conn, boolean created, boolean schema_is_1, Io_url dir, Fsm_abc_mgr abc_mgr) {
tbl.Conn_(conn, created, schema_is_1);
if (created) {
Fsm_atr_fil itm = Fsm_atr_fil.make_(abc_mgr, Id_0, url_(dir, Id_0), Path_bgn_0);
this.itms = new Fsm_atr_fil[] {itm};
this.itms_0 = itm;
}
else {
this.itms = tbl.Select_all(abc_mgr, dir);
this.itms_0 = this.itms[0];
}
}
private static Io_url url_(Io_url dir, int id) {
return dir.GenSubFil_ary("fsdb.atr.", Int_.Xto_str_pad_bgn(id, 2), ".sqlite3");
}
public static final int Id_0 = 0;
public static final String Path_bgn_0 = "";
public Fsm_atr_fil Db__core() {return db__core;}
public Fsd_fil_itm Select_fil_or_null(byte[] dir, byte[] fil) {return db__core.Select_fil_or_null(dir, fil);}
public boolean Select_thm(Fsd_thm_itm rv, int dir_id, int fil_id) {return db__core.Select_thm(rv, dir_id, fil_id);}
public void Txn_bgn() {db__core.Conn().Txn_bgn();}
public void Txn_end() {db__core.Conn().Txn_end();}
}

View File

@@ -18,62 +18,38 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.fsdb.meta; import gplx.*; import gplx.fsdb.*;
import gplx.dbs.*; import gplx.dbs.qrys.*;
public class Fsm_atr_tbl {
private String tbl_name = "file_meta_atr"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_();
private String fld_uid, fld_url, fld_path_bgn;
private Db_conn conn; private final Db_stmt_bldr stmt_bldr = new Db_stmt_bldr();
public void Conn_(Db_conn new_conn, boolean created, boolean schema_is_1) {
this.conn = new_conn; flds.Clear();
if (schema_is_1) {
tbl_name = "fsdb_db_atr";
}
fld_uid = flds.Add_int("uid");
fld_url = flds.Add_str("url", 255);
fld_path_bgn = flds.Add_str("path_bgn", 255);
if (created) {
Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds
, Db_meta_idx.new_unique_by_tbl(tbl_name, "pkey", fld_uid)
);
conn.Exec_create_tbl_and_idx(meta);
}
stmt_bldr.Conn_(conn, tbl_name, flds, fld_uid);
private final String tbl_name; private final Db_meta_fld_list flds = Db_meta_fld_list.new_();
private final String fld_uid, fld_url;
private final Db_conn conn;
public Fsm_atr_tbl(Db_conn conn, boolean schema_is_1) {
this.conn = conn;
String fld_prefix = "";
if (schema_is_1) {tbl_name = "fsdb_db_atr";}
else {tbl_name = "fsdb_dba"; fld_prefix = "dba_";}
this.fld_uid = flds.Add_int_pkey (fld_prefix + "uid");
this.fld_url = flds.Add_str (fld_prefix + "url", 255);
}
public Fsm_atr_fil[] Select_all(Fsm_abc_mgr abc_mgr, Io_url dir) {
ListAdp rv = ListAdp_.new_();
Db_rdr rdr = Db_rdr_.Null;
public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds));}
public Fsm_atr_fil Select_1st_or_fail(Fsm_mnt_itm mnt_itm, Fsdb_db_mgr core_mgr, int mnt_id, boolean schema_thm_page) {
Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empy).Exec_select__rls_auto();
boolean schema_is_1 = core_mgr.File__schema_is_1();
try {
rdr = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empy).Exec_select_as_rdr();
while (rdr.Move_next()) {
Io_url url = dir.GenSubFil(rdr.Read_str(fld_url));
Fsm_atr_fil itm = new Fsm_atr_fil(abc_mgr, url);
itm.Ctor_by_load
( rdr.Read_int(fld_uid)
, url
, rdr.Read_str(fld_path_bgn)
, Db_cmd_mode.Tid_ignore
if (rdr.Move_next()) {
String url_rel = rdr.Read_str(fld_url);
return new Fsm_atr_fil
( mnt_itm
, rdr.Read_int(fld_uid)
, url_rel
, core_mgr.File__atr_file__at(mnt_id).Conn()
, schema_is_1
, schema_thm_page
);
rv.Add(itm);
}
}
finally {rdr.Rls();}
return (Fsm_atr_fil[])rv.Xto_ary(Fsm_atr_fil.class);
throw Err_.new_("missing atr db; conn_info={0}", conn.Conn_info().Xto_api());
}
public void Commit_all(Fsm_atr_fil[] ary) {
stmt_bldr.Batch_bgn();
try {
int len = ary.length;
for (int i = 0; i < len; i++)
Commit_itm(ary[i]);
} finally {stmt_bldr.Batch_end();}
}
private void Commit_itm(Fsm_atr_fil itm) {
Db_stmt stmt = stmt_bldr.Get(itm.Cmd_mode());
switch (itm.Cmd_mode()) {
case Db_cmd_mode.Tid_create: stmt.Clear().Val_int(fld_uid, itm.Id()) .Val_str(fld_url, itm.Url().NameAndExt()).Val_str(fld_path_bgn, itm.Path_bgn()).Exec_insert(); break;
case Db_cmd_mode.Tid_update: stmt.Clear() .Val_str(fld_url, itm.Url().NameAndExt()).Val_str(fld_path_bgn, itm.Path_bgn()).Crt_int(fld_uid, itm.Id()).Exec_update(); break;
case Db_cmd_mode.Tid_delete: stmt.Clear().Crt_int(fld_uid, itm.Id()).Exec_delete(); break;
case Db_cmd_mode.Tid_ignore: break;
default: throw Err_.unhandled(itm.Cmd_mode());
}
itm.Cmd_mode_(Db_cmd_mode.Tid_ignore);
public void Insert(int id, String url_rel) {
conn.Stmt_insert(tbl_name, flds).Val_int(fld_uid, id).Val_str(fld_url, url_rel).Exec_insert();
}
}

View File

@@ -16,43 +16,24 @@ 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.fsdb.meta; import gplx.*; import gplx.fsdb.*;
import gplx.ios.*; import gplx.dbs.*; import gplx.dbs.engines.sqlite.*;
import gplx.ios.*; import gplx.dbs.*;
import gplx.fsdb.data.*;
public class Fsm_bin_fil implements RlsAble {
public Fsm_bin_fil(int id, Io_url url, long bin_len, long bin_max, byte cmd_mode) {
this.id = id; this.url = url; this.bin_len = bin_len; this.bin_max = bin_max; this.cmd_mode = cmd_mode;
public class Fsm_bin_fil {
private final Fsd_bin_tbl tbl;
public Fsm_bin_fil(int id, String url_rel, long bin_len, Db_conn conn, boolean schema_is_1) {
this.id = id; this.url_rel = url_rel; this.bin_len = bin_len; this.conn = conn;
this.tbl = new Fsd_bin_tbl(conn, schema_is_1);
}
public int Id() {return id;} private final int id;
public Io_url Url() {return url;} private final Io_url url;
public long Bin_max() {return bin_max;} private long bin_max;
public void Bin_max_(long v) {
bin_max = v;
if (cmd_mode == Db_cmd_mode.Tid_ignore) cmd_mode = Db_cmd_mode.Tid_update;
public int Id() {return id;} private final int id;
public String Url_rel() {return url_rel;} private final String url_rel;
public long Bin_len() {return bin_len;} private void Bin_len_(long v) {bin_len = v;} private long bin_len;
public Db_conn Conn() {return conn;} private final Db_conn conn;
public boolean Select_to_url(int id, Io_url url) {return tbl.Select_to_url(id, url);}
public Io_stream_rdr Select_as_rdr(int id) {return tbl.Select_as_rdr(id);}
public void Insert(int bin_id, byte owner_tid, long rdr_len, gplx.ios.Io_stream_rdr rdr) {
tbl.Insert_rdr(bin_id, owner_tid, rdr_len, rdr);
Bin_len_(bin_len + rdr_len);
}
public long Bin_len() {return bin_len;} private long bin_len;
public void Bin_len_(long v) {
bin_len = v;
if (cmd_mode == Db_cmd_mode.Tid_ignore) cmd_mode = Db_cmd_mode.Tid_update;
}
public byte Cmd_mode() {return cmd_mode;} public Fsm_bin_fil Cmd_mode_(byte v) {cmd_mode = v; return this;} private byte cmd_mode;
public static final Fsm_bin_fil[] Ary_empty = new Fsm_bin_fil[0];
private Fsd_bin_tbl bin_tbl = new Fsd_bin_tbl(); private Db_conn conn;
public static Fsm_bin_fil make_(int id, Io_url url, long bin_len, long bin_max) {
Fsm_bin_fil rv = new Fsm_bin_fil(id, url, bin_len, bin_max, Db_cmd_mode.Tid_create);
rv.Conn(); // force table create
return rv;
}
private static final String Db_conn_bldr_type = "gplx.fsdb.fsm_bin";
public Db_conn Conn() {
if (conn == null) {
Db_conn_bldr_data conn_data = Db_conn_bldr.I.Get_or_new(Db_conn_bldr_type, url);
conn = conn_data.Conn();
bin_tbl.Conn_(conn, conn_data.Created(), Bool_.Y);
}
return conn;
}
public long Insert(int bin_id, byte owner_tid, long bin_len, gplx.ios.Io_stream_rdr bin_rdr) {this.Conn(); return bin_tbl.Insert_rdr(bin_id, owner_tid, bin_len, bin_rdr);}
public boolean Get_to_url(int id, Io_url url) {this.Conn(); return bin_tbl.Select_to_url(id, url);}
public Io_stream_rdr Get_as_rdr(int id) {return bin_tbl.Select_as_rdr(this.Conn(), id);}
public void Rls() {if (conn != null) conn.Conn_term();}
public static final long Bin_len_null = 0;
}

View File

@@ -16,79 +16,44 @@ 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.fsdb.meta; import gplx.*; import gplx.fsdb.*;
import gplx.dbs.*;
public class Fsm_bin_mgr implements RlsAble {
private Io_url dir;
private final Fsm_bin_tbl tbl = new Fsm_bin_tbl();
private Fsm_bin_fil[] fil_ary = Fsm_bin_fil.Ary_empty; private int fil_ary_len = 0;
private Fsm_bin_fil fil_cur;
public int Len() {return fil_ary.length;}
public long Db_bin_max() {return db_bin_max;}
public int Insert_to_bin() {return insert_to_bin;} public Fsm_bin_mgr Insert_to_bin_(int v) {insert_to_bin = v; return this;} private int insert_to_bin = Fsm_mnt_mgr.Insert_to_bin_null;
public Fsm_bin_mgr Db_bin_max_(long v) {
db_bin_max = v;
for (int i = 0; i < fil_ary_len; i++)
fil_ary[i].Bin_max_(v);
return this;
} private long db_bin_max = Io_mgr.Len_mb * Long_.Xby_int(188);
public Fsm_bin_fil Get_at(int i) {return fil_ary[i];}
private Fsm_bin_fil Get_cur() {return fil_ary_len == 0 ? null : fil_ary[fil_ary_len - 1];}
public void Txn_open() {
Get_cur().Conn().Txn_mgr().Txn_bgn_if_none();
import gplx.ios.*; import gplx.dbs.*;
public class Fsm_bin_mgr {
private final Fsdb_db_mgr core_mgr; private final int mnt_id; private final Fsm_bin_tbl tbl;
private Fsm_bin_fil[] dbs__ary = Fsm_bin_fil.Ary_empty; private int dbs__ary_len = 0; private Fsm_bin_fil nth_db;
public Fsm_bin_mgr(Fsdb_db_mgr core_mgr, Db_conn conn, int mnt_id) {
this.core_mgr = core_mgr; this.mnt_id = mnt_id;
this.tbl = new Fsm_bin_tbl(conn, core_mgr.File__schema_is_1(), mnt_id);
}
public void Txn_save() {
tbl.Commit_all(fil_ary);
Get_cur().Conn().Txn_mgr().Txn_end_all();
public void Ctor_by_load() {
this.dbs__ary = tbl.Select_all(core_mgr);
this.dbs__ary_len = dbs__ary.length;
if (dbs__ary_len > 0) this.nth_db = dbs__ary[dbs__ary_len - 1];
}
public void Rls() {
int len = fil_ary.length;
for (int i = 0; i < len; i++) {
Fsm_bin_fil itm = fil_ary[i];
itm.Rls();
}
public Fsm_bin_fil Dbs__get_nth() {return nth_db;}
public Fsm_bin_fil Dbs__get_at(int i) {return dbs__ary[i];}
public Fsm_bin_fil Dbs__make(String file_name) {
Fsdb_db_file db = core_mgr.File__bin_file__new(mnt_id, file_name);
Fsm_bin_fil rv = new Fsm_bin_fil(dbs__ary_len, db.Url().NameAndExt(), Fsm_bin_fil.Bin_len_null, db.Conn(), core_mgr.File__schema_is_1());
tbl.Insert(rv.Id(), rv.Url_rel());
Dbs__add(rv);
return rv;
}
public int Get_id_for_insert(long bin_len) {
if (insert_to_bin != Fsm_mnt_mgr.Insert_to_bin_null) return insert_to_bin; // insert_to_bin specified; return it
if (fil_cur.Bin_len() > fil_cur.Bin_max())
Itms_add(0);
return fil_cur.Id();
public void Insert(int db_id, int bin_id, byte owner_tid, long bin_len, Io_stream_rdr bin_rdr) {
Fsm_bin_fil fil = dbs__ary[db_id];
fil.Insert(bin_id, owner_tid, bin_len, bin_rdr);
dbs__ary[db_id].Insert(bin_id, owner_tid, bin_len, bin_rdr);
}
public void Increment(long bin_len) {
long new_bin_len = fil_cur.Bin_len() + bin_len;
fil_cur.Bin_len_(new_bin_len);
public void Txn_bgn() {
for (int i = 0; i < dbs__ary_len; ++i)
dbs__ary[i].Conn().Txn_bgn();
}
public long Insert(int db_id, int bin_id, byte owner_tid, long bin_len, gplx.ios.Io_stream_rdr bin_rdr) {
Fsm_bin_fil bin_fil = fil_ary[db_id];
return bin_fil.Insert(bin_id, owner_tid, bin_len, bin_rdr);
public void Txn_end() {
for (int i = 0; i < dbs__ary_len; ++i)
dbs__ary[i].Conn().Txn_end();
}
public void Init_for_db(Db_conn conn, boolean created, boolean schema_is_1, Io_url dir) {
this.dir = dir;
tbl.Conn_(conn, created, schema_is_1);
if (created)
this.Itms_add(0);
else {
fil_ary = tbl.Select_all(dir);
fil_ary_len = this.fil_ary.length;
fil_cur = this.fil_ary[fil_ary_len - 1];
}
}
private void Itms_add(long bin_len) {
Fsm_bin_fil cur = Get_cur();
if (cur != null) {
cur.Conn().Txn_mgr().Txn_end_all();
cur.Conn().Conn_term();
}
int new_itms_len = fil_ary_len + 1;
Fsm_bin_fil[] new_itms = new Fsm_bin_fil[new_itms_len];
for (int i = 0; i < fil_ary_len; i++)
new_itms[i] = fil_ary[i];
fil_cur = Fsm_bin_fil.make_(fil_ary_len, url_(dir, fil_ary_len), bin_len, db_bin_max);
fil_ary = new_itms;
fil_ary_len = new_itms_len;
fil_ary[fil_ary_len - 1] = fil_cur;
this.Txn_open();
}
private static Io_url url_(Io_url dir, int id) {
return dir.GenSubFil_ary("fsdb.bin.", Int_.Xto_str_pad_bgn(id, 4), ".sqlite3");
private void Dbs__add(Fsm_bin_fil fil) {
this.dbs__ary = (Fsm_bin_fil[])Array_.Resize(dbs__ary, dbs__ary_len + 1);
this.dbs__ary[dbs__ary_len++] = fil;
this.nth_db = fil;
}
}

View File

@@ -18,62 +18,33 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.fsdb.meta; import gplx.*; import gplx.fsdb.*;
import gplx.dbs.*; import gplx.dbs.qrys.*;
public class Fsm_bin_tbl {
private String tbl_name = "file_meta_bin"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_();
private String fld_uid, fld_url, fld_bin_len, fld_bin_max;
private Db_conn conn; private final Db_stmt_bldr stmt_bldr = new Db_stmt_bldr();
public void Conn_(Db_conn new_conn, boolean created, boolean schema_is_1) {
this.conn = new_conn; flds.Clear();
if (schema_is_1) {
tbl_name = "fsdb_db_bin";
}
fld_uid = flds.Add_int("uid");
fld_url = flds.Add_str("url", 255);
fld_bin_len = flds.Add_long("bin_len");
fld_bin_max = flds.Add_long("bin_max");
if (created) {
Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds
, Db_meta_idx.new_unique_by_tbl(tbl_name, "pkey", fld_uid)
);
conn.Exec_create_tbl_and_idx(meta);
}
stmt_bldr.Conn_(conn, tbl_name, flds, fld_uid);
private final String tbl_name; private final Db_meta_fld_list flds = Db_meta_fld_list.new_();
private final String fld_uid, fld_url;
private final Db_conn conn; private int mnt_id;
public Fsm_bin_tbl(Db_conn conn, boolean schema_is_1, int mnt_id) {
this.conn = conn; this.mnt_id = mnt_id;
String fld_prefix = "";
if (schema_is_1) {tbl_name = "fsdb_db_bin";}
else {tbl_name = "fsdb_dbb"; fld_prefix = "dbb_";}
fld_uid = flds.Add_int_pkey (fld_prefix + "uid");
fld_url = flds.Add_str (fld_prefix + "url", 255);
}
public Fsm_bin_fil[] Select_all(Io_url dir) {
public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds));}
public void Insert(int id, String url_rel) {
conn.Stmt_insert(tbl_name, flds).Crt_int(fld_uid, id).Val_str(fld_url, url_rel).Exec_insert();
}
public Fsm_bin_fil[] Select_all(Fsdb_db_mgr db_conn_mgr) {
ListAdp rv = ListAdp_.new_();
Db_qry qry = Db_qry__select_cmd.new_().From_(tbl_name).Cols_all_().Where_(Db_crt_.eq_many_(Db_meta_fld.Ary_empy)).OrderBy_asc_(fld_uid);
Db_rdr rdr = Db_rdr_.Null;
Db_rdr rdr = conn.Stmt_select_order(tbl_name, flds, Db_meta_fld.Ary_empy, fld_uid).Clear().Exec_select__rls_auto();
try {
rdr = conn.Stmt_new(qry).Clear().Exec_select_as_rdr();
while (rdr.Move_next()) {
Fsm_bin_fil itm = new Fsm_bin_fil
( rdr.Read_int(fld_uid)
, dir.GenSubFil(rdr.Read_str(fld_url))
, rdr.Read_long(fld_bin_len)
, rdr.Read_long(fld_bin_max)
, Db_cmd_mode.Tid_ignore
);
int bin_id = rdr.Read_int(fld_uid);
String bin_url = rdr.Read_str(fld_url);
Fsdb_db_file bin_db = db_conn_mgr.File__bin_file__at(mnt_id, bin_id, bin_url);
Fsm_bin_fil itm = new Fsm_bin_fil(bin_id, bin_url, Fsm_bin_fil.Bin_len_null, bin_db.Conn(), db_conn_mgr.File__schema_is_1());
rv.Add(itm);
}
} finally {rdr.Rls();}
} finally {rdr.Rls();}
return (Fsm_bin_fil[])rv.Xto_ary(Fsm_bin_fil.class);
}
public void Commit_all(Fsm_bin_fil[] ary) {
stmt_bldr.Batch_bgn();
try {
int len = ary.length;
for (int i = 0; i < len; i++)
Commit_itm(ary[i]);
} finally {stmt_bldr.Batch_end();}
}
private void Commit_itm(Fsm_bin_fil itm) {
Db_stmt stmt = stmt_bldr.Get(itm.Cmd_mode());
switch (itm.Cmd_mode()) {
case Db_cmd_mode.Tid_create: stmt.Clear().Crt_int(fld_uid, itm.Id()) .Val_str(fld_url, itm.Url().NameAndExt()).Val_long(fld_bin_len, itm.Bin_len()).Val_long(fld_bin_max, itm.Bin_max()).Exec_insert(); break;
case Db_cmd_mode.Tid_update: stmt.Clear() .Val_str(fld_url, itm.Url().NameAndExt()).Val_long(fld_bin_len, itm.Bin_len()).Val_long(fld_bin_max, itm.Bin_max()).Crt_int(fld_uid, itm.Id()).Exec_update(); break;
case Db_cmd_mode.Tid_delete: stmt.Clear().Crt_int(fld_uid, itm.Id()).Exec_delete(); break;
case Db_cmd_mode.Tid_ignore: break;
default: throw Err_.unhandled(itm.Cmd_mode());
}
itm.Cmd_mode_(Db_cmd_mode.Tid_ignore);
}
}

View File

@@ -16,62 +16,35 @@ 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.fsdb.meta; import gplx.*; import gplx.fsdb.*;
import gplx.dbs.*; import gplx.dbs.cfgs.*; import gplx.xowa.*;
import gplx.fsdb.meta.*;
import gplx.dbs.*; import gplx.dbs.cfgs.*; import gplx.fsdb.meta.*;
public class Fsm_cfg_mgr {
private final Db_cfg_tbl cfg_tbl = new Db_cfg_tbl();
private final HashAdp grps = HashAdp_.new_();
private final Db_cfg_tbl tbl; private final HashAdp grp_hash = HashAdp_.new_();
public Fsm_cfg_mgr(Fsdb_db_mgr db_conn_mgr, Db_conn conn) {
this.tbl = new Db_cfg_tbl(conn, db_conn_mgr.File__cfg_tbl_name());
}
public void Ctor_by_load() {
Db_cfg_hash hash = Grps_get_or_load(Grp_core);
this.next_id = hash.Get(Key_next_id).To_int_or(-1); if (next_id == -1) throw Err_.new_("next_id not found in cfg");
this.schema_thm_page = hash.Get(Key_schema_thm_page).To_yn_or_n();
this.patch_next_id = hash.Get(Key_patch_next_id).To_yn_or_n();
}
public Db_cfg_tbl Tbl() {return tbl;}
public int Next_id() {return next_id++;} private int next_id = 1;
public void Next_id_commit() {tbl.Update_int("core", "next_id", next_id);}
public boolean Schema_thm_page() {return schema_thm_page;} private boolean schema_thm_page = true;
public boolean Patch_next_id() {return patch_next_id;} private boolean patch_next_id = true;
public void Patch_next_id_exec(int last_id) {
if (last_id >= next_id)
next_id = last_id + 1;
cfg_tbl.Insert(Grp_core, Key_patch_next_id, "y");
tbl.Insert_yn(Grp_core, Key_patch_next_id, Bool_.Y);
}
public void Txn_save() {
this.Update_next_id();
}
public void Rls() {cfg_tbl.Rls();}
private void Update_next_id() {cfg_tbl.Update("core", "next_id", Int_.Xto_str(next_id));}
public Fsm_cfg_mgr Update(String grp, String key, String new_val) {
String cur_val = cfg_tbl.Select_as_str_or(grp, key, null);
if (cur_val == null)
cfg_tbl.Insert(grp, key, new_val);
else
cfg_tbl.Update(grp, key, new_val);
return this;
}
public Db_cfg_grp Grps_get_or_load(String grp_key) {
Db_cfg_grp grp = (Db_cfg_grp)grps.Fetch(grp_key);
if (grp == null) {
grp = cfg_tbl.Select_as_grp(grp_key);
grps.Add(grp_key, grp);
}
return grp;
}
public Db_cfg_grp Grps_get_or_add(String grp_key) { // TEST:
Db_cfg_grp grp = (Db_cfg_grp)grps.Fetch(grp_key);
if (grp == null) {
grp = new Db_cfg_grp(grp_key);
grps.Add(grp_key, grp);
}
return grp;
}
public static Fsm_cfg_mgr new_() {return new Fsm_cfg_mgr();}
public void Init_for_db(Db_conn conn, boolean created, boolean schema_is_1) {
cfg_tbl.Conn_(conn, created, schema_is_1, Fsm_abc_mgr.Cfg_tbl_v1, Fsm_abc_mgr.Cfg_tbl_v2);
if (created) {
cfg_tbl.Insert(Fsm_cfg_mgr.Grp_core, Fsm_cfg_mgr.Key_next_id , "1"); // start next_id at 1
cfg_tbl.Insert(Fsm_cfg_mgr.Grp_core, Fsm_cfg_mgr.Key_schema_thm_page , "y"); // new dbs automatically have page and time in fsdb_xtn_tm
cfg_tbl.Insert(Fsm_cfg_mgr.Grp_core, Fsm_cfg_mgr.Key_patch_next_id , "y"); // new dbs automatically have correct next_id
}
else {
Db_cfg_grp core_grp = Grps_get_or_load(Grp_core);
this.next_id = core_grp.Get_int_or(Key_next_id, -1); if (next_id == -1) throw Err_.new_("next_id not found in fsdb_cfg");
this.schema_thm_page = core_grp.Get_yn_or_n(Key_schema_thm_page);
this.patch_next_id = core_grp.Get_yn_or_n(Key_patch_next_id);
public Db_cfg_hash Grps_get_or_load(String grp_key) {
Db_cfg_hash rv = (Db_cfg_hash)grp_hash.Fetch(grp_key);
if (rv == null) {
rv = tbl.Select_as_hash(grp_key);
grp_hash.Add(grp_key, rv);
}
return rv;
}
public static final String Grp_core = "core";
public static final String Key_next_id = "next_id", Key_schema_thm_page = "schema.thm.page", Key_patch_next_id = "patch.next_id";

View File

@@ -16,9 +16,58 @@ 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.fsdb.meta; import gplx.*; import gplx.fsdb.*;
import gplx.ios.*; import gplx.dbs.*; import gplx.fsdb.data.*;
public class Fsm_mnt_itm {
public Fsm_mnt_itm(int id, String name, String url) {this.id = id; this.name = name; this.url = url;}
public int Id() {return id;} private final int id;
public String Name() {return name;} private final String name;
public String Url() {return url;} private final String url;
public Fsm_mnt_itm(int id, String name, String url_rel) {this.id = id; this.name = name; this.url_rel = url_rel;}
public int Id() {return id;} private final int id;
public String Name() {return name;} private final String name;
public String Url_rel() {return url_rel;} private final String url_rel;
public Fsm_atr_mgr Atr_mgr() {return atr_mgr;} private Fsm_atr_mgr atr_mgr;
public Fsm_bin_mgr Bin_mgr() {return bin_mgr;} private Fsm_bin_mgr bin_mgr;
public Fsm_cfg_mgr Cfg_mgr() {return cfg_mgr;} private Fsm_cfg_mgr cfg_mgr;
public Fsdb_db_mgr Db_mgr() {return db_mgr;} private Fsdb_db_mgr db_mgr;
public void Ctor_by_load(Fsdb_db_mgr db_mgr) {
this.db_mgr = db_mgr;
Db_conn conn = db_mgr.File__abc_file__at(id).Conn();
cfg_mgr = new Fsm_cfg_mgr(db_mgr, conn);
atr_mgr = new Fsm_atr_mgr(db_mgr, conn, this);
bin_mgr = new Fsm_bin_mgr(db_mgr, conn, id);
cfg_mgr.Ctor_by_load();
atr_mgr.Ctor_by_load(cfg_mgr.Schema_thm_page());
bin_mgr.Ctor_by_load();
if (!cfg_mgr.Patch_next_id()) Fsm_mnt_itm_.Patch_next_id(this, name);
}
public int Next_id() {return cfg_mgr.Next_id();}
public Fsd_fil_itm Select_fil_or_null(byte[] dir, byte[] fil, boolean is_thumb, int width, double time) {return atr_mgr.Select_fil_or_null(dir, fil);}
public boolean Select_thm(Fsd_thm_itm rv, byte[] dir, byte[] fil) {
Fsd_fil_itm fil_itm = atr_mgr.Select_fil_or_null(dir, fil);
return fil_itm == Fsd_fil_itm.Null ? Bool_.N : atr_mgr.Select_thm(rv, fil_itm.Dir_id(), fil_itm.Fil_id());
}
public void Insert_img(Fsd_img_itm rv, Fsm_atr_fil atr_fil, Fsm_bin_fil bin_fil, byte[] dir, byte[] fil, int ext_id, int img_w, int img_h, long bin_len, Io_stream_rdr bin_rdr) {
int fil_id = atr_fil.Insert_img(rv, dir, fil, ext_id, img_w, img_h, bin_fil.Id(), bin_len, bin_rdr);
bin_fil.Insert(fil_id, Fsd_bin_tbl.Owner_tid_fil, bin_len, bin_rdr);
}
public void Insert_fil(Fsd_fil_itm rv, Fsm_atr_fil atr_fil, Fsm_bin_fil bin_fil, byte[] dir, byte[] fil, int ext_id, long bin_len, gplx.ios.Io_stream_rdr bin_rdr) {
int fil_id = atr_fil.Insert_fil(rv, dir, fil, ext_id, bin_fil.Id(), bin_len, bin_rdr);
bin_fil.Insert(fil_id, Fsd_bin_tbl.Owner_tid_fil, bin_len, bin_rdr);
}
public void Insert_thm(Fsd_thm_itm rv, Fsm_atr_fil atr_fil, Fsm_bin_fil bin_fil, byte[] dir, byte[] fil, int ext_id, int w, int h, double time, int page, long bin_len, Io_stream_rdr bin_rdr) {
int thm_id = atr_fil.Insert_thm(rv, dir, fil, ext_id, w, h, time, page, bin_fil.Id(), bin_len, bin_rdr);
bin_fil.Insert(thm_id, Fsd_bin_tbl.Owner_tid_thm, bin_len, bin_rdr);
}
public void Txn_bgn() {atr_mgr.Txn_bgn(); bin_mgr.Txn_bgn();}
public void Txn_end() {atr_mgr.Txn_end(); bin_mgr.Txn_end();}
}
class Fsm_mnt_itm_ {
public static void Patch_next_id(Fsm_mnt_itm abc_mgr, String name) {
if (!String_.Eq(name, "fsdb.user")) return;
Fsm_atr_mgr atr_mgr = abc_mgr.Atr_mgr();
Fsm_cfg_mgr cfg_mgr = abc_mgr.Cfg_mgr();
int last_id = -1;
Fsm_atr_fil atr_fil = atr_mgr.Db__core();
int max_fil_id = Db_conn_.Select_fld0_as_int_or(atr_fil.Conn(), "SELECT Max(fil_id) AS MaxId FROM fsdb_fil;", -1);
int max_thm_id = Db_conn_.Select_fld0_as_int_or(atr_fil.Conn(), "SELECT Max(thm_id) AS MaxId FROM fsdb_xtn_thm;", -1);
last_id = max_fil_id > max_thm_id ? max_fil_id : max_thm_id;
cfg_mgr.Patch_next_id_exec(last_id);
}
}

View File

@@ -16,120 +16,37 @@ 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.fsdb.meta; import gplx.*; import gplx.fsdb.*;
import gplx.core.primitives.*;
import gplx.dbs.*; import gplx.dbs.cfgs.*; import gplx.xowa.files.*; import gplx.xowa.files.fsdb.*;
import gplx.fsdb.data.*; import gplx.fsdb.meta.*;
public class Fsm_mnt_mgr implements GfoInvkAble {
private final Db_cfg_tbl cfg_tbl = new Db_cfg_tbl(); private final Fsm_mnt_tbl mnt_tbl = new Fsm_mnt_tbl();
private Fsm_abc_mgr[] ary; private int ary_len = 0;
public static final String Mnt_name = "wiki.mnt.sqlite3";
public void Init_by_wiki(Io_url db_dir, boolean schema_is_1) {
Io_url mnt_dir = db_dir.GenSubFil(Mnt_name);
Db_conn_bldr_data conn_data = Db_conn_bldr.I.Get_or_new("", mnt_dir);
Db_conn conn = conn_data.Conn();
boolean created = conn_data.Created();
Fsm_mnt_itm[] mnts = Mnts__load_or_make(conn, created, schema_is_1);
ary_len = mnts.length;
ary = new Fsm_abc_mgr[ary_len];
for (int i = 0; i < ary_len; i++) {
Fsm_mnt_itm itm = mnts[i];
Fsm_abc_mgr abc_mgr = new Fsm_abc_mgr();
ary[i] = abc_mgr;
if (schema_is_1) {
Io_url abc_url = db_dir.GenSubFil_nest(itm.Url(), "fsdb.abc.sqlite3");
abc_mgr.Init_for_db(schema_is_1, abc_url.OwnerDir());
}
else
throw Err_.not_implemented_();
}
if (created) Fsm_mnt_mgr.Patch(this);
insert_to_mnt = cfg_tbl.Select_as_int_or_fail("core", "mnt.insert_idx");
if (ary_len > 0) {
Db_cfg_grp cfg_grp = this.Mnts__at(0).Cfg_mgr().Grps_get_or_load(Xof_fsdb_mgr_cfg.Grp_xowa);
boolean use_thumb_w = cfg_grp.Get_yn_or(Xof_fsdb_mgr_cfg.Key_upright_use_thumb_w, Bool_.N);
boolean fix_default = cfg_grp.Get_yn_or(Xof_fsdb_mgr_cfg.Key_upright_fix_default, Bool_.N);
patch_upright_tid = Xof_patch_upright_tid_.Merge(use_thumb_w, fix_default);
}
else // TEST: no cfg dbs
patch_upright_tid = Xof_patch_upright_tid_.Tid_all;
private Db_cfg_tbl cfg_tbl; private Fsm_mnt_tbl mnt_tbl;
private Fsm_mnt_itm[] mnt_ary; private int mnt_ary_len = 0;
public void Ctor_by_load(Fsdb_db_mgr db_core) {
Db_conn conn = db_core.File__mnt_file().Conn();
this.cfg_tbl = new Db_cfg_tbl (conn, db_core.File__cfg_tbl_name());
this.mnt_tbl = new Fsm_mnt_tbl (conn, db_core.File__schema_is_1());
this.mnt_ary = mnt_tbl.Select_all();
this.mnt_ary_len = mnt_ary.length;
for (int i = 0; i < mnt_ary_len; ++i)
mnt_ary[i].Ctor_by_load(db_core);
this.insert_idx = cfg_tbl.Select_int(Cfg_grp_core, Cfg_key_mnt_insert_idx);
Db_cfg_hash cfg_hash = this.Mnts__get_main().Cfg_mgr().Grps_get_or_load(Xof_fsdb_mgr_cfg.Grp_xowa);
boolean use_thumb_w = cfg_hash.Get(Xof_fsdb_mgr_cfg.Key_upright_use_thumb_w).To_yn_or_n();
boolean fix_default = cfg_hash.Get(Xof_fsdb_mgr_cfg.Key_upright_fix_default).To_yn_or_n();
this.patch_upright_tid = Xof_patch_upright_tid_.Merge(use_thumb_w, fix_default);
}
public Fsm_abc_mgr Mnts__at(int i) {return ary[i];}
public Fsm_bin_fil Bins__at(int mnt_id, int bin_db_id) {return ary[mnt_id].Bin_mgr().Get_at(bin_db_id);}
public Fsd_fil_itm Fil_select_bin(byte[] dir, byte[] fil, boolean is_thumb, int width, double thumbtime) {
for (int i = 0; i < ary_len; i++) {
Fsd_fil_itm rv = ary[i].Fil_select_bin(dir, fil, is_thumb, width, thumbtime);
if (rv != Fsd_fil_itm.Null && rv.Db_bin_id() != Fsd_bin_tbl.Null_db_bin_id) { // NOTE: mnt_0 can have thumb, but mnt_1 can have itm; check for itm with Db_bin_id; DATE:2013-11-16
rv.Mnt_id_(i);
return rv;
}
}
return Fsd_fil_itm.Null;
}
public boolean Thm_select_bin(byte[] dir, byte[] fil, Fsd_thm_itm thm) {
for (int i = 0; i < ary_len; i++) {
boolean rv = ary[i].Thm_select_bin(dir, fil, thm);
if (rv) {
thm.Mnt_id_(i);
return rv;
}
}
return false;
}
public int Insert_to_mnt() {return insert_to_mnt;} public Fsm_mnt_mgr Insert_to_mnt_(int v) {insert_to_mnt = v; return this;} private int insert_to_mnt = Mnt_idx_user;
public void Fil_insert(byte[] dir, byte[] fil, int ext_id, DateAdp modified, String hash, long bin_len, gplx.ios.Io_stream_rdr bin_rdr) {Fil_insert(new Fsd_fil_itm(), dir, fil, ext_id, modified, hash, bin_len, bin_rdr);}
public void Fil_insert(Fsd_fil_itm rv, byte[] dir, byte[] fil, int ext_id, DateAdp modified, String hash, long bin_len, gplx.ios.Io_stream_rdr bin_rdr) {
ary[insert_to_mnt].Fil_insert(rv, dir, fil, ext_id, modified, hash, bin_len, bin_rdr);
}
public void Thm_insert(byte[] dir, byte[] fil, int ext_id, int w, int h, double time, int page, DateAdp modified, String hash, long bin_len, gplx.ios.Io_stream_rdr bin_rdr) {Thm_insert(Fsd_thm_itm.new_(), dir, fil, ext_id, w, h, time, page, modified, hash, bin_len, bin_rdr);}
public void Thm_insert(Fsd_thm_itm rv, byte[] dir, byte[] fil, int ext_id, int w, int h, double time, int page, DateAdp modified, String hash, long bin_len, gplx.ios.Io_stream_rdr bin_rdr) {
ary[insert_to_mnt].Thm_insert(rv, dir, fil, ext_id, w, h, time, page, modified, hash, bin_len, bin_rdr);
}
public void Img_insert(byte[] dir, byte[] fil, int ext_id, int img_w, int img_h, DateAdp modified, String hash, long bin_len, gplx.ios.Io_stream_rdr bin_rdr) {Img_insert(new Fsd_img_itm(), dir, fil, ext_id, img_w, img_h, modified, hash, bin_len, bin_rdr);}
public void Img_insert(Fsd_img_itm rv, byte[] dir, byte[] fil, int ext_id, int img_w, int img_h, DateAdp modified, String hash, long bin_len, gplx.ios.Io_stream_rdr bin_rdr) {
ary[insert_to_mnt].Img_insert(rv, dir, fil, ext_id, modified, hash, bin_len, bin_rdr, img_w, img_h);
}
public void Bin_db_max_(long v) {
for (int i = 0; i < ary_len; i++)
ary[i].Bin_mgr().Db_bin_max_(v);
}
public void Insert_to_bin_(int v) {
for (int i = 0; i < ary_len; i++)
ary[i].Bin_mgr().Insert_to_bin_(v);
}
public int Patch_upright() {return patch_upright_tid;} private int patch_upright_tid = Xof_patch_upright_tid_.Tid_all;
public void Txn_open() {
for (int i = 0; i < ary_len; i++)
ary[i].Txn_open();
}
public void Txn_save() {
for (int i = 0; i < ary_len; i++)
ary[i].Txn_save();
}
public void Rls() {
for (int i = 0; i < ary_len; i++)
ary[i].Rls();
cfg_tbl.Rls();
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_bin_db_max_in_mb_)) this.Bin_db_max_(m.ReadLong("v") * Io_mgr.Len_mb);
else if (ctx.Match(k, Invk_insert_to_mnt_)) insert_to_mnt = m.ReadInt("v");
else if (ctx.Match(k, Invk_insert_to_bin_)) this.Insert_to_bin_(m.ReadInt("v"));
else return GfoInvkAble_.Rv_unhandled;
return this;
} private static final String Invk_bin_db_max_in_mb_ = "bin_db_max_in_mb_", Invk_insert_to_mnt_ = "insert_to_mnt_", Invk_insert_to_bin_ = "insert_to_bin_";
public int Mnts__len() {return mnt_ary_len;}
public Fsm_mnt_itm Mnts__get_at(int i) {return mnt_ary[i];}
public Fsm_mnt_itm Mnts__get_main() {return mnt_ary[Mnt_idx_main];}
public Fsm_mnt_itm Mnts__get_insert() {return mnt_ary[insert_idx];} public void Mnts__get_insert_idx_(int v) {insert_idx = v;} private int insert_idx = Mnt_idx_user;
public Fsm_bin_fil Bins__at(int mnt_id, int bin_db_id) {return mnt_ary[mnt_id].Bin_mgr().Dbs__get_at(bin_db_id);}
public int Patch_upright() {return patch_upright_tid;} private int patch_upright_tid = Xof_patch_upright_tid_.Tid_all;
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {return GfoInvkAble_.Rv_unhandled;}
public static final int Mnt_idx_main = 0, Mnt_idx_user = 1, Insert_to_bin_null = -1;
public static void Patch(Fsm_mnt_mgr mnt_mgr) {
mnt_mgr.Mnts__at(Fsm_mnt_mgr.Mnt_idx_main).Cfg_mgr()
.Update(Xof_fsdb_mgr_cfg.Grp_xowa, Xof_fsdb_mgr_cfg.Key_gallery_fix_defaults , "y")
.Update(Xof_fsdb_mgr_cfg.Grp_xowa, Xof_fsdb_mgr_cfg.Key_gallery_packed , "y")
.Update(Xof_fsdb_mgr_cfg.Grp_xowa, Xof_fsdb_mgr_cfg.Key_upright_use_thumb_w , "y")
.Update(Xof_fsdb_mgr_cfg.Grp_xowa, Xof_fsdb_mgr_cfg.Key_upright_fix_default , "y")
;
}
private Fsm_mnt_itm[] Mnts__load_or_make(Db_conn conn, boolean created, boolean schema_is_1) {
cfg_tbl.Conn_(conn, created, schema_is_1, Fsm_abc_mgr.Cfg_tbl_v1, Fsm_abc_mgr.Cfg_tbl_v2);
mnt_tbl.Conn_(conn, created, schema_is_1);
if (created) cfg_tbl.Insert("core", "mnt.insert_idx", Int_.Xto_str(Mnt_idx_user));
return mnt_tbl.Select_all();
public static void Patch(Db_cfg_tbl cfg_tbl) {
cfg_tbl.Upsert_str(Xof_fsdb_mgr_cfg.Grp_xowa, Xof_fsdb_mgr_cfg.Key_gallery_fix_defaults , "y");
cfg_tbl.Upsert_str(Xof_fsdb_mgr_cfg.Grp_xowa, Xof_fsdb_mgr_cfg.Key_gallery_packed , "y");
cfg_tbl.Upsert_str(Xof_fsdb_mgr_cfg.Grp_xowa, Xof_fsdb_mgr_cfg.Key_upright_use_thumb_w , "y");
cfg_tbl.Upsert_str(Xof_fsdb_mgr_cfg.Grp_xowa, Xof_fsdb_mgr_cfg.Key_upright_fix_default , "y");
}
public static final String Cfg_grp_core = "core", Cfg_key_mnt_insert_idx = "mnt.insert_idx"; // SERIALIZED
}

View File

@@ -17,29 +17,24 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.fsdb.meta; import gplx.*; import gplx.fsdb.*;
import gplx.dbs.*;
public class Fsm_mnt_tbl {
private String tbl_name = "file_meta_mnt"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_();
private String fld_id, fld_name, fld_url;
private Db_conn conn;
public void Conn_(Db_conn new_conn, boolean created, boolean schema_is_1) {
this.conn = new_conn; flds.Clear();
String fld_prefix = "";
if (schema_is_1) {
tbl_name = "fsdb_mnt";
fld_prefix = "mnt_";
}
fld_id = flds.Add_int(fld_prefix + "id");
fld_name = flds.Add_str(fld_prefix + "name", 255);
fld_url = flds.Add_str(fld_prefix + "url", 255);
if (created) {
Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds
, Db_meta_idx.new_unique_by_tbl(tbl_name, "pkey", fld_id)
);
conn.Exec_create_tbl_and_idx(meta);
this.Insert(Fsm_mnt_mgr.Mnt_idx_main, "fsdb.main", "fsdb.main");
this.Insert(Fsm_mnt_mgr.Mnt_idx_user, "fsdb.user", "fsdb.user");
}
public class Fsm_mnt_tbl implements RlsAble {
private final String tbl_name = "fsdb_mnt"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_();
private final String fld_id, fld_name, fld_url;
private final Db_conn conn;
public Fsm_mnt_tbl(Db_conn conn, boolean schema_is_1) {
this.conn = conn;
fld_id = flds.Add_int_pkey ("mnt_id");
fld_name = flds.Add_str ("mnt_name", 255);
fld_url = flds.Add_str ("mnt_url", 255);
conn.Rls_reg(this);
}
public void Create_tbl() {
Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds);
conn.Ddl_create_tbl(meta);
this.Insert(Fsm_mnt_mgr.Mnt_idx_main, Mnt_name_main, Mnt_name_main);
this.Insert(Fsm_mnt_mgr.Mnt_idx_user, Mnt_name_user, Mnt_name_user);
}
public void Rls() {}
public void Insert(int id, String name, String url) {
Db_stmt stmt = conn.Stmt_insert(tbl_name, flds);
stmt.Clear().Val_int(fld_id, id).Val_str(fld_name, name).Val_str(fld_url, url).Exec_insert();
@@ -49,11 +44,9 @@ public class Fsm_mnt_tbl {
stmt.Clear().Val_str(fld_name, name).Val_str(fld_url, url).Crt_int(fld_id, id).Exec_update();
}
public Fsm_mnt_itm[] Select_all() {
Db_stmt stmt = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empy);
Db_rdr rdr = Db_rdr_.Null;
ListAdp list = ListAdp_.new_();
Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empy).Clear().Exec_select__rls_auto();
try {
rdr = stmt.Clear().Exec_select_as_rdr();
while (rdr.Move_next()) {
Fsm_mnt_itm itm = new Fsm_mnt_itm(rdr.Read_int(fld_id), rdr.Read_str(fld_name), rdr.Read_str(fld_url));
list.Add(itm);
@@ -62,4 +55,5 @@ public class Fsm_mnt_tbl {
finally {rdr.Rls();}
return (Fsm_mnt_itm[])list.Xto_ary_and_clear(Fsm_mnt_itm.class);
}
public static final String Mnt_name_main = "fsdb.main", Mnt_name_user = "fsdb.user";
}

View File

@@ -21,14 +21,14 @@ public class Io_stream_zip_mgr {
private Io_stream_wtr wtr_gzip, wtr_zip, wtr_bzip2;
private Io_stream_rdr rdr_gzip, rdr_zip, rdr_bzip2;
public byte[] Zip(byte type, byte[] val) {
if (type == Io_stream_.Tid_file) return val;
if (type == Io_stream_.Tid_raw) return val;
Io_stream_wtr wtr = Wtr(type);
wtr.Write(val, 0, val.length);
wtr.Flush();
return wtr.Xto_ary_and_clear();
}
public byte[] Unzip(byte type, byte[] val) {
if (type == Io_stream_.Tid_file) return val;
if (type == Io_stream_.Tid_raw) return val;
Io_stream_rdr rdr = Rdr(type);
rdr.Open_mem(val);
return Io_stream_rdr_.Load_all_as_bry(bfr, rdr);
@@ -38,7 +38,7 @@ public class Io_stream_zip_mgr {
case Io_stream_.Tid_gzip : if (wtr_gzip == null) wtr_gzip = Io_stream_wtr_.new_by_mem(bfr, Io_stream_.Tid_gzip) ; return wtr_gzip.Open();
case Io_stream_.Tid_zip : if (wtr_zip == null) wtr_zip = Io_stream_wtr_.new_by_mem(bfr, Io_stream_.Tid_zip) ; return wtr_zip.Open();
case Io_stream_.Tid_bzip2 : if (wtr_bzip2 == null) wtr_bzip2 = Io_stream_wtr_.new_by_mem(bfr, Io_stream_.Tid_bzip2) ; return wtr_bzip2.Open();
case Io_stream_.Tid_file :
case Io_stream_.Tid_raw :
default : throw Err_.unhandled(type);
}
}
@@ -47,7 +47,7 @@ public class Io_stream_zip_mgr {
case Io_stream_.Tid_gzip : if (rdr_gzip == null) rdr_gzip = Io_stream_rdr_.new_by_tid_(Io_stream_.Tid_gzip) ; return rdr_gzip;
case Io_stream_.Tid_zip : if (rdr_zip == null) rdr_zip = Io_stream_rdr_.new_by_tid_(Io_stream_.Tid_zip) ; return rdr_zip;
case Io_stream_.Tid_bzip2 : if (rdr_bzip2 == null) rdr_bzip2 = Io_stream_rdr_.new_by_tid_(Io_stream_.Tid_bzip2) ; return rdr_bzip2;
case Io_stream_.Tid_file :
case Io_stream_.Tid_raw :
default : throw Err_.unhandled(type);
}
}

View File

@@ -18,10 +18,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.srls.dsvs; import gplx.*; import gplx.srls.*;
public abstract class Dsv_wkr_base implements GfoInvkAble {
public abstract Dsv_fld_parser[] Fld_parsers();
public byte[] Src() {return src;} private byte[] src;
public abstract void Commit_itm(Dsv_tbl_parser parser, int pos);
@gplx.Virtual public boolean Write_bry(Dsv_tbl_parser parser, int fld_idx, byte[] src, int bgn, int end) {return false;}
@gplx.Virtual public boolean Write_int(Dsv_tbl_parser parser, int fld_idx, int pos, int val_int) {return false;}
public void Load_by_bry(byte[] src) {
this.src = src;
Dsv_tbl_parser tbl_parser = new Dsv_tbl_parser(); // NOTE: this proc should only be called once, so don't bother caching tbl_parser
tbl_parser.Init(this, this.Fld_parsers());
Load_by_bry_bgn();

View File

@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa; import gplx.*;
import gplx.dbs.*; import gplx.ios.*; import gplx.gfui.*;
import gplx.xowa.apps.*; import gplx.xowa.langs.*; import gplx.xowa.users.*;
import gplx.xowa.html.hdumps.*; import gplx.xowa.html.hdumps.core.*;
import gplx.xowa.files.*; import gplx.xowa.html.hdumps.*; import gplx.xowa.html.hdumps.core.*;
import gplx.xowa.urls.encoders.*;
public class Xoa_app_ {
public static void Run(String... args) {
@@ -26,7 +26,7 @@ public class Xoa_app_ {
boot_mgr.Run(args);
}
public static final String Name = "xowa";
public static final String Version = "2.3.2.1";
public static final String Version = "2.4.1.1";
public static String Build_date = "2012-12-30 00:00:00";
public static String Op_sys;
public static String User_agent = "";
@@ -44,6 +44,7 @@ public class Xoa_app_ {
public static Bry_bfr_mkr Utl__bfr_mkr() {return utl__bry_bfr_mkr;} private static final Bry_bfr_mkr utl__bry_bfr_mkr = new Bry_bfr_mkr();
public static Url_encoder_mgr Utl__encoder_mgr() {return utl__encoder_mgr;} private static final Url_encoder_mgr utl__encoder_mgr = new Url_encoder_mgr();
public static Io_stream_zip_mgr Utl__zip_mgr() {return utl__zip_mgr;} private static final Io_stream_zip_mgr utl__zip_mgr = new Io_stream_zip_mgr();
// public static Xof_url_bldr Utl__url_bldr() {return utl__url_bldr;} private static final Xof_url_bldr utl__url_bldr = Xof_url_bldr.new_v2_();
public static Xoa_gfs_mgr Gfs_mgr() {return gfs_mgr;} public static void Gfs_mgr_(Xoa_gfs_mgr v) {gfs_mgr = v;} private static Xoa_gfs_mgr gfs_mgr;
@@ -66,7 +67,7 @@ class Xoa_app_boot_mgr {
}
}
private boolean Init_env(String[] args) {
Gfo_usr_dlg_._ = usr_dlg = Xoa_app_.usr_dlg_console_();
Gfo_usr_dlg_.I = usr_dlg = Xoa_app_.usr_dlg_console_();
log_wtr = usr_dlg.Log_wtr(); log_wtr.Log_msg_to_session_fmt("env.init: version=~{0}", Xoa_app_.Version);
GfuiEnv_.Init_swt(args, Xoa_app_.class);
Io_url jar_url = Env_.AppUrl();

View File

@@ -16,17 +16,18 @@ 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; import gplx.*;
import gplx.xowa.apps.*;
import gplx.dbs.*; import gplx.xowa.apps.*;
public class Xoa_app_fxt {
public static Xoae_app app_() {
Io_mgr._.InitEngine_mem();
Db_conn_bldr.I.Reg_default_mem();
return app_("linux", Io_url_.mem_dir_("mem/xowa/"));
}
public static Xoae_app app_(String op_sys, Io_url root_dir) {
Io_url user_dir = root_dir.GenSubDir_nest("user", "test_user");
Gfo_log_wtr_base._.Log_dir_(user_dir.GenSubDir_nest("tmp", "current"));
Xoae_app app = new Xoae_app(Gfo_usr_dlg_base.test_(), root_dir, user_dir, op_sys);
app.Setup_mgr().Dump_mgr().Data_storage_format_(gplx.ios.Io_stream_.Tid_file); // TEST: set data_storage_format to file, else bldr tests will fails (expects plain text)
app.Setup_mgr().Dump_mgr().Data_storage_format_(gplx.ios.Io_stream_.Tid_raw); // TEST: set data_storage_format to file, else bldr tests will fails (expects plain text)
GfsCore._.Clear(); // NOTE: must clear
GfsCore._.AddCmd(app, Xoae_app.Invk_app); // NOTE: must add app to GfsCore; app.Gfs_mgr() always adds current app to GfsCore; note this causes old test to leave behind GfsCore for new test
GfsCore._.AddCmd(app, Xoae_app.Invk_xowa); // add alias for app; DATE:2014-06-09

View File

@@ -69,6 +69,7 @@ public class Xoae_app implements Xoa_app, GfoInvkAble {
public Url_encoder_mgr Utl__encoder_mgr() {return Xoa_app_.Utl__encoder_mgr();}
public Xoa_css_extractor Css_installer() {return css_installer;} private final Xoa_css_extractor css_installer = new Xoa_css_extractor();
public Xoa_wiki_mgr Wiki_mgr() {return wiki_mgr;} private Xoa_wiki_mgr wiki_mgr;
public Xou_user_mgr User_mgr() {return user_mgr;} private Xou_user_mgr user_mgr;
public Xof_file_mgr File_mgr() {return file_mgr;} private Xof_file_mgr file_mgr = new Xof_file_mgr();
@@ -131,6 +132,7 @@ public class Xoae_app implements Xoa_app, GfoInvkAble {
gui_mgr.Init_by_app();
user.Init_by_app(this);
file_mgr.Init_by_app(this);
css_installer.Init_by_app(this);
wiki_mgr.Init_by_app();
gplx.xowa.utls.upgrades.Xoa_upgrade_mgr.Check(this);
ctg_mgr.Init_by_app(this);

View File

@@ -0,0 +1,174 @@
/*
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.apis; import gplx.*; import gplx.xowa.*;
/*
xowa {
app {
exit();
env {
version_previous;
}
fsys {
plat_jar;
plat_url();
}
startup {
tabs {
type; // [blank,xowa,custom,previous]
previous;
custom;
custom_is_expr;
}
}
}
nav {
go_bwd();
go_fwd();
goto();
wiki {
main_page();
random();
sandbox();
}
}
gui {
browser {
url {
focus();
exec_by_paste();
exec_new_tab_by_paste();
restore();
exec();
}
search {
focus();
exec();
}
tabs {
new_dflt__at_dflt__focus_y();
new_link__at_dflt__focus_n();
new_link__at_dflt__focus_y();
new_href__at_dflt__focus_y();
new_dupe__at_dflt__focus_y();
close_cur();
select_bwd();
select_fwd();
move_bwd();
move_fwd();
close_others();
close_to_bgn();
close_to_end();
close_undo();
pin_toggle();
select_by_idx_1();
select_by_idx_2();
select_by_idx_3();
select_by_idx_4();
select_by_idx_5();
select_by_idx_6();
select_by_idx_7();
select_by_idx_8();
select_by_idx_9();
}
html {
focus();
selection_focus_toggle();
load_tid; // [mem,url]
}
find {
show();
show_by_paste();
hide();
exec();
type();
find_bwd();
find_fwd();
case_toggle();
wrap_toggle();
}
prog {
focus();
}
info {
focus();
clear();
launch();
warn_enabled;
note_enabled;
}
prog_log {
show();
}
}
font {
increase();
decrease();
reset();
}
page {
edit {
copy();
select_all();
save();
save_draft();
preview();
focus_edit_box();
dbg_tmpl();
dbg_html();
exec();
}
selection {
copy();
select_all();
save_file_as();
}
view {
mode_read();
mode_edit();
mode_html();
reload();
refresh();
print();
save_as();
}
}
}
html {
}
net {
}
usr {
}
xtns {
}
bldr {
wikis {
filters {
dansguardians {
}
}
imports {
one_file = 'y';
schema_is_1 = 'y';
text_zip_tid = '.gz';
html_zip_tid = '.gz';
}
}
}
*/

View File

@@ -20,6 +20,7 @@ import gplx.xowa.apis.xowa.*; import gplx.xowa.gui.cmds.*;
public class Xoapi_root implements GfoInvkAble {
private Xoae_app app;
public Xoapi_root(Xoae_app app) {
app_api.Ctor_by_app(app);
usr_api.Ctor_by_app(app);
bldr_api.Ctor_by_app(app);
}

View File

@@ -17,21 +17,26 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.apis.xowa; import gplx.*; import gplx.xowa.*; import gplx.xowa.apis.*;
import gplx.xowa.gui.views.*;
import gplx.xowa.apis.xowa.envs.*; import gplx.xowa.apis.xowa.startups.*;
import gplx.xowa.apis.xowa.apps.*; import gplx.xowa.apis.xowa.envs.*; import gplx.xowa.apis.xowa.startups.*;
public class Xoapi_app implements GfoInvkAble {
private Xog_win_itm win;
public void Ctor_by_app(Xoae_app app) {
fsys.Ctor_by_app(app);
}
public void Init_by_kit(Xoae_app app) {
win = app.Gui_mgr().Browser_win();
}
public void Exit() {win.App__exit();}
public Xoapi_env Env() {return env;} private Xoapi_env env = new Xoapi_env();
public Xoapi_startups Startup() {return startup;} private Xoapi_startups startup = new Xoapi_startups();
public Xoapi_fsys Fsys() {return fsys;} private Xoapi_fsys fsys = new Xoapi_fsys();
public void Exit() {win.App__exit();}
public Xoapi_env Env() {return env;} private Xoapi_env env = new Xoapi_env();
public Xoapi_startups Startup() {return startup;} private Xoapi_startups startup = new Xoapi_startups();
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_exit)) this.Exit();
else if (ctx.Match(k, Invk_fsys)) return fsys;
else if (ctx.Match(k, Invk_startup)) return startup;
else if (ctx.Match(k, Invk_env)) return env;
else return GfoInvkAble_.Rv_unhandled;
return this;
}
private static final String Invk_exit = "exit", Invk_startup = "startup", Invk_env = "env";
private static final String Invk_exit = "exit", Invk_startup = "startup", Invk_env = "env", Invk_fsys = "fsys";
}

View File

@@ -18,11 +18,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.apis.xowa; import gplx.*; import gplx.xowa.*; import gplx.xowa.apis.*;
import gplx.xowa.apis.xowa.bldrs.*;
public class Xoapi_bldr implements GfoInvkAble {
public void Ctor_by_app(Xoa_app app) {wikis.Ctor_by_app(app);}
public Xoapi_bldr_wikis Wikis() {return wikis;} private final Xoapi_bldr_wikis wikis = new Xoapi_bldr_wikis();
public void Ctor_by_app(Xoa_app app) {wiki.Ctor_by_app(app);}
public Xoapi_bldr_wiki Wiki() {return wiki;} private final Xoapi_bldr_wiki wiki = new Xoapi_bldr_wiki();
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_wikis)) return wikis;
if (ctx.Match(k, Invk_wiki)) return wiki;
else return GfoInvkAble_.Rv_unhandled;
}
private static final String Invk_wikis = "wikis";
private static final String Invk_wiki = "wiki";
}

View File

@@ -0,0 +1,32 @@
/*
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.apis.xowa.apps; import gplx.*; import gplx.xowa.*; import gplx.xowa.apis.*; import gplx.xowa.apis.xowa.*;
public class Xoapi_fsys implements GfoInvkAble {
public void Ctor_by_app(Xoae_app app) {
this.plat_jar = Env_.AppUrl();
this.root_dir = app.Fsys_mgr().Root_dir();
}
public Io_url Plat_jar() {return plat_jar;} private Io_url plat_jar;
public Io_url Plat_url(String s) {return Io_url_.new_any_(root_dir.Gen_sub_path_for_os(s));} private Io_url root_dir;
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_plat_jar)) return plat_jar;
else if (ctx.Match(k, Invk_plat_url)) return Plat_url(m.ReadStr("v"));
else return GfoInvkAble_.Rv_unhandled;
}
private static final String Invk_plat_jar = "plat_jar", Invk_plat_url = "plat_url";
}

View File

@@ -17,12 +17,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.apis.xowa.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.apis.*; import gplx.xowa.apis.xowa.*;
import gplx.xowa.apis.xowa.bldrs.filters.*;
public class Xoapi_bldr_wikis implements GfoInvkAble {
public void Ctor_by_app(Xoa_app app) {filters.Ctor_by_app(app);}
public Xoapi_filters Filters() {return filters;} private final Xoapi_filters filters = new Xoapi_filters();
import gplx.xowa.apis.xowa.bldrs.imports.*;
public class Xoapi_bldr_wiki implements GfoInvkAble {
public void Ctor_by_app(Xoa_app app) {filter.Ctor_by_app(app);}
public Xoapi_filter Filter() {return filter;} private final Xoapi_filter filter = new Xoapi_filter();
public Xoapi_import Import() {return import_api;} private final Xoapi_import import_api = new Xoapi_import();
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_filters)) return filters;
if (ctx.Match(k, Invk_filter)) return filter;
else if (ctx.Match(k, Invk_import)) return import_api;
else return GfoInvkAble_.Rv_unhandled;
}
private static final String Invk_filters = "filters";
private static final String Invk_filter = "filter", Invk_import = "import";
}

View File

@@ -17,12 +17,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.apis.xowa.bldrs.filters; import gplx.*; import gplx.xowa.*; import gplx.xowa.apis.*; import gplx.xowa.apis.xowa.*; import gplx.xowa.apis.xowa.bldrs.*;
import gplx.xowa.apis.xowa.bldrs.filters.dansguardians.*;
public class Xoapi_filters implements GfoInvkAble {
public void Ctor_by_app(Xoa_app app) {dansguardians.Ctor_by_app(app);}
public Xoapi_dansguardians Dansguardians() {return dansguardians;} private final Xoapi_dansguardians dansguardians = new Xoapi_dansguardians();
public class Xoapi_filter implements GfoInvkAble {
public void Ctor_by_app(Xoa_app app) {dansguardian.Ctor_by_app(app);}
public Xoapi_dansguardian Dansguardian() {return dansguardian;} private final Xoapi_dansguardian dansguardian = new Xoapi_dansguardian();
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_dansguardians)) return dansguardians;
if (ctx.Match(k, Invk_dansguardian)) return dansguardian;
else return GfoInvkAble_.Rv_unhandled;
}
private static final String Invk_dansguardians = "dansguardians";
private static final String Invk_dansguardian = "dansguardian";
}

View File

@@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.apis.xowa.bldrs.filters.dansguardians; import gplx.*; import gplx.xowa.*; import gplx.xowa.apis.*; import gplx.xowa.apis.xowa.*; import gplx.xowa.apis.xowa.bldrs.*; import gplx.xowa.apis.xowa.bldrs.filters.*;
import gplx.ios.*; import gplx.xowa.bldrs.filters.dansguardians.*;
public class Xoapi_dansguardians implements GfoInvkAble {
public class Xoapi_dansguardian implements GfoInvkAble {
public void Ctor_by_app(Xoa_app app) {
root_dir = app.Fsys_mgr().Bin_xowa_dir().GenSubDir_nest("cfg", "bldr", "filter");
}

View File

@@ -16,7 +16,7 @@ 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.apis.xowa.bldrs.filters.titles; import gplx.*; import gplx.xowa.*; import gplx.xowa.apis.*; import gplx.xowa.apis.xowa.*; import gplx.xowa.apis.xowa.bldrs.*; import gplx.xowa.apis.xowa.bldrs.filters.*;
public class Xoapi_titles implements GfoInvkAble {
public class Xoapi_title implements GfoInvkAble {
public void Init_by_kit(Xoae_app app) {
// wordlist_dir = app.Fsys_mgr().Bin_xtns_dir().GenSubDir_nest("xowa", "DansGuardian");
}

View File

@@ -0,0 +1,91 @@
/*
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.apis.xowa.bldrs.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.apis.*; import gplx.xowa.apis.xowa.*; import gplx.xowa.apis.xowa.bldrs.*;
import gplx.ios.*; import gplx.xowa.wikis.data.*;
public class Xoapi_import implements GfoInvkAble {
public long Layout_all_max() {return layout_all_max;} private long layout_all_max = 0; // disable by default; may set to 200 MB in future
public long Layout_text_max() {return layout_text_max;} private long layout_text_max = Io_size_.To_long_by_int_mb(1500); // 1.5 GB
public long Layout_html_max() {return layout_html_max;} private long layout_html_max = Io_size_.To_long_by_int_mb(1500); // 1.5 GB
public long Layout_file_max() {return layout_file_max;} private long layout_file_max = Io_size_.To_long_by_int_mb(1500); // 1.5 GB
public long Cat_link_db_max() {return cat_link_db_max;} private long cat_link_db_max = Io_size_.To_long_by_int_mb(3600); // 3.6 GB; v1
public long Text_db_max() {return text_db_max;} private long text_db_max = Io_size_.To_long_by_int_mb(3000); // 3.0 GB; v1
public long Html_db_max() {return html_db_max;} private long html_db_max = Io_size_.To_long_by_int_mb(3000); // 3.0 GB; v2; use same as text
public long File_db_max() {return file_db_max;} private long file_db_max = Io_size_.To_long_by_int_mb(3200); // 3.2 GB; v2
public byte[] Ns_file_map() {return ns_file_map;} private byte[] ns_file_map = Ns_file_map__each;
public byte Zip_tid_text() {return zip_tid_text;} private byte zip_tid_text = Io_stream_.Tid_gzip;
public byte Zip_tid_html() {return zip_tid_html;} private byte zip_tid_html = Io_stream_.Tid_gzip;
public String User_name() {return user_name;} private String user_name = "anonymous";
public Xowd_core_db_props New_props(String domain_str, long dump_file_size) {
Xowd_db_layout layout_text, layout_html, layout_file;
if (dump_file_size < layout_all_max)
layout_text = layout_html = layout_file = Xowd_db_layout.Itm_all;
else {
layout_text = dump_file_size < layout_text_max ? Xowd_db_layout.Itm_few : Xowd_db_layout.Itm_lot;
layout_html = dump_file_size < layout_html_max ? Xowd_db_layout.Itm_few : Xowd_db_layout.Itm_lot;
layout_file = dump_file_size < layout_file_max ? Xowd_db_layout.Itm_few : Xowd_db_layout.Itm_lot;
}
return new Xowd_core_db_props(2, layout_text, layout_html, layout_file, zip_tid_text, zip_tid_html);
}
public byte[] New_ns_file_map(long dump_file_size) {
return dump_file_size < layout_text_max ? Bry_.Empty : Ns_file_map__each;
}
public void Zip_tid_text_raw_() {zip_tid_text = Io_stream_.Tid_raw;} // TEST:
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_layout_all_max)) return Io_size_.To_str_mb(layout_all_max);
else if (ctx.Match(k, Invk_layout_all_max_)) layout_all_max = Io_size_.To_long_by_msg_mb(m);
else if (ctx.Match(k, Invk_layout_text_max)) return Io_size_.To_str_mb(layout_text_max);
else if (ctx.Match(k, Invk_layout_text_max_)) layout_text_max = Io_size_.To_long_by_msg_mb(m);
else if (ctx.Match(k, Invk_layout_html_max)) return Io_size_.To_str_mb(layout_html_max);
else if (ctx.Match(k, Invk_layout_html_max_)) layout_html_max = Io_size_.To_long_by_msg_mb(m);
else if (ctx.Match(k, Invk_layout_file_max)) return Io_size_.To_str_mb(layout_file_max);
else if (ctx.Match(k, Invk_layout_file_max_)) layout_file_max = Io_size_.To_long_by_msg_mb(m);
else if (ctx.Match(k, Invk_cat_link_db_max)) return Io_size_.To_str_mb(cat_link_db_max);
else if (ctx.Match(k, Invk_cat_link_db_max_)) cat_link_db_max = Io_size_.To_long_by_msg_mb(m);
else if (ctx.Match(k, Invk_text_db_max)) return Io_size_.To_str_mb(text_db_max);
else if (ctx.Match(k, Invk_text_db_max_)) text_db_max = Io_size_.To_long_by_msg_mb(m);
else if (ctx.Match(k, Invk_html_db_max)) return Io_size_.To_str_mb(html_db_max);
else if (ctx.Match(k, Invk_html_db_max_)) html_db_max = Io_size_.To_long_by_msg_mb(m);
else if (ctx.Match(k, Invk_file_db_max)) return Io_size_.To_str_mb(file_db_max);
else if (ctx.Match(k, Invk_file_db_max_)) file_db_max = Io_size_.To_long_by_msg_mb(m);
else if (ctx.Match(k, Invk_ns_file_map)) return String_.new_utf8_(ns_file_map);
else if (ctx.Match(k, Invk_ns_file_map_)) ns_file_map = m.ReadBry("v");
else if (ctx.Match(k, Invk_zip_tid_text)) return Io_stream_.To_str(zip_tid_text);
else if (ctx.Match(k, Invk_zip_tid_text_)) zip_tid_text = Io_stream_.To_tid(m.ReadStr("v"));
else if (ctx.Match(k, Invk_zip_tid_html)) return Io_stream_.To_str(zip_tid_html);
else if (ctx.Match(k, Invk_zip_tid_html_)) zip_tid_html = Io_stream_.To_tid(m.ReadStr("v"));
else if (ctx.Match(k, Invk_user_name)) return user_name;
else if (ctx.Match(k, Invk_user_name_)) user_name = m.ReadStr("v");
else return GfoInvkAble_.Rv_unhandled;
return this;
}
private static final String
Invk_layout_all_max = "layout_all_max" , Invk_layout_all_max_ = "layout_all_max_"
, Invk_layout_text_max = "layout_text_max" , Invk_layout_text_max_ = "layout_text_max_"
, Invk_layout_html_max = "layout_html_max" , Invk_layout_html_max_ = "layout_html_max_"
, Invk_layout_file_max = "layout_file_max" , Invk_layout_file_max_ = "layout_file_max_"
, Invk_cat_link_db_max = "cat_link_db_max" , Invk_cat_link_db_max_ = "cat_link_db_max_"
, Invk_text_db_max = "text_db_max" , Invk_text_db_max_ = "text_db_max_"
, Invk_html_db_max = "html_db_max" , Invk_html_db_max_ = "html_db_max_"
, Invk_file_db_max = "file_db_max" , Invk_file_db_max_ = "file_db_max_"
, Invk_ns_file_map = "ns_file_map" , Invk_ns_file_map_ = "ns_file_map_"
, Invk_zip_tid_text = "zip_tid_text" , Invk_zip_tid_text_ = "zip_tid_text_"
, Invk_zip_tid_html = "zip_tid_html" , Invk_zip_tid_html_ = "zip_tid_html_"
, Invk_user_name = "user_name" , Invk_user_name_ = "user_name_"
;
public static final byte[] Ns_file_map__each = Bry_.new_ascii_("<each>");
}

View File

@@ -41,14 +41,14 @@ public class Xoa_gfs_mgr implements GfoInvkAble, GfoInvkRootWkr {
catch (Exception e) { // gfs is corrupt; may happen if multiple XOWAs opened, and "Close all" chosen in OS; DATE:2014-07-01
if (!String_.Eq(type, "xowa")) // check if user.gfs
Io_mgr._.MoveFil(url, url.GenNewNameOnly(url.NameOnly() + "-" + DateAdp_.Now().XtoStr_fmt_yyyyMMdd_HHmmss())); // move file
Gfo_usr_dlg_._.Warn_many("", "", "invalid gfs; obsoleting: src=~{0} err=~{1}", url.Raw(), Err_.Message_gplx(e));
Gfo_usr_dlg_.I.Warn_many("", "", "invalid gfs; obsoleting: src=~{0} err=~{1}", url.Raw(), Err_.Message_gplx(e));
}
}
public GfoMsg Parse_root_msg(String v) {return gplx.gfs.Gfs_msg_bldr._.ParseToMsg(v);}
public Gfs_wtr Wtr() {return wtr;} private Gfs_wtr wtr = new Gfs_wtr();
public void Run_url(Io_url url) {
Run_url_for(GfsCore._.Root(), url);
Gfo_usr_dlg_._.Log_wtr().Log_msg_to_session_fmt("gfs.done: ~{0}", url.Raw());
Gfo_usr_dlg_.I.Log_wtr().Log_msg_to_session_fmt("gfs.done: ~{0}", url.Raw());
}
public void Run_url_for(GfoInvkAble invk, Io_url url) {
String raw = Io_mgr._.LoadFilStr_args(url).MissingIgnored_().Exec(); if (String_.Len_eq_0(raw)) return;
@@ -59,7 +59,7 @@ public class Xoa_gfs_mgr implements GfoInvkAble, GfoInvkRootWkr {
public Object Run_str_for(GfoInvkAble invk, GfoMsg root_msg) {
try {
int sub_msgs_len = root_msg.Subs_count();
GfsCtx ctx = GfsCtx.new_().Fail_if_unhandled_(Fail_if_unhandled).Usr_dlg_(Gfo_usr_dlg_._);
GfsCtx ctx = GfsCtx.new_().Fail_if_unhandled_(Fail_if_unhandled).Usr_dlg_(Gfo_usr_dlg_.I);
Object rv = null;
for (int i = 0; i < sub_msgs_len; i++) {
GfoMsg sub_msg = root_msg.Subs_getAt(i);
@@ -67,7 +67,7 @@ public class Xoa_gfs_mgr implements GfoInvkAble, GfoInvkRootWkr {
}
return rv;
} catch (Exception e) {
Gfo_usr_dlg_._.Warn_many("", "", "error while executing script: err=~{0}", Err_.Message_gplx(e));
Gfo_usr_dlg_.I.Warn_many("", "", "error while executing script: err=~{0}", Err_.Message_gplx(e));
return GfoInvkAble_.Rv_error;
}
}
@@ -120,7 +120,7 @@ class Xoa_gfs_mgr_ {
if (!Io_mgr._.ExistsFil(dflt_url)) return; // no dflt
if (!Io_mgr._.ExistsFil(orig_url)) {
Io_mgr._.CopyFil(dflt_url, orig_url, true);
Gfo_usr_dlg_._.Log_many("", "", "xowa_cfg_os generated; url=~{0}", orig_url.Raw());
Gfo_usr_dlg_.I.Log_many("", "", "xowa_cfg_os generated; url=~{0}", orig_url.Raw());
}
}
}

View File

@@ -15,7 +15,7 @@ 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.bldrs.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*;
package gplx.xowa.bldrs; import gplx.*; import gplx.xowa.*;
public class Db_idx_mode {
private int tid;
Db_idx_mode(int tid) {this.tid = tid;}

View File

@@ -17,17 +17,18 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.bldrs; import gplx.*; import gplx.xowa.*;
import gplx.core.primitives.*; import gplx.core.strings.*;
import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.xowa.dbs.*; import gplx.xowa.specials.search.*; import gplx.xowa.ctgs.*; import gplx.xowa.dbs.tbls.*;
import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.xowa.dbs.*; import gplx.xowa.specials.search.*; import gplx.xowa.ctgs.*;
import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.bldrs.infos.*;
public class Db_mgr_fxt {
public Db_mgr_fxt Ctor_fsys() {bldr_fxt = new Xob_fxt().Ctor(Xoa_test_.Url_root().GenSubDir("root")); return this;}
public Db_mgr_fxt Ctor_mem() {bldr_fxt = new Xob_fxt().Ctor_mem(); return this;} private Xob_fxt bldr_fxt;
public Xodb_page page_(int id, String modified_on, boolean type_redirect, int text_len) {return new Xodb_page().Id_(id).Modified_on_(DateAdp_.parse_gplx(modified_on)).Redirected_(type_redirect).Wtxt_len_(text_len);}
public Xowd_page_itm page_(int id, String modified_on, boolean type_redirect, int text_len) {return new Xowd_page_itm().Id_(id).Modified_on_(DateAdp_.parse_gplx(modified_on)).Redirected_(type_redirect).Text_len_(text_len);}
public Xowe_wiki Wiki() {return bldr_fxt.Wiki();}
public Xob_bldr Bldr() {return bldr_fxt.Bldr();}
public Db_mgr_fxt doc_ary_(Xodb_page... v) {bldr_fxt.doc_ary_(v); return this;}
public Xodb_page doc_(int id, String date, String title, String text) {return bldr_fxt.doc_(id, date, title, text);}
public Xodb_page doc_wo_date_(int id, String title, String text) {return bldr_fxt.doc_(id, "2012-01-02 03:04", title, text);}
public Xodb_page doc_ttl_(int id, String title) {return bldr_fxt.doc_(id, "2012-01-02 03:04", title, "IGNORE");}
public Db_mgr_fxt doc_ary_(Xowd_page_itm... v) {bldr_fxt.doc_ary_(v); return this;}
public Xowd_page_itm doc_(int id, String date, String title, String text) {return bldr_fxt.doc_(id, date, title, text);}
public Xowd_page_itm doc_wo_date_(int id, String title, String text) {return bldr_fxt.doc_(id, "2012-01-02 03:04", title, text);}
public Xowd_page_itm doc_ttl_(int id, String title) {return bldr_fxt.doc_(id, "2012-01-02 03:04", title, "IGNORE");}
public Db_mgr_fxt Init_fil(String url, String raw) {return Init_fil(Io_url_.new_fil_(url), raw);}
public Db_mgr_fxt Init_fil(Io_url url, String raw) {Io_mgr._.SaveFilStr(url, raw); return this;}
public Db_mgr_fxt Exec_run(Xobd_wkr wkr) {bldr_fxt.Run(wkr); return this;}
@@ -35,21 +36,19 @@ public class Db_mgr_fxt {
public Db_mgr_fxt Exec_run(Xobd_parser_wkr wkr) {bldr_fxt.Run(wkr); return this;}
public void Init_page_insert(Int_obj_ref page_id_next, int ns_id, String[] ttls) {
Xowe_wiki wiki = this.Wiki();
Xodb_page_tbl tbl_page = wiki.Db_mgr_as_sql().Tbl_page();
Db_stmt stmt = Db_stmt_.Null;
try {
stmt = tbl_page.Insert_stmt(wiki.Db_mgr_as_sql().Core_data_mgr().Conn_page());
int len = ttls.length;
DateAdp modified_on = Tfds.Now_time0_add_min(0);
for (int i = 0; i < len; i++) {
String ttl = ttls[i];
int page_id = page_id_next.Val();
tbl_page.Insert(stmt, page_id, ns_id, Bry_.new_utf8_(ttl), false, modified_on, 0, page_id, 0, 0);
page_id_next.Val_add(1);
}
} finally {stmt.Rls();}
int len = ttls.length;
DateAdp modified_on = Tfds.Now_time0_add_min(0);
Xowd_page_tbl tbl_page = wiki.Db_mgr_as_sql().Core_data_mgr().Tbl__page();
tbl_page.Insert_bgn();
for (int i = 0; i < len; i++) {
String ttl = ttls[i];
int page_id = page_id_next.Val();
tbl_page.Insert_cmd_by_batch(page_id, ns_id, Bry_.new_utf8_(ttl), false, modified_on, 0, page_id, 0, 0);
page_id_next.Val_add(1);
}
tbl_page.Insert_end();
}
public void Test_load_ttl(int ns_id, String ttl_str, Xodb_page expd) {
public void Test_load_ttl(int ns_id, String ttl_str, Xowd_page_itm expd) {
Xowe_wiki wiki = bldr_fxt.Wiki();
Xow_ns ns = wiki.Ns_mgr().Ids_get_or_null(ns_id);
byte[] ttl_bry = Bry_.new_ascii_(ttl_str);
@@ -57,13 +56,13 @@ public class Db_mgr_fxt {
Tfds.Eq(expd.Id(), actl.Id());
Tfds.Eq_date(expd.Modified_on(), actl.Modified_on());
Tfds.Eq(expd.Redirected(), actl.Redirected());
Tfds.Eq(expd.Wtxt_len(), actl.Wtxt_len());
} private Xodb_page actl = new Xodb_page();
Tfds.Eq(expd.Text_len(), actl.Text_len());
} private Xowd_page_itm actl = new Xowd_page_itm();
public void Test_load_page(int ns_id, int page_id, String expd) {
Xowe_wiki wiki = bldr_fxt.Wiki();
Xow_ns ns = wiki.Ns_mgr().Ids_get_or_null(ns_id);
wiki.Db_mgr_as_sql().Load_mgr().Load_page(actl.Id_(page_id), ns, false);
Tfds.Eq(expd, String_.new_ascii_(actl.Wtxt()));
Tfds.Eq(expd, String_.new_ascii_(actl.Text()));
}
public void Test_search(String search_word_str, int... expd) {
Xowe_wiki wiki = bldr_fxt.Wiki();
@@ -76,7 +75,7 @@ public class Db_mgr_fxt {
int len = rslts.Count();
int[] rv = new int[len];
for (int i = 0; i < len; i++) {
Xodb_page page = (Xodb_page)rslts.FetchAt(i);
Xowd_page_itm page = (Xowd_page_itm)rslts.FetchAt(i);
rv[i] = page.Id();
}
return rv;
@@ -125,23 +124,15 @@ public class Db_mgr_fxt {
}
return (int[])list.Xto_ary_and_clear(int.class);
}
public void Init_db_sqlite() {Init_db_sqlite(Xoa_test_.Url_wiki_enwiki().GenSubFil_nest("en.wikipedia.org.sqlite3"));}
public void Init_db_sqlite(Io_url url) {
public void Init_db_sqlite() {
Xowe_wiki wiki = this.Wiki();
Db_conn_pool.I.Clear();
Xodb_mgr_sql db_mgr = wiki.Db_mgr_create_as_sql();
db_mgr.Data_storage_format_(gplx.ios.Io_stream_.Tid_file);
db_mgr.Init_by_ns_map("");
Db_conn conn = db_mgr.Core_data_mgr().Conn_core();
conn.Exec_qry(Db_qry_delete.new_all_("xowa_cfg"));
conn.Exec_qry(Db_qry_delete.new_all_("xowa_db"));
conn.Exec_qry(Db_qry_delete.new_all_("xowa_ns"));
conn.Exec_qry(Db_qry_delete.new_all_("page"));
conn.Exec_qry(Db_qry_delete.new_all_("text"));
conn.Exec_qry(Db_qry_delete.new_all_("category"));
conn.Exec_qry(Db_qry_delete.new_all_("categorylinks"));
Db_conn_bldr.I.Reg_default_sqlite();
Io_mgr._.DeleteDir_cmd(wiki.Fsys_mgr().Root_dir()).MissingIgnored_().Exec();
wiki.Db_mgr_create_as_sql().Core_data_mgr().Init_by_make(Xowd_core_db_props.Test, Xob_info_session.Test);
Io_mgr._.SaveFilStr(wiki.Import_cfg().Src_dir().GenSubFil("a.xml"), "<test/>");
}
public void Rls() {
this.Wiki().Db_mgr().Rls();
this.Wiki().Db_mgr_as_sql().Core_data_mgr().Rls();
}
}

View File

@@ -16,7 +16,7 @@ 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.bldrs; import gplx.*; import gplx.xowa.*;
import gplx.ios.*; import gplx.xowa.bldrs.*;
import gplx.ios.*; import gplx.xowa.bldrs.*; import gplx.xowa.wikis.data.tbls.*;
public class Xob_base_fxt {
public Xob_base_fxt Clear() {
if (app == null) {
@@ -34,8 +34,8 @@ public class Xob_base_fxt {
public Xob_bldr Bldr() {return bldr;} private Xob_bldr bldr;
public Xowe_wiki Wiki() {return wiki;} private Xowe_wiki wiki;
public GfoInvkAble Bldr_itm() {return bldr_itm;} GfoInvkAble bldr_itm;
public Xodb_page page_(String ttl) {return page_(ttl, "");}
public Xodb_page page_(String ttl, String text) {return new Xodb_page().Ttl_(Bry_.new_utf8_(ttl), wiki.Ns_mgr()).Wtxt_(Bry_.new_utf8_(text));}
public Xowd_page_itm page_(String ttl) {return page_(ttl, "");}
public Xowd_page_itm page_(String ttl, String text) {return new Xowd_page_itm().Ttl_(Bry_.new_utf8_(ttl), wiki.Ns_mgr()).Text_(Bry_.new_utf8_(text));}
public Io_fil_chkr meta_(String url, String data) {return new Io_fil_chkr(Io_url_.mem_fil_(url), data);}
public void Init_fxts(Xob_bldr bldr, Xowe_wiki wiki, Xob_base_fxt... fxt_ary) {
int fxt_ary_len = fxt_ary.length;
@@ -66,11 +66,11 @@ public class Xob_base_fxt {
cmd.Cmd_run();
cmd.Cmd_end();
}
public static void Run_wkr(Xob_bldr bldr, Xobd_wkr wkr, Xodb_page[] page_ary) {
public static void Run_wkr(Xob_bldr bldr, Xobd_wkr wkr, Xowd_page_itm[] page_ary) {
wkr.Wkr_bgn(bldr);
int page_ary_len = page_ary.length;
for (int i = 0; i < page_ary_len; i++) {
Xodb_page page = page_ary[i];
Xowd_page_itm page = page_ary[i];
wkr.Wkr_run(page);
}
wkr.Wkr_end();

View File

@@ -18,9 +18,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.bldrs; import gplx.*; import gplx.xowa.*;
public interface Xob_cmd extends GfoInvkAble {
String Cmd_key();
void Cmd_ini(Xob_bldr bldr);
void Cmd_init(Xob_bldr bldr);
void Cmd_bgn(Xob_bldr bldr);
void Cmd_run();
void Cmd_end();
void Cmd_print();
void Cmd_term();
}

View File

@@ -0,0 +1,73 @@
/*
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.bldrs; import gplx.*; import gplx.xowa.*;
public class Xob_cmd_keys {
public static final String
Key_text_init = "text.init" // "import.sql.init"
, Key_text_page = "text.page" // "import.sql.page"
, Key_text_css = "text.css"
, Key_text_search_cmd = "text.search.cmd" // "import.sql.search_title.cmd"
, Key_text_search_wkr = "text.search" // "import.sql.search_title.wkr"
, Key_text_cat_core_v1 = "text.cat.core.v1" // "import.sql.category_v1"
, Key_text_cat_core = "text.cat.core" // "import.sql.category_registry"
, Key_text_cat_link = "text.cat.link" // "import.sql.categorylinks"
, Key_text_cat_hidden = "text.cat.hidden" // "import.sql.hiddencat"
, Key_text_term = "text.term" // "import.sql.term"
, Key_wiki_redirect = "wiki.redirect" // "wiki.redirect"
, Key_wiki_image = "wiki.image" // "wiki.image"
, Key_wiki_page_dump_make = "wiki.page_dump.make" // "file.page_dump"
, Key_wiki_page_dump_drop = "wiki.page_dump.drop"
, Key_file_lnki_temp = "file.lnki_temp"
, Key_file_lnki_regy = "file.lnki_regy"
, Key_file_page_regy = "file.page_regy"
, Key_file_orig_regy = "file.orig_regy"
, Key_file_xfer_temp_thumb = "file.xfer_temp.thumb"
, Key_file_xfer_temp_orig = "file.xfer_temp.orig"
, Key_file_xfer_regy = "file.xfer_regy"
, Key_file_xfer_regy_update = "file.xfer_regy_update"
, Key_file_fsdb_make = "file.fsdb_make"
, Key_file_orig_reg = "file.orig_reg"
, Key_file_xfer_update = "file.xfer_update"
, Key_html_redlinks = "html.redlinks"
, Key_util_cleanup = "util.cleanup" // "core.cleanup"
, Key_util_download = "util.download" // "file.download"
, Key_wbase_qid = "wbase.qid" // "text.wdata.qid"
, Key_wbase_pid = "wbase.pid" // "text.wdata.pid"
, Key_wbase_db = "wbase.db" // "wiki.wdata_db"
, Key_tdb_text_init = "tdb.text.init" // "core.init"
, Key_tdb_make_page = "tdb.text.page" // "core.make_page"
, Key_tdb_make_id = "core.make_id"
, Key_tdb_make_search_title = "core.make_search_title"
, Key_tdb_make_category = "core.make_category"
, Key_tdb_calc_stats = "core.calc_stats"
, Key_tdb_core_term = "tdb.text.term" // "core.term"
, Key_tdb_text_cat_link = "ctg.link_sql"
, Key_tdb_ctg_link_idx = "ctg.link_idx"
, Key_tdb_cat_hidden_sql = "ctg.hiddencat_sql"
, Key_tdb_cat_hidden_ttl = "ctg.hiddencat_ttl"
, Key_tdb_text_wdata_qid = "tdb.text.wdata.qid"
, Key_tdb_text_wdata_pid = "tdb.text.wdata.pid"
, Key_diff_regy_exec = "file.diff_regy.exec"
, Key_diff_regy_make = "file.diff_regy.make"
, Key_exec_sql = "import.sql.exec_sql"
, Key_deploy_zip = "deploy.zip"
, Key_deploy_copy = "deploy.copy"
, Key_decompress_bz2 = "core.decompress_bz2"
;
}

View File

@@ -17,10 +17,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.bldrs; import gplx.*; import gplx.xowa.*;
import gplx.core.primitives.*;
import gplx.xowa.wikis.*; import gplx.xowa.xtns.wdatas.imports.*; import gplx.xowa.bldrs.imports.ctgs.*; import gplx.xowa.bldrs.imports.*; import gplx.xowa.bldrs.oimgs.*;
import gplx.xowa.bldrs.wikis.redirects.*; import gplx.xowa.bldrs.wikis.images.*;
import gplx.xowa.bldrs.files.*; import gplx.xowa.files.origs.*;
import gplx.xowa.html.hdumps.bldrs.*;
import gplx.xowa.wikis.*; import gplx.xowa.xtns.wdatas.imports.*;
import gplx.xowa.bldrs.cmds.texts.*; import gplx.xowa.bldrs.cmds.texts.sqls.*; import gplx.xowa.bldrs.cmds.texts.tdbs.*; import gplx.xowa.bldrs.cmds.files.*; import gplx.xowa.bldrs.cmds.ctgs.*; import gplx.xowa.bldrs.cmds.utils.*; import gplx.xowa.bldrs.cmds.wikis.*;
import gplx.xowa.files.origs.*; import gplx.xowa.html.hdumps.bldrs.*;
public class Xob_cmd_mgr implements GfoInvkAble {
public Xob_cmd_mgr(Xob_bldr bldr) {this.bldr = bldr;} private Xob_bldr bldr;
public void Clear() {list.Clear(); dump_rdrs.Clear();}
@@ -28,57 +27,57 @@ public class Xob_cmd_mgr implements GfoInvkAble {
public Xob_cmd Get_at(int i) {return (Xob_cmd)list.FetchAt(i);}
public Xob_cmd Add(Xob_cmd cmd) {list.Add(cmd); return cmd;}
public GfoInvkAble Add_cmd(Xowe_wiki wiki, String cmd_key) {
if (String_.Eq(cmd_key, Xob_init_txt.KEY)) return Add(new Xob_init_txt(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_init_sql.KEY)) return Add(new Xob_init_sql(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_term_txt.KEY)) return Add(new Xob_term_txt(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_term_sql.KEY)) return Add(new Xob_term_sql(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_page_sql.KEY)) return Xml_rdr_direct_add(wiki, new Xob_page_sql(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_page_txt.KEY)) return Xml_rdr_direct_add(wiki, new Xob_page_txt(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_search_txt.KEY)) return Xml_rdr_direct_add(wiki, new Xob_search_txt(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_ctg_v1_txt.KEY)) return Xml_rdr_parser_add(wiki, new Xob_ctg_v1_txt().Ctor(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_ctg_v1_sql.KEY)) return Xml_rdr_parser_add(wiki, new Xob_ctg_v1_sql().Ctor(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_categorylinks_txt.KEY)) return Add(new Xob_categorylinks_txt(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_categorylinks_sql.KEY)) return Add(new Xob_categorylinks_sql(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_wdata_qid_txt.KEY)) return Xml_rdr_direct_add(wiki, new Xob_wdata_qid_txt().Ctor(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_wdata_qid_sql.KEY)) return Xml_rdr_direct_add(wiki, new Xob_wdata_qid_sql().Ctor(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_wdata_pid_txt.KEY)) return Xml_rdr_direct_add(wiki, new Xob_wdata_pid_txt().Ctor(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_wdata_pid_sql.KEY)) return Xml_rdr_direct_add(wiki, new Xob_wdata_pid_sql().Ctor(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_search_sql_wkr.KEY)) return Xml_rdr_direct_add(wiki, new Xob_search_sql_wkr(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_search_sql_cmd.KEY_search_sql)) return Add(new Xob_search_sql_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_category_registry_sql.KEY)) return Add(new Xob_category_registry_sql(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_lnki_temp_wkr.KEY_oimg)) return Add(new Xob_lnki_temp_wkr(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_lnki_regy_cmd.KEY_oimg)) return Add(new Xob_lnki_regy_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_text_db_prep.KEY_oimg)) return Add(new Xob_text_db_prep(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_orig_regy_cmd.KEY_oimg)) return Add(new Xob_orig_regy_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_xfer_temp_cmd_thumb.KEY_oimg)) return Add(new Xob_xfer_temp_cmd_thumb(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_xfer_temp_cmd_orig.KEY_oimg)) return Add(new Xob_xfer_temp_cmd_orig(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_xfer_regy_cmd.KEY_oimg)) return Add(new Xob_xfer_regy_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_xfer_regy_update_cmd.KEY_oimg)) return Add(new Xob_xfer_regy_update_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_xfer_update_cmd.KEY_oimg)) return Add(new Xob_xfer_update_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_diff_regy_exec_cmd.KEY_oimg)) return Add(new Xob_diff_regy_exec_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_diff_regy_make_cmd.KEY_oimg)) return Add(new Xob_diff_regy_make_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_orig_tbl_bldr.KEY_oimg)) return Add(new Xob_orig_tbl_bldr(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_download_wkr.KEY_oimg)) return Add(new Xob_download_wkr(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_page_regy_cmd.KEY_oimg)) return Add(new Xob_page_regy_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_exec_sql.KEY)) return Add(new Xob_cmd_exec_sql(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_rl_regy_cmd.Cmd_key_const)) return Add(new Xob_rl_regy_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_redirect_cmd.KEY_redirect)) return Add(new Xob_redirect_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_wiki_image_sql.KEY)) return Add(new Xob_wiki_image_sql(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_fsdb_make.KEY_oimg)) return Add(new Xob_fsdb_make(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_wdata_db_cmd.KEY_oimg)) return Add(new Xob_wdata_db_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xoctg_link_idx_wkr.KEY)) return Add(new Xoctg_link_idx_wkr(bldr, wiki));
else if (String_.Eq(cmd_key, Xoctg_hiddencat_parser_sql.KEY)) return Add(new Xoctg_hiddencat_parser_sql(bldr, wiki));
else if (String_.Eq(cmd_key, Xoctg_hiddencat_parser_txt.KEY)) return Add(new Xoctg_hiddencat_parser_txt(bldr, wiki));
else if (String_.Eq(cmd_key, Xoctg_hiddencat_ttl_wkr.KEY)) return Add(new Xoctg_hiddencat_ttl_wkr(bldr, wiki));
else if (String_.Eq(cmd_key, Xobc_core_make_id.KEY)) return Xml_rdr_direct_add(wiki, new Xobc_core_make_id(bldr, wiki));
else if (String_.Eq(cmd_key, Xobc_core_calc_stats.KEY)) return Add(new Xobc_core_calc_stats(bldr, wiki));
else if (String_.Eq(cmd_key, Xobc_core_cleanup.KEY)) return Add(new Xobc_core_cleanup(bldr, wiki));
else if (String_.Eq(cmd_key, Xobc_core_decompress_bz.KEY)) return Add(new Xobc_core_decompress_bz(bldr, wiki));
else if (String_.Eq(cmd_key, Xobc_deploy_zip.KEY)) return Add(new Xobc_deploy_zip(bldr, wiki));
else if (String_.Eq(cmd_key, Xobc_deploy_copy.KEY)) return Add(new Xobc_deploy_copy(bldr, wiki));
else throw Err_.unhandled(cmd_key);
if (String_.Eq(cmd_key, Xob_cmd_keys.Key_text_init)) return Add(new Xob_init_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_text_page)) return Xml_rdr_direct_add(wiki, new Xob_page_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_text_css)) return Add(new Xob_css_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_text_search_wkr)) return Xml_rdr_direct_add(wiki, new Xob_search_sql_wkr(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_text_search_cmd)) return Add(new Xob_search_sql_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_text_cat_core_v1)) return Xml_rdr_parser_add(wiki, new Xob_ctg_v1_sql().Ctor(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_text_cat_core)) return Add(new Xob_category_registry_sql(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_text_cat_link)) return Add(new Xob_categorylinks_sql(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_text_cat_hidden)) return Add(new Xoctg_hiddencat_parser_sql(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_text_term)) return Add(new Xob_term_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_wiki_page_dump_make)) return Add(new Xob_page_dump_cmd_make(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_wiki_page_dump_drop)) return Add(new Xob_page_dump_cmd_drop(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_wiki_redirect)) return Add(new Xob_redirect_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_wiki_image)) return Add(new Xob_image_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_file_lnki_temp)) return Add(new Xob_lnki_temp_wkr(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_file_lnki_regy)) return Add(new Xob_lnki_regy_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_file_page_regy)) return Add(new Xob_page_regy_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_file_orig_regy)) return Add(new Xob_orig_regy_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_file_xfer_temp_thumb)) return Add(new Xob_xfer_temp_cmd_thumb(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_file_xfer_temp_orig)) return Add(new Xob_xfer_temp_cmd_orig(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_file_xfer_regy)) return Add(new Xob_xfer_regy_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_file_xfer_regy_update)) return Add(new Xob_xfer_regy_update_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_file_fsdb_make)) return Add(new Xob_fsdb_make_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_file_orig_reg)) return Add(new Xob_orig_tbl_bldr(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_file_xfer_update)) return Add(new Xob_xfer_update_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_html_redlinks)) return Add(new Xob_redlink_mkr_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_util_cleanup)) return Add(new Xob_cleanup_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_util_download)) return Add(new Xob_download_wkr(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_wbase_qid)) return Xml_rdr_direct_add(wiki, new Xob_wdata_qid_sql().Ctor(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_wbase_pid)) return Xml_rdr_direct_add(wiki, new Xob_wdata_pid_sql().Ctor(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_wbase_db)) return Add(new Xob_wdata_db_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_tdb_text_init)) return Add(new Xob_init_tdb(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_tdb_make_page)) return Xml_rdr_direct_add(wiki, new Xob_page_txt(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_tdb_make_id)) return Xml_rdr_direct_add(wiki, new Xob_make_id_wkr(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_tdb_make_search_title)) return Xml_rdr_direct_add(wiki, new Xob_search_tdb(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_tdb_make_category)) return Xml_rdr_parser_add(wiki, new Xob_ctg_v1_txt().Ctor(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_tdb_calc_stats)) return Add(new Xob_calc_stats_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_tdb_text_cat_link)) return Add(new Xob_categorylinks_txt(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_tdb_ctg_link_idx)) return Add(new Xoctg_link_idx_wkr(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_tdb_cat_hidden_sql)) return Add(new Xoctg_hiddencat_parser_txt(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_tdb_cat_hidden_ttl)) return Add(new Xoctg_hiddencat_ttl_wkr(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_tdb_core_term)) return Add(new Xob_term_txt(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_tdb_text_wdata_qid)) return Xml_rdr_direct_add(wiki, new Xob_wdata_qid_txt().Ctor(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_tdb_text_wdata_pid)) return Xml_rdr_direct_add(wiki, new Xob_wdata_pid_txt().Ctor(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_diff_regy_exec)) return Add(new Xob_diff_regy_exec_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_diff_regy_make)) return Add(new Xob_diff_regy_make_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_exec_sql)) return Add(new Xob_exec_sql_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_decompress_bz2)) return Add(new Xob_decompress_bz2_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_deploy_zip)) return Add(new Xob_deploy_zip_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_deploy_copy)) return Add(new Xob_deploy_copy_cmd(bldr, wiki));
else throw Err_.unhandled(cmd_key);
}
private Xobd_wkr Xml_rdr_direct_add(Xowe_wiki wiki, Xobd_wkr wkr) {
Xobd_rdr dump_rdr = Xml_rdr_get(wiki);
@@ -105,7 +104,7 @@ public class Xob_cmd_mgr implements GfoInvkAble {
if (ctx.Match(k, Invk_add)) return Add_cmd(Wiki_get_or_make(m), m.ReadStr("v"));
else if (ctx.Match(k, Invk_add_many)) return Add_many(m);
else if (ctx.Match(k, Invk_get_first)) return Get_first(m);
else if (ctx.Match(k, Invk_new_batch)) return new Xobc_core_batch(bldr, m.ReadBry("v"));
else if (ctx.Match(k, Invk_new_batch)) return new Xob_core_batch_utl(bldr, m.ReadBry("v"));
else return GfoInvkAble_.Rv_unhandled;
}
private static final String Invk_add = "add", Invk_add_many = "add_many", Invk_new_batch = "new_batch", Invk_get_first = "get_first";

View File

@@ -0,0 +1,48 @@
/*
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.bldrs; import gplx.*; import gplx.xowa.*;
import gplx.dbs.*; import gplx.dbs.cfgs.*;
public class Xob_db_file {
Xob_db_file(Io_url url, Db_conn conn) {
this.url = url; this.conn = conn;
this.tbl__cfg = new Db_cfg_tbl(conn, "xowa_cfg");
}
public Io_url Url() {return url;} private final Io_url url;
public Db_conn Conn() {return conn;} private final Db_conn conn;
public Db_cfg_tbl Tbl__cfg() {return tbl__cfg;} private final Db_cfg_tbl tbl__cfg;
public static Xob_db_file new__file_make(Io_url dir) {return new_(dir, Name__file_make);}
public static Xob_db_file new__page_regy(Io_url dir) {return new_(dir, Name__page_regy);}
public static Xob_db_file new__wiki_image(Io_url dir) {return new_(dir, Name__wiki_image);}
public static Xob_db_file new__wiki_redirect(Io_url dir) {return new_(dir, Name__wiki_redirect);}
public static Xob_db_file new__temp_log(Io_url dir) {return new_(dir, Name__temp_log);}
public static Xob_db_file new_(Io_url dir, String name) {
Io_url url = dir.GenSubFil(name);
Db_conn_bldr_data conn_data = Db_conn_bldr.I.Get_or_new(url);
Db_conn conn = conn_data.Conn();
Xob_db_file rv = new Xob_db_file(url, conn);
if (conn_data.Created())
rv.Tbl__cfg().Create_tbl();
return rv;
}
public static final String
Name__wiki_image = "xowa.wiki.image.sqlite3", Name__wiki_redirect = "xowa.wiki.redirect.sqlite3"
, Name__file_make = "xowa.file.make.sqlite3", Name__temp_log = "xowa.temp.log.sqlite3"
, Name__page_regy = "xowa.file.page_regy.sqlite3"
;
}

View File

@@ -16,13 +16,14 @@ 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.bldrs; import gplx.*; import gplx.xowa.*;
import gplx.ios.*; import gplx.xowa.tdbs.*;
import gplx.ios.*; import gplx.dbs.*; import gplx.xowa.tdbs.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.bldrs.cmds.texts.tdbs.*;
public class Xob_fxt {
public Xob_fxt Ctor_mem() {
Io_mgr._.InitEngine_mem();
return Ctor(Io_url_.mem_dir_("mem/xowa/"));
}
public Xob_fxt Ctor(Io_url root_dir) {
Db_conn_bldr.I.Reg_default_sqlite();
app = Xoa_app_fxt.app_("linux", root_dir);
wiki = Xoa_app_fxt.wiki_tst_(app);
bldr = Xoa_app_fxt.bldr_(app);
@@ -38,7 +39,7 @@ public class Xob_fxt {
public Io_url fil_site_ctg(int idx) {return wiki.Tdb_fsys_mgr().Url_site_fil(Xotdb_dir_info_.Tid_category, idx);}
public Io_url fil_site_id(int idx) {return wiki.Tdb_fsys_mgr().Url_site_fil(Xotdb_dir_info_.Tid_id, idx);}
public Io_url fil_reg(byte tid) {return wiki.Tdb_fsys_mgr().Url_site_reg(tid);}
public Io_url fil_reg(int ns_id, byte tid) {return wiki.Tdb_fsys_mgr().Url_ns_reg(Int_.Xto_str_pad_bgn(ns_id, 3), tid);}
public Io_url fil_reg(int ns_id, byte tid) {return wiki.Tdb_fsys_mgr().Url_ns_reg(Int_.Xto_str_pad_bgn_zero(ns_id, 3), tid);}
public Xob_fxt Fil_expd(Io_url url, String... expd) {
String text = String_.Concat_lines_nl_skip_last(expd); // skipLast b/c if trailing line wanted, easier to pass in extra argument for ""
expd_list.Add(new Io_fil_chkr(url, text));
@@ -49,10 +50,10 @@ public class Xob_fxt {
skip_list.Add(urls[i]);
return this;
} ListAdp skip_list = ListAdp_.new_();
public Xob_fxt doc_ary_(Xodb_page... v) {doc_ary = v; return this;} private Xodb_page[] doc_ary;
public Xodb_page doc_wo_date_(int id, String title, String text) {return doc_(id, "2012-01-02 13:14", title, text);}
public Xodb_page doc_(int id, String date, String title, String text) {
Xodb_page rv = new Xodb_page().Id_(id).Ttl_(Bry_.new_utf8_(title), wiki.Ns_mgr()).Wtxt_(Bry_.new_utf8_(text));
public Xob_fxt doc_ary_(Xowd_page_itm... v) {doc_ary = v; return this;} private Xowd_page_itm[] doc_ary;
public Xowd_page_itm doc_wo_date_(int id, String title, String text) {return doc_(id, "2012-01-02 13:14", title, text);}
public Xowd_page_itm doc_(int id, String date, String title, String text) {
Xowd_page_itm rv = new Xowd_page_itm().Id_(id).Ttl_(Bry_.new_utf8_(title), wiki.Ns_mgr()).Text_(Bry_.new_utf8_(text));
int[] modified_on = new int[7];
dateParser.Parse_iso8651_like(modified_on, date);
rv.Modified_on_(DateAdp_.seg_(modified_on));
@@ -60,21 +61,21 @@ public class Xob_fxt {
}
public Xob_fxt Run_ctg() {
Xobd_parser parser = new Xobd_parser();
gplx.xowa.bldrs.imports.ctgs.Xob_ctg_v1_base ctg_wkr = new gplx.xowa.bldrs.imports.ctgs.Xob_ctg_v1_txt().Ctor(bldr, wiki);
gplx.xowa.bldrs.cmds.ctgs.Xob_ctg_v1_base ctg_wkr = new gplx.xowa.bldrs.cmds.ctgs.Xob_ctg_v1_txt().Ctor(bldr, wiki);
byte[] bry = Bry_.new_utf8_("[[Category:");
ctg_wkr.Wkr_hooks().Add(bry, bry);
parser.Wkr_add(ctg_wkr);
return Run(parser);
}
public Xob_fxt Run_id() {
gplx.xowa.bldrs.imports.Xobc_core_make_id wkr = new gplx.xowa.bldrs.imports.Xobc_core_make_id(bldr, wiki);
Xob_make_id_wkr wkr = new Xob_make_id_wkr(bldr, wiki);
Run(wkr);
return this;
}
private void Run_wkr(Xobd_wkr wkr) {
wkr.Wkr_bgn(bldr);
for (int i = 0; i < doc_ary.length; i++) {
Xodb_page page = doc_ary[i];
Xowd_page_itm page = doc_ary[i];
wkr.Wkr_run(page);
}
wkr.Wkr_end();
@@ -95,12 +96,12 @@ public class Xob_fxt {
return rv;
}
public Xob_fxt Run_tmpl_dump() {
Xobc_parse_dump_templates wkr = new Xobc_parse_dump_templates(bldr, wiki);
Xob_parse_dump_templates_cmd wkr = new Xob_parse_dump_templates_cmd(bldr, wiki);
Run_wkr(wkr);
tst_fils(wkr.Dump_url_gen().Prv_urls());
return this;
}
public Xob_fxt Run_page_title() {return Run(new gplx.xowa.bldrs.imports.Xob_page_txt(bldr, wiki));}
public Xob_fxt Run_page_title() {return Run(new gplx.xowa.bldrs.cmds.texts.tdbs.Xob_page_txt(bldr, wiki));}
public Xob_fxt Run(Xobd_parser_wkr... wkrs) {
Xobd_parser parser_wkr = new Xobd_parser();
int len = wkrs.length;
@@ -115,7 +116,7 @@ public class Xob_fxt {
Xobd_wkr wkr = wkrs[j];
wkr.Wkr_bgn(bldr);
for (int i = 0; i < doc_ary_len; i++) {
Xodb_page page = doc_ary[i];
Xowd_page_itm page = doc_ary[i];
wkr.Wkr_run(page);
}
wkr.Wkr_end();

View File

@@ -0,0 +1,88 @@
/*
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.bldrs; import gplx.*; import gplx.xowa.*;
import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.bldrs.cmds.*;
public class Xob_ns_to_db_mgr {
private final Xob_ns_to_db_wkr wkr; private final Xowd_db_mgr db_mgr; private final long db_max; private boolean one_file_conn_init = true;
private final OrderedHash db_list = OrderedHash_.new_();
public Xob_ns_to_db_mgr(Xob_ns_to_db_wkr wkr, Xowd_db_mgr db_mgr, long db_max) {
this.wkr = wkr; this.db_mgr = db_mgr; this.db_max = db_max;
}
public Xowd_db_file Get_by_ns(Xob_ns_file_itm ns_file_itm, int data_len) {
Xowd_db_file rv = null;
if (wkr.Db_tid() == Xowd_db_file_.Tid_text && db_mgr.Props().Layout_text().Tid_is_all_or_few()) {
rv = db_mgr.Db__core();
if (one_file_conn_init) {
one_file_conn_init = false;
Init_tbl(rv);
}
}
else if (wkr.Db_tid() == Xowd_db_file_.Tid_html_data && db_mgr.Props().Layout_html().Tid_is_all_or_few()) {
if (one_file_conn_init) {
one_file_conn_init = false;
rv = db_mgr.Dbs__make_by_tid(wkr.Db_tid());
Init_tbl(rv);
}
else
rv = db_mgr.Db__html();
}
else {
int db_id = ns_file_itm.Nth_db_id();
if (db_id == Xob_ns_file_itm.Nth_db_id_null) // ns not assigned yet to db
rv = Init_db(ns_file_itm);
else
rv = db_mgr.Dbs__get_at(db_id);
long file_len = rv.File_len();
if (file_len + data_len > db_max) { // file is "full"
Term_tbl(rv);
rv = Init_db(ns_file_itm);
}
}
rv.File_len_add(data_len);
return rv;
}
private Xowd_db_file Init_db(Xob_ns_file_itm ns_file_itm) {
Xowd_db_file rv = db_mgr.Dbs__make_by_tid(ns_file_itm.Db_file_tid(), Int_.Xto_str(ns_file_itm.Ns_ids(), "|"), ns_file_itm.Nth_db_idx(), ns_file_itm.Make_file_name());
ns_file_itm.Nth_db_id_(rv.Id());
Init_tbl(rv);
return rv;
}
private void Init_tbl(Xowd_db_file db) {
wkr.Tbl_init(db);
db_list.Add(db.Id(), db);
}
private void Term_tbl(Xowd_db_file db) {
wkr.Tbl_term(db);
db_list.Del(db.Id());
}
public void Rls_all() {
Xowd_db_file[] ary = (Xowd_db_file[])db_list.Xto_ary(Xowd_db_file.class);
int len = ary.length;
for (int i = 0; i < len; ++i) {
Xowd_db_file db = (Xowd_db_file)ary[i];
Term_tbl(db); // SQLITE:1_TXN; may call close on db where txn is already closed
}
}
public void Commit() {
int len = db_list.Count();
for (int i = 0; i < len; ++i) {
Xowd_db_file db = (Xowd_db_file)db_list.FetchAt(i);
db.Conn().Txn_sav();
}
}
}

View File

@@ -15,8 +15,10 @@ 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.wikis.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*;
public interface Xowd_db_init_db_wkr {
byte Db_tid();
Xowd_db_file Db_make(Xowe_core_data_mgr core_data_mgr);
package gplx.xowa.bldrs; import gplx.*; import gplx.xowa.*;
import gplx.xowa.wikis.data.*;
public interface Xob_ns_to_db_wkr {
byte Db_tid();
void Tbl_init(Xowd_db_file db);
void Tbl_term(Xowd_db_file db);
}

View File

@@ -15,12 +15,12 @@ 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.bldrs.oimgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*;
import gplx.dbs.*; import gplx.xowa.wikis.caches.*; import gplx.xowa.bldrs.files.*;
import gplx.xowa.wikis.data.*; import gplx.xowa.dbs.*; import gplx.xowa.dbs.tbls.*;
package gplx.xowa.bldrs.cmds; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*;
import gplx.dbs.*; import gplx.xowa.wikis.caches.*; import gplx.xowa.bldrs.cmds.files.*; import gplx.xowa.files.origs.*;
import gplx.xowa.wikis.data.*; import gplx.xowa.dbs.*; import gplx.xowa.wikis.data.tbls.*;
public abstract class Xob_dump_mgr_base extends Xob_itm_basic_base implements Xob_cmd, GfoInvkAble {
private Xob_dump_src_id page_src;
private Xowe_core_data_mgr db_fsys_mgr; protected Xop_parser parser; protected Xop_ctx ctx; protected Xop_root_tkn root;
private Xowd_db_mgr db_fsys_mgr; protected Xop_parser parser; protected Xop_ctx ctx; protected Xop_root_tkn root;
private int[] ns_ary; private Xowd_db_file[] db_ary;
private int ns_bgn = -1, db_bgn = -1, pg_bgn = -1;
private int ns_end = -1, db_end = -1, pg_end = Int_.MaxValue;
@@ -39,10 +39,11 @@ public abstract class Xob_dump_mgr_base extends Xob_itm_basic_base implements Xo
parser = wiki.Parser();
ctx = wiki.Ctx();
root = ctx.Tkn_mkr().Root(Bry_.Empty);
wiki.Init_assert(); // NOTE: must init wiki for db_mgr_as_sql
wiki.Db_mgr_as_sql().Init_load(Db_url_.sqlite_(Xodb_mgr_sql.Find_core_url(wiki))); // NOTE: must reinit providers as previous steps may have rls'd (and left member variable conn which is closed)
wiki.Init_assert(); // NOTE: must init wiki for db_mgr_as_sql
wiki.Db_mgr_as_sql().Core_data_mgr().Init_by_load(gplx.xowa.wikis.Xow_fsys_mgr.Find_core_fil(wiki)); // NOTE: must reinit providers as previous steps may have rls'd (and left member variable conn which is closed)
wiki.File_mgr__orig_mgr().Wkrs_del(Xof_orig_wkr_.Tid_wmf_api);
db_fsys_mgr = wiki.Db_mgr_as_sql().Core_data_mgr();
db_ary = Xob_dump_src_ttl.Init_text_files_ary(db_fsys_mgr);
db_ary = Xob_dump_mgr_base_.Init_text_files_ary(db_fsys_mgr);
poll_interval = poll_mgr.Poll_interval();
page_src = new Xob_dump_src_id().Init(wiki, this.Init_redirect(), select_size);
@@ -81,13 +82,13 @@ public abstract class Xob_dump_mgr_base extends Xob_itm_basic_base implements Xo
continue;
}
dump_bmk.Ns_id_(ns_id);
Exec_db_ary(dump_bmk, ns_id);
Exec_db_ary(i, dump_bmk, ns_id);
if (ns_id == ns_end) exit_now = true; // ns_end set; exit
if (exit_now) break; // exit_now b/c of pg_bgn, db_bgn or something else
}
Exec_commit(dump_bmk.Ns_id(), dump_bmk.Db_id(), dump_bmk.Pg_id(), Bry_.Empty);
}
private void Exec_db_ary(Xob_dump_bmk dump_bmk, int ns_id) {
private void Exec_db_ary(int ns_ord, Xob_dump_bmk dump_bmk, int ns_id) {
int db_ary_len = db_ary.length;
for (int i = 0; i < db_ary_len; i++) {
int db_id = db_ary[i].Id();
@@ -98,12 +99,12 @@ public abstract class Xob_dump_mgr_base extends Xob_itm_basic_base implements Xo
continue;
}
dump_bmk.Db_id_(db_id);
Exec_db_itm(dump_bmk, ns_id, db_id);
Exec_db_itm(dump_bmk, ns_ord, ns_id, db_id);
if (db_id == db_end) exit_now = true; // db_end set; exit;
if (exit_now) return; // exit_now b/c of pg_bgn, db_bgn or something else
}
}
private void Exec_db_itm(Xob_dump_bmk dump_bmk, int ns_id, int db_id) {
private void Exec_db_itm(Xob_dump_bmk dump_bmk, int ns_ord, int ns_id, int db_id) {
ListAdp pages = ListAdp_.new_();
Xow_ns ns = wiki.Ns_mgr().Ids_get_or_null(ns_id);
int pg_id = pg_bgn;
@@ -117,9 +118,9 @@ public abstract class Xob_dump_mgr_base extends Xob_itm_basic_base implements Xo
}
usr_dlg.Prog_many("", "", "fetched pages: ~{0}", pages_len);
for (int i = 0; i < pages_len; i++) {
Xodb_page page = (Xodb_page)pages.FetchAt(i);
Xowd_page_itm page = (Xowd_page_itm)pages.FetchAt(i);
dump_bmk.Pg_id_(pg_id);
Exec_pg_itm(ns, db_id, page);
Exec_pg_itm(ns_ord, ns, db_id, page);
if ( pg_id >= pg_end
|| exec_count >= exec_count_max) {
exit_now = true;
@@ -129,14 +130,14 @@ public abstract class Xob_dump_mgr_base extends Xob_itm_basic_base implements Xo
}
}
}
private void Exec_pg_itm(Xow_ns ns, int db_id, Xodb_page page) {
private void Exec_pg_itm(int ns_ord, Xow_ns ns, int db_id, Xowd_page_itm page) {
try {
if ((exec_count % progress_interval) == 0)
usr_dlg.Prog_many("", "", "parsing: ns=~{0} db=~{1} pg=~{2} count=~{3} time=~{4} rate=~{5} ttl=~{6}"
, ns.Id(), db_id, page.Id(), exec_count
, Env_.TickCount_elapsed_in_sec(time_bgn), rate_mgr.Rate_as_str(), String_.new_utf8_(page.Ttl_page_db()));
ctx.Clear();
Exec_pg_itm_hook(ns, page, page.Wtxt());
Exec_pg_itm_hook(ns_ord, ns, page, page.Text());
ctx.App().Utl__bfr_mkr().Clear_fail_check(); // make sure all bfrs are released
if (ctx.Wiki().Cache_mgr().Tmpl_result_cache().Count() > 50000)
ctx.Wiki().Cache_mgr().Tmpl_result_cache().Clear();
@@ -155,7 +156,7 @@ public abstract class Xob_dump_mgr_base extends Xob_itm_basic_base implements Xo
this.Free();
}
}
public abstract void Exec_pg_itm_hook(Xow_ns ns, Xodb_page page, byte[] page_text);
public abstract void Exec_pg_itm_hook(int ns_ord, Xow_ns ns, Xowd_page_itm page, byte[] page_text);
private void Exec_commit(int ns_id, int db_id, int pg_id, byte[] ttl) {
usr_dlg.Prog_many("", "", "committing: ns=~{0} db=~{1} pg=~{2} count=~{3} ttl=~{4}", ns_id, db_id, pg_id, exec_count, String_.new_utf8_(ttl));
Exec_commit_hook();
@@ -164,8 +165,8 @@ public abstract class Xob_dump_mgr_base extends Xob_itm_basic_base implements Xo
}
public abstract void Exec_commit_hook();
public abstract void Exec_end_hook();
public void Cmd_ini(Xob_bldr bldr) {}
public void Cmd_print() {}
public void Cmd_init(Xob_bldr bldr) {}
public void Cmd_term() {}
public void Cmd_end() {
if (!exit_now)
pg_bgn = Int_.MaxValue;
@@ -226,11 +227,11 @@ class Xob_dump_mgr_base_ {
page_src.Get_pages(pages, 0, Xow_ns_.Id_template, cur_page_id); // 0 is always template db
int page_count = pages.Count();
if (page_count == 0) break; // no more pages in db;
Xodb_page page = null;
Xowd_page_itm page = null;
for (int i = 0; i < page_count; i++) {
page = (Xodb_page)pages.FetchAt(i);
page = (Xowd_page_itm)pages.FetchAt(i);
Xot_defn_tmpl defn = new Xot_defn_tmpl();
defn.Init_by_new(ns_tmpl, ns_tmpl.Gen_ttl(page.Ttl_page_db()), page.Wtxt(), null, false); // NOTE: passing null, false; will be overriden later when Parse is called
defn.Init_by_new(ns_tmpl, ns_tmpl.Gen_ttl(page.Ttl_page_db()), page.Text(), null, false); // NOTE: passing null, false; will be overriden later when Parse is called
defn_cache.Add(defn, ns_tmpl.Case_match());
++load_count;
if ((load_count % 10000) == 0) usr_dlg.Prog_many("", "", "tmpl_loading: ~{0}", load_count);
@@ -239,6 +240,17 @@ class Xob_dump_mgr_base_ {
}
usr_dlg.Note_many("", "", "tmpl_load done: ~{0}", load_count);
}
public static Xowd_db_file[] Init_text_files_ary(Xowd_db_mgr core_data_mgr) {
ListAdp text_files_list = ListAdp_.new_();
int len = core_data_mgr.Dbs__len();
if (len == 1) return new Xowd_db_file[] {core_data_mgr.Dbs__get_at(0)}; // single file: return core; note that there are no Tid = Text
for (int i = 0; i < len; i++) {
Xowd_db_file file = core_data_mgr.Dbs__get_at(i);
if (file.Tid() == Xowd_db_file_.Tid_text)
text_files_list.Add(file);
}
return (Xowd_db_file[])text_files_list.Xto_ary_and_clear(Xowd_db_file.class);
}
}
class Xob_dump_bmk_mgr {
private Bry_bfr save_bfr = Bry_bfr.reset_(1024);

View File

@@ -0,0 +1,63 @@
/*
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.bldrs.cmds; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*;
import gplx.xowa.wikis.data.*;
public class Xob_ns_file_itm {
public Xob_ns_file_itm(byte db_file_tid, String file_name, int[] ns_ids) {
this.db_file_tid = db_file_tid; this.file_name = file_name; this.ns_ids = ns_ids;
this.nth_db_id = Nth_db_id_null; this.nth_db_idx = 1;
}
public byte Db_file_tid() {return db_file_tid;} private final byte db_file_tid;
public String File_name() {return file_name;} private final String file_name;
public int[] Ns_ids() {return ns_ids;} private final int[] ns_ids;
public int Nth_db_id() {return nth_db_id;} public void Nth_db_id_(int v) {nth_db_id = v;} private int nth_db_id;
public int Nth_db_idx() {return nth_db_idx;} private int nth_db_idx;
public String Make_file_name() { // EX: en.wikipedia.org-text-ns.000-001.xowa
String rv = String_.Format("-{0}{1}{2}.xowa" // EX: -text-ns.000-db.001.xowa
, Xowd_db_file_.To_key(db_file_tid) // text
, String_.Len_eq_0(file_name) ? "" : "-" + file_name // if empty, don't add "ns.000" segment; produces en.wikipedia.org-text-001.xowa
, nth_db_idx == 1 ? "" : "-db." + Int_.Xto_str_pad_bgn_zero(nth_db_idx, 3) // "-db.001"
);
++nth_db_idx;
return rv;
}
public static final int Nth_db_id_null = -1;
public static void Init_ns_bldr_data(byte db_file_tid, Xow_ns_mgr ns_mgr, byte[] ns_file_map) {
int ns_len = ns_mgr.Ords_len();
Xob_ns_file_itm ns_file_itm_default = new Xob_ns_file_itm(db_file_tid, "", null);
for (int i = 0; i < ns_len; ++i) {
Xow_ns ns = ns_mgr.Ords_get_at(i);
ns.Bldr_data_(ns_file_itm_default);
}
Xob_ns_file_itm_parser ns_itm_parser = new Xob_ns_file_itm_parser();
ns_itm_parser.Ctor(db_file_tid, ns_mgr);
Xob_ns_file_itm[] ns_itm_ary = ns_itm_parser.To_ary(ns_file_map);
int ns_itm_ary_len = ns_itm_ary.length;
for (int i = 0; i < ns_itm_ary_len; ++i) {
Xob_ns_file_itm itm = ns_itm_ary[i];
int[] ns_ids = itm.Ns_ids();
int ns_ids_len = ns_ids.length;
for (int j = 0; j < ns_ids_len; j++) {
int ns_id = ns_ids[j];
Xow_ns ns = ns_mgr.Ids_get_or_null(ns_id); if (ns == null) continue; // some dumps may not have ns; for example, pre-2013 dumps won't have Module (828)
ns.Bldr_data_(itm);
}
}
}
}

View File

@@ -0,0 +1,79 @@
/*
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.bldrs.cmds; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*;
import gplx.srls.dsvs.*;
public class Xob_ns_file_itm_parser extends Dsv_wkr_base {
private byte[] ns_ids_bry; private String name; private final ListAdp rslts = ListAdp_.new_();
private Xow_ns_mgr ns_mgr; private byte db_file_tid; private boolean mode_each = false;
public void Ctor(byte db_file_tid, Xow_ns_mgr ns_mgr) {
this.db_file_tid = db_file_tid; this.ns_mgr = ns_mgr;
this.mode_each = false; rslts.Clear();
}
@Override public Dsv_fld_parser[] Fld_parsers() {return new Dsv_fld_parser[] {Dsv_fld_parser_.Bry_parser, Dsv_fld_parser_.Bry_parser};}
@Override public boolean Write_bry(Dsv_tbl_parser parser, int fld_idx, byte[] src, int bgn, int end) {
switch (fld_idx) {
case 0: ns_ids_bry = Bry_.Mid(src, bgn, end); return true;
case 1: name = String_.new_utf8_(src, bgn, end); return true;
default: return false;
}
}
@Override public void Commit_itm(Dsv_tbl_parser parser, int pos) {
if (ns_ids_bry == null) throw parser.Err_row_bgn("ns_itm missing ns_ids", pos);
if (mode_each) return;
if (Bry_.Eq(ns_ids_bry, ns_ids_bry_each)) {
mode_each = true;
int len = ns_mgr.Ords_len();
for (int i = 0; i < len; ++i) {
Xow_ns ns = ns_mgr.Ords_get_at(i);
int ns_id = ns.Id();
rslts.Add(new Xob_ns_file_itm(db_file_tid, "ns." + Int_.Xto_str_pad_bgn_zero(ns_id, 3), Int_.Ary(ns_id)));
}
return;
}
int[] ns_ids = null;
if (ns_ids_bry.length == 1 && ns_ids_bry[0] == Byte_ascii.Asterisk) { // "*"
int len = ns_mgr.Ords_len();
ns_ids = new int[len];
for (int i = 0; i < len; ++i)
ns_ids[i] = ns_mgr.Ords_get_at(i).Id();
}
else
ns_ids = Int_.Ary_parse(String_.new_utf8_(ns_ids_bry), ",");
if (ns_ids.length == 0) throw Err_.new_("map.invalid.ns_missing; src={0}", this.Src());
if (String_.Len_eq_0(name)) { // no name; auto-generate
int ns_id_1st = ns_ids[0]; // take 1st ns_id
name = "ns." + Int_.Xto_str_pad_bgn_zero(ns_id_1st, 3); // EX: ns.000
}
Xob_ns_file_itm ns_itm = new Xob_ns_file_itm(db_file_tid, name, ns_ids);
rslts.Add(ns_itm);
ns_itm.toString();
ns_ids = null; name = null;
}
public Xob_ns_file_itm[] To_ary(byte[] bry) {
this.Load_by_bry(bry);
return (Xob_ns_file_itm[])rslts.Xto_ary(Xob_ns_file_itm.class);
}
private static final byte[] ns_ids_bry_each = Bry_.new_ascii_("<each>");
/*
"" -> no rules; return "default"; generates "text-001" and lumps all ns into it
"*|<id>|3700|2" -> auto-generate per ns
<single-file>
<all>||gzip
<each>||gzip
*/
}

View File

@@ -15,37 +15,8 @@ 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.bldrs.oimgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*;
import gplx.xowa.wikis.data.*; import gplx.xowa.dbs.*; import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.xowa.dbs.tbls.*;
class Xob_dump_src_ttl implements Xob_parse_all_db {
private Xodb_mgr_sql db_mgr; private Db_stmt page_stmt; private Xowd_db_file[] text_files_ary; private int text_files_len; private byte redirect;
public Xob_dump_src_ttl Init(Xowe_wiki wiki, int limit, byte redirect) {
this.db_mgr = wiki.Db_mgr_as_sql(); this.redirect = redirect;
page_stmt = db_mgr.Tbl_page().Select_for_parse_all_stmt(db_mgr.Core_data_mgr().Conn_core(), limit, redirect);
text_files_ary = Init_text_files_ary(db_mgr.Core_data_mgr());
text_files_len = text_files_ary.length;
return this;
}
public void Fetch_next(OrderedHash hash, int ns_id, byte[] ttl) {
Cancelable cancelable = Cancelable_.Never;
db_mgr.Tbl_page().Select_for_parse_all(cancelable, hash, page_stmt, ns_id, ttl, redirect);
for (int i = 0; i < text_files_len; i++) {
Xowd_db_file text_file = text_files_ary[i];
db_mgr.Tbl_text().Select_in(cancelable, text_file, hash);
}
}
public static Xowd_db_file[] Init_text_files_ary(Xowe_core_data_mgr core_data_mgr) {
ListAdp text_files_list = ListAdp_.new_();
int len = core_data_mgr.Dbs__len();
if (len == 1) return new Xowd_db_file[] {core_data_mgr.Dbs__get_at(0)}; // single file: return core; note that there are no Tid = Text
for (int i = 0; i < len; i++) {
Xowd_db_file file = core_data_mgr.Dbs__get_at(i);
if (file.Tid() == Xowd_db_file_.Tid_text)
text_files_list.Add(file);
}
return (Xowd_db_file[])text_files_list.Xto_ary_and_clear(Xowd_db_file.class);
}
}
package gplx.xowa.bldrs.cmds; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*;
import gplx.xowa.wikis.data.*; import gplx.xowa.dbs.*; import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.xowa.wikis.data.tbls.*;
class Xob_dump_src_id {
private Xodb_mgr_sql db_mgr; private byte redirect;
private String page_db_url; private int size_max;
@@ -53,7 +24,7 @@ class Xob_dump_src_id {
public Xob_dump_src_id Init(Xowe_wiki wiki, byte redirect, int size_max) {
this.db_mgr = wiki.Db_mgr_as_sql(); this.redirect = redirect;
this.size_max = size_max;
page_db_url = db_mgr.Core_data_mgr().Dbs__get_by_tid_1st(Xowd_db_file_.Tid_core).Url().Raw();
this.page_db_url = db_mgr.Core_data_mgr().Db__core().Url().Raw();
return this;
}
public void Get_pages(ListAdp list, int text_db_idx, int cur_ns, int prv_id) {
@@ -63,9 +34,9 @@ class Xob_dump_src_id {
try {
rdr = New_rdr(db_mgr, page_db_url, text_db_idx, cur_ns, prv_id, redirect);
while (rdr.MoveNextPeer()) {
Xodb_page page = New_page(db_mgr, cur_ns, rdr);
Xowd_page_itm page = New_page(db_mgr, cur_ns, rdr);
list.Add(page);
size_len += page.Wtxt_len();
size_len += page.Text_len();
if (size_len > size_max)
break;
}
@@ -82,14 +53,17 @@ class Xob_dump_src_id {
}
return text_stmt.Clear().Val_int(prv_id).Val_int(cur_ns).Exec_select();
}
private static Xodb_page New_page(Xodb_mgr_sql db_mgr, int ns_id, DataRdr rdr) {
Xodb_page rv = new Xodb_page();
rv.Id_(rdr.ReadInt(Xodb_page_tbl.Fld_page_id));
private static Xowd_page_itm New_page(Xodb_mgr_sql db_mgr, int ns_id, DataRdr rdr) {
Xowd_page_tbl page_core_tbl = db_mgr.Core_data_mgr().Tbl__page();
Xowd_page_itm rv = new Xowd_page_itm();
rv.Id_(rdr.ReadInt(page_core_tbl.Fld_page_id()));
rv.Ns_id_(ns_id);
rv.Ttl_page_db_(rdr.ReadBryByStr(Xodb_page_tbl.Fld_page_title));
byte[] old_text = rdr.ReadBry(Xodb_text_tbl.Fld_old_text);
old_text = db_mgr.Wiki().Appe().Zip_mgr().Unzip(db_mgr.Data_storage_format(), old_text);
rv.Wtxt_(old_text);
rv.Ttl_page_db_(rdr.ReadBryByStr(page_core_tbl.Fld_page_title()));
String text_data_name = db_mgr.Core_data_mgr().Db__core().Tbl__text().Fld_text_data();
byte[] text_data = rdr.ReadBry(text_data_name);
text_data = db_mgr.Wiki().Appe().Zip_mgr().Unzip(db_mgr.Core_data_mgr().Props().Zip_tid_text(), text_data);
rv.Text_(text_data);
return rv;
}
private static String New_rdr__redirect_clause(byte redirect) {
@@ -103,7 +77,7 @@ class Xob_dump_src_id {
private static final String Sql_select = String_.Concat_lines_nl
( "SELECT p.page_id"
, ", p.page_title"
, ", t.old_text"
, ", t.text_data"
, "FROM page_dump p"
, " JOIN text t ON t.page_id = p.page_id"
, "WHERE p.page_id > ?"

View File

@@ -15,7 +15,7 @@ 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.bldrs.imports.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.imports.*;
package gplx.xowa.bldrs.cmds.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import gplx.core.btries.*;
class Uca_trie {
public void Init() {

View File

@@ -15,8 +15,8 @@ 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.bldrs.imports.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.imports.*;
import org.junit.*;
package gplx.xowa.bldrs.cmds.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import org.junit.*; import gplx.xowa.bldrs.*;
public class Uca_trie_tst {
@Before public void init() {fxt.Clear();} private Xob_base_fxt fxt = new Xob_base_fxt();
@Test public void Basic() {

View File

@@ -15,44 +15,40 @@ 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.bldrs.imports.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.imports.*;
import gplx.ios.*; import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.xowa.dbs.tbls.*; import gplx.xowa.dbs.*;
package gplx.xowa.bldrs.cmds.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import gplx.ios.*; import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.dbs.*; import gplx.xowa.bldrs.*;
public class Xob_category_registry_sql implements Xob_cmd {
public Xob_category_registry_sql(Xob_bldr bldr, Xowe_wiki wiki) {this.wiki = wiki;} private Xowe_wiki wiki;
public String Cmd_key() {return KEY;} public static final String KEY = "import.sql.category_registry";
public void Cmd_ini(Xob_bldr bldr) {}
public void Cmd_bgn(Xob_bldr bldr) {}
public void Cmd_run() {}
public String Cmd_key() {return Xob_cmd_keys.Key_text_cat_core;}
public void Cmd_end() { // NOTE: placing in end, b/c must run *after* page_sql
// setup
wiki.Html_mgr().Importing_ctgs_(Bool_.Y);
Io_url rslt_dir = Xob_category_registry_sql.Get_dir_output(wiki);
Io_url rslt_dir = Xob_category_registry_sql.Tmp_dir(wiki);
Io_mgr._.DeleteDirDeep(rslt_dir);
Xob_tmp_wtr rslt_wtr = Xob_tmp_wtr.new_wo_ns_(Io_url_gen_.dir_(rslt_dir), Io_mgr.Len_mb);
Xodb_mgr_sql db_mgr = Xodb_mgr_sql.Get_or_load(wiki);
Db_conn conn = db_mgr.Core_data_mgr().Conn_core();
Db_qry__select_cmd qry = Db_qry__select_cmd.new_()
.Cols_(Xodb_page_tbl.Fld_page_title, Xodb_page_tbl.Fld_page_id)
.From_(Xodb_page_tbl.Tbl_name)
.Where_(Db_crt_.eq_(Xodb_page_tbl.Fld_page_ns, Xow_ns_.Id_category))
.OrderBy_asc_(Xodb_page_tbl.Fld_page_title);
DataRdr rdr = DataRdr_.Null;
// read data
Gfo_usr_dlg usr_dlg = wiki.Appe().Usr_dlg();
wiki.Init_db_mgr();
Xowd_page_tbl page_core_tbl = wiki.Db_mgr_as_sql().Core_data_mgr().Tbl__page();
Db_rdr rdr = page_core_tbl.Conn().Stmt_select_order(page_core_tbl.Tbl_name(), String_.Ary(page_core_tbl.Fld_page_title(), page_core_tbl.Fld_page_id()), String_.Ary(page_core_tbl.Fld_page_ns()), page_core_tbl.Fld_page_title())
.Crt_int(page_core_tbl.Fld_page_ns(), Xow_ns_.Id_category)
.Exec_select__rls_auto();
try {
rdr = qry.Exec_qry_as_rdr(conn);
while (rdr.MoveNextPeer()) {
byte[] page_ttl = rdr.ReadBryByStr(Xodb_page_tbl.Fld_page_title);
int page_id = rdr.ReadInt(Xodb_page_tbl.Fld_page_id);
while (rdr.Move_next()) {
byte[] page_ttl = rdr.Read_bry_by_str(page_core_tbl.Fld_page_title());
int page_id = rdr.Read_int(page_core_tbl.Fld_page_id());
if (rslt_wtr.FlushNeeded(page_ttl.length + 2 + 5)) rslt_wtr.Flush(usr_dlg);
rslt_wtr.Bfr().Add(page_ttl).Add_byte_pipe().Add_base85_len_5(page_id).Add_byte_nl();
}
} finally {rdr.Rls();}
// cleanup
rslt_wtr.Flush(usr_dlg);
wiki.Html_mgr().Importing_ctgs_(Bool_.N);
}
public void Cmd_print() {}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
return GfoInvkAble_.Rv_unhandled;
}
public static Io_url Get_dir_output(Xowe_wiki wiki) {return wiki.Fsys_mgr().Tmp_dir().GenSubDir(KEY);}
public void Cmd_init(Xob_bldr bldr) {}
public void Cmd_bgn(Xob_bldr bldr) {}
public void Cmd_run() {}
public void Cmd_term() {}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {return GfoInvkAble_.Rv_unhandled;}
public static Io_url Tmp_dir(Xowe_wiki wiki) {return wiki.Fsys_mgr().Tmp_dir().GenSubDir(Xob_cmd_keys.Key_text_cat_core);}
}

View File

@@ -15,10 +15,11 @@ 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.bldrs.imports.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.imports.*;
import org.junit.*; import gplx.core.primitives.*;
package gplx.xowa.bldrs.cmds.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import org.junit.*; import gplx.core.primitives.*; import gplx.xowa.bldrs.*;
public class Xob_category_registry_sql_tst {
@Before public void init() {if (Xoa_test_.Db_skip()) return; fxt.Clear();} private Xob_category_registry_sql_fxt fxt = new Xob_category_registry_sql_fxt();
@Before public void init() {if (Xoa_test_.Db_skip()) return; fxt.Clear();} private Xob_category_registry_sql_fxt fxt = new Xob_category_registry_sql_fxt();
@After public void term() {if (Xoa_test_.Db_skip()) return; fxt.Rls();}
@Test public void Basic() {
if (Xoa_test_.Db_skip()) return;
fxt.Init_page_insert(String_.Ary("Ctg3", "Ctg2", "Ctg1"));
@@ -27,6 +28,7 @@ public class Xob_category_registry_sql_tst {
}
}
class Xob_category_registry_sql_fxt {
Db_mgr_fxt fxt; Xowe_wiki wiki; Xoae_app app; Int_obj_ref page_id_next = Int_obj_ref.new_(1);
public void Clear() {
if (fxt == null) {
fxt = new Db_mgr_fxt().Ctor_fsys();
@@ -34,16 +36,17 @@ class Xob_category_registry_sql_fxt {
wiki = fxt.Wiki();
app = wiki.Appe();
}
} Db_mgr_fxt fxt; Xowe_wiki wiki; Xoae_app app; Int_obj_ref page_id_next = Int_obj_ref.new_(1);
}
public void Rls() {fxt.Rls();}
public void Init_page_insert(String[] ttls) {
fxt.Init_page_insert(page_id_next, Xow_ns_.Id_category, ttls);
}
public void Exec_category_registry_cmd() {
app.Bldr().Cmd_mgr().Add_cmd(wiki, Xob_category_registry_sql.KEY);
app.Bldr().Cmd_mgr().Add_cmd(wiki, Xob_cmd_keys.Key_text_cat_core);
app.Bldr().Run();
}
public void Test_ids(int[] expd) {
Io_url rslts_dir = Xob_category_registry_sql.Get_dir_output(wiki);
Io_url rslts_dir = Xob_category_registry_sql.Tmp_dir(wiki);
String rslts_txt = Io_mgr._.LoadFilStr(Io_mgr._.QueryDir_fils(rslts_dir)[0]);
int[] actl = Parse_rslts_txt(rslts_txt);
Tfds.Eq_ary(expd, actl);

View File

@@ -15,16 +15,17 @@ 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.bldrs.imports.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.imports.*;
package gplx.xowa.bldrs.cmds.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import gplx.core.brys.*; import gplx.ios.*; import gplx.xowa.ctgs.*;
public abstract class Xob_categorylinks_base extends Xob_sql_dump_base implements Sql_file_parser_cmd {
private DateAdp_parser date_parser = DateAdp_parser.new_(); private Sql_file_parser sql_parser; Uca_trie trie; private Bry_bfr uca_bfr = Bry_bfr.reset_(255);
public abstract Io_sort_cmd Make_sort_cmd(Sql_file_parser sql_parser);
@Override public String Sql_file_name() {return "categorylinks";}
@Override public void Cmd_bgn_hook(Xob_bldr bldr, Sql_file_parser parser) {
this.sql_parser = parser;
wiki.Html_mgr().Importing_ctgs_(Bool_.Y);
parser.Fld_cmd_(this).Flds_req_(Fld_cl_from, Fld_cl_to, Fld_cl_timestamp, Fld_cl_collation, Fld_cl_sortkey, Fld_cl_type);
} static final byte[] Fld_cl_from = Bry_.new_ascii_("cl_from"), Fld_cl_to = Bry_.new_ascii_("cl_to"), Fld_cl_timestamp = Bry_.new_ascii_("cl_timestamp"), Fld_cl_collation = Bry_.new_ascii_("cl_collation"), Fld_cl_sortkey = Bry_.new_ascii_("cl_sortkey"), Fld_cl_type = Bry_.new_ascii_("cl_type");
}
public void Exec(byte[] src, byte[] fld_key, int fld_idx, int fld_bgn, int fld_end, Bry_bfr file_bfr, Sql_file_parser_data data) {
if (Bry_.Eq(fld_key, Fld_cl_from)) cur_id = Bry_.Xto_int_or(src, fld_bgn, fld_end, -1);
else if (Bry_.Eq(fld_key, Fld_cl_to)) cur_ctg = Bry_.Mid(src, fld_bgn, fld_end);
@@ -68,7 +69,7 @@ public abstract class Xob_categorylinks_base extends Xob_sql_dump_base implement
Xobdc_merger.Basic(bldr.Usr_dlg(), dump_url_gen, temp_dir.GenSubDir("sort"), sort_mem_len, Xoctg_link_sql_sorter._, Io_line_rdr_key_gen_.noop, Make_sort_cmd(sql_parser));
wiki.Html_mgr().Importing_ctgs_(Bool_.N);
}
DateAdp_parser date_parser = DateAdp_parser.new_(); Sql_file_parser sql_parser; Uca_trie trie; Bry_bfr uca_bfr = Bry_bfr.reset_(255);
private static final byte[] Fld_cl_from = Bry_.new_ascii_("cl_from"), Fld_cl_to = Bry_.new_ascii_("cl_to"), Fld_cl_timestamp = Bry_.new_ascii_("cl_timestamp"), Fld_cl_collation = Bry_.new_ascii_("cl_collation"), Fld_cl_sortkey = Bry_.new_ascii_("cl_sortkey"), Fld_cl_type = Bry_.new_ascii_("cl_type");
private static final byte[] Collation_uca = Bry_.new_utf8_("uca"), Sortkey_space = new byte[] {Byte_ascii.Space};
}
class Xoctg_link_sql_sorter implements gplx.lists.ComparerAble {

View File

@@ -15,21 +15,21 @@ 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.bldrs.imports.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.imports.*;
import org.junit.*;
package gplx.xowa.bldrs.cmds.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import org.junit.*; import gplx.xowa.bldrs.*;
public class Xob_categorylinks_base_tst {
@Before public void init() {fxt.Clear();} private Xob_base_fxt fxt = new Xob_base_fxt();
@Test public void Basic() {
Io_url src_fil = Io_url_.new_fil_("mem/temp/sql_dump.sql");
fxt .Init_fil(src_fil, String_.Concat
( Xob_categorylinks_sql.Tbl_categorylinks
( Xob_categorylinks_sql.Sql_categorylinks
, "INSERT INTO `categorylinks` VALUES"
, " (1,'Ctg_2','PAGE_2a','2013-04-15 01:02:03','','uppercase','page')"
, ",(2,'Ctg_1','PAGE_1b','2013-04-15 01:02:03','','uppercase','page')"
, ",(3,'Ctg_1','PAGE_1a','2013-04-15 01:02:03','','uppercase','page')"
, ";"
))
.Exec_cmd(Xob_categorylinks_txt.KEY, GfoMsg_.basic_(Xob_categorylinks_base.Invk_src_fil_, src_fil))
.Exec_cmd(Xob_cmd_keys.Key_tdb_text_cat_link, GfoMsg_.basic_(Xob_categorylinks_base.Invk_src_fil_, src_fil))
.Test_fil("mem/xowa/wiki/en.wikipedia.org/tmp/ctg.link_sql/make/0000000000.csv", String_.Concat_lines_nl
( "Ctg_1|p|PAGE_1a|!!!!$|#8DDL|"
, "Ctg_1|p|PAGE_1b|!!!!#|#8DDL|"
@@ -37,16 +37,16 @@ public class Xob_categorylinks_base_tst {
))
;
}
@Test public void SuperEarths() { // PURPOSE: handle multi-field sort
@Test public void Super_earths() { // PURPOSE: handle multi-field sort
Io_url src_fil = Io_url_.new_fil_("mem/temp/sql_dump.sql");
fxt .Init_fil(src_fil, String_.Concat
( Xob_categorylinks_sql.Tbl_categorylinks
( Xob_categorylinks_sql.Sql_categorylinks
, "INSERT INTO `categorylinks` VALUES"
, " (1,'Super-Earths','PAGE_1a','2013-04-15 01:02:03','','uppercase','page')"
, ",(2,'Super-Earths_in_the_habitable_zone','PAGE_1b','2013-04-15 01:02:03','','uppercase','page')"
, ";"
))
.Exec_cmd(Xob_categorylinks_txt.KEY, GfoMsg_.basic_(Xob_categorylinks_base.Invk_src_fil_, src_fil))
.Exec_cmd(Xob_cmd_keys.Key_tdb_text_cat_link, GfoMsg_.basic_(Xob_categorylinks_base.Invk_src_fil_, src_fil))
.Test_fil("mem/xowa/wiki/en.wikipedia.org/tmp/ctg.link_sql/make/0000000000.csv", String_.Concat_lines_nl
( "Super-Earths|p|PAGE_1a|!!!!\"|#8DDL|"
, "Super-Earths_in_the_habitable_zone|p|PAGE_1b|!!!!#|#8DDL|"
@@ -56,12 +56,12 @@ public class Xob_categorylinks_base_tst {
@Test public void Sortkey_has_newline() { // PURPOSE: sortkey sometimes has format of "sortkey\ntitle"; EX: "WALES, JIMMY\nJIMMY WALES"; discard 2nd for hard-disk space savings
Io_url src_fil = Io_url_.new_fil_("mem/temp/sql_dump.sql");
fxt .Init_fil(src_fil, String_.Concat
( Xob_categorylinks_sql.Tbl_categorylinks
( Xob_categorylinks_sql.Sql_categorylinks
, "INSERT INTO `categorylinks` VALUES"
, " (1,'Ctg_1','LAST,FIRST\\nFIRST LAST','2013-04-15 01:02:03','','uppercase','page')"
, ";"
))
.Exec_cmd(Xob_categorylinks_txt.KEY, GfoMsg_.basic_(Xob_categorylinks_base.Invk_src_fil_, src_fil))
.Exec_cmd(Xob_cmd_keys.Key_tdb_text_cat_link, GfoMsg_.basic_(Xob_categorylinks_base.Invk_src_fil_, src_fil))
.Test_fil("mem/xowa/wiki/en.wikipedia.org/tmp/ctg.link_sql/make/0000000000.csv", String_.Concat_lines_nl
( "Ctg_1|p|LAST,FIRST|!!!!\"|#8DDL|"
))

View File

@@ -15,14 +15,14 @@ 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.bldrs.imports.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.imports.*;
import gplx.ios.*;
package gplx.xowa.bldrs.cmds.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import gplx.ios.*; import gplx.xowa.bldrs.*;
public class Xob_categorylinks_sql extends Xob_categorylinks_base {
private Db_idx_mode idx_mode = Db_idx_mode.Itm_end;
public Xob_categorylinks_sql(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki); this.make_fil_len = Io_mgr.Len_mb;}
@Override public String Cmd_key() {return KEY;} public static final String KEY = "import.sql.categorylinks";
@Override public String Cmd_key() {return Xob_cmd_keys.Key_text_cat_link;}
@Override public Io_sort_cmd Make_sort_cmd(Sql_file_parser sql_parser) {return new Xob_categorylinks_sql_make(sql_parser, wiki, idx_mode);}
public static final String Tbl_categorylinks = String_.Concat_lines_nl
public static final String Sql_categorylinks = String_.Concat_lines_nl
( "CREATE TABLE `categorylinks` ("
, " `cl_from` int(10) unsigned NOT NULL DEFAULT '0',"
, " `cl_to` varbinary(255) NOT NULL DEFAULT '',"

View File

@@ -0,0 +1,153 @@
/*
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.bldrs.cmds.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import gplx.core.flds.*; import gplx.ios.*; import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.ctgs.*;
import gplx.xowa.bldrs.*;
import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*;
public class Xob_categorylinks_sql_make implements Io_make_cmd {
private Gfo_usr_dlg usr_dlg; private final Xowe_wiki wiki; private final Db_idx_mode idx_mode; private Xowd_db_mgr core_db_mgr;
private final Sql_file_parser sql_parser; private final Gfo_fld_rdr fld_rdr = Gfo_fld_rdr.xowa_(); private Io_line_rdr name_id_rdr;
private Xowd_cat_core_tbl cat_core_tbl; private Xowd_cat_link_tbl cat_link_tbl;
private long cat_db_size, cat_db_max; private int cur_row_count;
private int[] cur_cat_counts = new int[Xoa_ctg_mgr.Tid__max]; private byte[] cur_cat_ttl = Ttl_first; private int cur_cat_id; private int cur_cat_file_idx;
public Xob_categorylinks_sql_make(Sql_file_parser sql_parser, Xowe_wiki wiki, Db_idx_mode idx_mode) {
this.wiki = wiki; this.sql_parser = sql_parser; this.idx_mode = idx_mode; usr_dlg = wiki.Appe().Usr_dlg();
}
public void Sort_bgn() {
this.core_db_mgr = wiki.Db_mgr_as_sql().Core_data_mgr();
this.name_id_rdr = New_registry_rdr(wiki, usr_dlg);
this.cat_db_max = wiki.Appe().Api_root().Bldr().Wiki().Import().Cat_link_db_max();
boolean one_file = core_db_mgr.Props().Layout_text().Tid_is_all_or_few();
if (!one_file) // cat is in its own dbs: delete dbs
core_db_mgr.Dbs__delete_by_tid(Xowd_db_file_.Tid_cat, Xowd_db_file_.Tid_cat_core, Xowd_db_file_.Tid_cat_link); // delete existing category files else upgrade won't work
Db_make(Bool_.Y);
if (one_file) { // cat is in single db; delete tbls;
cat_core_tbl.Delete_all();
cat_link_tbl.Delete_all();
}
}
public void Sort_do(Io_line_rdr rdr) {
byte[] new_cat_ttl = Bry_.Empty;
try {
fld_rdr.Ini(rdr.Bfr(), rdr.Itm_pos_bgn());
new_cat_ttl = fld_rdr.Read_bry_escape();
if (!Bry_.Eq(new_cat_ttl, cur_cat_ttl)) // ttl changed
cur_cat_id = Save_ctg(new_cat_ttl);
if (cur_cat_id == Cur_cat_id_null) return;
byte cat_tid = Convert_cat_tid_to_byte(fld_rdr.Read_byte());
byte[] cat_sortkey = fld_rdr.Read_bry_escape();
int page_id = fld_rdr.Read_int_base85_len5();
int cat_timestamp = fld_rdr.Read_int_base85_len5();
cat_link_tbl.Insert_cmd_by_batch(page_id, cur_cat_id, cat_tid, cat_sortkey, cat_timestamp);
cat_db_size += 34 + 20 + 12 + (cat_sortkey.length * 2); // NOTE_1: categorylinks row size
++cur_cat_counts[cat_tid];
++cur_row_count;
if (cur_row_count % 100000 == 0) usr_dlg.Prog_one("", "", "inserting category row: ~{0}", cur_row_count);
if (cur_row_count % 1000000 == 0) {cat_core_tbl.Conn().Txn_sav(); cat_link_tbl.Conn().Txn_sav();}
} catch (Exception e) {usr_dlg.Warn_many("", "", "ctg_links.insert failed: name=~{0} err=~{1}", String_.new_utf8_(new_cat_ttl), Err_.Message_gplx_brief(e));}
}
public void Sort_end() {
Save_ctg(Ttl_last);
Db_close();
Xodb_mgr_sql db_mgr_sql = wiki.Db_mgr_as_sql();
if (db_mgr_sql.Category_version() == Xoa_ctg_mgr.Version_null) // NOTE: ctg_v1 wkr will set this to v1; only set to v2 if null
db_mgr_sql.Category_version_update(false);
usr_dlg.Log_many("", "", "import.category.v2: insert done; committing; rows=~{0}", cur_row_count);
name_id_rdr.Rls();
if (String_.Eq(sql_parser.Src_fil().NameAndExt(), Xob_ctg_v1_sql_make.Url_sql)) // delete temp xowa_categorylinks.sql file created by cat_v1
Io_mgr._.DeleteFil(sql_parser.Src_fil());
}
private int Save_ctg(byte[] new_ctg_ttl) {
if (cur_cat_ttl != Bry_.Empty && cur_cat_id != -1)
cat_core_tbl.Insert_cmd_by_batch(cur_cat_id, cur_cat_counts[Xoa_ctg_mgr.Tid_page], cur_cat_counts[Xoa_ctg_mgr.Tid_subc], cur_cat_counts[Xoa_ctg_mgr.Tid_file], Xoa_ctg_mgr.Hidden_n, cur_cat_file_idx);
if (new_ctg_ttl == Ttl_last) return Cur_cat_id_null; // last ttl; called by this.End(); exit early else will fail in Cur_cat_id_find()
if (cat_db_size > cat_db_max) {Db_close(); Db_make(Bool_.N);}
cur_cat_id = Cur_cat_id_find(new_ctg_ttl);
for (int i = 0; i < Xoa_ctg_mgr.Tid__max; i++)
cur_cat_counts[i] = 0;
cur_cat_ttl = new_ctg_ttl;
return cur_cat_id;
}
private void Db_make(boolean first) {
boolean one_file = core_db_mgr.Props().Layout_text().Tid_is_all_or_few();
if (first) { // create cat_core
Xowd_db_file cat_core_db = one_file ? core_db_mgr.Db__cat_core() : core_db_mgr.Dbs__make_by_tid(Xowd_db_file_.Tid_cat_core);
this.cat_core_tbl = cat_core_db.Tbl__cat_core().Create_tbl();
}
Xowd_db_file cat_link_db = one_file ? core_db_mgr.Db__core() : core_db_mgr.Dbs__make_by_tid(Xowd_db_file_.Tid_cat_link);
this.cat_link_tbl = cat_link_db.Tbl__cat_link();
if ( (one_file && first)
|| !one_file)
cat_link_tbl.Create_tbl();
this.cur_cat_file_idx = cat_link_db.Id();
cat_core_tbl.Insert_bgn();
cat_link_tbl.Insert_bgn();
if (idx_mode.Tid_is_bgn()) cat_link_tbl.Create_idx();
}
private void Db_close() {
cat_core_tbl.Insert_end();
cat_link_tbl.Insert_end();
cat_db_size = 0;
if (idx_mode.Tid_is_end()) cat_link_tbl.Create_idx();
}
private static byte Convert_cat_tid_to_byte(byte ltr) {
switch (ltr) {
case Byte_ascii.Ltr_f: return Xoa_ctg_mgr.Tid_file;
case Byte_ascii.Ltr_p: return Xoa_ctg_mgr.Tid_page;
case Byte_ascii.Ltr_c: return Xoa_ctg_mgr.Tid_subc;
default: throw Err_.unhandled(ltr);
}
}
public Io_sort_cmd Make_dir_(Io_url v) {return this;}
private int Cur_cat_id_find(byte[] ttl) {
while (true) {
int compare = Bry_.Compare(ttl, 0, ttl.length, name_id_rdr.Bfr(), name_id_rdr.Key_pos_bgn(), name_id_rdr.Key_pos_end());
switch (compare) {
case CompareAble_.Same: return Base85_utl.XtoIntByAry(name_id_rdr.Bfr(), name_id_rdr.Key_pos_end() + 1, name_id_rdr.Itm_pos_end() - 2);
case CompareAble_.More:
boolean reading = name_id_rdr.Read_next();
if (!reading) return Cur_cat_id_null; // eof return
break;
case CompareAble_.Less: return Cur_cat_id_null; // stop
}
}
}
private static final int Cur_cat_id_null = -1;
private static Io_line_rdr New_registry_rdr(Xowe_wiki wiki, Gfo_usr_dlg usr_dlg) {
Io_url make_dir = Xob_category_registry_sql.Tmp_dir(wiki);
usr_dlg.Prog_many("", "", "loading category_registry files: ~{0}", make_dir.Raw());
Io_url[] urls = Io_mgr._.QueryDir_args(make_dir).ExecAsUrlAry();
return new Io_line_rdr(usr_dlg, urls).Key_gen_(Io_line_rdr_key_gen_.first_pipe);
}
private static final byte[] Ttl_last = null, Ttl_first = Bry_.Empty;
}
/*
NOTE_1: categorylinks row size: 34 + 20 + 12 + (cat_sortkey.length * 2)
row length (data) : 34=8+4+4+14+4 ROWID, cl_from, cl_to_id, cl_timestamp, cl_type_id
cl_main length (idx) : 20=8+4+4+4 ROWID, cl_from, cl_to_id, cl_type_id
cl_from length (idx) : 12=8+4 ROWID, cl_from
variable_data length : cat_sortkey.length * 2 sortkey is used for row and cl_main
Note the following
. ints are 4 bytes
. tinyint is assumed to be 4 bytes (should be 1, but sqlite only has one numeric datatype, so import all 4?)
. varchar(14) is assumed to be 14 bytes (should be 15? +1 for length of varchar?)
. calculations work out "too well". comparing 4 databases gets +/- .25 bytes per row. however
.. - bytes should not be possible
.. +.25 bytes is too low (18 MB out of 5.5 GB).*; there must be other bytes used for page breaks / fragmentation
*/

View File

@@ -15,8 +15,8 @@ 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.bldrs.imports.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.imports.*;
import org.junit.*; import gplx.core.primitives.*; import gplx.dbs.*; import gplx.xowa.dbs.tbls.*; import gplx.xowa.ctgs.*;
package gplx.xowa.bldrs.cmds.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import org.junit.*; import gplx.core.primitives.*; import gplx.dbs.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.ctgs.*; import gplx.xowa.bldrs.*;
public class Xob_categorylinks_sql_tst {
@Before public void init() {if (Xoa_test_.Db_skip()) return; fxt.Ctor_fsys();} Db_mgr_fxt fxt = new Db_mgr_fxt();
@After public void term() {if (Xoa_test_.Db_skip()) return; fxt.Rls();}
@@ -25,7 +25,7 @@ public class Xob_categorylinks_sql_tst {
fxt.Init_db_sqlite();
fxt.Init_page_insert(Int_obj_ref.new_(1), Xow_ns_.Id_category, String_.Ary("Ctg_1", "Ctg_2"));
fxt.Init_fil(Xoa_test_.Url_wiki_enwiki().GenSubFil("xowa_categorylinks.sql"), String_.Concat
( Xob_categorylinks_sql.Tbl_categorylinks
( Xob_categorylinks_sql.Sql_categorylinks
, "INSERT INTO `categorylinks` VALUES"
, " (3,'Ctg_2','File:2a','2013-04-15 01:02:03','','uppercase','file')"
, ",(4,'Ctg_1','1b','2013-04-15 01:02:03','','uppercase','page')"
@@ -34,14 +34,14 @@ public class Xob_categorylinks_sql_tst {
));
fxt.Exec_run(new Xob_category_registry_sql(fxt.Bldr(), fxt.Wiki()));
fxt.Exec_run(new Xob_categorylinks_sql(fxt.Bldr(), fxt.Wiki()));
Db_conn conn = fxt.Wiki().Db_mgr_as_sql().Core_data_mgr().Conn_ctg();
Db_tst_qry.tbl_(Xodb_category_tbl.Tbl_name, Xodb_category_tbl.Fld_cat_id)
.Cols_(Xodb_category_tbl.Fld_cat_id, Xodb_category_tbl.Fld_cat_subcats, Xodb_category_tbl.Fld_cat_files, Xodb_category_tbl.Fld_cat_pages)
Db_conn conn = fxt.Wiki().Db_mgr_as_sql().Core_data_mgr().Db__cat_core().Conn();
Db_tst_qry.tbl_("cat_core", "cat_id")
.Cols_("cat_id", "cat_subcats", "cat_files", "cat_pages")
.Rows_add_vals(1, 0, 0, 2)
.Rows_add_vals(2, 0, 1, 0)
.Test(conn);
Db_tst_qry.tbl_(Xodb_categorylinks_tbl.Tbl_name, Xodb_categorylinks_tbl.Fld_cl_from)
.Cols_(Xodb_categorylinks_tbl.Fld_cl_from, Xodb_categorylinks_tbl.Fld_cl_to_id, Xodb_categorylinks_tbl.Fld_cl_sortkey, Xodb_categorylinks_tbl.Fld_cl_type_id)
Db_tst_qry.tbl_("cat_link", "cl_from")
.Cols_("cl_from", "cl_to_id", "cl_sortkey", "cl_type_id")
.Rows_add_vals(3, 2, "File:2a" , Xoa_ctg_mgr.Tid_file)
.Rows_add_vals(4, 1, "1b" , Xoa_ctg_mgr.Tid_page)
.Rows_add_vals(5, 1, "1a" , Xoa_ctg_mgr.Tid_page)

View File

@@ -15,10 +15,10 @@ 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.bldrs.imports.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.imports.*;
package gplx.xowa.bldrs.cmds.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import gplx.ios.*;
public class Xob_categorylinks_txt extends Xob_categorylinks_base {
public Xob_categorylinks_txt(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki); this.make_fil_len = Io_mgr.Len_mb;}
@Override public String Cmd_key() {return KEY;} public static final String KEY = "ctg.link_sql";
@Override public String Cmd_key() {return Xob_cmd_keys.Key_tdb_text_cat_link;}
@Override public Io_sort_cmd Make_sort_cmd(Sql_file_parser sql_parser) {return new Io_sort_fil_basic(bldr.Usr_dlg(), this.Make_url_gen(), make_fil_len);}
}

View File

@@ -15,8 +15,9 @@ 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.bldrs.imports.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.imports.*;
package gplx.xowa.bldrs.cmds.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import gplx.core.primitives.*; import gplx.core.btries.*; import gplx.core.flds.*; import gplx.ios.*; import gplx.xowa.tdbs.*;
import gplx.xowa.wikis.data.tbls.*;
public abstract class Xob_ctg_v1_base extends Xob_itm_dump_base implements Xobd_parser_wkr, GfoInvkAble {
protected Xob_ctg_v1_base() {} // TEST:needed for fxt
public Xob_ctg_v1_base Ctor(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki); return this;}
@@ -33,7 +34,7 @@ public abstract class Xob_ctg_v1_base extends Xob_itm_dump_base implements Xobd_
tmp_bfr.Mkr_rls();
fld_wtr.Bfr_(dump_bfr);
}
public int Wkr_run(Xodb_page page, byte[] src, int src_len, int bgn, int end) {
public int Wkr_run(Xowd_page_itm page, byte[] src, int src_len, int bgn, int end) {
int ttl_bgn = end, ttl_end = -1;
int pos = end;
while (true) {
@@ -64,7 +65,7 @@ public abstract class Xob_ctg_v1_base extends Xob_itm_dump_base implements Xobd_
++pos;
}
}
@gplx.Virtual public void Log(byte err_tid, Xodb_page page, byte[] src, int ctg_bgn) {
@gplx.Virtual public void Log(byte err_tid, Xowd_page_itm page, byte[] src, int ctg_bgn) {
String title = String_.new_utf8_(page.Ttl_full_db());
int ctg_end = ctg_bgn + 40; if (ctg_end > src.length) ctg_end = src.length;
String ctg_str = String_.Replace(String_.new_utf8_(src, ctg_bgn, ctg_end), "\n", "");
@@ -77,7 +78,7 @@ public abstract class Xob_ctg_v1_base extends Xob_itm_dump_base implements Xobd_
bldr.Usr_dlg().Log_many(GRP_KEY, "ctg_fail", "~{0}\n>> ~{1}\n~{2}\n~{3}\n\n", LogErr_hdr, err + " " + ctg_str, "http://" + wiki.Domain_str() + "/wiki/" + title, Bry_.MidByLenToStr(src, ctg_bgn, 100));
log_idx++;
} int log_idx = 0; final String LogErr_hdr = String_.Repeat("-", 80);
@gplx.Virtual public void Process_ctg(Xodb_page page, byte[] src, int src_len, int bgn, int end) {
@gplx.Virtual public void Process_ctg(Xowd_page_itm page, byte[] src, int src_len, int bgn, int end) {
Process_ctg_row(fld_wtr, dump_fil_len, dump_url_gen, page.Id(), src, src_len, bgn, end);
}
public static void Process_ctg_row(Gfo_fld_wtr fld_wtr, int dump_fil_len, Io_url_gen dump_url_gen, int page_id, byte[] src, int src_len, int bgn, int end) {

View File

@@ -15,11 +15,10 @@ 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.bldrs.imports.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.imports.*;
import org.junit.*;
import gplx.ios.*;
package gplx.xowa.bldrs.cmds.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import org.junit.*; import gplx.ios.*; import gplx.xowa.wikis.data.tbls.*;
public class Xob_ctg_v1_base_tst {
Xodb_page_wkr_ctg_fxt fxt = new Xodb_page_wkr_ctg_fxt();
Xowd_page_wkr_ctg_fxt fxt = new Xowd_page_wkr_ctg_fxt();
@Test public void One() {fxt.ini_("[[Category:A]]").tst_("A");}
@Test public void Many() {fxt.ini_("[[Category:A]] [[Category:B]] [[Category:C]]").tst_("A", "B", "C");}
@Test public void Pipe() {fxt.ini_("[[Category:A|B]]").tst_("A");}
@@ -29,10 +28,10 @@ public class Xob_ctg_v1_base_tst {
@Test public void Ws() {fxt.ini_("[[Category: A ]]").tst_("A");}
@Test public void Eos() {fxt.ini_("[[Category:abcdef").tst_();}
}
class Xodb_page_wkr_ctg_fxt {
class Xowd_page_wkr_ctg_fxt {
byte[] src;
public Xodb_page_wkr_ctg_fxt ini_(String s) {src = Bry_.new_utf8_(s); return this;}
public Xodb_page_wkr_ctg_fxt tst_(String... expd) {
public Xowd_page_wkr_ctg_fxt ini_(String s) {src = Bry_.new_utf8_(s); return this;}
public Xowd_page_wkr_ctg_fxt tst_(String... expd) {
Xobd_parser mgr = new Xobd_parser();
Xoae_app app = Xoa_app_fxt.app_();
Xowe_wiki wiki = Xoa_app_fxt.wiki_tst_(app);
@@ -41,7 +40,7 @@ class Xodb_page_wkr_ctg_fxt {
byte[] bry = Bry_.new_utf8_("[[Category:");
wkr.Wkr_hooks().Add(bry, bry);
mgr.Wkr_add(wkr);
Xodb_page page = new Xodb_page().Wtxt_(src);//.Ttl_(Bry_.new_utf8_("Test"), new Xow_ns_mgr());
Xowd_page_itm page = new Xowd_page_itm().Text_(src);//.Ttl_(Bry_.new_utf8_("Test"), new Xow_ns_mgr());
mgr.Wkr_bgn(bldr);
mgr.Wkr_run(page);
byte[][] ttl = (byte[][])wkr.Found().Xto_ary(byte[].class);
@@ -54,9 +53,9 @@ class Xodb_page_wkr_ctg_fxt {
}
}
class Xobd_parser_wkr_ctg_tstr extends Xob_ctg_v1_txt { public ListAdp Found() {return found;} ListAdp found = ListAdp_.new_();
@Override public void Process_ctg(Xodb_page page, byte[] src, int src_len, int bgn, int end) {
@Override public void Process_ctg(Xowd_page_itm page, byte[] src, int src_len, int bgn, int end) {
found.Add(Bry_.Mid(src, bgn, end));
}
@Override public void Log(byte err_tid, Xodb_page page, byte[] src, int ctg_bgn) {
@Override public void Log(byte err_tid, Xowd_page_itm page, byte[] src, int ctg_bgn) {
}
}

View File

@@ -15,26 +15,28 @@ 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.bldrs.imports.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.imports.*;
package gplx.xowa.bldrs.cmds.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import gplx.core.flds.*; import gplx.ios.*; import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.ctgs.*;
public class Xob_ctg_v1_sql extends Xob_ctg_v1_base {
@Override public String Wkr_key() {return KEY;} public static final String KEY = "import.sql.category_v1";
@Override public String Wkr_key() {return Xob_cmd_keys.Key_text_cat_core_v1;}
@Override public Io_sort_cmd Make_sort_cmd() {return new Xob_ctg_v1_sql_make(wiki);}
}
class Xob_ctg_v1_sql_make implements Io_make_cmd {
public Xob_ctg_v1_sql_make(Xowe_wiki wiki) {this.wiki = wiki; db_mgr = wiki.Db_mgr_as_sql();} private Xowe_wiki wiki; Xodb_mgr_sql db_mgr;
private Gfo_fld_rdr fld_rdr = Gfo_fld_rdr.xowa_(); private Xob_tmp_wtr sql_wtr; private Gfo_usr_dlg usr_dlg; private boolean is_first = true;
private byte[] prv_ctg_name = Bry_.Empty; private int prv_page_id = 0;
private Xowe_wiki wiki; private Xodb_mgr_sql db_mgr; private int page_count = 0; private int progress_interval = 10000;
private final Bry_fmtr fmtr = Bry_fmtr.new_("(~{page_id},'~{cat_name}','','','','','~{cat_type}')\n", "page_id", "cat_name", "cat_type");
public Xob_ctg_v1_sql_make(Xowe_wiki wiki) {this.wiki = wiki; db_mgr = wiki.Db_mgr_as_sql();}
public Io_sort_cmd Make_dir_(Io_url v) {return this;} // ignore
public void Sort_bgn() {
usr_dlg = wiki.Appe().Usr_dlg();
Io_url sql_url = wiki.Fsys_mgr().Root_dir().GenSubFil(Url_sql);
Io_mgr._.DeleteFil_args(sql_url).MissingFails_off().Exec();
sql_wtr = Xob_tmp_wtr.new_wo_ns_(Io_url_gen_.fil_(sql_url), Io_mgr.Len_mb);
sql_wtr.Bfr().Add_str(Xob_categorylinks_sql.Tbl_categorylinks).Add(Sql_hdr);
} Gfo_fld_rdr fld_rdr = Gfo_fld_rdr.xowa_(); Gfo_fld_wtr fld_wtr = Gfo_fld_wtr.xowa_(); Xob_tmp_wtr sql_wtr; Gfo_usr_dlg usr_dlg; boolean is_first = true;
public byte Line_dlm() {return line_dlm;} public Xob_ctg_v1_sql_make Line_dlm_(byte v) {line_dlm = v; return this;} private byte line_dlm = Byte_ascii.Nil;
private byte[] prv_ctg_name = Bry_.Empty; int prv_page_id = 0;
sql_wtr.Bfr().Add_str(Xob_categorylinks_sql.Sql_categorylinks).Add(Sql_hdr);
}
public void Sort_do(Io_line_rdr rdr) {
if (line_dlm == Byte_ascii.Nil) line_dlm = rdr.Line_dlm();
if (page_count++ % progress_interval == 0) usr_dlg.Prog_many("", "", "building category; count=~{0}", page_count);
fld_rdr.Ini(rdr.Bfr(), rdr.Itm_pos_bgn());
byte[] ctg_name = fld_rdr.Read_bry_escape();
ctg_name = Escape_for_sql(wiki, ctg_name);
@@ -54,7 +56,6 @@ class Xob_ctg_v1_sql_make implements Io_make_cmd {
db_mgr.Category_version_update(true);
}
private static final byte[] Sql_hdr = Bry_.new_ascii_("INSERT INTO 'categorylinks' VALUES");
Bry_fmtr fmtr = Bry_fmtr.new_("(~{page_id},'~{cat_name}','','','','','~{cat_type}')\n", "page_id", "cat_name", "cat_type");
public static final String Url_sql = "xowa_categorylinks.sql";
private static byte[] Escape_for_sql(Xowe_wiki wiki, byte[] bry) {
Bry_bfr bfr = wiki.Appe().Utl__bfr_mkr().Get_b512();

View File

@@ -15,8 +15,9 @@ 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.bldrs.imports.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.imports.*;
import org.junit.*; import gplx.dbs.*; import gplx.xowa.specials.search.*; import gplx.xowa.bldrs.imports.ctgs.*;
package gplx.xowa.bldrs.cmds.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import org.junit.*; import gplx.dbs.*; import gplx.xowa.specials.search.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.texts.*;
import gplx.xowa.bldrs.cmds.texts.sqls.*;
public class Xob_ctg_v1_sql_tst {
@Before public void init() {if (Xoa_test_.Db_skip()) return; fxt.Ctor_fsys();} Db_mgr_fxt fxt = new Db_mgr_fxt();
@After public void term() {if (Xoa_test_.Db_skip()) return; fxt.Rls();}
@@ -31,7 +32,7 @@ public class Xob_ctg_v1_sql_tst {
, fxt.doc_wo_date_(5, "E" , "[[Category:Ctg_a'b]]")
, fxt.doc_wo_date_(6, "F" , "[[Category:Ctg_a\\]]")
)
.Exec_run(new Xob_page_sql(fxt.Bldr(), fxt.Wiki()))
.Exec_run(new Xob_page_cmd(fxt.Bldr(), fxt.Wiki()))
.Exec_run(new Xob_ctg_v1_sql().Ctor(fxt.Bldr(), fxt.Wiki()))
;
fxt.Test_file(Xoa_test_.Url_root().GenSubFil_nest("root", "wiki", "en.wikipedia.org", "xowa_categorylinks.sql").Raw(), String_.Concat_lines_nl
@@ -62,7 +63,7 @@ public class Xob_ctg_v1_sql_tst {
fxt.doc_ary_
( fxt.doc_wo_date_(1, "A" , "[[Category:Ctg_0]] [[Category:Ctg_0]]")
)
.Exec_run(new Xob_page_sql(fxt.Bldr(), fxt.Wiki()))
.Exec_run(new Xob_page_cmd(fxt.Bldr(), fxt.Wiki()))
.Exec_run(new Xob_ctg_v1_sql().Ctor(fxt.Bldr(), fxt.Wiki()))
;
fxt.Test_file(Xoa_test_.Url_root().GenSubFil_nest("root", "wiki", "en.wikipedia.org", "xowa_categorylinks.sql").Raw(), String_.Concat_lines_nl

View File

@@ -15,9 +15,9 @@ 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.bldrs.imports.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.imports.*;
package gplx.xowa.bldrs.cmds.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import gplx.ios.*;
public class Xob_ctg_v1_txt extends Xob_ctg_v1_base {
@Override public String Wkr_key() {return KEY;} public static final String KEY = "core.make_category";
@Override public String Wkr_key() {return Xob_cmd_keys.Key_tdb_make_category;}
@Override public Io_sort_cmd Make_sort_cmd() {return new Xob_make_cmd_site(bldr.Usr_dlg(), make_dir, make_fil_len);}
}

View File

@@ -15,7 +15,7 @@ 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.bldrs.imports.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.imports.*;
package gplx.xowa.bldrs.cmds.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import gplx.ios.*;
interface Xob_sql_join_wkr {
Io_line_rdr New_main_rdr();

View File

@@ -15,7 +15,7 @@ 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.bldrs.imports.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.imports.*;
package gplx.xowa.bldrs.cmds.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import gplx.ios.*;
public abstract class Xoctg_hiddencat_parser_base extends Xob_sql_dump_base implements Sql_file_parser_cmd {
public Xoctg_hiddencat_parser_base Ctor(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki); this.make_fil_len = Io_mgr.Len_mb; return this;}

View File

@@ -15,29 +15,25 @@ 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.bldrs.imports.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.imports.*;
import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.dbs.tbls.*;
package gplx.xowa.bldrs.cmds.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.wikis.data.tbls.*;
import gplx.xowa.wikis.data.*;
public class Xoctg_hiddencat_parser_sql extends Xoctg_hiddencat_parser_base {
public Xoctg_hiddencat_parser_sql(Xob_bldr bldr, Xowe_wiki wiki) {this.Ctor(bldr, wiki);} private Db_conn conn;
@Override public String Cmd_key() {return KEY;} public static final String KEY = "import.sql.hiddencat";
private Xowd_cat_core_tbl tbl;
public Xoctg_hiddencat_parser_sql(Xob_bldr bldr, Xowe_wiki wiki) {this.Ctor(bldr, wiki);}
@Override public String Cmd_key() {return Xob_cmd_keys.Key_text_cat_hidden;}
@Override public void Cmd_bgn_hook(Xob_bldr bldr, Sql_file_parser parser) {
super.Cmd_bgn_hook(bldr, parser);
Xodb_mgr_sql db_mgr = wiki.Db_mgr_as_sql();
Xowe_core_data_mgr core_data_mgr = db_mgr.Core_data_mgr();
conn = core_data_mgr.Conn_ctg();
conn.Txn_mgr().Txn_bgn_if_none();
tbl = db_mgr.Tbl_category();
stmt = tbl.Update_stmt(conn);
tbl = db_mgr.Core_data_mgr().Db__cat_core().Tbl__cat_core();
tbl.Update_bgn();
}
private Xodb_category_tbl tbl; private Db_stmt stmt;
@Override public void Exec_hook(Bry_bfr file_bfr, int cur_id, boolean cur_is_hiddencat) {
if (cur_is_hiddencat)
tbl.Update(stmt, cur_id, cur_is_hiddencat ? Bool_.Y_byte : Bool_.N_byte);
tbl.Update_by_batch(cur_id, cur_is_hiddencat ? Bool_.Y_byte : Bool_.N_byte);
}
@Override public void Cmd_end() {
if (stmt == null) return; // stmt is null when ctg fails (for example, category files not downloaded); DATE:2013-12-20
conn.Txn_mgr().Txn_end_all();
tbl.Update_end();
if (!Env_.Mode_testing()) // NOTE: do not delete when testing
Io_mgr._.DeleteDirDeep(wiki.Fsys_mgr().Tmp_dir()); // delete /wiki/wiki_name/tmp
Io_url[] sql_files = Io_mgr._.QueryDir_args(wiki.Fsys_mgr().Root_dir()).FilPath_("*.sql.gz").ExecAsUrlAry();

View File

@@ -15,14 +15,15 @@ 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.bldrs.imports.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.imports.*;
import org.junit.*; import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.dbs.tbls.*;
package gplx.xowa.bldrs.cmds.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import org.junit.*; import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.bldrs.*;
public class Xoctg_hiddencat_parser_sql_tst {
@Before public void init() {if (Xoa_test_.Db_skip()) return; fxt.Ctor_fsys();} Db_mgr_fxt fxt = new Db_mgr_fxt();
@After public void term() {if (Xoa_test_.Db_skip()) return; fxt.Rls();}
@Test public void Basic() {
if (Xoa_test_.Db_skip()) return;
fxt.Init_db_sqlite();
fxt.Wiki().Db_mgr_as_sql().Core_data_mgr().Db__cat_core().Tbl__cat_core().Create_tbl();
Init_ctgs(1, 2, 3);
Io_url page_props_url = Xoa_test_.Url_root().GenSubFil_nest("root", "wiki", "en.wikipedia.org", "page_props.sql");
fxt .Init_fil(page_props_url, String_.Concat
@@ -39,23 +40,21 @@ public class Xoctg_hiddencat_parser_sql_tst {
}
private void Init_ctgs(int... ctgs) {
int len = ctgs.length;
Xodb_category_tbl tbl = fxt.Wiki().Db_mgr_as_sql().Tbl_category();
Db_conn conn = fxt.Wiki().Db_mgr_as_sql().Core_data_mgr().Conn_ctg();
Db_stmt stmt = tbl.Insert_stmt(conn);
Xowd_cat_core_tbl tbl = fxt.Wiki().Db_mgr_as_sql().Core_data_mgr().Db__cat_core().Tbl__cat_core().Create_tbl();
tbl.Insert_bgn();
try {
for (int i = 0; i < len; i++) {
int ctg_id = ctgs[i];
tbl.Insert(stmt, ctg_id, 0, 0, 0, Bool_.N_byte, 0);
tbl.Insert_cmd_by_batch(ctg_id, 0, 0, 0, Bool_.N_byte, 0);
}
} finally {stmt.Rls();}
} finally {tbl.Insert_end();}
}
private void Tst_ctg_hidden(boolean expd_hidden, int... ctgs) {
int len = ctgs.length;
Xodb_category_tbl tbl = fxt.Wiki().Db_mgr_as_sql().Tbl_category();
Db_conn conn = fxt.Wiki().Db_mgr_as_sql().Core_data_mgr().Conn_ctg();
Xowd_cat_core_tbl tbl = fxt.Wiki().Db_mgr_as_sql().Core_data_mgr().Db__cat_core().Tbl__cat_core();
for (int i = 0; i < len; i++) {
int ctg_id = ctgs[i];
Xodb_category_itm ctg_itm = tbl.Select(conn, ctg_id);
Xowd_category_itm ctg_itm = tbl.Select(ctg_id);
Tfds.Eq(expd_hidden, ctg_itm.Hidden(), Int_.Xto_str(ctg_id));
}
}

View File

@@ -15,11 +15,11 @@ 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.bldrs.imports.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.imports.*;
package gplx.xowa.bldrs.cmds.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import gplx.ios.*;
public class Xoctg_hiddencat_parser_txt extends Xoctg_hiddencat_parser_base {
public Xoctg_hiddencat_parser_txt(Xob_bldr bldr, Xowe_wiki wiki) {this.Ctor(bldr, wiki);}
@Override public String Cmd_key() {return KEY;} public static final String KEY = "ctg.hiddencat_sql";
@Override public String Cmd_key() {return Xob_cmd_keys.Key_tdb_cat_hidden_sql;}
@Override public void Cmd_bgn_hook(Xob_bldr bldr, Sql_file_parser parser) {
super.Cmd_bgn_hook(bldr, parser);
}

View File

@@ -15,15 +15,15 @@ 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.bldrs.imports.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.imports.*;
import gplx.ios.*; import gplx.xowa.tdbs.*;
package gplx.xowa.bldrs.cmds.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import gplx.ios.*; import gplx.xowa.tdbs.*; import gplx.xowa.bldrs.*;
public class Xoctg_hiddencat_ttl_wkr extends Xob_itm_dump_base implements Xob_cmd, GfoInvkAble {
public Xoctg_hiddencat_ttl_wkr(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki); this.make_fil_len = Io_mgr.Len_mb;} private Xob_sql_join_wkr_ctg_hidden join_wkr;
public String Cmd_key() {return KEY;} public static final String KEY = "ctg.hiddencat_ttl";
public void Cmd_ini(Xob_bldr bldr) {}
public String Cmd_key() {return Xob_cmd_keys.Key_tdb_cat_hidden_ttl;}
public void Cmd_init(Xob_bldr bldr) {}
public void Cmd_bgn(Xob_bldr bldr) {
this.Init_dump(KEY);
src_sql_dir = wiki.Fsys_mgr().Tmp_dir().GenSubDir_nest(Xoctg_hiddencat_parser_txt.KEY, "make");
this.Init_dump(Xob_cmd_keys.Key_tdb_cat_hidden_ttl);
src_sql_dir = wiki.Fsys_mgr().Tmp_dir().GenSubDir_nest(Xob_cmd_keys.Key_tdb_cat_hidden_sql, "make");
join_wkr = new Xob_sql_join_wkr_ctg_hidden(bldr.App(), wiki, temp_dir, src_sql_dir);
} Io_url src_sql_dir;
public void Cmd_run() {
@@ -35,7 +35,7 @@ public class Xoctg_hiddencat_ttl_wkr extends Xob_itm_dump_base implements Xob_cm
Xobdc_merger.Basic(bldr.Usr_dlg(), join_wkr.Dump_url_gen(), temp_dir.GenSubDir("sort"), sort_mem_len, Io_sort_split_itm_sorter._, Io_line_rdr_key_gen_.first_pipe, new Io_sort_fil_basic(bldr.Usr_dlg(), make_url_gen, make_fil_len));
if (delete_temp) Io_mgr._.DeleteDirDeep(src_sql_dir);
}
public void Cmd_print() {}
public void Cmd_term() {}
}
class Xob_sql_join_wkr_ctg_hidden implements Xob_sql_join_wkr {
public Xob_sql_join_wkr_ctg_hidden(Xoae_app app, Xowe_wiki wiki, Io_url temp_dir, Io_url src_sql_dir) {

View File

@@ -15,8 +15,8 @@ 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.bldrs.imports.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.imports.*;
import org.junit.*;
package gplx.xowa.bldrs.cmds.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import org.junit.*; import gplx.xowa.bldrs.*;
public class Xoctg_hiddencat_ttl_wkr_tst {
@Before public void init() {fxt.Clear();} private Xob_base_fxt fxt = new Xob_base_fxt();
@Test public void Basic() {
@@ -31,7 +31,7 @@ public class Xoctg_hiddencat_ttl_wkr_tst {
, "!!!!#|C"
, "!!!!%|A"
))
.Exec_cmd(Xoctg_hiddencat_ttl_wkr.KEY)
.Exec_cmd(Xob_cmd_keys.Key_tdb_cat_hidden_ttl)
.Test_fil("mem/xowa/wiki/en.wikipedia.org/tmp/ctg.hiddencat_ttl/dump/0000000000.csv", String_.Concat_lines_nl
( "C|!!!!#"
, "A|!!!!%"

View File

@@ -15,15 +15,15 @@ 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.bldrs.imports.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.imports.*;
package gplx.xowa.bldrs.cmds.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import gplx.core.flds.*; import gplx.ios.*; import gplx.xowa.ctgs.*; import gplx.xowa.tdbs.*;
public class Xoctg_link_idx_wkr extends Xob_idx_base { // NOTE: similar functionality to Xob_make_cmd_site, but more complicated due to p,f,s; not inheriting
Io_url src_link_dir; int make_fil_max = Int_.MinValue;
public Xoctg_link_idx_wkr(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);}
@Override public String Cmd_key() {return KEY;} public static final String KEY = "ctg.link_idx";
@Override public String Cmd_key() {return Xob_cmd_keys.Key_tdb_ctg_link_idx;}
@Override public void Cmd_bgn_hook() {
this.fld_rdr = this.Fld_rdr();
if (src_link_dir == null) src_link_dir = wiki.Fsys_mgr().Tmp_dir().GenSubDir_nest(Xob_categorylinks_txt.KEY, "make");
if (src_link_dir == null) src_link_dir = wiki.Fsys_mgr().Tmp_dir().GenSubDir_nest(Xob_cmd_keys.Key_tdb_text_cat_link, "make");
if (make_fil_max == Int_.MinValue) make_fil_max = Io_mgr.Len_mb;
make_link_mgr = new Xoctg_make_link_mgr(usr_dlg, make_fil_max, wiki.Tdb_fsys_mgr());
make_main_mgr = new Xoctg_make_main_mgr(usr_dlg, make_fil_max, wiki.Tdb_fsys_mgr());
@@ -160,7 +160,7 @@ class Xoctg_make_main_mgr {
make_fld_wtr = Gfo_fld_wtr.xowa_().Bfr_(make_fil_bfr);
make_dir = fsys_mgr.Url_site_dir(Xotdb_dir_info_.Tid_category2_main);
make_cmd = new Xob_make_cmd_site(usr_dlg, make_dir, make_fil_max);
src_dir = fsys_mgr.Tmp_dir().GenSubDir_nest(Xoctg_hiddencat_ttl_wkr.KEY, "make");
src_dir = fsys_mgr.Tmp_dir().GenSubDir_nest(Xob_cmd_keys.Key_tdb_cat_hidden_ttl, "make");
hidden_rdr = new Io_line_rdr(usr_dlg, Io_mgr._.QueryDir_fils(src_dir));
} Gfo_fld_wtr make_fld_wtr; Bry_bfr make_fil_bfr; int make_fil_max; Xob_make_cmd_site make_cmd; Io_line_rdr hidden_rdr;
public Io_url Src_dir() {return src_dir;} Io_url src_dir;

View File

@@ -15,8 +15,8 @@ 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.bldrs.imports.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.imports.*;
import org.junit.*; import gplx.xowa.ctgs.*;
package gplx.xowa.bldrs.cmds.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import org.junit.*; import gplx.xowa.ctgs.*; import gplx.xowa.bldrs.*;
public class Xoctg_link_idx_wkr_tst {
@Before public void init() {fxt.Clear();} private Xob_base_fxt fxt = new Xob_base_fxt();
@Test public void Basic() {
@@ -31,7 +31,7 @@ public class Xoctg_link_idx_wkr_tst {
.Init_fil("mem/xowa/wiki/en.wikipedia.org/tmp/ctg.hiddencat_ttl/make/0000000000.csv", String_.Concat_lines_nl
( "Ctg_2|!!!!%|"
))
.Exec_cmd(Xoctg_link_idx_wkr.KEY, GfoMsg_.basic_(Xoctg_link_idx_wkr.Invk_make_fil_max_, 72))
.Exec_cmd(Xob_cmd_keys.Key_tdb_ctg_link_idx, GfoMsg_.basic_(Xoctg_link_idx_wkr.Invk_make_fil_max_, 72))
.Test_fil("mem/xowa/wiki/en.wikipedia.org/site/category2/link/00/00/00/00/0000000000.xdat", String_.Concat_lines_nl
( "!!!\"(|"
, "Ctg_1|!!!!4|!!!!3|!!!!?|!!!!@;#8DDL;Ctg_1a|!!!!#;#8DDL;A.png|!!!!$;#8DDL;A0|!!!!%;#8DDL;A1|"

View File

@@ -15,18 +15,18 @@ 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.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*;
import gplx.dbs.*; import gplx.xowa.bldrs.oimgs.*;
import gplx.fsdb.*; import gplx.fsdb.meta.*;
package gplx.xowa.bldrs.cmds.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import gplx.dbs.*; import gplx.fsdb.*; import gplx.fsdb.meta.*;
import gplx.xowa.bldrs.*;
public class Xob_diff_regy_exec_cmd extends Xob_itm_basic_base implements Xob_cmd {
private Io_url sql_dir;
public Xob_diff_regy_exec_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);}
public String Cmd_key() {return KEY_oimg;} public static final String KEY_oimg = "file.diff_regy.exec";
public void Cmd_ini(Xob_bldr bldr) {}
public String Cmd_key() {return Xob_cmd_keys.Key_diff_regy_exec;}
public void Cmd_init(Xob_bldr bldr) {}
public void Cmd_bgn(Xob_bldr bldr) {}
public void Cmd_run() {Exec_main();}
public void Cmd_end() {}
public void Cmd_print() {}
public void Cmd_term() {}
private void Exec_main() {
if (sql_dir == null)
sql_dir = wiki.Ctx().App().Fsys_mgr().File_dir().GenSubDir_nest(wiki.Domain_str(), "tmp_sql");
@@ -35,7 +35,7 @@ public class Xob_diff_regy_exec_cmd extends Xob_itm_basic_base implements Xob_cm
int urls_len = urls.length;
for (int i = 0; i < urls_len; ++i)
runner.Exec(app, urls[i]);
Xob_diff_regy_sql_runner.Get_provider(wiki, 0, Fsdb_db_tid_.Tid_atr).Exec_sql("VACUUM;");
Xob_diff_regy_sql_runner.Get_conn(wiki, 0, Fsdb_db_tid_.Tid_atr).Exec_sql("VACUUM;");
}
@Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_sql_dir_)) sql_dir = m.ReadIoUrl("v");
@@ -62,23 +62,23 @@ class Xob_diff_regy_sql_runner {
public void Run_sql(Xoae_app app) {
Xowe_wiki wiki = app.Wiki_mgr().Get_by_key_or_null(Bry_.new_utf8_(wiki_domain));
app.Usr_dlg().Prog_many("", "", "running sql: url=~{0}", url.NameAndExt());
Db_conn conn = Get_provider(wiki, fsdb_db_id, fsdb_db_tid);
Db_conn conn = Get_conn(wiki, fsdb_db_id, fsdb_db_tid);
conn.Exec_sql(Io_mgr._.LoadFilStr(url));
if (fsdb_db_tid == Fsdb_db_tid_.Tid_bin)
conn.Exec_sql("VACUUM;");
}
public static Db_conn Get_provider(Xowe_wiki wiki, int fsdb_db_id, byte fsdb_db_tid) {
wiki.File_mgr().Fsdb_mgr().Init_by_wiki(wiki);
Fsm_abc_mgr abc_mgr = wiki.File_mgr().Fsdb_mgr().Mnt_mgr().Mnts__at(0);
public static Db_conn Get_conn(Xowe_wiki wiki, int fsdb_db_id, byte fsdb_db_tid) {
wiki.File_mgr().Init_file_mgr_by_load(wiki);
Fsm_mnt_itm abc_mgr = wiki.File_mgr().Fsdb_mgr().Mnt_mgr().Mnts__get_main();
if (fsdb_db_tid == Fsdb_db_tid_.Tid_bin)
return abc_mgr.Bin_mgr().Get_at(fsdb_db_id).Conn();
return abc_mgr.Bin_mgr().Dbs__get_at(fsdb_db_id).Conn();
else if (fsdb_db_tid == Fsdb_db_tid_.Tid_atr)
return abc_mgr.Atr_mgr().Get_at(0).Conn();
return abc_mgr.Atr_mgr().Db__core().Conn();
else
throw Err_.unhandled(fsdb_db_tid);
}
public static String Build_url(String wiki_domain, int fsdb_db_id, String fsdb_db_type) {
return String_.Format("{0}-{1}-{2}.sql", wiki_domain, Int_.Xto_str_pad_bgn(fsdb_db_id, 3), fsdb_db_type);
return String_.Format("{0}-{1}-{2}.sql", wiki_domain, Int_.Xto_str_pad_bgn_zero(fsdb_db_id, 3), fsdb_db_type);
}
}
class Fsdb_db_tid_ {

View File

@@ -15,7 +15,7 @@ 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.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*;
package gplx.xowa.bldrs.cmds.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import org.junit.*;
import gplx.fsdb.*;
public class Xob_diff_regy_exec_cmd_tst {

View File

@@ -15,19 +15,18 @@ 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.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*;
import gplx.dbs.*; import gplx.fsdb.*; import gplx.xowa.bldrs.oimgs.*;
import gplx.dbs.engines.sqlite.*;
package gplx.xowa.bldrs.cmds.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import gplx.dbs.*; import gplx.fsdb.*; import gplx.dbs.engines.sqlite.*;
public class Xob_diff_regy_make_cmd extends Xob_itm_basic_base implements Xob_cmd {
public Xob_diff_regy_make_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);}
public String Cmd_key() {return KEY_oimg;} public static final String KEY_oimg = "file.diff_regy.make";
public void Cmd_ini(Xob_bldr bldr) {}
public String Cmd_key() {return Xob_cmd_keys.Key_diff_regy_make;}
public void Cmd_init(Xob_bldr bldr) {}
public void Cmd_bgn(Xob_bldr bldr) {}
public void Cmd_run() {Exec_main();}
public void Cmd_end() {}
public void Cmd_print() {}
public void Cmd_term() {}
private void Exec_main() {
Db_conn make_db_provider = Xodb_db_file.init__file_make(wiki.Fsys_mgr().Root_dir()).Conn();
Db_conn make_db_provider = Xob_db_file.new__file_make(wiki.Fsys_mgr().Root_dir()).Conn();
this.Make_join_indexes(make_db_provider);
this.Make_diff_regy(make_db_provider);
this.Make_delete_sql(make_db_provider);
@@ -73,7 +72,7 @@ public class Xob_diff_regy_make_cmd extends Xob_itm_basic_base implements Xob_cm
private void Make_delete_sql_file(Bry_bfr bfr, Io_url sql_dir, int db_id, int cur_count, byte db_tid) {
if (db_id != -1 && cur_count > 0) { // do not write 1st bfr
bfr.Add_str("COMMIT;\n");
String sql_url_name = String_.Format("{0}-{1}-{2}.sql", wiki.Domain_str(), Int_.Xto_str_pad_bgn(db_id, 3), Fsdb_db_tid_.Xto_key(db_tid));
String sql_url_name = String_.Format("{0}-{1}-{2}.sql", wiki.Domain_str(), Int_.Xto_str_pad_bgn_zero(db_id, 3), Fsdb_db_tid_.Xto_key(db_tid));
Io_url sql_url = sql_dir.GenSubFil(sql_url_name);
Io_mgr._.SaveFilBfr(sql_url, bfr);
}

View File

@@ -0,0 +1,357 @@
/*
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.bldrs.cmds.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import gplx.dbs.*; import gplx.dbs.cfgs.*; import gplx.dbs.engines.sqlite.*;
import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; import gplx.xowa.dbs.*; import gplx.fsdb.*; import gplx.ios.*; import gplx.xowa.wikis.data.tbls.*;
import gplx.xowa.files.*; import gplx.xowa.files.repos.*; import gplx.xowa.files.bins.*; import gplx.xowa.files.fsdb.*;
import gplx.fsdb.data.*; import gplx.fsdb.meta.*;
public class Xob_fsdb_make_cmd extends Xob_itm_basic_base implements Xob_cmd {
private Db_conn bldr_conn; private Db_cfg_tbl bldr_cfg_tbl;
private Xof_bin_mgr src_bin_mgr; private Xof_bin_wkr__fsdb_sql src_fsdb_wkr; private boolean src_bin_mgr__cache_enabled = Bool_.N; private String src_bin_mgr__fsdb_version; private boolean src_bin_mgr__wmf_enabled;
private Fsm_mnt_itm trg_mnt_itm; private Fsm_cfg_mgr trg_cfg_mgr; private Fsm_atr_fil trg_atr_fil; private Fsm_bin_fil trg_bin_fil; private long trg_bin_db_max;
private final Xof_bin_updater trg_bin_updater = new Xof_bin_updater(); private Xob_tier_namer tier_namer; private int[] ns_ids; private int prv_lnki_tier_id = -1;
private long download_size_max = Io_mgr.Len_mb_long; private int[] download_keep_tier_ids = Int_.Ary(0);
private Xobu_poll_mgr poll_mgr; private int poll_interval; private long time_bgn;
private int select_interval = 2500, progress_interval = 1, commit_interval = 1, delete_interval = 5000;
private boolean exec_done, resume_enabled; private int exec_count, exec_count_max = Int_.MaxValue, exec_fail, exec_fail_max = 10000; // 115 errors over 900k images
private int tier_id_bmk = -1, tier_id_val = -1; private int page_id_bmk = -1, page_id_val = -1, page_id_end = Int_.MaxValue; private int lnki_id_bmk = -1, lnki_id_val = -1;
private boolean exit_after_commit, exit_now;
public Xob_fsdb_make_cmd(Xob_bldr bldr, Xowe_wiki wiki) {
this.Cmd_ctor(bldr, wiki);
this.poll_mgr = new Xobu_poll_mgr(bldr.App());
wiki.File_mgr__fsdb_mode().Tid_make_y_();
this.src_bin_mgr = new Xof_bin_mgr(new Fsm_mnt_mgr(), wiki.File_mgr__repo_mgr(), app.File_mgr__cache_mgr(), app.File_mgr__img_mgr().Wkr_resize_img());
}
public String Cmd_key() {return Xob_cmd_keys.Key_file_fsdb_make;}
public void Cmd_bgn(Xob_bldr bldr) {
wiki.Init_assert();
this.poll_interval = poll_mgr.Poll_interval();
this.tier_namer = new Xob_tier_namer(wiki.Domain_str(), ns_ids);
// src_bin_mgr
if (src_bin_mgr__fsdb_version != null) {
this.src_fsdb_wkr = Xof_bin_wkr__fsdb_sql.new_(wiki.File_mgr__mnt_mgr());
src_bin_mgr.Wkrs__add(src_fsdb_wkr);
src_fsdb_wkr.Mnt_mgr().Ctor_by_load(new_src_bin_db_mgr(wiki, src_bin_mgr__fsdb_version));
src_fsdb_wkr.Mnt_mgr().Mnts__get_main().Txn_bgn(); // NOTE: txn on atr speeds up from 50 -> 300; DATE:2015-03-21
if (src_bin_mgr__cache_enabled) {
usr_dlg.Prog_many("", "", "src_bin_mgr.cache.bgn");
src_fsdb_wkr.Mnt_mgr().Mnts__get_main().Atr_mgr().Db__core().Fil_cache_enabled_y_();
usr_dlg.Prog_many("", "", "src_bin_mgr.cache.end");
}
}
if (src_bin_mgr__wmf_enabled) {
Xof_bin_wkr__http_wmf wmf_wkr = Xof_bin_wkr__http_wmf.new_(wiki);
src_bin_mgr.Wkrs__add(wmf_wkr);
wmf_wkr.Fail_timeout_(0); // 1000; NOTE: set Fail_timeout here; DATE:2014-06-21; NOTE: do not put in ctor, or else will be 1st wkr; DATE:2014-06-28
}
// trg_mnt_itm
this.trg_bin_db_max = app.Api_root().Bldr().Wiki().Import().File_db_max();
Fsdb_db_mgr trg_db_mgr = Fsdb_db_mgr_.new_detect(wiki.Domain_str(), wiki.Fsys_mgr().Root_dir(), wiki.Fsys_mgr().File_dir());
if (trg_db_mgr == null) trg_db_mgr = Fsdb_db_mgr__v2_bldr.I.Make(wiki);
Fsm_mnt_mgr trg_mnt_mgr = new Fsm_mnt_mgr(); trg_mnt_mgr.Ctor_by_load(trg_db_mgr);
trg_mnt_mgr.Mnts__get_insert_idx_(Fsm_mnt_mgr.Mnt_idx_main); // NOTE: do not delete; mnt_mgr default to Mnt_idx_user; DATE:2014-04-25
this.trg_mnt_itm = trg_mnt_mgr.Mnts__get_insert();
Fsm_mnt_mgr.Patch(trg_mnt_itm.Cfg_mgr().Tbl()); // NOTE: always patch again; fsdb_make may be run separately without lnki_temp; DATE:2014-04-26
this.trg_atr_fil = trg_mnt_itm.Atr_mgr().Db__core();
this.trg_cfg_mgr = trg_mnt_itm.Cfg_mgr();
trg_atr_fil.Conn().Txn_bgn();
// bldr_db
Xob_db_file bldr_db = Xob_db_file.new__file_make(wiki.Fsys_mgr().Root_dir());
this.bldr_conn = bldr_db.Conn();
this.bldr_cfg_tbl = bldr_db.Tbl__cfg(); // NOTE: cfg and atr is in same db; use it
bldr_cfg_tbl.Conn().Txn_bgn();
}
public void Cmd_run() {
Init_bldr_bmks();
this.time_bgn = Env_.TickCount();
int total_pending = Xob_xfer_regy_tbl.Select_total_pending(bldr_conn);
// if (total_pending > 250000 && src_bin_mgr__fsdb_version == null)
usr_dlg.Note_many("", "", "total pending: ~{0}", total_pending);
ListAdp list = ListAdp_.new_();
boolean loop = true;
while (loop) {
byte rslt = Select_fsdb_itms(list);
switch (rslt) {
case Select_rv_stop:
if (tier_namer.Is_last(tier_id_val))
loop = false;
else {
++tier_id_val;
page_id_val = 0;
continue;
}
break;
case Select_rv_next_page: ++page_id_val; lnki_id_val = 0; continue;
case Select_rv_process: break;
}
if (!loop) break; // no more ttls found
int len = list.Count();
usr_dlg.Prog_many("", "", "fetched pages: ~{0}", len);
for (int i = 0; i < len; ++i) {
Xodb_tbl_oimg_xfer_itm fsdb = (Xodb_tbl_oimg_xfer_itm)list.FetchAt(i);
Download_itm(fsdb);
if ( exit_now
|| exec_count >= exec_count_max
|| exec_fail >= exec_fail_max
|| page_id_val >= page_id_end
) {
this.Txn_sav();
return;
}
}
}
exec_done = true;
}
public void Cmd_end() {
usr_dlg.Note_many("", "", "fsdb_make.done: count=~{0} rate=~{1}", exec_count, DecimalAdp_.divide_safe_(exec_count, Env_.TickCount_elapsed_in_sec(time_bgn)).Xto_str("#,###.000"));
src_fsdb_wkr.Mnt_mgr().Mnts__get_main().Txn_end();
trg_atr_fil.Conn().Txn_end(); trg_atr_fil.Conn().Rls_conn();
if (!trg_mnt_itm.Db_mgr().File__solo_file()) {
trg_bin_fil.Conn().Txn_end(); trg_bin_fil.Conn().Rls_conn();
}
if (exec_done) {
bldr_cfg_tbl.Delete_grp(Cfg_fsdb_make); // delete bmks for future reruns; DATE:2014-08-20
Io_mgr._.DeleteFil_args(wiki.Fsys_mgr().Root_dir().GenSubFil("xowa.file.make.cfg.gfs")).MissingFails_off().Exec();
}
bldr_conn.Rls_conn();
}
private void Init_bldr_bmks() {
if (!resume_enabled) // clear cfg entries if resume disabled; note that disabled by default; DATE:2014-10-24
bldr_cfg_tbl.Delete_grp(Cfg_fsdb_make);
Db_cfg_hash bmk_hash = bldr_cfg_tbl.Select_as_hash(Cfg_fsdb_make);
String tier_id_str = bmk_hash.Get(Cfg_tier_id_bmk).To_str_or(null);
if (tier_id_str == null) { // bmks not found; new db;
bldr_conn.Txn_bgn();
bldr_cfg_tbl.Insert_int(Cfg_fsdb_make, Cfg_tier_id_bmk , tier_id_bmk);
bldr_cfg_tbl.Insert_int(Cfg_fsdb_make, Cfg_page_id_bmk , page_id_bmk);
bldr_cfg_tbl.Insert_int(Cfg_fsdb_make, Cfg_lnki_id_bmk , lnki_id_bmk);
bldr_conn.Txn_end();
if (tier_id_bmk == -1) tier_id_bmk = 0;
if (page_id_bmk == -1) page_id_bmk = 0;
if (lnki_id_bmk == -1) lnki_id_bmk = 0;
}
else {
if (tier_id_bmk == -1) {
tier_id_bmk = Int_.parse_(tier_id_str);
usr_dlg.Note_many("", "", "restoring from bmk: tier_id=~{0}", tier_id_bmk);
}
if (page_id_bmk == -1) {
page_id_bmk = bmk_hash.Get(Cfg_page_id_bmk).To_int();
usr_dlg.Note_many("", "", "restoring from bmk: page_id=~{0}", page_id_bmk);
}
if (lnki_id_bmk == -1) {
lnki_id_bmk = bmk_hash.Get(Cfg_lnki_id_bmk).To_int();
usr_dlg.Note_many("", "", "restoring from bmk: lnki_id=~{0}", lnki_id_bmk);
}
}
tier_id_val = tier_id_bmk;
page_id_val = page_id_bmk;
lnki_id_val = lnki_id_bmk;
}
private byte Select_fsdb_itms(ListAdp list) {
list.Clear();
boolean pages_found = false, links_found = false;
DataRdr rdr = Xob_xfer_regy_tbl.Select_by_tier_page(bldr_conn, tier_id_val, page_id_val, select_interval);
try {
while (rdr.MoveNextPeer()) {
pages_found = true; // at least one page found; set true
Xodb_tbl_oimg_xfer_itm itm = Xodb_tbl_oimg_xfer_itm.new_rdr_( rdr);
if ( itm.Lnki_page_id() == page_id_val // same page_id
&& itm.Lnki_id() <= lnki_id_val // ... but lnki_id < last
)
continue; // ... ignore; note that select is by page_id, not page_id + link_id; needed else restarts would not resume exactly at same point;
links_found = true;
list.Add(itm);
}
} finally {rdr.Rls();}
if (pages_found && !links_found) return Select_rv_next_page; // pages found, but all links processed
else if (!pages_found) return Select_rv_stop; // no more pages found
else return Select_rv_process; // pages and links found
}
private void Download_itm(Xodb_tbl_oimg_xfer_itm fsdb) {
try {
tier_id_val = fsdb.Lnki_tier_id();
page_id_val = fsdb.Lnki_page_id();
lnki_id_val = fsdb.Lnki_id();
fsdb.Orig_repo_name_(fsdb.Orig_repo_id() == Xof_repo_itm.Repo_local ? wiki.Domain_bry() : Xow_domain_.Domain_bry_commons);
Download_exec(fsdb);
++exec_count;
if (exec_count % progress_interval == 0) Print_progress(fsdb);
if (exec_count % poll_interval == 0) poll_mgr.Poll();
if (exec_count % commit_interval == 0) Txn_sav();
if (exec_count % delete_interval == 0) Delete_files();
}
catch (Exception exc) {
++exec_fail;
usr_dlg.Warn_many("", "", "download error; ttl=~{0} w=~{1} err=~{2}", fsdb.Lnki_ttl(), fsdb.Lnki_w(), Err_.Message_gplx(exc));
}
}
private void Download_exec(Xodb_tbl_oimg_xfer_itm fsdb) {
Io_stream_rdr src_rdr = src_bin_mgr.Find_as_rdr(Xof_exec_tid.Tid_wiki_page, fsdb);
try {
if (src_rdr == Io_stream_rdr_.Null) { // download failed
++exec_fail;
usr_dlg.Warn_many("", "", "failed: ttl=~{0}", String_.Format("[[File:{0}|{1}px]]", fsdb.Lnki_ttl(), fsdb.Html_w()));
Print_progress(fsdb);
}
else { // download passed
long src_rdr_len = src_rdr.Len();
int lnki_tier_id = fsdb.Lnki_tier_id();
if ( src_rdr_len > download_size_max
&& !Int_.In(lnki_tier_id, download_keep_tier_ids)) {
usr_dlg.Warn_many("", "", "skipped; ttl=~{0} w=~{1} size=~{2} tier=~{3}", fsdb.Lnki_ttl(), fsdb.Lnki_w(), src_rdr_len, lnki_tier_id);
return;
}
if (trg_bin_fil == null) // no trg_bin_fil
Make_trg_bin_file(fsdb);
else if (trg_bin_fil.Bin_len() + src_rdr_len > trg_bin_db_max) // or trg_bin_fil is out of space
Make_trg_bin_file(fsdb);
else if (prv_lnki_tier_id != lnki_tier_id) {
if (prv_lnki_tier_id != -1)
Make_trg_bin_file(fsdb);
prv_lnki_tier_id = lnki_tier_id;
}
trg_bin_updater.Save_bin(trg_mnt_itm, trg_atr_fil, trg_bin_fil, fsdb, src_rdr, src_rdr_len);
}
}
finally {src_rdr.Rls();}
}
private void Make_trg_bin_file(Xodb_tbl_oimg_xfer_itm fsdb) {
if ( trg_bin_fil != null // null-check needed for 1st call
&& !trg_mnt_itm.Db_mgr().File__solo_file()) // don't close if one file
trg_bin_fil.Conn().Txn_end(); // close txn
String trg_bin_fil_name = tier_namer.Gen_name_and_add(fsdb.Lnki_tier_id()); // gen name
this.trg_bin_fil = trg_mnt_itm.Bin_mgr().Dbs__make(trg_bin_fil_name); // create trg_bin_fil
if (!trg_mnt_itm.Db_mgr().File__solo_file()) {
Fsdb_db_file trg_bin_db = trg_mnt_itm.Db_mgr().File__bin_file__at(trg_mnt_itm.Id(), trg_bin_fil.Id(), trg_bin_fil_name);
Fsdb_db_mgr__v2_bldr.Make_cfg_data(wiki, trg_atr_fil.Url_rel(), trg_bin_db, Xowd_db_file_.Tid_file_data, trg_bin_fil.Id() + ListAdp_.Base1);
trg_bin_fil.Conn().Txn_bgn();
}
}
private void Txn_sav() {
usr_dlg.Prog_many("", "", "committing data: count=~{0} failed=~{1}", exec_count, exec_fail);
bldr_cfg_tbl.Update_int(Cfg_fsdb_make, Cfg_page_id_bmk, page_id_val);
bldr_cfg_tbl.Update_int(Cfg_fsdb_make, Cfg_lnki_id_bmk, lnki_id_val);
bldr_cfg_tbl.Conn().Txn_sav();
trg_cfg_mgr.Next_id_commit();
trg_atr_fil.Conn().Txn_sav();
if (!trg_mnt_itm.Db_mgr().File__solo_file())
trg_bin_fil.Conn().Txn_sav();
if (exit_after_commit) exit_now = true;
}
private void Print_progress(Xodb_tbl_oimg_xfer_itm itm) {
int time_elapsed = Env_.TickCount_elapsed_in_sec(time_bgn);
usr_dlg.Prog_many("", "", "prog: num=~{0} err=~{1} time=~{2} rate=~{3} page=~{4} lnki=~{5} ttl=~{6}", exec_count, exec_fail, time_elapsed, Math_.Div_safe_as_int(exec_count, time_elapsed), page_id_val, lnki_id_val, String_.new_utf8_(itm.Orig_ttl()));
}
private void Delete_files() {}// TODO: purge /xowa/file/ dir to free up hard disk space
public void Cmd_init(Xob_bldr bldr) {}
public void Cmd_term() {}
@Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_tier_id_bmk_)) tier_id_bmk = m.ReadInt("v");
else if (ctx.Match(k, Invk_page_id_bmk_)) page_id_bmk = m.ReadInt("v");
else if (ctx.Match(k, Invk_lnki_id_bmk_)) lnki_id_bmk = m.ReadInt("v");
else if (ctx.Match(k, Invk_select_interval_)) select_interval = m.ReadInt("v");
else if (ctx.Match(k, Invk_commit_interval_)) commit_interval = m.ReadInt("v");
else if (ctx.Match(k, Invk_progress_interval_)) progress_interval = m.ReadInt("v");
else if (ctx.Match(k, Invk_delete_interval_)) delete_interval = m.ReadInt("v");
else if (ctx.Match(k, Invk_exec_count_max_)) exec_count_max = m.ReadInt("v");
else if (ctx.Match(k, Invk_exec_fail_max_)) exec_fail_max = m.ReadInt("v");
else if (ctx.Match(k, Invk_exit_after_commit_)) exit_after_commit = m.ReadYn("v");
else if (ctx.Match(k, Invk_exit_now_)) exit_now = m.ReadYn("v");
else if (ctx.Match(k, Invk_resume_enabled_)) resume_enabled = m.ReadYn("v");
else if (ctx.Match(k, Invk_ns_ids_)) ns_ids = Int_.Ary_parse(m.ReadStr("v"), "|");
else if (ctx.Match(k, Invk_src_bin_mgr__fsdb_version_)) src_bin_mgr__fsdb_version = m.ReadStr("v");
else if (ctx.Match(k, Invk_src_bin_mgr__wmf_enabled_)) src_bin_mgr__wmf_enabled = m.ReadYn("v");
else if (ctx.Match(k, Invk_src_bin_mgr__cache_enabled_)) src_bin_mgr__cache_enabled = m.ReadYn("v");
else if (ctx.Match(k, Invk_poll_mgr)) return poll_mgr;
else if (ctx.Match(k, Invk_download_keep_tier_ids)) download_keep_tier_ids = Int_.Ary_parse(m.ReadStr("v"), "|");
else if (ctx.Match(k, Invk_download_size_max)) download_size_max = Io_size_.To_long_by_msg_mb(m);
else return GfoInvkAble_.Rv_unhandled;
return this;
}
private static final String
Invk_tier_id_bmk_ = "tier_id_bmk_", Invk_page_id_bmk_ = "page_id_bmk_", Invk_lnki_id_bmk_ = "lnki_id_bmk_"
, Invk_select_interval_ = "select_interval_", Invk_commit_interval_ = "commit_interval_", Invk_progress_interval_ = "progress_interval_", Invk_delete_interval_ = "delete_interval_"
, Invk_exec_count_max_ = "exec_count_max_", Invk_exec_fail_max_ = "exec_fail_max_", Invk_exit_now_ = "exit_now_", Invk_exit_after_commit_ = "exit_after_commit_"
, Invk_resume_enabled_ = "resume_enabled_", Invk_poll_mgr = "poll_mgr"
, Invk_src_bin_mgr__fsdb_version_ = "src_bin_mgr__fsdb_version_"
, Invk_src_bin_mgr__wmf_enabled_ = "src_bin_mgr__wmf_enabled_"
, Invk_src_bin_mgr__cache_enabled_ = "src_bin_mgr__cache_enabled_", Invk_ns_ids_ = "ns_ids_"
, Invk_download_size_max = "download_size_max", Invk_download_keep_tier_ids = "download_keep_tier_ids"
;
private static Fsdb_db_mgr new_src_bin_db_mgr(Xow_wiki wiki, String version) {
String domain_str = wiki.Domain_str();
Fsdb_db_mgr rv = null; Io_url url = null;
if (String_.Eq(version, "v1")) {
url = wiki.Fsys_mgr().File_dir().OwnerDir().GenSubDir(domain_str + "-prv"); // v1: EX: /xowa/file/en.wikipedia.org-prv/
rv = new Fsdb_db_mgr__v1(url);
}
else if (String_.Eq(version, "v2")) {
url = wiki.Fsys_mgr().Root_dir().GenSubDir("prv"); // v2: EX: /xowa/wiki/en.wikipedia.org/prv/
rv = Fsdb_db_mgr_.new_detect(domain_str, url, url); // note that v2 is prioritized over v1
}
else throw Err_.new_("fsdb.make:unknown fsdb_type; version={0}", version);
if (!Io_mgr._.ExistsFil(rv.File__mnt_file().Url())) throw Err_.new_("fsdb.make:source fsdb not found; version={0} url={1}", version, url.Raw());
return rv;
}
private static final byte Select_rv_stop = 0, Select_rv_process = 1, Select_rv_next_page = 2;
private static final String Cfg_fsdb_make = "bldr.fsdb_make", Cfg_tier_id_bmk = "tier_id_bmk", Cfg_page_id_bmk = "page_id_bmk", Cfg_lnki_id_bmk = "lnki_id_bmk";
public static byte Status_null = 0, Status_pass = 1, Status_fail = 2;
}
class Xodb_tbl_oimg_xfer_itm extends Xof_fsdb_itm { public int Lnki_id() {return lnki_id;} private int lnki_id;
public int Lnki_tier_id() {return lnki_tier_id;} private int lnki_tier_id;
public int Lnki_page_id() {return lnki_page_id;} private int lnki_page_id;
public static Xodb_tbl_oimg_xfer_itm new_rdr_(DataRdr rdr) {
Xodb_tbl_oimg_xfer_itm rv = new Xodb_tbl_oimg_xfer_itm();
rv.lnki_id = rdr.ReadInt(Xob_xfer_regy_tbl.Fld_lnki_id);
rv.lnki_page_id = rdr.ReadInt(Xob_xfer_regy_tbl.Fld_lnki_page_id);
rv.lnki_tier_id = rdr.ReadInt(Xob_xfer_regy_tbl.Fld_lnki_tier_id);
rv.Ctor_by_fsdb_make
( rdr.ReadBryByStr(Xob_xfer_regy_tbl.Fld_lnki_ttl)
, rdr.ReadInt(Xob_xfer_regy_tbl.Fld_lnki_ext)
, rdr.ReadInt(Xob_xfer_regy_tbl.Fld_file_w), rdr.ReadInt(Xob_xfer_regy_tbl.Fld_file_h) // set lnki_size; Xof_bin_mgr uses lnki_size
, Xof_lnki_time.Db_load_double(rdr, Xob_xfer_regy_tbl.Fld_lnki_time)
, Xof_lnki_page.Db_load_int(rdr, Xob_xfer_regy_tbl.Fld_lnki_page)
, rdr.ReadByte(Xob_xfer_regy_tbl.Fld_orig_repo)
, rdr.ReadInt(Xob_xfer_regy_tbl.Fld_orig_w)
, rdr.ReadInt(Xob_xfer_regy_tbl.Fld_orig_h)
, Bry_.Empty
, rdr.ReadByte(Xob_xfer_regy_tbl.Fld_file_is_orig) == Bool_.Y_byte
);
return rv;
}
}
class Xob_tier_namer {
private final String domain_str; private final int[] ns_ids;
private final int[] db_ids;
public Xob_tier_namer(String domain_str, int[] ns_ids) {
this.domain_str = domain_str;
this.ns_ids = ns_ids;
this.db_ids = new int[ns_ids.length];
}
public boolean Is_last(int v) {return v >= ns_ids.length;}
public int Db_id(int tier_id) {return db_ids[tier_id];}
public String Gen_name_and_add(int tier_id) {// en.wikipedia.org-file-ns.000-db.0001.xowa
if (tier_id >= ns_ids.length) throw Err_.new_("unknown grp: tier_id={0} len={1}", tier_id, ns_ids.length);
String ns_id = Int_.Xto_str_pad_bgn_zero(ns_ids[tier_id], 3);
int db_id_int = db_ids[tier_id];
db_ids[tier_id] = db_id_int + 1;
String db_id = Int_.Xto_str_pad_bgn_zero(db_id_int + ListAdp_.Base1, 3);
return String_.Format("{0}-file-ns.{1}-db.{2}.xowa", domain_str, ns_id, db_id);
}
}

View File

@@ -15,18 +15,18 @@ 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.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*;
import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.bldrs.oimgs.*;
package gplx.xowa.bldrs.cmds.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import gplx.dbs.*; import gplx.xowa.dbs.*;
public class Xob_lnki_regy_cmd extends Xob_itm_basic_base implements Xob_cmd {
public Xob_lnki_regy_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);}
public String Cmd_key() {return KEY_oimg;} public static final String KEY_oimg = "file.lnki_regy";
public void Cmd_ini(Xob_bldr bldr) {}
public String Cmd_key() {return Xob_cmd_keys.Key_file_lnki_regy;}
public void Cmd_init(Xob_bldr bldr) {}
public void Cmd_bgn(Xob_bldr bldr) {
Db_conn conn = Xodb_db_file.init__file_make(wiki.Fsys_mgr().Root_dir()).Conn();
Db_conn conn = Xob_db_file.new__file_make(wiki.Fsys_mgr().Root_dir()).Conn();
Xob_lnki_regy_tbl.Create_table(conn);
Xob_lnki_regy_tbl.Create_data(usr_dlg, conn, Xob_lnki_temp_wkr.Wiki_ns_for_file_is_case_match_all(wiki));
Xob_lnki_regy_tbl.Create_data(usr_dlg, conn, Xob_lnki_temp_wkr.Ns_file_is_case_match_all(wiki));
}
public void Cmd_run() {}
public void Cmd_end() {}
public void Cmd_print() {}
public void Cmd_term() {}
}

View File

@@ -15,9 +15,8 @@ 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.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*;
import gplx.dbs.*; import gplx.xowa.dbs.*;
import gplx.dbs.engines.sqlite.*;
package gplx.xowa.bldrs.cmds.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import gplx.dbs.*; import gplx.dbs.engines.sqlite.*;
class Xob_lnki_regy_tbl {
public static void Create_table(Db_conn p) {Sqlite_engine_.Tbl_create_and_delete(p, Tbl_name, Tbl_sql);}
public static void Create_data(Gfo_usr_dlg usr_dlg, Db_conn p, boolean wiki_ns_for_file_is_case_match_all) {
@@ -27,7 +26,7 @@ class Xob_lnki_regy_tbl {
Sqlite_engine_.Idx_create(usr_dlg, p, "lnki_regy_commons", Idx_ttl_commons);
}
public static final String Tbl_name = "lnki_regy"
, Fld_lnki_id = "lnki_id", Fld_lnki_page_id = "lnki_page_id"
, Fld_lnki_id = "lnki_id", Fld_lnki_tier_id = "lnki_tier_id", Fld_lnki_page_id = "lnki_page_id", Fld_lnki_page_ns = "lnki_page_ns"
, Fld_lnki_ttl = "lnki_ttl", Fld_lnki_commons_ttl = "lnki_commons_ttl"
, Fld_lnki_ext = "lnki_ext", Fld_lnki_type = "lnki_type", Fld_lnki_src_tid = "lnki_src_tid"
, Fld_lnki_w = "lnki_w", Fld_lnki_h = "lnki_h", Fld_lnki_upright = "lnki_upright", Fld_lnki_time = "lnki_time", Fld_lnki_page = "lnki_page"
@@ -36,6 +35,7 @@ class Xob_lnki_regy_tbl {
private static final String Tbl_sql = String_.Concat_lines_nl
( "CREATE TABLE IF NOT EXISTS lnki_regy"
, "( lnki_id integer NOT NULL PRIMARY KEY"
, ", lnki_tier_id integer NOT NULL"
, ", lnki_page_id integer NOT NULL"
, ", lnki_ttl varchar(255) NOT NULL"
, ", lnki_commons_ttl varchar(255) NULL"
@@ -52,8 +52,9 @@ class Xob_lnki_regy_tbl {
, ");"
);
public static final String Sql_create_data = String_.Concat_lines_nl
( "INSERT INTO lnki_regy (lnki_id, lnki_page_id, lnki_ttl, lnki_commons_ttl, lnki_ext, lnki_type, lnki_src_tid, lnki_w, lnki_h, lnki_upright, lnki_time, lnki_page, lnki_count)"
( "INSERT INTO lnki_regy (lnki_id, lnki_tier_id, lnki_page_id, lnki_ttl, lnki_commons_ttl, lnki_ext, lnki_type, lnki_src_tid, lnki_w, lnki_h, lnki_upright, lnki_time, lnki_page, lnki_count)"
, "SELECT Min(lnki_id)"
, ", Min(lnki_tier_id)"
, ", Min(lnki_page_id)"
, ", lnki_ttl"
, ", lnki_commons_ttl"
@@ -83,6 +84,7 @@ class Xob_lnki_regy_tbl {
, Sql_cs_mark_changed = String_.Concat_lines_nl
( "REPLACE INTO lnki_regy"
, "SELECT l.lnki_id"
, ", l.lnki_tier_id"
, ", l.lnki_page_id"
, ", l.lnki_ttl"
, ", l.lnki_commons_ttl"

View File

@@ -15,7 +15,7 @@ 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.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*;
package gplx.xowa.bldrs.cmds.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
public class Xob_lnki_src_tid {
public static final byte Tid_file = 0, Tid_media = 1, Tid_gallery = 2, Tid_imageMap = 3;
}

View 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.bldrs.cmds.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import gplx.dbs.*; import gplx.xowa.files.*;
class Xob_lnki_temp_tbl {
private static final Db_meta_fld_list flds = Db_meta_fld_list.new_();
private static final String Tbl_name = "lnki_temp";
public static final String
Fld_lnki_id = flds.Add_int_pkey_autonum("lnki_id"); // NOTE: insertion order index; public b/c not used and want to bypass warning
private static final String
Fld_lnki_tier_id = flds.Add_int("lnki_tier_id")
, Fld_lnki_page_id = flds.Add_int("lnki_page_id")
, Fld_lnki_ttl = flds.Add_str("lnki_ttl", 255)
, Fld_lnki_commons_ttl = flds.Add_str_null("lnki_commons_ttl", 255)
, Fld_lnki_ext = flds.Add_int("lnki_ext")
, Fld_lnki_type = flds.Add_int("lnki_type")
, Fld_lnki_src_tid = flds.Add_int("lnki_src_tid")
, Fld_lnki_w = flds.Add_int("lnki_w")
, Fld_lnki_h = flds.Add_int("lnki_h")
, Fld_lnki_upright = flds.Add_double("lnki_upright")
, Fld_lnki_time = flds.Add_double("lnki_time") // NOTE: thumbtime is float; using double b/c upright is double and would like to keep datatypes same; https://bugzilla.wikimedia.org/show_bug.cgi?id=39014
, Fld_lnki_page = flds.Add_int("lnki_page")
;
private Db_stmt stmt_insert;
public Xob_lnki_temp_tbl(Db_conn conn) {this.conn = conn;}
public Db_conn Conn() {return conn;} private final Db_conn conn;
public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(Tbl_name, flds));}
public void Insert_bgn() {conn.Txn_bgn(); stmt_insert = conn.Stmt_insert(Tbl_name, flds);}
public void Insert_commit() {conn.Txn_sav();}
public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);}
public void Insert_cmd_by_batch(int tier_id, int page_id, byte[] ttl, byte[] ttl_commons, byte ext_id, byte img_type, byte lnki_src_tid, int w, int h, double upright, double time, int page) {
stmt_insert.Clear()
.Val_int (Fld_lnki_tier_id , tier_id)
.Val_int (Fld_lnki_page_id , page_id)
.Val_bry_as_str (Fld_lnki_ttl , ttl)
.Val_bry_as_str (Fld_lnki_commons_ttl , ttl_commons)
.Val_byte (Fld_lnki_ext , ext_id)
.Val_byte (Fld_lnki_type , img_type)
.Val_int (Fld_lnki_src_tid , lnki_src_tid)
.Val_int (Fld_lnki_w , w)
.Val_int (Fld_lnki_h , h)
.Val_double (Fld_lnki_upright , upright)
.Val_double (Fld_lnki_time , Xof_lnki_time.Db_save_double(time))
.Val_int (Fld_lnki_page , page)
.Exec_insert();
}
}

View File

@@ -15,41 +15,37 @@ 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.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*;
import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.dbs.tbls.*; import gplx.xowa.pages.*;
package gplx.xowa.bldrs.cmds.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import gplx.dbs.*; import gplx.dbs.cfgs.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.pages.*;
import gplx.xowa.files.*;
import gplx.xowa.wikis.*;
import gplx.xowa.bldrs.oimgs.*; import gplx.xowa.files.*; import gplx.xowa.gui.*;
import gplx.xowa.parsers.lnkis.redlinks.*; import gplx.xowa.parsers.logs.*; import gplx.xowa.html.hdumps.bldrs.*;
import gplx.xowa.xtns.scribunto.*; import gplx.xowa.xtns.wdatas.*;
import gplx.xowa.files.fsdb.*; import gplx.fsdb.meta.*;
import gplx.xowa.parsers.lnkis.redlinks.*; import gplx.xowa.parsers.logs.*; import gplx.xowa.html.hdumps.bldrs.*; import gplx.xowa.xtns.scribunto.*; import gplx.xowa.xtns.wdatas.*;
import gplx.fsdb.meta.*; import gplx.xowa.files.fsdb.*; import gplx.fsdb.*;
public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements Xopg_redlink_logger {
private Db_conn conn; private Db_stmt stmt;
private boolean wdata_enabled = true, xtn_ref_enabled = true, gen_html, gen_hdump;
private Xop_log_invoke_wkr invoke_wkr; private Xop_log_property_wkr property_wkr;
private int[] ns_ids = Int_.Ary(Xow_ns_.Id_main);// , Xow_ns_.Id_category, Xow_ns_.Id_template
private boolean wiki_ns_file_is_case_match_all = true; private Xowe_wiki commons_wiki;
private Xob_hdump_bldr hdump_bldr; private long hdump_max = Io_mgr.Len_gb;
private Xob_link_dump_cmd link_dump_cmd;
private Xob_lnki_temp_tbl tbl; private boolean wdata_enabled = true, xtn_ref_enabled = true, gen_html, gen_hdump;
private Xop_log_invoke_wkr invoke_wkr; private Xop_log_property_wkr property_wkr;
private boolean ns_file_is_case_match_all = true; private Xowe_wiki commons_wiki;
private Xob_hdump_bldr hdump_bldr; private Xob_link_dump_cmd link_dump_cmd;
public Xob_lnki_temp_wkr(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);}
@Override public String Cmd_key() {return KEY_oimg;} public static final String KEY_oimg = "file.lnki_temp";
@Override public byte Init_redirect() {return Bool_.N_byte;}
@Override public int[] Init_ns_ary() {return ns_ids;}
@Override protected void Init_reset(Db_conn p) {
p.Exec_sql("DELETE FROM " + Xodb_xowa_cfg_tbl.Tbl_name);
p.Exec_sql("DELETE FROM " + Xob_lnki_temp_tbl.Tbl_name);
@Override public String Cmd_key() {return Xob_cmd_keys.Key_file_lnki_temp;}
@Override public byte Init_redirect() {return Bool_.N_byte;} // lnki_temp does not look at redirect pages
@Override public int[] Init_ns_ary() {return ns_ids;} private int[] ns_ids = Int_.Ary(Xow_ns_.Id_main);
@Override protected void Init_reset(Db_conn conn) {
Db_cfg_tbl cfg_tbl = new Db_cfg_tbl(conn, "xowa_cfg");
cfg_tbl.Delete_all();
invoke_wkr.Init_reset();
property_wkr.Init_reset();
}
@Override protected Db_conn Init_db_file() {
ctx.Lnki().File_wkr_(this);
Xodb_db_file make_db_file = Xodb_db_file.init__file_make(wiki.Fsys_mgr().Root_dir());
conn = make_db_file.Conn();
Xob_lnki_temp_tbl.Create_table(conn);
stmt = Xob_lnki_temp_tbl.Insert_stmt(conn);
Xob_db_file make_db_file = Xob_db_file.new__file_make(wiki.Fsys_mgr().Root_dir());
Db_conn conn = make_db_file.Conn();
this.tbl = new Xob_lnki_temp_tbl(conn);
tbl.Create_tbl();
return conn;
}
@Override protected void Cmd_bgn_end() {
wiki_ns_file_is_case_match_all = Wiki_ns_for_file_is_case_match_all(wiki); // NOTE: must call after wiki.init
ns_file_is_case_match_all = Ns_file_is_case_match_all(wiki); // NOTE: must call after wiki.init
wiki.Html_mgr().Page_wtr_mgr().Wkr(Xopg_view_mode.Tid_read).Ctgs_enabled_(false); // disable categories else progress messages written (also for PERF)
commons_wiki = app.Wiki_mgr().Get_by_key_or_make(Xow_domain_.Domain_bry_commons);
Xop_log_mgr log_mgr = ctx.App().Log_mgr();
@@ -69,24 +65,27 @@ public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements Xopg_redlink
wiki.File_mgr__fsdb_mode().Tid_make_y_();
trg_fsdb_mgr.Init_by_wiki(wiki);
Fsm_mnt_mgr trg_mnt_mgr = trg_fsdb_mgr.Mnt_mgr();
trg_mnt_mgr.Insert_to_mnt_(Fsm_mnt_mgr.Mnt_idx_main);
Fsm_mnt_mgr.Patch(trg_mnt_mgr); // NOTE: see fsdb_make; DATE:2014-04-26
Fsdb_db_mgr__v2 fsdb_core = Fsdb_db_mgr__v2_bldr.I.Make(wiki);
trg_mnt_mgr = new Fsm_mnt_mgr(); trg_mnt_mgr.Ctor_by_load(fsdb_core);
trg_mnt_mgr.Mnts__get_insert_idx_(Fsm_mnt_mgr.Mnt_idx_main);
Fsm_mnt_mgr.Patch(trg_mnt_mgr.Mnts__get_main().Cfg_mgr().Tbl()); // NOTE: see fsdb_make; DATE:2014-04-26
if (gen_hdump) {
hdump_bldr = new Xob_hdump_bldr(wiki.Db_mgr_as_sql(), conn, hdump_max);
hdump_bldr.Bld_init();
gplx.xowa.apis.xowa.bldrs.imports.Xoapi_import import_cfg = wiki.Appe().Api_root().Bldr().Wiki().Import();
hdump_bldr = new Xob_hdump_bldr(wiki.Ns_mgr(), wiki.Db_mgr_as_sql(), tbl.Conn(), import_cfg.Html_db_max());
link_dump_cmd = new Xob_link_dump_cmd();
link_dump_cmd.Init_by_wiki(wiki);
}
conn.Txn_mgr().Txn_bgn_if_none();
tbl.Insert_bgn();
log_mgr.Txn_bgn();
}
@Override public void Exec_pg_itm_hook(Xow_ns ns, Xodb_page db_page, byte[] page_src) {
@Override public void Exec_pg_itm_hook(int ns_ord, Xow_ns ns, Xowd_page_itm db_page, byte[] page_src) {
Xoa_ttl ttl = Xoa_ttl.parse_(wiki, ns.Gen_ttl(db_page.Ttl_page_db()));
byte[] ttl_bry = ttl.Page_db();
byte page_tid = Xow_page_tid.Identify(wiki.Domain_tid(), ns.Id(), ttl_bry);
if (page_tid != Xow_page_tid.Tid_wikitext) return; // ignore js, css, lua, json
Xoae_page page = ctx.Cur_page();
page.Clear();
page.Bldr__ns_ord_(ns_ord);
page.Ttl_(ttl).Revision_data().Id_(db_page.Id());
page.Redlink_lnki_list().Clear();
if (ns.Id_tmpl())
@@ -102,7 +101,7 @@ public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements Xopg_redlink
page.Root_(root);
hdump_bldr.Insert_page(page);
link_dump_cmd.Page_bgn(page.Revision_data().Id());
ListAdp lnki_list = page.Lnki_list();
ListAdp lnki_list = page.Redlink_lnki_list().Lnki_list();
int len = lnki_list.Count();
for (int i = 0; i < len; ++i) {
Xop_lnki_tkn lnki = (Xop_lnki_tkn)lnki_list.FetchAt(i);
@@ -114,7 +113,7 @@ public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements Xopg_redlink
}
}
@Override public void Exec_commit_hook() {
conn.Txn_mgr().Txn_end_all_bgn_if_none(); // save lnki_temp
tbl.Conn().Txn_sav();
if (gen_hdump) {
hdump_bldr.Commit();
link_dump_cmd.Wkr_commit();
@@ -125,23 +124,23 @@ public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements Xopg_redlink
hdump_bldr.Bld_term();
link_dump_cmd.Wkr_end();
}
Gfo_usr_dlg_._.Warn_many("", "", invoke_wkr.Err_filter_mgr().Print());
Gfo_usr_dlg_.I.Warn_many("", "", invoke_wkr.Err_filter_mgr().Print());
wiki.Appe().Log_mgr().Txn_end();
conn.Txn_mgr().Txn_end();
tbl.Insert_end();
}
public void Wkr_exec(Xop_ctx ctx, byte[] src, Xop_lnki_tkn lnki, byte lnki_src_tid) {
if (lnki.Ttl().ForceLiteralLink()) return; // ignore literal links which creat a link to file, but do not show the image; EX: [[:File:A.png|thumb|120px]] creates a link to File:A.png, regardless of other display-oriented args
byte[] ttl = lnki.Ttl().Page_db();
Xof_ext ext = Xof_ext_.new_by_ttl_(ttl);
double lnki_thumbtime = lnki.Time();
double lnki_time = lnki.Time();
int lnki_page = lnki.Page();
byte[] ttl_commons = Xto_commons(wiki_ns_file_is_case_match_all, commons_wiki, ttl);
if ( Xof_lnki_page.Null_n(lnki_page) // page set
&& Xof_lnki_time.Null_n(lnki_thumbtime)) // thumbtime set
byte[] ttl_commons = Xto_commons(ns_file_is_case_match_all, commons_wiki, ttl);
if ( Xof_lnki_page.Null_n(lnki_page) // page set
&& Xof_lnki_time.Null_n(lnki_time)) // thumbtime set
usr_dlg.Warn_many("", "", "page and thumbtime both set; this may be an issue with fsdb: page=~{0} ttl=~{1}", ctx.Cur_page().Ttl().Page_db_as_str(), String_.new_utf8_(ttl));
if (lnki.Ns_id() == Xow_ns_.Id_media)
lnki_src_tid = Xob_lnki_src_tid.Tid_media;
Xob_lnki_temp_tbl.Insert(stmt, ctx.Cur_page().Revision_data().Id(), ttl, ttl_commons, Byte_.By_int(ext.Id()), lnki.Lnki_type(), lnki_src_tid, lnki.W(), lnki.H(), lnki.Upright(), lnki_thumbtime, lnki_page);
tbl.Insert_cmd_by_batch(ctx.Cur_page().Bldr__ns_ord(), ctx.Cur_page().Revision_data().Id(), ttl, ttl_commons, Byte_.By_int(ext.Id()), lnki.Lnki_type(), lnki_src_tid, lnki.W(), lnki.H(), lnki.Upright(), lnki_time, lnki_page);
}
@Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_wdata_enabled_)) wdata_enabled = m.ReadYn("v");
@@ -168,15 +167,13 @@ public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements Xopg_redlink
if (property_wkr == null) property_wkr = bldr.App().Wiki_mgr().Wdata_mgr().Property_wkr_or_new();
return property_wkr;
}
public static byte[] Xto_commons(boolean wiki_ns_file_is_case_match_all, Xowe_wiki commons_wiki, byte[] ttl_bry) {
if (!wiki_ns_file_is_case_match_all) return null; // return "" if wiki matches common
public static byte[] Xto_commons(boolean ns_file_is_case_match_all, Xowe_wiki commons_wiki, byte[] ttl_bry) {
if (!ns_file_is_case_match_all) return null; // return "" if wiki matches common
Xoa_ttl ttl = Xoa_ttl.parse_(commons_wiki, Xow_ns_.Id_file, ttl_bry);
byte[] rv = ttl.Page_db();
return Bry_.Eq(rv, ttl_bry) ? null : rv;
}
public static boolean Wiki_ns_for_file_is_case_match_all(Xowe_wiki wiki) {
return wiki.Ns_mgr().Ns_file().Case_match() == Xow_ns_case_.Id_all;
}
public static boolean Ns_file_is_case_match_all(Xow_wiki wiki) {return wiki.Ns_mgr().Ns_file().Case_match() == Xow_ns_case_.Id_all;}
}
class Xob_lnki_temp_wkr_ {
public static int[] Ns_ids_by_aliases(Xowe_wiki wiki, String[] aliases) {

View File

@@ -15,7 +15,7 @@ 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.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*;
package gplx.xowa.bldrs.cmds.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
import org.junit.*;
public class Xob_lnki_temp_wkr_tst {
private Xob_lnki_temp_wkr_fxt fxt = new Xob_lnki_temp_wkr_fxt();

Some files were not shown because too many files have changed in this diff Show More