diff --git a/100_core/src_000_err/gplx/Err_.java b/100_core/src_000_err/gplx/Err_.java index edc933e43..281b0e683 100644 --- a/100_core/src_000_err/gplx/Err_.java +++ b/100_core/src_000_err/gplx/Err_.java @@ -24,7 +24,8 @@ public class Err_ { //_20110415 public static Err new_(String hdr) {return Err.hdr_(hdr);} public static Err new_key_(String key, String hdr) {return Err.hdr_(hdr).Key_(key);} public static Err err_key_(Exception exc, String key, String hdr) {return Err.exc_(exc, hdr).Key_(key);} - public static Err err_(Exception exc, String hdr) {return Err.exc_(exc, hdr);} + public static Err err_(Exception e) {return Err.exc_(e, Message_gplx_brief(e));} + public static Err err_(Exception e, String hdr) {return Err.exc_(e, hdr);} public static Err err_(Exception e, String fmt, Object... args) {return Err.exc_(e, String_.Format(fmt, args));} public static Err cast_(Exception ignore, Class t, Object o) { String o_str = ""; diff --git a/100_core/src_110_primitive/gplx/Array_.java b/100_core/src_110_primitive/gplx/Array_.java index 1cbefc47c..ae116add6 100644 --- a/100_core/src_110_primitive/gplx/Array_.java +++ b/100_core/src_110_primitive/gplx/Array_.java @@ -50,11 +50,16 @@ public class Array_ { rv[i + newLen] = cur[i]; return rv; } - public static Object Resize(Object src, int trgLen) { - Object trg = Create(ComponentType(src), trgLen); - int srcLen = Array.getLength(src); - int copyLen = srcLen > trgLen ? trgLen : srcLen; // trgLen can either expand or shrink - CopyTo(src, 0, trg, 0, copyLen); + public static Object Resize_add_one(Object src, int src_len, Object new_obj) { + Object rv = Resize(src, src_len + 1); + Set(rv, src_len, new_obj); + return rv; + } + public static Object Resize(Object src, int trg_len) { + Object trg = Create(ComponentType(src), trg_len); + int src_len = Array.getLength(src); + int copy_len = src_len > trg_len ? trg_len : src_len; // trg_len can either expand or shrink + CopyTo(src, 0, trg, 0, copy_len); return trg; } public static String XtoStr(Object ary) { diff --git a/100_core/src_110_primitive/gplx/Bry_bfr.java b/100_core/src_110_primitive/gplx/Bry_bfr.java index 744b99cc8..0d7b57691 100644 --- a/100_core/src_110_primitive/gplx/Bry_bfr.java +++ b/100_core/src_110_primitive/gplx/Bry_bfr.java @@ -18,26 +18,50 @@ along with this program. If not, see . package gplx; import gplx.core.primitives.*; public class Bry_bfr { + private Bry_bfr_mkr_mgr mkr_mgr; private int reset; public byte[] Bfr() {return bfr;} private byte[] bfr; - @gplx.Internal protected int Bfr_max() {return bfr_max;} private int bfr_max; public int Len() {return bfr_len;} private int bfr_len; public boolean Len_eq_0() {return bfr_len == 0;} public boolean Len_gt_0() {return bfr_len > 0;} public void Bfr_init(byte[] bfr, int bfr_len) { - this.bfr = bfr; - this.bfr_len = bfr_len; - this.bfr_max = bfr.length; // NOTE: must sync bfr_max, else will fail later during add; bfr will think bfr has .length of bfr_max, when it actually has .length of bfr_len; DATE:2014-03-09 + synchronized (this) { + this.bfr = bfr; + this.bfr_len = bfr_len; + this.bfr_max = bfr.length; // NOTE: must sync bfr_max, else will fail later during add; bfr will think bfr has .length of bfr_max, when it actually has .length of bfr_len; DATE:2014-03-09 + } } - @gplx.Internal protected int Mkr_itm() {return mkr_itm;} private int mkr_itm = -1; - @gplx.Internal protected Bry_bfr_mkr_mgr Mkr_mgr() {return mkr_mgr;} Bry_bfr_mkr_mgr mkr_mgr; - @gplx.Internal protected Bry_bfr Mkr_(Bry_bfr_mkr_mgr mkr_mgr, int itm) {this.mkr_mgr = mkr_mgr; this.mkr_itm = itm; return this;} - public Bry_bfr Mkr_rls() {mkr_mgr.Rls(this); return this;} - private void Mkr_clear() { - if (mkr_mgr != null) mkr_mgr.Rls(this); - mkr_mgr = null; - mkr_itm = -1; + public Bry_bfr Mkr_rls() { + if (mkr_mgr != null) { + synchronized (mkr_mgr) { + mkr_mgr.Rls(mkr_idx); + } + synchronized (this) { + this.mkr_mgr = null; + this.mkr_idx = -1; + } + } + return this; } - private Bry_bfr Reset_(int v) {reset = v; return this;} private int reset; + public void Clear_and_rls() { + this.Clear(); + this.Mkr_rls(); + } + public String To_str_and_rls() {return String_.new_utf8_(To_bry_and_rls());} + public byte[] To_bry_and_rls() { + byte[] rv = null; + synchronized (bfr) { + rv = Xto_bry(); + this.Clear(); + if (reset > 0) Reset_if_gt(reset); + synchronized (mkr_mgr) { + mkr_mgr.Rls(mkr_idx); + } + mkr_mgr = null; + mkr_idx = -1; + } + return rv; + } + private Bry_bfr Reset_(int v) {reset = v; return this;} public Bry_bfr Reset_if_gt(int limit) { if (bfr_max > limit) { this.bfr_max = limit; @@ -46,7 +70,12 @@ public class Bry_bfr { bfr_len = 0; return this; } - public Bry_bfr Clear() {bfr_len = 0; return this;} + public Bry_bfr Clear() { + synchronized (this) { + this.bfr_len = 0; + } + return this; + } public Bry_bfr ClearAndReset() {bfr_len = 0; if (reset > 0) Reset_if_gt(reset); return this;} public byte Get_at_last_or_nil_if_empty() {return bfr_len == 0 ? Byte_ascii.Nil : bfr[bfr_len - 1];} public Bry_bfr Add_safe(byte[] val) {return val == null ? this : Add(val);} @@ -491,7 +520,7 @@ public class Bry_bfr { } public void Rls() { bfr = null; - Mkr_clear(); + this.Mkr_rls(); } @Override public int hashCode() {return Bry_obj_ref.CalcHashCode(bfr, 0, bfr_len);} @Override public boolean equals(Object obj) {return obj == null ? false : Bry_.Match(bfr, 0, bfr_len, ((Bry_obj_ref)obj).Val());} // NOTE: strange, but null check needed; throws null error; PAGE:c:File:Eug�ne_Delacroix_-_La_libert�_guidant_le_peuple.jpg @@ -499,6 +528,15 @@ public class Bry_bfr { bfr_max = v; bfr = Bry_.Resize(bfr, 0, v); } + @gplx.Internal protected int Mkr_idx() {return mkr_idx;} private int mkr_idx = -1; + @gplx.Internal protected boolean Mkr_idx_is_null() {return mkr_idx == -1;} + @gplx.Internal protected int Bfr_max() {return bfr_max;} private int bfr_max; + @gplx.Internal protected Bry_bfr Mkr_init(Bry_bfr_mkr_mgr mkr_mgr, int itm) { + synchronized (this) { + this.mkr_mgr = mkr_mgr; this.mkr_idx = itm; + } + return this; + } public static Bry_bfr new_() {return new Bry_bfr(16);} public static Bry_bfr new_(int v) {return new Bry_bfr(v);} public static Bry_bfr reset_(int v) {return new Bry_bfr(16).Reset_(v);} // PERF: set initial size to 16, not reset val; allows for faster "startup"; DATE:2014-06-14 diff --git a/100_core/src_110_primitive/gplx/Bry_bfr_mkr.java b/100_core/src_110_primitive/gplx/Bry_bfr_mkr.java index dced6ae7f..93842c0f4 100644 --- a/100_core/src_110_primitive/gplx/Bry_bfr_mkr.java +++ b/100_core/src_110_primitive/gplx/Bry_bfr_mkr.java @@ -24,7 +24,8 @@ public class Bry_bfr_mkr { public Bry_bfr Get_k004() {return mkr_k004.Get();} public Bry_bfr Get_m001() {return mkr_m001.Get();} public void Rls(Bry_bfr v) { - v.Mkr_mgr().Rls(v); + v.Mkr_rls(); +// v.Mkr_mgr().Rls(v); } public void Reset_if_gt(int v) { for (byte i = Tid_b128; i <= Tid_m001; i++) @@ -71,7 +72,7 @@ class Bry_bfr_mkr_mgr { for (int i = 0; i < ary_max; i++) { Bry_bfr itm = ary[i]; if (itm != null) { - if (itm.Mkr_mgr() != null) throw Err_.new_("failed to clear bfr: " + Int_.Xto_str(i)); + if (!itm.Mkr_idx_is_null()) throw Err_.new_("failed to clear bfr: " + Int_.Xto_str(i)); itm.Clear(); } ary[i] = null; @@ -117,7 +118,7 @@ class Bry_bfr_mkr_mgr { ary[rv_idx] = rv; } } - rv.Mkr_(this, rv_idx); + rv.Mkr_init(this, rv_idx); return rv.Clear(); // NOTE: ALWAYS call Clear when doing Get. caller may forget to call Clear, and reused bfr may have leftover bytes. unit tests will not catch, and difficult to spot in app } } @@ -131,16 +132,26 @@ class Bry_bfr_mkr_mgr { Array_.CopyTo(free, 0, new_free, 0, free_len); free = new_free; } - public void Rls(Bry_bfr v) { +// public void Rls(Bry_bfr v) { +// synchronized (thread_lock) { +// int idx = v.Mkr_itm(); +// if (idx == -1) throw Err_mgr._.fmt_("gplx.Bry_bfr", "rls_failed", "rls called on bfr that was not created by factory"); +// int new_ary_len = nxt_idx - 1; +// if (idx == new_ary_len) +// nxt_idx = new_ary_len; +// else +// free[free_len++] = idx; +// v.Mkr_(null, -1); +// } +// } + public void Rls(int idx) { synchronized (thread_lock) { - int idx = v.Mkr_itm(); if (idx == -1) throw Err_mgr._.fmt_("gplx.Bry_bfr", "rls_failed", "rls called on bfr that was not created by factory"); int new_ary_len = nxt_idx - 1; if (idx == new_ary_len) nxt_idx = new_ary_len; else free[free_len++] = idx; - v.Mkr_(null, -1); } } public static final Bry_bfr[] Ary_empty = new Bry_bfr[0]; diff --git a/100_core/src_110_primitive/gplx/Bry_bfr_mkr_tst.java b/100_core/src_110_primitive/gplx/Bry_bfr_mkr_tst.java index 475ecfe28..2cb5e3ef0 100644 --- a/100_core/src_110_primitive/gplx/Bry_bfr_mkr_tst.java +++ b/100_core/src_110_primitive/gplx/Bry_bfr_mkr_tst.java @@ -56,7 +56,7 @@ class Bry_bfr_mkr_fxt { } public Bry_bfr_mkr_fxt Rls(int i) { Bry_bfr bfr = mkr.Ary()[i]; - mkr.Rls(bfr); + bfr.Mkr_rls(); return this; } public Bry_bfr_mkr_fxt Tst_idxs(int... expd) { @@ -65,7 +65,7 @@ class Bry_bfr_mkr_fxt { for (int i = 0; i < actl_len; i++) { Bry_bfr bfr = mkr.Ary()[i]; int actl_val = Bry_bfr_mkr_tst.Int_null; - if (bfr != null) actl_val = bfr.Mkr_itm(); + if (bfr != null) actl_val = bfr.Mkr_idx(); actl[i] = actl_val; } Tfds.Eq_ary(expd, actl); diff --git a/100_core/src_110_primitive/gplx/Int_.java b/100_core/src_110_primitive/gplx/Int_.java index fdcb9e1d8..f6f312a7c 100644 --- a/100_core/src_110_primitive/gplx/Int_.java +++ b/100_core/src_110_primitive/gplx/Int_.java @@ -134,9 +134,9 @@ public class Int_ implements GfoInvkAble { if (val < 0) throw Err_.new_("key must be >= 0").Add("key", key).Add("val", val); return this; } - public static String Xto_str_pad_bgn_space(int v, int reqdPlaces) {return Xto_str_pad_bgn(v, reqdPlaces, Byte_ascii.Space, true);} // EX: 1, 3 returns " 1" - public static String Xto_str_pad_bgn(int v, int reqdPlaces) {return Xto_str_pad_bgn(v, reqdPlaces, Byte_ascii.Num_0, true);} // EX: 1, 3 returns "001" - static String Xto_str_pad_bgn(int val, int places, byte pad_chr, boolean bgn) { + public static String Xto_str_pad_bgn_space(int v, int reqdPlaces) {return Xto_str_pad_bgn_zero(v, reqdPlaces, Byte_ascii.Space, true);} // EX: 1, 3 returns " 1" + public static String Xto_str_pad_bgn_zero(int v, int reqdPlaces) {return Xto_str_pad_bgn_zero(v, reqdPlaces, Byte_ascii.Num_0, true);} // EX: 1, 3 returns "001" + static String Xto_str_pad_bgn_zero(int val, int places, byte pad_chr, boolean bgn) { int len = DigitCount(val); int pad_len = places - len; if (pad_len < 0) return Int_.Xto_str(val); Bry_bfr bfr = Bry_bfr.new_(); @@ -165,7 +165,7 @@ public class Int_ implements GfoInvkAble { public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_XtoStr_PadBgn)) { int v = m.ReadInt(GfsCore_.Arg_primitive), pad = m.ReadInt("pad"); - return ctx.Deny() ? (Object)this : Xto_str_pad_bgn(v, pad); + return ctx.Deny() ? (Object)this : Xto_str_pad_bgn_zero(v, pad); } else if (ctx.Match(k, "Add")) { int v = m.ReadInt(GfsCore_.Arg_primitive), operand = m.ReadInt("operand"); @@ -204,10 +204,11 @@ public class Int_ implements GfoInvkAble { if (rvLen < 8) rv = String_.Repeat("0", 8 - rvLen) + rv; return String_.Upper(rv); } - public static String Xto_str(int[] ary) { + public static String Xto_str(int[] ary) {return Xto_str(ary, " ");} + public static String Xto_str(int[] ary, String dlm) { String_bldr sb = String_bldr_.new_(); for (int i = 0; i < ary.length; i++) - sb.Add_spr_unless_first(Int_.Xto_str(ary[i]), " ", i); + sb.Add_spr_unless_first(Int_.Xto_str(ary[i]), dlm, i); return sb.XtoStr(); } public static int[] Ary_parse(String raw_str, int reqd_len, int[] or) { diff --git a/100_core/src_110_primitive/gplx/Int__tst.java b/100_core/src_110_primitive/gplx/Int__tst.java index 23402ac51..6621bef94 100644 --- a/100_core/src_110_primitive/gplx/Int__tst.java +++ b/100_core/src_110_primitive/gplx/Int__tst.java @@ -26,7 +26,7 @@ public class Int__tst { tst_XtoStr_PadLeft_Zeroes(-12 , 3, "-12"); // negative tst_XtoStr_PadLeft_Zeroes(-123 , 3, "-123"); // negative tst_XtoStr_PadLeft_Zeroes(-1234 , 3, "-1234"); // negative - } void tst_XtoStr_PadLeft_Zeroes(int val, int zeros, String expd) {Tfds.Eq(expd, Int_.Xto_str_pad_bgn(val, zeros));} + } void tst_XtoStr_PadLeft_Zeroes(int val, int zeros, String expd) {Tfds.Eq(expd, Int_.Xto_str_pad_bgn_zero(val, zeros));} @Test public void parseOr_() { tst_ParseOr("", -1); // empty tst_ParseOr("123", 123); // single diff --git a/100_core/src_120_basicDataType/gplx/DateAdp_.java b/100_core/src_120_basicDataType/gplx/DateAdp_.java index 03eecaa31..5ef8c7c63 100644 --- a/100_core/src_120_basicDataType/gplx/DateAdp_.java +++ b/100_core/src_120_basicDataType/gplx/DateAdp_.java @@ -25,6 +25,7 @@ import java.util.GregorianCalendar; import java.util.Locale; import java.util.TimeZone; public class DateAdp_ implements GfoInvkAble { + public static final String Cls_ref_name = "Date"; public static final Class Cls_ref_type = DateAdp.class; public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_Now)) return Now(); diff --git a/100_core/src_120_basicDataType/gplx/UuidAdp.java b/100_core/src_120_basicDataType/gplx/Guid_adp.java similarity index 87% rename from 100_core/src_120_basicDataType/gplx/UuidAdp.java rename to 100_core/src_120_basicDataType/gplx/Guid_adp.java index 3e53f76a7..04822f682 100644 --- a/100_core/src_120_basicDataType/gplx/UuidAdp.java +++ b/100_core/src_120_basicDataType/gplx/Guid_adp.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx; -public class UuidAdp { +public class Guid_adp { public String XtoStr() {return guid.toString();} - public UuidAdp(java.util.UUID guid) {this.guid = guid;} java.util.UUID guid; + public Guid_adp(java.util.UUID guid) {this.guid = guid;} java.util.UUID guid; } \ No newline at end of file diff --git a/100_core/src_120_basicDataType/gplx/UuidAdp_.java b/100_core/src_120_basicDataType/gplx/Guid_adp_.java similarity index 67% rename from 100_core/src_120_basicDataType/gplx/UuidAdp_.java rename to 100_core/src_120_basicDataType/gplx/Guid_adp_.java index b26766cc7..3f4faf732 100644 --- a/100_core/src_120_basicDataType/gplx/UuidAdp_.java +++ b/100_core/src_120_basicDataType/gplx/Guid_adp_.java @@ -16,8 +16,9 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx; -public class UuidAdp_ { - public static final UuidAdp Null = parse_("00000000-0000-0000-0000-000000000000"); - public static UuidAdp random_() {return new UuidAdp(java.util.UUID.randomUUID());} - public static UuidAdp parse_(String s) {return new UuidAdp(java.util.UUID.fromString(s));} +public class Guid_adp_ { + public static final String Cls_ref_name = "Guid"; + public static final Guid_adp Empty = parse_("00000000-0000-0000-0000-000000000000"); + public static Guid_adp random_() {return new Guid_adp(java.util.UUID.randomUUID());} + public static Guid_adp parse_(String s) {return new Guid_adp(java.util.UUID.fromString(s));} } \ No newline at end of file diff --git a/100_core/src_120_basicDataType/gplx/UuidAdp__tst.java b/100_core/src_120_basicDataType/gplx/Guid_adp__tst.java similarity index 91% rename from 100_core/src_120_basicDataType/gplx/UuidAdp__tst.java rename to 100_core/src_120_basicDataType/gplx/Guid_adp__tst.java index d11a6c071..e3c11cb66 100644 --- a/100_core/src_120_basicDataType/gplx/UuidAdp__tst.java +++ b/100_core/src_120_basicDataType/gplx/Guid_adp__tst.java @@ -17,12 +17,12 @@ along with this program. If not, see . */ package gplx; import org.junit.*; -public class UuidAdp__tst { +public class Guid_adp__tst { @Test public void parse_() { tst_parse_("467ffb41-cdfe-402f-b22b-be855425784b"); } void tst_parse_(String s) { - UuidAdp uuid = UuidAdp_.parse_(s); + Guid_adp uuid = Guid_adp_.parse_(s); Tfds.Eq(uuid.XtoStr(), s); } } diff --git a/100_core/src_120_basicDataType/gplx/TimeSpanAdp_.java b/100_core/src_120_basicDataType/gplx/TimeSpanAdp_.java index 3d421add5..cef7314d3 100644 --- a/100_core/src_120_basicDataType/gplx/TimeSpanAdp_.java +++ b/100_core/src_120_basicDataType/gplx/TimeSpanAdp_.java @@ -116,7 +116,7 @@ public class TimeSpanAdp_ { zeros = first && !fmt_padZeros ? 1 : padZerosAry[i]; // if first, don't zero pad (avoid "01") dlm = first ? "" : Sprs[i]; // if first, don't use dlm (avoid ":01") sb.Add(dlm); - sb.Add(Int_.Xto_str_pad_bgn(val, zeros)); + sb.Add(Int_.Xto_str_pad_bgn_zero(val, zeros)); first = false; } return sb.XtoStr(); diff --git a/100_core/src_120_basicDataType/gplx/Yn.java b/100_core/src_120_basicDataType/gplx/Yn.java index 08ca4de48..2839174ee 100644 --- a/100_core/src_120_basicDataType/gplx/Yn.java +++ b/100_core/src_120_basicDataType/gplx/Yn.java @@ -18,6 +18,11 @@ along with this program. If not, see . package gplx; public class Yn { public static final String Y = "y", N = "n"; + public static boolean parse_by_char_or(String v, boolean or) { + if (String_.Eq(v, Y)) return true; + else if (String_.Eq(v, N)) return false; + else return or; + } public static boolean parse_or_n_(String v) {return parse_or_(v, false);} public static int parse_as_int(String v) { if (v == null) return Bool_.__int; diff --git a/100_core/src_140_list/gplx/OrderedHash_base.java b/100_core/src_140_list/gplx/OrderedHash_base.java index a1a7f0fea..08a85c83d 100644 --- a/100_core/src_140_list/gplx/OrderedHash_base.java +++ b/100_core/src_140_list/gplx/OrderedHash_base.java @@ -65,7 +65,7 @@ public class OrderedHash_base extends HashAdp_base implements OrderedHash, GfoIn int count = ordered.Count(); int pad = String_.Len(Int_.Xto_str(count)); for (int i = 0; i < count; i++) { - sb .Add(Int_.Xto_str_pad_bgn(i, pad)) + sb .Add(Int_.Xto_str_pad_bgn_zero(i, pad)) .Add(":").Add(ordered.FetchAt(i).toString()) .Add(Op_sys.Cur().Nl_str()); } diff --git a/100_core/src_200_io/gplx/Io_mgr.java b/100_core/src_200_io/gplx/Io_mgr.java index 326c58d42..bd3ba94d5 100644 --- a/100_core/src_200_io/gplx/Io_mgr.java +++ b/100_core/src_200_io/gplx/Io_mgr.java @@ -50,6 +50,10 @@ public class Io_mgr { // exists primarily to gather all cmds under gplx namespac } return false; } + public void Create_fil_ary(Io_fil[] fil_ary) { + for (Io_fil fil : fil_ary) + SaveFilStr(fil.Url(), fil.Data()); + } public Io_url[] QueryDir_fils(Io_url dir) {return QueryDir_args(dir).ExecAsUrlAry();} public IoEngine_xrg_queryDir QueryDir_args(Io_url dir) {return IoEngine_xrg_queryDir.new_(dir);} public void DeleteDirSubs(Io_url url) {IoEngine_xrg_deleteDir.new_(url).Exec();} @@ -133,5 +137,6 @@ public class Io_mgr { // exists primarily to gather all cmds under gplx namespac public IoEngine_xrg_downloadFil DownloadFil_args(String src, Io_url trg) {return IoEngine_xrg_downloadFil.new_(src, trg);} public static final Io_mgr _ = new Io_mgr(); public Io_mgr() {} public static final int Len_kb = 1024, Len_mb = 1048576, Len_gb = 1073741824, Len_gb_2 = 2147483647; + public static final long Len_mb_long = Len_mb; public static final long Len_null = -1; } diff --git a/100_core/src_200_io/gplx/ios/IoEngine_system.java b/100_core/src_200_io/gplx/ios/IoEngine_system.java index 7c3a65148..2f10e2125 100644 --- a/100_core/src_200_io/gplx/ios/IoEngine_system.java +++ b/100_core/src_200_io/gplx/ios/IoEngine_system.java @@ -542,7 +542,7 @@ class Io_stream_rdr_http implements Io_stream_rdr { public Io_stream_rdr_http(IoEngine_xrg_downloadFil xrg) { this.xrg = xrg; } private IoEngine_xrg_downloadFil xrg; - public byte Tid() {return Io_stream_.Tid_file;} + public byte Tid() {return Io_stream_.Tid_raw;} public Io_url Url() {return url;} public Io_stream_rdr Url_(Io_url v) {url = v; return this;} private Io_url url; public long Len() {return len;} public Io_stream_rdr Len_(long v) {len = v; return this;} private long len = IoItmFil.Size_invalid; // NOTE: must default size to -1; DATE:2014-06-21 private String src_str; private HttpURLConnection src_conn; private java.io.BufferedInputStream src_stream; diff --git a/100_core/src_200_io/gplx/ios/IoEngine_xrg_recycleFil.java b/100_core/src_200_io/gplx/ios/IoEngine_xrg_recycleFil.java index 8c77f2665..5d81a4e79 100644 --- a/100_core/src_200_io/gplx/ios/IoEngine_xrg_recycleFil.java +++ b/100_core/src_200_io/gplx/ios/IoEngine_xrg_recycleFil.java @@ -22,7 +22,7 @@ public class IoEngine_xrg_recycleFil extends IoEngine_xrg_fil_affects1_base { public int Mode() {return mode;} public IoEngine_xrg_recycleFil Mode_(int v) {mode = v; return this;} int mode; public String AppName() {return appName;} public IoEngine_xrg_recycleFil AppName_(String val) {appName = val; return this;} private String appName = "unknown_app"; - public UuidAdp Uuid() {return uuid;} public IoEngine_xrg_recycleFil Uuid_(UuidAdp val) {uuid = val; return this;} UuidAdp uuid; + public Guid_adp Uuid() {return uuid;} public IoEngine_xrg_recycleFil Uuid_(Guid_adp val) {uuid = val; return this;} Guid_adp uuid; public boolean Uuid_include() {return uuid_include;} public IoEngine_xrg_recycleFil Uuid_include_() {uuid_include = true; return this;} private boolean uuid_include; public DateAdp Time() {return time;} public IoEngine_xrg_recycleFil Time_(DateAdp val) {time = val; return this;} DateAdp time; public ListAdp RootDirNames() {return rootDirNames;} public IoEngine_xrg_recycleFil RootDirNames_(ListAdp val) {rootDirNames = val; return this;} ListAdp rootDirNames; @@ -49,7 +49,7 @@ public class IoEngine_xrg_recycleFil extends IoEngine_xrg_fil_affects1_base { public IoEngine_xrg_recycleFil(int v) { mode = v; time = DateAdp_.Now(); - uuid = UuidAdp_.random_(); + uuid = Guid_adp_.random_(); rootDirNames = ListAdp_.new_(); rootDirNames.Add("z_trash"); } public static IoEngine_xrg_recycleFil sysm_(Io_url url) {return new IoEngine_xrg_recycleFil(SysmConst);} diff --git a/400_xowa/src_040_io/gplx/ios/Io_fil.java b/100_core/src_200_io/gplx/ios/Io_fil.java similarity index 100% rename from 400_xowa/src_040_io/gplx/ios/Io_fil.java rename to 100_core/src_200_io/gplx/ios/Io_fil.java diff --git a/400_xowa/src/gplx/dbs/Gfdb_db_base.java b/100_core/src_200_io/gplx/ios/Io_fil_mkr.java similarity index 65% rename from 400_xowa/src/gplx/dbs/Gfdb_db_base.java rename to 100_core/src_200_io/gplx/ios/Io_fil_mkr.java index 3a75dfb8a..b1daf5b2f 100644 --- a/400_xowa/src/gplx/dbs/Gfdb_db_base.java +++ b/100_core/src_200_io/gplx/ios/Io_fil_mkr.java @@ -15,13 +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 . */ -package gplx.dbs; import gplx.*; -import gplx.dbs.schemas.*; -public class Gfdb_db_base { - public Db_conn Conn() {return conn;} private Db_conn conn; - public Schema_db_mgr Schema() {return schema;} private Schema_db_mgr schema = new Schema_db_mgr(); - public void Init(Db_conn conn) { - this.conn = conn; - schema.Init(conn); - } +package gplx.ios; import gplx.*; +public class Io_fil_mkr { + private final ListAdp list = ListAdp_.new_(); + public Io_fil_mkr Add(String url, String data) {return Add(Io_url_.mem_fil_(url), data);} + public Io_fil_mkr Add(Io_url url, String data) {list.Add(new Io_fil(url, data)); return this;} + public Io_fil[] To_ary() {return (Io_fil[])list.Xto_ary(Io_fil.class);} } diff --git a/100_core/src_200_io/gplx/ios/Io_size_.java b/100_core/src_200_io/gplx/ios/Io_size_.java index 7c374fc12..e3a94059f 100644 --- a/100_core/src_200_io/gplx/ios/Io_size_.java +++ b/100_core/src_200_io/gplx/ios/Io_size_.java @@ -91,6 +91,9 @@ public class Io_size_ { long rv = parse_or_(v, Long_.MinValue); if (rv == Long_.MinValue) throw Err_.new_fmt_("invalid val: {0}", v); return rv; } + public static String To_str_mb(long v) {return Long_.Xto_str(v / Io_mgr.Len_mb_long);} + public static long To_long_by_msg_mb(GfoMsg m) {return m.ReadLong("v") * Io_mgr.Len_mb_long;} + public static long To_long_by_int_mb(int v) {return (long)v * Io_mgr.Len_mb_long;} } class Io_size_fmtr_arg implements Bry_fmtr_arg { public long Val() {return val;} public Io_size_fmtr_arg Val_(long v) {val = v; return this;} long val; diff --git a/100_core/src_200_io/gplx/ios/Io_stream_.java b/100_core/src_200_io/gplx/ios/Io_stream_.java index d9006d71c..61b603720 100644 --- a/100_core/src_200_io/gplx/ios/Io_stream_.java +++ b/100_core/src_200_io/gplx/ios/Io_stream_.java @@ -17,6 +17,39 @@ along with this program. If not, see . */ package gplx.ios; import gplx.*; public class Io_stream_ { // SERIALIZED - public static final byte Tid_null = 0, Tid_file = 1, Tid_zip = 2, Tid_gzip = 3, Tid_bzip2 = 4; + public static final byte Tid_null = 0, Tid_raw = 1, Tid_zip = 2, Tid_gzip = 3, Tid_bzip2 = 4; public static final String Ext_zip = ".zip", Ext_gz = ".gz", Ext_bz2 = ".bz2"; + + public static String Obsolete_to_str(byte v) { + switch (v) { + case Io_stream_.Tid_raw : return ".xdat"; + case Io_stream_.Tid_zip : return ".zip"; + case Io_stream_.Tid_gzip : return ".gz"; + case Io_stream_.Tid_bzip2 : return ".bz2"; + default : throw Err_.unhandled(v); + } + } + public static byte Obsolete_to_tid(String v) { + if (String_.Eq(v, ".xdat")) return Io_stream_.Tid_raw; + else if (String_.Eq(v, ".zip")) return Io_stream_.Tid_zip; + else if (String_.Eq(v, ".gz")) return Io_stream_.Tid_gzip; + else if (String_.Eq(v, ".bz2")) return Io_stream_.Tid_bzip2; + else throw Err_.unhandled(v); + } + public static String To_str(byte v) { + switch (v) { + case Io_stream_.Tid_raw : return "raw"; + case Io_stream_.Tid_zip : return "zip"; + case Io_stream_.Tid_gzip : return "gzip"; + case Io_stream_.Tid_bzip2 : return "bzip2"; + default : throw Err_.unhandled(v); + } + } + public static byte To_tid(String v) { + if (String_.Eq(v, "raw")) return Io_stream_.Tid_raw; + else if (String_.Eq(v, "zip")) return Io_stream_.Tid_zip; + else if (String_.Eq(v, "gzip")) return Io_stream_.Tid_gzip; + else if (String_.Eq(v, "bzip2")) return Io_stream_.Tid_bzip2; + else throw Err_.unhandled(v); + } } diff --git a/100_core/src_200_io/gplx/ios/Io_stream_rdr_.java b/100_core/src_200_io/gplx/ios/Io_stream_rdr_.java index 56748563d..ce28d9d14 100644 --- a/100_core/src_200_io/gplx/ios/Io_stream_rdr_.java +++ b/100_core/src_200_io/gplx/ios/Io_stream_rdr_.java @@ -31,7 +31,7 @@ public class Io_stream_rdr_ { } public static Io_stream_rdr new_by_tid_(byte tid) { switch (tid) { - case Io_stream_.Tid_file: return new Io_stream_rdr_file(); + case Io_stream_.Tid_raw: return new Io_stream_rdr_file(); case Io_stream_.Tid_zip: return new Io_stream_rdr_zip(); case Io_stream_.Tid_gzip: return new Io_stream_rdr_gzip(); case Io_stream_.Tid_bzip2: return new Io_stream_rdr_bzip2(); @@ -124,7 +124,7 @@ class Io_stream_rdr_adp implements Io_stream_rdr { private java.io.InputStream strm; public Io_stream_rdr_adp(java.io.InputStream strm) {this.strm = strm;} public Object Under() {return strm;} - public byte Tid() {return Io_stream_.Tid_file;} + public byte Tid() {return Io_stream_.Tid_raw;} public Io_url Url() {return url;} public Io_stream_rdr Url_(Io_url v) {this.url = v; return this;} private Io_url url; public long Len() {return len;} public Io_stream_rdr Len_(long v) {len = v; return this;} private long len = Io_mgr.Len_null; public void Open_mem(byte[] v) {} @@ -172,7 +172,7 @@ abstract class Io_stream_rdr_base implements Io_stream_rdr { public abstract java.io.InputStream Wrap_stream(java.io.InputStream stream); } class Io_stream_rdr_file extends Io_stream_rdr_base { - @Override public byte Tid() {return Io_stream_.Tid_file;} + @Override public byte Tid() {return Io_stream_.Tid_raw;} public Io_stream_rdr Open() { try { if (!Io_mgr._.Exists(url)) diff --git a/100_core/src_200_io/gplx/ios/Io_stream_wtr_.java b/100_core/src_200_io/gplx/ios/Io_stream_wtr_.java index 7f2cf1154..0f097907a 100644 --- a/100_core/src_200_io/gplx/ios/Io_stream_wtr_.java +++ b/100_core/src_200_io/gplx/ios/Io_stream_wtr_.java @@ -35,7 +35,7 @@ public class Io_stream_wtr_ { } public static Io_stream_wtr new_by_tid_(byte v) { switch (v) { - case gplx.ios.Io_stream_.Tid_file : return new Io_stream_wtr_file(); + case gplx.ios.Io_stream_.Tid_raw : return new Io_stream_wtr_file(); case gplx.ios.Io_stream_.Tid_zip : return new Io_stream_wtr_zip(); case gplx.ios.Io_stream_.Tid_gzip : return new Io_stream_wtr_gzip(); case gplx.ios.Io_stream_.Tid_bzip2 : return new Io_stream_wtr_bzip2(); @@ -172,7 +172,7 @@ class Io_stream_wtr_zip implements Io_stream_wtr { } class Io_stream_wtr_file implements Io_stream_wtr { IoStream bry_stream; - @Override public byte Tid() {return Io_stream_.Tid_file;} + @Override public byte Tid() {return Io_stream_.Tid_raw;} public Io_url Url() {return url;} public Io_stream_wtr Url_(Io_url v) {url = v; return this;} Io_url url; public void Trg_bfr_(Bry_bfr v) {trg_bfr = v;} private Bry_bfr trg_bfr; java.io.ByteArrayOutputStream mem_stream; public Io_stream_wtr Open() { diff --git a/100_core/src_210_env/gplx/Op_sys.java b/100_core/src_210_env/gplx/Op_sys.java index 69d997aea..1c2bf9122 100644 --- a/100_core/src_210_env/gplx/Op_sys.java +++ b/100_core/src_210_env/gplx/Op_sys.java @@ -45,8 +45,14 @@ public class Op_sys { public static final Op_sys Drd = new_unx_flavor_(Tid_drd, "windows", Bitness_32); public static final Op_sys Wnt = new_wnt_(Sub_tid_unknown, Bitness_32); public static Op_sys Cur() {return cur_op_sys;} static Op_sys cur_op_sys = new_auto_identify_(); - static Op_sys new_wnt_(byte bitness, byte sub_tid) {return new Op_sys(Tid_wnt , sub_tid , "windows", bitness, "\r\n", Byte_ascii.Backslash , Bool_.N, new byte[] {Byte_ascii.Slash, Byte_ascii.Backslash, Byte_ascii.Lt, Byte_ascii.Gt, Byte_ascii.Colon, Byte_ascii.Pipe, Byte_ascii.Question, Byte_ascii.Asterisk, Byte_ascii.Quote});} - static Op_sys new_unx_flavor_(byte tid, String os_name, byte bitness) {return new Op_sys(tid , Sub_tid_unknown , os_name , bitness, "\n" , Byte_ascii.Slash , Bool_.Y, new byte[] {Byte_ascii.Slash});} + public static String Fsys_path_to_lnx(String v) { + return cur_op_sys.Tid_is_wnt() ? String_.Replace(v, Wnt.fsys_dir_spr_str, Lnx.fsys_dir_spr_str) : v; + } + public static String Fsys_path_to_wnt(String v) { + return cur_op_sys.Tid_is_wnt() ? String_.Replace(v, Lnx.fsys_dir_spr_str, Wnt.fsys_dir_spr_str) : v; + } + private static Op_sys new_wnt_(byte bitness, byte sub_tid) {return new Op_sys(Tid_wnt , sub_tid , "windows", bitness, "\r\n", Byte_ascii.Backslash , Bool_.N, new byte[] {Byte_ascii.Slash, Byte_ascii.Backslash, Byte_ascii.Lt, Byte_ascii.Gt, Byte_ascii.Colon, Byte_ascii.Pipe, Byte_ascii.Question, Byte_ascii.Asterisk, Byte_ascii.Quote});} + private static Op_sys new_unx_flavor_(byte tid, String os_name, byte bitness) {return new Op_sys(tid , Sub_tid_unknown , os_name , bitness, "\n" , Byte_ascii.Slash , Bool_.Y, new byte[] {Byte_ascii.Slash});} static final String GRP_KEY = "gplx.op_sys"; // public static Op_sys Cur_() {cur_op_sys = new_auto_identify_(); return cur_op_sys;} static Op_sys new_auto_identify_() { diff --git a/100_core/src_420_usrMsg/gplx/Gfo_usr_dlg_.java b/100_core/src_420_usrMsg/gplx/Gfo_usr_dlg_.java index 481336d4a..8b5bcdee6 100644 --- a/100_core/src_420_usrMsg/gplx/Gfo_usr_dlg_.java +++ b/100_core/src_420_usrMsg/gplx/Gfo_usr_dlg_.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx; public class Gfo_usr_dlg_ { - public static Gfo_usr_dlg _ = Gfo_usr_dlg_null._; + public static Gfo_usr_dlg I = Gfo_usr_dlg_null._; public static final Gfo_usr_dlg Null = Gfo_usr_dlg_null._; } class Gfo_usr_dlg_null implements Gfo_usr_dlg { diff --git a/100_core/src_800_tst/gplx/Tfds.java b/100_core/src_800_tst/gplx/Tfds.java index b1fb93d75..9047a7d08 100644 --- a/100_core/src_800_tst/gplx/Tfds.java +++ b/100_core/src_800_tst/gplx/Tfds.java @@ -207,14 +207,14 @@ class TfdsMsgBldr { for (int i = 0; i < list.Count(); i++) { TfdsEqAryItm itm = (TfdsEqAryItm)list.FetchAt(i); sb.Add_fmt_line("{0}: {1} {2} {3}" - , Int_.Xto_str_pad_bgn(itm.Idx(), 4) + , Int_.Xto_str_pad_bgn_zero(itm.Idx(), 4) , String_.PadBgn(itm.Lhs(), lhsLenMax, " ") , itm.Eq() ? "==" : "!=" , String_.PadBgn(itm.Rhs(), rhsLenMax, " ") ); } // String compSym = isEq ? " " : "!="; -// String result = String_.Format("{0}: {1}{2} {3} {4}", Int_.Xto_str_pad_bgn(i, 4), lhsString, String_.CrLf + "\t\t", compSym, rhsString); +// String result = String_.Format("{0}: {1}{2} {3} {4}", Int_.Xto_str_pad_bgn_zero(i, 4), lhsString, String_.CrLf + "\t\t", compSym, rhsString); // foreach (Object obj in list) { // String itmComparison = (String)obj; // sb.Add_fmt_line("{0}{1}", "\t\t", itmComparison); diff --git a/100_core/tst/gplx/ios/IoEngine_fil_basic_memory_tst.java b/100_core/tst/gplx/ios/IoEngine_fil_basic_memory_tst.java index 1706c4f15..e0da42132 100644 --- a/100_core/tst/gplx/ios/IoEngine_fil_basic_memory_tst.java +++ b/100_core/tst/gplx/ios/IoEngine_fil_basic_memory_tst.java @@ -45,7 +45,7 @@ public class IoEngine_fil_basic_memory_tst extends IoEngine_fil_basic_base { list.DelAt(0); // remove drive IoEngine_xrg_recycleFil recycleXrg = bin.Send_xrg(fil) .RootDirNames_(list) - .AppName_("gplx.test").Time_(DateAdp_.parse_gplx("20100102_115559123")).Uuid_(UuidAdp_.parse_("467ffb41-cdfe-402f-b22b-be855425784b")); + .AppName_("gplx.test").Time_(DateAdp_.parse_gplx("20100102_115559123")).Uuid_(Guid_adp_.parse_("467ffb41-cdfe-402f-b22b-be855425784b")); recycleXrg.Exec(); fx.tst_ExistsPaths(false, fil); fx.tst_ExistsPaths(true, recycleXrg.RecycleUrl()); diff --git a/100_core/tst/gplx/ios/IoEngine_fil_basic_system_tst.java b/100_core/tst/gplx/ios/IoEngine_fil_basic_system_tst.java index 26ef9ba0c..d2a287cdf 100644 --- a/100_core/tst/gplx/ios/IoEngine_fil_basic_system_tst.java +++ b/100_core/tst/gplx/ios/IoEngine_fil_basic_system_tst.java @@ -37,7 +37,7 @@ public class IoEngine_fil_basic_system_tst extends IoEngine_fil_basic_base { ListAdp list = root.XtoNames(); list.DelAt(0); // remove drive IoEngine_xrg_recycleFil recycleXrg = bin.Send_xrg(fil) .RootDirNames_(list) - .AppName_("gplx.test").Time_(DateAdp_.parse_gplx("20100102_115559123")).Uuid_(UuidAdp_.parse_("467ffb41-cdfe-402f-b22b-be855425784b")); + .AppName_("gplx.test").Time_(DateAdp_.parse_gplx("20100102_115559123")).Uuid_(Guid_adp_.parse_("467ffb41-cdfe-402f-b22b-be855425784b")); recycleXrg.Exec(); fx.tst_ExistsPaths(false, fil); fx.tst_ExistsPaths(true, recycleXrg.RecycleUrl()); diff --git a/100_core/tst/gplx/ios/IoEngine_xrg_recycleFil_tst.java b/100_core/tst/gplx/ios/IoEngine_xrg_recycleFil_tst.java index 5525f7efa..36e6493d1 100644 --- a/100_core/tst/gplx/ios/IoEngine_xrg_recycleFil_tst.java +++ b/100_core/tst/gplx/ios/IoEngine_xrg_recycleFil_tst.java @@ -25,7 +25,7 @@ public class IoEngine_xrg_recycleFil_tst { tst_GenRecycleUrl(recycle_(), Io_url_.mem_fil_("mem/z_trash/20100102/gplx.images;115559123;;fil.txt")); tst_GenRecycleUrl(recycle_().Uuid_include_(), Io_url_.mem_fil_("mem/z_trash/20100102/gplx.images;115559123;467ffb41-cdfe-402f-b22b-be855425784b;fil.txt")); } - IoEngine_xrg_recycleFil recycle_() {return IoEngine_xrg_recycleFil.gplx_(Io_url_.mem_fil_("mem/dir/fil.txt")).AppName_("gplx.images").Uuid_(UuidAdp_.parse_("467ffb41-cdfe-402f-b22b-be855425784b")).Time_(DateAdp_.parse_gplx("20100102_115559123"));} + IoEngine_xrg_recycleFil recycle_() {return IoEngine_xrg_recycleFil.gplx_(Io_url_.mem_fil_("mem/dir/fil.txt")).AppName_("gplx.images").Uuid_(Guid_adp_.parse_("467ffb41-cdfe-402f-b22b-be855425784b")).Time_(DateAdp_.parse_gplx("20100102_115559123"));} void tst_GenRecycleUrl(IoEngine_xrg_recycleFil xrg, Io_url expd) { Tfds.Eq(expd, xrg.RecycleUrl()); } diff --git a/110_gfml/src_500_build/gplx/gfml/GfmlStringHighlighter.java b/110_gfml/src_500_build/gplx/gfml/GfmlStringHighlighter.java index 2dc31ddc8..02f29da61 100644 --- a/110_gfml/src_500_build/gplx/gfml/GfmlStringHighlighter.java +++ b/110_gfml/src_500_build/gplx/gfml/GfmlStringHighlighter.java @@ -67,12 +67,12 @@ class GfmlStringHighlighter { int gap = nxtMarkBgn - endPos; if (gap > 0) { int gapDigits = Int_.DigitCount(gap); - posBfr.Add_fmt("[{0}]", Int_.Xto_str_pad_bgn(gap, gapDigits)); + posBfr.Add_fmt("[{0}]", Int_.Xto_str_pad_bgn_zero(gap, gapDigits)); rawBfr.Add_fmt("[{0}]", String_.Repeat(".", gapDigits)); symBfr.Add_fmt(" {0} ", String_.Repeat(" ", gapDigits)); } if (curMark.Sym() != ' ') - symList.Add(String_.Format("[{0}] {1} {2}", Int_.Xto_str_pad_bgn(curMark.Pos(), rawLenDigits), curMark.Sym(), curMark.Msg())); + symList.Add(String_.Format("[{0}] {1} {2}", Int_.Xto_str_pad_bgn_zero(curMark.Pos(), rawLenDigits), curMark.Sym(), curMark.Msg())); } if (rawBfrBgn == 0) { posBfr.Add_at(0, "<"); diff --git a/140_dbs/.classpath b/140_dbs/.classpath index 50c3a49f4..88a4ccc1d 100644 --- a/140_dbs/.classpath +++ b/140_dbs/.classpath @@ -8,7 +8,7 @@ - + diff --git a/140_dbs/src/gplx/dbs/Db_batch_wkr__attach.java b/140_dbs/src/gplx/dbs/Db_batch_wkr__attach.java deleted file mode 100644 index 56b7f2a1e..000000000 --- a/140_dbs/src/gplx/dbs/Db_batch_wkr__attach.java +++ /dev/null @@ -1,43 +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 . -*/ -package gplx.dbs; import gplx.*; -public class Db_batch_wkr__attach implements Db_batch_wkr { - private final Db_conn conn; - private final ListAdp list = ListAdp_.new_(); - public Db_batch_wkr__attach Add(String alias, Io_url url) {list.Add(new Db_batch_wkr__attach_itm(alias, url)); return this;} - public Db_batch_wkr__attach(Db_conn conn) {this.conn = conn;} - public void Batch_bgn() { - int len = list.Count(); - for (int i = 0; i < len; ++i) { - Db_batch_wkr__attach_itm itm = (Db_batch_wkr__attach_itm)list.FetchAt(i); - conn.Exec_env_db_attach(itm.Alias(), itm.Url()); - } - } - public void Batch_end() { - int len = list.Count(); - for (int i = 0; i < len; ++i) { - Db_batch_wkr__attach_itm itm = (Db_batch_wkr__attach_itm)list.FetchAt(i); - conn.Exec_env_db_detach(itm.Alias()); - } - } -} -class Db_batch_wkr__attach_itm { - public Db_batch_wkr__attach_itm(String alias, Io_url url) {this.alias = alias; this.url = url;} - public String Alias() {return alias;} private final String alias; - public Io_url Url() {return url;} private final Io_url url; -} diff --git a/140_dbs/src/gplx/dbs/Db_batch_wkr__msg.java b/140_dbs/src/gplx/dbs/Db_batch_wkr__msg.java deleted file mode 100644 index 471df45cb..000000000 --- a/140_dbs/src/gplx/dbs/Db_batch_wkr__msg.java +++ /dev/null @@ -1,26 +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 . -*/ -package gplx.dbs; import gplx.*; -public class Db_batch_wkr__msg implements Db_batch_wkr { - private final Gfo_usr_dlg usr_dlg; private final String msg_pre; - public Db_batch_wkr__msg(Gfo_usr_dlg usr_dlg, String msg_pre) {this.usr_dlg = usr_dlg; this.msg_pre = msg_pre;} - public Gfo_usr_dlg Usr_dlg() {return usr_dlg;} - public String Msg() {return msg;} public Db_batch_wkr__msg Msg_(String v) {msg = v; return this;} private String msg; - public void Batch_bgn() {usr_dlg.Plog_many("", "", "bgn:" + msg_pre + "." + msg);} - public void Batch_end() {usr_dlg.Plog_many("", "", "end:" + msg_pre + "." + msg);} -} diff --git a/140_dbs/src/gplx/dbs/Db_conn.java b/140_dbs/src/gplx/dbs/Db_conn.java index ee2d4bb7d..db17d9000 100644 --- a/140_dbs/src/gplx/dbs/Db_conn.java +++ b/140_dbs/src/gplx/dbs/Db_conn.java @@ -18,18 +18,15 @@ along with this program. If not, see . package gplx.dbs; import gplx.*; import gplx.dbs.engines.*; import gplx.dbs.qrys.*; public class Db_conn { - private final Db_engine engine; - private final ListAdp rls_list = ListAdp_.new_(); - public Db_conn(Db_engine engine) { - this.engine = engine; - this.txn_mgr = new Db_txn_mgr(engine); - } - public Db_url Url() {return engine.Url();} - public Db_txn_mgr Txn_mgr() {return txn_mgr;} private final Db_txn_mgr txn_mgr; - public void Txn_bgn() {txn_mgr.Txn_bgn();} - public void Txn_commit() {txn_mgr.Txn_end(); txn_mgr.Txn_bgn();} - public void Txn_end() {txn_mgr.Txn_end();} - public Db_stmt Stmt_insert(String tbl, Db_meta_fld_list flds) {return engine.New_stmt_prep(Db_qry_insert.new_(tbl, flds.To_str_ary()));} + private final ListAdp rls_list = ListAdp_.new_(); private final Db_engine engine; + public Db_conn(Db_engine engine) {this.engine = engine;} + public Db_conn_info Conn_info() {return engine.Conn_info();} + public void Txn_bgn() {engine.Txn_bgn("");} + public void Txn_bgn(String name) {engine.Txn_bgn(name);} + public void Txn_end() {engine.Txn_end();} + public void Txn_cxl() {engine.Txn_cxl();} + public void Txn_sav() {engine.Txn_sav();} + public Db_stmt Stmt_insert(String tbl, Db_meta_fld_list flds) {return engine.New_stmt_prep(Db_qry_insert.new_(tbl, flds.To_str_ary_wo_autonum()));} public Db_stmt Stmt_insert(String tbl, String... cols) {return engine.New_stmt_prep(Db_qry_insert.new_(tbl, cols));} public Db_stmt Stmt_update(String tbl, String[] where, String... cols) {return engine.New_stmt_prep(Db_qry_update.new_(tbl, where, cols));} public Db_stmt Stmt_update_exclude(String tbl, Db_meta_fld_list flds, String... where) {return engine.New_stmt_prep(Db_qry_update.new_(tbl, where, flds.To_str_ary_exclude(where)));} @@ -37,46 +34,40 @@ public class Db_conn { public Db_stmt Stmt_select(String tbl, String[] cols, String... where) {return engine.New_stmt_prep(Db_qry__select_in_tbl.new_(tbl, where, cols, null));} public Db_stmt Stmt_select(String tbl, Db_meta_fld_list flds, String... where) {return engine.New_stmt_prep(Db_qry__select_in_tbl.new_(tbl, where, flds.To_str_ary(), null));} public Db_stmt Stmt_select_order(String tbl, Db_meta_fld_list flds, String[] where, String... orderbys) {return engine.New_stmt_prep(Db_qry__select_in_tbl.new_(tbl, where, flds.To_str_ary(), orderbys));} - public void Exec_create_tbl_and_idx(Db_meta_tbl meta) { - engine.Exec_ddl_create_tbl(meta); - engine.Exec_ddl_create_idx(Gfo_usr_dlg_.Null, meta.Idxs()); - } - public void Exec_create_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... idxs) {engine.Exec_ddl_create_idx(usr_dlg, idxs);} - public void Exec_env_db_attach(String alias, Io_url db_url) {engine.Exec_env_db_attach(alias, db_url);} - public void Exec_env_db_detach(String alias) {engine.Exec_env_db_detach(alias);} - public void Exec_ddl_append_fld(String tbl, Db_meta_fld fld) {engine.Exec_ddl_append_fld(tbl, fld);} - public Db_stmt Rls_reg(Db_stmt stmt) {rls_list.Add(stmt); return stmt;} - public void Conn_term() { + public Db_stmt Stmt_select_order(String tbl, String[] flds, String[] where, String... orderbys) {return engine.New_stmt_prep(Db_qry__select_in_tbl.new_(tbl, where, flds, orderbys));} + public Db_stmt Stmt_new(Db_qry qry) {return engine.New_stmt_prep(qry);} + public void Env_db_attach(String alias, Io_url db_url) {engine.Env_db_attach(alias, db_url);} + public void Env_db_detach(String alias) {engine.Env_db_detach(alias);} + public void Env_vacuum() {Exec_sql_plog_ntx("vacuuming: url=" + this.Conn_info().Xto_api(), "VACUUM;");} + public void Ddl_create_tbl(Db_meta_tbl meta) {engine.Ddl_create_tbl(meta); engine.Ddl_create_idx(Gfo_usr_dlg_.Null, meta.Idxs());} + public void Ddl_create_idx(Db_meta_idx... idxs) {engine.Ddl_create_idx(Gfo_usr_dlg_.I, idxs);} + public void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... idxs) {engine.Ddl_create_idx(usr_dlg, idxs);} + public void Ddl_append_fld(String tbl, Db_meta_fld fld) {engine.Ddl_append_fld(tbl, fld);} + public void Ddl_delete_tbl(String tbl) {engine.Ddl_delete_tbl(tbl);} + public void Rls_reg(RlsAble rls) {rls_list.Add(rls);} + public void Rls_conn() { int len = rls_list.Count(); for (int i = 0; i < len; ++i) { RlsAble itm = (RlsAble)rls_list.FetchAt(i); itm.Rls(); } engine.Conn_term(); -// Db_conn_pool.I.Del(this.Url()); // remove from pool, else rls'd instance will be cached and fail upon next use + Db_conn_pool.I.Del(engine.Conn_info()); } - public Db_stmt Stmt_new(Db_qry qry) {return engine.New_stmt_prep(qry);} - public int Exec_qry(Db_qry qry) {txn_mgr.Txn_count_(txn_mgr.Txn_count() + 1); return Int_.cast_(engine.Exec_as_obj(qry));} + public int Exec_sql(String sql) {return this.Exec_qry(Db_qry_sql.dml_(sql));} + public Db_rdr Exec_sql_as_rdr2(String sql) {return this.Stmt_new(Db_qry_sql.dml_(sql)).Exec_select__rls_auto();} + public int Exec_sql_plog_ntx(String msg, String sql) {return Exec_sql_plog(Bool_.N, msg, sql);} + public int Exec_sql_plog_txn(String msg, String sql) {return Exec_sql_plog(Bool_.Y, msg, sql);} + public int Exec_sql_plog(boolean txn, String msg, String sql) { + Gfo_usr_dlg_.I.Plog_many("", "", "bgn: " + msg); + if (txn) this.Txn_bgn(); + int rv = Exec_sql(sql); + if (txn) this.Txn_end(); + Gfo_usr_dlg_.I.Plog_many("", "", "end: " + msg); + return rv; + } + public int Exec_qry(Db_qry qry) {return Int_.cast_(engine.Exec_as_obj(qry));} public DataRdr Exec_qry_as_rdr(Db_qry qry) {return DataRdr_.cast_(engine.Exec_as_obj(qry));} - public int Exec_sql(String sql) {return this.Exec_qry(Db_qry_sql.dml_(sql));} - public DataRdr Exec_sql_as_rdr(String sql) {return this.Exec_qry_as_rdr(Db_qry_sql.rdr_(sql));} - public void Exec_sql_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... idxs) {engine.Exec_ddl_create_idx(usr_dlg, idxs);} - public void Exec_sql(Db_batch_wkr... wkrs) { - int len = wkrs.length; - for (int i = 0; i < len; ++i) { - Db_batch_wkr wkr = wkrs[i]; - wkr.Batch_bgn(); - wkr.Batch_end(); - } - } - public void Exec_sql__vacuum(Db_batch_wkr__msg msg) { - msg.Msg_("vaccuum"); - Exec_sql(msg, Batch_sql("VACCUUM;")); - } - public void Exec_sql__idx(Db_batch_wkr__msg msg, Db_meta_idx... idxs) { - engine.Exec_ddl_create_idx(msg.Usr_dlg(), idxs); - } - public Db_batch_wkr__msg Batch_msg(Gfo_usr_dlg usr_dlg, String msg_pre) {return new Db_batch_wkr__msg(usr_dlg, msg_pre);} - public Db_batch_wkr__attach Batch_attach(String alias, Io_url url) {return new Db_batch_wkr__attach(this).Add(alias, url);} - public Db_batch_wkr__sql Batch_sql(String... lines) {return new Db_batch_wkr__sql(this, lines);} + public int Exec_sql_args(String sql, Object... args) {return this.Exec_qry(Db_qry_sql.dml_(String_.Format(sql, args)));} + public DataRdr Exec_sql_as_rdr(String sql) {return this.Exec_qry_as_rdr(Db_qry_sql.rdr_(sql));} } diff --git a/140_dbs/src/gplx/dbs/Db_conn_.java b/140_dbs/src/gplx/dbs/Db_conn_.java index 18cdf86b1..958beebb8 100644 --- a/140_dbs/src/gplx/dbs/Db_conn_.java +++ b/140_dbs/src/gplx/dbs/Db_conn_.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.dbs; import gplx.*; import gplx.dbs.qrys.*; public class Db_conn_ { - public static final Db_conn Null = Db_conn_pool.I.Get_or_new(Db_url_.Null); + public static final Db_conn Empty = Db_conn_pool.I.Get_or_new(Db_conn_info_.Null); public static int Select_fld0_as_int_or(Db_conn p, String sql, int or) { DataRdr rdr = DataRdr_.Null; try { diff --git a/140_dbs/src/gplx/dbs/Db_conn_bldr.java b/140_dbs/src/gplx/dbs/Db_conn_bldr.java index 56c888d49..00b838685 100644 --- a/140_dbs/src/gplx/dbs/Db_conn_bldr.java +++ b/140_dbs/src/gplx/dbs/Db_conn_bldr.java @@ -20,11 +20,12 @@ public class Db_conn_bldr { private Db_conn_bldr_wkr wkr; public void Reg_default_sqlite() {wkr = Db_conn_bldr_wkr__sqlite.I; wkr.Clear_for_tests();} public void Reg_default_mem() {wkr = Db_conn_bldr_wkr__mem.I; wkr.Clear_for_tests();} - public Db_conn Get(String type, Object url_obj) {return wkr.Get(type, url_obj);} - public Db_conn New(String type, Object url_obj) {return wkr.New(type, url_obj);} - public Db_conn_bldr_data Get_or_new(String type, Object url_obj) { - boolean exists = wkr.Exists(type, url_obj); - Db_conn conn = exists ? Get(type, url_obj) : New(type, url_obj); + public boolean Exists(Io_url url) {return wkr.Exists(url);} + public Db_conn Get(Io_url url) {return wkr.Get(url);} + public Db_conn New(Io_url url) {return wkr.New(url);} + public Db_conn_bldr_data Get_or_new(Io_url url) { + boolean exists = wkr.Exists(url); + Db_conn conn = exists ? Get(url) : New(url); return new Db_conn_bldr_data(conn, exists); } public static final Db_conn_bldr I = new Db_conn_bldr(); Db_conn_bldr() {} diff --git a/140_dbs/src/gplx/dbs/Db_conn_bldr_wkr.java b/140_dbs/src/gplx/dbs/Db_conn_bldr_wkr.java index 2d150c393..29714f968 100644 --- a/140_dbs/src/gplx/dbs/Db_conn_bldr_wkr.java +++ b/140_dbs/src/gplx/dbs/Db_conn_bldr_wkr.java @@ -19,24 +19,21 @@ package gplx.dbs; import gplx.*; import gplx.dbs.engines.sqlite.*; public interface Db_conn_bldr_wkr { void Clear_for_tests(); - boolean Exists(String type, Object url_obj); - Db_conn Get(String type, Object url_obj); - Db_conn New(String type, Object url_obj); + boolean Exists(Io_url url); + Db_conn Get(Io_url url); + Db_conn New(Io_url url); } class Db_conn_bldr_wkr__sqlite implements Db_conn_bldr_wkr { public void Clear_for_tests() {} - public boolean Exists(String type, Object url_obj) { - Io_url io_url = (Io_url)url_obj; return Io_mgr._.ExistsFil(io_url); - } - public Db_conn Get(String type, Object url_obj) { - Io_url io_url = (Io_url)url_obj; if (!Io_mgr._.ExistsFil(io_url)) return null; - Db_url db_url = Db_url_.sqlite_(io_url); + public boolean Exists(Io_url url) {return Io_mgr._.ExistsFil(url);} + public Db_conn Get(Io_url url) { + if (!Io_mgr._.ExistsFil(url)) return null; + Db_conn_info db_url = Db_conn_info_.sqlite_(url); return Db_conn_pool.I.Get_or_new(db_url); } - public Db_conn New(String type, Object url_obj) { - Io_url io_url = (Io_url)url_obj; - Io_mgr._.CreateDirIfAbsent(io_url.OwnerDir()); // must assert that dir exists - Db_url db_url = Sqlite_url.make_(io_url); + public Db_conn New(Io_url url) { + Io_mgr._.CreateDirIfAbsent(url.OwnerDir()); // must assert that dir exists + Db_conn_info db_url = Sqlite_conn_info.make_(url); Db_conn conn = Db_conn_pool.I.Get_or_new(db_url); Sqlite_engine_.Pragma_page_size(conn, 4096); // conn.Conn_term(); // close conn after PRAGMA adjusted @@ -47,22 +44,19 @@ class Db_conn_bldr_wkr__sqlite implements Db_conn_bldr_wkr { class Db_conn_bldr_wkr__mem implements Db_conn_bldr_wkr { private final HashAdp hash = HashAdp_.new_(); public void Clear_for_tests() {hash.Clear(); Db_conn_pool.I.Clear();} - public boolean Exists(String type, Object url_obj) { - Io_url io_url = (Io_url)url_obj; - String io_url_str = io_url.Xto_api(); + public boolean Exists(Io_url url) { + String io_url_str = url.Xto_api(); return hash.Has(io_url_str); } - public Db_conn Get(String type, Object url_obj) { - Io_url io_url = (Io_url)url_obj; - String io_url_str = io_url.Xto_api(); + public Db_conn Get(Io_url url) { + String io_url_str = url.Xto_api(); if (!hash.Has(io_url_str)) return null; - return Db_conn_pool.I.Get_or_new__mem(io_url.Xto_api()); + return Db_conn_pool.I.Get_or_new__mem(url.Xto_api()); } - public Db_conn New(String type, Object url_obj) { - Io_url io_url = (Io_url)url_obj; - String io_url_str = io_url.Xto_api(); + public Db_conn New(Io_url url) { + String io_url_str = url.Xto_api(); hash.Add(io_url_str, io_url_str); - return Db_conn_pool.I.Get_or_new__mem(io_url.Xto_api()); + return Db_conn_pool.I.Get_or_new__mem(url.Xto_api()); } public static final Db_conn_bldr_wkr__mem I = new Db_conn_bldr_wkr__mem(); Db_conn_bldr_wkr__mem() {} } diff --git a/140_dbs/src/gplx/dbs/Db_url.java b/140_dbs/src/gplx/dbs/Db_conn_info.java similarity index 90% rename from 140_dbs/src/gplx/dbs/Db_url.java rename to 140_dbs/src/gplx/dbs/Db_conn_info.java index 133ec5309..760975fdd 100644 --- a/140_dbs/src/gplx/dbs/Db_url.java +++ b/140_dbs/src/gplx/dbs/Db_conn_info.java @@ -16,10 +16,10 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.dbs; import gplx.*; -public interface Db_url { +public interface Db_conn_info { String Tid(); String Database(); String Xto_raw(); String Xto_api(); - Db_url New_self(String raw, GfoMsg m); + Db_conn_info New_self(String raw, GfoMsg m); } diff --git a/140_dbs/src/gplx/dbs/Db_url_.java b/140_dbs/src/gplx/dbs/Db_conn_info_.java similarity index 53% rename from 140_dbs/src/gplx/dbs/Db_url_.java rename to 140_dbs/src/gplx/dbs/Db_conn_info_.java index a835d7e6b..3ca02d9c1 100644 --- a/140_dbs/src/gplx/dbs/Db_url_.java +++ b/140_dbs/src/gplx/dbs/Db_conn_info_.java @@ -18,23 +18,23 @@ along with this program. If not, see . package gplx.dbs; import gplx.*; import gplx.dbs.engines.nulls.*; import gplx.dbs.engines.mems.*; import gplx.dbs.engines.sqlite.*; import gplx.dbs.engines.tdbs.*; import gplx.dbs.engines.mysql.*; import gplx.dbs.engines.postgres.*; -public class Db_url_ { - public static final Db_url Null = Null_url._; - public static final Db_url Test = Mysql_url.new_("127.0.0.1", "unit_tests", "root", "mysql7760"); - public static Db_url parse_(String raw) {return Db_url_pool._.Parse(raw);} - public static Db_url sqlite_(Io_url url) {return Sqlite_url.load_(url);} - public static Db_url tdb_(Io_url url) {return Tdb_url.new_(url);} - public static Db_url mem_(String db) {return Db_url__mem.new_(db);} - public static final String Key_tdb = Tdb_url.Tid_const; +public class Db_conn_info_ { + public static final Db_conn_info Null = Null_conn_info._; + public static final Db_conn_info Test = Mysql_conn_info.new_("127.0.0.1", "unit_tests", "root", "mysql7760"); + public static Db_conn_info parse_(String raw) {return Db_conn_info_pool._.Parse(raw);} + public static Db_conn_info sqlite_(Io_url url) {return Sqlite_conn_info.load_(url);} + public static Db_conn_info tdb_(Io_url url) {return Tdb_conn_info.new_(url);} + public static Db_conn_info mem_(String db) {return Db_conn_info__mem.new_(db);} + public static final String Key_tdb = Tdb_conn_info.Tid_const; } -class Db_url_pool { +class Db_conn_info_pool { private OrderedHash regy = OrderedHash_.new_(); - public Db_url_pool() { - this.Add(Null_url._).Add(Tdb_url._).Add(Mysql_url._).Add(Postgres_url._).Add(Sqlite_url._); - this.Add(Db_url__mem.I); + public Db_conn_info_pool() { + this.Add(Null_conn_info._).Add(Tdb_conn_info._).Add(Mysql_conn_info._).Add(Postgres_conn_info._).Add(Sqlite_conn_info._); + this.Add(Db_conn_info__mem.I); } - public Db_url_pool Add(Db_url itm) {regy.AddReplace(itm.Tid(), itm); return this;} - public Db_url Parse(String raw) {// assume each pair has format of: name=val; + public Db_conn_info_pool Add(Db_conn_info itm) {regy.AddReplace(itm.Tid(), itm); return this;} + public Db_conn_info Parse(String raw) {// assume each pair has format of: name=val; try { GfoMsg m = GfoMsg_.new_parse_("db_url"); String[] terms = String_.Split(raw, ";"); @@ -47,10 +47,10 @@ class Db_url_pool { else m.Add(kv[0], kv[1]); } - Db_url prototype = (Db_url)regy.Fetch(url_tid); + Db_conn_info prototype = (Db_conn_info)regy.Fetch(url_tid); return prototype.New_self(raw, m); } - catch(Exception exc) {throw Err_.parse_type_exc_(exc, Db_url.class, raw);} + catch(Exception exc) {throw Err_.parse_type_exc_(exc, Db_conn_info.class, raw);} } - public static final Db_url_pool _ = new Db_url_pool(); + public static final Db_conn_info_pool _ = new Db_conn_info_pool(); } diff --git a/140_dbs/src/gplx/dbs/Db_url__base.java b/140_dbs/src/gplx/dbs/Db_conn_info__base.java similarity index 92% rename from 140_dbs/src/gplx/dbs/Db_url__base.java rename to 140_dbs/src/gplx/dbs/Db_conn_info__base.java index b4a5b7770..f5a48c4a5 100644 --- a/140_dbs/src/gplx/dbs/Db_url__base.java +++ b/140_dbs/src/gplx/dbs/Db_conn_info__base.java @@ -17,13 +17,13 @@ along with this program. If not, see . */ package gplx.dbs; import gplx.*; import gplx.core.strings.*; -public abstract class Db_url__base implements Db_url { +public abstract class Db_conn_info__base implements Db_conn_info { public abstract String Tid(); public String Xto_raw() {return raw;} private String raw = ""; public String Xto_api() {return api;} private String api = ""; public String Database() {return database;} protected String database = ""; public String Server() {return server;} private String server = ""; - public abstract Db_url New_self(String raw, GfoMsg m); + public abstract Db_conn_info New_self(String raw, GfoMsg m); protected void Ctor(String server, String database, String raw, String api) {this.server = server; this.database = database; this.raw = raw; this.api = api;} protected static String BldApi(GfoMsg m, KeyVal... xtnAry) { String_bldr sb = String_bldr_.new_(); diff --git a/140_dbs/src/gplx/dbs/Db_url_tst.java b/140_dbs/src/gplx/dbs/Db_conn_info_tst.java similarity index 76% rename from 140_dbs/src/gplx/dbs/Db_url_tst.java rename to 140_dbs/src/gplx/dbs/Db_conn_info_tst.java index a40046a72..5aa8d41d5 100644 --- a/140_dbs/src/gplx/dbs/Db_url_tst.java +++ b/140_dbs/src/gplx/dbs/Db_conn_info_tst.java @@ -17,10 +17,10 @@ along with this program. If not, see . */ package gplx.dbs; import gplx.*; import org.junit.*; -public class Db_url_tst { +public class Db_conn_info_tst { @Before public void setup() { - regy.Add(Db_url_mock._); - } private final Db_url_pool regy = new Db_url_pool(); + regy.Add(Db_conn_info_mock._); + } private final Db_conn_info_pool regy = new Db_conn_info_pool(); @Test public void Parse() { tst_Parse("gplx_key=mock;id=1;", kv_("id", "1")); // one; gplx_key removed tst_Parse("gplx_key=mock;id=1;name=me;", kv_("id", "1"), kv_("name", "me")); // many @@ -28,19 +28,19 @@ public class Db_url_tst { } private KeyVal kv_(String key, Object val) {return KeyVal_.new_(key, val);} private void tst_Parse(String raw, KeyVal... expd) { - Db_url_mock mock = (Db_url_mock)regy.Parse(raw); + Db_conn_info_mock mock = (Db_conn_info_mock)regy.Parse(raw); Tfds.Eq_ary_str(expd, mock.Kvs()); } } -class Db_url_mock extends Db_url__base { +class Db_conn_info_mock extends Db_conn_info__base { public KeyVal[] Kvs() {return kvs;} KeyVal[] kvs; @Override public String Tid() {return Tid_const;} public static final String Tid_const = "mock"; - @Override public Db_url New_self(String raw, GfoMsg m) { - Db_url_mock rv = new Db_url_mock(); + @Override public Db_conn_info New_self(String raw, GfoMsg m) { + Db_conn_info_mock rv = new Db_conn_info_mock(); rv.kvs = new KeyVal[m.Args_count()]; for (int i = 0; i < m.Args_count(); i++) rv.kvs[i] = m.Args_getAt(i); return rv; } - public static final Db_url_mock _ = new Db_url_mock(); Db_url_mock() {} + public static final Db_conn_info_mock _ = new Db_conn_info_mock(); Db_conn_info_mock() {} } diff --git a/140_dbs/src/gplx/dbs/Db_conn_pool.java b/140_dbs/src/gplx/dbs/Db_conn_pool.java index 0be514532..1a949947b 100644 --- a/140_dbs/src/gplx/dbs/Db_conn_pool.java +++ b/140_dbs/src/gplx/dbs/Db_conn_pool.java @@ -21,11 +21,11 @@ import gplx.dbs.engines.sqlite.*; import gplx.dbs.engines.mysql.*; import gplx.d public class Db_conn_pool { private final HashAdp conn_hash = HashAdp_.new_(); private final HashAdp engine_hash = HashAdp_.new_(); public void Clear() {conn_hash.Clear();} - public void Del(Db_url url) {conn_hash.Del(url.Xto_api());} - public Db_conn Get_or_new__mem(String db) {return Get_or_new(Db_url__mem.new_(db));} - public Db_conn Get_or_new__sqlite(Io_url url) {return Get_or_new(Db_url_.sqlite_(url));} - public Db_conn Get_or_new(String s) {return Get_or_new(Db_url_.parse_(s));} - public Db_conn Get_or_new(Db_url url) { + public void Del(Db_conn_info url) {conn_hash.Del(url.Xto_api());} + public Db_conn Get_or_new__mem(String db) {return Get_or_new(Db_conn_info__mem.new_(db));} + public Db_conn Get_or_new__sqlite(Io_url url) {return Get_or_new(Db_conn_info_.sqlite_(url));} + public Db_conn Get_or_new(String s) {return Get_or_new(Db_conn_info_.parse_(s));} + public Db_conn Get_or_new(Db_conn_info url) { Db_conn rv = (Db_conn)conn_hash.Fetch(url.Xto_api()); if (rv == null) { Db_engine prime = (Db_engine)engine_hash.Fetch(url.Tid()); if (prime == null) throw Err_.new_("db engine prototype not found; tid={0}", url.Tid()); diff --git a/140_dbs/src/gplx/dbs/Db_meta_fld.java b/140_dbs/src/gplx/dbs/Db_meta_fld.java index 5c385af96..f062f512f 100644 --- a/140_dbs/src/gplx/dbs/Db_meta_fld.java +++ b/140_dbs/src/gplx/dbs/Db_meta_fld.java @@ -17,16 +17,16 @@ along with this program. If not, see . */ package gplx.dbs; import gplx.*; public class Db_meta_fld { - public Db_meta_fld(String name, int tid, int len, boolean nullable, boolean primary, boolean autoincrement, Object default_value) { + public Db_meta_fld(String name, int tid, int len, boolean nullable, boolean primary, boolean autonum, Object default_value) { this.name = name; this.tid = tid; this.len = len; - this.nullable = nullable; this.primary = primary; this.autoincrement = autoincrement; this.default_value = default_value; + this.nullable = nullable; this.primary = primary; this.autonum = autonum; this.default_value = default_value; } public int Tid() {return tid;} private final int tid; public String Name() {return name;} private final String name; public int Len() {return len;} private final int len; public boolean Nullable() {return nullable;} private final boolean nullable; public boolean Primary() {return primary;} private final boolean primary; - public boolean Autoincrement() {return autoincrement;} private final boolean autoincrement; + public boolean Autonum() {return autonum;} private final boolean autonum; public Object Default_value() {return default_value;} private final Object default_value; public static final int Tid_bool = 0, Tid_byte = 1, Tid_short = 2, Tid_int = 3, Tid_long = 4, Tid_float = 5, Tid_double = 6, Tid_str = 7, Tid_text = 8, Tid_bry = 9; public static final String Key_null = null; diff --git a/140_dbs/src/gplx/dbs/Db_meta_fld_list.java b/140_dbs/src/gplx/dbs/Db_meta_fld_list.java index a1fbf6a08..315fbf6bb 100644 --- a/140_dbs/src/gplx/dbs/Db_meta_fld_list.java +++ b/140_dbs/src/gplx/dbs/Db_meta_fld_list.java @@ -23,6 +23,16 @@ public class Db_meta_fld_list { public Db_meta_fld Get_by(String name) {return (Db_meta_fld)flds.Fetch(name);} public String[] To_str_ary() {if (str_ary == null) str_ary = (String[])keys.Xto_ary(String.class); return str_ary;} private String[] str_ary; public Db_meta_fld[] To_fld_ary() {if (fld_ary == null) fld_ary = (Db_meta_fld[])flds.Xto_ary(Db_meta_fld.class); return fld_ary;} private Db_meta_fld[] fld_ary; + public String[] To_str_ary_wo_autonum() { + int len = flds.Count(); + ListAdp rv = ListAdp_.new_(); + for (int i = 0; i < len; ++i) { + Db_meta_fld fld = (Db_meta_fld)flds.FetchAt(i); + if (fld.Autonum()) continue; + rv.Add(fld.Name()); + } + return (String[])rv.Xto_ary(String.class); + } public String[] To_str_ary_exclude(String[] ary) { HashAdp ary_hash = HashAdp_.new_(); ListAdp rv = ListAdp_.new_(); @@ -46,11 +56,14 @@ public class Db_meta_fld_list { public String Add_int(String name) {return Add(name, Db_meta_fld.Tid_int, Len_null, Bool_.N, Bool_.N, Bool_.N, Db_meta_fld.Default_value_null);} public String Add_int_pkey(String name) {return Add(name, Db_meta_fld.Tid_int, Len_null, Bool_.N, Bool_.Y, Bool_.N, Db_meta_fld.Default_value_null);} public String Add_int_pkey_autonum(String name) {return Add(name, Db_meta_fld.Tid_int, Len_null, Bool_.N, Bool_.Y, Bool_.Y, Db_meta_fld.Default_value_null);} + public String Add_int_autonum(String name) {return Add(name, Db_meta_fld.Tid_int, Len_null, Bool_.N, Bool_.Y, Bool_.N, Db_meta_fld.Default_value_null);} public String Add_int_dflt(String name, int dflt) {return Add(name, Db_meta_fld.Tid_int, Len_null, Bool_.N, Bool_.N, Bool_.N, dflt);} public String Add_long(String name) {return Add(name, Db_meta_fld.Tid_long, Len_null, Bool_.N, Bool_.N, Bool_.N, Db_meta_fld.Default_value_null);} public String Add_float(String name) {return Add(name, Db_meta_fld.Tid_float, Len_null, Bool_.N, Bool_.N, Bool_.N, Db_meta_fld.Default_value_null);} public String Add_double(String name) {return Add(name, Db_meta_fld.Tid_double, Len_null, Bool_.N, Bool_.N, Bool_.N, Db_meta_fld.Default_value_null);} public String Add_str(String name, int len) {return Add(name, Db_meta_fld.Tid_str, len, Bool_.N, Bool_.N, Bool_.N, Db_meta_fld.Default_value_null);} + public String Add_str_pkey(String name, int len) {return Add(name, Db_meta_fld.Tid_str, len, Bool_.N, Bool_.Y, Bool_.N, Db_meta_fld.Default_value_null);} + public String Add_str_null(String name, int len) {return Add(name, Db_meta_fld.Tid_str, len, Bool_.Y, Bool_.N, Bool_.N, Db_meta_fld.Default_value_null);} public String Add_str_dflt(String name, int len, String dflt) {return Add(name, Db_meta_fld.Tid_str, len, Bool_.N, Bool_.N, Bool_.N, dflt);} public String Add_text(String name) {return Add(name, Db_meta_fld.Tid_text, Len_null, Bool_.N, Bool_.N, Bool_.N, Db_meta_fld.Default_value_null);} diff --git a/140_dbs/src/gplx/dbs/Db_meta_idx.java b/140_dbs/src/gplx/dbs/Db_meta_idx.java index 6e81ef1ea..a49bfdb4d 100644 --- a/140_dbs/src/gplx/dbs/Db_meta_idx.java +++ b/140_dbs/src/gplx/dbs/Db_meta_idx.java @@ -31,4 +31,5 @@ public class Db_meta_idx { public static Db_meta_idx new_unique_by_tbl_wo_null(String tbl, String name, String... flds) {return new Db_meta_idx(tbl, Bld_idx_name(tbl, name), Bool_.Y, String_.Ary_wo_null(flds));} public static Db_meta_idx new_normal_by_tbl_wo_null(String tbl, String name, String... flds) {return new Db_meta_idx(tbl, Bld_idx_name(tbl, name), Bool_.N, String_.Ary_wo_null(flds));} public static String Bld_idx_name(String tbl, String suffix) {return String_.Concat(tbl, "__", suffix);} + public static final Db_meta_idx[] Ary_empty = new Db_meta_idx[0]; } diff --git a/140_dbs/src/gplx/dbs/Db_meta_tbl.java b/140_dbs/src/gplx/dbs/Db_meta_tbl.java index 7ae542650..9ca1f2506 100644 --- a/140_dbs/src/gplx/dbs/Db_meta_tbl.java +++ b/140_dbs/src/gplx/dbs/Db_meta_tbl.java @@ -19,6 +19,7 @@ package gplx.dbs; import gplx.*; import gplx.dbs.sqls.*; public class Db_meta_tbl { public Db_meta_tbl(String name, Db_meta_fld[] flds, Db_meta_idx[] idxs) { + if (idxs == null) idxs = Db_meta_idx.Ary_empty; // empty params will pass idxs of null; set to idxs[0] else null ref when calling create_table this.name = name; this.flds = flds; this.idxs = idxs; } public String Name() {return name;} private final String name; diff --git a/140_dbs/src/gplx/dbs/Db_rdr_.java b/140_dbs/src/gplx/dbs/Db_rdr_.java index 074aeefe8..cdf1508ea 100644 --- a/140_dbs/src/gplx/dbs/Db_rdr_.java +++ b/140_dbs/src/gplx/dbs/Db_rdr_.java @@ -17,9 +17,9 @@ along with this program. If not, see . */ package gplx.dbs; import gplx.*; public class Db_rdr_ { - public static final Db_rdr Null = new Db_rdr__null(); + public static final Db_rdr Empty = new Db_rdr__empty(); } -class Db_rdr__null implements Db_rdr { +class Db_rdr__empty implements Db_rdr { public boolean Move_next() {return false;} public byte[] Read_bry(int i) {return Bry_.Empty;} public byte[] Read_bry(String k) {return Bry_.Empty;} diff --git a/140_dbs/src/gplx/dbs/Db_rdr__basic.java b/140_dbs/src/gplx/dbs/Db_rdr__basic.java index 0765b523f..8efd84063 100644 --- a/140_dbs/src/gplx/dbs/Db_rdr__basic.java +++ b/140_dbs/src/gplx/dbs/Db_rdr__basic.java @@ -19,7 +19,8 @@ package gplx.dbs; import gplx.*; import java.sql.ResultSet; public class Db_rdr__basic implements Db_rdr { protected ResultSet rdr; - public void Ctor(ResultSet rdr, String sql) {this.rdr = rdr; this.sql = sql;} + private Db_stmt stmt; + public void Ctor(Db_stmt stmt, ResultSet rdr, String sql) {this.stmt = stmt; this.rdr = rdr; this.sql = sql;} public String Sql() {return sql;} private String sql; public boolean Move_next() { try {return rdr.next();} @@ -45,5 +46,9 @@ public class Db_rdr__basic implements Db_rdr { @gplx.Virtual public byte Read_byte(String k) {try {return Byte_.cast_(rdr.getObject(k));} catch (Exception e) {throw Err_.new_("read failed: k={0} type={1} err={2}", k, Byte_.Cls_val_name, Err_.Message_lang(e));}} @gplx.Virtual public boolean Read_bool_by_byte(int i) {try {return rdr.getByte(i + 1) == 1;} catch (Exception e) {throw Err_.new_("read failed: i={0} type={1} err={2}", i, Bool_.Cls_val_name, Err_.Message_lang(e));}} @gplx.Virtual public boolean Read_bool_by_byte(String k) {try {return Byte_.cast_(rdr.getObject(k)) == 1;} catch (Exception e) {throw Err_.new_("read failed: k={0} type={1} err={2}", k, Bool_.Cls_val_name, Err_.Message_lang(e));}} - @gplx.Virtual public void Rls() {try {rdr.close();} catch (Exception e) {throw Err_.new_("close failed: err={0}", Err_.Message_lang(e));}} + @gplx.Virtual public void Rls() { + try {rdr.close();} + catch (Exception e) {throw Err_.new_("close failed: err={0}", Err_.Message_lang(e));} + if (stmt != null) stmt.Rls(); + } } diff --git a/140_dbs/src/gplx/dbs/Db_stmt.java b/140_dbs/src/gplx/dbs/Db_stmt.java index 45eeac3aa..735d5475a 100644 --- a/140_dbs/src/gplx/dbs/Db_stmt.java +++ b/140_dbs/src/gplx/dbs/Db_stmt.java @@ -53,7 +53,8 @@ public interface Db_stmt extends RlsAble { int Exec_update(); int Exec_delete(); DataRdr Exec_select(); - Db_rdr Exec_select_as_rdr(); + Db_rdr Exec_select__rls_manual(); + Db_rdr Exec_select__rls_auto(); Object Exec_select_val(); void Ctor_stmt(Db_engine engine, Db_qry qry); Db_stmt Clear(); diff --git a/140_dbs/src/gplx/dbs/Db_stmt_bldr.java b/140_dbs/src/gplx/dbs/Db_stmt_bldr.java index bd000fa37..acb27774c 100644 --- a/140_dbs/src/gplx/dbs/Db_stmt_bldr.java +++ b/140_dbs/src/gplx/dbs/Db_stmt_bldr.java @@ -38,8 +38,8 @@ public class Db_stmt_bldr { default: throw Err_.unhandled(cmd_mode); } } - public void Batch_bgn() {conn.Txn_mgr().Txn_bgn_if_none();} - public void Batch_end() {conn.Txn_mgr().Txn_end_all();} + public void Batch_bgn() {conn.Txn_bgn(tbl_name);} + public void Batch_end() {conn.Txn_end();} public void Rls() { create = Db_stmt_.Rls(create); update = Db_stmt_.Rls(update); diff --git a/140_dbs/src/gplx/dbs/Db_txn_mgr.java b/140_dbs/src/gplx/dbs/Db_txn_mgr.java deleted file mode 100644 index 0ec437c0e..000000000 --- a/140_dbs/src/gplx/dbs/Db_txn_mgr.java +++ /dev/null @@ -1,40 +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 . -*/ -package gplx.dbs; import gplx.*; -import gplx.dbs.engines.*; -public class Db_txn_mgr { - public Db_txn_mgr(Db_engine engine) {this.engine = engine;} private final Db_engine engine; - public int Txn_depth() {return txn_depth;} int txn_depth; // NOTE: only support 1 level for now; - public void Txn_bgn_if_none() {if (txn_depth == 0) this.Txn_bgn();} - public void Txn_bgn() { - engine.Txn_bgn(); - ++txn_depth; - } - public void Txn_end_all() {this.Txn_end();} - public void Txn_end() { - if (txn_depth == 0) return; - engine.Txn_end(); - --txn_depth; - txn_count = 0; - } - public void Txn_end_all_bgn_if_none() { - this.Txn_end_all(); - this.Txn_bgn_if_none(); - } - public int Txn_count() {return txn_count;} public void Txn_count_(int v) {txn_count = v;} int txn_count; -} diff --git a/140_dbs/src/gplx/dbs/engines/Db_engine.java b/140_dbs/src/gplx/dbs/engines/Db_engine.java index 588e566e9..1a044a1c1 100644 --- a/140_dbs/src/gplx/dbs/engines/Db_engine.java +++ b/140_dbs/src/gplx/dbs/engines/Db_engine.java @@ -18,20 +18,24 @@ along with this program. If not, see . package gplx.dbs.engines; import gplx.*; import gplx.dbs.*; public interface Db_engine { String Tid(); - Db_url Url(); - Db_engine New_clone(Db_url url); - Db_rdr New_rdr_by_obj(Object o, String sql); // Object o:ResultSet if desktop; Cursor if android + Db_conn_info Conn_info(); + Db_engine New_clone(Db_conn_info url); + Db_rdr New_rdr__rls_manual (Object rdr_obj, String sql); // Object o:ResultSet if desktop; Cursor if android + Db_rdr New_rdr__rls_auto (Db_stmt stmt, Object rdr_obj, String sql); // Object o:ResultSet if desktop; Cursor if android Db_stmt New_stmt_prep(Db_qry qry); Object New_stmt_prep_as_obj(String sql); DataRdr New_rdr(java.sql.ResultSet rdr, String sql); - void Txn_bgn(); + void Txn_bgn(String name); void Txn_end(); + void Txn_cxl(); + void Txn_sav(); void Conn_open(); void Conn_term(); Object Exec_as_obj(Db_qry qry); - void Exec_ddl_create_tbl(Db_meta_tbl meta); - void Exec_ddl_create_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... ary); - void Exec_ddl_append_fld(String tbl, Db_meta_fld fld); - void Exec_env_db_attach(String alias, Io_url db_url); - void Exec_env_db_detach(String alias); + void Ddl_create_tbl(Db_meta_tbl meta); + void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... ary); + void Ddl_append_fld(String tbl, Db_meta_fld fld); + void Ddl_delete_tbl(String tbl); + void Env_db_attach(String alias, Io_url db_url); + void Env_db_detach(String alias); } diff --git a/140_dbs/src/gplx/dbs/engines/Db_engine_sql_base.java b/140_dbs/src/gplx/dbs/engines/Db_engine_sql_base.java index 493c8e8a2..cd6dfc59a 100644 --- a/140_dbs/src/gplx/dbs/engines/Db_engine_sql_base.java +++ b/140_dbs/src/gplx/dbs/engines/Db_engine_sql_base.java @@ -19,19 +19,18 @@ package gplx.dbs.engines; import gplx.*; import gplx.dbs.*; import java.sql.*; import gplx.dbs.engines.*; import gplx.dbs.qrys.*; import gplx.dbs.sqls.*; public abstract class Db_engine_sql_base implements Db_engine { - @gplx.Internal protected void Ctor(Db_url url) {this.url = url;} + @gplx.Internal protected void Ctor(Db_conn_info conn_info) {this.conn_info = conn_info;} public abstract String Tid(); - public Db_url Url() {return url;} protected Db_url url; - public abstract Db_engine New_clone(Db_url url); - public Db_rdr New_rdr_by_obj(Object rdr, String sql) { - Db_rdr__basic rv = (Db_rdr__basic)New_rdr_clone(); - rv.Ctor((ResultSet)rdr, sql); - return rv; - } + public Db_conn_info Conn_info() {return conn_info;} protected Db_conn_info conn_info; + public abstract Db_engine New_clone(Db_conn_info conn_info); + public Db_rdr New_rdr__rls_manual(Object rdr_obj, String sql) {return New_rdr(null, rdr_obj, sql);} + public Db_rdr New_rdr__rls_auto(Db_stmt stmt, Object rdr_obj, String sql) {return New_rdr(stmt, rdr_obj, sql);} @gplx.Virtual public Db_rdr New_rdr_clone() {return new Db_rdr__basic();} public Db_stmt New_stmt_prep(Db_qry qry) {return new Db_stmt_cmd(this, qry);} - public void Txn_bgn() {Exec_as_obj(Db_qry_sql.xtn_("BEGIN TRANSACTION;"));} - public void Txn_end() {Exec_as_obj(Db_qry_sql.xtn_("COMMIT TRANSACTION;"));} + @gplx.Virtual public void Txn_bgn(String name) {Exec_as_obj(Db_qry_sql.xtn_("BEGIN TRANSACTION;"));} + @gplx.Virtual public void Txn_end() {Exec_as_obj(Db_qry_sql.xtn_("COMMIT TRANSACTION;"));} + @gplx.Virtual public void Txn_cxl() {Exec_as_obj(Db_qry_sql.xtn_("ROLLBACK TRANSACTION;"));} + @gplx.Virtual public void Txn_sav() {this.Txn_end(); this.Txn_bgn("");} public Object Exec_as_obj(Db_qry qry) { if (qry.Tid() == Db_qry_.Tid_flush) return null; // ignore flush (delete-db) statements String sql = this.SqlWtr().Xto_str(qry, false); // DBG: Tfds.Write(sql); @@ -42,7 +41,7 @@ public abstract class Db_engine_sql_base implements Db_engine { Statement cmd = New_stmt_exec(sql); return cmd.executeUpdate(sql); } - catch (Exception exc) {throw Err_.err_(exc, "exec nonQuery failed").Add("sql", sql).Add("err", Err_.Message_gplx_brief(exc));} + catch (Exception exc) {throw Err_.new_("db.engine:exec failed; url={0} sql={1} err={2}", conn_info.Xto_api(), sql, Err_.Message_gplx_brief(exc));} } private DataRdr Exec_as_rdr(String sql) { try { @@ -51,31 +50,35 @@ public abstract class Db_engine_sql_base implements Db_engine { ResultSet rdr = cmd.getResultSet(); return New_rdr(rdr, sql); } - catch (Exception exc) {throw Err_.err_(exc, "exec reader failed").Add("sql", sql).Add("err", Err_.Message_gplx_brief(exc));} + catch (Exception exc) {throw Err_.new_("db.engine:rdr failed; url={0} sql={1} err={2}", conn_info.Xto_api(), sql, Err_.Message_gplx_brief(exc));} } - public void Exec_ddl_create_tbl(Db_meta_tbl meta) {Exec_as_int(meta.To_sql_create());} - public void Exec_ddl_create_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... ary) { + public void Ddl_create_tbl(Db_meta_tbl tbl) {Exec_as_int(tbl.To_sql_create());} + public void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... ary) { int len = ary.length; for (int i = 0; i < len; ++i) { Db_meta_idx idx = ary[i]; - usr_dlg.Plog_many("", "", "db.idx.create; db=~{0} idx=~{1}", url.Database(), idx.Name()); + usr_dlg.Plog_many("", "", "creating database index (please wait); db=~{0} idx=~{1}", conn_info.Database(), idx.Name()); Exec_as_int(idx.To_sql_create()); } } - public void Exec_ddl_append_fld(String tbl, Db_meta_fld fld) { - Exec_as_int(Db_sqlbldr__sqlite.I.Bld_alter_tbl_add(tbl, fld)); - } - @gplx.Virtual public void Exec_env_db_attach(String alias, Io_url db_url) {} - @gplx.Virtual public void Exec_env_db_detach(String alias) {} + public void Ddl_append_fld(String tbl, Db_meta_fld fld) {Exec_as_int(Db_sqlbldr__sqlite.I.Bld_alter_tbl_add(tbl, fld));} + public void Ddl_delete_tbl(String tbl) {Exec_as_int(Db_sqlbldr__sqlite.I.Bld_drop_tbl(tbl));} + @gplx.Virtual public void Env_db_attach(String alias, Io_url db_url) {} + @gplx.Virtual public void Env_db_detach(String alias) {} @gplx.Virtual public DataRdr New_rdr(ResultSet rdr, String sql) {return gplx.stores.Db_data_rdr_.new_(rdr, sql);} @gplx.Virtual public Sql_qry_wtr SqlWtr() {return Sql_qry_wtr_.new_ansi();} + private Db_rdr New_rdr(Db_stmt stmt, Object rdr, String sql) { + Db_rdr__basic rv = (Db_rdr__basic)New_rdr_clone(); + rv.Ctor(stmt, (ResultSet)rdr, sql); + return rv; + } @gplx.Internal protected abstract Connection Conn_new(); - private Connection connection; + protected Connection connection; public void Conn_open() {connection = Conn_new();} public void Conn_term() { if (connection == null) return; // connection never opened; just exit try {connection.close();} - catch (Exception e) {throw Err_.err_(e, "Conn_term.fail; url={0} err={1}", url.Xto_raw(), Err_.Message_lang(e));} + catch (Exception e) {throw Err_.err_(e, "Conn_term.fail; url={0} err={1}", conn_info.Xto_raw(), Err_.Message_lang(e));} connection = null; } public Object New_stmt_prep_as_obj(String sql) { @@ -90,6 +93,6 @@ public abstract class Db_engine_sql_base implements Db_engine { } protected Connection Conn_make_by_url(String url, String uid, String pwd) { try {return DriverManager.getConnection(url, uid, pwd);} - catch (SQLException e) {throw Err_.err_(e, "connection open failed").Add("ConnectInfo", Url().Xto_raw());} + catch (SQLException e) {throw Err_.err_(e, "connection open failed").Add("ConnectInfo", Conn_info().Xto_raw());} } } diff --git a/140_dbs/src/gplx/dbs/engines/mems/Db_url__mem.java b/140_dbs/src/gplx/dbs/engines/mems/Db_conn_info__mem.java similarity index 73% rename from 140_dbs/src/gplx/dbs/engines/mems/Db_url__mem.java rename to 140_dbs/src/gplx/dbs/engines/mems/Db_conn_info__mem.java index 7d8f5ef9b..699481a73 100644 --- a/140_dbs/src/gplx/dbs/engines/mems/Db_url__mem.java +++ b/140_dbs/src/gplx/dbs/engines/mems/Db_conn_info__mem.java @@ -16,18 +16,18 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.dbs.engines.mems; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; -public class Db_url__mem extends Db_url__base { +public class Db_conn_info__mem extends Db_conn_info__base { @Override public String Tid() {return Tid_const;} public static final String Tid_const = "mem"; - @Override public Db_url New_self(String raw, GfoMsg m) { - Db_url__mem rv = new Db_url__mem(); + @Override public Db_conn_info New_self(String raw, GfoMsg m) { + Db_conn_info__mem rv = new Db_conn_info__mem(); rv.Ctor("", m.ReadStr("database"), raw, raw); return rv; } - public static Db_url new_(String database) { - return Db_url_.parse_(Bld_raw + public static Db_conn_info new_(String database) { + return Db_conn_info_.parse_(Bld_raw ( "gplx_key", Tid_const , "database", database )); } - public static final Db_url__mem I = new Db_url__mem(); Db_url__mem() {} + public static final Db_conn_info__mem I = new Db_conn_info__mem(); Db_conn_info__mem() {} } diff --git a/140_dbs/src/gplx/dbs/engines/mems/Db_engine__mem.java b/140_dbs/src/gplx/dbs/engines/mems/Db_engine__mem.java index 570767834..fccb697df 100644 --- a/140_dbs/src/gplx/dbs/engines/mems/Db_engine__mem.java +++ b/140_dbs/src/gplx/dbs/engines/mems/Db_engine__mem.java @@ -18,29 +18,33 @@ along with this program. If not, see . package gplx.dbs.engines.mems; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; public class Db_engine__mem implements Db_engine { private final HashAdp tbl_hash = HashAdp_.new_(); - Db_engine__mem(Db_url url) {this.url = url;} - public String Tid() {return Db_url__mem.Tid_const;} - public Db_url Url() {return url;} private Db_url url; - public Db_engine New_clone(Db_url url) {return new Db_engine__mem(url);} + Db_engine__mem(Db_conn_info conn_info) {this.conn_info = conn_info;} + public String Tid() {return Db_conn_info__mem.Tid_const;} + public Db_conn_info Conn_info() {return conn_info;} private Db_conn_info conn_info; + public Db_engine New_clone(Db_conn_info conn_info) {return new Db_engine__mem(conn_info);} public Db_stmt New_stmt_prep(Db_qry qry) {return new Db_stmt__mem(this, qry);} public Mem_tbl Tbls_get(String name) {return (Mem_tbl)tbl_hash.Fetch(name);} - public void Txn_bgn() {++txn_count;} private int txn_count = 0; - public void Txn_end() {--txn_count;} + public void Txn_bgn(String name) {++txn_count;} private int txn_count = 0; + public void Txn_end() {--txn_count;} + public void Txn_cxl() {--txn_count;} + public void Txn_sav() {this.Txn_end(); this.Txn_bgn("");} public Object Exec_as_obj(Db_qry qry) {throw Err_.not_implemented_();} public void Conn_open() {} public void Conn_term() { if (txn_count != 0) throw Err_.new_("Conn_term.txns still open; txn_count={0}", txn_count); } - public Db_rdr New_rdr_by_obj(Object rdr, String sql) {throw Err_.not_implemented_();} + public Db_rdr New_rdr__rls_manual(Object rdr_obj, String sql) {throw Err_.not_implemented_();} + public Db_rdr New_rdr__rls_auto(Db_stmt stmt, Object rdr_obj, String sql) {throw Err_.not_implemented_();} public DataRdr New_rdr(java.sql.ResultSet rdr, String sql) {throw Err_.not_implemented_();} public Object New_stmt_prep_as_obj(String sql) {throw Err_.not_implemented_();} - public void Exec_ddl_create_tbl(Db_meta_tbl meta) { - Mem_tbl mem_tbl = new Mem_tbl(); + public void Ddl_create_tbl(Db_meta_tbl meta) { + Mem_tbl mem_tbl = new Mem_tbl(meta); tbl_hash.AddReplace(meta.Name(), mem_tbl); } - public void Exec_ddl_create_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... ary) {} // TODO: implement unique index - public void Exec_ddl_append_fld(String tbl, Db_meta_fld fld) {} - public void Exec_env_db_attach(String alias, Io_url db_url) {} - public void Exec_env_db_detach(String alias) {} + public void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... ary) {} // TODO: implement unique index + public void Ddl_append_fld(String tbl, Db_meta_fld fld) {} + public void Ddl_delete_tbl(String tbl) {} + public void Env_db_attach(String alias, Io_url db_url) {} + public void Env_db_detach(String alias) {} public static final Db_engine__mem _ = new Db_engine__mem(); Db_engine__mem() {} } diff --git a/140_dbs/src/gplx/dbs/engines/mems/Db_stmt__mem.java b/140_dbs/src/gplx/dbs/engines/mems/Db_stmt__mem.java index 1811c2b8e..c4ef1c0da 100644 --- a/140_dbs/src/gplx/dbs/engines/mems/Db_stmt__mem.java +++ b/140_dbs/src/gplx/dbs/engines/mems/Db_stmt__mem.java @@ -18,12 +18,13 @@ along with this program. If not, see . package gplx.dbs.engines.mems; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; public class Db_stmt__mem implements Db_stmt { private static final String Key_na = ""; // key is not_available; only called by procs with signature of Val( v); - private final ListAdp val_list = ListAdp_.new_(); + private final OrderedHash val_list = OrderedHash_.new_(); public Db_stmt__mem(Db_engine__mem engine, Db_qry qry) {Ctor_stmt(engine, qry);} private Db_engine__mem engine; public void Ctor_stmt(Db_engine engine, Db_qry qry) {this.engine = (Db_engine__mem)engine; this.qry = qry;} public HashAdp Crts() {return crt_hash;} private final HashAdp crt_hash = HashAdp_.new_(); public int Args_len() {return val_list.Count();} - public Object Args_get_at(int i) {return val_list.FetchAt(i);} + public Object Args_get_at(int i) {return val_list.FetchAt(i);} + public Object Args_get_by(String k) {return val_list.Fetch(k);} public Db_qry Qry() {return qry;} private Db_qry qry; public Db_stmt Reset_stmt() {return this;} public Db_stmt Clear() { @@ -117,14 +118,15 @@ public class Db_stmt__mem implements Db_stmt { return tbl.Delete(this); } public DataRdr Exec_select() {throw Err_.not_implemented_();} - public Db_rdr Exec_select_as_rdr() { + public Db_rdr Exec_select__rls_auto() {return this.Exec_select__rls_manual();} + public Db_rdr Exec_select__rls_manual() { Mem_tbl tbl = engine.Tbls_get(qry.Base_table()); return tbl.Select(this); - } + } public Object Exec_select_val() {throw Err_.not_implemented_();} private void Add(String k, boolean where, Object v) { - if (k == Db_meta_fld.Key_null) return; // key is explicitly null; ignore; allows version_2+ type definitions - val_list.Add(v); + if (k == Db_meta_fld.Key_null) return; // key is explicitly null; ignore; allows schema_2+ type definitions + val_list.Add_if_new(k, v); // NOTE: only add if new; WHERE with IN will call Add many times; fld_ttl IN ('A.png', 'B.png'); if (where) { ListAdp list = (ListAdp)crt_hash.Fetch(k); if (list == null) { diff --git a/140_dbs/src/gplx/dbs/engines/mems/Mem_tbl.java b/140_dbs/src/gplx/dbs/engines/mems/Mem_tbl.java index 4506896c9..ee5b06cbf 100644 --- a/140_dbs/src/gplx/dbs/engines/mems/Mem_tbl.java +++ b/140_dbs/src/gplx/dbs/engines/mems/Mem_tbl.java @@ -16,18 +16,33 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.dbs.engines.mems; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; -import gplx.core.criterias.*; import gplx.dbs.qrys.*; +import gplx.core.primitives.*; import gplx.core.criterias.*; import gplx.dbs.qrys.*; public class Mem_tbl { private final ListAdp rows = ListAdp_.new_(); private final ListAdp where_rows = ListAdp_.new_(); + private final HashAdp autonum_hash = HashAdp_.new_(); + private final Db_meta_tbl meta; + public Mem_tbl(Db_meta_tbl meta) {this.meta = meta;} public int Insert(Db_stmt__mem stmt) { - Db_qry_insert qry = (Db_qry_insert)stmt.Qry(); - String[] cols = qry.Cols_for_insert(); int len = cols.length; Mem_itm itm = new Mem_itm(); - for (int i = 0; i < len; ++i) - itm.Set_by(cols[i], stmt.Args_get_at(i)); + Db_meta_fld[] flds = meta.Flds(); + int len = flds.length; + for (int i = 0; i < len; ++i) { + Db_meta_fld fld = flds[i]; + String fld_name = fld.Name(); + Object val = fld.Autonum() ? Autonum_calc(fld_name) : stmt.Args_get_by(fld_name); + itm.Set_by(fld_name, val); + } rows.Add(itm); return 1; } + private int Autonum_calc(String name) { + Int_obj_ref autonum_itm = (Int_obj_ref)autonum_hash.Fetch(name); + if (autonum_itm == null) { + autonum_itm = Int_obj_ref.new_(0); + autonum_hash.Add(name, autonum_itm); + } + return autonum_itm.Val_add(); + } public int Update(Db_stmt__mem stmt) { Db_qry_update qry = (Db_qry_update)stmt.Qry(); qry.Where().Val_from_args(stmt.Crts()); diff --git a/140_dbs/src/gplx/dbs/engines/mysql/Mysql_url.java b/140_dbs/src/gplx/dbs/engines/mysql/Mysql_conn_info.java similarity index 76% rename from 140_dbs/src/gplx/dbs/engines/mysql/Mysql_url.java rename to 140_dbs/src/gplx/dbs/engines/mysql/Mysql_conn_info.java index ac27421e1..135ee0800 100644 --- a/140_dbs/src/gplx/dbs/engines/mysql/Mysql_url.java +++ b/140_dbs/src/gplx/dbs/engines/mysql/Mysql_conn_info.java @@ -16,12 +16,12 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.dbs.engines.mysql; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; -public class Mysql_url extends Db_url__base { +public class Mysql_conn_info extends Db_conn_info__base { @Override public String Tid() {return Tid_const;} public static final String Tid_const = "mysql"; public String Uid() {return uid;} private String uid; public String Pwd() {return pwd;} private String pwd; - public static Db_url new_(String server, String database, String uid, String pwd) { - return Db_url_.parse_(Bld_raw + public static Db_conn_info new_(String server, String database, String uid, String pwd) { + return Db_conn_info_.parse_(Bld_raw ( "gplx_key", Tid_const , "server", server , "database", database @@ -30,12 +30,12 @@ public class Mysql_url extends Db_url__base { , "charset", "utf8" )); } - @Override public Db_url New_self(String raw, GfoMsg m) { - Mysql_url rv = new Mysql_url(); + @Override public Db_conn_info New_self(String raw, GfoMsg m) { + Mysql_conn_info rv = new Mysql_conn_info(); rv.Ctor(m.ReadStr("server"), m.ReadStr("database"), raw, BldApi(m, KeyVal_.new_("charset", "utf8"))); rv.uid = m.ReadStr("uid"); rv.pwd = m.ReadStr("pwd"); return rv; } - public static final Mysql_url _ = new Mysql_url(); Mysql_url() {} + public static final Mysql_conn_info _ = new Mysql_conn_info(); Mysql_conn_info() {} } diff --git a/140_dbs/src/gplx/dbs/engines/mysql/Mysql_engine.java b/140_dbs/src/gplx/dbs/engines/mysql/Mysql_engine.java index adc217549..14aec8bbf 100644 --- a/140_dbs/src/gplx/dbs/engines/mysql/Mysql_engine.java +++ b/140_dbs/src/gplx/dbs/engines/mysql/Mysql_engine.java @@ -19,17 +19,17 @@ package gplx.dbs.engines.mysql; import gplx.*; import gplx.dbs.*; import gplx.db import gplx.stores.*; import gplx.dbs.engines.*; import gplx.dbs.sqls.*; import java.sql.*; public class Mysql_engine extends Db_engine_sql_base { - @Override public String Tid() {return Mysql_url.Tid_const;} + @Override public String Tid() {return Mysql_conn_info.Tid_const;} @Override public Sql_qry_wtr SqlWtr() {return Sql_qry_wtr_.new_escape_backslash();} - @Override public Db_engine New_clone(Db_url connectInfo) { + @Override public Db_engine New_clone(Db_conn_info connectInfo) { Mysql_engine rv = new Mysql_engine(); rv.Ctor(connectInfo); return rv; } @Override public DataRdr New_rdr(ResultSet rdr, String commandText) {return Mysql_rdr.new_(rdr, commandText);} @gplx.Internal @Override protected Connection Conn_new() { - Mysql_url url_as_mysql = (Mysql_url)url; - return Conn_make_by_url("jdbc:mysql://localhost/" + url_as_mysql.Database() + "?characterEncoding=UTF8", url_as_mysql.Uid(), url_as_mysql.Pwd()); + Mysql_conn_info conn_info_as_mysql = (Mysql_conn_info)conn_info; + return Conn_make_by_url("jdbc:mysql://localhost/" + conn_info_as_mysql.Database() + "?characterEncoding=UTF8", conn_info_as_mysql.Uid(), conn_info_as_mysql.Pwd()); } public static final Mysql_engine _ = new Mysql_engine(); Mysql_engine() {} } diff --git a/140_dbs/src/gplx/dbs/engines/nulls/Null_url.java b/140_dbs/src/gplx/dbs/engines/nulls/Null_conn_info.java similarity index 77% rename from 140_dbs/src/gplx/dbs/engines/nulls/Null_url.java rename to 140_dbs/src/gplx/dbs/engines/nulls/Null_conn_info.java index ce99e5120..ea017b24b 100644 --- a/140_dbs/src/gplx/dbs/engines/nulls/Null_url.java +++ b/140_dbs/src/gplx/dbs/engines/nulls/Null_conn_info.java @@ -16,8 +16,8 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.dbs.engines.nulls; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; -public class Null_url extends Db_url__base { +public class Null_conn_info extends Db_conn_info__base { @Override public String Tid() {return Tid_const;} public static final String Tid_const = "null_db"; - @Override public Db_url New_self(String raw, GfoMsg m) {return this;} - public static final Null_url _ = new Null_url(); Null_url() {this.Ctor("", "", "gplx_key=null_db", "");} + @Override public Db_conn_info New_self(String raw, GfoMsg m) {return this;} + public static final Null_conn_info _ = new Null_conn_info(); Null_conn_info() {this.Ctor("", "", "gplx_key=null_db", "");} } diff --git a/140_dbs/src/gplx/dbs/engines/nulls/Null_engine.java b/140_dbs/src/gplx/dbs/engines/nulls/Null_engine.java index 8f7a3fac4..1becb9db6 100644 --- a/140_dbs/src/gplx/dbs/engines/nulls/Null_engine.java +++ b/140_dbs/src/gplx/dbs/engines/nulls/Null_engine.java @@ -15,24 +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 . */ -package gplx.dbs.engines.nulls; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; + package gplx.dbs.engines.nulls; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; public class Null_engine implements Db_engine { - public String Tid() {return Null_url.Tid_const;} - public Db_url Url() {return Db_url_.Null;} + public String Tid() {return Null_conn_info.Tid_const;} + public Db_conn_info Conn_info() {return Db_conn_info_.Null;} public void Conn_open() {} public void Conn_term() {} - public Db_engine New_clone(Db_url url) {return this;} - public Db_rdr New_rdr_by_obj(Object o, String sql) {return Db_rdr_.Null;} + public Db_engine New_clone(Db_conn_info url) {return this;} + public Db_rdr New_rdr__rls_manual (Object rdr_obj, String sql) {return Db_rdr_.Empty;} + public Db_rdr New_rdr__rls_auto (Db_stmt stmt, Object rdr_obj, String sql) {return Db_rdr_.Empty;} public Db_stmt New_stmt_prep(Db_qry qry) {return Db_stmt_.Null;} public Object New_stmt_prep_as_obj(String sql) {throw Err_.not_implemented_();} public DataRdr New_rdr(java.sql.ResultSet rdr, String sql) {return DataRdr_.Null;} - public void Txn_bgn() {} - public void Txn_end() {} + public void Txn_bgn(String name) {} + public void Txn_end() {} + public void Txn_cxl() {} + public void Txn_sav() {} public Object Exec_as_obj(Db_qry cmd) {return cmd.Exec_is_rdr() ? (Object)DataRdr_.Null : -1;} - public void Exec_ddl_create_tbl(Db_meta_tbl meta) {} - public void Exec_ddl_create_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... ary) {} - public void Exec_ddl_append_fld(String tbl, Db_meta_fld fld) {} - public void Exec_env_db_attach(String alias, Io_url db_url) {} - public void Exec_env_db_detach(String alias) {} + public void Ddl_create_tbl(Db_meta_tbl meta) {} + public void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... ary) {} + public void Ddl_append_fld(String tbl, Db_meta_fld fld) {} + public void Ddl_delete_tbl(String tbl) {} + public void Env_db_attach(String alias, Io_url db_url) {} + public void Env_db_detach(String alias) {} public static final Null_engine _ = new Null_engine(); Null_engine() {} } diff --git a/140_dbs/src/gplx/dbs/engines/postgres/Postgres_url.java b/140_dbs/src/gplx/dbs/engines/postgres/Postgres_conn_info.java similarity index 76% rename from 140_dbs/src/gplx/dbs/engines/postgres/Postgres_url.java rename to 140_dbs/src/gplx/dbs/engines/postgres/Postgres_conn_info.java index d8663b08c..4eb51c976 100644 --- a/140_dbs/src/gplx/dbs/engines/postgres/Postgres_url.java +++ b/140_dbs/src/gplx/dbs/engines/postgres/Postgres_conn_info.java @@ -16,12 +16,12 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.dbs.engines.postgres; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; -public class Postgres_url extends Db_url__base { +public class Postgres_conn_info extends Db_conn_info__base { @Override public String Tid() {return Tid_const;} public static final String Tid_const = "postgresql"; public String Uid() {return uid;} private String uid; public String Pwd() {return pwd;} private String pwd; - public static Db_url new_(String server, String database, String uid, String pwd) { - return Db_url_.parse_(Bld_raw + public static Db_conn_info new_(String server, String database, String uid, String pwd) { + return Db_conn_info_.parse_(Bld_raw ( "gplx_key", Tid_const , "server", server , "database", database @@ -31,12 +31,12 @@ public class Postgres_url extends Db_url__base { , "encoding", "unicode" // needed for 1.1 conn; otherwise, ascii )); } - @Override public Db_url New_self(String raw, GfoMsg m) { - Postgres_url rv = new Postgres_url(); + @Override public Db_conn_info New_self(String raw, GfoMsg m) { + Postgres_conn_info rv = new Postgres_conn_info(); rv.Ctor(m.ReadStr("server"), m.ReadStr("database"), raw, BldApi(m, KeyVal_.new_("encoding", "unicode"))); rv.uid = m.ReadStr("user id"); rv.pwd = m.ReadStr("password"); return rv; } - public static final Postgres_url _ = new Postgres_url(); Postgres_url() {} + public static final Postgres_conn_info _ = new Postgres_conn_info(); Postgres_conn_info() {} } diff --git a/140_dbs/src/gplx/dbs/engines/postgres/Postgres_engine.java b/140_dbs/src/gplx/dbs/engines/postgres/Postgres_engine.java index 809cfbb81..65217fb6c 100644 --- a/140_dbs/src/gplx/dbs/engines/postgres/Postgres_engine.java +++ b/140_dbs/src/gplx/dbs/engines/postgres/Postgres_engine.java @@ -19,17 +19,17 @@ package gplx.dbs.engines.postgres; import gplx.*; import gplx.dbs.*; import gplx import gplx.stores.*; import gplx.dbs.engines.*; import gplx.dbs.sqls.*; import java.sql.*; public class Postgres_engine extends Db_engine_sql_base { - @Override public String Tid() {return Postgres_url.Tid_const;} + @Override public String Tid() {return Postgres_conn_info.Tid_const;} @Override public Sql_qry_wtr SqlWtr() {return Sql_qry_wtr_.new_escape_backslash();} - @Override public Db_engine New_clone(Db_url connectInfo) { + @Override public Db_engine New_clone(Db_conn_info connectInfo) { Postgres_engine rv = new Postgres_engine(); rv.Ctor(connectInfo); return rv; } @Override public DataRdr New_rdr(ResultSet rdr, String commandText) {return Db_data_rdr_.new_(rdr, commandText);} @gplx.Internal @Override protected Connection Conn_new() { - Postgres_url url_as_postgres = (Postgres_url)url; - return Conn_make_by_url("jdbc:" + url_as_postgres.Tid() + "://localhost/" + url_as_postgres.Database(), url_as_postgres.Uid(), url_as_postgres.Pwd()); + Postgres_conn_info conn_info_as_postgres = (Postgres_conn_info)conn_info; + return Conn_make_by_url("jdbc:" + conn_info_as_postgres.Tid() + "://localhost/" + conn_info_as_postgres.Database(), conn_info_as_postgres.Uid(), conn_info_as_postgres.Pwd()); } public static final Postgres_engine _ = new Postgres_engine(); Postgres_engine() {} } diff --git a/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_url.java b/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_conn_info.java similarity index 75% rename from 140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_url.java rename to 140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_conn_info.java index a566f787e..aacd38018 100644 --- a/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_url.java +++ b/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_conn_info.java @@ -16,32 +16,32 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.dbs.engines.sqlite; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; -public class Sqlite_url extends Db_url__base { +public class Sqlite_conn_info extends Db_conn_info__base { @Override public String Tid() {return Tid_const;} public static final String Tid_const = "sqlite"; public Io_url Url() {return url;} private Io_url url; - @Override public Db_url New_self(String raw, GfoMsg m) { - Sqlite_url rv = new Sqlite_url(); + @Override public Db_conn_info New_self(String raw, GfoMsg m) { + Sqlite_conn_info rv = new Sqlite_conn_info(); String url = m.ReadStr("data source"); rv.url = Io_url_.new_any_(url); rv.Ctor("", url, raw, BldApi(m, KeyVal_.new_("version", "3"))); rv.database = rv.url.NameOnly(); return rv; } - public static Db_url load_(Io_url url) { - return Db_url_.parse_(Bld_raw + public static Db_conn_info load_(Io_url url) { + return Db_conn_info_.parse_(Bld_raw ( "gplx_key" , Tid_const , "data source" , url.Xto_api() , "version" , "3" )); } - public static Db_url make_(Io_url url) { + public static Db_conn_info make_(Io_url url) { Io_mgr._.CreateDirIfAbsent(url.OwnerDir()); - return Db_url_.parse_(Bld_raw + return Db_conn_info_.parse_(Bld_raw ( "gplx_key" , Tid_const , "data source" , url.Xto_api() , "version" , "3" )); } - public static final Sqlite_url _ = new Sqlite_url(); Sqlite_url() {} + public static final Sqlite_conn_info _ = new Sqlite_conn_info(); Sqlite_conn_info() {} } \ No newline at end of file diff --git a/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_engine.java b/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_engine.java index 3e16370e1..217ffe944 100644 --- a/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_engine.java +++ b/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_engine.java @@ -20,16 +20,24 @@ import java.sql.*; import gplx.stores.*; import gplx.dbs.engines.*; import gplx.dbs.engines.sqlite.*; import gplx.dbs.qrys.*; public class Sqlite_engine extends Db_engine_sql_base { - @Override public String Tid() {return Sqlite_url.Tid_const;} - @Override public Db_engine New_clone(Db_url connectInfo) { + private final Sqlite_txn_mgr txn_mgr; + Sqlite_engine() { + this.txn_mgr = new Sqlite_txn_mgr(this); + } + @Override public String Tid() {return Sqlite_conn_info.Tid_const;} + @Override public Db_engine New_clone(Db_conn_info connectInfo) { Sqlite_engine rv = new Sqlite_engine(); rv.Ctor(connectInfo); return rv; } @Override public DataRdr New_rdr(ResultSet rdr, String commandText) {return Sqlite_rdr.new_(rdr, commandText);} @Override public Db_rdr New_rdr_clone() {return new Db_rdr__sqlite();} - @Override public void Exec_env_db_attach(String alias, Io_url db_url) {Exec_as_int(String_.Format("ATTACH '{0}' AS {1};", db_url.Raw(), alias));} - @Override public void Exec_env_db_detach(String alias) {Exec_as_int(String_.Format("DETACH {0};", alias));} + @Override public void Env_db_attach(String alias, Io_url db_url) {Exec_as_int(String_.Format("ATTACH '{0}' AS {1};", db_url.Raw(), alias));} + @Override public void Env_db_detach(String alias) {Exec_as_int(String_.Format("DETACH {0};", alias));} + @Override public void Txn_bgn(String name) {txn_mgr.Txn_bgn(name);} + @Override public void Txn_end() {txn_mgr.Txn_end();} + @Override public void Txn_cxl() {txn_mgr.Txn_cxl();} + @Override public void Txn_sav() {txn_mgr.Txn_sav();} static boolean loaded = false; @gplx.Internal @Override protected Connection Conn_new() { if (!loaded) { @@ -39,24 +47,11 @@ public class Sqlite_engine extends Db_engine_sql_base { catch (ClassNotFoundException e) {throw Err_.new_("could not load sqlite jdbc driver");} loaded = true; } - Sqlite_url url_as_sqlite = (Sqlite_url)url; - return Conn_make_by_url("jdbc:sqlite://" + String_.Replace(url_as_sqlite.Url().Raw(), "\\", "/"), "", ""); + Sqlite_conn_info conn_info_as_sqlite = (Sqlite_conn_info)conn_info; + Connection rv = Conn_make_by_url("jdbc:sqlite://" + String_.Replace(conn_info_as_sqlite.Url().Raw(), "\\", "/"), "", ""); + return rv; } - private boolean pragma_needed = true; - @Override public void Txn_bgn() { -// Execute(Db_qry_sql.xtn_("PRAGMA ENCODING=\"UTF-8\";")); -// Execute(Db_qry_sql.xtn_("PRAGMA journal_mode = OFF;")); // will cause out of memory -// Execute(Db_qry_sql.xtn_("PRAGMA journal_mode = MEMORY;")); - if (pragma_needed) { - Exec_as_obj(Db_qry_sql.xtn_("PRAGMA synchronous = OFF;")); - pragma_needed = false; - } -// Execute(Db_qry_sql.xtn_("PRAGMA temp_store = MEMORY;")); -// Execute(Db_qry_sql.xtn_("PRAGMA locking_mode = EXCLUSIVE;")); -// Execute(Db_qry_sql.xtn_("PRAGMA cache_size=4000;")); // too many will also cause out of memory - Exec_as_obj(Db_qry_sql.xtn_("BEGIN TRANSACTION;")); - } - public static final Sqlite_engine _ = new Sqlite_engine(); Sqlite_engine() {} + public static final Sqlite_engine _ = new Sqlite_engine(); } class Db_rdr__sqlite extends Db_rdr__basic { @Override public byte Read_byte(int i) {try {return (byte)rdr.getInt(i + 1);} catch (Exception e) {throw Err_.new_("read failed: i={0} type={1} err={2}", i, Byte_.Cls_val_name, Err_.Message_lang(e));}} @Override public byte Read_byte(String k) {try {return (byte)Int_.cast_(rdr.getObject(k));} catch (Exception e) {throw Err_.new_("read failed: k={0} type={1} err={2}", k, Byte_.Cls_val_name, Err_.Message_lang(e));}} diff --git a/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_engine_.java b/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_engine_.java index 856719eb2..0b5195ca7 100644 --- a/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_engine_.java +++ b/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_engine_.java @@ -55,7 +55,6 @@ public class Sqlite_engine_ { p.Exec_qry(qry); } public static void Idx_create(Gfo_usr_dlg usr_dlg, Db_conn conn, String tbl, Db_meta_idx[] idx_ary) { - conn.Txn_mgr().Txn_end_all(); // commit any pending transactions int len = idx_ary.length; for (int i = 0; i < len; ++i) { Db_meta_idx idx = idx_ary[i]; @@ -68,7 +67,6 @@ public class Sqlite_engine_ { public static void Idx_create(Db_conn p, Db_idx_itm... idxs) {Idx_create(Gfo_usr_dlg_.Null, p, "", idxs);} public static void Idx_create(Gfo_usr_dlg usr_dlg, Db_conn p, String file_id, Db_idx_itm... idxs) { int len = idxs.length; - p.Txn_mgr().Txn_end_all(); // commit any pending transactions for (int i = 0; i < len; i++) { String index = idxs[i].Xto_sql(); usr_dlg.Plog_many("", "", "creating index: ~{0} ~{1}", file_id, index); @@ -79,7 +77,7 @@ public class Sqlite_engine_ { public static Db_conn Conn_load_or_make_(Io_url url, Bool_obj_ref created) { boolean exists = Io_mgr._.ExistsFil(url); created.Val_(!exists); - Db_url connect = exists ? Sqlite_url.load_(url) : Sqlite_url.make_(url); + Db_conn_info connect = exists ? Sqlite_conn_info.load_(url) : Sqlite_conn_info.make_(url); Db_conn p = Db_conn_pool.I.Get_or_new(connect); if (!exists) Pragma_page_size(p, 4096); diff --git a/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_txn_mgr.java b/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_txn_mgr.java new file mode 100644 index 000000000..0f75d15d6 --- /dev/null +++ b/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_txn_mgr.java @@ -0,0 +1,70 @@ +/* +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 . +*/ +package gplx.dbs.engines.sqlite; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; +import gplx.dbs.qrys.*; +public class Sqlite_txn_mgr { + private final ListAdp txn_list = ListAdp_.new_(); + public Sqlite_txn_mgr(Db_engine engine) {this.engine = engine;} private final Db_engine engine; + private boolean pragma_needed = Bool_.Y, txn_started = Bool_.N; // NOTE: txns only support 1 level; SQLite fails when nesting transactions; DATE:2015-03-11 + public void Txn_bgn(String name) { + if (String_.Len_eq_0(name)) name = "unnamed"; + if (pragma_needed) { + pragma_needed = false; + engine.Exec_as_obj(Db_qry_sql.xtn_("PRAGMA synchronous = OFF;")); + } +// Execute(Db_qry_sql.xtn_("PRAGMA ENCODING=\"UTF-8\";")); +// Execute(Db_qry_sql.xtn_("PRAGMA journal_mode = OFF;")); // will cause out of memory +// Execute(Db_qry_sql.xtn_("PRAGMA journal_mode = MEMORY;")); +// Execute(Db_qry_sql.xtn_("PRAGMA temp_store = MEMORY;")); +// Execute(Db_qry_sql.xtn_("PRAGMA locking_mode = EXCLUSIVE;")); +// Execute(Db_qry_sql.xtn_("PRAGMA cache_size=4000;")); // too many will also cause out of memory + if (txn_started) { + engine.Exec_as_obj(Db_qry_sql.xtn_(String_.Format("SAVEPOINT {0};", name))); + } + else { + txn_started = true; + engine.Exec_as_obj(Db_qry_sql.xtn_("BEGIN TRANSACTION;")); + } + txn_list.Add(name); + } + public void Txn_end() { + if (txn_list.Count() == 0) {Gfo_usr_dlg_.I.Warn_many("", "", "no txns in stack;"); return;} + String txn_last = (String)txn_list.PopLast(); + if (txn_list.Count() == 0) {// no txns left; commit it + engine.Exec_as_obj(Db_qry_sql.xtn_("COMMIT TRANSACTION;")); + txn_started = false; + } + else + engine.Exec_as_obj(Db_qry_sql.xtn_(String_.Format("RELEASE SAVEPOINT {0};", txn_last))); + } + public void Txn_cxl() { + if (txn_list.Count() == 0) {Gfo_usr_dlg_.I.Warn_many("", "", "no txns in stack;"); return;} + String txn_last = (String)txn_list.PopLast(); + if (txn_list.Count() == 0) {// no txns left; rollback + engine.Exec_as_obj(Db_qry_sql.xtn_("ROLLBACK TRANSACTION;")); + txn_started = false; + } + else + engine.Exec_as_obj(Db_qry_sql.xtn_(String_.Format("ROLBACK TRANSACTION TO SAVEPOINT {0};", txn_last))); + } + public void Txn_sav() { + if (txn_list.Count() == 0) {Gfo_usr_dlg_.I.Warn_many("", "", "no txns in stack;"); return;} + String name = (String)txn_list.FetchAt(txn_list.Count() - 1); + this.Txn_end(); this.Txn_bgn(name); + } +} diff --git a/140_dbs/src/gplx/dbs/engines/tdbs/TdbConnectInfo_tst.java b/140_dbs/src/gplx/dbs/engines/tdbs/TdbConnectInfo_tst.java index 0da565272..cd17b6da0 100644 --- a/140_dbs/src/gplx/dbs/engines/tdbs/TdbConnectInfo_tst.java +++ b/140_dbs/src/gplx/dbs/engines/tdbs/TdbConnectInfo_tst.java @@ -19,14 +19,14 @@ package gplx.dbs.engines.tdbs; import gplx.*; import gplx.dbs.*; import gplx.dbs import org.junit.*; public class TdbConnectInfo_tst { @Test public void Full() { - Db_url connectInfo = Db_url_.parse_("gplx_key=tdb;url=C:\\dir\\xmpl.tdb;format=dsv;"); + Db_conn_info connectInfo = Db_conn_info_.parse_("gplx_key=tdb;url=C:\\dir\\xmpl.tdb;format=dsv;"); tst_Parse(connectInfo, Io_url_.new_any_("C:\\dir\\xmpl.tdb"), "dsv"); } @Test public void DefaultFormat() { - Db_url connectInfo = Db_url_.parse_("gplx_key=tdb;url=C:\\dir\\xmpl.tdb"); // dsv Format inferred + Db_conn_info connectInfo = Db_conn_info_.parse_("gplx_key=tdb;url=C:\\dir\\xmpl.tdb"); // dsv Format inferred tst_Parse(connectInfo, Io_url_.new_any_("C:\\dir\\xmpl.tdb"), "dsv"); } - void tst_Parse(Db_url connectInfo, Io_url url, String format) { - Tfds.Eq(((Tdb_url)connectInfo).Url(), url); + void tst_Parse(Db_conn_info connectInfo, Io_url url, String format) { + Tfds.Eq(((Tdb_conn_info)connectInfo).Url(), url); } } diff --git a/140_dbs/src/gplx/dbs/engines/tdbs/TdbDatabase.java b/140_dbs/src/gplx/dbs/engines/tdbs/TdbDatabase.java index 65fd0f33d..ec431470c 100644 --- a/140_dbs/src/gplx/dbs/engines/tdbs/TdbDatabase.java +++ b/140_dbs/src/gplx/dbs/engines/tdbs/TdbDatabase.java @@ -43,5 +43,5 @@ public class TdbDatabase { } int FileId_next = TdbFile.MainFileId + 1; int TableId_next = 1; -// public static Io_url UrlOf(Db_url url) {return Io_url_.new_any_(url.ServerName());} +// public static Io_url UrlOf(Db_conn_info url) {return Io_url_.new_any_(url.ServerName());} } diff --git a/140_dbs/src/gplx/dbs/engines/tdbs/TdbEngine.java b/140_dbs/src/gplx/dbs/engines/tdbs/TdbEngine.java index 1219245a6..bd16f0dda 100644 --- a/140_dbs/src/gplx/dbs/engines/tdbs/TdbEngine.java +++ b/140_dbs/src/gplx/dbs/engines/tdbs/TdbEngine.java @@ -18,20 +18,22 @@ along with this program. If not, see . package gplx.dbs.engines.tdbs; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; import gplx.dbs.qrys.*; import gplx.dbs.sqls.*; public class TdbEngine implements Db_engine { - public String Tid() {return Tdb_url.Tid_const;} - public Db_url Url() {return url;} private Db_url url; + public String Tid() {return Tdb_conn_info.Tid_const;} + public Db_conn_info Conn_info() {return conn_info;} private Db_conn_info conn_info; public TdbDatabase Db() {return db;} TdbDatabase db; public void Conn_open() { - Tdb_url tdb_url = (Tdb_url)url; + Tdb_conn_info tdb_url = (Tdb_conn_info)conn_info; String url_str = tdb_url.Server(); db = loadMgr.LoadTbls(Io_url_.new_any_(url_str)); } public void Conn_term() {} - public void Txn_bgn() {} - public void Txn_end() {} - public Db_engine New_clone(Db_url url) { + public void Txn_bgn(String name) {} + public void Txn_end() {} + public void Txn_cxl() {} + public void Txn_sav() {} + public Db_engine New_clone(Db_conn_info conn_info) { TdbEngine rv = new TdbEngine(); - rv.CtorTdbEngine(url); + rv.CtorTdbEngine(conn_info); rv.Conn_open(); return rv; } @@ -41,7 +43,8 @@ public class TdbEngine implements Db_engine { } public Db_stmt New_stmt_prep(Db_qry qry) {return new Db_stmt_sql().Parse(qry, Sql_qry_wtr_.I.Xto_str(qry, true));} public Object New_stmt_prep_as_obj(String sql) {throw Err_.not_implemented_();} - public Db_rdr New_rdr_by_obj(Object o, String sql) {return Db_rdr_.Null;} + public Db_rdr New_rdr__rls_manual(Object rdr_obj, String sql) {return Db_rdr_.Empty;} + public Db_rdr New_rdr__rls_auto(Db_stmt stmt, Object rdr_obj, String sql) {return Db_rdr_.Empty;} public DataRdr New_rdr(java.sql.ResultSet rdr, String sql) {return DataRdr_.Null;} public TdbTable FetchTbl(String name) { TdbTable tbl = db.Tables().FetchOrFail(name); @@ -54,16 +57,17 @@ public class TdbEngine implements Db_engine { public void FlushTbl(TdbTable tbl) { saveMgr.SaveFile(db, tbl.File()); } - public void Exec_ddl_create_tbl(Db_meta_tbl meta) {throw Err_.not_implemented_();} - public void Exec_ddl_create_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... ary) {throw Err_.not_implemented_();} - public void Exec_ddl_append_fld(String tbl, Db_meta_fld fld) {throw Err_.not_implemented_();} - public void Exec_env_db_attach(String alias, Io_url db_url) {} - public void Exec_env_db_detach(String alias) {} + public void Ddl_create_tbl(Db_meta_tbl meta) {throw Err_.not_implemented_();} + public void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... ary) {throw Err_.not_implemented_();} + public void Ddl_append_fld(String tbl, Db_meta_fld fld) {throw Err_.not_implemented_();} + public void Ddl_delete_tbl(String tbl) {} + public void Env_db_attach(String alias, Io_url db_url) {} + public void Env_db_detach(String alias) {} HashAdp wkrs = HashAdp_.new_(); TdbDbLoadMgr loadMgr = TdbDbLoadMgr.new_(); TdbDbSaveMgr saveMgr = TdbDbSaveMgr.new_(); public static final TdbEngine _ = new TdbEngine(); - void CtorTdbEngine(Db_url url) { - this.url = url; + void CtorTdbEngine(Db_conn_info conn_info) { + this.conn_info = conn_info; wkrs.Add(Db_qry_.Tid_select, TdbSelectWkr._); wkrs.Add(Db_qry_.Tid_insert, TdbInsertWkr.new_()); wkrs.Add(Db_qry_.Tid_update, TdbUpdateWkr.new_()); diff --git a/140_dbs/src/gplx/dbs/engines/tdbs/TdbFlush_tst.java b/140_dbs/src/gplx/dbs/engines/tdbs/TdbFlush_tst.java index ce40d35ec..e87797b80 100644 --- a/140_dbs/src/gplx/dbs/engines/tdbs/TdbFlush_tst.java +++ b/140_dbs/src/gplx/dbs/engines/tdbs/TdbFlush_tst.java @@ -81,7 +81,7 @@ public class TdbFlush_tst { } class TdbEngineFxt { public TdbEngine run_MakeEngine(Io_url url) { - Db_url connectInfo = Db_url_.tdb_(url); + Db_conn_info connectInfo = Db_conn_info_.tdb_(url); TdbEngine engine = (TdbEngine)TdbEngine._.New_clone(connectInfo); engine.Conn_open(); return engine; diff --git a/140_dbs/src/gplx/dbs/engines/tdbs/Tdb_url.java b/140_dbs/src/gplx/dbs/engines/tdbs/Tdb_conn_info.java similarity index 76% rename from 140_dbs/src/gplx/dbs/engines/tdbs/Tdb_url.java rename to 140_dbs/src/gplx/dbs/engines/tdbs/Tdb_conn_info.java index 3e5b61187..4736ae7a8 100644 --- a/140_dbs/src/gplx/dbs/engines/tdbs/Tdb_url.java +++ b/140_dbs/src/gplx/dbs/engines/tdbs/Tdb_conn_info.java @@ -16,22 +16,22 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.dbs.engines.tdbs; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; -public class Tdb_url extends Db_url__base { +public class Tdb_conn_info extends Db_conn_info__base { public Io_url Url() {return url;} Io_url url; @Override public String Tid() {return Tid_const;} public static final String Tid_const = "tdb"; - public static Db_url new_(Io_url url) { - return Db_url_.parse_(Bld_raw + public static Db_conn_info new_(Io_url url) { + return Db_conn_info_.parse_(Bld_raw ( "gplx_key", Tid_const , "url", url.Raw() )); - } Tdb_url() {} - @Override public Db_url New_self(String raw, GfoMsg m) { - Tdb_url rv = new Tdb_url(); + } Tdb_conn_info() {} + @Override public Db_conn_info New_self(String raw, GfoMsg m) { + Tdb_conn_info rv = new Tdb_conn_info(); String urlStr = m.ReadStr("url"); Io_url url = Io_url_.new_any_(urlStr); rv.Ctor(urlStr, url.NameOnly(), raw, BldApi(m)); rv.url = url; return rv; } - public static final Tdb_url _ = new Tdb_url(); + public static final Tdb_conn_info _ = new Tdb_conn_info(); } diff --git a/140_dbs/src/gplx/dbs/qrys/Db_stmt_cmd.java b/140_dbs/src/gplx/dbs/qrys/Db_stmt_cmd.java index 0afc4c9b9..eedeb36f9 100644 --- a/140_dbs/src/gplx/dbs/qrys/Db_stmt_cmd.java +++ b/140_dbs/src/gplx/dbs/qrys/Db_stmt_cmd.java @@ -114,7 +114,7 @@ public class Db_stmt_cmd implements Db_stmt { catch (Exception e) { this.Rls(); Reset_stmt(); - throw Err_.err_(e, "db_stmt.insert: sql={0} err={1}", sql, Err_.Message_gplx_brief(e)); + throw Err_.err_(e, "db_stmt.insert: url={0} sql={1} err={2}", engine.Conn_info(), sql, Err_.Message_gplx_brief(e)); } } public int Exec_update() { @@ -135,9 +135,12 @@ public class Db_stmt_cmd implements Db_stmt { } public DataRdr Exec_select() { try {DataRdr rv = engine.New_rdr(stmt.executeQuery(), sql); return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql);} - } - public Db_rdr Exec_select_as_rdr() { - try {return engine.New_rdr_by_obj(stmt.executeQuery(), sql);} catch (Exception e) {throw Err_.err_(e, "select failed: sql={0}", sql);} + } + public Db_rdr Exec_select__rls_auto() { + try {return engine.New_rdr__rls_auto(this, stmt.executeQuery(), sql);} catch (Exception e) {throw Err_.err_(e, "select failed: sql={0}", sql);} + } + public Db_rdr Exec_select__rls_manual() { + try {return engine.New_rdr__rls_manual(stmt.executeQuery(), sql);} catch (Exception e) {throw Err_.err_(e, "select failed: sql={0}", sql);} } public Object Exec_select_val() { try {Object rv = Db_qry__select_cmd.Rdr_to_val(engine.New_rdr(stmt.executeQuery(), sql)); return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql);} @@ -153,6 +156,7 @@ public class Db_stmt_cmd implements Db_stmt { try { if (stmt.getConnection().isClosed()) return; // do not close stmt if connection is already closed; throws null error; DATE:2015-02-11 stmt.close(); + stmt = null; } catch (Exception e) {throw Err_.err_(e, "failed to close command: {0}", sql);} } diff --git a/140_dbs/src/gplx/dbs/qrys/Db_stmt_sql.java b/140_dbs/src/gplx/dbs/qrys/Db_stmt_sql.java index bff727afa..af9bd596d 100644 --- a/140_dbs/src/gplx/dbs/qrys/Db_stmt_sql.java +++ b/140_dbs/src/gplx/dbs/qrys/Db_stmt_sql.java @@ -112,7 +112,8 @@ public class Db_stmt_sql implements Db_stmt {// used for formatting SQL statemen public DataRdr Exec_select() { try {DataRdr rv = conn.Exec_qry_as_rdr(Db_qry_sql.rdr_(this.Xto_sql())); return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql_orig);} } - public Db_rdr Exec_select_as_rdr() {throw Err_.not_implemented_();} + public Db_rdr Exec_select__rls_auto() {return Db_rdr_.Empty;} + public Db_rdr Exec_select__rls_manual() {return Db_rdr_.Empty;} public Object Exec_select_val() { try {Object rv = Db_qry__select_cmd.Rdr_to_val(this.Exec_select()); return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql_orig);} } diff --git a/140_dbs/src/gplx/dbs/sqls/Db_sqlbldr__sqlite.java b/140_dbs/src/gplx/dbs/sqls/Db_sqlbldr__sqlite.java index eb6e210b2..12a157b9e 100644 --- a/140_dbs/src/gplx/dbs/sqls/Db_sqlbldr__sqlite.java +++ b/140_dbs/src/gplx/dbs/sqls/Db_sqlbldr__sqlite.java @@ -58,6 +58,9 @@ public class Db_sqlbldr__sqlite implements Db_sqlbldr { tmp_bfr.Add_byte_semic(); return tmp_bfr.Xto_str_and_clear(); } + public String Bld_drop_tbl(String tbl) { + return String_.Format("DROP TABLE IF EXISTS {0};", tbl); + } private void Bld_fld(Bry_bfr tmp_bfr, Db_meta_fld fld) { tmp_bfr.Add_str_ascii(fld.Name()).Add_byte_space(); Tid_to_sql(tmp_bfr, fld.Tid(), fld.Len()); tmp_bfr.Add_byte_space(); @@ -74,7 +77,7 @@ public class Db_sqlbldr__sqlite implements Db_sqlbldr { tmp_bfr.Add_byte_space(); } if (fld.Primary()) tmp_bfr.Add_str_ascii("PRIMARY KEY "); - if (fld.Autoincrement()) tmp_bfr.Add_str_ascii("AUTOINCREMENT "); + if (fld.Autonum()) tmp_bfr.Add_str_ascii("AUTOINCREMENT "); tmp_bfr.Del_by_1(); // remove trailing space } public static void Tid_to_sql(Bry_bfr tmp_bfr, int tid, int len) {// REF: https://www.sqlite.org/datatype3.html diff --git a/140_dbs/src/gplx/dbs/utls/Db_in_wkr__base.java b/140_dbs/src/gplx/dbs/utls/Db_in_wkr__base.java index 73cf150f7..a90d6a57d 100644 --- a/140_dbs/src/gplx/dbs/utls/Db_in_wkr__base.java +++ b/140_dbs/src/gplx/dbs/utls/Db_in_wkr__base.java @@ -17,21 +17,25 @@ along with this program. If not, see . */ package gplx.dbs.utls; import gplx.*; import gplx.dbs.*; public abstract class Db_in_wkr__base { - protected abstract int Interval(); - protected abstract Db_qry Make_qry (Object db_ctx, int bgn, int end); + @gplx.Virtual protected int Interval() {return gplx.dbs.engines.sqlite.Sqlite_engine_.Stmt_arg_max - 10;} // -10 for safety's sake + protected abstract Db_qry Make_qry (int bgn, int end); protected abstract void Fill_stmt (Db_stmt stmt, int bgn, int end); - protected abstract void Read_data (Cancelable cancelable, Object db_ctx, Db_rdr rdr); - public void Select_in(Cancelable cancelable, Object db_ctx, Db_conn conn, int full_bgn, int full_end) { - Db_rdr rdr = Db_rdr_.Null; Db_stmt stmt = Db_stmt_.Null; + protected abstract void Read_data (Cancelable cancelable, Db_rdr rdr); + @gplx.Virtual protected boolean Show_progress() {return false;} + public void Select_in(Cancelable cancelable, Db_conn conn, int full_bgn, int full_end) { int part_len = Interval(); + Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_.I; + boolean show_progress = this.Show_progress(); for (int part_bgn = full_bgn; part_bgn < full_end; part_bgn += part_len) { int part_end = part_bgn + part_len; if (part_end > full_end) part_end = full_end; + Db_stmt stmt = Db_stmt_.Null; Db_rdr rdr = Db_rdr_.Empty; try { - stmt = conn.Stmt_new(Make_qry(db_ctx, part_bgn, part_end)); + if (show_progress) usr_dlg.Prog_many("", "", "reading: count=~{0}", part_end); + stmt = conn.Stmt_new(Make_qry(part_bgn, part_end)); Fill_stmt(stmt, part_bgn, part_end); - rdr = stmt.Exec_select_as_rdr(); - Read_data(cancelable, db_ctx, rdr); + rdr = stmt.Exec_select__rls_manual(); + Read_data(cancelable, rdr); } finally {rdr.Rls(); stmt.Rls();} } diff --git a/140_dbs/src/gplx/dbs/utls/Db_sys_id_mgr.java b/140_dbs/src/gplx/dbs/utls/Db_sys_id_mgr.java deleted file mode 100644 index 8abab286f..000000000 --- a/140_dbs/src/gplx/dbs/utls/Db_sys_id_mgr.java +++ /dev/null @@ -1,26 +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 . -*/ -package gplx.dbs.utls; import gplx.*; import gplx.dbs.*; -import gplx.core.primitives.*; -class Db_sys_id_mgr { - private Db_sys_regy_mgr db_regy; - public Db_sys_id_mgr(Db_sys_regy_mgr db_regy) {this.db_regy = db_regy;} - public int Get_next(String key) {return db_regy.Get_val_as_int_or(Grp_key, key, 1);} - public void Set_next(String key, int v) {db_regy.Set(Grp_key, key, Int_.Xto_str(v));} - private static final String Grp_key = "gplx.next_id"; -} diff --git a/140_dbs/src/gplx/dbs/utls/Db_sys_regy_mgr.java b/140_dbs/src/gplx/dbs/utls/Db_sys_regy_mgr.java deleted file mode 100644 index c281d2c45..000000000 --- a/140_dbs/src/gplx/dbs/utls/Db_sys_regy_mgr.java +++ /dev/null @@ -1,47 +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 . -*/ -package gplx.dbs.utls; import gplx.*; import gplx.dbs.*; -class Db_sys_regy_mgr { - private Db_sys_regy_tbl tbl; - public Db_sys_regy_mgr(Db_url url, String name, boolean create) { - tbl = new Db_sys_regy_tbl(url, name); - if (create) tbl.Create_table(); - } - public void Set(String grp, String key, String val) { - if (tbl.Select_val_or(grp, key, null) == null) - tbl.Insert(grp, key, val); - else - tbl.Update(grp, key, val); - } - public void Del(String grp, String key) { - tbl.Delete(grp, key); - } - public String Get_val_as_str_or(String grp, String key, String or) { - return tbl.Select_val_or(grp, key, or); - } - public int Get_val_as_int_or(String grp, String key, int or) { - String rv = tbl.Select_val_or(grp, key, null); - return rv == null ? or : Int_.parse_or_(rv, or); - } -} -class Db_sys_regy_itm { - public Db_sys_regy_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;} private final String val; -} diff --git a/140_dbs/src/gplx/dbs/utls/Db_sys_regy_mgr_tst.java b/140_dbs/src/gplx/dbs/utls/Db_sys_regy_mgr_tst.java deleted file mode 100644 index fa0d9f899..000000000 --- a/140_dbs/src/gplx/dbs/utls/Db_sys_regy_mgr_tst.java +++ /dev/null @@ -1,54 +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 . -*/ -package gplx.dbs.utls; import gplx.*; import gplx.dbs.*; -import org.junit.*; -public class Db_sys_regy_mgr_tst { - @Before public void init() {fxt.Init();} private Db_sys_regy_mgr_fxt fxt = new Db_sys_regy_mgr_fxt(); - @Test public void Insert() { - fxt .Exec_set("grp", "key", "val_0") - .Test_get("grp", "key", "val_0"); - } - @Test public void Update() { - fxt .Exec_set("grp", "key", "val_0") - .Exec_set("grp", "key", "val_1") - .Test_get("grp", "key", "val_1"); - } - @Test public void Delete() { - fxt .Exec_set("grp", "key_0", "val_0") - .Exec_set("grp", "key_1", "val_1") - .Exec_del("grp", "key_1") - .Test_get("grp", "key_0", "val_0") - .Test_get("grp", "key_1", null) - ; - } -} -class Db_sys_regy_mgr_fxt { - private Db_sys_regy_mgr sys_regy_mgr; - public void Init() { - if (sys_regy_mgr == null) { - Db_conn_pool.I.Get_or_new__mem("test_db"); - sys_regy_mgr = new Db_sys_regy_mgr(Db_url_.mem_("test_db"), "test_regy", true); - } - } - public Db_sys_regy_mgr_fxt Exec_set(String grp, String key, String val) {sys_regy_mgr.Set(grp, key, val); return this;} - public Db_sys_regy_mgr_fxt Exec_del(String grp, String key) {sys_regy_mgr.Del(grp, key); return this;} - public Db_sys_regy_mgr_fxt Test_get(String grp, String key, String expd_val) { - Tfds.Eq(expd_val, sys_regy_mgr.Get_val_as_str_or(grp, key, null)); - return this; - } -} diff --git a/140_dbs/src/gplx/dbs/utls/Db_sys_regy_tbl.java b/140_dbs/src/gplx/dbs/utls/Db_sys_regy_tbl.java deleted file mode 100644 index bca97e0b0..000000000 --- a/140_dbs/src/gplx/dbs/utls/Db_sys_regy_tbl.java +++ /dev/null @@ -1,60 +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 . -*/ -package gplx.dbs.utls; import gplx.*; import gplx.dbs.*; -class Db_sys_regy_tbl { - private final String tbl_name; - private static final Db_meta_fld_list Flds = Db_meta_fld_list.new_(); - private static final String - Fld_regy_grp = Flds.Add_str("regy_grp", 1024) - , Fld_regy_key = Flds.Add_str("regy_key", 1024) - , Fld_regy_val = Flds.Add_str("regy_val", 4096) - ; - public static Db_meta_tbl new_meta(String tbl) { - return Db_meta_tbl.new_(tbl, Flds.To_fld_ary() - , Db_meta_idx.new_unique_by_tbl(tbl, "key", Flds.To_str_ary()) - ); - } - private Db_meta_tbl meta; - private Db_conn conn; - public Db_sys_regy_tbl(Db_url url, String tbl_name) { - this.tbl_name = tbl_name; - this.meta = Db_sys_regy_tbl.new_meta(tbl_name); - this.conn = Db_conn_pool.I.Get_or_new(url); - } - public void Create_table() {conn.Exec_create_tbl_and_idx(meta);} - public void Insert(String grp, String key, String val) { - Db_stmt stmt = conn.Stmt_insert(tbl_name, Flds.To_str_ary()); - stmt.Clear().Val_str(grp).Val_str(key).Val_str(val).Exec_insert(); - } - public void Update(String grp, String key, String val) { - Db_stmt stmt = conn.Stmt_update(tbl_name, String_.Ary(Fld_regy_grp, Fld_regy_key), Fld_regy_val); - stmt.Clear().Val_str(val).Crt_str(Fld_regy_grp, grp).Crt_str(Fld_regy_key, key).Exec_update(); - } - public void Delete(String grp, String key) { - Db_stmt stmt = conn.Stmt_delete(tbl_name, Fld_regy_grp, Fld_regy_key); - stmt.Clear().Crt_str(Fld_regy_grp, grp).Crt_str(Fld_regy_key, key).Exec_delete(); - } - public String Select_val_or(String grp, String key, String or) { - Db_stmt stmt = conn.Stmt_select(tbl_name, Flds.To_str_ary(), Fld_regy_grp, Fld_regy_key); - Db_rdr rdr = Db_rdr_.Null; - try { - rdr = stmt.Clear().Crt_str(Fld_regy_grp, grp).Crt_str(Fld_regy_key, key).Exec_select_as_rdr(); - return rdr.Move_next() ? rdr.Read_str(Fld_regy_val) : or; - } finally {rdr.Rls();} - } -} diff --git a/140_dbs/src/gplx/dbs/utls/PoolIds_tst.java b/140_dbs/src/gplx/dbs/utls/PoolIds_tst.java index a1e7565f6..cda26cb12 100644 --- a/140_dbs/src/gplx/dbs/utls/PoolIds_tst.java +++ b/140_dbs/src/gplx/dbs/utls/PoolIds_tst.java @@ -19,7 +19,7 @@ package gplx.dbs.utls; import gplx.*; import gplx.dbs.*; import org.junit.*; public class PoolIds_tst { @Before public void setup() { - conn = Db_conn_pool.I.Get_or_new(Db_url_.Test); + conn = Db_conn_pool.I.Get_or_new(Db_conn_info_.Test); Db_qry_fxt.DeleteAll(conn, PoolIds.Tbl_Name); mgr = PoolIds._; } diff --git a/140_dbs/src/gplx/stores/DbMaprMgr_tst.java b/140_dbs/src/gplx/stores/DbMaprMgr_tst.java index c987bb6de..746cdde81 100644 --- a/140_dbs/src/gplx/stores/DbMaprMgr_tst.java +++ b/140_dbs/src/gplx/stores/DbMaprMgr_tst.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.stores; import gplx.*; import org.junit.*; -import gplx.dbs.*; /*Db_url*/ +import gplx.dbs.*; /*Db_conn_info*/ public class DbMaprMgr_tst { @Before public void setup() { mgr = DbMaprMgr.new_().RootIndexFlds_(DbMaprArg.new_("id", "disc_id")) @@ -37,9 +37,9 @@ public class DbMaprMgr_tst { . Flds_add(MockStream.id_idk, "stream_id").Flds_add(MockStream.name_idk, "stream_name") . ConstantFlds_add("stream_type", 1) ))); - wtr = DbMaprWtr.new_by_url_(Db_url_.Test); + wtr = DbMaprWtr.new_by_url_(Db_conn_info_.Test); wtr.EnvVars().Add(DbMaprWtr.Key_Mgr, mgr); - conn = Db_conn_pool.I.Get_or_new(Db_url_.Test); + conn = Db_conn_pool.I.Get_or_new(Db_conn_info_.Test); Db_qry_fxt.DeleteAll(conn, "mock_discs", "mock_titles", "mock_chapters", "mock_streams"); } DbMaprMgr mgr; DbMaprWtr wtr; Db_conn conn; MockDisc disc; MockTitle title; MockChapter chapter; MockStream audio, subtitle; SrlMgr rdr; @Test public void PurgeObjTree() { @@ -133,7 +133,7 @@ public class DbMaprMgr_tst { Tfds.Eq("subtitle1", ((MockStream)t.Subtitles().FetchAt(0)).Name()); } DbMaprRdr rdr_() { - DbMaprRdr rv = DbMaprRdr.new_(Db_url_.Test, Db_crt_.eq_("disc_id", 1)); + DbMaprRdr rv = DbMaprRdr.new_(Db_conn_info_.Test, Db_crt_.eq_("disc_id", 1)); rv.EnvVars().Add(DbMaprWtr.Key_Mgr, mgr); return rv; } diff --git a/140_dbs/src/gplx/stores/DbMaprRdr.java b/140_dbs/src/gplx/stores/DbMaprRdr.java index 84e0621c0..53a7b6013 100644 --- a/140_dbs/src/gplx/stores/DbMaprRdr.java +++ b/140_dbs/src/gplx/stores/DbMaprRdr.java @@ -114,7 +114,7 @@ public class DbMaprRdr extends DataRdr_base implements SrlMgr { HashAdp tables = HashAdp_.new_(); Db_conn conn; Criteria rootCrt; DbMaprMgr mgr; ListAdp rowStack = ListAdp_.new_(); - public static DbMaprRdr new_(Db_url dbInfo, Criteria rootCrt) { + public static DbMaprRdr new_(Db_conn_info dbInfo, Criteria rootCrt) { DbMaprRdr rv = new DbMaprRdr(); rv.conn = Db_conn_pool.I.Get_or_new(dbInfo); rv.rootCrt = rootCrt; return rv; diff --git a/140_dbs/src/gplx/stores/DbMaprWtr.java b/140_dbs/src/gplx/stores/DbMaprWtr.java index 2899f59f8..5e1ada2b1 100644 --- a/140_dbs/src/gplx/stores/DbMaprWtr.java +++ b/140_dbs/src/gplx/stores/DbMaprWtr.java @@ -84,7 +84,7 @@ public class DbMaprWtr extends DataWtr_base implements DataWtr { public String XtoStr() {return "";} @Override public SrlMgr SrlMgr_new(Object o) {return new DbMaprWtr();} DbMaprMgr mgr; Db_conn conn; String curTableName; Db_qry_insert insertCmd; - public static DbMaprWtr new_by_url_(Db_url url) { + public static DbMaprWtr new_by_url_(Db_conn_info url) { DbMaprWtr rv = new DbMaprWtr(); rv.conn = Db_conn_pool.I.Get_or_new(url); return rv; diff --git a/140_dbs/tst/gplx/dbs/Db_conn_fxt.java b/140_dbs/tst/gplx/dbs/Db_conn_fxt.java index f9273c491..82b212817 100644 --- a/140_dbs/tst/gplx/dbs/Db_conn_fxt.java +++ b/140_dbs/tst/gplx/dbs/Db_conn_fxt.java @@ -44,11 +44,11 @@ public class Db_conn_fxt implements RlsAble { Tfds.Eq_ary(actlValAry, expdValAry); return record; } - public void Rls() {conn.Conn_term();} + public void Rls() {conn.Rls_conn();} - public static Db_conn Mysql() {return Db_conn_pool.I.Get_or_new(Mysql_url.new_("127.0.0.1", "unit_tests", "gplx_user", "gplx_password"));} - public static Db_conn Tdb(String fileName) {return Db_conn_pool.I.Get_or_new(Db_url_.tdb_(Tfds.RscDir.GenSubDir_nest("140_dbs", "tdbs").GenSubFil(fileName)));} - public static Db_conn Postgres() {return Db_conn_pool.I.Get_or_new(Postgres_url.new_("127.0.0.1", "unit_tests", "gplx_user", "gplx_password"));} - public static Db_conn Sqlite() {return Db_conn_pool.I.Get_or_new(Sqlite_url.load_(Tfds.RscDir.GenSubFil_nest("140_dbs", "sqlite", "unit_tests.db")));} + public static Db_conn Mysql() {return Db_conn_pool.I.Get_or_new(Mysql_conn_info.new_("127.0.0.1", "unit_tests", "gplx_user", "gplx_password"));} + public static Db_conn Tdb(String fileName) {return Db_conn_pool.I.Get_or_new(Db_conn_info_.tdb_(Tfds.RscDir.GenSubDir_nest("140_dbs", "tdbs").GenSubFil(fileName)));} + public static Db_conn Postgres() {return Db_conn_pool.I.Get_or_new(Postgres_conn_info.new_("127.0.0.1", "unit_tests", "gplx_user", "gplx_password"));} + public static Db_conn Sqlite() {return Db_conn_pool.I.Get_or_new(Sqlite_conn_info.load_(Tfds.RscDir.GenSubFil_nest("140_dbs", "sqlite", "unit_tests.db")));} public static final boolean SkipPostgres = Tfds.SkipDb || true; } \ No newline at end of file diff --git a/140_dbs/tst/gplx/dbs/engines/db_DataTypes_tst.java b/140_dbs/tst/gplx/dbs/engines/db_DataTypes_tst.java index ff5917e08..1a5d5f34e 100644 --- a/140_dbs/tst/gplx/dbs/engines/db_DataTypes_tst.java +++ b/140_dbs/tst/gplx/dbs/engines/db_DataTypes_tst.java @@ -51,12 +51,12 @@ INSERT INTO dbs_multiple_data_types VALUES (1, 'John Doe', B'1', '3/30/2006 10:2 class DataTypes_base_fxt { public Db_conn Conn() {return conn;} Db_conn conn; public DataTypes_base_fxt() {} - public void Rls() {conn.Conn_term();} + public void Rls() {conn.Rls_conn();} public String Select_FloatStr() {return select_FloatStr;} public DataTypes_base_fxt Select_FloatStr_(String v) {select_FloatStr = v; return this;} private String select_FloatStr; public void RunAll(Db_conn conn) { this.conn = conn; this.Select_hook(select_FloatStr); - conn.Conn_term(); + conn.Rls_conn(); } public void Select_hook(String floatStr) { DataRdr rdr = Db_qry_.select_tbl_("dbs_multiple_data_types").Exec_qry_as_rdr(conn); diff --git a/140_dbs/tst/gplx/dbs/groupBys/GroupBys_base_tst.java b/140_dbs/tst/gplx/dbs/groupBys/GroupBys_base_tst.java index e02d42d1e..15a61d41c 100644 --- a/140_dbs/tst/gplx/dbs/groupBys/GroupBys_base_tst.java +++ b/140_dbs/tst/gplx/dbs/groupBys/GroupBys_base_tst.java @@ -25,7 +25,7 @@ public abstract class GroupBys_base_tst { Db_qry_.delete_tbl_("dbs_group_bys").Exec_qry(conn); } @After public void teardown() { - conn.Conn_term(); + conn.Rls_conn(); } protected void GroupBy_1fld_hook() { conn.Exec_qry(Db_qry_.insert_("dbs_group_bys").Arg_("key1", "a").Arg_("val_int", 1)); diff --git a/140_dbs/tst/gplx/dbs/insertIntos/InsertIntos_base_tst.java b/140_dbs/tst/gplx/dbs/insertIntos/InsertIntos_base_tst.java index 668e8283c..ff490f313 100644 --- a/140_dbs/tst/gplx/dbs/insertIntos/InsertIntos_base_tst.java +++ b/140_dbs/tst/gplx/dbs/insertIntos/InsertIntos_base_tst.java @@ -26,7 +26,7 @@ public abstract class InsertIntos_base_tst { conn.Exec_qry(Db_qry_delete.new_("dbs_insert_intos")); } @After public void teardown() { - conn.Conn_term(); + conn.Rls_conn(); } protected void Select_hook() { conn.Exec_qry(Db_qry_.insert_("dbs_group_bys").Arg_("key1", "a").Arg_("val_int", 1)); diff --git a/140_dbs/tst/gplx/dbs/joins/Joins_base_tst.java b/140_dbs/tst/gplx/dbs/joins/Joins_base_tst.java index 5d70d56e4..865720827 100644 --- a/140_dbs/tst/gplx/dbs/joins/Joins_base_tst.java +++ b/140_dbs/tst/gplx/dbs/joins/Joins_base_tst.java @@ -25,7 +25,7 @@ public abstract class Joins_base_tst { Db_qry_delete.new_("dbs_join1").Exec_qry(conn); } @After public void teardown() { - conn.Conn_term(); + conn.Rls_conn(); } protected void InnerJoin_hook() { conn.Exec_qry(new Db_qry_insert("dbs_crud_ops").Arg_("id", 0).Arg_("name", "me")); diff --git a/140_dbs/tst/gplx/dbs/orderBys/OrderBys_base_tst.java b/140_dbs/tst/gplx/dbs/orderBys/OrderBys_base_tst.java index 2ef916099..e7848c2f7 100644 --- a/140_dbs/tst/gplx/dbs/orderBys/OrderBys_base_tst.java +++ b/140_dbs/tst/gplx/dbs/orderBys/OrderBys_base_tst.java @@ -23,7 +23,7 @@ public abstract class OrderBys_base_tst { fx.Conn_(conn); Db_qry_delete.new_("dbs_crud_ops").Exec_qry(conn); } protected Db_conn_fxt fx = new Db_conn_fxt(); - @After public void teardown() {conn.Conn_term();} + @After public void teardown() {conn.Rls_conn();} protected abstract Db_conn provider_(); protected Db_conn conn; protected void Basic_hook() { fx.tst_ExecDml(1, new Db_qry_insert("dbs_crud_ops").Arg_("id", 1).Arg_("name", "you")); diff --git a/140_dbs/xtn/gplx/dbs/SqliteDbMain.java b/140_dbs/xtn/gplx/dbs/SqliteDbMain.java index a29dfeb14..4aff926e9 100644 --- a/140_dbs/xtn/gplx/dbs/SqliteDbMain.java +++ b/140_dbs/xtn/gplx/dbs/SqliteDbMain.java @@ -81,7 +81,7 @@ public class SqliteDbMain { } long time_elapsed = (Env_.TickCount() - time_bgn); // provider.Txn_mgr().Txn_end(); - provider.Conn_term(); + provider.Rls_conn(); Tfds.Write(time_elapsed, number / time_elapsed); // 250; 260 Tfds.Write(""); diff --git a/150_gfui/src_700_env/gplx/gfui/Swt_kit.java b/150_gfui/src_700_env/gplx/gfui/Swt_kit.java index 1adacf6f0..9a0030669 100644 --- a/150_gfui/src_700_env/gplx/gfui/Swt_kit.java +++ b/150_gfui/src_700_env/gplx/gfui/Swt_kit.java @@ -194,7 +194,7 @@ public class Swt_kit implements Gfui_kit { return rv; } catch (Exception e) { - Gfo_usr_dlg_._.Warn_many("", "", "error while calculating font height; err=~{0}", Err_.Message_gplx_brief(e)); + Gfo_usr_dlg_.I.Warn_many("", "", "error while calculating font height; err=~{0}", Err_.Message_gplx_brief(e)); return 8; } } diff --git a/400_xowa/src/gplx/core/enums/Gfo_enum_grp.java b/400_xowa/src/gplx/core/enums/Gfo_enum_grp.java index 5215ee5fa..dd23365ca 100644 --- a/400_xowa/src/gplx/core/enums/Gfo_enum_grp.java +++ b/400_xowa/src/gplx/core/enums/Gfo_enum_grp.java @@ -18,10 +18,10 @@ along with this program. If not, see . 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; diff --git a/400_xowa/src/gplx/dbs/Db_attach_cmd.java b/400_xowa/src/gplx/dbs/Db_attach_cmd.java new file mode 100644 index 000000000..a1159c32f --- /dev/null +++ b/400_xowa/src/gplx/dbs/Db_attach_cmd.java @@ -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 . +*/ +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, "", diff_db ? attach_name + "." : ""); // replace 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; +} diff --git a/400_xowa/src/gplx/dbs/Db_attach_rdr.java b/400_xowa/src/gplx/dbs/Db_attach_rdr.java new file mode 100644 index 000000000..6136686ec --- /dev/null +++ b/400_xowa/src/gplx/dbs/Db_attach_rdr.java @@ -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 . +*/ +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); + } +} diff --git a/400_xowa/src/gplx/dbs/cfgs/Db_cfg_grp.java b/400_xowa/src/gplx/dbs/cfgs/Db_cfg_grp.java deleted file mode 100644 index b77f090fe..000000000 --- a/400_xowa/src/gplx/dbs/cfgs/Db_cfg_grp.java +++ /dev/null @@ -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 . -*/ -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; -} diff --git a/400_xowa/src/gplx/dbs/cfgs/Db_cfg_hash.java b/400_xowa/src/gplx/dbs/cfgs/Db_cfg_hash.java new file mode 100644 index 000000000..30fa7bdca --- /dev/null +++ b/400_xowa/src/gplx/dbs/cfgs/Db_cfg_hash.java @@ -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 . +*/ +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); + } +} diff --git a/400_xowa/src/gplx/dbs/cfgs/Db_cfg_itm.java b/400_xowa/src/gplx/dbs/cfgs/Db_cfg_itm.java new file mode 100644 index 000000000..383690090 --- /dev/null +++ b/400_xowa/src/gplx/dbs/cfgs/Db_cfg_itm.java @@ -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 . +*/ +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); +} diff --git a/400_xowa/src/gplx/dbs/cfgs/Db_cfg_tbl.java b/400_xowa/src/gplx/dbs/cfgs/Db_cfg_tbl.java index 54cd7f0ff..ed8428ed2 100644 --- a/400_xowa/src/gplx/dbs/cfgs/Db_cfg_tbl.java +++ b/400_xowa/src/gplx/dbs/cfgs/Db_cfg_tbl.java @@ -16,72 +16,104 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ 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);} } diff --git a/400_xowa/src/gplx/dbs/schemas/Schema_loader_mgr_.java b/400_xowa/src/gplx/dbs/schemas/Schema_loader_mgr_.java index 87698eecd..ef310fee1 100644 --- a/400_xowa/src/gplx/dbs/schemas/Schema_loader_mgr_.java +++ b/400_xowa/src/gplx/dbs/schemas/Schema_loader_mgr_.java @@ -18,31 +18,31 @@ along with this program. If not, see . 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"); } } diff --git a/400_xowa/src/gplx/dbs/schemas/updates/Schema_update_cmd_.java b/400_xowa/src/gplx/dbs/schemas/updates/Schema_update_cmd_.java index c95eed588..f9d85ec4e 100644 --- a/400_xowa/src/gplx/dbs/schemas/updates/Schema_update_cmd_.java +++ b/400_xowa/src/gplx/dbs/schemas/updates/Schema_update_cmd_.java @@ -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; diff --git a/400_xowa/src/gplx/dbs/schemas/updates/Schema_update_mgr.java b/400_xowa/src/gplx/dbs/schemas/updates/Schema_update_mgr.java index b0a974982..7f1999789 100644 --- a/400_xowa/src/gplx/dbs/schemas/updates/Schema_update_mgr.java +++ b/400_xowa/src/gplx/dbs/schemas/updates/Schema_update_mgr.java @@ -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)); } } } diff --git a/400_xowa/src/gplx/dbs/schemas/updates/Schema_update_mgr_tst.java b/400_xowa/src/gplx/dbs/schemas/updates/Schema_update_mgr_tst.java index 397c6f790..11d924185 100644 --- a/400_xowa/src/gplx/dbs/schemas/updates/Schema_update_mgr_tst.java +++ b/400_xowa/src/gplx/dbs/schemas/updates/Schema_update_mgr_tst.java @@ -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()); } } diff --git a/400_xowa/src/gplx/fsdb/Fsdb_db_file.java b/400_xowa/src/gplx/fsdb/Fsdb_db_file.java new file mode 100644 index 000000000..188586bce --- /dev/null +++ b/400_xowa/src/gplx/fsdb/Fsdb_db_file.java @@ -0,0 +1,28 @@ +/* +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 . +*/ +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; +} diff --git a/400_xowa/src/gplx/fsdb/Fsdb_db_mgr.java b/400_xowa/src/gplx/fsdb/Fsdb_db_mgr.java new file mode 100644 index 000000000..e1526c229 --- /dev/null +++ b/400_xowa/src/gplx/fsdb/Fsdb_db_mgr.java @@ -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 . +*/ +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); +} diff --git a/400_xowa/src/gplx/fsdb/Fsdb_db_mgr_.java b/400_xowa/src/gplx/fsdb/Fsdb_db_mgr_.java new file mode 100644 index 000000000..018bc8e67 --- /dev/null +++ b/400_xowa/src/gplx/fsdb/Fsdb_db_mgr_.java @@ -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 . +*/ +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)); + } +} diff --git a/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v1.java b/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v1.java new file mode 100644 index 000000000..165b210ac --- /dev/null +++ b/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v1.java @@ -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 . +*/ +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));} +} diff --git a/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v2.java b/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v2.java new file mode 100644 index 000000000..74f5a19ae --- /dev/null +++ b/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v2.java @@ -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 . +*/ +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"; +} diff --git a/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v2_bldr.java b/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v2_bldr.java new file mode 100644 index 000000000..9a8118e4a --- /dev/null +++ b/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v2_bldr.java @@ -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 . +*/ +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() {} +} diff --git a/400_xowa/src/gplx/fsdb/data/Fsd_bin_tbl.java b/400_xowa/src/gplx/fsdb/data/Fsd_bin_tbl.java index 8c0be927c..0b8655fbd 100644 --- a/400_xowa/src/gplx/fsdb/data/Fsd_bin_tbl.java +++ b/400_xowa/src/gplx/fsdb/data/Fsd_bin_tbl.java @@ -18,76 +18,66 @@ along with this program. If not, see . 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 = ""; } diff --git a/400_xowa/src/gplx/fsdb/data/Fsd_dir_itm.java b/400_xowa/src/gplx/fsdb/data/Fsd_dir_itm.java index 2a65a21e3..e6710246c 100644 --- a/400_xowa/src/gplx/fsdb/data/Fsd_dir_itm.java +++ b/400_xowa/src/gplx/fsdb/data/Fsd_dir_itm.java @@ -17,9 +17,11 @@ along with this program. If not, see . */ 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; } diff --git a/400_xowa/src/gplx/fsdb/data/Fsd_dir_tbl.java b/400_xowa/src/gplx/fsdb/data/Fsd_dir_tbl.java index 60a7cc792..61eda2657 100644 --- a/400_xowa/src/gplx/fsdb/data/Fsd_dir_tbl.java +++ b/400_xowa/src/gplx/fsdb/data/Fsd_dir_tbl.java @@ -17,50 +17,47 @@ along with this program. If not, see . */ 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 diff --git a/400_xowa/src/gplx/fsdb/data/Fsd_fil_itm.java b/400_xowa/src/gplx/fsdb/data/Fsd_fil_itm.java index 18f22ca15..b3f1b465b 100644 --- a/400_xowa/src/gplx/fsdb/data/Fsd_fil_itm.java +++ b/400_xowa/src/gplx/fsdb/data/Fsd_fil_itm.java @@ -17,16 +17,18 @@ along with this program. If not, see . */ 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); } diff --git a/400_xowa/src/gplx/fsdb/data/Fsd_fil_tbl.java b/400_xowa/src/gplx/fsdb/data/Fsd_fil_tbl.java index 6a3ba158f..88af814b9 100644 --- a/400_xowa/src/gplx/fsdb/data/Fsd_fil_tbl.java +++ b/400_xowa/src/gplx/fsdb/data/Fsd_fil_tbl.java @@ -17,80 +17,87 @@ along with this program. If not, see . */ 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)); + } } diff --git a/400_xowa/src/gplx/fsdb/data/Fsd_img_itm.java b/400_xowa/src/gplx/fsdb/data/Fsd_img_itm.java index ff0d2ecd5..3140d2f45 100644 --- a/400_xowa/src/gplx/fsdb/data/Fsd_img_itm.java +++ b/400_xowa/src/gplx/fsdb/data/Fsd_img_itm.java @@ -17,11 +17,11 @@ along with this program. If not, see . */ 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; } diff --git a/400_xowa/src/gplx/fsdb/data/Fsd_thm_itm.java b/400_xowa/src/gplx/fsdb/data/Fsd_thm_itm.java index 4809dd4f2..49a91a8fd 100644 --- a/400_xowa/src/gplx/fsdb/data/Fsd_thm_itm.java +++ b/400_xowa/src/gplx/fsdb/data/Fsd_thm_itm.java @@ -17,46 +17,35 @@ along with this program. If not, see . */ 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() {} } diff --git a/400_xowa/src/gplx/fsdb/data/Fsd_thm_tbl.java b/400_xowa/src/gplx/fsdb/data/Fsd_thm_tbl.java index 9a8af737d..f59e9dfc4 100644 --- a/400_xowa/src/gplx/fsdb/data/Fsd_thm_tbl.java +++ b/400_xowa/src/gplx/fsdb/data/Fsd_thm_tbl.java @@ -16,129 +16,98 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ 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); diff --git a/400_xowa/src/gplx/fsdb/meta/Fsm_abc_mgr.java b/400_xowa/src/gplx/fsdb/meta/Fsm_abc_mgr.java deleted file mode 100644 index c30ff510a..000000000 --- a/400_xowa/src/gplx/fsdb/meta/Fsm_abc_mgr.java +++ /dev/null @@ -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 . -*/ -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); - } -} diff --git a/400_xowa/src/gplx/fsdb/meta/Fsm_atr_fil.java b/400_xowa/src/gplx/fsdb/meta/Fsm_atr_fil.java index cdff87c58..921677432 100644 --- a/400_xowa/src/gplx/fsdb/meta/Fsm_atr_fil.java +++ b/400_xowa/src/gplx/fsdb/meta/Fsm_atr_fil.java @@ -16,125 +16,94 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ 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; } diff --git a/400_xowa/src/gplx/fsdb/meta/Fsm_atr_mgr.java b/400_xowa/src/gplx/fsdb/meta/Fsm_atr_mgr.java index 7025eea49..85ef8b17b 100644 --- a/400_xowa/src/gplx/fsdb/meta/Fsm_atr_mgr.java +++ b/400_xowa/src/gplx/fsdb/meta/Fsm_atr_mgr.java @@ -16,61 +16,19 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ 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();} } diff --git a/400_xowa/src/gplx/fsdb/meta/Fsm_atr_tbl.java b/400_xowa/src/gplx/fsdb/meta/Fsm_atr_tbl.java index 9b19ec4bb..fa7cddcc6 100644 --- a/400_xowa/src/gplx/fsdb/meta/Fsm_atr_tbl.java +++ b/400_xowa/src/gplx/fsdb/meta/Fsm_atr_tbl.java @@ -18,62 +18,38 @@ along with this program. If not, see . 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(); } } diff --git a/400_xowa/src/gplx/fsdb/meta/Fsm_bin_fil.java b/400_xowa/src/gplx/fsdb/meta/Fsm_bin_fil.java index 1766e66f4..04ccb5fb1 100644 --- a/400_xowa/src/gplx/fsdb/meta/Fsm_bin_fil.java +++ b/400_xowa/src/gplx/fsdb/meta/Fsm_bin_fil.java @@ -16,43 +16,24 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ 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; } diff --git a/400_xowa/src/gplx/fsdb/meta/Fsm_bin_mgr.java b/400_xowa/src/gplx/fsdb/meta/Fsm_bin_mgr.java index 31717bc6d..f84ba2219 100644 --- a/400_xowa/src/gplx/fsdb/meta/Fsm_bin_mgr.java +++ b/400_xowa/src/gplx/fsdb/meta/Fsm_bin_mgr.java @@ -16,79 +16,44 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ 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; } } diff --git a/400_xowa/src/gplx/fsdb/meta/Fsm_bin_tbl.java b/400_xowa/src/gplx/fsdb/meta/Fsm_bin_tbl.java index eb7ddcb1e..f6d798cc5 100644 --- a/400_xowa/src/gplx/fsdb/meta/Fsm_bin_tbl.java +++ b/400_xowa/src/gplx/fsdb/meta/Fsm_bin_tbl.java @@ -18,62 +18,33 @@ along with this program. If not, see . 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); - } } diff --git a/400_xowa/src/gplx/fsdb/meta/Fsm_cfg_mgr.java b/400_xowa/src/gplx/fsdb/meta/Fsm_cfg_mgr.java index e502e51dd..69e64e342 100644 --- a/400_xowa/src/gplx/fsdb/meta/Fsm_cfg_mgr.java +++ b/400_xowa/src/gplx/fsdb/meta/Fsm_cfg_mgr.java @@ -16,62 +16,35 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ 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"; diff --git a/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_itm.java b/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_itm.java index 9e489b9dd..42d73a55c 100644 --- a/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_itm.java +++ b/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_itm.java @@ -16,9 +16,58 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ 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); + } } diff --git a/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_mgr.java b/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_mgr.java index 58c684e03..05d42096d 100644 --- a/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_mgr.java +++ b/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_mgr.java @@ -16,120 +16,37 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ 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 } diff --git a/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_tbl.java b/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_tbl.java index 47b327a10..3ee9e97d3 100644 --- a/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_tbl.java +++ b/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_tbl.java @@ -17,29 +17,24 @@ along with this program. If not, see . */ 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"; } diff --git a/400_xowa/src/gplx/ios/Io_stream_zip_mgr.java b/400_xowa/src/gplx/ios/Io_stream_zip_mgr.java index 4ea925a31..3677accd2 100644 --- a/400_xowa/src/gplx/ios/Io_stream_zip_mgr.java +++ b/400_xowa/src/gplx/ios/Io_stream_zip_mgr.java @@ -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); } } diff --git a/400_xowa/src/gplx/srls/dsvs/Dsv_wkr_base.java b/400_xowa/src/gplx/srls/dsvs/Dsv_wkr_base.java index 631ddbca9..c59763d23 100644 --- a/400_xowa/src/gplx/srls/dsvs/Dsv_wkr_base.java +++ b/400_xowa/src/gplx/srls/dsvs/Dsv_wkr_base.java @@ -18,10 +18,12 @@ along with this program. If not, see . 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(); diff --git a/400_xowa/src/gplx/xowa/Xoa_app_.java b/400_xowa/src/gplx/xowa/Xoa_app_.java index 7afa943d2..b18df21e1 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app_.java +++ b/400_xowa/src/gplx/xowa/Xoa_app_.java @@ -18,7 +18,7 @@ along with this program. If not, see . 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(); diff --git a/400_xowa/src/gplx/xowa/Xoa_app_fxt.java b/400_xowa/src/gplx/xowa/Xoa_app_fxt.java index fffd5bff9..b0f3b6510 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app_fxt.java +++ b/400_xowa/src/gplx/xowa/Xoa_app_fxt.java @@ -16,17 +16,18 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ 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 diff --git a/400_xowa/src/gplx/xowa/Xoae_app.java b/400_xowa/src/gplx/xowa/Xoae_app.java index ac962c384..1ffa5e34e 100644 --- a/400_xowa/src/gplx/xowa/Xoae_app.java +++ b/400_xowa/src/gplx/xowa/Xoae_app.java @@ -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); diff --git a/400_xowa/src/gplx/xowa/apis/Xoapi_doc.java b/400_xowa/src/gplx/xowa/apis/Xoapi_doc.java new file mode 100644 index 000000000..006509e7f --- /dev/null +++ b/400_xowa/src/gplx/xowa/apis/Xoapi_doc.java @@ -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 . +*/ +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'; + } + } +} +*/ diff --git a/400_xowa/src/gplx/xowa/apis/Xoapi_root.java b/400_xowa/src/gplx/xowa/apis/Xoapi_root.java index 20b11583e..5da4b8482 100644 --- a/400_xowa/src/gplx/xowa/apis/Xoapi_root.java +++ b/400_xowa/src/gplx/xowa/apis/Xoapi_root.java @@ -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); } diff --git a/400_xowa/src/gplx/xowa/apis/xowa/Xoapi_app.java b/400_xowa/src/gplx/xowa/apis/xowa/Xoapi_app.java index 876147125..124446a75 100644 --- a/400_xowa/src/gplx/xowa/apis/xowa/Xoapi_app.java +++ b/400_xowa/src/gplx/xowa/apis/xowa/Xoapi_app.java @@ -17,21 +17,26 @@ along with this program. If not, see . */ 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"; } diff --git a/400_xowa/src/gplx/xowa/apis/xowa/Xoapi_bldr.java b/400_xowa/src/gplx/xowa/apis/xowa/Xoapi_bldr.java index 9b8ef6516..242d58a3f 100644 --- a/400_xowa/src/gplx/xowa/apis/xowa/Xoapi_bldr.java +++ b/400_xowa/src/gplx/xowa/apis/xowa/Xoapi_bldr.java @@ -18,11 +18,11 @@ along with this program. If not, see . 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"; } diff --git a/400_xowa/src/gplx/xowa/apis/xowa/apps/Xoapi_fsys.java b/400_xowa/src/gplx/xowa/apis/xowa/apps/Xoapi_fsys.java new file mode 100644 index 000000000..091d17cf4 --- /dev/null +++ b/400_xowa/src/gplx/xowa/apis/xowa/apps/Xoapi_fsys.java @@ -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 . +*/ +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"; +} diff --git a/400_xowa/src/gplx/xowa/apis/xowa/bldrs/Xoapi_bldr_wikis.java b/400_xowa/src/gplx/xowa/apis/xowa/bldrs/Xoapi_bldr_wiki.java similarity index 62% rename from 400_xowa/src/gplx/xowa/apis/xowa/bldrs/Xoapi_bldr_wikis.java rename to 400_xowa/src/gplx/xowa/apis/xowa/bldrs/Xoapi_bldr_wiki.java index 9ac13f175..0402115a2 100644 --- a/400_xowa/src/gplx/xowa/apis/xowa/bldrs/Xoapi_bldr_wikis.java +++ b/400_xowa/src/gplx/xowa/apis/xowa/bldrs/Xoapi_bldr_wiki.java @@ -17,12 +17,15 @@ along with this program. If not, see . */ 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"; } diff --git a/400_xowa/src/gplx/xowa/apis/xowa/bldrs/filters/Xoapi_filters.java b/400_xowa/src/gplx/xowa/apis/xowa/bldrs/filters/Xoapi_filter.java similarity index 71% rename from 400_xowa/src/gplx/xowa/apis/xowa/bldrs/filters/Xoapi_filters.java rename to 400_xowa/src/gplx/xowa/apis/xowa/bldrs/filters/Xoapi_filter.java index 84a2ef48d..4f8706aa5 100644 --- a/400_xowa/src/gplx/xowa/apis/xowa/bldrs/filters/Xoapi_filters.java +++ b/400_xowa/src/gplx/xowa/apis/xowa/bldrs/filters/Xoapi_filter.java @@ -17,12 +17,12 @@ along with this program. If not, see . */ 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"; } diff --git a/400_xowa/src/gplx/xowa/apis/xowa/bldrs/filters/dansguardians/Xoapi_dansguardians.java b/400_xowa/src/gplx/xowa/apis/xowa/bldrs/filters/dansguardians/Xoapi_dansguardian.java similarity index 97% rename from 400_xowa/src/gplx/xowa/apis/xowa/bldrs/filters/dansguardians/Xoapi_dansguardians.java rename to 400_xowa/src/gplx/xowa/apis/xowa/bldrs/filters/dansguardians/Xoapi_dansguardian.java index ed2acf468..5fafff236 100644 --- a/400_xowa/src/gplx/xowa/apis/xowa/bldrs/filters/dansguardians/Xoapi_dansguardians.java +++ b/400_xowa/src/gplx/xowa/apis/xowa/bldrs/filters/dansguardians/Xoapi_dansguardian.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ 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"); } diff --git a/400_xowa/src/gplx/xowa/apis/xowa/bldrs/filters/titles/Xoapi_titles.java b/400_xowa/src/gplx/xowa/apis/xowa/bldrs/filters/titles/Xoapi_title.java similarity index 97% rename from 400_xowa/src/gplx/xowa/apis/xowa/bldrs/filters/titles/Xoapi_titles.java rename to 400_xowa/src/gplx/xowa/apis/xowa/bldrs/filters/titles/Xoapi_title.java index 64678af5f..fddc65a90 100644 --- a/400_xowa/src/gplx/xowa/apis/xowa/bldrs/filters/titles/Xoapi_titles.java +++ b/400_xowa/src/gplx/xowa/apis/xowa/bldrs/filters/titles/Xoapi_title.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ 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"); } diff --git a/400_xowa/src/gplx/xowa/apis/xowa/bldrs/imports/Xoapi_import.java b/400_xowa/src/gplx/xowa/apis/xowa/bldrs/imports/Xoapi_import.java new file mode 100644 index 000000000..f87444a8a --- /dev/null +++ b/400_xowa/src/gplx/xowa/apis/xowa/bldrs/imports/Xoapi_import.java @@ -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 . +*/ +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_(""); +} diff --git a/400_xowa/src/gplx/xowa/apps/Xoa_gfs_mgr.java b/400_xowa/src/gplx/xowa/apps/Xoa_gfs_mgr.java index 08fb7ac58..d5161db0a 100644 --- a/400_xowa/src/gplx/xowa/apps/Xoa_gfs_mgr.java +++ b/400_xowa/src/gplx/xowa/apps/Xoa_gfs_mgr.java @@ -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()); } } } diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Db_idx_mode.java b/400_xowa/src/gplx/xowa/bldrs/Db_idx_mode.java similarity index 92% rename from 400_xowa/src/gplx/xowa/bldrs/imports/Db_idx_mode.java rename to 400_xowa/src/gplx/xowa/bldrs/Db_idx_mode.java index 6b4795b77..d8aa769ba 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Db_idx_mode.java +++ b/400_xowa/src/gplx/xowa/bldrs/Db_idx_mode.java @@ -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 . */ -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;} diff --git a/400_xowa/src/gplx/xowa/bldrs/Db_mgr_fxt.java b/400_xowa/src/gplx/xowa/bldrs/Db_mgr_fxt.java index d73dc9422..278a0cef8 100644 --- a/400_xowa/src/gplx/xowa/bldrs/Db_mgr_fxt.java +++ b/400_xowa/src/gplx/xowa/bldrs/Db_mgr_fxt.java @@ -17,17 +17,18 @@ along with this program. If not, see . */ 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"), ""); } public void Rls() { - this.Wiki().Db_mgr().Rls(); + this.Wiki().Db_mgr_as_sql().Core_data_mgr().Rls(); } } diff --git a/400_xowa/src/gplx/xowa/bldrs/Xob_base_fxt.java b/400_xowa/src/gplx/xowa/bldrs/Xob_base_fxt.java index 6ea0c4f2d..4c110d99a 100644 --- a/400_xowa/src/gplx/xowa/bldrs/Xob_base_fxt.java +++ b/400_xowa/src/gplx/xowa/bldrs/Xob_base_fxt.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ 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(); diff --git a/400_xowa/src/gplx/xowa/bldrs/Xob_cmd.java b/400_xowa/src/gplx/xowa/bldrs/Xob_cmd.java index ba04f927a..89d7f4fcd 100644 --- a/400_xowa/src/gplx/xowa/bldrs/Xob_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/Xob_cmd.java @@ -18,9 +18,9 @@ along with this program. If not, see . 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(); } diff --git a/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_keys.java b/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_keys.java new file mode 100644 index 000000000..c8380284d --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_keys.java @@ -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 . +*/ +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" + ; +} + \ No newline at end of file diff --git a/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_mgr.java b/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_mgr.java index 0f4c8e52f..601bef69a 100644 --- a/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_mgr.java +++ b/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_mgr.java @@ -17,10 +17,9 @@ along with this program. If not, see . */ 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"; diff --git a/400_xowa/src/gplx/xowa/bldrs/Xob_db_file.java b/400_xowa/src/gplx/xowa/bldrs/Xob_db_file.java new file mode 100644 index 000000000..9fa2e6f83 --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/Xob_db_file.java @@ -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 . +*/ +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" + ; +} diff --git a/400_xowa/src/gplx/xowa/bldrs/Xob_fxt.java b/400_xowa/src/gplx/xowa/bldrs/Xob_fxt.java index d08097f16..c701839fc 100644 --- a/400_xowa/src/gplx/xowa/bldrs/Xob_fxt.java +++ b/400_xowa/src/gplx/xowa/bldrs/Xob_fxt.java @@ -16,13 +16,14 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ 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(); diff --git a/400_xowa/src/gplx/xowa/bldrs/Xob_ns_to_db_mgr.java b/400_xowa/src/gplx/xowa/bldrs/Xob_ns_to_db_mgr.java new file mode 100644 index 000000000..b3947acd7 --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/Xob_ns_to_db_mgr.java @@ -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 . +*/ +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(); + } + } +} diff --git a/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_init_db_wkr.java b/400_xowa/src/gplx/xowa/bldrs/Xob_ns_to_db_wkr.java similarity index 76% rename from 400_xowa/src/gplx/xowa/wikis/data/Xowd_db_init_db_wkr.java rename to 400_xowa/src/gplx/xowa/bldrs/Xob_ns_to_db_wkr.java index 2ed4ba18f..6324d8cad 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_init_db_wkr.java +++ b/400_xowa/src/gplx/xowa/bldrs/Xob_ns_to_db_wkr.java @@ -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 . */ -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); } diff --git a/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_dump_mgr_base.java b/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_dump_mgr_base.java similarity index 84% rename from 400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_dump_mgr_base.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/Xob_dump_mgr_base.java index e86ad2800..8b390e3ea 100644 --- a/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_dump_mgr_base.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_dump_mgr_base.java @@ -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 . */ -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); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_ns_file_itm.java b/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_ns_file_itm.java new file mode 100644 index 000000000..96f3d334a --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_ns_file_itm.java @@ -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 . +*/ +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); + } + } + } +} diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_ns_file_itm_parser.java b/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_ns_file_itm_parser.java new file mode 100644 index 000000000..fdb65d9d5 --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_ns_file_itm_parser.java @@ -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 . +*/ +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_(""); + /* +"" -> no rules; return "default"; generates "text-001" and lumps all ns into it +"*||3700|2" -> auto-generate per ns + +||gzip +||gzip + */ +} diff --git a/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_parse_all_src_sql.java b/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_parse_all_src_sql.java similarity index 54% rename from 400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_parse_all_src_sql.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/Xob_parse_all_src_sql.java index cdf5aa9e4..1566a2c4a 100644 --- a/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_parse_all_src_sql.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_parse_all_src_sql.java @@ -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 . */ -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 > ?" diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Uca_trie.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Uca_trie.java similarity index 97% rename from 400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Uca_trie.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Uca_trie.java index 10228c801..d89581b93 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Uca_trie.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Uca_trie.java @@ -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 . */ -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() { diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Uca_trie_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Uca_trie_tst.java similarity index 88% rename from 400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Uca_trie_tst.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Uca_trie_tst.java index a28d4d47e..fae1bd10f 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Uca_trie_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Uca_trie_tst.java @@ -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 . */ -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() { diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_category_registry_sql.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_category_registry_sql.java similarity index 54% rename from 400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_category_registry_sql.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_category_registry_sql.java index 01d22466c..c816df5f6 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_category_registry_sql.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_category_registry_sql.java @@ -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 . */ -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);} } diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_category_registry_sql_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_category_registry_sql_tst.java similarity index 76% rename from 400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_category_registry_sql_tst.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_category_registry_sql_tst.java index c423a85a7..04bf5bedd 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_category_registry_sql_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_category_registry_sql_tst.java @@ -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 . */ -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); diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_base.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_categorylinks_base.java similarity index 87% rename from 400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_base.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_categorylinks_base.java index f478daa8b..8444e2dc8 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_base.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_categorylinks_base.java @@ -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 . */ -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 { diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_base_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_categorylinks_base_tst.java similarity index 77% rename from 400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_base_tst.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_categorylinks_base_tst.java index 01ce9fc91..1c8e2e92c 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_base_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_categorylinks_base_tst.java @@ -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 . */ -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|" )) diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_sql.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_categorylinks_sql.java similarity index 84% rename from 400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_sql.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_categorylinks_sql.java index 68329e799..06a6b5565 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_sql.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_categorylinks_sql.java @@ -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 . */ -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 ''," diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_categorylinks_sql_make.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_categorylinks_sql_make.java new file mode 100644 index 000000000..b9e4e2e78 --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_categorylinks_sql_make.java @@ -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 . +*/ +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 +*/ diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_sql_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_categorylinks_sql_tst.java similarity index 86% rename from 400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_sql_tst.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_categorylinks_sql_tst.java index 318f3b97e..b84883dc5 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_sql_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_categorylinks_sql_tst.java @@ -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 . */ -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) diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_txt.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_categorylinks_txt.java similarity index 82% rename from 400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_txt.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_categorylinks_txt.java index 7cbb43ea1..2c7e3675e 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_txt.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_categorylinks_txt.java @@ -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 . */ -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);} } diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_ctg_v1_base.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_ctg_v1_base.java similarity index 90% rename from 400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_ctg_v1_base.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_ctg_v1_base.java index b007a73bc..f60b3c35a 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_ctg_v1_base.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_ctg_v1_base.java @@ -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 . */ -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) { diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_ctg_v1_base_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_ctg_v1_base_tst.java similarity index 75% rename from 400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_ctg_v1_base_tst.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_ctg_v1_base_tst.java index bab20dce7..218f3c4c3 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_ctg_v1_base_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_ctg_v1_base_tst.java @@ -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 . */ -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) { } } diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_ctg_v1_sql.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_ctg_v1_sql.java similarity index 75% rename from 400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_ctg_v1_sql.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_ctg_v1_sql.java index 63fd2e215..18dbeb7e3 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_ctg_v1_sql.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_ctg_v1_sql.java @@ -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 . */ -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(); diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_ctg_v1_sql_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_ctg_v1_sql_tst.java similarity index 89% rename from 400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_ctg_v1_sql_tst.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_ctg_v1_sql_tst.java index 4aa20d1ba..d6908a5ce 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_ctg_v1_sql_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_ctg_v1_sql_tst.java @@ -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 . */ -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 diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_ctg_v1_txt.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_ctg_v1_txt.java similarity index 78% rename from 400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_ctg_v1_txt.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_ctg_v1_txt.java index aaad0cfcc..aa66f2967 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_ctg_v1_txt.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_ctg_v1_txt.java @@ -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 . */ -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);} } diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_sql_join_mgr.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_sql_join_mgr.java similarity index 89% rename from 400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_sql_join_mgr.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_sql_join_mgr.java index 3c366f91c..4052258c3 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_sql_join_mgr.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_sql_join_mgr.java @@ -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 . */ -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(); diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_hiddencat_parser_base.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xoctg_hiddencat_parser_base.java similarity index 93% rename from 400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_hiddencat_parser_base.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xoctg_hiddencat_parser_base.java index f9c694cbc..2c80f4610 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_hiddencat_parser_base.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xoctg_hiddencat_parser_base.java @@ -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 . */ -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;} diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_hiddencat_parser_sql.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xoctg_hiddencat_parser_sql.java similarity index 66% rename from 400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_hiddencat_parser_sql.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xoctg_hiddencat_parser_sql.java index 6ca7f704e..040a05c8a 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_hiddencat_parser_sql.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xoctg_hiddencat_parser_sql.java @@ -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 . */ -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(); diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_hiddencat_parser_sql_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xoctg_hiddencat_parser_sql_tst.java similarity index 73% rename from 400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_hiddencat_parser_sql_tst.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xoctg_hiddencat_parser_sql_tst.java index c7aba883e..0bca92c39 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_hiddencat_parser_sql_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xoctg_hiddencat_parser_sql_tst.java @@ -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 . */ -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)); } } diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_hiddencat_parser_txt.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xoctg_hiddencat_parser_txt.java similarity index 85% rename from 400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_hiddencat_parser_txt.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xoctg_hiddencat_parser_txt.java index 1267ad489..e1252554a 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_hiddencat_parser_txt.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xoctg_hiddencat_parser_txt.java @@ -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 . */ -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); } diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_hiddencat_ttl_wkr.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xoctg_hiddencat_ttl_wkr.java similarity index 85% rename from 400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_hiddencat_ttl_wkr.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xoctg_hiddencat_ttl_wkr.java index db1754fe6..bbeeb241c 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_hiddencat_ttl_wkr.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xoctg_hiddencat_ttl_wkr.java @@ -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 . */ -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) { diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_hiddencat_ttl_wkr_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xoctg_hiddencat_ttl_wkr_tst.java similarity index 85% rename from 400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_hiddencat_ttl_wkr_tst.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xoctg_hiddencat_ttl_wkr_tst.java index 8e9fe19b0..72efdbd76 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_hiddencat_ttl_wkr_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xoctg_hiddencat_ttl_wkr_tst.java @@ -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 . */ -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|!!!!%" diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_link_idx_wkr.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xoctg_link_idx_wkr.java similarity index 94% rename from 400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_link_idx_wkr.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xoctg_link_idx_wkr.java index e87b1a64e..99b8fbf61 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_link_idx_wkr.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xoctg_link_idx_wkr.java @@ -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 . */ -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; diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_link_idx_wkr_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xoctg_link_idx_wkr_tst.java similarity index 87% rename from 400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_link_idx_wkr_tst.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xoctg_link_idx_wkr_tst.java index 3f0c56d5c..b5b90f899 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_link_idx_wkr_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xoctg_link_idx_wkr_tst.java @@ -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 . */ -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|" diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_diff_regy_exec_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_diff_regy_exec_cmd.java similarity index 78% rename from 400_xowa/src/gplx/xowa/bldrs/files/Xob_diff_regy_exec_cmd.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_diff_regy_exec_cmd.java index a9b897ee9..5f65905ae 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_diff_regy_exec_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_diff_regy_exec_cmd.java @@ -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 . */ -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_ { diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_diff_regy_exec_cmd_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_diff_regy_exec_cmd_tst.java similarity index 92% rename from 400_xowa/src/gplx/xowa/bldrs/files/Xob_diff_regy_exec_cmd_tst.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_diff_regy_exec_cmd_tst.java index 966abb50f..58420633f 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_diff_regy_exec_cmd_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_diff_regy_exec_cmd_tst.java @@ -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 . */ -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 { diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_diff_regy_make_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_diff_regy_make_cmd.java similarity index 91% rename from 400_xowa/src/gplx/xowa/bldrs/files/Xob_diff_regy_make_cmd.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_diff_regy_make_cmd.java index f275ca927..e1a0300b0 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_diff_regy_make_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_diff_regy_make_cmd.java @@ -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 . */ -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); } diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_fsdb_make_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_fsdb_make_cmd.java new file mode 100644 index 000000000..471399e79 --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_fsdb_make_cmd.java @@ -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 . +*/ +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); + } +} diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_regy_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_regy_cmd.java similarity index 69% rename from 400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_regy_cmd.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_regy_cmd.java index e0021e35a..de2d9f37c 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_regy_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_regy_cmd.java @@ -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 . */ -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() {} } diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_regy_tbl.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_regy_tbl.java similarity index 85% rename from 400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_regy_tbl.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_regy_tbl.java index 9932183fb..77c04b99a 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_regy_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_regy_tbl.java @@ -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 . */ -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" diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_src_tid.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_src_tid.java similarity index 86% rename from 400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_src_tid.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_src_tid.java index faf7fa5fb..d5c5348fe 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_src_tid.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_src_tid.java @@ -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 . */ -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; } diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_tbl.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_tbl.java new file mode 100644 index 000000000..ed3e2c039 --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_tbl.java @@ -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 . +*/ +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(); + } +} diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_temp_wkr.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr.java similarity index 69% rename from 400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_temp_wkr.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr.java index 32fcfa763..f5e77a4f7 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_temp_wkr.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr.java @@ -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 . */ -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) { diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_temp_wkr_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr_tst.java similarity index 91% rename from 400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_temp_wkr_tst.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr_tst.java index 84ee81769..bcf85cf5b 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_temp_wkr_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr_tst.java @@ -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 . */ -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(); diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_orig_regy_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_orig_regy_cmd.java similarity index 72% rename from 400_xowa/src/gplx/xowa/bldrs/files/Xob_orig_regy_cmd.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_orig_regy_cmd.java index 872669ec6..54e08ab2a 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_orig_regy_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_orig_regy_cmd.java @@ -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 . */ -package gplx.xowa.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.dbs.*; import gplx.xowa.wikis.*; 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.wikis.*; public class Xob_orig_regy_cmd extends Xob_itm_basic_base implements Xob_cmd { private boolean repo_0_is_remote = false; public Xob_orig_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.orig_regy"; - public void Cmd_ini(Xob_bldr bldr) {} + public String Cmd_key() {return Xob_cmd_keys.Key_file_orig_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_orig_regy_tbl.Create_table(conn); Xowe_wiki commons_wiki = bldr.App().Wiki_mgr().Get_by_key_or_make(Xow_domain_.Domain_bry_commons).Init_assert(); Xowe_wiki repo_0 = wiki, repo_1 = commons_wiki; @@ -32,12 +32,12 @@ public class Xob_orig_regy_cmd extends Xob_itm_basic_base implements Xob_cmd { repo_1 = wiki; } repo_0.Init_assert(); repo_1.Init_assert(); - Xodb_db_file file_registry_db = Xodb_db_file.init__page_regy(commons_wiki.Fsys_mgr().Root_dir()); - Xob_orig_regy_tbl.Create_data(bldr.Usr_dlg(), conn, file_registry_db, repo_0_is_remote, repo_0, repo_1, Xob_lnki_temp_wkr.Wiki_ns_for_file_is_case_match_all(wiki)); + Xob_db_file file_registry_db = Xob_db_file.new__page_regy(commons_wiki.Fsys_mgr().Root_dir()); + Xob_orig_regy_tbl.Create_data(bldr.Usr_dlg(), conn, file_registry_db, repo_0_is_remote, repo_0, repo_1, 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() {} @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_repo_0_is_remote_)) repo_0_is_remote = m.ReadYn("v"); else return super.Invk(ctx, ikey, k, m); diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_orig_regy_tbl.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_orig_regy_tbl.java similarity index 88% rename from 400_xowa/src/gplx/xowa/bldrs/files/Xob_orig_regy_tbl.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_orig_regy_tbl.java index dfbe3e5af..53ea0c7bc 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_orig_regy_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_orig_regy_tbl.java @@ -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 . */ -package gplx.xowa.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.dbs.*; import gplx.xowa.wikis.*; import gplx.xowa.dbs.*; import gplx.xowa.bldrs.oimgs.*; import gplx.xowa.files.repos.*; +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.wikis.*; import gplx.xowa.files.repos.*; import gplx.dbs.engines.sqlite.*; class Xob_orig_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, Xodb_db_file file_registry_db, boolean repo_0_is_remote, Xowe_wiki repo_0_wiki, Xowe_wiki repo_1_wiki, boolean wiki_ns_for_file_is_case_match_all) { + public static void Create_data(Gfo_usr_dlg usr_dlg, Db_conn p, Xob_db_file file_registry_db, boolean repo_0_is_remote, Xowe_wiki repo_0_wiki, Xowe_wiki repo_1_wiki, boolean wiki_ns_for_file_is_case_match_all) { usr_dlg.Prog_many("", "", "inserting lnki_regy"); p.Exec_sql(Sql_create_data); Sqlite_engine_.Idx_create(usr_dlg, p, "orig_regy", Idx_ttl_local); @@ -38,9 +38,9 @@ class Xob_orig_regy_tbl { repo_1_tid = Xof_repo_itm.Repo_local; local_wiki = repo_1_wiki; } - Create_data_for_repo(usr_dlg, p, local_wiki, Byte_.By_int(repo_0_tid), repo_0_dir.GenSubFil(Xodb_db_file.Name__wiki_image)); + Create_data_for_repo(usr_dlg, p, local_wiki, Byte_.By_int(repo_0_tid), repo_0_dir.GenSubFil(Xob_db_file.Name__wiki_image)); if (!local_is_remote) { // only run for repo_1 if local != remote; only affects commons - Create_data_for_repo(usr_dlg, p, local_wiki, Byte_.By_int(repo_1_tid), repo_1_dir.GenSubFil(Xodb_db_file.Name__wiki_image)); + Create_data_for_repo(usr_dlg, p, local_wiki, Byte_.By_int(repo_1_tid), repo_1_dir.GenSubFil(Xob_db_file.Name__wiki_image)); if (wiki_ns_for_file_is_case_match_all) { Io_url repo_remote_dir = repo_0_is_remote ? repo_0_dir : repo_1_dir; Create_data_for_cs(usr_dlg, p, local_wiki, repo_remote_dir); @@ -49,21 +49,22 @@ class Xob_orig_regy_tbl { Sqlite_engine_.Db_detach(p, "page_db"); Sqlite_engine_.Idx_create(usr_dlg, p, "orig_regy", Idx_xfer_temp); } - private static void Create_data_for_repo(Gfo_usr_dlg usr_dlg, Db_conn cur, Xowe_wiki local_wiki, byte repo_tid, Io_url join) { + private static void Create_data_for_repo(Gfo_usr_dlg usr_dlg, Db_conn conn, Xowe_wiki local_wiki, byte repo_tid, Io_url join) { usr_dlg.Note_many("", "", "inserting page for xowa.wiki.image: ~{0}", join.OwnerDir().NameOnly()); boolean wiki_has_cs_file = repo_tid == Xof_repo_itm.Repo_remote && local_wiki.Ns_mgr().Ns_file().Case_match() == Xow_ns_case_.Id_all; String lnki_ttl_fld = wiki_has_cs_file ? "Coalesce(o.lnki_commons_ttl, o.lnki_ttl)" : "o.lnki_ttl"; // NOTE: use lnki_commons_ttl if [[File]] is cs PAGE:en.d:water EX:[[image:wikiquote-logo.png|50px|none|alt=]]; DATE:2014-09-05 if (wiki_has_cs_file) - Sqlite_engine_.Idx_create(usr_dlg, cur, "orig_regy", Idx_ttl_remote); - Sqlite_engine_.Db_attach(cur, "image_db", join.Raw()); - cur.Exec_sql(String_.Format(Sql_update_repo_page, repo_tid, lnki_ttl_fld)); - cur.Exec_sql(String_.Format(Sql_update_repo_redirect, repo_tid, lnki_ttl_fld)); - Sqlite_engine_.Db_detach(cur, "image_db"); + Sqlite_engine_.Idx_create(usr_dlg, conn, "orig_regy", Idx_ttl_remote); + Db_attach_cmd.new_(conn, "image_db", join) + .Add_fmt("orig_regy:updating page" , Sql_update_repo_page, repo_tid, lnki_ttl_fld) + .Add_fmt("orig_regy:updating redirect" , Sql_update_repo_redirect, repo_tid, lnki_ttl_fld) + .Exec() + ; } private static void Create_data_for_cs(Gfo_usr_dlg usr_dlg, Db_conn p, Xowe_wiki local_wiki, Io_url repo_remote_dir) { p.Exec_sql(Xob_orig_regy_tbl.Sql_cs_mark_dupes); // orig_regy: find dupes; see note in SQL p.Exec_sql(Xob_orig_regy_tbl.Sql_cs_update_ttls); // orig_regy: update lnki_ttl with lnki_commons_ttl - Create_data_for_repo(usr_dlg, p, local_wiki, Xof_repo_itm.Repo_remote, repo_remote_dir.GenSubFil(Xodb_db_file.Name__wiki_image)); + Create_data_for_repo(usr_dlg, p, local_wiki, Xof_repo_itm.Repo_remote, repo_remote_dir.GenSubFil(Xob_db_file.Name__wiki_image)); p.Exec_sql(Xob_lnki_regy_tbl.Sql_cs_mark_changed); // lnki_regy: update lnki_commons_flag p.Exec_sql(Xob_lnki_regy_tbl.Sql_cs_update_ttls); // lnki_regy: update cs } @@ -77,7 +78,7 @@ class Xob_orig_regy_tbl { private static final Db_idx_itm Idx_ttl_local = Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS orig_regy__ttl_local ON orig_regy (lnki_ttl);") , Idx_ttl_remote = Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS orig_regy__ttl_remote ON orig_regy (lnki_commons_ttl, lnki_ttl);") - , Idx_xfer_temp = Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS orig_regy__xfer_temp ON orig_regy (lnki_ttl, orig_file_ttl, orig_timestamp);") + , Idx_xfer_temp = Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS orig_regy__xfer_temp ON orig_regy (lnki_ttl, orig_file_ttl, orig_repo, orig_timestamp);") ; private static final String Tbl_sql = String_.Concat_lines_nl @@ -142,7 +143,7 @@ class Xob_orig_regy_tbl { , ", i.img_minor_mime" , ", i.img_timestamp" , "FROM orig_regy o" - , " JOIN image_db.image i ON {1} = i.img_name" + , " JOIN image i ON {1} = i.img_name" , " JOIN page_db.page_regy m ON m.repo_id = {0} AND m.itm_tid = 0 AND {1} = m.src_ttl" , "WHERE o.orig_file_ttl IS NULL" // NOTE: only insert if file doesn't exist; changed from timestamp b/c old images may exist in both wikis; EX:ar.n:File:Facebook.png; DATE:2014-08-20 // , "WHERE i.img_timestamp > o.orig_timestamp" // NOTE: this handles an image in local and remote by taking later version; DATE:2014-07-22 @@ -173,7 +174,7 @@ class Xob_orig_regy_tbl { , ", i.img_timestamp" , "FROM orig_regy o" , " JOIN page_db.page_regy m ON m.repo_id = {0} AND m.itm_tid = 1 AND {1} = m.src_ttl" - , " JOIN image_db.image i ON m.trg_ttl = i.img_name" + , " JOIN image i ON m.trg_ttl = i.img_name" , "WHERE o.orig_file_ttl IS NULL" // NOTE: only insert if file doesn't exist; changed from timestamp b/c old images may exist in both wikis; EX:ar.n:File:Facebook.png; DATE:2014-08-20 // , "WHERE i.img_timestamp > o.orig_timestamp" // NOTE: this handles an image in local and remote by taking later version; DATE:2014-07-22 , "ORDER BY 1" // must order by lnki_id since it is PRIMARY KEY, else sqlite will spend hours shuffling rows in table diff --git a/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_bmk_mgr.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_orig_regy_update_bmk_mgr.java similarity index 76% rename from 400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_bmk_mgr.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_orig_regy_update_bmk_mgr.java index 0541d9eb6..eef6bb186 100644 --- a/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_bmk_mgr.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_orig_regy_update_bmk_mgr.java @@ -15,20 +15,19 @@ 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 . */ -package gplx.xowa.bldrs.oimgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.dbs.*; import gplx.xowa.dbs.tbls.*; -public class Xob_bmk_mgr implements GfoInvkAble { - private Xodb_xowa_cfg_tbl cfg_tbl; private Db_stmt cfg_stmt; +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.*; +public class Xob_orig_regy_update_bmk_mgr implements GfoInvkAble { + private Db_cfg_tbl cfg_tbl; private String cfg_grp; public byte Repo_prv() {return repo_prv;} private byte repo_prv; public int Ns_prv() {return ns_prv;} private int ns_prv; public byte[] Ttl_prv() {return ttl_prv;} private byte[] ttl_prv; private boolean repo_enable, ns_enable, ttl_enable; private boolean repo_dirty, ns_dirty, ttl_dirty; - public Xob_bmk_mgr Init(Db_conn p, String grp, boolean repo_enable, boolean ns_enable, boolean ttl_enable) { + public Xob_orig_regy_update_bmk_mgr Init(Db_conn p, String grp, boolean repo_enable, boolean ns_enable, boolean ttl_enable) { this.cfg_grp = grp; - cfg_tbl = new Xodb_xowa_cfg_tbl().Conn_(p); - cfg_stmt = cfg_tbl.Update_stmt(); + cfg_tbl = new Db_cfg_tbl(p, "xowa_cfg"); this.repo_enable = repo_enable; this.ns_enable = ns_enable; this.ttl_enable = ttl_enable; @@ -36,7 +35,7 @@ public class Xob_bmk_mgr implements GfoInvkAble { } public void Term() { this.Save(); // flush existing values - cfg_stmt.Rls(); + cfg_tbl.Rls(); } public void Update_repo_ttl(byte repo, byte[] ttl) {Update(repo, Null_ns, ttl);} public void Update(byte repo, int ns, byte[] ttl) { @@ -59,13 +58,13 @@ public class Xob_bmk_mgr implements GfoInvkAble { } } } - public Xob_bmk_mgr Load() { + public Xob_orig_regy_update_bmk_mgr Load() { if (repo_enable) - repo_prv = Byte_.parse_(cfg_tbl.Select_val_or_make(cfg_grp, Cfg_repo_prv, "0")); + repo_prv = cfg_tbl.Assert_byte(cfg_grp, Cfg_repo_prv, Byte_.Zero); if (ns_enable) - ns_prv = Int_.parse_(cfg_tbl.Select_val_or_make(cfg_grp, Cfg_ns_prv, "0")); + ns_prv = cfg_tbl.Assert_int(cfg_grp, Cfg_ns_prv, 0); if (ttl_enable) - ttl_prv = Bry_.new_utf8_(cfg_tbl.Select_val_or_make(cfg_grp, Cfg_ttl_prv, "")); + ttl_prv = cfg_tbl.Assert_bry(cfg_grp, Cfg_ttl_prv, Bry_.Empty); repo_dirty = ns_dirty = ttl_dirty = false; return this; } @@ -84,7 +83,7 @@ public class Xob_bmk_mgr implements GfoInvkAble { } } private void Save(String cfg_key, String cfg_val) { - cfg_tbl.Update(cfg_stmt, cfg_grp, cfg_key, cfg_val); + cfg_tbl.Update_str(cfg_grp, cfg_key, cfg_val); } public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_repo_prv_)) repo_prv = m.ReadByte("v"); diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_orig_qry_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_orig_regy_update_cmd.java similarity index 71% rename from 400_xowa/src/gplx/xowa/bldrs/files/Xob_orig_qry_cmd.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_orig_regy_update_cmd.java index 8d003a14e..a3f1c278a 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_orig_qry_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_orig_regy_update_cmd.java @@ -15,17 +15,16 @@ 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 . */ -package gplx.xowa.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.xowa.dbs.*; import gplx.xowa.files.*; import gplx.xowa.dbs.tbls.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.files.origs.*; -import gplx.xowa.bldrs.oimgs.*; -public class Xob_orig_qry_cmd extends Xob_itm_basic_base implements Xob_cmd { - public Xob_orig_qry_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} +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.qrys.*; import gplx.xowa.dbs.*; import gplx.xowa.files.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.files.origs.*; +public class Xob_orig_regy_update_cmd extends Xob_itm_basic_base implements Xob_cmd { // downloads latest orig data + public Xob_orig_regy_update_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 = "oimg.orig_qry"; - public void Cmd_ini(Xob_bldr bldr) {} + public void Cmd_init(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) { // Xof_orig_mgr qry_mgr = new Xof_orig_mgr(); - Db_conn conn = Xodb_db_file.init__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); - Xob_bmk_mgr bmk = new Xob_bmk_mgr(); + Db_conn conn = Xob_db_file.new__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); + Xob_orig_regy_update_bmk_mgr bmk = new Xob_orig_regy_update_bmk_mgr(); bmk.Init(conn, this.Cmd_key(), true, false, true); bmk.Load(); // Xof_fsdb_itm itm = new Xof_fsdb_itm(); @@ -61,5 +60,5 @@ public class Xob_orig_qry_cmd extends Xob_itm_basic_base implements Xob_cmd { } public void Cmd_run() {} public void Cmd_end() {} - public void Cmd_print() {} + public void Cmd_term() {} } diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_page_regy_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_page_regy_cmd.java similarity index 80% rename from 400_xowa/src/gplx/xowa/bldrs/files/Xob_page_regy_cmd.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_page_regy_cmd.java index 6452228da..8050658d2 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_page_regy_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_page_regy_cmd.java @@ -15,16 +15,16 @@ 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 . */ -package gplx.xowa.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.dbs.*; import gplx.xowa.wikis.*; import gplx.dbs.engines.sqlite.*; import gplx.xowa.dbs.*; import gplx.xowa.bldrs.oimgs.*; import gplx.xowa.files.repos.*; +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.wikis.*; import gplx.dbs.engines.sqlite.*; import gplx.xowa.files.repos.*; public class Xob_page_regy_cmd extends Xob_itm_basic_base implements Xob_cmd { public Xob_page_regy_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} private boolean build_commons = false; - public String Cmd_key() {return KEY_oimg;} public static final String KEY_oimg = "file.page_regy"; - public void Cmd_ini(Xob_bldr bldr) {} + public String Cmd_key() {return Xob_cmd_keys.Key_file_page_regy;} + public void Cmd_init(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) { Xowe_wiki commons_wiki = bldr.App().Wiki_mgr().Get_by_key_or_make(Xow_domain_.Domain_bry_commons).Init_assert(); - Db_conn page_regy_provider = Xodb_db_file.init__page_regy(commons_wiki.Fsys_mgr().Root_dir()).Conn(); + Db_conn page_regy_provider = Xob_db_file.new__page_regy(commons_wiki.Fsys_mgr().Root_dir()).Conn(); commons_wiki.Init_assert(); if (build_commons) { Xob_page_regy_tbl.Reset_table(page_regy_provider); @@ -41,7 +41,7 @@ public class Xob_page_regy_cmd extends Xob_itm_basic_base implements Xob_cmd { } public void Cmd_run() {} public void Cmd_end() {} - public void Cmd_print() {} + public void Cmd_term() {} @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_build_commons_)) build_commons = m.ReadYn("v"); else return GfoInvkAble_.Rv_unhandled; diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_page_regy_tbl.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_page_regy_tbl.java similarity index 84% rename from 400_xowa/src/gplx/xowa/bldrs/files/Xob_page_regy_tbl.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_page_regy_tbl.java index 40dd229ef..a6a1a975e 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_page_regy_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_page_regy_tbl.java @@ -15,15 +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 . */ -package gplx.xowa.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; import gplx.xowa.dbs.*; import gplx.xowa.bldrs.oimgs.*; -import gplx.xowa.wikis.data.*; -import gplx.xowa.files.repos.*; +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.wikis.data.*; import gplx.xowa.files.repos.*; import gplx.dbs.engines.sqlite.*; class Xob_page_regy_tbl { public static void Reset_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, byte repo_tid, Xowe_wiki wiki) { - Create_data__insert_page(usr_dlg, p, repo_tid, wiki.Db_mgr_as_sql().Core_data_mgr().Get_url(Xowd_db_file_.Tid_core)); - Create_data__insert_redirect(usr_dlg, p, repo_tid, wiki.Fsys_mgr().Root_dir().GenSubFil(Xodb_db_file.Name__wiki_redirect)); + Xowd_db_file db_core = wiki.Db_mgr_as_sql().Core_data_mgr().Db__core(); + Create_data__insert_page(usr_dlg, p, repo_tid, db_core.Url()); + Create_data__insert_redirect(usr_dlg, p, repo_tid, wiki.Fsys_mgr().Root_dir().GenSubFil(Xob_db_file.Name__wiki_redirect)); } public static void Delete_local(Db_conn p) { p.Exec_sql("DELETE FROM page_regy WHERE repo_id = " + Xof_repo_itm.Repo_local); @@ -35,6 +34,7 @@ class Xob_page_regy_tbl { Sqlite_engine_.Db_detach(cur, "page_db"); } private static void Create_data__insert_redirect(Gfo_usr_dlg usr_dlg, Db_conn cur, byte repo_tid, Io_url join) { + if (!Io_mgr._.ExistsFil(join)) return; // redirect_db will not exist when commons.wikimedia.org is set up on new machine usr_dlg.Note_many("", "", "inserting redirect: ~{0}", join.OwnerDir().NameOnly()); Sqlite_engine_.Db_attach(cur, "redirect_db", join.Raw()); cur.Exec_sql(String_.Format(Sql_create_redirect, repo_tid)); diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_regy_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_cmd.java similarity index 70% rename from 400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_regy_cmd.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_cmd.java index 8591c0a67..9bfade654 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_regy_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_cmd.java @@ -15,21 +15,22 @@ 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 . */ -package gplx.xowa.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.files.*; 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.*; public class Xob_xfer_regy_cmd extends Xob_itm_basic_base implements Xob_cmd { public Xob_xfer_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.xfer_regy"; - public void Cmd_ini(Xob_bldr bldr) {} + public String Cmd_key() {return Xob_cmd_keys.Key_file_xfer_regy;} + public void Cmd_init(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) {} public void Cmd_run() { - 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(); + conn.Txn_bgn(); Xob_xfer_regy_tbl.Create_table(conn); Xob_xfer_regy_tbl.Create_data(usr_dlg, conn); Xob_xfer_regy_tbl.Create_index(usr_dlg, conn); Xob_xfer_regy_log_tbl.Create_table(conn); - conn.Txn_mgr().Txn_end_all(); + conn.Txn_end(); } public void Cmd_end() {} - public void Cmd_print() {} + public void Cmd_term() {} } diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_regy_tbl.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_tbl.java similarity index 79% rename from 400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_regy_tbl.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_tbl.java index d36f8b54e..b06896abb 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_regy_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_tbl.java @@ -15,15 +15,23 @@ 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 . */ -package gplx.xowa.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.dbs.engines.sqlite.*; 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.dbs.qrys.*; import gplx.dbs.engines.sqlite.*; public class Xob_xfer_regy_tbl { + public static final String Tbl_name = "xfer_regy" + , Fld_lnki_id = "lnki_id", Fld_lnki_tier_id = "lnki_tier_id", Fld_lnki_page_id = "lnki_page_id", Fld_lnki_ttl = "lnki_ttl", Fld_lnki_ext = "lnki_ext" + , Fld_lnki_time = "lnki_time", Fld_lnki_page = "lnki_page", Fld_lnki_count = "lnki_count" + , Fld_orig_repo = "orig_repo", Fld_orig_page_id = "orig_page_id", Fld_orig_redirect_src = "orig_redirect_src", Fld_orig_media_type = "orig_media_type" + , Fld_orig_w = "orig_w", Fld_orig_h = "orig_h" + , Fld_file_w = "file_w", Fld_file_h = "file_h", Fld_file_is_orig = "file_is_orig" + , Fld_xfer_status = "xfer_status" + ; 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) { p.Exec_sql(Sql_create_data_orig); p.Exec_sql(Sql_create_data_thumb); } - public static void Create_index(Gfo_usr_dlg usr_dlg, Db_conn p) {Sqlite_engine_.Idx_create(usr_dlg, p, Xodb_db_file.Name__file_make, Idx_lnki_page_id, Idx_lnki_ttl);} + public static void Create_index(Gfo_usr_dlg usr_dlg, Db_conn p) {Sqlite_engine_.Idx_create(usr_dlg, p, Xob_db_file.Name__file_make, Idx_lnki_page_id, Idx_lnki_ttl);} public static DataRdr Select(Db_conn p, byte repo_id, byte[] ttl, int limit) { Db_qry qry = Db_qry_.select_().Cols_all_() .From_(Tbl_name) @@ -41,7 +49,7 @@ public class Xob_xfer_regy_tbl { , "FROM xfer_regy" , "WHERE xfer_status = 0" , "AND lnki_page_id >= ?" - , "ORDER BY lnki_page_id, lnki_id" + , "ORDER BY lnki_tier_id, lnki_page_id, lnki_id" , "LIMIT ?" ) , Sql_select_total_pending = String_.Concat_lines_nl @@ -50,11 +58,11 @@ public class Xob_xfer_regy_tbl { , "WHERE xfer_status = 0" ) ; - public static DataRdr Select_by_lnki_page_id(Db_conn p, int lnki_page_id, int select_interval) { + public static DataRdr Select_by_tier_page(Db_conn p, int tier_id, int page_id, int select_interval) { Db_qry qry = Db_qry_.select_().Cols_all_() .From_(Tbl_name) - .Where_(gplx.core.criterias.Criteria_.And_many(Db_crt_.eq_(Fld_xfer_status, 0), Db_crt_.mte_(Fld_lnki_page_id, lnki_page_id))) - .OrderBy_many_(Fld_lnki_page_id, Fld_lnki_id) + .Where_(gplx.core.criterias.Criteria_.And_many(Db_crt_.eq_(Fld_xfer_status, 0), Db_crt_.eq_(Fld_lnki_tier_id, tier_id), Db_crt_.mte_(Fld_lnki_page_id, page_id))) + .OrderBy_many_(Fld_lnki_tier_id, Fld_lnki_page_id, Fld_lnki_id) .Limit_(select_interval) ; return p.Exec_qry_as_rdr(qry); @@ -67,17 +75,10 @@ public class Xob_xfer_regy_tbl { rdr.Rls(); return rv; } - public static final String Tbl_name = "xfer_regy" - , Fld_lnki_id = "lnki_id", Fld_lnki_page_id = "lnki_page_id", Fld_lnki_ttl = "lnki_ttl", Fld_lnki_ext = "lnki_ext" - , Fld_lnki_time = "lnki_time", Fld_lnki_page = "lnki_page", Fld_lnki_count = "lnki_count" - , Fld_orig_repo = "orig_repo", Fld_orig_page_id = "orig_page_id", Fld_orig_redirect_src = "orig_redirect_src", Fld_orig_media_type = "orig_media_type" - , Fld_orig_w = "orig_w", Fld_orig_h = "orig_h" - , Fld_file_w = "file_w", Fld_file_h = "file_h", Fld_file_is_orig = "file_is_orig" - , Fld_xfer_status = "xfer_status" - ; private static final String Tbl_sql = String_.Concat_lines_nl ( "CREATE TABLE IF NOT EXISTS xfer_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_ext integer NOT NULL" @@ -98,12 +99,12 @@ public class Xob_xfer_regy_tbl { ); private static final String Sql_create_data_orig = String_.Concat_lines_nl ( "INSERT INTO xfer_regy " - , "( lnki_id, lnki_page_id, orig_page_id, orig_repo, lnki_ttl, orig_redirect_src, lnki_ext, orig_media_type" + , "( lnki_id, lnki_tier_id, lnki_page_id, orig_page_id, orig_repo, lnki_ttl, orig_redirect_src, lnki_ext, orig_media_type" , ", file_is_orig, orig_w, orig_h, file_w, file_h, lnki_time, lnki_page, lnki_count" , ", xfer_status" , ")" , "SELECT " - , " Min(lnki_id), Min(lnki_page_id), Min(orig_page_id), orig_repo, lnki_ttl, Max(orig_redirect_src), lnki_ext, orig_media_type" // NOTE: Max(orig_redirect_src) not Min (else would get '') + , " Min(lnki_id), Min(lnki_tier_id), Min(lnki_page_id), Min(orig_page_id), orig_repo, lnki_ttl, Max(orig_redirect_src), lnki_ext, orig_media_type" // NOTE: Max(orig_redirect_src) not Min (else would get '') , ", file_is_orig, orig_w, orig_h, -1, -1, lnki_time, lnki_page, Sum(lnki_count)" , ", 0" , "FROM xfer_temp x" @@ -112,12 +113,12 @@ public class Xob_xfer_regy_tbl { ); private static final String Sql_create_data_thumb = String_.Concat_lines_nl ( "INSERT INTO xfer_regy " - , "( lnki_id, lnki_page_id, orig_page_id, orig_repo, lnki_ttl, orig_redirect_src, lnki_ext, orig_media_type" + , "( lnki_id, lnki_tier_id, lnki_page_id, orig_page_id, orig_repo, lnki_ttl, orig_redirect_src, lnki_ext, orig_media_type" , ", file_is_orig, orig_w, orig_h, file_w, file_h, lnki_time, lnki_page, lnki_count" , ", xfer_status" , ")" , "SELECT " - , " Min(lnki_id), Min(lnki_page_id), Min(orig_page_id), orig_repo, lnki_ttl, Max(orig_redirect_src), lnki_ext, orig_media_type" + , " Min(lnki_id), Min(lnki_tier_id), Min(lnki_page_id), Min(orig_page_id), orig_repo, lnki_ttl, Max(orig_redirect_src), lnki_ext, orig_media_type" , ", file_is_orig, orig_w, orig_h, file_w, file_h, lnki_time, lnki_page, Sum(lnki_count)" , ", 0" , "FROM xfer_temp x" @@ -126,7 +127,7 @@ public class Xob_xfer_regy_tbl { ); private static final Db_idx_itm // Idx_select = Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS xfer_regy__select ON xfer_regy (xfer_status, orig_repo, lnki_ttl, file_w);") - Idx_lnki_page_id = Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS xfer_regy__lnki_page_id ON xfer_regy (xfer_status, lnki_page_id, lnki_id, orig_repo, file_is_orig, lnki_ttl, lnki_ext, lnki_time, lnki_page, file_w, file_h);") + Idx_lnki_page_id = Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS xfer_regy__lnki_page_id ON xfer_regy (xfer_status, lnki_tier_id, lnki_page_id, lnki_id, orig_repo, file_is_orig, lnki_ttl, lnki_ext, lnki_time, lnki_page, file_w, file_h);") , Idx_lnki_ttl = Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS xfer_regy__lnki_ttl ON xfer_regy (lnki_ttl);") // needed for troubleshooting ; public static byte Status_todo = 0, Status_pass = 1, Status_fail = 2, Status_ignore_processed = 3; diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_regy_update_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_update_cmd.java similarity index 86% rename from 400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_regy_update_cmd.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_update_cmd.java index d538e15a6..356303f56 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_regy_update_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_regy_update_cmd.java @@ -15,44 +15,44 @@ 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 . */ -package gplx.xowa.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; 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.dbs.engines.sqlite.*; import gplx.fsdb.meta.*; public class Xob_xfer_regy_update_cmd extends Xob_itm_basic_base implements Xob_cmd { public Xob_xfer_regy_update_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.xfer_regy_update"; - public void Cmd_ini(Xob_bldr bldr) {} + public String Cmd_key() {return Xob_cmd_keys.Key_file_xfer_regy_update;} + 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.Copy_atrs_to_make_db(make_db_provider); this.Update_status(make_db_provider); } private void Copy_atrs_to_make_db(Db_conn make_db_provider) { - wiki.File_mgr().Fsdb_mgr().Init_by_wiki(wiki); - Fsm_abc_mgr fsdb_abc_mgr = wiki.File_mgr().Fsdb_mgr().Mnt_mgr().Mnts__at(0); // 0 = fsdb.main - Io_url fsdb_atr_url = fsdb_abc_mgr.Atr_mgr().Get_at(0).Url(); // 0 = fsdb.atr.00 + wiki.File_mgr().Init_file_mgr_by_load(wiki); + Fsm_mnt_itm fsdb_abc_mgr = wiki.File_mgr().Fsdb_mgr().Mnt_mgr().Mnts__get_main(); // 0 = fsdb.main + Db_conn conn = fsdb_abc_mgr.Atr_mgr().Db__core().Conn(); // 0 = fsdb.atr.00 + Io_url fsdb_atr_url = ((gplx.dbs.engines.sqlite.Sqlite_conn_info)conn.Conn_info()).Url(); Sqlite_engine_.Tbl_create_and_delete(make_db_provider, Xob_fsdb_regy_tbl.Tbl_name, Xob_fsdb_regy_tbl.Tbl_sql); Sqlite_engine_.Db_attach(make_db_provider, "fsdb_db", fsdb_atr_url.Raw()); - make_db_provider.Txn_mgr().Txn_bgn(); + make_db_provider.Txn_bgn(); make_db_provider.Exec_sql(Xob_fsdb_regy_tbl.Insert_fsdb_fil); - String insert_sql_fsdb_thm = wiki.File_mgr().Fsdb_mgr().Mnt_mgr().Mnts__at(0).Cfg_mgr().Schema_thm_page() // Cfg_get(Fsm_cfg_mgr.Grp_core).Get_yn_or_n(Fsm_cfg_mgr.Key_schema_thm_page) + String insert_sql_fsdb_thm = wiki.File_mgr().Fsdb_mgr().Mnt_mgr().Mnts__get_main().Cfg_mgr().Schema_thm_page() // Cfg_get(Fsm_cfg_mgr.Grp_core).Get_yn_or_n(Fsm_cfg_mgr.Key_schema_thm_page) ? Xob_fsdb_regy_tbl.Insert_fsdb_thm : Xob_fsdb_regy_tbl.Insert_fsdb_thm_v0 ; make_db_provider.Exec_sql(insert_sql_fsdb_thm); - make_db_provider.Txn_mgr().Txn_end(); + make_db_provider.Txn_end(); Sqlite_engine_.Idx_create(make_db_provider, Xob_fsdb_regy_tbl.Idx_main); Sqlite_engine_.Db_detach(make_db_provider, "fsdb_db"); } private void Update_status(Db_conn make_db_provider) { - make_db_provider.Txn_mgr().Txn_bgn(); + make_db_provider.Txn_bgn(); make_db_provider.Exec_sql(Xob_fsdb_regy_tbl.Update_regy_fil); make_db_provider.Exec_sql(Xob_fsdb_regy_tbl.Update_regy_thm); - make_db_provider.Txn_mgr().Txn_end(); + make_db_provider.Txn_end(); } @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { return this; diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_temp_cmd_orig.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_cmd_orig.java similarity index 83% rename from 400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_temp_cmd_orig.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_cmd_orig.java index d9e22f44c..a2b91321a 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_temp_cmd_orig.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_cmd_orig.java @@ -15,20 +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 . */ -package gplx.xowa.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.dbs.*; import gplx.xowa.dbs.*; -import gplx.xowa.files.*; import gplx.xowa.files.exts.*; -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.*; import gplx.xowa.files.*; import gplx.xowa.files.exts.*; public class Xob_xfer_temp_cmd_orig extends Xob_itm_basic_base implements Xob_cmd { private byte[] ext_rules_key = Bry_.Empty; public Xob_xfer_temp_cmd_orig(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.xfer_temp.orig"; - public void Cmd_ini(Xob_bldr bldr) {} + public String Cmd_key() {return Xob_cmd_keys.Key_file_xfer_temp_orig;} + 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_xfer_temp_tbl.Create_table(conn); Db_stmt trg_stmt = Xob_xfer_temp_tbl.Insert_stmt(conn); - conn.Txn_mgr().Txn_bgn_if_none(); + conn.Txn_bgn(); DataRdr rdr = conn.Exec_sql_as_rdr(Sql_select); long[] ext_maxs = Calc_ext_max(); while (rdr.MoveNextPeer()) { @@ -36,6 +34,7 @@ public class Xob_xfer_temp_cmd_orig extends Xob_itm_basic_base implements Xob_cm String orig_media_type = rdr.ReadStrOr(Xob_orig_regy_tbl.Fld_orig_media_type, ""); // convert nulls to "" lnki_ext = rdr.ReadInt(Xob_orig_regy_tbl.Fld_orig_file_ext); int lnki_id = rdr.ReadInt(Xob_lnki_regy_tbl.Fld_lnki_id); + int lnki_tier_id = rdr.ReadInt(Xob_lnki_regy_tbl.Fld_lnki_tier_id); byte orig_repo = rdr.ReadByte(Xob_orig_regy_tbl.Fld_orig_repo); int orig_page_id = rdr.ReadIntOr(Xob_orig_regy_tbl.Fld_orig_page_id, -1); if (orig_page_id == -1) continue; // no orig found; ignore @@ -48,7 +47,7 @@ public class Xob_xfer_temp_cmd_orig extends Xob_itm_basic_base implements Xob_cm int orig_size = rdr.ReadIntOr(Xob_orig_regy_tbl.Fld_orig_size, -1); if (orig_size > ext_maxs[lnki_ext]) continue; int lnki_page_id = rdr.ReadInt(Xob_lnki_regy_tbl.Fld_lnki_page_id); - Xob_xfer_temp_tbl.Insert(trg_stmt, lnki_id, lnki_page_id, orig_repo, orig_page_id, join_ttl, redirect_src, lnki_ext, Xop_lnki_type.Id_none, orig_media_type + Xob_xfer_temp_tbl.Insert(trg_stmt, lnki_id, lnki_tier_id, lnki_page_id, orig_repo, orig_page_id, join_ttl, redirect_src, lnki_ext, Xop_lnki_type.Id_none, orig_media_type , Bool_.Y // orig is y , orig_w, orig_h , orig_w, orig_h // file_w, file_h is same as orig_w,orig_h; i.e.: make same file_w as orig_w @@ -57,7 +56,7 @@ public class Xob_xfer_temp_cmd_orig extends Xob_itm_basic_base implements Xob_cm , Xof_lnki_page.Null , 0); } - conn.Txn_mgr().Txn_end_all(); + conn.Txn_end(); } private long[] Calc_ext_max() { Xof_rule_grp ext_rules = wiki.Appe().File_mgr().Ext_rules().Get_or_new(ext_rules_key); @@ -72,7 +71,7 @@ public class Xob_xfer_temp_cmd_orig extends Xob_itm_basic_base implements Xob_cm } public void Cmd_run() {} public void Cmd_end() {} - public void Cmd_print() {} + public void Cmd_term() {} private static final String Sql_select = String_.Concat_lines_nl ( "SELECT DISTINCT" diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_temp_cmd_thumb.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_cmd_thumb.java similarity index 66% rename from 400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_temp_cmd_thumb.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_cmd_thumb.java index 7cd9061f5..031e13d3f 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_temp_cmd_thumb.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_cmd_thumb.java @@ -15,34 +15,44 @@ 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 . */ -package gplx.xowa.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.files.*; 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.files.*; public class Xob_xfer_temp_cmd_thumb extends Xob_itm_basic_base implements Xob_cmd { public Xob_xfer_temp_cmd_thumb(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.xfer_temp.thumb"; - public void Cmd_ini(Xob_bldr bldr) {} + public String Cmd_key() {return Xob_cmd_keys.Key_file_xfer_temp_thumb;} + 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_xfer_temp_tbl.Create_table(conn); Db_stmt trg_stmt = Xob_xfer_temp_tbl.Insert_stmt(conn); - conn.Txn_mgr().Txn_bgn_if_none(); + conn.Txn_bgn(); DataRdr rdr = conn.Exec_sql_as_rdr(Sql_select); Xob_xfer_temp_itm temp_itm = new Xob_xfer_temp_itm(); Xof_img_size img_size = new Xof_img_size(); + byte[] cur_ttl = Bry_.Empty; byte cur_repo = Byte_.Max_value_127; while (rdr.MoveNextPeer()) { temp_itm.Clear(); temp_itm.Load(rdr); + if (Bry_.Eq(cur_ttl, temp_itm.Orig_file_ttl())) { // same ttl; DATE:2015-03-22 + if (temp_itm.Orig_repo() != cur_repo) // if repo is different, ignore 2nd; handles images in both repos; take 1st only (which should be local) + continue; + } + else { // new ttl; update ttl, repo + cur_ttl = temp_itm.Orig_file_ttl(); + cur_repo = temp_itm.Orig_repo(); + } if (temp_itm.Chk(img_size)) temp_itm.Insert(trg_stmt, img_size); } - conn.Txn_mgr().Txn_end_all(); + conn.Txn_end(); } public void Cmd_run() {} public void Cmd_end() {} - public void Cmd_print() {} + public void Cmd_term() {} private static final String Sql_select = String_.Concat_lines_nl ( "SELECT l.lnki_id" + , ", l.lnki_tier_id" , ", l.lnki_page_id" , ", l.lnki_ext" , ", l.lnki_type" @@ -66,6 +76,6 @@ public class Xob_xfer_temp_cmd_thumb extends Xob_itm_basic_base implements Xob_c , "FROM lnki_regy l" , " JOIN orig_regy o ON o.lnki_ttl = l.lnki_ttl" , "WHERE o.orig_file_ttl IS NOT NULL" - , "ORDER BY o.orig_file_ttl, l.lnki_w DESC" + , "ORDER BY o.orig_file_ttl, o.orig_repo DESC, l.lnki_w DESC" // NOTE: local=1,common=0; DATE:2015-03-22 ); } diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_temp_itm.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_itm.java similarity index 87% rename from 400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_temp_itm.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_itm.java index 944f9e2a2..cbd4698f2 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_temp_itm.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_itm.java @@ -15,12 +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 . */ -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 gplx.dbs.*; import gplx.xowa.files.*; class Xob_xfer_temp_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 byte Orig_repo() {return orig_repo;} private byte orig_repo; public int Lnki_ext() {return lnki_ext;} private int lnki_ext; + public byte[] Orig_file_ttl() {return orig_file_ttl;} private byte[] orig_file_ttl; public String Orig_media_type() {return orig_media_type;} private String orig_media_type; public String Orig_minor_mime() {return orig_minor_mime;} private String orig_minor_mime; public byte Orig_media_type_tid() {return orig_media_type_tid;} private byte orig_media_type_tid; @@ -39,11 +41,12 @@ class Xob_xfer_temp_itm { public double Lnki_upright() {return lnki_upright;} private double lnki_upright; public double Lnki_thumbtime() {return lnki_thumbtime;} private double lnki_thumbtime; public int Lnki_page() {return lnki_page;} private int lnki_page; - public void Clear() { + public void Clear() { + orig_file_ttl = null; lnki_ext = lnki_type = lnki_src_tid = orig_repo = orig_media_type_tid = Byte_.Max_value_127; chk_tid = Chk_tid_none; - lnki_id = lnki_w = lnki_h = lnki_count = lnki_page_id + lnki_id = lnki_tier_id = lnki_w = lnki_h = lnki_count = lnki_page_id = orig_w = orig_h = orig_page_id = Int_.Neg1; join_ttl = redirect_src = orig_media_type = null; lnki_upright = Xop_lnki_tkn.Upright_null; @@ -52,6 +55,7 @@ class Xob_xfer_temp_itm { } public void Load(DataRdr rdr) { lnki_id = rdr.ReadInt(Xob_lnki_regy_tbl.Fld_lnki_id); + lnki_tier_id = rdr.ReadInt(Xob_lnki_regy_tbl.Fld_lnki_tier_id); lnki_page_id = rdr.ReadInt(Xob_lnki_regy_tbl.Fld_lnki_page_id); lnki_ext = rdr.ReadInt(Xob_lnki_regy_tbl.Fld_lnki_ext); lnki_type = rdr.ReadByte(Xob_lnki_regy_tbl.Fld_lnki_type); @@ -62,6 +66,7 @@ class Xob_xfer_temp_itm { lnki_thumbtime = Xof_lnki_time.Db_load_double(rdr, Xob_lnki_regy_tbl.Fld_lnki_time); lnki_page = rdr.ReadInt(Xob_lnki_regy_tbl.Fld_lnki_page); lnki_count = rdr.ReadInt(Xob_lnki_regy_tbl.Fld_lnki_count); + orig_file_ttl = rdr.ReadBryByStr(Xob_lnki_regy_tbl.Fld_lnki_ttl); orig_repo = rdr.ReadByte(Xob_orig_regy_tbl.Fld_orig_repo); orig_page_id = rdr.ReadIntOr(Xob_orig_regy_tbl.Fld_orig_page_id, -1); join_ttl = rdr.ReadStr(Xob_orig_regy_tbl.Fld_orig_file_ttl); @@ -121,6 +126,6 @@ class Xob_xfer_temp_itm { return true; } public void Insert(Db_stmt stmt, Xof_img_size img_size) { - Xob_xfer_temp_tbl.Insert(stmt, lnki_id, lnki_page_id, orig_repo, orig_page_id, join_ttl, redirect_src, lnki_ext, lnki_type, orig_media_type, img_size.File_is_orig(), orig_w, orig_h, img_size.File_w(), img_size.File_h(), img_size.Html_w(), img_size.Html_h(), lnki_thumbtime, lnki_page, lnki_count); + Xob_xfer_temp_tbl.Insert(stmt, lnki_id, lnki_tier_id, lnki_page_id, orig_repo, orig_page_id, join_ttl, redirect_src, lnki_ext, lnki_type, orig_media_type, img_size.File_is_orig(), orig_w, orig_h, img_size.File_w(), img_size.File_h(), img_size.Html_w(), img_size.Html_h(), lnki_thumbtime, lnki_page, lnki_count); } } diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_temp_itm_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_itm_tst.java similarity index 95% rename from 400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_temp_itm_tst.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_itm_tst.java index 5e16def34..163e68cd0 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_temp_itm_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_itm_tst.java @@ -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 . */ -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.stores.*; import gplx.xowa.files.*; import gplx.xowa.files.repos.*; public class Xob_xfer_temp_itm_tst { @@ -106,6 +106,7 @@ class Xob_xfer_temp_itm_fxt { public static String[] Flds = new String[] { Xob_lnki_regy_tbl.Fld_lnki_ext , Xob_lnki_regy_tbl.Fld_lnki_id + , Xob_lnki_regy_tbl.Fld_lnki_tier_id , Xob_orig_regy_tbl.Fld_orig_repo , Xob_orig_regy_tbl.Fld_orig_file_ttl , Xob_orig_regy_tbl.Fld_orig_file_ext @@ -133,7 +134,7 @@ class Xob_xfer_temp_itm_fxt { public Xob_xfer_temp_itm_fxt Init_rdr_image() { GfoFldList flds = GfoFldList_.str_(Flds); nde = GfoNde_.vals_(flds, Object_.Ary - ( Xof_ext_.Id_png, 1, Xof_repo_itm.Repo_remote + ( Xof_ext_.Id_png, 1, 1, Xof_repo_itm.Repo_remote , "A.png", Xof_ext_.Id_png, "A.png", Xop_lnki_type.Id_thumb, Xob_lnki_src_tid.Tid_file , 220, 200, 1, 2, 440, 400, 3 , Xop_lnki_tkn.Upright_null, Xof_lnki_time.Null, Xof_lnki_page.Null diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_temp_tbl.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_tbl.java similarity index 73% rename from 400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_temp_tbl.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_tbl.java index 35240bf0d..af930980c 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_temp_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_tbl.java @@ -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 . */ -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 gplx.dbs.*; import gplx.dbs.engines.sqlite.*; import gplx.xowa.dbs.*; import gplx.xowa.files.*; class Xob_xfer_temp_tbl { public static void Create_table(Db_conn p) {Sqlite_engine_.Tbl_create_and_delete(p, Tbl_name, Tbl_sql);} - public static Db_stmt Insert_stmt(Db_conn p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_lnki_id, Fld_lnki_page_id, Fld_orig_repo, Fld_orig_page_id, Fld_lnki_ttl, Fld_orig_redirect_src, Fld_lnki_ext, Fld_lnki_type, Fld_orig_media_type, Fld_file_is_orig, Fld_orig_w, Fld_orig_h, Fld_file_w, Fld_file_h, Fld_html_w, Fld_html_h, Fld_lnki_time, Fld_lnki_page, Fld_lnki_count);} - public static void Insert(Db_stmt stmt, int lnki_id, int lnki_page_id, byte repo_id, int page_id, String ttl, String redirect_src, int ext_id, byte lnki_type, String orig_media_type, boolean file_is_orig, int orig_w, int orig_h, int html_w, int html_h, int file_w, int file_h, double thumbtime, int page, int count) { + public static Db_stmt Insert_stmt(Db_conn p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_lnki_id, Fld_lnki_tier_id, Fld_lnki_page_id, Fld_orig_repo, Fld_orig_page_id, Fld_lnki_ttl, Fld_orig_redirect_src, Fld_lnki_ext, Fld_lnki_type, Fld_orig_media_type, Fld_file_is_orig, Fld_orig_w, Fld_orig_h, Fld_file_w, Fld_file_h, Fld_html_w, Fld_html_h, Fld_lnki_time, Fld_lnki_page, Fld_lnki_count);} + public static void Insert(Db_stmt stmt, int lnki_id, int lnki_tier_id, int lnki_page_id, byte repo_id, int page_id, String ttl, String redirect_src, int ext_id, byte lnki_type, String orig_media_type, boolean file_is_orig, int orig_w, int orig_h, int html_w, int html_h, int file_w, int file_h, double thumbtime, int page, int count) { stmt.Clear() .Val_int(lnki_id) + .Val_int(lnki_tier_id) .Val_int(lnki_page_id) .Val_byte(repo_id) .Val_int(page_id) @@ -44,7 +45,7 @@ class Xob_xfer_temp_tbl { .Exec_insert(); } public static final String Tbl_name = "xfer_temp" - , Fld_lnki_id = "lnki_id", Fld_lnki_page_id = "lnki_page_id", Fld_lnki_ttl = "lnki_ttl", Fld_lnki_ext = "lnki_ext", Fld_lnki_type = "lnki_type" + , Fld_lnki_id = "lnki_id", Fld_lnki_tier_id = "lnki_tier_id", Fld_lnki_page_id = "lnki_page_id", Fld_lnki_ttl = "lnki_ttl", Fld_lnki_ext = "lnki_ext", Fld_lnki_type = "lnki_type" , Fld_lnki_time = "lnki_time", Fld_lnki_page = "lnki_page", Fld_lnki_count = "lnki_count" , Fld_orig_repo = "orig_repo", Fld_orig_page_id = "orig_page_id", Fld_orig_redirect_src = "orig_redirect_src", Fld_orig_media_type = "orig_media_type" , Fld_orig_w = "orig_w", Fld_orig_h = "orig_h" @@ -54,6 +55,7 @@ class Xob_xfer_temp_tbl { private static final String Tbl_sql = String_.Concat_lines_nl ( "CREATE TABLE IF NOT EXISTS xfer_temp" , "( 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_ext integer NOT NULL" diff --git a/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_xfer_update_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_update_cmd.java similarity index 85% rename from 400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_xfer_update_cmd.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_update_cmd.java index 967e5833f..002237fdf 100644 --- a/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_xfer_update_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_update_cmd.java @@ -15,20 +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 . */ -package gplx.xowa.bldrs.oimgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; import gplx.xowa.dbs.*; import gplx.xowa.files.*; import gplx.xowa.bldrs.files.*; +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.*; import gplx.xowa.dbs.*; import gplx.xowa.files.*; import gplx.xowa.bldrs.cmds.files.*; public class Xob_xfer_update_cmd extends Xob_itm_basic_base implements Xob_cmd { private Io_url prv_url; public Xob_xfer_update_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 = "oimg.xfer_update"; - public void Cmd_ini(Xob_bldr bldr) {} - public void Cmd_bgn(Xob_bldr bldr) {} + public String Cmd_key() {return Xob_cmd_keys.Key_file_xfer_update;} public void Cmd_run() { // init vars - Xodb_db_file cur_file = Xodb_db_file.init__file_make(wiki.Fsys_mgr().Root_dir()); + Xob_db_file cur_file = Xob_db_file.new__file_make(wiki.Fsys_mgr().Root_dir()); Db_conn conn = cur_file.Conn(); if (prv_url == null) { - prv_url = wiki.Appe().Fsys_mgr().File_dir().GenSubFil_nest(wiki.Domain_str(), "bldr", Xodb_db_file.Name__file_make); + prv_url = wiki.Appe().Fsys_mgr().File_dir().GenSubFil_nest(wiki.Domain_str(), "bldr", Xob_db_file.Name__file_make); } // run sql @@ -46,8 +44,10 @@ public class Xob_xfer_update_cmd extends Xob_itm_basic_base implements Xob_cmd { // Io_mgr._.CopyFil(cur_file.Url(), archive_url, true); // Io_mgr._.CopyFil(cur_file.Url(), prv_url, true); } + public void Cmd_init(Xob_bldr bldr) {} + public void Cmd_bgn(Xob_bldr bldr) {} public void Cmd_end() {} - public void Cmd_print() {} + public void Cmd_term() {} public static final String Sql_update = String_.Concat_lines_nl ( "INSERT INTO xfer_regy" , "SELECT cur.lnki_id" diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xobu_poll_mgr.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xobu_poll_mgr.java similarity index 92% rename from 400_xowa/src/gplx/xowa/bldrs/files/Xobu_poll_mgr.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/files/Xobu_poll_mgr.java index f439086d8..dfb02e6a3 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xobu_poll_mgr.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xobu_poll_mgr.java @@ -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 . */ -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 Xobu_poll_mgr implements GfoInvkAble { public Xobu_poll_mgr(Xoae_app app) {this.app = app;} private Xoae_app app; public int Poll_interval() {return poll_interval;} private int poll_interval = 1000; diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_init_base.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/Xob_init_base.java similarity index 76% rename from 400_xowa/src/gplx/xowa/bldrs/imports/Xob_init_base.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/texts/Xob_init_base.java index 615d18792..3883168db 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_init_base.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/Xob_init_base.java @@ -15,22 +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 . */ -package gplx.xowa.bldrs.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.xowa.wikis.*; import gplx.xowa.xtns.wdatas.*; import gplx.xowa.bldrs.xmls.*; +package gplx.xowa.bldrs.cmds.texts; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; +import gplx.xowa.wikis.*; import gplx.xowa.xtns.wdatas.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.xmls.*; public abstract class Xob_init_base implements Xob_cmd, GfoInvkAble { - public Xob_init_base Ctor(Xob_bldr bldr, Xowe_wiki wiki) {this.bldr = bldr; this.wiki = wiki; this.usr_dlg = wiki.Appe().Usr_dlg(); return this;} private Xob_bldr bldr; Xowe_wiki wiki; Gfo_usr_dlg usr_dlg; + private Xob_bldr bldr; private Xowe_wiki wiki; private Gfo_usr_dlg usr_dlg; + private byte wbase_enabled = Bool_.__byte; + public Xob_init_base Ctor(Xob_bldr bldr, Xowe_wiki wiki) {this.bldr = bldr; this.wiki = wiki; this.usr_dlg = wiki.Appe().Usr_dlg(); return this;} public abstract String Cmd_key(); public abstract void Cmd_ini_wdata(Xob_bldr bldr, Xowe_wiki wiki); public abstract void Cmd_run_end(Xowe_wiki wiki); - public void Cmd_ini(Xob_bldr bldr) { // add other cmds; EX: wikidata - Xob_import_marker.Import_bgn(wiki); - if (wdata_enabled == Bool_.__byte) wdata_enabled = wiki.Domain_tid() == Xow_domain_.Tid_int_wikidata ? Bool_.Y_byte : Bool_.N_byte; // if wdata_enabled not explicitly set, set it to y if wiki is "www.wikidata.org" - if (wdata_enabled == Bool_.Y_byte) // if wdata_enabled, auto-add wdata_wkrs bldr + public void Cmd_init(Xob_bldr bldr) { // add other cmds; EX: wikidata + bldr.Import_marker().Bgn(wiki); + if (wbase_enabled == Bool_.__byte) wbase_enabled = wiki.Domain_tid() == Xow_domain_.Tid_int_wikidata ? Bool_.Y_byte : Bool_.N_byte; // if wbase_enabled not explicitly set, set it to y if wiki is "www.wikidata.org" + if (wbase_enabled == Bool_.Y_byte) // if wbase_enabled, auto-add wdata_wkrs bldr this.Cmd_ini_wdata(bldr, wiki); - } private byte wdata_enabled = Bool_.__byte; + } public void Cmd_bgn(Xob_bldr bldr) {} public void Cmd_run() { // parse site_info gplx.ios.Io_stream_rdr src_rdr = wiki.Import_cfg().Src_rdr(); + usr_dlg.Plog_many("", "", "reading dump header: ~{0}", src_rdr.Url().Raw()); byte[] siteinfo_xml = Xob_siteinfo_parser.Siteinfo_extract(src_rdr); Xob_siteinfo_parser.Siteinfo_parse(wiki, usr_dlg, String_.new_utf8_(siteinfo_xml)); this.Cmd_run_end(wiki); // save site info @@ -43,11 +46,11 @@ public abstract class Xob_init_base implements Xob_cmd, GfoInvkAble { Io_mgr._.DeleteFil_args(url).MissingFails_off().Exec(); } } - public void Cmd_print() {} + public void Cmd_term() {} @gplx.Virtual public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_src_xml_fil_)) wiki.Import_cfg().Src_fil_xml_(m.ReadIoUrl("v")); else if (ctx.Match(k, Invk_src_bz2_fil_)) wiki.Import_cfg().Src_fil_bz2_(m.ReadIoUrl("v")); - else if (ctx.Match(k, Invk_wdata_enabled_)) wdata_enabled = m.ReadYn("v") ? Bool_.Y_byte : Bool_.N_byte; + else if (ctx.Match(k, Invk_wdata_enabled_)) wbase_enabled = m.ReadYn("v") ? Bool_.Y_byte : Bool_.N_byte; else if (ctx.Match(k, Invk_owner)) return bldr.Cmd_mgr(); else return GfoInvkAble_.Rv_unhandled; return this; diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_base.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/Xob_search_base.java similarity index 89% rename from 400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_base.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/texts/Xob_search_base.java index 084e836cb..d50c0c9f1 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_base.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/Xob_search_base.java @@ -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 . */ -package gplx.xowa.bldrs.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; +package gplx.xowa.bldrs.cmds.texts; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.core.primitives.*; import gplx.ios.*; -import gplx.xowa.wikis.data.*; import gplx.xowa.dbs.*; import gplx.xowa.tdbs.*; +import gplx.xowa.wikis.data.*; import gplx.xowa.dbs.*; import gplx.xowa.tdbs.*; import gplx.xowa.wikis.data.tbls.*; public abstract class Xob_search_base extends Xob_itm_dump_base implements Xobd_wkr, GfoInvkAble { public abstract String Wkr_key(); public abstract Io_make_cmd Make_cmd_site(); @@ -31,7 +31,7 @@ public abstract class Xob_search_base extends Xob_itm_dump_base implements Xobd_ if (wiki.Db_mgr().Tid() == Xodb_mgr_sql.Tid_sql) // if sqlite, hard-code to ns_main; aggregates all ns into one ns_main = wiki.Ns_mgr().Ns_main(); } private Xob_tmp_wtr_mgr tmp_wtr_mgr; private Xow_ns ns_main; - public void Wkr_run(Xodb_page page) { + public void Wkr_run(Xowd_page_itm page) { // if (page.Ns_id() != Xow_ns_.Id_main) return; // limit to main ns for now try { byte[] ttl = page.Ttl_page_db(); @@ -48,7 +48,7 @@ public abstract class Xob_search_base extends Xob_itm_dump_base implements Xobd_ byte[] word = words[i]; wtr.Bfr() .Add(word) .Add_byte(Byte_ascii.Pipe) .Add_base85_len_5(page.Id()) .Add_byte(Byte_ascii.Semic) - .Add_base85_len_5(page.Wtxt().length) .Add_byte(Byte_ascii.NewLine); + .Add_base85_len_5(page.Text().length) .Add_byte(Byte_ascii.NewLine); } } catch (Exception e) {bldr.Usr_dlg().Warn_many("", "", "search_index:fatal error: err=~{0}", Err_.Message_gplx_brief(e));} // never let single page crash entire import } @@ -58,10 +58,6 @@ public abstract class Xob_search_base extends Xob_itm_dump_base implements Xobd_ Xobdc_merger.Ns(bldr.Usr_dlg(), tmp_wtr_mgr.Regy(), Xotdb_dir_info_.Name_search_ttl, temp_dir, make_dir, sort_mem_len, Io_line_rdr_key_gen_.first_pipe, this.Make_cmd_site()); tmp_wtr_mgr.Rls_all(); if (delete_temp) Io_mgr._.DeleteDirDeep(temp_dir); - if (wiki.Db_mgr().Tid() == Xodb_mgr_sql.Tid_sql) { - Xowe_core_data_mgr core_data_mgr = (Xowe_core_data_mgr)wiki.Data_mgr__core_mgr(); - core_data_mgr.Dbs__save(); // always save files now; need to commit created search_db_idx to xowa_db, else will be reused by ctg v2; DATE:2014-02-07 - } } public void Wkr_print() {} OrderedHash list = OrderedHash_.new_(); Xol_lang lang; diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_term_base.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/Xob_term_base.java similarity index 81% rename from 400_xowa/src/gplx/xowa/bldrs/imports/Xob_term_base.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/texts/Xob_term_base.java index 5f8da6b4c..37c95b0e5 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_term_base.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/Xob_term_base.java @@ -15,13 +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 . */ -package gplx.xowa.bldrs.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.xowa.xtns.wdatas.*; import gplx.xowa.dbs.tbls.*; import gplx.xowa.dbs.*; -import gplx.xowa.bldrs.xmls.*; +package gplx.xowa.bldrs.cmds.texts; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; +import gplx.xowa.bldrs.xmls.*; import gplx.xowa.xtns.wdatas.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.dbs.*; public abstract class Xob_term_base implements Xob_cmd, GfoInvkAble { public Xob_term_base Ctor(Xob_bldr bldr, Xowe_wiki wiki) {this.wiki = wiki; return this;} private Xowe_wiki wiki; public abstract String Cmd_key(); - public void Cmd_ini(Xob_bldr bldr) {} + public void Cmd_init(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) {} public void Cmd_run() {} public void Cmd_end() { @@ -29,13 +28,13 @@ public abstract class Xob_term_base implements Xob_cmd, GfoInvkAble { app.Gui_mgr().Html_mgr().Portal_mgr().Wikis().Itms_reset(); // NOTE: dirty wiki list so that next refresh will load itm app.Free_mem(false); // clear cache, else import will load new page with old items from cache; DATE:2013-11-21 wiki.Props().Main_page_update(wiki); - Xob_import_marker.Import_end(wiki); + app.Bldr().Import_marker().End(wiki); wiki.Init_needed_(true);// flag init_needed prior to show; dir_info will show page_txt instead of page_gz; wiki.Init_assert(); // force load; needed to pick up MediaWiki ns for MediaWiki:mainpage Cmd_end_hook(); } public abstract void Cmd_end_hook(); - public void Cmd_print() {} + public void Cmd_term() {} public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { return this; } diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_css_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_css_cmd.java new file mode 100644 index 000000000..bb0f68d95 --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_css_cmd.java @@ -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 . +*/ +package gplx.xowa.bldrs.cmds.texts.sqls; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; +import gplx.xowa.bldrs.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; +public class Xob_css_cmd implements Xob_cmd { + private final Xob_bldr bldr; private final Xowe_wiki wiki; private final Gfo_usr_dlg usr_dlg; + public Xob_css_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.bldr = bldr; this.wiki = wiki; this.usr_dlg = wiki.Appe().Usr_dlg();} + public String Cmd_key() {return Xob_cmd_keys.Key_text_css;} + public void Cmd_init(Xob_bldr bldr) {} + public void Cmd_bgn(Xob_bldr bldr) {} + public void Cmd_run() { + usr_dlg.Plog_many("", "", Cmd_key() + ":bgn;"); + Io_url css_dir = bldr.App().User().Fsys_mgr().Wiki_html_dir(wiki.Domain_str()); // EX: /xowa/user/anonymous/wiki/en.wikipedia.org + bldr.App().Css_installer().Install_assert(Bool_.N, wiki, css_dir); + usr_dlg.Plog_many("", "", Cmd_key() + ":css_dir; dir=~{0}", css_dir.Raw()); + wiki.Init_db_mgr();// NOTE: must follow Install_assert b/c Init_assert also calls Install_assert; else will download any css from db + Xowd_db_file core_db = wiki.Db_mgr_as_sql().Core_data_mgr().Db__core(); + core_db.Conn().Txn_bgn(); + core_db.Tbl__css_core().Create_tbl(); + core_db.Tbl__css_file().Create_tbl(); + gplx.xowa.html.css.Xowd_css_core_mgr.Set(core_db.Tbl__css_core(), core_db.Tbl__css_file(), css_dir); + core_db.Tbl__cfg().Insert_yn(Xow_cfg_consts.Grp__wiki_schema, Xow_cfg_consts.Key__schema__tbl_css_core, Bool_.Y); + core_db.Conn().Txn_end(); + usr_dlg.Plog_many("", "", Cmd_key() + ":end;"); + } + public void Cmd_end() {} + public void Cmd_term() {} + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {return GfoInvkAble_.Rv_unhandled;} +} diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_init_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_init_cmd.java new file mode 100644 index 000000000..91e2da5e6 --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_init_cmd.java @@ -0,0 +1,33 @@ +/* +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 . +*/ +package gplx.xowa.bldrs.cmds.texts.sqls; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; +import gplx.xowa.bldrs.*; import gplx.xowa.apis.xowa.bldrs.imports.*; +import gplx.xowa.xtns.wdatas.imports.*; +public class Xob_init_cmd extends Xob_init_base { + public Xob_init_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.Ctor(bldr, wiki);} + @Override public String Cmd_key() {return Xob_cmd_keys.Key_text_init;} + @Override public void Cmd_ini_wdata(Xob_bldr bldr, Xowe_wiki wiki) { + bldr.Cmd_mgr().Add_cmd(wiki, Xob_cmd_keys.Key_wbase_qid); + bldr.Cmd_mgr().Add_cmd(wiki, Xob_cmd_keys.Key_wbase_pid); + } + @Override public void Cmd_run_end(Xowe_wiki wiki) { + if (gplx.xowa.wikis.Xow_fsys_mgr.Find_core_fil(wiki) != null) + throw wiki.Appe().Bldr().Usr_dlg().Fail_many("", "", "directory must not contain any .xowa or .sqlite3 files: dir=~{0}", wiki.Fsys_mgr().Root_dir().Raw()); + Xowe_wiki_bldr.Create(wiki, wiki.Import_cfg().Src_rdr_len(), wiki.Import_cfg().Src_fil().NameOnly()); + } +} diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_cmd.java new file mode 100644 index 000000000..52eb6a0ea --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_cmd.java @@ -0,0 +1,111 @@ +/* +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 . +*/ +package gplx.xowa.bldrs.cmds.texts.sqls; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; +import gplx.dbs.*; import gplx.ios.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.wikis.*; +import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.dbs.*; +import gplx.xowa.wikis.*; import gplx.xowa.bldrs.filters.dansguardians.*; import gplx.xowa.apis.xowa.bldrs.imports.*; +public class Xob_page_cmd extends Xob_itm_basic_base implements Xobd_wkr, GfoInvkAble { + private Xowd_db_mgr db_mgr; private Db_idx_mode idx_mode = Db_idx_mode.Itm_end; private Xowd_page_tbl page_core_tbl; private Io_stream_zip_mgr text_zip_mgr; private byte text_zip_tid; + private Xop_redirect_mgr redirect_mgr; private Xob_redirect_tbl redirect_tbl; private boolean redirect_id_enabled; + private DateAdp modified_latest = DateAdp_.MinValue; private int page_count_all, page_count_main = 0; private int commit_interval = 100000; // 100 k + private Dg_match_mgr dg_match_mgr; private final Xow_page_mgr page_mgr; private Xob_ns_to_db_mgr ns_to_db_mgr; + public Xob_page_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki); this.page_mgr = wiki.Page_mgr();} + public String Wkr_key() {return Xob_cmd_keys.Key_text_page;} + public void Wkr_bgn(Xob_bldr bldr) { + Xoae_app app = wiki.Appe(); + Xoapi_import import_cfg = app.Api_root().Bldr().Wiki().Import(); + this.redirect_mgr = wiki.Redirect_mgr(); + this.db_mgr = wiki.Db_mgr_as_sql().Core_data_mgr(); + this.page_core_tbl = db_mgr.Tbl__page(); + this.text_zip_mgr = Xoa_app_.Utl__zip_mgr(); text_zip_tid = import_cfg.Zip_tid_text(); + this.ns_to_db_mgr = new Xob_ns_to_db_mgr(new Xob_ns_to_db_wkr__text(), db_mgr, import_cfg.Text_db_max()); + if (redirect_id_enabled) { + this.redirect_tbl = new Xob_redirect_tbl(wiki.Fsys_mgr().Root_dir(), Xoa_app_.Utl__encoder_mgr().Url_ttl()).Create_table(); + redirect_tbl.Conn().Txn_bgn(); + } + this.dg_match_mgr = app.Api_root().Bldr().Wiki().Filter().Dansguardian().New_mgr(wiki.Domain_str(), wiki.Fsys_mgr().Root_dir()); + app.Bldr().Dump_parser().Trie_tab_del_(); // disable swapping for \t + byte[] ns_file_map = import_cfg.New_ns_file_map(wiki.Import_cfg().Src_rdr_len()); + Xob_ns_file_itm.Init_ns_bldr_data(Xowd_db_file_.Tid_text, wiki.Ns_mgr(), ns_file_map); + if (idx_mode.Tid_is_bgn()) page_core_tbl.Create_index(); + page_core_tbl.Insert_bgn(); + usr_dlg.Prog_many("", "", "import.page.bgn"); + } + public void Wkr_run(Xowd_page_itm page) { + int id = page.Id(); + DateAdp modified = page.Modified_on(); if (modified.compareTo(modified_latest) == CompareAble_.More) modified_latest = modified; + byte[] text_raw = page.Text(); int text_raw_len = page.Text_len(); + Xoa_ttl redirect_ttl = redirect_mgr.Extract_redirect(text_raw, text_raw_len); boolean redirect = redirect_ttl != null; + page.Redirected_(redirect); + Xow_ns ns = page.Ns(); + int random_int = ns.Count() + 1; ns.Count_(random_int); + if (dg_match_mgr != null) { + if (dg_match_mgr.Match(1, id, ns.Id(), page.Ttl_page_db(), page.Ttl_full_db(), wiki.Lang(), text_raw)) return; + } + byte[] text_zip = text_zip_mgr.Zip(text_zip_tid, text_raw); + Xowd_db_file text_db = ns_to_db_mgr.Get_by_ns(ns.Bldr_data(), text_zip.length); + page_mgr.Create(page_core_tbl, text_db.Tbl__text(), id, page.Ns_id(), page.Ttl_page_db(), redirect, modified, text_zip, text_raw_len, random_int, text_db.Id(), -1); + if (redirect && redirect_id_enabled) + redirect_tbl.Insert(id, page.Ttl_page_db(), redirect_ttl); + ++page_count_all; + if (ns.Id_main() && !page.Redirected()) ++page_count_main; + if (page_count_all % commit_interval == 0) { + page_core_tbl.Conn().Txn_sav(); text_db.Conn().Txn_sav(); + if (redirect_id_enabled) redirect_tbl.Conn().Txn_sav(); + if (dg_match_mgr != null) dg_match_mgr.Commit(); + } + } + public void Wkr_end() { + usr_dlg.Log_many("", "", "import.page: insert done; committing pages; pages=~{0}", page_count_all); + page_core_tbl.Insert_end(); ns_to_db_mgr.Rls_all(); + if (dg_match_mgr != null) dg_match_mgr.Rls(); + usr_dlg.Log_many("", "", "import.page: updating core stats"); + Xow_ns_mgr ns_mgr = wiki.Ns_mgr(); + Xowd_db_file db_core = db_mgr.Db__core(); + db_core.Tbl__site_stats().Update(page_count_main, page_count_all, ns_mgr.Ns_file().Count()); // save page stats + db_core.Tbl__ns().Insert(ns_mgr); // save ns + db_mgr.Tbl__cfg().Insert_str(Xow_cfg_consts.Grp_wiki_init, "props.modified_latest", modified_latest.XtoStr_fmt(DateAdp_.Fmt_iso8561_date_time)); + if (idx_mode.Tid_is_end()) page_core_tbl.Create_index(); + if (redirect_id_enabled) { + redirect_tbl.Conn().Txn_end(); + redirect_tbl.Update_trg_redirect_id(db_core.Url(), 1); + redirect_tbl.Update_src_redirect_id(db_core.Url(), page_core_tbl.Conn()); + } + } + @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk_commit_interval_)) commit_interval = m.ReadInt("v"); + else if (ctx.Match(k, Invk_idx_mode_)) idx_mode = Db_idx_mode.Xto_itm(m.ReadStr("v")); + else if (ctx.Match(k, Invk_redirect_id_enabled_)) redirect_id_enabled = m.ReadYn("v"); + else return super.Invk(ctx, ikey, k, m); + return this; + } + private static final String Invk_commit_interval_ = "commit_interval_", Invk_idx_mode_ = "idx_mode_", Invk_redirect_id_enabled_ = "redirect_id_enabled_"; + public void Wkr_ini(Xob_bldr bldr) {} + public void Wkr_print() {} +} +class Xob_ns_to_db_wkr__text implements Xob_ns_to_db_wkr { + public byte Db_tid() {return Xowd_db_file_.Tid_text;} + public void Tbl_init(Xowd_db_file db) { + Xowd_text_tbl tbl = db.Tbl__text(); + tbl.Create_tbl(); + tbl.Insert_bgn(); + } + public void Tbl_term(Xowd_db_file db) { + db.Tbl__text().Insert_end(); + } +} diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_page_sql_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_cmd_tst.java similarity index 77% rename from 400_xowa/src/gplx/xowa/bldrs/imports/Xob_page_sql_tst.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_cmd_tst.java index 170303748..3d4b0fe81 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_page_sql_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_cmd_tst.java @@ -15,19 +15,20 @@ 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 . */ -package gplx.xowa.bldrs.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import org.junit.*; import gplx.dbs.*; import gplx.xowa.specials.search.*; import gplx.xowa.bldrs.imports.ctgs.*; -public class Xob_page_sql_tst { +package gplx.xowa.bldrs.cmds.texts.sqls; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; +import org.junit.*; import gplx.dbs.*; import gplx.xowa.specials.search.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.ctgs.*; +public class Xob_page_cmd_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.Bldr().App().Api_root().Bldr().Wiki().Import().Zip_tid_text_raw_(); fxt.doc_ary_ ( fxt.doc_(2, "2013-06-03 01:23", "A", "text_a") , fxt.doc_(1, "2013-06-03 12:34", "B", "#REDIRECT [[A]]") ) - .Exec_run(new Xob_page_sql(fxt.Bldr(), fxt.Wiki())) + .Exec_run(new Xob_page_cmd(fxt.Bldr(), fxt.Wiki())) ; fxt.Test_load_ttl(Xow_ns_.Id_main, "A", fxt.page_(2, "2013-06-03 01:23", false, 6)); fxt.Test_load_page(Xow_ns_.Id_main, 2, "text_a"); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_search_sql_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_search_sql_cmd.java new file mode 100644 index 000000000..efd7dd2e0 --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_search_sql_cmd.java @@ -0,0 +1,85 @@ +/* +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 . +*/ +package gplx.xowa.bldrs.cmds.texts.sqls; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; +import gplx.xowa.wikis.data.*; import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; import gplx.xowa.dbs.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.bldrs.*; +public class Xob_search_sql_cmd extends Xob_itm_basic_base implements Xob_cmd { // search version 2; upgrade + private int commit_interval = 100000, progress_interval = 10000; + public Xob_search_sql_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} + public String Cmd_key() {return Xob_cmd_keys.Key_text_search_cmd;} + public void Cmd_init(Xob_bldr bldr) {} + public void Cmd_bgn(Xob_bldr bldr) {} + public void Cmd_run() {this.Exec(wiki);} + public void Cmd_end() {} + public void Cmd_term() {} + public void Exec(Xowe_wiki wiki) { + if (!Env_.Mode_testing()) wiki.Init_assert(); + Xowd_db_mgr db_mgr = wiki.Db_mgr_as_sql().Core_data_mgr(); + db_mgr.Dbs__delete_by_tid(Xowd_db_file_.Tid_search_core); + Xowd_db_file search_db = Xob_search_sql_cmd.Dbs__get_or_make(db_mgr); + Db_conn search_conn = search_db.Conn(); + Xowd_search_temp_tbl search_temp_tbl = new Xowd_search_temp_tbl(search_conn, db_mgr.Props().Schema_is_1()); + search_temp_tbl.Create_tbl(); + search_temp_tbl.Insert_bgn(); + Xowd_page_tbl page_tbl = db_mgr.Tbl__page(); + Db_rdr page_rdr = page_tbl.Select_all(); + try { + Xol_lang lang = wiki.Lang(); + Bry_bfr bfr = Bry_bfr.reset_(1024); + OrderedHash hash = OrderedHash_.new_(); + int page_count = 0; + String fld_page_id = page_tbl.Fld_page_id(), fld_page_ttl = page_tbl.Fld_page_title(); + while (page_rdr.Move_next()) { + int page_id = page_rdr.Read_int(fld_page_id); + byte[] ttl = page_rdr.Read_bry_by_str(fld_page_ttl); + byte[][] words = Xob_search_base.Split(lang, hash, bfr, ttl); + int words_len = words.length; + for (int i = 0; i < words_len; i++) { + byte[] word = words[i]; + search_temp_tbl.Insert_cmd_by_batch(page_id, word); + } + ++page_count; + if ((page_count % commit_interval) == 0) + Commit(search_conn); + else if ((page_count % progress_interval) == 0) + usr_dlg.Prog_many("", "", "parse progress: count=~{0} last=~{1}", page_count, String_.new_utf8_(ttl)); + } + this.Commit(search_conn); + } + finally {page_rdr.Rls();} + search_conn.Txn_end(); + search_temp_tbl.Make_data(usr_dlg, db_mgr.Db__search().Tbl__search_link(), db_mgr.Db__search().Tbl__search_word()); + } + private void Commit(Db_conn search_conn) { + search_conn.Txn_sav(); + } + @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + 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 return GfoInvkAble_.Rv_unhandled; + return this; + } private static final String Invk_progress_interval_ = "progress_interval_", Invk_commit_interval_ = "commit_interval_"; + public static Xowd_db_file Dbs__get_or_make(Xowd_db_mgr db_mgr) { + Xowd_db_file db = db_mgr.Props().Layout_text().Tid_is_all_or_few() + ? db_mgr.Db__core() + : db_mgr.Dbs__make_by_tid(Xowd_db_file_.Tid_search_core) + ; + db.Tbl__search_word().Create_tbl(); + db.Tbl__search_link().Create_tbl(); + return db; + } +} diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_sql_cmd_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_search_sql_cmd_tst.java similarity index 75% rename from 400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_sql_cmd_tst.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_search_sql_cmd_tst.java index c11a67b8b..1a8ada21e 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_sql_cmd_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_search_sql_cmd_tst.java @@ -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 . */ -package gplx.xowa.bldrs.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import org.junit.*; import gplx.dbs.*; import gplx.xowa.specials.search.*; import gplx.xowa.bldrs.imports.ctgs.*; +package gplx.xowa.bldrs.cmds.texts.sqls; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; +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.ctgs.*; +import gplx.xowa.wikis.data.tbls.*; public class Xob_search_sql_cmd_tst { - @Before public void init() {if (Xoa_test_.Db_skip()) return; fxt.Ctor_fsys();} private Db_mgr_fxt fxt = new Db_mgr_fxt(); + @Before public void init() {if (Xoa_test_.Db_skip()) return; fxt.Ctor_fsys();} private final 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; @@ -27,7 +28,7 @@ public class Xob_search_sql_cmd_tst { ( fxt.doc_ttl_(2, "A b") , fxt.doc_ttl_(1, "B c") ) - .Exec_run(new Xob_page_sql(fxt.Bldr(), fxt.Wiki())) + .Exec_run(new Xob_page_cmd(fxt.Bldr(), fxt.Wiki())) .Exec_run(new Xob_search_sql_cmd(fxt.Bldr(), fxt.Wiki())) ; fxt.Test_search("a", 2); @@ -43,7 +44,7 @@ public class Xob_search_sql_cmd_tst { , fxt.doc_ttl_(2, "A2") , fxt.doc_ttl_(3, "A3") ) - .Exec_run(new Xob_page_sql(fxt.Bldr(), fxt.Wiki())) + .Exec_run(new Xob_page_cmd(fxt.Bldr(), fxt.Wiki())) .Exec_run(new Xob_search_sql_cmd(fxt.Bldr(), fxt.Wiki())) ; fxt.Test_search("a*", 1, 2, 3); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_search_sql_wkr.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_search_sql_wkr.java new file mode 100644 index 000000000..330992a6c --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_search_sql_wkr.java @@ -0,0 +1,52 @@ +/* +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 . +*/ +package gplx.xowa.bldrs.cmds.texts.sqls; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; +import gplx.ios.*; +import gplx.xowa.wikis.data.*; import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; import gplx.xowa.dbs.*; import gplx.xowa.wikis.data.tbls.*; +public class Xob_search_sql_wkr extends Xob_search_base implements Io_make_cmd { // search version 2 + private Xowd_db_mgr db_mgr; private Xowd_search_link_tbl search_page_tbl; private Xowd_search_word_tbl search_word_tbl; + private int search_id = 0; private byte[] prv_word = Bry_.Empty; + public Xob_search_sql_wkr(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} + @Override public String Wkr_key() {return Xob_cmd_keys.Key_text_search_wkr;} + @Override public gplx.ios.Io_make_cmd Make_cmd_site() {return this;} + public Io_sort_cmd Make_dir_(Io_url v) {return this;} // noop + public void Sort_bgn() { + this.usr_dlg = Xoa_app_.Usr_dlg(); + this.db_mgr = wiki.Db_mgr_as_sql().Core_data_mgr(); + Xob_search_sql_cmd.Dbs__get_or_make(db_mgr); + this.search_page_tbl = db_mgr.Db__search().Tbl__search_link(); + this.search_word_tbl = db_mgr.Db__search().Tbl__search_word(); + search_page_tbl.Insert_bgn(); search_word_tbl.Insert_bgn(); + } + public void Sort_do(Io_line_rdr rdr) { + byte[] bry = rdr.Bfr(); + byte[] cur_word = Bry_.Mid(bry, rdr.Key_pos_bgn(), rdr.Key_pos_end()); + if (!Bry_.Eq(cur_word, prv_word)) { + search_word_tbl.Insert_cmd_by_batch(++search_id, cur_word); + prv_word = cur_word; + } + search_page_tbl.Insert_cmd_by_batch(search_id, Base85_utl.XtoIntByAry(bry, rdr.Key_pos_end() + 1, rdr.Key_pos_end() + 5)); // -1: ignore rdr_dlm + if (search_id % 10000 == 0) + usr_dlg.Prog_many("", "", "creating title index: count=~{0}", search_id); + } + public void Sort_end() { + search_page_tbl.Insert_end(); search_word_tbl.Insert_end(); + Xowd_search_temp_tbl search_temp_tbl = new Xowd_search_temp_tbl(db_mgr.Db__search().Conn(), db_mgr.Props().Schema_is_1()); + search_temp_tbl.Create_idx(usr_dlg, search_page_tbl, search_word_tbl); + } +} diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_term_sql.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_term_cmd.java similarity index 50% rename from 400_xowa/src/gplx/xowa/bldrs/imports/Xob_term_sql.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_term_cmd.java index 49f1c4113..caddb8256 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_term_sql.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_term_cmd.java @@ -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 . */ -package gplx.xowa.bldrs.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.xowa.dbs.*; -public class Xob_term_sql extends Xob_term_base { - public Xob_term_sql(Xob_bldr bldr, Xowe_wiki wiki) {this.Ctor(bldr, wiki); this.wiki = wiki;} private Xowe_wiki wiki; - @Override public String Cmd_key() {return KEY;} public static final String KEY = "import.sql.term"; +package gplx.xowa.bldrs.cmds.texts.sqls; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; +import gplx.dbs.cfgs.*; import gplx.xowa.dbs.*; import gplx.xowa.wikis.*; +public class Xob_term_cmd extends Xob_term_base { + public Xob_term_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.Ctor(bldr, wiki); this.wiki = wiki;} private Xowe_wiki wiki; + @Override public String Cmd_key() {return KEY;} public static final String KEY = "text.term"; @Override public void Cmd_end_hook() { Io_mgr._.DeleteDirDeep(wiki.Fsys_mgr().Tmp_dir()); - Xodb_mgr_sql db_mgr = wiki.Db_mgr_as_sql(); - db_mgr.Tbl_xowa_cfg().Insert_bry_as_str (Xodb_mgr_sql.Grp_wiki_init, "props.bldr_version", wiki.Props().Bldr_version()); - db_mgr.Tbl_xowa_cfg().Insert_bry_as_str (Xodb_mgr_sql.Grp_wiki_init, "props.main_page", wiki.Props().Main_page()); - db_mgr.Tbl_xowa_cfg().Insert_bry_as_str (Xodb_mgr_sql.Grp_wiki_init, "props.siteinfo_misc", wiki.Props().Siteinfo_misc()); - db_mgr.Tbl_xowa_cfg().Insert_bry_as_str (Xodb_mgr_sql.Grp_wiki_init, "props.siteinfo_mainpage", wiki.Props().Siteinfo_mainpage()); - wiki.Db_mgr_as_sql().Core_data_mgr().Rls(); + Db_cfg_tbl cfg_tbl = wiki.Data_mgr__core_mgr().Tbl__cfg(); + cfg_tbl.Insert_bry(Xow_cfg_consts.Grp_wiki_init, "props.bldr_version", wiki.Props().Bldr_version()); + cfg_tbl.Insert_bry(Xow_cfg_consts.Grp_wiki_init, "props.main_page", wiki.Props().Main_page()); + cfg_tbl.Insert_bry(Xow_cfg_consts.Grp_wiki_init, "props.siteinfo_misc", wiki.Props().Siteinfo_misc()); + cfg_tbl.Insert_bry(Xow_cfg_consts.Grp_wiki_init, "props.siteinfo_mainpage", wiki.Props().Siteinfo_mainpage()); + wiki.Data_mgr__core_mgr().Rls(); } } diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xobc_core_calc_stats.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_calc_stats_cmd.java similarity index 83% rename from 400_xowa/src/gplx/xowa/bldrs/imports/Xobc_core_calc_stats.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_calc_stats_cmd.java index 7934614eb..8f26c6f79 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xobc_core_calc_stats.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_calc_stats_cmd.java @@ -15,16 +15,16 @@ 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 . */ -package gplx.xowa.bldrs.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.xowa.bldrs.*; import gplx.xowa.tdbs.*; -public class Xobc_core_calc_stats extends Xob_itm_basic_base implements Xob_cmd { - public Xobc_core_calc_stats(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} - public String Cmd_key() {return KEY;} public static final String KEY = "core.calc_stats"; - public void Cmd_ini(Xob_bldr bldr) {} +package gplx.xowa.bldrs.cmds.texts.tdbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; +import gplx.xowa.tdbs.*; import gplx.xowa.wikis.data.tbls.*; +public class Xob_calc_stats_cmd extends Xob_itm_basic_base implements Xob_cmd { + public Xob_calc_stats_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} + public String Cmd_key() {return Xob_cmd_keys.Key_tdb_calc_stats;} + public void Cmd_init(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) {} public void Cmd_run() {Exec();} public void Cmd_end() {} - public void Cmd_print() {} + public void Cmd_term() {} private void Exec() { int ns_len = wiki.Ns_mgr().Ords_len(); int total = 0; @@ -45,7 +45,7 @@ public class Xobc_core_calc_stats extends Xob_itm_basic_base implements Xob_cmd Xow_ns ns = wiki.Ns_mgr().Ords_ary()[i]; if (ns.Id() < 0) continue; bfr.Add_byte_nl(); - Gen_call(Bool_.N, bfr, Xow_wiki_stats.Invk_number_of_articles_in_ns_, ns.Num_str(), Int_.Xto_str_pad_bgn(ns.Count(), 10)); + Gen_call(Bool_.N, bfr, Xow_wiki_stats.Invk_number_of_articles_in_ns_, ns.Num_str(), Int_.Xto_str_pad_bgn_zero(ns.Count(), 10)); } bfr.Add_byte_nl().Add_byte(Byte_ascii.Semic).Add_byte_nl(); Io_url wiki_gfs = Wiki_gfs_url(wiki); @@ -98,11 +98,11 @@ public class Xobc_core_calc_stats extends Xob_itm_basic_base implements Xob_cmd int rv = 0; byte[] bry = Io_mgr._.LoadFilBry(fil); Xob_xdat_file xdat_file = new Xob_xdat_file().Parse(bry, bry.length, fil); - Xodb_page page = Xodb_page.new_tmp(); + Xowd_page_itm page = Xowd_page_itm.new_tmp(); int count = xdat_file.Count(); for (int i = 0; i < count; i++) { byte[] ttl_bry = xdat_file.Get_bry(i); - Xodb_page_.Txt_ttl_load(page, ttl_bry); + Xotdb_page_itm_.Txt_ttl_load(page, ttl_bry); rv += page.Redirected() ? 0 : 1; } return rv; diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_init_base_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_init_base_tst.java similarity index 87% rename from 400_xowa/src/gplx/xowa/bldrs/imports/Xob_init_base_tst.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_init_base_tst.java index 4ac502b60..ed8793df5 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_init_base_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_init_base_tst.java @@ -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 . */ -package gplx.xowa.bldrs.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; +package gplx.xowa.bldrs.cmds.texts.tdbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; import org.junit.*; import gplx.xowa.html.portal.*; import gplx.xowa.wikis.xwikis.*; public class Xob_init_base_tst { @Before public void init() {fxt.Clear();} private Xob_init_base_fxt fxt = new Xob_init_base_fxt(); @@ -26,7 +26,7 @@ public class Xob_init_base_tst { Xow_xwiki_itm xwiki_itm = app.User().Wiki().Xwiki_mgr().Add_full("en.wikipedia.org", "en.wikipedia.org"); xwiki_itm.Offline_(Bool_.Y); // simulate add via Available_from_fsys; DATE:2014-09-21 Tfds.Eq("", wikis_list.Itms_as_html()); // still empty - new Xob_init_txt(app.Bldr(), wiki).Cmd_end(); // mock "init" task + new Xob_init_tdb(app.Bldr(), wiki).Cmd_end(); // mock "init" task Tfds.Eq("\n
  • en.wikipedia.org
  • ", wikis_list.Itms_as_html()); // no longer empty } } diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_init_txt.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_init_tdb.java similarity index 63% rename from 400_xowa/src/gplx/xowa/bldrs/imports/Xob_init_txt.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_init_tdb.java index 1aabda2f6..17b8b7162 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_init_txt.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_init_tdb.java @@ -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 . */ -package gplx.xowa.bldrs.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; +package gplx.xowa.bldrs.cmds.texts.tdbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; import gplx.xowa.xtns.wdatas.imports.*; -public class Xob_init_txt extends Xob_init_base { - public Xob_init_txt(Xob_bldr bldr, Xowe_wiki wiki) {this.Ctor(bldr, wiki);} - @Override public String Cmd_key() {return KEY;} public static final String KEY = "core.init"; +public class Xob_init_tdb extends Xob_init_base { + public Xob_init_tdb(Xob_bldr bldr, Xowe_wiki wiki) {this.Ctor(bldr, wiki);} + @Override public String Cmd_key() {return Xob_cmd_keys.Key_tdb_text_init;} @Override public void Cmd_ini_wdata(Xob_bldr bldr, Xowe_wiki wiki) { - bldr.Cmd_mgr().Add_cmd(wiki, Xob_wdata_qid_txt.KEY); - bldr.Cmd_mgr().Add_cmd(wiki, Xob_wdata_pid_txt.KEY); + bldr.Cmd_mgr().Add_cmd(wiki, Xob_cmd_keys.Key_tdb_text_wdata_qid); + bldr.Cmd_mgr().Add_cmd(wiki, Xob_cmd_keys.Key_tdb_text_wdata_pid); } @Override public void Cmd_run_end(Xowe_wiki wiki) {} } diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xobc_core_make_id.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_make_id_wkr.java similarity index 72% rename from 400_xowa/src/gplx/xowa/bldrs/imports/Xobc_core_make_id.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_make_id_wkr.java index 671f4be2e..65747a365 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xobc_core_make_id.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_make_id_wkr.java @@ -15,19 +15,19 @@ 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 . */ -package gplx.xowa.bldrs.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.ios.*; import gplx.xowa.tdbs.*; -public class Xobc_core_make_id extends Xob_itm_dump_base implements Xobd_wkr, GfoInvkAble { - public Xobc_core_make_id(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} +package gplx.xowa.bldrs.cmds.texts.tdbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; +import gplx.ios.*; import gplx.xowa.tdbs.*; import gplx.xowa.wikis.data.tbls.*; +public class Xob_make_id_wkr extends Xob_itm_dump_base implements Xobd_wkr, GfoInvkAble { + public Xob_make_id_wkr(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} public String Wkr_key() {return KEY;} public static final String KEY = "core.make_id"; public void Wkr_ini(Xob_bldr bldr) {} public void Wkr_bgn(Xob_bldr bldr) { this.Init_dump(KEY, wiki.Tdb_fsys_mgr().Site_dir().GenSubDir(Xotdb_dir_info_.Name_id)); } - public void Wkr_run(Xodb_page page) { + public void Wkr_run(Xowd_page_itm page) { byte[] ttl = page.Ttl_page_db(); if (dump_bfr.Len() + row_fixed_len + ttl.length > dump_fil_len) Io_mgr._.AppendFilBfr(dump_url_gen.Nxt_url(), dump_bfr); - Xodb_page_.Txt_id_save(dump_bfr, page); + Xotdb_page_itm_.Txt_id_save(dump_bfr, page); } public void Wkr_end() { this.Term_dump(new Xob_make_cmd_site(bldr.Usr_dlg(), make_dir, make_fil_len)); diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_page_txt.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_page_txt.java similarity index 80% rename from 400_xowa/src/gplx/xowa/bldrs/imports/Xob_page_txt.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_page_txt.java index da04eedd1..87557755d 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_page_txt.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_page_txt.java @@ -15,41 +15,41 @@ 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 . */ -package gplx.xowa.bldrs.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.ios.*; import gplx.xowa.tdbs.*; +package gplx.xowa.bldrs.cmds.texts.tdbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; +import gplx.ios.*; import gplx.xowa.tdbs.*; import gplx.xowa.wikis.data.tbls.*; public class Xob_page_txt extends Xob_itm_dump_base implements Xobd_wkr, GfoInvkAble { public Xob_page_txt(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} - public String Wkr_key() {return KEY;} public static final String KEY = "core.make_page"; + public String Wkr_key() {return Xob_cmd_keys.Key_tdb_make_page;} public void Wkr_ini(Xob_bldr bldr) {} public void Wkr_bgn(Xob_bldr bldr) { redirect_mgr = wiki.Redirect_mgr(); page_storage_type = wiki.Appe().Setup_mgr().Dump_mgr().Data_storage_format(); fsys_mgr = wiki.Tdb_fsys_mgr(); make_dir = fsys_mgr.Ns_dir(); if (Io_mgr._.QueryDir_args(make_dir).DirOnly_().ExecAsUrlAry().length > 0) throw bldr.Usr_dlg().Fail_many("xowa.bldr.itm", "dir_empty", "dir_must_be_empty: ~{0}", make_dir.Raw()); - this.Init_dump(KEY, make_dir); + this.Init_dump(Xob_cmd_keys.Key_tdb_make_page, make_dir); this.data_rpt_typ = stat_mgr.GetOrNew(Xotdb_dir_info_.Tid_page); ttl_wtr_mgr = new Xob_tmp_wtr_mgr(new Xob_tmp_wtr_wkr__ttl(temp_dir, dump_fil_len)); } private Xotdb_fsys_mgr fsys_mgr; Xop_redirect_mgr redirect_mgr; int page_file_len = 512 * Io_mgr.Len_kb, title_file_len = 64 * Io_mgr.Len_kb; Xob_tmp_wtr_mgr ttl_wtr_mgr; Xob_xdat_file_wtr[] page_wtr_regy = new Xob_xdat_file_wtr[Ns_ordinal_max]; static final int Ns_ordinal_max = Xow_ns_mgr_.Ordinal_max; // ASSUME: no more than 128 ns in a wiki Xob_stat_type data_rpt_typ; Xob_stat_mgr stat_mgr = new Xob_stat_mgr(); byte page_storage_type; - public void Wkr_run(Xodb_page page) { - int id = page.Id(); byte[] ttl_wo_ns = page.Ttl_page_db(), text = page.Wtxt(); int ttl_len = ttl_wo_ns.length, text_len = text.length; Xow_ns ns = page.Ns(); + public void Wkr_run(Xowd_page_itm page) { + int id = page.Id(); byte[] ttl_wo_ns = page.Ttl_page_db(), text = page.Text(); int ttl_len = ttl_wo_ns.length, text_len = text.length; Xow_ns ns = page.Ns(); boolean redirect = redirect_mgr.Is_redirect(text, text_len); page.Redirected_(redirect); // page: EX: \t123\t2012-06-09\ttitle\ttext\n; NOTE: 512k * ~20 ns = 10 MB max memory; no need for intermediary flushing Xob_xdat_file_wtr page_wtr = Page_wtr_get(ns); - if (page_wtr.FlushNeeded(Xodb_page_.Txt_page_len__fixed + ttl_len + text_len)) page_wtr.Flush(bldr.Usr_dlg()); - Xodb_page_.Txt_page_save(page_wtr.Bfr(), id, page.Modified_on(), ttl_wo_ns, text, false); + if (page_wtr.FlushNeeded(Xotdb_page_itm_.Txt_page_len__fixed + ttl_len + text_len)) page_wtr.Flush(bldr.Usr_dlg()); + Xotdb_page_itm_.Txt_page_save(page_wtr.Bfr(), id, page.Modified_on(), ttl_wo_ns, text, false); page_wtr.Add_idx(Byte_ascii.NewLine); // idx: EX: 00100|aB64|Ttl; Xob_tmp_wtr ttl_wtr = ttl_wtr_mgr.Get_or_new(ns); int file_idx = page_wtr.Fil_idx(), row_idx = page_wtr.Idx_pos() - ListAdp_.LastIdxOffset; - page.Wtxt_db_id_(file_idx).Tdb_row_idx_(row_idx); - if (ttl_wtr.FlushNeeded(Xodb_page_.Txt_ttl_len__fixed + ttl_len)) ttl_wtr.Flush(bldr.Usr_dlg()); - Xodb_page_.Txt_ttl_save(ttl_wtr.Bfr(), id, file_idx, row_idx, redirect, text_len, ttl_wo_ns); + page.Text_db_id_(file_idx).Tdb_row_idx_(row_idx); + if (ttl_wtr.FlushNeeded(Xotdb_page_itm_.Txt_ttl_len__fixed + ttl_len)) ttl_wtr.Flush(bldr.Usr_dlg()); + Xotdb_page_itm_.Txt_ttl_save(ttl_wtr.Bfr(), id, file_idx, row_idx, redirect, text_len, ttl_wo_ns); } public void Wkr_end() { Flush_page(page_wtr_regy); diff --git a/400_xowa/src_210_bldr_core/gplx/xowa/Xobc_parse_dump_templates.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_parse_dump_templates_cmd.java similarity index 66% rename from 400_xowa/src_210_bldr_core/gplx/xowa/Xobc_parse_dump_templates.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_parse_dump_templates_cmd.java index 767fce043..ecf7a1aa2 100644 --- a/400_xowa/src_210_bldr_core/gplx/xowa/Xobc_parse_dump_templates.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_parse_dump_templates_cmd.java @@ -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 . */ -package gplx.xowa; import gplx.*; -import gplx.ios.*; -public class Xobc_parse_dump_templates extends Xob_itm_dump_base implements Xobd_wkr, GfoInvkAble { - public Xobc_parse_dump_templates(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} +package gplx.xowa.bldrs.cmds.texts.tdbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; +import gplx.ios.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.tdbs.*; +public class Xob_parse_dump_templates_cmd extends Xob_itm_dump_base implements Xobd_wkr, GfoInvkAble { + public Xob_parse_dump_templates_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} public String Wkr_key() {return KEY;} public static final String KEY = "parse.dump_templates"; public static final int FixedLen_page = 1 + 5 + 1 + 5 + 1 + 1 + 1; // \tid|date|title|text\n public void Wkr_ini(Xob_bldr bldr) {} public void Wkr_bgn(Xob_bldr bldr) { Init_dump(KEY); } - public void Wkr_run(Xodb_page page) { + public void Wkr_run(Xowd_page_itm page) { if (page.Ns_id() != Xow_ns_.Id_template) return; - int id = page.Id(); byte[] title = page.Ttl_page_db(), text = page.Wtxt(); int title_len = title.length, text_len = text.length; + int id = page.Id(); byte[] title = page.Ttl_page_db(), text = page.Text(); int title_len = title.length, text_len = text.length; if (FixedLen_page + title_len + text_len + dump_bfr.Len() > dump_fil_len) super.Flush_dump(); - Xodb_page_.Txt_page_save(dump_bfr, id, page.Modified_on(), title, text, true); + Xotdb_page_itm_.Txt_page_save(dump_bfr, id, page.Modified_on(), title, text, true); } public void Wkr_end() {super.Flush_dump();} public void Wkr_print() {} diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_base_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_search_base_tst.java similarity index 84% rename from 400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_base_tst.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_search_base_tst.java index e8895b172..5285c64cf 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_base_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_search_base_tst.java @@ -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 . */ -package gplx.xowa.bldrs.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import org.junit.*; import gplx.xowa.tdbs.*; +package gplx.xowa.bldrs.cmds.texts.tdbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; +import org.junit.*; import gplx.xowa.tdbs.*; import gplx.xowa.bldrs.*; public class Xob_search_base_tst { @Test public void Split() { tst_Split("a", "a"); @@ -42,7 +42,7 @@ public class Xob_search_base_tst { , "0|a|b|2" , "" ) - .Run(new Xob_search_txt(fxt.Bldr(), this.fxt.Wiki())) + .Run(new Xob_search_tdb(fxt.Bldr(), this.fxt.Wiki())) ; } private Xob_fxt fxt = new Xob_fxt().Ctor_mem(); private void tst_Split(String raw, String... expd) { diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_txt.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_search_tdb.java similarity index 69% rename from 400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_txt.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_search_tdb.java index 1d09469a4..1e76d2692 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_txt.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_search_tdb.java @@ -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 . */ -package gplx.xowa.bldrs.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -public class Xob_search_txt extends Xob_search_base { - public Xob_search_txt(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} - @Override public String Wkr_key() {return KEY;} public static final String KEY = "core.make_search_title"; +package gplx.xowa.bldrs.cmds.texts.tdbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; +public class Xob_search_tdb extends Xob_search_base { + public Xob_search_tdb(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} + @Override public String Wkr_key() {return Xob_cmd_keys.Key_tdb_make_search_title;} @Override public gplx.ios.Io_make_cmd Make_cmd_site() { return new Xob_make_cmd_site(bldr.Usr_dlg(), this.make_dir, this.make_fil_len); } diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_term_txt.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_term_txt.java similarity index 77% rename from 400_xowa/src/gplx/xowa/bldrs/imports/Xob_term_txt.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_term_txt.java index 8d9ae42db..5aedd2aa0 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_term_txt.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_term_txt.java @@ -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 . */ -package gplx.xowa.bldrs.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; +package gplx.xowa.bldrs.cmds.texts.tdbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; +import gplx.xowa.bldrs.cmds.texts.*; public class Xob_term_txt extends Xob_term_base { public Xob_term_txt(Xob_bldr bldr, Xowe_wiki wiki) {this.Ctor(bldr, wiki); this.wiki = wiki;} private Xowe_wiki wiki; - @Override public String Cmd_key() {return KEY;} public static final String KEY = "core.term"; + @Override public String Cmd_key() {return Xob_cmd_keys.Key_tdb_core_term;} @Override public void Cmd_end_hook() { Io_mgr._.SaveFilBry(wiki.Tdb_fsys_mgr().Cfg_wiki_core_fil(), wiki.Cfg_wiki_core().Build_gfs()); } diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xobc_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_tst.java similarity index 89% rename from 400_xowa/src/gplx/xowa/bldrs/imports/Xobc_tst.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_tst.java index 12ce0e22e..ae1b8d431 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xobc_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_tst.java @@ -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 . */ -package gplx.xowa.bldrs.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; +package gplx.xowa.bldrs.cmds.texts.tdbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; import org.junit.*; -import gplx.ios.*; import gplx.xowa.tdbs.*; -public class Xobc_tst { +import gplx.ios.*; import gplx.xowa.tdbs.*; import gplx.xowa.wikis.data.tbls.*; +public class Xob_tst { @Before public void init() {fxt = new Xob_fxt().Ctor_mem();} private Xob_fxt fxt; // @After public void term() {fxt.Wiki().Ctx().Sys_load_tmpls_(true);} // commented during wiki.Ctx() removal; DATE:2014-04-22 @Test public void Basic() { @@ -172,13 +172,13 @@ public class Xobc_tst { Xoae_app app = Xoa_app_fxt.app_(); // NOTE: resets mem file system, so must happen first Io_url url = Io_url_.mem_fil_("mem/raw_page.csv"); Io_mgr._.SaveFilStr(url, raw); - Xodb_page_raw_parser parser = new Xodb_page_raw_parser(); + Xotdb_page_raw_parser parser = new Xotdb_page_raw_parser(); Xowe_wiki wiki = Xoa_app_fxt.wiki_tst_(app); parser.Load(Gfo_usr_dlg_base.test_(), wiki, new Xow_ns(Xow_ns_.Id_template, Xow_ns_case_.Id_1st, Bry_.new_utf8_("Template"), false), new Io_url[] {url}, 1 * Io_mgr.Len_kb); ListAdp actl = ListAdp_.new_(); - Xodb_page page = new Xodb_page(); + Xowd_page_itm page = new Xowd_page_itm(); while (parser.Read(page)) { - actl.Add(String_.new_utf8_(page.Wtxt())); + actl.Add(String_.new_utf8_(page.Text())); } Tfds.Eq_ary(expd, actl.XtoStrAry()); } diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xobc_core_cleanup.java b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_cleanup_cmd.java similarity index 65% rename from 400_xowa/src/gplx/xowa/bldrs/imports/Xobc_core_cleanup.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_cleanup_cmd.java index fde74871a..de5cd184b 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xobc_core_cleanup.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_cleanup_cmd.java @@ -15,18 +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 . */ -package gplx.xowa.bldrs.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.xowa.bldrs.*; +package gplx.xowa.bldrs.cmds.utils; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.core.criterias.*; -public class Xobc_core_cleanup extends Xob_itm_basic_base implements Xob_cmd { +public class Xob_cleanup_cmd extends Xob_itm_basic_base implements Xob_cmd { private String bz2_cmd; private boolean delete_all, delete_tmp; private Criteria_ioMatch[] delete_by_match_ary; - public Xobc_core_cleanup(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} - public String Cmd_key() {return KEY;} public static final String KEY = "core.cleanup"; - public Xobc_core_cleanup Delete_sqlite3_(boolean v){delete_sqlite3 = v; return this;} private boolean delete_sqlite3; - public Xobc_core_cleanup Delete_xml_(boolean v) {delete_xml = v; return this;} private boolean delete_xml; - public Xobc_core_cleanup Delete_wiki_(boolean v) {delete_wiki = v; return this;} private boolean delete_wiki; + public Xob_cleanup_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} + public String Cmd_key() {return Xob_cmd_keys.Key_util_cleanup;} + public Xob_cleanup_cmd Delete_sqlite3_(boolean v){delete_sqlite3 = v; return this;} private boolean delete_sqlite3; + public Xob_cleanup_cmd Delete_xml_(boolean v) {delete_xml = v; return this;} private boolean delete_xml; + public Xob_cleanup_cmd Delete_tdb_(boolean v) {delete_tdb = v; return this;} private boolean delete_tdb; public void Bz2_fil_(Io_url v) {bz2_fil = v;} private Io_url bz2_fil; public void Cmd_run() { Io_url wiki_root_dir = wiki.Fsys_mgr().Root_dir(); @@ -37,27 +36,27 @@ public class Xobc_core_cleanup extends Xob_itm_basic_base implements Xob_cmd { Io_mgr._.MoveFil(bz2_fil, bz2_fil.OwnerDir().OwnerDir().GenSubFil_nest("done", bz2_fil.NameAndExt())); } if (delete_xml) Io_mgr._.DeleteFil(Xobd_rdr.Find_fil_by(wiki_root_dir, "*.xml")); - if (delete_wiki) { - usr_dlg.Note_many("", "delete_wiki", "deleting wiki"); - Delete_wiki_txt(wiki_root_dir); + if (delete_tdb) { + usr_dlg.Note_many("", "", "bldr.wiki:deleting tdb wiki"); + Delete_tdb(wiki_root_dir); } if (delete_sqlite3) Delete_wiki_sql(wiki); if (delete_all) - Io_mgr._.DeleteDirDeep(wiki_root_dir); + Io_mgr._.DeleteDir_cmd(wiki_root_dir).Exec(); // do not delete subdirs; needed to support "/prv" for fsdb; DATE:2015-04-01 if (delete_by_match_ary != null) Delete_by_match(wiki_root_dir, delete_by_match_ary); if (delete_tmp) Io_mgr._.DeleteDirDeep(wiki_root_dir.GenSubDir("tmp")); } - public void Cmd_ini(Xob_bldr bldr) {} + public void Cmd_init(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) {} public void Cmd_end() {} - public void Cmd_print() {} + public void Cmd_term() {} @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_bz2_cmd_)) bz2_cmd = m.ReadStr("v"); else if (ctx.Match(k, Invk_delete_xml_)) delete_xml = m.ReadYn("v"); - else if (ctx.Match(k, Invk_delete_wiki_)) delete_wiki = m.ReadYn("v"); + else if (ctx.Match(k, Invk_delete_wiki_)) delete_tdb = m.ReadYn("v"); else if (ctx.Match(k, Invk_delete_sqlite3_)) delete_sqlite3 = m.ReadYn("v"); else if (ctx.Match(k, Invk_delete_all_)) delete_all = m.ReadYn("v"); else if (ctx.Match(k, Invk_bz2_fil_)) bz2_fil = m.ReadIoUrl("v"); @@ -97,20 +96,35 @@ public class Xobc_core_cleanup extends Xob_itm_basic_base implements Xob_cmd { } } } - private static void Delete_wiki_txt(Io_url wiki_root_dir) { + private static void Delete_tdb(Io_url wiki_root_dir) { Io_url[] dirs = Io_mgr._.QueryDir_args(wiki_root_dir).DirOnly_().DirInclude_().ExecAsUrlAry(); int dirs_len = dirs.length; - for (int i = 0; i < dirs_len; i++) - Io_mgr._.DeleteDirDeep(dirs[i]); + for (int i = 0; i < dirs_len; i++) { + Io_url dir = dirs[i]; + if (gplx.xowa.tdbs.Xotdb_dir_info_.Dir_name_is_tdb(dir.NameOnly())) + Io_mgr._.DeleteDirDeep(dir); + } } public static void Delete_wiki_sql(Xowe_wiki wiki) { Gfo_usr_dlg usr_dlg = wiki.Appe().Usr_dlg(); Io_url wiki_root_dir = wiki.Fsys_mgr().Root_dir(); if (wiki.Db_mgr().Tid() == gplx.xowa.dbs.Xodb_mgr_sql.Tid_sql) // NOTE: must check; if empty dir (or text db) than db_mgr will be txt wiki.Db_mgr_as_sql().Core_data_mgr().Rls(); // NOTE: if sqlite files, must rls; - Io_url[] sqlite3_files = Io_mgr._.QueryDir_args(wiki_root_dir).FilPath_("*.sqlite3").ExecAsUrlAry(); - int sqlite3_files_len = sqlite3_files.length; - usr_dlg.Note_many("", "delete_wiki", "deleting sqlite3 files: ~{0} ~{1}", sqlite3_files_len, wiki_root_dir.Raw()); - for (int i = 0; i < sqlite3_files_len; i++) - Io_mgr._.DeleteFil(sqlite3_files[i]); + Io_url[] files = Io_mgr._.QueryDir_fils(wiki_root_dir); + int files_len = files.length; + int deleted = 0; + String file_prefix = wiki.Domain_str() + "-file"; // NOTE: skip anything with "-file"; EX: "en.wikipedia.org-file.xowa" + String html_prefix = wiki.Domain_str() + "-html"; // NOTE: skip anything with "-html"; EX: "en.wikipedia.org-html-ns.000-db.002.xowa" + for (int i = 0; i < files_len; i++) { + Io_url url = files[i]; + if ( !String_.Eq(url.Ext(), ".xowa") + && !String_.Eq(url.Ext(), ".sqlite3")) + continue; + if ( String_.HasAtBgn(url.NameAndExt(), file_prefix) + || String_.HasAtBgn(url.NameAndExt(), html_prefix) + ) continue; // skip + Io_mgr._.DeleteFil(url); + deleted++; + } + usr_dlg.Note_many("", "delete_wiki", "deleting sqlite3 files: ~{0} ~{1}", deleted, wiki_root_dir.Raw()); } } diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xobc_core_batch.java b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_core_batch_utl.java similarity index 78% rename from 400_xowa/src/gplx/xowa/bldrs/imports/Xobc_core_batch.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_core_batch_utl.java index ca9e79269..d6fbb6494 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xobc_core_batch.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_core_batch_utl.java @@ -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 . */ -package gplx.xowa.bldrs.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; +package gplx.xowa.bldrs.cmds.utils; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.wikis.*; -public class Xobc_core_batch implements GfoInvkAble { - public Xobc_core_batch(Xob_bldr bldr, byte[] raw) {this.bldr = bldr; fmtr.Fmt_(raw);} private Xob_bldr bldr; +public class Xob_core_batch_utl implements GfoInvkAble { + public Xob_core_batch_utl(Xob_bldr bldr, byte[] raw) {this.bldr = bldr; fmtr.Fmt_(raw);} private Xob_bldr bldr; Bry_fmtr fmtr = Bry_fmtr.keys_("bz2_fil", "wiki_key"); private void Run() { Io_url[] bz2_fils = Io_mgr._.QueryDir_fils(bldr.App().Fsys_mgr().Wiki_dir().GenSubDir_nest(Dir_dump, "todo")); @@ -29,7 +29,7 @@ public class Xobc_core_batch implements GfoInvkAble { Io_url bz2_fil_url = bz2_fils[i]; bz2_fil.Fil_(bz2_fil_url).Parse(bz2_fil_url.NameOnly()); fmtr.Bld_bfr_many(bfr, bz2_fil_url.Raw(), bz2_fil.Domain()); - bldr.Usr_dlg().Note_many(GRP_KEY, "bgn", "starting script for ~{0}", String_.new_utf8_(bz2_fil.Domain())); + bldr.Usr_dlg().Note_many("", "", "starting script for ~{0}", String_.new_utf8_(bz2_fil.Domain())); bldr.App().Gfs_mgr().Run_str(bfr.Xto_str_and_clear()); } } @@ -39,5 +39,4 @@ public class Xobc_core_batch implements GfoInvkAble { return this; } private static final String Invk_owner = "owner", Invk_run = "run"; public static String Dir_dump = "#dump"; - static final String GRP_KEY = "xowa.bldr.cmd.batch"; } diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xobc_core_decompress_bz.java b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_decompress_bz2_cmd.java similarity index 82% rename from 400_xowa/src/gplx/xowa/bldrs/imports/Xobc_core_decompress_bz.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_decompress_bz2_cmd.java index 49a0667ea..697514b32 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xobc_core_decompress_bz.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_decompress_bz2_cmd.java @@ -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 . */ -package gplx.xowa.bldrs.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; +package gplx.xowa.bldrs.cmds.utils; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.ios.*; import gplx.threads.*; import gplx.xowa.bldrs.*; -public class Xobc_core_decompress_bz extends Xob_itm_basic_base implements Xob_cmd { - public Xobc_core_decompress_bz(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} - public String Cmd_key() {return KEY;} public static final String KEY = "core.decompress_bz2"; - public void Cmd_ini(Xob_bldr bldr) {} +public class Xob_decompress_bz2_cmd extends Xob_itm_basic_base implements Xob_cmd { + public Xob_decompress_bz2_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} + public String Cmd_key() {return Xob_cmd_keys.Key_decompress_bz2;} + public void Cmd_init(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) {} public void Cmd_run() { if (Io_mgr._.ExistsFil(trg)) return; // file already exists; don't decompress again @@ -28,7 +28,7 @@ public class Xobc_core_decompress_bz extends Xob_itm_basic_base implements Xob_c Decompress(bldr.App(), src.Raw(), trg); } public void Cmd_end() {} - public void Cmd_print() {} + public void Cmd_term() {} @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_src_)) this.Src_(m.ReadIoUrl("v")); else return super.Invk(ctx, ikey, k, m); diff --git a/400_xowa/src_210_bldr_core/gplx/xowa/Xobc_deploy_copy.java b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_deploy_copy_cmd.java similarity index 81% rename from 400_xowa/src_210_bldr_core/gplx/xowa/Xobc_deploy_copy.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_deploy_copy_cmd.java index 00ca45ac1..c8c5c62d7 100644 --- a/400_xowa/src_210_bldr_core/gplx/xowa/Xobc_deploy_copy.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_deploy_copy_cmd.java @@ -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 . */ -package gplx.xowa; import gplx.*; +package gplx.xowa.bldrs.cmds.utils; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.*; import gplx.xowa.tdbs.*; -public class Xobc_deploy_copy extends Xob_itm_basic_base implements Xob_cmd, GfoInvkAble { - public Xobc_deploy_copy(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} - public String Cmd_key() {return KEY;} public static final String KEY = "deploy.copy"; - public void Cmd_ini(Xob_bldr bldr) {} +public class Xob_deploy_copy_cmd extends Xob_itm_basic_base implements Xob_cmd, GfoInvkAble { + public Xob_deploy_copy_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} + public String Cmd_key() {return Xob_cmd_keys.Key_deploy_copy;} + public void Cmd_init(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) {} public void Cmd_end() {} public void Cmd_run() { @@ -33,7 +33,7 @@ public class Xobc_deploy_copy extends Xob_itm_basic_base implements Xob_cmd, Gfo Copy_dir_root(src_root_dir, Xotdb_dir_info_.Name_site, Xotdb_dir_info_.Name_id); Copy_dir_root(src_root_dir, Xotdb_dir_info_.Name_site, Xotdb_dir_info_.Name_search_ttl); } - public void Cmd_print() {} + public void Cmd_term() {} private void Copy_dir_ns(Io_url root, String name) { Io_url[] ns_dirs = Io_mgr._.QueryDir_args(root).DirOnly_().ExecAsUrlAry(); for (int i = 0; i < ns_dirs.length; i++) { @@ -41,10 +41,10 @@ public class Xobc_deploy_copy extends Xob_itm_basic_base implements Xob_cmd, Gfo Io_url src_sub_dir = ns_dir.GenSubDir(name); String dir_name = name; if (zip) { - Io_url src_zip_dir = ns_dir.GenSubDir(name + Xobc_deploy_zip.Dir_zip_suffix); + Io_url src_zip_dir = ns_dir.GenSubDir(name + Xob_deploy_zip_cmd.Dir_zip_suffix); if (Io_mgr._.ExistsDir(src_zip_dir)) { src_sub_dir = src_zip_dir; - dir_name = name + Xobc_deploy_zip.Dir_zip_suffix; + dir_name = name + Xob_deploy_zip_cmd.Dir_zip_suffix; } } Copy_dir(src_sub_dir, trg_root_dir.GenSubDir_nest(Xotdb_dir_info_.Name_ns, ns_dir.NameOnly(), dir_name)); diff --git a/400_xowa/src_210_bldr_core/gplx/xowa/Xobc_deploy_zip.java b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_deploy_zip_cmd.java similarity index 81% rename from 400_xowa/src_210_bldr_core/gplx/xowa/Xobc_deploy_zip.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_deploy_zip_cmd.java index 67ad97c36..4847776d8 100644 --- a/400_xowa/src_210_bldr_core/gplx/xowa/Xobc_deploy_zip.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_deploy_zip_cmd.java @@ -15,16 +15,16 @@ 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 . */ -package gplx.xowa; import gplx.*; +package gplx.xowa.bldrs.cmds.utils; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.*; import gplx.xowa.tdbs.*; -public class Xobc_deploy_zip extends Xob_itm_basic_base implements Xob_cmd { - public Xobc_deploy_zip(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} - public String Cmd_key() {return KEY;} public static final String KEY = "deploy.zip"; - public void Cmd_ini(Xob_bldr bldr) {} +public class Xob_deploy_zip_cmd extends Xob_itm_basic_base implements Xob_cmd { + public Xob_deploy_zip_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} + public String Cmd_key() {return Xob_cmd_keys.Key_deploy_zip;} + public void Cmd_init(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) {} public void Cmd_run() {Exec(bldr, Xotdb_dir_info_.Name_page);} public void Cmd_end() {} - public void Cmd_print() {} + public void Cmd_term() {} private void Exec(Xob_bldr bldr, String type_name) { Log("initing wiki"); try {wiki.Init_assert();} @@ -42,10 +42,10 @@ public class Xobc_deploy_zip extends Xob_itm_basic_base implements Xob_cmd { bldr.Usr_dlg().Prog_one(GRP_KEY, "scan", "scanning dir ~{0}", type_name); Io_url[] fils = Io_mgr._.QueryDir_args(root_dir.GenSubDir(type_name)).Recur_().ExecAsUrlAry(); int fils_len = fils.length; - String fils_len_str = Int_.Xto_str_pad_bgn(fils_len, 6); + String fils_len_str = Int_.Xto_str_pad_bgn_zero(fils_len, 6); for (int i = 0; i < fils_len; i++) { Io_url fil = fils[i]; - bldr.StatusMgr_prog_fmt(i, fils.length, -1, "zipping ~{0} ~{1} ~{2} of ~{3}", type_name, ns_name, Int_.Xto_str_pad_bgn(i, 6), fils_len_str); + bldr.Print_prog_msg(i, fils.length, -1, "zipping ~{0} ~{1} ~{2} of ~{3}", type_name, ns_name, Int_.Xto_str_pad_bgn_zero(i, 6), fils_len_str); Io_url trg_fil = Gen_trg(root_dir, fil, type_name); if (String_.Eq(fil.NameAndExt(), Xotdb_dir_info_.Name_reg_fil)) // do not zip reg.csv Io_mgr._.CopyFil(fil, trg_fil, true); @@ -54,7 +54,7 @@ public class Xobc_deploy_zip extends Xob_itm_basic_base implements Xob_cmd { } if (delete_dirs_page) Io_mgr._.DeleteDirDeep(root_dir.GenSubDir(type_name)); } - public boolean Delete_dirs_page() {return delete_dirs_page;} public Xobc_deploy_zip Delete_dirs_page_(boolean v) {delete_dirs_page = v; return this;} private boolean delete_dirs_page = true; + public boolean Delete_dirs_page() {return delete_dirs_page;} public Xob_deploy_zip_cmd Delete_dirs_page_(boolean v) {delete_dirs_page = v; return this;} private boolean delete_dirs_page = true; Io_url Gen_trg(Io_url root_dir, Io_url fil, String type_name) { String src_fil = fil.Xto_api(); int pos = String_.FindBwd(src_fil, type_name); // SEE:NOTE_1 diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_download_wkr.java b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_download_wkr.java similarity index 89% rename from 400_xowa/src/gplx/xowa/bldrs/files/Xob_download_wkr.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_download_wkr.java index e3f3eb912..12adb34c2 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_download_wkr.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_download_wkr.java @@ -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 . */ -package gplx.xowa.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.dbs.*; import gplx.ios.*; +package gplx.xowa.bldrs.cmds.utils; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; +import gplx.dbs.*; import gplx.ios.*; import gplx.xowa.bldrs.*; public class Xob_download_wkr extends Xob_itm_basic_base implements Xob_cmd { private String dump_date = "latest"; private String dump_type = null; @@ -24,8 +24,8 @@ public class Xob_download_wkr extends Xob_itm_basic_base implements Xob_cmd { private Io_url dump_trg_zip = null, dump_trg_bin = null; private boolean unzip = true; public Xob_download_wkr(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.download"; - public void Cmd_ini(Xob_bldr bldr) {} + public String Cmd_key() {return Xob_cmd_keys.Key_util_download;} + public void Cmd_init(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) { if (dump_type == null) throw Err_.new_("dump_type must be specified"); Xob_dump_file dump_file = Xob_dump_file.new_(wiki.Domain_str(), dump_date, dump_type); @@ -51,7 +51,7 @@ public class Xob_download_wkr extends Xob_itm_basic_base implements Xob_cmd { } } public void Cmd_end() {} - public void Cmd_print() {} + public void Cmd_term() {} @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (String_.Eq(k, Invk_dump_date_)) dump_date = m.ReadStr("v"); else if (String_.Eq(k, Invk_dump_type_)) dump_type = m.ReadStr("v"); diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_cmd_exec_sql.java b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_exec_sql_cmd.java similarity index 74% rename from 400_xowa/src/gplx/xowa/bldrs/imports/Xob_cmd_exec_sql.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_exec_sql_cmd.java index 851609f3c..b9159b325 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_cmd_exec_sql.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_exec_sql_cmd.java @@ -15,25 +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 . */ -package gplx.xowa.bldrs.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; +package gplx.xowa.bldrs.cmds.utils; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.wikis.data.*; import gplx.xowa.dbs.*; -public class Xob_cmd_exec_sql implements Xob_cmd { +public class Xob_exec_sql_cmd implements Xob_cmd { private Xowe_wiki wiki; private int file_idx = -1; private String sql; - public Xob_cmd_exec_sql(Xob_bldr bldr, Xowe_wiki wiki) {this.wiki = wiki;} - public String Cmd_key() {return KEY;} public static final String KEY = "import.sql.exec_sql"; - public void Cmd_ini(Xob_bldr bldr) {} - public void Cmd_bgn(Xob_bldr bldr) { + public Xob_exec_sql_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.wiki = wiki;} + public String Cmd_key() {return Xob_cmd_keys.Key_exec_sql;} + public void Cmd_run() { Xoae_app app = wiki.Appe(); wiki.Init_assert(); // force load; needed to pick up MediaWiki ns for MediaWiki:mainpage Xodb_mgr_sql db_mgr = wiki.Db_mgr_as_sql(); - Xowe_core_data_mgr fsys_mgr = db_mgr.Core_data_mgr(); + Xowd_db_mgr fsys_mgr = db_mgr.Core_data_mgr(); Xowd_db_file file = fsys_mgr.Dbs__get_at(file_idx); app.Usr_dlg().Plog_many("", "", "exec_sql: running sql; file_idx=~{0} sql=~{1}", file_idx, sql); file.Conn().Exec_sql(sql); } - public void Cmd_run() {} + public void Cmd_init(Xob_bldr bldr) {} + public void Cmd_bgn(Xob_bldr bldr) {} public void Cmd_end() {} - public void Cmd_print() {} + public void Cmd_term() {} public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_file_idx_)) file_idx = m.ReadInt("v"); else if (ctx.Match(k, Invk_sql_)) sql = m.ReadStr("v"); diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_unzip_wkr.java b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_unzip_wkr.java similarity index 93% rename from 400_xowa/src/gplx/xowa/bldrs/files/Xob_unzip_wkr.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_unzip_wkr.java index dec2da665..6540f33f7 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_unzip_wkr.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_unzip_wkr.java @@ -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 . */ -package gplx.xowa.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; +package gplx.xowa.bldrs.cmds.utils; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; public class Xob_unzip_wkr { private ProcessAdp decompress_bz2, decompress_zip, decompress_gz, process; public int Process_exit_code() {return process.Exit_code();} diff --git a/400_xowa/src/gplx/xowa/bldrs/wikis/images/Xob_wiki_image_sql.java b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_image_cmd.java similarity index 81% rename from 400_xowa/src/gplx/xowa/bldrs/wikis/images/Xob_wiki_image_sql.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_image_cmd.java index 7c519a6e1..0c95d7a92 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wikis/images/Xob_wiki_image_sql.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_image_cmd.java @@ -15,37 +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 . */ -package gplx.xowa.bldrs.wikis.images; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wikis.*; -import gplx.ios.*; import gplx.xowa.bldrs.*; import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.dbs.tbls.*; import gplx.xowa.bldrs.oimgs.*; import gplx.xowa.files.*; -public class Xob_wiki_image_sql extends Xob_itm_dump_base implements Xob_cmd, GfoInvkAble, Sql_file_parser_cmd { +package gplx.xowa.bldrs.cmds.wikis; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; +import gplx.dbs.*; import gplx.ios.*; import gplx.xowa.files.*; +public class Xob_image_cmd extends Xob_itm_dump_base implements Xob_cmd, GfoInvkAble, Sql_file_parser_cmd { private Db_conn conn = null; private Db_stmt stmt = null; - private Xob_wiki_image_tbl tbl_image = new Xob_wiki_image_tbl(); + private Xob_image_tbl tbl_image = new Xob_image_tbl(); private byte[] cur_ttl, cur_media_type, cur_minor_mime, cur_timestamp; private int cur_size, cur_width, cur_height, cur_bits, cur_ext_id; private int commit_count = 10000; - public Xob_wiki_image_sql(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} - public String Cmd_key() {return KEY;} public static final String KEY = "wiki.image"; - public Io_url Src_fil() {return src_fil;} public Xob_wiki_image_sql Src_fil_(Io_url v) {src_fil = v; return this;} private Io_url src_fil; + public Xob_image_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} + public String Cmd_key() {return Xob_cmd_keys.Key_wiki_image;} + public Io_url Src_fil() {return src_fil;} public Xob_image_cmd Src_fil_(Io_url v) {src_fil = v; return this;} private Io_url src_fil; public Sql_file_parser Parser() {return parser;} private Sql_file_parser parser = new Sql_file_parser(); - public void Cmd_ini(Xob_bldr bldr) {} + public void Cmd_init(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) { wiki.Init_assert(); // NOTE: must init wiki for db_mgr_as_sql - this.Init_dump(KEY); + Init_dump(Xob_cmd_keys.Key_wiki_image); if (src_fil == null) { src_fil = Xobd_rdr.Find_fil_by(wiki.Fsys_mgr().Root_dir(), "*-image.sql"); if (src_fil == null) throw Err_mgr._.fmt_(Xob_cmd_mgr.GRP_KEY, "sql_file_missing", ".sql file not found in dir: ~{0}", wiki.Fsys_mgr().Root_dir()); } parser.Src_fil_(src_fil).Trg_fil_gen_(dump_url_gen).Fld_cmd_(this).Flds_req_idx_(20, Fld_img_name, Fld_img_size, Fld_img_width, Fld_img_height, Fld_img_bits, Fld_img_media_type, Fld_img_minor_mime, Fld_img_timestamp); - conn = Xodb_db_file.init__wiki_image(wiki.Fsys_mgr().Root_dir()).Conn(); - conn.Txn_mgr().Txn_bgn_if_none(); - tbl_image = new Xob_wiki_image_tbl(); + this.conn = Xob_db_file.new__wiki_image(wiki.Fsys_mgr().Root_dir()).Conn(); + conn.Txn_bgn(); + this.tbl_image = new Xob_image_tbl(); tbl_image.Create_table(conn); - stmt = tbl_image.Insert_stmt(conn); + this.stmt = tbl_image.Insert_stmt(conn); } public void Cmd_run() { parser.Parse(bldr.Usr_dlg()); tbl_image.Create_index(conn); - conn.Txn_mgr().Txn_end_all(); + conn.Txn_end(); } 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) { switch (fld_idx) { @@ -62,13 +62,13 @@ public class Xob_wiki_image_sql extends Xob_itm_dump_base implements Xob_cmd, Gf ++commit_count; if ((commit_count % 10000) == 0) { usr_dlg.Prog_many("", "", "committing: count=~{0} last=~{1}", commit_count, String_.new_utf8_(cur_ttl)); - conn.Txn_mgr().Txn_end_all_bgn_if_none(); + conn.Txn_sav(); } break; } } public void Cmd_end() {} - public void Cmd_print() {} + public void Cmd_term() {} private boolean show_issues = true; private static final int Fld_img_name = 0, Fld_img_size = 1, Fld_img_width = 2, Fld_img_height = 3, Fld_img_bits = 5, Fld_img_media_type = 6, Fld_img_minor_mime = 8, Fld_img_timestamp = 12; @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { diff --git a/400_xowa/src/gplx/xowa/bldrs/wikis/images/Xob_image_ext_calc_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_image_cmd_tst.java similarity index 60% rename from 400_xowa/src/gplx/xowa/bldrs/wikis/images/Xob_image_ext_calc_tst.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_image_cmd_tst.java index 2865f10d3..4b24acb7d 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wikis/images/Xob_image_ext_calc_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_image_cmd_tst.java @@ -15,22 +15,22 @@ 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 . */ -package gplx.xowa.bldrs.wikis.images; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wikis.*; +package gplx.xowa.bldrs.cmds.wikis; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import org.junit.*; import gplx.ios.*; import gplx.xowa.files.*; -public class Xob_image_ext_calc_tst { - private Xob_image_ext_calc_fxt fxt = new Xob_image_ext_calc_fxt(); +public class Xob_image_cmd_tst { + private Xob_image_cmd_fxt fxt = new Xob_image_cmd_fxt(); @Test public void Basic() {fxt.Init_("A.png" , Xof_media_type.Name_bitmap , Xof_ext_.Bry_png, 220, 110) .Test(Xof_ext_.Id_png);} // A.png -> png @Test public void Ogg_VIDEO() {fxt.Init_("A.ogg" , Xof_media_type.Name_video , Xof_ext_.Bry_ogg, 220, 110) .Test(Xof_ext_.Id_ogv);} // A.ogg and VIDEO -> ogv @Test public void Ogg_VIDEO_null_size() {fxt.Init_("A.ogg" , Xof_media_type.Name_video , Xof_ext_.Bry_ogg, 0, 0) .Test(Xof_ext_.Id_ogg);} // A.ogg but 0,0 -> ogg (not ogv) @Test public void Png_is_jpg() {fxt.Init_("A.png" , Xof_media_type.Name_bitmap , Xof_ext_.Bry_jpg, 220, 110) .Test(Xof_ext_.Id_jpg);} // A.png and jpg -> jpg @Test public void Jpeg_is_jpeg() {fxt.Init_("A.jpeg" , Xof_media_type.Name_bitmap , Xof_ext_.Bry_jpg, 220, 110) .Test(Xof_ext_.Id_jpeg);} // A.jpeg and jpg -> jpeg (unchanged) } -class Xob_image_ext_calc_fxt { +class Xob_image_cmd_fxt { private byte[] name, media_type, minor_mime; int w, h; - public Xob_image_ext_calc_fxt Init_png() {Name_("A.png").Media_type_(Xof_media_type.Name_bitmap).Minor_mime_(Xof_ext_.Bry_png).W_(220).H_(110); + public Xob_image_cmd_fxt Init_png() {Name_("A.png").Media_type_(Xof_media_type.Name_bitmap).Minor_mime_(Xof_ext_.Bry_png).W_(220).H_(110); return this; } - public Xob_image_ext_calc_fxt Init_(String name, String media_type, byte[] minor_mime, int w, int h) { + public Xob_image_cmd_fxt Init_(String name, String media_type, byte[] minor_mime, int w, int h) { Name_(name); Media_type_(media_type); Minor_mime_(minor_mime); @@ -38,14 +38,14 @@ class Xob_image_ext_calc_fxt { H_(h); return this; } - public Xob_image_ext_calc_fxt Name_(String v) {name = Bry_.new_ascii_(v); return this;} - public Xob_image_ext_calc_fxt Media_type_(String v) {media_type = Bry_.new_ascii_(v); return this;} - public Xob_image_ext_calc_fxt Minor_mime_(byte[] v) {minor_mime = v; return this;} - public Xob_image_ext_calc_fxt Minor_mime_(String v) {return Minor_mime_(Bry_.new_ascii_(v));} - public Xob_image_ext_calc_fxt W_(int v) {w = v; return this;} - public Xob_image_ext_calc_fxt H_(int v) {h = v; return this;} - public Xob_image_ext_calc_fxt Test(int expd) { - Tfds.Eq(expd, Xob_wiki_image_sql.Calc_ext_id(Gfo_usr_dlg_.Null, name, media_type, minor_mime, w, h)); + public Xob_image_cmd_fxt Name_(String v) {name = Bry_.new_ascii_(v); return this;} + public Xob_image_cmd_fxt Media_type_(String v) {media_type = Bry_.new_ascii_(v); return this;} + public Xob_image_cmd_fxt Minor_mime_(byte[] v) {minor_mime = v; return this;} + public Xob_image_cmd_fxt Minor_mime_(String v) {return Minor_mime_(Bry_.new_ascii_(v));} + public Xob_image_cmd_fxt W_(int v) {w = v; return this;} + public Xob_image_cmd_fxt H_(int v) {h = v; return this;} + public Xob_image_cmd_fxt Test(int expd) { + Tfds.Eq(expd, Xob_image_cmd.Calc_ext_id(Gfo_usr_dlg_.Null, name, media_type, minor_mime, w, h)); return this; } } diff --git a/400_xowa/src/gplx/xowa/bldrs/wikis/images/Xob_wiki_image_tbl.java b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_image_tbl.java similarity index 85% rename from 400_xowa/src/gplx/xowa/bldrs/wikis/images/Xob_wiki_image_tbl.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_image_tbl.java index 5cf8a3b43..dc91a448e 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wikis/images/Xob_wiki_image_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_image_tbl.java @@ -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 . */ -package gplx.xowa.bldrs.wikis.images; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wikis.*; +package gplx.xowa.bldrs.cmds.wikis; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; -public class Xob_wiki_image_tbl { - public Xob_wiki_image_tbl Create_table(Db_conn p) {Sqlite_engine_.Tbl_create_and_delete(p, Tbl_name, Tbl_sql); return this;} - public Xob_wiki_image_tbl Create_index(Db_conn p) {Sqlite_engine_.Idx_create(p, Idx_img_name); return this;} +public class Xob_image_tbl { + public Xob_image_tbl Create_table(Db_conn p) {Sqlite_engine_.Tbl_create_and_delete(p, Tbl_name, Tbl_sql); return this;} + public Xob_image_tbl Create_index(Db_conn p) {Sqlite_engine_.Idx_create(p, Idx_img_name); return this;} public Db_stmt Insert_stmt(Db_conn p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_img_name, Fld_img_media_type, Fld_img_minor_mime, Fld_img_size, Fld_img_width, Fld_img_height, Fld_img_bits, Fld_img_ext_id, Fld_img_timestamp);} public void Insert(Db_stmt stmt, byte[] ttl, byte[] media_type, byte[] minor_mime, int size, int w, int h, int bits, int ext_id, byte[] img_timestamp) { stmt.Clear() diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_page_dump_cmd_drop.java b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_page_dump_cmd_drop.java new file mode 100644 index 000000000..8a372d002 --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_page_dump_cmd_drop.java @@ -0,0 +1,42 @@ +/* +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 . +*/ +package gplx.xowa.bldrs.cmds.wikis; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; +import gplx.xowa.wikis.data.*; import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; import gplx.xowa.dbs.*; +public class Xob_page_dump_cmd_drop extends Xob_itm_basic_base implements Xob_cmd { + public Xob_page_dump_cmd_drop(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} + public String Cmd_key() {return Xob_cmd_keys.Key_wiki_page_dump_drop;} + public void Cmd_run() { + wiki.Init_assert(); + Xowd_db_mgr db_mgr = wiki.Data_mgr__core_mgr(); + int len = db_mgr.Dbs__len(); + for (int i = 0; i < len; i++) { + Xowd_db_file db_file = db_mgr.Dbs__get_at(i); + switch (db_file.Tid()) { + case Xowd_db_file_.Tid_wiki_solo: + case Xowd_db_file_.Tid_text_solo: + case Xowd_db_file_.Tid_text: + db_file.Conn().Ddl_delete_tbl(Xobd_page_dump_tbl.Tbl_name); + break; + } + } + } + public void Cmd_init(Xob_bldr bldr) {} + public void Cmd_bgn(Xob_bldr bldr) {} + public void Cmd_end() {} + public void Cmd_term() {} +} diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_page_dump_cmd_make.java b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_page_dump_cmd_make.java new file mode 100644 index 000000000..22bc4896c --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_page_dump_cmd_make.java @@ -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 . +*/ +package gplx.xowa.bldrs.cmds.wikis; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; +import gplx.xowa.wikis.data.*; import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; import gplx.xowa.dbs.*; +public class Xob_page_dump_cmd_make extends Xob_itm_basic_base implements Xob_cmd { + public Xob_page_dump_cmd_make(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} + public String Cmd_key() {return Xob_cmd_keys.Key_wiki_page_dump_make;} + public void Cmd_run() { + wiki.Init_assert(); + Xowd_db_mgr db_mgr = wiki.Data_mgr__core_mgr(); + Io_url page_db_url = db_mgr.Db__core().Url(); + int len = db_mgr.Dbs__len(); + for (int i = 0; i < len; i++) { + Xowd_db_file db_file = db_mgr.Dbs__get_at(i); + switch (db_file.Tid()) { + case Xowd_db_file_.Tid_wiki_solo: + case Xowd_db_file_.Tid_text_solo: + case Xowd_db_file_.Tid_text: + Xobd_page_dump_tbl tbl = new Xobd_page_dump_tbl(db_file.Conn()); + tbl.Create_data(page_db_url, db_file.Id()); + break; + } + } + } + public void Cmd_init(Xob_bldr bldr) {} + public void Cmd_bgn(Xob_bldr bldr) {} + public void Cmd_end() {} + public void Cmd_term() {} +} diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_page_dump_tbl.java b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_page_dump_tbl.java new file mode 100644 index 000000000..49075c774 --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_page_dump_tbl.java @@ -0,0 +1,47 @@ +/* +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 . +*/ +package gplx.xowa.bldrs.cmds.wikis; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; +import gplx.dbs.*; +class Xobd_page_dump_tbl { + public final static String Tbl_name = "page_dump"; + private final String fld_id, fld_title, fld_namespace, fld_is_redirect; + private final Db_conn conn; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + public Xobd_page_dump_tbl(Db_conn conn) { + this.conn = conn; + this.fld_id = flds.Add_int_pkey("page_id"); + this.fld_title = flds.Add_str("page_title", 255); + this.fld_namespace = flds.Add_int("page_namespace"); + this.fld_is_redirect = flds.Add_int("page_is_redirect"); + } + public void Create_data(Io_url page_db_url, int text_db_id) { + conn.Ddl_create_tbl(Db_meta_tbl.new_(Tbl_name, flds)); + Db_attach_cmd.new_(conn, "page_db", page_db_url) + .Add_fmt("text_db_prep.clone_page", Sql_insert_data, text_db_id) + .Exec(); + conn.Ddl_create_idx(Db_meta_idx.new_unique_by_tbl(Tbl_name, "main", fld_id, fld_namespace, fld_is_redirect, fld_title)); + } + private static final String Sql_insert_data = String_.Concat_lines_nl + ( "INSERT INTO page_dump (page_id, page_title, page_namespace, page_is_redirect)" + , "SELECT p.page_id" + , ", p.page_title" + , ", p.page_namespace" + , ", p.page_is_redirect" + , "FROM page p" + , "WHERE p.page_text_db_id = {0};" + ); +} diff --git a/400_xowa/src/gplx/xowa/bldrs/wikis/redirects/Xob_redirect_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_redirect_cmd.java similarity index 71% rename from 400_xowa/src/gplx/xowa/bldrs/wikis/redirects/Xob_redirect_cmd.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_redirect_cmd.java index 57bede480..53d191147 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wikis/redirects/Xob_redirect_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_redirect_cmd.java @@ -15,18 +15,19 @@ 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 . */ -package gplx.xowa.bldrs.wikis.redirects; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wikis.*; -import gplx.xowa.wikis.data.*; import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.dbs.tbls.*; import gplx.xowa.bldrs.oimgs.*; +package gplx.xowa.bldrs.cmds.wikis; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; +import gplx.dbs.*; import gplx.dbs.cfgs.*; import gplx.xowa.dbs.*; import gplx.xowa.wikis.data.tbls.*; public class Xob_redirect_cmd extends Xob_dump_mgr_base { private Db_conn conn; private Xob_redirect_tbl redirect_tbl; private Xodb_mgr_sql db_mgr; private Xop_redirect_mgr redirect_mgr; private Url_encoder encoder; public Xob_redirect_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} - @Override public String Cmd_key() {return KEY_redirect;} public static final String KEY_redirect = "wiki.redirect"; + @Override public String Cmd_key() {return Xob_cmd_keys.Key_wiki_redirect;} @Override public int[] Init_ns_ary() {return Int_.Ary(Xow_ns_.Id_file);} // restrict to file ns @Override public byte Init_redirect() {return Bool_.Y_byte;} // restrict to redirects - @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_redirect_tbl.Tbl_name); + @Override protected void Init_reset(Db_conn conn) { + Db_cfg_tbl cfg_tbl = new Db_cfg_tbl(conn, "xowa_cfg"); + cfg_tbl.Delete_all(); + conn.Exec_sql("DELETE FROM " + Xob_redirect_tbl.Tbl_name); } @Override protected Db_conn Init_db_file() { this.db_mgr = wiki.Db_mgr_as_sql(); @@ -34,23 +35,22 @@ public class Xob_redirect_cmd extends Xob_dump_mgr_base { encoder = Xoa_app_.Utl__encoder_mgr().Url_ttl(); redirect_tbl = new Xob_redirect_tbl(wiki.Fsys_mgr().Root_dir(), Xoa_app_.Utl__encoder_mgr().Url_ttl()).Create_table(); conn = redirect_tbl.Conn(); - conn.Txn_mgr().Txn_bgn_if_none(); + conn.Txn_bgn(); return conn; - } - + } @Override protected void Cmd_bgn_end() {} - @Override public void Exec_pg_itm_hook(Xow_ns ns, Xodb_page page, byte[] page_src) { + @Override public void Exec_pg_itm_hook(int ns_ord, Xow_ns ns, Xowd_page_itm page, byte[] page_src) { Xoa_ttl redirect_ttl = redirect_mgr.Extract_redirect(page_src, page_src.length); byte[] redirect_ttl_bry = Xoa_ttl.Replace_spaces(redirect_ttl.Page_db()); // NOTE: spaces can still exist b/c redirect is scraped from #REDIRECT which sometimes has a mix; EX: "A_b c" redirect_ttl_bry = encoder.Decode(redirect_ttl_bry); redirect_tbl.Insert(page.Id(), Xoa_ttl.Replace_spaces(page.Ttl_page_db()), -1, redirect_ttl.Ns().Id(), redirect_ttl_bry, redirect_ttl.Anch_txt(), 1); } @Override public void Exec_commit_hook() { - conn.Txn_mgr().Txn_end_all_bgn_if_none(); + conn.Txn_sav(); } @Override public void Exec_end_hook() { - conn.Txn_mgr().Txn_end_all(); + conn.Txn_end(); redirect_tbl.Create_indexes(usr_dlg); - redirect_tbl.Update_trg_redirect_id(db_mgr.Core_data_mgr().Get_url(Xowd_db_file_.Tid_core), 4); + redirect_tbl.Update_trg_redirect_id(db_mgr.Core_data_mgr().Db__core().Url(), 4); } } diff --git a/400_xowa/src/gplx/xowa/bldrs/wikis/redirects/Xob_redirect_tbl.java b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_redirect_tbl.java similarity index 91% rename from 400_xowa/src/gplx/xowa/bldrs/wikis/redirects/Xob_redirect_tbl.java rename to 400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_redirect_tbl.java index fa66c1de7..ad722cf15 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wikis/redirects/Xob_redirect_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_redirect_tbl.java @@ -15,20 +15,20 @@ 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 . */ -package gplx.xowa.bldrs.wikis.redirects; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wikis.*; -import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; import gplx.xowa.dbs.*; import gplx.xowa.bldrs.oimgs.*; +package gplx.xowa.bldrs.cmds.wikis; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; +import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; public class Xob_redirect_tbl { private Url_encoder encoder; private Db_stmt insert_stmt; public Xob_redirect_tbl(Io_url root_dir, Url_encoder encoder) { - this.db_file = Xodb_db_file.init__wiki_redirect(root_dir); + this.db_file = Xob_db_file.new__wiki_redirect(root_dir); this.conn = db_file.Conn(); this.encoder = encoder; } - public Xodb_db_file Db_file() {return db_file;} private Xodb_db_file db_file; + public Xob_db_file Db_file() {return db_file;} private Xob_db_file db_file; public Db_conn Conn() {return conn;} private Db_conn conn; public Xob_redirect_tbl Create_table() {Sqlite_engine_.Tbl_create(conn, Tbl_name, Tbl_sql); return this;} public void Create_indexes(Gfo_usr_dlg usr_dlg) { - Sqlite_engine_.Idx_create(usr_dlg, conn, Xodb_db_file.Name__wiki_redirect, Idx_trg_id, Idx_trg_ttl); + Sqlite_engine_.Idx_create(usr_dlg, conn, Xob_db_file.Name__wiki_redirect, Idx_trg_id, Idx_trg_ttl); } public void Update_trg_redirect_id(Io_url core_url, int max_redirected_depth) { Sqlite_engine_.Db_attach(conn, "page_db", core_url.Raw()); // link database with page table @@ -67,7 +67,7 @@ public class Xob_redirect_tbl { } public void Rls_all() { insert_stmt.Rls(); - conn.Conn_term(); + conn.Rls_conn(); } public static final String Tbl_name = "redirect"; private static final String diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_fsdb_make.java b/400_xowa/src/gplx/xowa/bldrs/files/Xob_fsdb_make.java deleted file mode 100644 index 478f60f2d..000000000 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_fsdb_make.java +++ /dev/null @@ -1,326 +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 . -*/ -package gplx.xowa.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; -import gplx.xowa.wikis.*; import gplx.xowa.dbs.*; import gplx.fsdb.*; import gplx.ios.*; import gplx.xowa.dbs.tbls.*; -import gplx.xowa.files.*; import gplx.xowa.files.repos.*; import gplx.xowa.files.bins.*; import gplx.xowa.files.fsdb.*; -import gplx.xowa.bldrs.oimgs.*; -import gplx.fsdb.data.*; import gplx.fsdb.meta.*; -public class Xob_fsdb_make extends Xob_itm_basic_base implements Xob_cmd { - private int select_interval = 2500, progress_interval = 1, commit_interval = 1, delete_interval = 5000; - private int exec_count, exec_count_max = Int_.MaxValue; - private int exec_fail, exec_fail_max = 2000; // 115 over 900k - private boolean exec_done, resume_enabled = false; - private int page_id_bmk = -1, lnki_id_bmk = -1; - private int page_id_val = -1, lnki_id_val = -1; - private int page_id_end = Int_.MaxValue; - private boolean reset_db = false, exit_after_commit = false, exit_now = false; - private byte[] wiki_key; - private Xobu_poll_mgr poll_mgr; private int poll_interval; - private long time_bgn; - private Xodb_xowa_cfg_tbl tbl_cfg; private Db_conn conn; private Db_stmt db_select_stmt; - private Xof_bin_mgr src_mgr; - private Xof_fsdb_mgr__sql trg_fsdb_mgr; private Fsm_mnt_mgr trg_mnt_mgr; - private Fsd_img_itm tmp_img_itm = new Fsd_img_itm(); private Fsd_thm_itm tmp_thm_itm = Fsd_thm_itm.new_(); private Fsd_fil_itm tmp_fil_itm = new Fsd_fil_itm(); - private boolean app_restart_enabled = false; - private Xof_fsdb_mgr__sql src_fsdb_mgr; - public Xob_fsdb_make(Xob_bldr bldr, Xowe_wiki wiki) { - this.Cmd_ctor(bldr, wiki); - wiki.File_mgr__fsdb_mode().Tid_make_y_(); - trg_fsdb_mgr = new Xof_fsdb_mgr__sql(); - trg_fsdb_mgr.Init_by_wiki(wiki); - src_fsdb_mgr = new Xof_fsdb_mgr__sql(); - src_fsdb_mgr.Init_by_wiki(wiki); - src_mgr = src_fsdb_mgr.Bin_mgr(); - trg_mnt_mgr = trg_fsdb_mgr.Mnt_mgr(); - trg_mnt_mgr.Insert_to_mnt_(Fsm_mnt_mgr.Mnt_idx_main); // NOTE: do not delete; mnt_mgr default to Mnt_idx_user; DATE:2014-04-25 - Fsm_mnt_mgr.Patch(trg_mnt_mgr); // NOTE: always patch again; fsdb_make may be run separately without lnki_temp; DATE:2014-04-26 - poll_mgr = new Xobu_poll_mgr(bldr.App()); - } - public String Cmd_key() {return KEY_oimg;} public static final String KEY_oimg = "file.fsdb_make"; - public void Cmd_ini(Xob_bldr bldr) {} - public void Cmd_bgn(Xob_bldr bldr) { - ((Xof_bin_wkr__http_wmf)src_fsdb_mgr.Bin_mgr().Wkrs__get_or_new(Xof_bin_wkr_.Key_http_wmf)).Fail_timeout_(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 - this.wiki_key = wiki.Domain_bry(); - wiki.Init_assert(); - poll_interval = poll_mgr.Poll_interval(); - } - public void Cmd_run() {Exec();} - public void Cmd_end() { - if (exec_done) { - page_id_bmk = Int_.MaxValue; - lnki_id_bmk = Int_.MaxValue; - } - usr_dlg.Note_many("", "", "done: ~{0} ~{1}", exec_count, DecimalAdp_.divide_safe_(exec_count, Env_.TickCount_elapsed_in_sec(time_bgn)).Xto_str("#,###.000")); - this.Txn_save(); - tbl_cfg.Delete(Cfg_fsdb_make, Cfg_page_id_bmk); tbl_cfg.Delete(Cfg_fsdb_make, Cfg_lnki_id_bmk); // delete bmks if future reruns are needed; DATE:2014-08-20 - trg_fsdb_mgr.Txn_save(); - trg_fsdb_mgr.Rls(); // save changes and rls all connections - db_select_stmt.Rls(); - conn.Conn_term(); - } - public void Cmd_print() {} - private int db_reset_tries_count = 0, db_reset_tries_max = 5; - public void Exec() { - Init_db(true); - if (!Init_bmk(tbl_cfg)) {usr_dlg.Note_many("", "", "make done; delete xowa_cfg to restart"); return;} - ListAdp list = ListAdp_.new_(); - boolean loop = true; - time_bgn = Env_.TickCount(); - usr_dlg.Note_many("", "", "total pending: ~{0}", Xob_xfer_regy_tbl.Select_total_pending(conn)); - this.Txn_open(); - while (loop) { - byte rslt = Select_ttls(list); - switch (rslt) { - case Select_ttls_rslt_stop: loop = false; break; - case Select_ttls_rslt_next_page: ++page_id_val; lnki_id_val = 0; continue; - case Select_ttls_rslt_process: break; - } - if (!loop) break; // no more ttls found - int list_count = list.Count(); - usr_dlg.Prog_many("", "", "fetched pages: ~{0}", list_count); - for (int i = 0; i < list_count; i++) { - Xodb_tbl_oimg_xfer_itm itm = (Xodb_tbl_oimg_xfer_itm)list.FetchAt(i); - if (!Download_itm(itm) - || app_restart_enabled) { - this.Txn_renew(); - if (db_reset_tries_count < db_reset_tries_max) { - db_reset_tries_count++; - usr_dlg.Note_many("", "", "restarting db: ~{0}", db_reset_tries_count); - Init_db(false); - i--; - continue; - } - else - return; - } - if ( exit_now - || exec_count >= exec_count_max - || exec_fail >= exec_fail_max - || page_id_val >= page_id_end - ) { - this.Txn_renew(); - return; - } - } - } - exec_done = true; - } - private void Init_db(boolean chk_reset) { - Xodb_db_file db_file = Xodb_db_file.init__file_make(wiki.Fsys_mgr().Root_dir()); - conn = db_file.Conn(); - tbl_cfg = new Xodb_xowa_cfg_tbl().Conn_(conn); - if (reset_db && chk_reset) { - conn.Exec_qry(Db_qry_.delete_tbl_(Xodb_xowa_cfg_tbl.Tbl_name)); - } - db_select_stmt = Xob_xfer_regy_tbl.Select_by_page_id_stmt(conn); - } - private boolean Init_bmk(Xodb_xowa_cfg_tbl tbl_cfg) { - if (!resume_enabled) { // clear cfg entries if resume disabled; note that disabled by default; DATE:2014-10-24 - tbl_cfg.Delete(Cfg_fsdb_make, Cfg_page_id_bmk); - tbl_cfg.Delete(Cfg_fsdb_make, Cfg_lnki_id_bmk); - } - String page_id_str = tbl_cfg.Select_val(Cfg_fsdb_make, Cfg_page_id_bmk); - if (page_id_str == null) { // bmks not found; new db; insert; - tbl_cfg.Insert_str(Cfg_fsdb_make, Cfg_page_id_bmk , Int_.Xto_str(page_id_bmk)); - tbl_cfg.Insert_str(Cfg_fsdb_make, Cfg_lnki_id_bmk , Int_.Xto_str(lnki_id_bmk)); - if (page_id_bmk == -1) - page_id_bmk = 0; - if (lnki_id_bmk == -1) - lnki_id_bmk = 0; - } - else { - if (page_id_bmk == -1) { - page_id_bmk = Int_.parse_(page_id_str); - if (page_id_bmk == Int_.MaxValue) return false; - usr_dlg.Note_many("", "", "restoring from bmk: page_id=~{0}", page_id_bmk); - } - if (lnki_id_bmk == -1) { - lnki_id_bmk = tbl_cfg.Select_val_as_int(Cfg_fsdb_make, Cfg_lnki_id_bmk); - usr_dlg.Note_many("", "", "restoring from bmk: lnki_id=~{0}", lnki_id_bmk); - } - } - page_id_val = page_id_bmk; - lnki_id_val = lnki_id_bmk; - return true; - } - private static final byte Select_ttls_rslt_stop = 0, Select_ttls_rslt_process = 1, Select_ttls_rslt_next_page = 2; - private byte Select_ttls(ListAdp list) { - list.Clear(); - DataRdr rdr = DataRdr_.Null; - boolean pages_found = false, links_found = false; - try { - rdr = Xob_xfer_regy_tbl.Select_by_lnki_page_id(conn, page_id_val, select_interval); - 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 // if same page_id but lnki_id < last, then ignore; needed b/c select selects by page_id, and need to be handle breaks between pages - && itm.Lnki_id() <= lnki_id_val) - continue; - links_found = true; - list.Add(itm); - } - } finally {rdr.Rls();} - if (pages_found && !links_found) - return Select_ttls_rslt_next_page; - else if (!pages_found ) - return Select_ttls_rslt_stop; - else - return Select_ttls_rslt_process; - } - private boolean Download_itm(Xodb_tbl_oimg_xfer_itm itm) { - try { - page_id_val = itm.Lnki_page_id(); - lnki_id_val = itm.Lnki_id(); - Download(itm); - if ((exec_count % poll_interval) == 0) - poll_mgr.Poll(); - if (exec_count % commit_interval == 0) - this.Txn_renew(); - if (exec_count % delete_interval == 0) - Delete_files(); - return true; - } - catch (Exception exc) { - ++exec_fail; - String exc_message = Err_.Message_gplx_brief(exc); - usr_dlg.Warn_many("", "", "download error; ttl=~{0} w=~{1} err=~{2}", String_.new_utf8_(itm.Lnki_ttl()), itm.Lnki_w(), exc_message); - return !String_.Has(exc_message, "out of memory"); // hard stop if "java.sql.SQLException out of memory [java.sql.SQLException]" or "java.sql.SQLException [SQLITE_NOMEM] A malloc() failed (out of memory) [java.sql.SQLException]"; else code will fail for a hundred or more downloads before coming to a hard stop - } - } - private void Download(Xodb_tbl_oimg_xfer_itm itm) { - byte[] wiki = itm.Orig_repo_id() == Xof_repo_itm.Repo_local ? wiki_key : Xow_domain_.Domain_bry_commons; - itm.Orig_repo_name_(wiki); - Io_stream_rdr bin_rdr = Io_stream_rdr_.Null; - if ((exec_count % progress_interval) == 0) { - 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())); - } - try { - bin_rdr = src_mgr.Find_as_rdr(Xof_exec_tid.Tid_wiki_page, itm); - if (bin_rdr == Io_stream_rdr_.Null) - Download_fail(itm); - else { - Download_pass(itm, bin_rdr); - } - } - finally { - bin_rdr.Rls(); - } - ++exec_count; - } - private void Download_fail(Xodb_tbl_oimg_xfer_itm itm) { - ++exec_fail; - String lnki_ttl = String_.Format("[[File:{0}|{1}px]]", String_.new_utf8_(itm.Lnki_ttl()), itm.Html_w()); - usr_dlg.Warn_many("", "", "failed: ttl=~{0}", lnki_ttl); - } - private void Download_pass(Xodb_tbl_oimg_xfer_itm itm, Io_stream_rdr rdr) { - int db_uid = -1; - if (itm.File_is_orig()) { - if (itm.Lnki_ext().Id_is_image()) { - trg_fsdb_mgr.Mnt_mgr().Img_insert(tmp_img_itm, itm.Orig_repo_name(), itm.Lnki_ttl(), itm.Lnki_ext_id(), itm.Orig_w(), itm.Orig_h(), Sqlite_engine_.Date_null, Fsd_thm_tbl.Hash_null, rdr.Len(), rdr); - db_uid = tmp_img_itm.Id(); - } - else { - trg_fsdb_mgr.Mnt_mgr().Fil_insert(tmp_fil_itm, itm.Orig_repo_name(), itm.Lnki_ttl(), itm.Lnki_ext_id(), Sqlite_engine_.Date_null, Fsd_thm_tbl.Hash_null, rdr.Len(), rdr); - db_uid = tmp_fil_itm.Id(); - } - } - else { - trg_fsdb_mgr.Mnt_mgr().Thm_insert(tmp_thm_itm, itm.Orig_repo_name(), itm.Lnki_ttl(), itm.Lnki_ext_id(), itm.Html_w(), itm.Html_h(), itm.Lnki_time(), itm.Lnki_page(), Sqlite_engine_.Date_null, Fsd_thm_tbl.Hash_null, rdr.Len(), rdr); - db_uid = tmp_thm_itm.Id(); - } - if (app.Mode() == Xoa_app_.Mode_gui) - app.Usr_dlg().Log_direct(String_.Format("download done; size={0} id={1}", rdr.Len(), db_uid)); - } - private void Txn_renew() { - this.Txn_save(); - this.Txn_open(); - } - private void Txn_open() { - tbl_cfg.Conn().Txn_mgr().Txn_bgn_if_none(); - trg_mnt_mgr.Txn_open(); - } - private void Txn_save() { - usr_dlg.Prog_many("", "", "committing data: count=~{0} failed=~{1}", exec_count, exec_fail); - tbl_cfg.Update(Cfg_fsdb_make, Cfg_page_id_bmk, page_id_val); - tbl_cfg.Update(Cfg_fsdb_make, Cfg_lnki_id_bmk, lnki_id_val); - tbl_cfg.Conn().Txn_mgr().Txn_end_all(); - trg_mnt_mgr.Txn_save(); - if (exit_after_commit) - exit_now = true; - } - private void Delete_files() {// TODO: purge /xowa/file/ dir to free up hard disk space - } - @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_progress_interval_)) progress_interval = m.ReadInt("v"); - else if (ctx.Match(k, Invk_commit_interval_)) commit_interval = m.ReadInt("v"); - else if (ctx.Match(k, Invk_select_interval_)) select_interval = m.ReadInt("v"); - else if (ctx.Match(k, Invk_src_mgr)) return src_mgr; - else if (ctx.Match(k, Invk_poll_mgr)) return poll_mgr; - else if (ctx.Match(k, Invk_reset_db_)) reset_db = m.ReadYn("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_now_)) exit_now = m.ReadYn("v"); - else if (ctx.Match(k, Invk_exit_after_commit_)) exit_after_commit = m.ReadYn("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_delete_interval_)) delete_interval = m.ReadInt("v"); - else if (ctx.Match(k, Invk_app_restart_enabled_)) app_restart_enabled = m.ReadBool("v"); - else if (ctx.Match(k, Invk_db_restart_tries_max_)) db_reset_tries_max = m.ReadInt("v"); - else if (ctx.Match(k, Invk_trg_fsdb_mgr)) return trg_fsdb_mgr; - else if (ctx.Match(k, Invk_resume_enabled_)) resume_enabled = m.ReadYn("v"); - else return GfoInvkAble_.Rv_unhandled; - return this; - } - private static final String Cfg_fsdb_make = "bldr.fsdb_make", Cfg_page_id_bmk = "page_id_bmk", Cfg_lnki_id_bmk = "lnki_id_bmk"; - private static final String Invk_select_interval_ = "select_interval_", Invk_progress_interval_ = "progress_interval_", Invk_commit_interval_ = "commit_interval_" - , Invk_page_id_bmk_ = "page_id_bmk_", Invk_lnki_id_bmk_ = "lnki_id_bmk_" - , Invk_src_mgr = "src_mgr" - , Invk_poll_mgr = "poll_mgr", Invk_reset_db_ = "reset_db_" - , 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_delete_interval_ = "delete_interval_" - , Invk_app_restart_enabled_ = "app_restart_enabled_" - , Invk_db_restart_tries_max_ = "db_restart_tries_max_" - , Invk_trg_fsdb_mgr = "trg_fsdb_mgr" - , Invk_resume_enabled_ = "resume_enabled_" - ; - 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_page_id() {return lnki_page_id;} private int lnki_page_id; - public int Lnki_ext_id() {return lnki_ext_id;} private int lnki_ext_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_ext_id = rdr.ReadInt(Xob_xfer_regy_tbl.Fld_lnki_ext); - rv.Ctor_by_fsdb_make - ( rdr.ReadBryByStr(Xob_xfer_regy_tbl.Fld_lnki_ttl) - , 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; - } -} diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_temp_tbl.java b/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_temp_tbl.java deleted file mode 100644 index 2ff9c300e..000000000 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_temp_tbl.java +++ /dev/null @@ -1,62 +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 . -*/ -package gplx.xowa.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.dbs.*; -import gplx.dbs.engines.sqlite.*; -class Xob_lnki_temp_tbl { - public static void Create_table(Db_conn p) {Sqlite_engine_.Tbl_create(p, Tbl_name, Tbl_sql);} - public static Db_stmt Insert_stmt(Db_conn p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_lnki_page_id, Fld_lnki_ttl, Fld_lnki_commons_ttl, Fld_lnki_ext, Fld_lnki_type, Fld_lnki_src_tid, Fld_lnki_w, Fld_lnki_h, Fld_lnki_upright, Fld_lnki_time, Fld_lnki_page);} - public static void Insert(Db_stmt stmt, 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 thumbtime, int page) { - stmt.Clear() - .Val_int(page_id) - .Val_bry_as_str(ttl) - .Val_bry_as_str(ttl_commons) - .Val_byte(ext_id) - .Val_byte(img_type) - .Val_int(lnki_src_tid) - .Val_int(w) - .Val_int(h) - .Val_double(upright) - .Val_double(gplx.xowa.files.Xof_lnki_time.Db_save_double(thumbtime)) - .Val_int(page) - .Exec_insert(); - } - public static final String Tbl_name = "lnki_temp" - , Fld_lnki_id = "lnki_id" - , Fld_lnki_page_id = "lnki_page_id", 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" - ; - private static final String Tbl_sql = String_.Concat_lines_nl - ( "CREATE TABLE IF NOT EXISTS lnki_temp" - , "( lnki_id integer NOT NULL PRIMARY KEY AUTOINCREMENT" // NOTE: insertion order index - , ", lnki_page_id integer NOT NULL" - , ", lnki_ttl varchar(255) NOT NULL" - , ", lnki_commons_ttl varchar(255) NULL" - , ", lnki_ext integer NOT NULL" - , ", lnki_type integer NOT NULL" - , ", lnki_src_tid integer NOT NULL" - , ", lnki_w integer NOT NULL" - , ", lnki_h integer NOT NULL" - , ", lnki_upright double NOT NULL" - , ", lnki_time double NOT NULL" // thumbtime is float; using double b/c upright does and would like to keep datatypes same; https://bugzilla.wikimedia.org/show_bug.cgi?id=39014 - , ", lnki_page integer NOT NULL" - , ");" - ); -} diff --git a/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_log_mgr.java b/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_log_mgr.java index 7a35009c3..8734211b4 100644 --- a/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_log_mgr.java +++ b/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_log_mgr.java @@ -25,13 +25,13 @@ class Dg_log_mgr { private final Dg_page_rule_tbl tbl_page_rule = new Dg_page_rule_tbl(); private final Bry_bfr tmp_bfr = Bry_bfr.reset_(16); public void Init(Io_url db_url) { - Db_conn_bldr_data conn_data = Db_conn_bldr.I.Get_or_new("", db_url); + Db_conn_bldr_data conn_data = Db_conn_bldr.I.Get_or_new(db_url); conn = conn_data.Conn(); boolean created = conn_data.Created(); tbl_file.Conn_(conn, created); tbl_rule.Conn_(conn, created); tbl_page_score.Conn_(conn, created); tbl_page_rule.Conn_(conn, created); - conn.Txn_mgr().Txn_bgn(); + conn.Txn_bgn(); } public void Insert_file(Dg_file file) {tbl_file.Insert(file.Id(), file.Rel_path(), file.Lines().length);} public void Insert_rule(Dg_rule rule) {tbl_rule.Insert(rule.File_id(), rule.Id(), rule.Idx(), rule.Score(), Dg_word.Ary_concat(rule.Words(), tmp_bfr, Byte_ascii.Tilde));} @@ -39,8 +39,8 @@ class Dg_log_mgr { tbl_page_score.Insert(log_tid, page_id, page_ns, page_ttl, page_len, page_score, page_rule_count, clude_type); } public void Insert_page_rule(int log_tid, int page_id, int rule_id, int rule_score_total) {tbl_page_rule.Insert(log_tid, page_id, rule_id, rule_score_total);} - public void Commit() {conn.Txn_mgr().Txn_end_all_bgn_if_none();} - public void Rls() {conn.Txn_mgr().Txn_end_all();} + public void Commit() {conn.Txn_sav();} + public void Rls() {conn.Txn_end();} } class Dg_file_tbl { private String tbl_name = "dg_file"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); @@ -55,12 +55,12 @@ class Dg_file_tbl { Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds , Db_meta_idx.new_unique_by_tbl(tbl_name, "file_id", fld_file_id) ); - conn.Exec_create_tbl_and_idx(meta); + conn.Ddl_create_tbl(meta); } stmt_insert = null; } public void Insert(int file_id, String file_path, int rule_count) { - if (stmt_insert == null) stmt_insert = conn.Rls_reg(conn.Stmt_insert(tbl_name, flds)); + if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds); stmt_insert.Clear() .Val_int(fld_file_id , file_id) .Val_str(fld_file_path , file_path) @@ -68,7 +68,7 @@ class Dg_file_tbl { .Exec_insert(); } } -class Dg_rule_tbl { +class Dg_rule_tbl implements RlsAble { private String tbl_name = "dg_rule"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private String fld_file_id, fld_rule_id, fld_rule_idx, fld_rule_score, fld_rule_text; private Db_conn conn; private Db_stmt stmt_insert; @@ -83,12 +83,15 @@ class Dg_rule_tbl { Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds , Db_meta_idx.new_unique_by_tbl(tbl_name, "pkey", fld_rule_id) ); - conn.Exec_create_tbl_and_idx(meta); + conn.Ddl_create_tbl(meta); } - stmt_insert = null; + conn.Rls_reg(this); + } + public void Rls() { + stmt_insert = Db_stmt_.Rls(stmt_insert); } public void Insert(int file_id, int rule_id, int rule_idx, int rule_score, String rule_text) { - if (stmt_insert == null) stmt_insert = conn.Rls_reg(conn.Stmt_insert(tbl_name, flds)); + if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds); stmt_insert.Clear() .Val_int(fld_file_id , file_id) .Val_int(fld_rule_id , rule_id) @@ -98,7 +101,7 @@ class Dg_rule_tbl { .Exec_insert(); } } -class Dg_page_score_tbl { +class Dg_page_score_tbl implements RlsAble { private String tbl_name = "dg_page_score"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private String fld_log_tid, fld_page_id, fld_page_ns, fld_page_ttl, fld_page_len, fld_page_score, fld_page_rule_count, fld_clude_type; private Db_conn conn; private Db_stmt stmt_insert; @@ -116,12 +119,16 @@ class Dg_page_score_tbl { Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds , Db_meta_idx.new_unique_by_tbl(tbl_name, "pkey", fld_log_tid, fld_page_id) ); - conn.Exec_create_tbl_and_idx(meta); + conn.Ddl_create_tbl(meta); } stmt_insert = null; + conn.Rls_reg(this); + } + public void Rls() { + stmt_insert = Db_stmt_.Rls(stmt_insert); } public void Insert(int log_tid, int page_id, int page_ns, byte[] page_ttl, int page_len, int page_score, int page_rule_count, int clude_type) { - if (stmt_insert == null) stmt_insert = conn.Rls_reg(conn.Stmt_insert(tbl_name, flds)); + if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds); stmt_insert.Clear() .Val_int(fld_log_tid , log_tid) .Val_int(fld_page_id , page_id) @@ -134,7 +141,7 @@ class Dg_page_score_tbl { .Exec_insert(); } } -class Dg_page_rule_tbl { +class Dg_page_rule_tbl implements RlsAble { private String tbl_name = "dg_page_rule"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private String fld_log_tid, fld_page_id, fld_rule_id, fld_rule_score_total; private Db_conn conn; private Db_stmt stmt_insert; @@ -148,12 +155,16 @@ class Dg_page_rule_tbl { Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds , Db_meta_idx.new_unique_by_tbl(tbl_name, "pkey", fld_log_tid, fld_page_id, fld_rule_id) ); - conn.Exec_create_tbl_and_idx(meta); + conn.Ddl_create_tbl(meta); } stmt_insert = null; + conn.Rls_reg(this); + } + public void Rls() { + stmt_insert = Db_stmt_.Rls(stmt_insert); } public void Insert(int log_tid, int page_id, int rule_id, int rule_score_total) { - if (stmt_insert == null) stmt_insert = conn.Rls_reg(conn.Stmt_insert(tbl_name, flds)); + if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds); stmt_insert.Clear() .Val_int(fld_log_tid , log_tid) .Val_int(fld_page_id , page_id) diff --git a/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_match_mgr.java b/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_match_mgr.java index 500bbbf3d..42f03df9c 100644 --- a/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_match_mgr.java +++ b/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_match_mgr.java @@ -32,7 +32,7 @@ public class Dg_match_mgr { ttl_filter_mgr.Load(Bool_.N, root_dir.GenSubFil("xowa.title.include.txt")); ttl_filter_mgr.Load(Bool_.Y, root_dir.GenSubFil("xowa.title.exclude.txt")); Io_url dg_root_url = root_dir.GenSubDir("dansguardian"); - Dg_file[] files = parser.Parse_dir(dg_root_url); Gfo_usr_dlg_._.Plog_many("", "", "import.dg.rules: url=~{0} files=~{1}", dg_root_url, files.length); + Dg_file[] files = parser.Parse_dir(dg_root_url); Gfo_usr_dlg_.I.Plog_many("", "", "import.dg.rules: url=~{0} files=~{1}", dg_root_url, files.length); Init_by_files(files); if (log_enabled) log_mgr.Commit(); } diff --git a/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_parser.java b/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_parser.java index 253cecea2..52066d8a1 100644 --- a/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_parser.java +++ b/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_parser.java @@ -17,12 +17,12 @@ along with this program. If not, see . */ package gplx.xowa.bldrs.filters.dansguardians; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.filters.*; class Dg_parser { - private Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_._; private final Bry_bfr key_bldr = Bry_bfr.reset_(32); + private Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_.I; private final Bry_bfr key_bldr = Bry_bfr.reset_(32); private final ListAdp files = ListAdp_.new_(), lines = ListAdp_.new_(), words = ListAdp_.new_(); private int next_id = 0; public Dg_file[] Parse_dir(Io_url dir) { Io_url[] fil_urls = Io_mgr._.QueryDir_args(dir).Recur_(true).ExecAsUrlAry(); - this.usr_dlg = Gfo_usr_dlg_._; + this.usr_dlg = Gfo_usr_dlg_.I; files.Clear(); int len = fil_urls.length; for (int i = 0; i < len; ++i) { diff --git a/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_parser_tst.java b/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_parser_tst.java index b6466816f..319b0794e 100644 --- a/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_parser_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_parser_tst.java @@ -34,7 +34,7 @@ public class Dg_parser_tst { @Test public void Invalid_score() {fxt.Test_parse_line("<1a>", fxt.Make_line(Dg_rule.Score_banned, "a"));} // @Test public void Parse_dir() { // Dg_parser parser = new Dg_parser(); -// Gfo_usr_dlg_._ = Xoa_app_.usr_dlg_console_(); +// Gfo_usr_dlg_.I = Xoa_app_.usr_dlg_console_(); // parser.Parse_dir(Io_url_.new_dir_("C:\\xowa\\bin\\any\\xowa\\bldr\\filters\simple.wikipedia.org\\Dansguardian\\\\")); // } } diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_init_sql.java b/400_xowa/src/gplx/xowa/bldrs/imports/Xob_init_sql.java deleted file mode 100644 index 16824b72d..000000000 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_init_sql.java +++ /dev/null @@ -1,34 +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 . -*/ -package gplx.xowa.bldrs.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.xowa.xtns.wdatas.*; import gplx.xowa.dbs.*; import gplx.xowa.xtns.wdatas.imports.*; -public class Xob_init_sql extends Xob_init_base { - public Xob_init_sql(Xob_bldr bldr, Xowe_wiki wiki) {this.Ctor(bldr, wiki);} - @Override public String Cmd_key() {return KEY;} public static final String KEY = "import.sql.init"; - @Override public void Cmd_ini_wdata(Xob_bldr bldr, Xowe_wiki wiki) { - bldr.Cmd_mgr().Add_cmd(wiki, Xob_wdata_qid_sql.KEY); - bldr.Cmd_mgr().Add_cmd(wiki, Xob_wdata_pid_sql.KEY); - } - @Override public void Cmd_run_end(Xowe_wiki wiki) { - if (Xodb_mgr_sql.Find_core_url(wiki) != null) throw wiki.Appe().Bldr().Usr_dlg().Fail_many("", "", "directory must not contain any sqlite3 files: ~{0}", wiki.Fsys_mgr().Root_dir().Raw()); - String ns_map = wiki.Appe().Setup_mgr().Dump_mgr().Db_ns_map(); - Xodb_mgr_sql db_mgr = wiki.Db_mgr_create_as_sql(); - db_mgr.Init_by_ns_map(ns_map); // NOTE: must Init after Xob_siteinfo_parser b/c Xob_siteinfo_parser will create new ns itms - db_mgr.Tbl_xowa_cfg().Insert_str(Xodb_mgr_sql.Grp_wiki_init, "db_mgr.data_storage_format", Xoi_dump_mgr.Wtr_tid_to_str(db_mgr.Data_storage_format())); // NOTE: insert data_storage_format at init stage, not at term stage; bldr will reload wiki, and will default to gz since setting is not saved; DATE:2013-10-27 - } -} diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_init_sql_tst.java b/400_xowa/src/gplx/xowa/bldrs/imports/Xob_init_sql_tst.java deleted file mode 100644 index 754144804..000000000 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_init_sql_tst.java +++ /dev/null @@ -1,58 +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 . -*/ -package gplx.xowa.bldrs.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import org.junit.*; -public class Xob_init_sql_tst { - @Before public void init() {fxt.Clear();} private Xob_init_sql_fxt fxt = new Xob_init_sql_fxt(); - @Test public void Basic() { -// fxt.Init_fsys(); -// fxt.Test_run(); - } -} -class Xob_init_sql_fxt { - public void Clear() { - fxt.Ctor_fsys(); - app = fxt.Wiki().Appe(); - wiki = fxt.Wiki(); - } Db_mgr_fxt fxt = new Db_mgr_fxt(); - public Xoae_app App() {return app;} private Xoae_app app; - public Xowe_wiki Wiki() {return wiki;} private Xowe_wiki wiki; - public void Init_fsys() { - Io_url wiki_dir = wiki.Fsys_mgr().Root_dir(); - Io_url[] fils = Io_mgr._.QueryDir_fils(wiki_dir); - int len = fils.length; - for (int i = 0; i < len; i++) { - Io_mgr._.DeleteFil(fils[i]); - } -// Io_mgr._.DeleteFil(wiki_dir.GenSubFil("en.wikipedia.org.sqlite3")); - Io_mgr._.SaveFilStr(wiki_dir.GenSubFil("siteinfo.xml"), gplx.xowa.utls.upgrades.Upgrader_v00_02_01_tst.Str_siteinfo_xml); -// Io_mgr._.DeleteDirDeep(Db_mgr_fxt.Test_root().GenSubDir("root", "wiki", "en.wikipedia.org")); -// app.Fsys_mgr().Root_dir() -// Db_mgr_fxt.Test_root() - // Io_mgr._ - // mem/xowa/user/test_user/app/setup/wikixowa.core.sqlite3 - } - public void Test_run() { -// fxt.Init_db_sqlite(wiki.Fsys_mgr().Root_dir().GenSubFil("en.wikipedia.org.sqlite3")); - app.Bldr().Cmd_mgr().Add_many(wiki, Xob_init_sql.KEY); - app.Bldr().Run(); - // test database copied - // test cfg values exists - // test ns parsed - } -} diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_page_sql.java b/400_xowa/src/gplx/xowa/bldrs/imports/Xob_page_sql.java deleted file mode 100644 index 753ecac27..000000000 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_page_sql.java +++ /dev/null @@ -1,202 +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 . -*/ -package gplx.xowa.bldrs.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.dbs.*; import gplx.ios.*; import gplx.xowa.bldrs.wikis.redirects.*; -import gplx.xowa.wikis.data.*; import gplx.xowa.dbs.*; import gplx.xowa.dbs.tbls.*; -import gplx.xowa.bldrs.filters.dansguardians.*; -public class Xob_page_sql extends Xob_itm_basic_base implements Xobd_wkr, GfoInvkAble { - private Db_idx_mode idx_mode = Db_idx_mode.Itm_end; - private Io_stream_zip_mgr zip_mgr; private byte data_storage_format; private boolean redirect_id_enabled; - private Xodb_mgr_sql db_mgr; private Xowe_core_data_mgr fsys_mgr; private Db_conn page_conn; private Db_stmt page_stmt; private Xob_text_stmts_mgr text_stmts_mgr; - private int page_count_all, page_count_main = 0; private int txn_commit_interval = 100000; // 100 k - private DateAdp modified_latest = DateAdp_.MinValue; - private Xop_redirect_mgr redirect_mgr; private Xob_redirect_tbl redirect_tbl; - private boolean dg_enabled = Bool_.N; private Dg_match_mgr dg_match_mgr; // private Xob_ttl_filter_mgr ttl_filter_mgr; - public Xob_page_sql(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} - public String Wkr_key() {return KEY;} public static final String KEY = "import.sql.page"; - public void Wkr_bgn(Xob_bldr bldr) { - // init local variables - Xoae_app app = wiki.Appe(); - app.Bldr().Parser().Trie_tab_del_(); // disable swapping for \t - zip_mgr = app.Zip_mgr(); - redirect_mgr = wiki.Redirect_mgr(); - data_storage_format = app.Setup_mgr().Dump_mgr().Data_storage_format(); - - // init db - db_mgr = wiki.Db_mgr_as_sql(); - db_mgr.Data_storage_format_(data_storage_format); - fsys_mgr = db_mgr.Core_data_mgr(); - page_conn = fsys_mgr.Conn_page(); - page_stmt = db_mgr.Tbl_page().Insert_stmt(page_conn); - page_conn.Txn_mgr().Txn_bgn_if_none(); - text_stmts_mgr = new Xob_text_stmts_mgr(db_mgr, fsys_mgr); - if (idx_mode.Tid_is_bgn()) Idx_create(); - - if (redirect_id_enabled) { - redirect_tbl = new Xob_redirect_tbl(wiki.Fsys_mgr().Root_dir(), Xoa_app_.Utl__encoder_mgr().Url_ttl()).Create_table(); - redirect_tbl.Conn().Txn_mgr().Txn_bgn_if_none(); - } - - // dansguardian - dg_match_mgr = app.Api_root().Bldr().Wikis().Filters().Dansguardians().New_mgr(wiki.Domain_str(), wiki.Fsys_mgr().Root_dir()); - dg_enabled = dg_match_mgr != null; - } - public void Wkr_run(Xodb_page page) { - int page_id = page.Id(); - DateAdp modified = page.Modified_on(); - if (modified.compareTo(modified_latest) == CompareAble_.More) modified_latest = modified; - byte[] text = page.Wtxt(); - int text_len = page.Wtxt_len(); - Xoa_ttl redirect_ttl = redirect_mgr.Extract_redirect(text, text_len); - boolean redirect = redirect_ttl != null; - page.Redirected_(redirect); - Xow_ns ns = page.Ns(); - int random_int = ns.Count() + 1; - ns.Count_(random_int); - if (dg_enabled) { - if (dg_match_mgr.Match(1, page_id, ns.Id(), page.Ttl_page_db(), page.Ttl_full_db(), wiki.Lang(), text)) return; - } - text = zip_mgr.Zip(data_storage_format, text); - int text_stmt_idx = text_stmts_mgr.Stmt_by_ns(ns.Bldr_file_idx(), text.length); // NOTE: was text.length, but want text_len which is original page_len, not compressed; DATE:2014-08-04 - Db_stmt text_stmt = text_stmts_mgr.Stmt_at(text_stmt_idx); - try { - db_mgr.Page_create(page_stmt, text_stmt, page_id, page.Ns_id(), page.Ttl_page_db(), redirect, modified, text, random_int, text_stmt_idx); - } - catch (Exception e) { - usr_dlg.Warn_many("", "", "failed to insert page: id=~{0} ns=~{1} title=~{2} error=~{3}", page.Id(), page.Ns_id(), String_.new_utf8_(page.Ttl_page_db()), Err_.Message_gplx_brief(e)); - page_stmt.Reset_stmt(); // must new stmt variable, else java.sql.SQLException: "statement is not executing" - text_stmt.Reset_stmt(); // must new stmt variable, else java.sql.SQLException: "statement is not executing" - } - if (redirect && redirect_id_enabled) { - redirect_tbl.Insert(page_id, page.Ttl_page_db(), redirect_ttl); - } - ++page_count_all; - if (ns.Id_main() && !page.Redirected()) ++page_count_main; - if (page_count_all % txn_commit_interval == 0) { - Db_conn conn = text_stmts_mgr.Conn_at(text_stmt_idx); - conn.Txn_mgr().Txn_end_all_bgn_if_none(); - if (dg_enabled) dg_match_mgr.Commit(); - } - } - public void Wkr_end() { - if (dg_enabled) dg_match_mgr.Rls(); - usr_dlg.Log_many("", "", "import.page: insert done; committing pages; pages=~{0}", page_count_all); - page_conn.Txn_mgr().Txn_end_all(); - page_stmt.Rls(); - text_stmts_mgr.Rls(); - usr_dlg.Log_many("", "", "import.page: updating core stats"); - Xow_ns_mgr ns_mgr = wiki.Ns_mgr(); - db_mgr.Tbl_site_stats().Update(page_count_main, page_count_all, ns_mgr.Ns_file().Count()); // save page stats - db_mgr.Tbl_xowa_ns().Insert(ns_mgr); // save ns - db_mgr.Core_data_mgr().Dbs__save(); // save dbs; note that dbs can be saved again later - db_mgr.Tbl_xowa_cfg().Insert_str(Xodb_mgr_sql.Grp_wiki_init, "props.modified_latest", modified_latest.XtoStr_fmt(DateAdp_.Fmt_iso8561_date_time)); - if (idx_mode.Tid_is_end()) Idx_create(); - if (redirect_id_enabled) { - redirect_tbl.Conn().Txn_mgr().Txn_end_all(); - Xowd_db_file core_file = fsys_mgr.Dbs__get_by_tid_1st(Xowd_db_file_.Tid_core); - redirect_tbl.Update_trg_redirect_id(core_file.Url(), 1); - redirect_tbl.Update_src_redirect_id(core_file.Url(), page_conn); - } - } - private void Idx_create() { - fsys_mgr.Index_create(usr_dlg, Byte_.Ary(Xowd_db_file_.Tid_core, Xowd_db_file_.Tid_text), Idx_page_title, Idx_page_random); - } - @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_txn_commit_interval_)) txn_commit_interval = m.ReadInt("v"); - else if (ctx.Match(k, Invk_idx_mode_)) idx_mode = Db_idx_mode.Xto_itm(m.ReadStr("v")); - else if (ctx.Match(k, Invk_redirect_id_enabled_)) redirect_id_enabled = m.ReadYn("v"); - else return super.Invk(ctx, ikey, k, m); - return this; - } - private static final String Invk_txn_commit_interval_ = "txn_commit_interval_", Invk_idx_mode_ = "idx_mode_", Invk_redirect_id_enabled_ = "redirect_id_enabled_"; - public void Wkr_ini(Xob_bldr bldr) {} - public void Wkr_print() {} - private static final Db_idx_itm - Idx_page_title = Db_idx_itm.sql_("CREATE UNIQUE INDEX IF NOT EXISTS page__title ON page (page_namespace, page_title, page_id, page_len, page_is_redirect);") // PERF:page_id for general queries; PERF: page_len for search_suggest; PREF:page_is_redirect for oimg - , Idx_page_random = Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS page__name_random ON page (page_namespace, page_random_int);") - ; -} -class Xob_text_stmts_mgr { - public Xob_text_stmts_mgr(Xodb_mgr_sql db_mgr, Xowe_core_data_mgr fsys_mgr) {this.db_mgr = db_mgr; this.fsys_mgr = fsys_mgr;} private Xodb_mgr_sql db_mgr; Xowe_core_data_mgr fsys_mgr; - public Db_stmt Stmt_at(int i) {return text_stmts[i];} - public Db_conn Conn_at(int i) {return text_providers[i];} - public int Stmt_by_ns(int ns_file_idx, int text_len) { - Xowd_db_file file = File_get(ns_file_idx, text_len); - int stmt_idx = file.Id(); - Db_stmt stmt = null; - if (stmt_idx < text_stmts_len) { - stmt = text_stmts[stmt_idx]; - if (stmt != null) return stmt_idx; - } - Db_conn conn = file.Conn(); - stmt = db_mgr.Tbl_text().Insert_stmt(conn); - conn.Txn_mgr().Txn_bgn_if_none(); // automatically start txn - Add(conn, stmt, stmt_idx); - return stmt_idx; - } - public void Rls() { - for (int i = 0; i < text_stmts_len; i++) { - Db_stmt stmt = text_stmts[i]; - if (stmt != null) { - Db_conn conn = text_providers[i]; - conn.Txn_mgr().Txn_end_all(); - stmt.Rls(); - } - text_stmts[i] = null; - } - text_stmts = null; - } - Xowd_db_file File_get(int file_idx, int text_len) { - if (file_idx == Xow_ns.Bldr_file_idx_heap) { - file_idx = fsys_mgr.Tid_text_idx(); - Xowd_db_file file = Dbs__get_or_make(fsys_mgr, Xowd_db_file_.Tid_text, file_idx); - long file_len = file.File_len(); - long file_max = fsys_mgr.Tid_text_max(); - if (file_max != Xowe_core_data_mgr.Heap_max_infinite && (file_len + text_len > file_max)) { // file is "full" - file.Conn().Txn_mgr().Txn_end_all(); // close txn - file = fsys_mgr.Dbs__add_new(Xowd_db_file_.Tid_text); - file_idx = file.Id(); - fsys_mgr.Tid_text_idx_(file_idx); - } - file.File_len_add(text_len); - return file; - } - else - return Dbs__get_or_make(fsys_mgr, Xowd_db_file_.Tid_text, file_idx); - } - private static Xowd_db_file Dbs__get_or_make(Xowe_core_data_mgr core_data_mgr, byte file_tid, int file_idx) { - int len = core_data_mgr.Dbs__len(); - return file_idx < len ? core_data_mgr.Dbs__get_at(file_idx) : core_data_mgr.Dbs__add_new(file_tid); - } - private void Add(Db_conn conn, Db_stmt stmt, int stmt_idx) { - int new_len = stmt_idx + 1; - if (new_len > text_stmts_max) { // ary too small >>> expand - text_stmts_max = new_len * 2; - Db_stmt[] text_stmts_subs = new Db_stmt[text_stmts_max]; - Array_.CopyTo(text_stmts, 0, text_stmts_subs, 0, text_stmts_len); - text_stmts = text_stmts_subs; - - Db_conn[] new_providers = new Db_conn[text_stmts_max]; - Array_.CopyTo(text_providers, 0, new_providers, 0, text_stmts_len); - text_providers = new_providers; - } - text_stmts[stmt_idx] = stmt; - text_providers[stmt_idx] = conn; - text_stmts_len = new_len; - } private Db_stmt[] text_stmts = new Db_stmt[0]; int text_stmts_len, text_stmts_max = 0; private Db_conn[] text_providers = new Db_conn[0]; -} diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_sql_cmd.java b/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_sql_cmd.java deleted file mode 100644 index 6fceafa34..000000000 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_sql_cmd.java +++ /dev/null @@ -1,91 +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 . -*/ -package gplx.xowa.bldrs.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.xowa.wikis.data.*; import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; import gplx.xowa.dbs.*; import gplx.xowa.dbs.tbls.*; -public class Xob_search_sql_cmd extends Xob_itm_basic_base implements Xob_cmd { - public Xob_search_sql_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} - public String Cmd_key() {return KEY_search_sql;} public static final String KEY_search_sql = "import.sql.search_title.cmd"; - public void Cmd_ini(Xob_bldr bldr) {} - public void Cmd_bgn(Xob_bldr bldr) {} - public void Cmd_run() {this.Exec(wiki);} - public void Cmd_end() {} - public void Cmd_print() {} - public void Exec(Xowe_wiki wiki) { - usr_dlg.Log_many("", "", "search_title.cmd: initing wiki"); - if (!Env_.Mode_testing()) wiki.Init_assert(); - Xowe_core_data_mgr db_fs = wiki.Db_mgr_as_sql().Core_data_mgr(); - usr_dlg.Log_many("", "", "search_title.cmd: getting core db"); - Xowd_db_file page_db = db_fs.Dbs__get_by_tid_1st(Xowd_db_file_.Tid_core); - usr_dlg.Log_many("", "", "search_title.cmd: getting existing searchdb"); - Xowd_db_file search_db = db_fs.Dbs__get_by_tid_1st(Xowd_db_file_.Tid_search); - if (search_db == null) { - usr_dlg.Log_many("", "", "search_title.cmd: making new searchdb"); - search_db = db_fs.Dbs__add_new(Xowd_db_file_.Tid_search); - } - DataRdr page_rdr = DataRdr_.Null; - Db_conn search_provider = search_db.Conn(); - usr_dlg.Log_many("", "", "search_title.cmd: droping tables"); - Sqlite_engine_.Tbl_delete_many(search_provider, Xodb_tbl_search_title_temp.Tbl_name, Xodb_search_title_word_tbl.Tbl_name, Xodb_search_title_page_tbl.Tbl_name); - usr_dlg.Log_many("", "", "search_title.cmd: creating db connection; conn=~{0}", search_provider.Url().Xto_raw()); - Xodb_tbl_search_title_temp search_temp_tbl = new Xodb_tbl_search_title_temp().Create_table(search_provider); - try { - usr_dlg.Log_many("", "", "search_title.cmd: starting select;"); - search_provider.Txn_mgr().Txn_bgn_if_none(); - page_rdr = wiki.Db_mgr_as_sql().Tbl_page().Select_all(page_db.Conn()); - usr_dlg.Log_many("", "", "search_title.cmd: other init;"); - Db_stmt search_temp_stmt = search_temp_tbl.Insert_stmt(search_provider); - Xol_lang lang = wiki.Lang(); - Bry_bfr bfr = Bry_bfr.reset_(1024); - OrderedHash hash = OrderedHash_.new_(); - int page_count = 0; - while (page_rdr.MoveNextPeer()) { - int page_id = page_rdr.ReadInt(Xodb_page_tbl.Fld_page_id); - byte[] ttl = page_rdr.ReadBryByStr(Xodb_page_tbl.Fld_page_title); - byte[][] words = Xob_search_base.Split(lang, hash, bfr, ttl); - int words_len = words.length; - for (int i = 0; i < words_len; i++) { - byte[] word = words[i]; - search_temp_tbl.Insert(search_temp_stmt, page_id, word); - } - ++page_count; - if ((page_count % commit_interval) == 0) - Commit(search_provider); - else if ((page_count % progress_interval) == 0) - usr_dlg.Prog_many("", "", "parse progress: count=~{0} last=~{1}", page_count, String_.new_utf8_(ttl)); - } - this.Commit(search_provider); - } - finally { - page_rdr.Rls(); - } - search_provider.Txn_mgr().Txn_end_all_bgn_if_none(); - search_temp_tbl.Make_data(usr_dlg, search_provider); - search_provider.Txn_mgr().Txn_bgn_if_none(); - wiki.Db_mgr_as_sql().Core_data_mgr().Dbs__save(); - search_provider.Txn_mgr().Txn_end_all(); - } private int commit_interval = 100000, progress_interval = 10000; - private void Commit(Db_conn search_provider) { - search_provider.Txn_mgr().Txn_end_all_bgn_if_none(); - } - @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - 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 return GfoInvkAble_.Rv_unhandled; - return this; - } private static final String Invk_progress_interval_ = "progress_interval_", Invk_commit_interval_ = "commit_interval_"; -} diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_sql_wkr.java b/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_sql_wkr.java deleted file mode 100644 index 425d3a0a7..000000000 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_sql_wkr.java +++ /dev/null @@ -1,124 +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 . -*/ -package gplx.xowa.bldrs.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.ios.*; -import gplx.xowa.wikis.data.*; import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; import gplx.xowa.dbs.*; import gplx.xowa.dbs.tbls.*; -public class Xob_search_sql_wkr extends Xob_search_base implements Io_make_cmd { - public Xob_search_sql_wkr(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} private Xodb_mgr_sql db_mgr = null; - @Override public String Wkr_key() {return KEY;} public static final String KEY = "import.sql.search_title.wkr"; - @Override public gplx.ios.Io_make_cmd Make_cmd_site() {return this;} - public Io_sort_cmd Make_dir_(Io_url v) {return this;} // noop - public void Sort_bgn() { - db_mgr = wiki.Db_mgr_as_sql(); - boolean created = false; - Xowd_db_file search_db = db_mgr.Core_data_mgr().Dbs__get_by_tid_1st(Xowd_db_file_.Tid_search); - if (search_db == null) { - search_db = db_mgr.Core_data_mgr().Dbs__add_new(Xowd_db_file_.Tid_search); - created = true; - } - conn = search_db.Conn(); - if (created) { - Xodb_search_title_word_tbl.Create_table(conn); - Xodb_search_title_page_tbl.Create_table(conn); - } - conn.Txn_mgr().Txn_bgn_if_none(); - stmt_word = Xodb_search_title_word_tbl.Insert_stmt(conn); - stmt_page = Xodb_search_title_page_tbl.Insert_stmt(conn); - } private Db_conn conn; private int search_id = 0; private Db_stmt stmt_word, stmt_page; - public byte Line_dlm() {return line_dlm;} public Xob_search_sql_wkr Line_dlm_(byte v) {line_dlm = v; return this;} private byte line_dlm = Byte_ascii.Nil; - private byte[] prv_word = Bry_.Empty; - public void Sort_do(Io_line_rdr rdr) { - if (line_dlm == Byte_ascii.Nil) line_dlm = rdr.Line_dlm(); - byte[] bry = rdr.Bfr(); - byte[] cur_word = Bry_.Mid(bry, rdr.Key_pos_bgn(), rdr.Key_pos_end()); - if (!Bry_.Eq(cur_word, prv_word)) { - Xodb_search_title_word_tbl.Insert(stmt_word, ++search_id, cur_word); - prv_word = cur_word; - } - Xodb_search_title_page_tbl.Insert(stmt_page, search_id, Base85_utl.XtoIntByAry(bry, rdr.Key_pos_end() + 1, rdr.Key_pos_end() + 5)); // -1: ignore rdr_dlm - } - public void Sort_end() { - conn.Txn_mgr().Txn_end_all(); - Xodb_tbl_search_title_temp.Cleanup(usr_dlg, conn); - } -} -class Xodb_tbl_search_title_temp { - public Xodb_tbl_search_title_temp Create_table(Db_conn p) {Sqlite_engine_.Tbl_create(p, Tbl_name, Tbl_sql); return this;} - public void Make_data(Gfo_usr_dlg usr_dlg, Db_conn p) { - Xodb_search_title_word_tbl.Create_table(p); - Xodb_search_title_page_tbl.Create_table(p); - p.Txn_mgr().Txn_end_all_bgn_if_none(); - Sqlite_engine_.Idx_create(usr_dlg, p, "search_title_temp", Idx_main); - p.Txn_mgr().Txn_end_all_bgn_if_none(); - p.Exec_sql(Sql_create_word); - p.Txn_mgr().Txn_end_all_bgn_if_none(); - p.Exec_sql(Sql_create_link); - p.Txn_mgr().Txn_end_all_bgn_if_none(); - Cleanup(usr_dlg, p); - p.Txn_mgr().Txn_end_all_bgn_if_none(); - p.Txn_mgr().Txn_end(); // must end all transactions before vacuum - p.Exec_sql("VACUUM;"); - } - public static void Cleanup(Gfo_usr_dlg usr_dlg, Db_conn p) { - p.Exec_sql("DROP TABLE IF EXISTS search_title_temp;"); - try { - Xodb_search_title_word_tbl.Create_index(usr_dlg, p); - } catch (Exception e) { - usr_dlg.Warn_many("", "", "failed to create unique index for search title word: err=~{0}", Err_.Message_gplx_brief(e)); - } - try { - Xodb_search_title_page_tbl.Create_index_unique(usr_dlg, p); - } catch (Exception e) { - usr_dlg.Warn_many("", "", "failed to create unique index: err=~{0}", Err_.Message_gplx_brief(e)); - Xodb_search_title_page_tbl.Create_index_non_unique(usr_dlg, p); - } - } - public Db_stmt Insert_stmt(Db_conn p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_stt_page_id, Fld_stt_word);} - public void Insert(Db_stmt stmt, int page_id, byte[] word) { - stmt.Clear() - .Val_int(page_id) - .Val_bry_as_str(word) - .Exec_insert(); - } - public static final String Tbl_name = "search_title_temp", Fld_stt_page_id = "stt_page_id", Fld_stt_word = "stt_word"; - public static final Db_idx_itm Idx_main = Db_idx_itm.sql_("CREATE UNIQUE INDEX IF NOT EXISTS search_title_temp__main ON search_title_temp (stt_word, stt_page_id);"); - private static final String Tbl_sql = String_.Concat_lines_nl - ( "CREATE TABLE IF NOT EXISTS search_title_temp" - , "( stt_id integer NOT NULL PRIMARY KEY AUTOINCREMENT" - , ", stt_word varchar(255) NOT NULL" - , ", stt_page_id integer NOT NULL" - , ");" - ); - private static final String Sql_create_word = String_.Concat_lines_nl - ( "INSERT INTO search_title_word (stw_word_id, stw_word)" - , "SELECT stt_id" - , ", stt_word" - , "FROM search_title_temp" - , "GROUP BY " - , " stt_word" - , ";" - ); - private static final String Sql_create_link = String_.Concat_lines_nl - ( "INSERT INTO search_title_page (stp_word_id, stp_page_id)" - , "SELECT stw.stw_word_id" - , ", stt.stt_page_id" - , "FROM search_title_temp stt" - , " JOIN search_title_word stw ON stt.stt_word = stw.stw_word" - , ";" - ); -} diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_sql_make.java b/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_sql_make.java deleted file mode 100644 index b2d23cab5..000000000 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_sql_make.java +++ /dev/null @@ -1,162 +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 . -*/ -package gplx.xowa.bldrs.imports.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.imports.*; -import gplx.core.flds.*; import gplx.ios.*; import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.ctgs.*; -import gplx.xowa.wikis.data.*; -public class Xob_categorylinks_sql_make implements Io_make_cmd { - private Xowe_wiki wiki; private Sql_file_parser sql_parser; private Db_idx_mode idx_mode; - private Xodb_mgr_sql db_mgr; - 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; - } - public Io_sort_cmd Make_dir_(Io_url v) {return this;} - public void Sort_bgn() { - usr_dlg = wiki.Appe().Usr_dlg(); - db_mgr = Xodb_mgr_sql.Get_or_load(wiki); - name_id_rdr = New_registry_rdr(wiki, usr_dlg); - cur_cat_file_max = wiki.Appe().Setup_mgr().Dump_mgr().Db_categorylinks_max(); - - db_mgr.Delete_by_tid(Xowd_db_file_.Tid_category); - Xowe_core_data_mgr fsys_mgr = db_mgr.Core_data_mgr(); - Xowd_db_file category_file = fsys_mgr.Dbs__get_by_tid_1st(Xowd_db_file_.Tid_core); - if (cur_cat_file_max > 0) { - category_file = fsys_mgr.Dbs__add_new(Xowd_db_file_.Tid_category); - fsys_mgr.Conn_ctg_(category_file); - } - - cat_provider = db_mgr.Core_data_mgr().Conn_ctg(); - ctg_stmt = db_mgr.Tbl_category().Insert_stmt(cat_provider); - File_open(category_file); - first_provider = true; - if (idx_mode.Tid_is_bgn()) Idx_create(fsys_mgr); - } Db_conn cl_provider, cat_provider; Gfo_fld_rdr fld_rdr = Gfo_fld_rdr.xowa_(); Db_stmt cl_stmt = Db_stmt_.Null, ctg_stmt = Db_stmt_.Null; int row_count = 0; Gfo_usr_dlg usr_dlg; boolean first_provider; - int[] cur_cat_counts = new int[Xoa_ctg_mgr.Tid__max]; long cur_cat_file_size, cur_cat_file_max; byte[] cur_cat_ttl = Ttl_first; int cur_cat_id; int cur_cat_file_idx; - public byte Line_dlm() {return line_dlm;} public Xob_categorylinks_sql_make Line_dlm_(byte v) {line_dlm = v; return this;} private byte line_dlm = Byte_ascii.Nil; - public void Sort_do(Io_line_rdr rdr) { - byte[] ctg_name = Bry_.Empty; - try { - if (line_dlm == Byte_ascii.Nil) line_dlm = rdr.Line_dlm(); - fld_rdr.Ini(rdr.Bfr(), rdr.Itm_pos_bgn()); - ctg_name = fld_rdr.Read_bry_escape(); - if (!Bry_.Eq(ctg_name, cur_cat_ttl)) cur_cat_id = Ctg_grp_end(ctg_name); - if (cur_cat_id == Cur_cat_id_null) return; - byte ctg_tid = Ctg_tid_ltr_to_byte(fld_rdr.Read_byte()); - byte[] ctg_sortkey = fld_rdr.Read_bry_escape(); - int page_id = fld_rdr.Read_int_base85_len5(); - int ctg_added = fld_rdr.Read_int_base85_len5(); - db_mgr.Tbl_categorylinks().Insert(cl_stmt, page_id, cur_cat_id, ctg_sortkey, ctg_added, ctg_tid); - cur_cat_file_size += 34 + 20 + 12 + (ctg_sortkey.length * 2); // see NOTE_1: categorylinks row size - ++cur_cat_counts[ctg_tid]; - ++row_count; - if (row_count % 100000 == 0) usr_dlg.Prog_one("", "", "inserting category row: ~{0}", row_count); - if (row_count % 1000000 == 0) cl_provider.Txn_mgr().Txn_end_all_bgn_if_none(); - } catch (Exception e) {usr_dlg.Warn_many("", "", "ctg_links.insert failed: name=~{0} err=~{1}", String_.new_utf8_(ctg_name), Err_.Message_gplx_brief(e));} - } - public void Sort_end() { - Xowe_core_data_mgr core_data_mgr = db_mgr.Core_data_mgr(); - Ctg_grp_end(Ttl_last); - File_close(); - core_data_mgr.Dbs__save(); - if (db_mgr.Category_version() == Xoa_ctg_mgr.Version_null) // NOTE: ctg_v1 wkr will set this to v1; only set to v2 if null - db_mgr.Category_version_update(false); - usr_dlg.Log_many("", "", "import.category.v2: insert done; committing; rows=~{0}", row_count); - cat_provider.Txn_mgr().Txn_end_all(); - ctg_stmt.Rls(); - if (idx_mode.Tid_is_end()) Idx_create(core_data_mgr); - 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 void Idx_create(Xowe_core_data_mgr fsys_mgr) { - fsys_mgr.Index_create(usr_dlg, Byte_.Ary(Xowd_db_file_.Tid_core, Xowd_db_file_.Tid_category), Idx_categorylinks_from, Idx_categorylinks_main); - } - int Ctg_grp_end(byte[] new_ctg_ttl) { - if (cur_cat_ttl != Bry_.Empty && cur_cat_id != -1) - db_mgr.Tbl_category().Insert(ctg_stmt, 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 (cur_cat_file_max > 0 && cur_cat_file_size > cur_cat_file_max) {File_close(); File_open(db_mgr.Core_data_mgr().Dbs__add_new(Xowd_db_file_.Tid_category));} - 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 File_open(Xowd_db_file file) { - cl_provider = file.Conn(); - cl_stmt = db_mgr.Tbl_categorylinks().Insert_stmt(cl_provider); - cl_provider.Txn_mgr().Txn_bgn_if_none(); - cur_cat_file_idx = file.Id(); - } - private void File_close() { - cl_provider.Txn_mgr().Txn_end_all(); - if (first_provider) { - cat_provider.Txn_mgr().Txn_bgn_if_none(); - } - cl_stmt.Rls(); - cur_cat_file_size = 0; - } - private static byte Ctg_tid_ltr_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); - } - } - static final int Size_categorylinks_row_fixed = 4 + 14 + 2; // page_id + ctg_added + ctg_tid - static final int Cur_cat_id_null = -1; - 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 Io_line_rdr New_registry_rdr(Xowe_wiki wiki, Gfo_usr_dlg usr_dlg) { - Io_url make_dir = Xob_category_registry_sql.Get_dir_output(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); - } Io_line_rdr name_id_rdr; - private static final byte[] Ttl_last = null, Ttl_first = Bry_.Empty; - private static final Db_idx_itm - Idx_categorylinks_main = Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS categorylinks__cl_main ON categorylinks (cl_to_id, cl_type_id, cl_sortkey, cl_from);") - , Idx_categorylinks_from = Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS categorylinks__cl_from ON categorylinks (cl_from);") - ; -} -/* -NOTE_1: categorylinks row size: 34 + 20 + 12 + (ctg_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 : ctg_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 -*/ diff --git a/400_xowa/src/gplx/xowa/bldrs/infos/Xob_info_file.java b/400_xowa/src/gplx/xowa/bldrs/infos/Xob_info_file.java new file mode 100644 index 000000000..7f704a7d0 --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/infos/Xob_info_file.java @@ -0,0 +1,70 @@ +/* +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 . +*/ +package gplx.xowa.bldrs.infos; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; +import gplx.dbs.*; import gplx.dbs.cfgs.*; +public class Xob_info_file { + public Xob_info_file(int id, String type, String ns_ids, int part_id, Guid_adp guid, int schema_version, String core_file_name, String orig_file_name) { + this.id = id; this.type = type; this.ns_ids = ns_ids; this.part_id = part_id; this.guid = guid; + this.schema_version = schema_version; this.core_file_name = core_file_name; this.orig_file_name = orig_file_name; + } + public int Id() {return id;} private final int id; + public String Type() {return type;} private final String type; + public String Ns_ids() {return ns_ids;} private final String ns_ids; + public int Part_id() {return part_id;} private final int part_id; + public Guid_adp Guid() {return guid;} private final Guid_adp guid; + public int Schema_version() {return schema_version;} private final int schema_version; + public String Core_file_name() {return core_file_name;} private final String core_file_name; + public String Orig_file_name() {return orig_file_name;} private final String orig_file_name; + public void Save(Db_cfg_tbl tbl) { + tbl.Conn().Txn_bgn(); + tbl.Insert_int (Cfg_grp, Cfg_key__id , id); + tbl.Insert_str (Cfg_grp, Cfg_key__type , type); + tbl.Insert_str (Cfg_grp, Cfg_key__ns_ids , ns_ids); + tbl.Insert_int (Cfg_grp, Cfg_key__part_id , part_id); + tbl.Insert_guid (Cfg_grp, Cfg_key__guid , guid); + tbl.Insert_int (Cfg_grp, Cfg_key__schema_version , schema_version); + tbl.Insert_str (Cfg_grp, Cfg_key__core_file_name , core_file_name); + tbl.Insert_str (Cfg_grp, Cfg_key__orig_file_name , orig_file_name); + tbl.Conn().Txn_end(); + } + public static Xob_info_file Load(Db_cfg_tbl tbl) { + Db_cfg_hash hash = tbl.Select_as_hash(Cfg_grp); + return new Xob_info_file + ( hash.Get(Cfg_key__id ).To_int_or(-1) + , hash.Get(Cfg_key__type ).To_str_or("unknown") + , hash.Get(Cfg_key__ns_ids ).To_str_or("") + , hash.Get(Cfg_key__part_id ).To_int_or(-1) + , hash.Get(Cfg_key__guid ).To_guid_or(Guid_adp_.Empty) + , hash.Get(Cfg_key__schema_version ).To_int_or(2) + , hash.Get(Cfg_key__core_file_name ).To_str_or("") + , hash.Get(Cfg_key__orig_file_name ).To_str_or("") + ); + } + private static final String Cfg_grp = gplx.xowa.wikis.Xow_cfg_consts.Grp__bldr_db + , Cfg_key__id = "id" // EX: 1 + , Cfg_key__type = "type" // EX: core + , Cfg_key__ns_ids = "ns_ids" // EX: 0 + , Cfg_key__part_id = "part_id" // EX: 0 + , Cfg_key__guid = "guid" // EX: 00000000-0000-0000-0000-000000000000 + , Cfg_key__schema_version = "schema_version" // EX: 2 + , Cfg_key__core_file_name = "core_file_name" // EX: en.wikipedia.org-text.xowa + , Cfg_key__orig_file_name = "orig_file_name" // EX: en.wikipedia.org-text-ns.000-db.002.xowa + ; + public static final String Ns_ids_empty = ""; + public static final int Part_id_1st = 1; +} diff --git a/400_xowa/src/gplx/xowa/bldrs/infos/Xob_info_session.java b/400_xowa/src/gplx/xowa/bldrs/infos/Xob_info_session.java new file mode 100644 index 000000000..676985b93 --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/infos/Xob_info_session.java @@ -0,0 +1,61 @@ +/* +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 . +*/ +package gplx.xowa.bldrs.infos; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; +import gplx.dbs.cfgs.*; +public class Xob_info_session { + Xob_info_session(String user, String version, String wiki_domain, String dump_name, DateAdp time, Guid_adp guid) { + this.user = user; this.version = version; this.wiki_domain = wiki_domain; this.dump_name = dump_name; this.time = time; this.guid = guid; + } + public String User() {return user;} private final String user; + public String Version() {return version;} private final String version; + public String Wiki_domain() {return wiki_domain;} private final String wiki_domain; + public String Dump_name() {return dump_name;} private final String dump_name; + public DateAdp Time() {return time;} private final DateAdp time; + public Guid_adp Uuid() {return guid;} private final Guid_adp guid; + public void Save(Db_cfg_tbl tbl) { + tbl.Conn().Txn_bgn(); + tbl.Insert_str (Cfg_grp, Cfg_key__user , user); + tbl.Insert_str (Cfg_grp, Cfg_key__version , version); + tbl.Insert_str (Cfg_grp, Cfg_key__wiki_domain , wiki_domain); + tbl.Insert_str (Cfg_grp, Cfg_key__dump_name , dump_name); + tbl.Insert_date (Cfg_grp, Cfg_key__time , time); + tbl.Insert_guid (Cfg_grp, Cfg_key__guid , guid); + tbl.Conn().Txn_end(); + } + public static Xob_info_session Load(Db_cfg_tbl tbl) { + Db_cfg_hash hash = tbl.Select_as_hash(Cfg_grp); + return new Xob_info_session + ( hash.Get(Cfg_key__user).To_str_or("") + , hash.Get(Cfg_key__version).To_str_or("") + , hash.Get(Cfg_key__wiki_domain).To_str_or("") + , hash.Get(Cfg_key__dump_name).To_str_or("") + , hash.Get(Cfg_key__time).To_date_or(DateAdp_.MinValue) + , hash.Get(Cfg_key__guid).To_guid_or(Guid_adp_.Empty) + ); + } + private static final String Cfg_grp = gplx.xowa.wikis.Xow_cfg_consts.Grp__bldr_session + , Cfg_key__user = "user" // EX: anonymous + , Cfg_key__version = "version" // EX: 2.3.1.4 + , Cfg_key__wiki_domain = "wiki_domain" // EX: en.wikipedia.org + , Cfg_key__dump_name = "dump_name" // EX: enwiki-latest-pages-articles + , Cfg_key__time = "time" // EX: 20150102 030405 + , Cfg_key__guid = "guid" // EX: 00000000-0000-0000-0000-000000000000 + ; + public static Xob_info_session new_(String user, String wiki_domain, String dump_name) {return new Xob_info_session(user, Xoa_app_.Version, wiki_domain, dump_name, DateAdp_.Now(), Guid_adp_.random_());} + public static final Xob_info_session Test = new_("anonymous", "en.wikipedia.org", "enwiki-latest-pages-articles"); +} diff --git a/400_xowa/src/gplx/xowa/bldrs/langs/Xobc_utl_make_lang.java b/400_xowa/src/gplx/xowa/bldrs/langs/Xobc_utl_make_lang.java index a428b28d0..48f76eb4d 100644 --- a/400_xowa/src/gplx/xowa/bldrs/langs/Xobc_utl_make_lang.java +++ b/400_xowa/src/gplx/xowa/bldrs/langs/Xobc_utl_make_lang.java @@ -32,7 +32,7 @@ public class Xobc_utl_make_lang implements GfoInvkAble { lang_parser.Parse_mediawiki(lang_mgr, lang_root.GenSubDir("mediawiki"), kwd_mgr); kwd_mgr.Add_words(); lang_parser.Save_langs(lang_mgr, lang_root.GenSubDir(Xol_mw_lang_parser.Dir_name_core), manual_text_bgn_hash, manual_text_end_hash); - Gfo_usr_dlg_._.Prog_many("", "", "done"); + Gfo_usr_dlg_.I.Prog_many("", "", "done"); } public void Parse_manual_text(byte[] langs_bry, byte[] text, OrderedHash manual_text) { OrderedHash langs = lang_mgr.Xto_hash(langs_bry); diff --git a/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_parse_all_src.java b/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_parse_all_src.java deleted file mode 100644 index 2784bde3f..000000000 --- a/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_parse_all_src.java +++ /dev/null @@ -1,21 +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 . -*/ -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); -} diff --git a/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_text_db_prep.java b/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_text_db_prep.java deleted file mode 100644 index 6f016ca45..000000000 --- a/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_text_db_prep.java +++ /dev/null @@ -1,79 +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 . -*/ -package gplx.xowa.bldrs.oimgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.xowa.wikis.data.*; import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; import gplx.xowa.dbs.*; -public class Xob_text_db_prep extends Xob_itm_basic_base implements Xob_cmd { - public Xob_text_db_prep(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} - public String Cmd_key() {return KEY_oimg;} public static final String KEY_oimg = "wiki.text_db_prep"; - public void Cmd_ini(Xob_bldr bldr) {} - public void Cmd_bgn(Xob_bldr bldr) { - wiki.Init_assert(); - } - public void Cmd_run() { - Xowe_core_data_mgr core_data_mgr = wiki.Db_mgr_as_sql().Core_data_mgr(); - String page_db_url = core_data_mgr.Dbs__get_db_core().Url().Raw(); - int len = core_data_mgr.Dbs__len(); - for (int i = 0; i < len; i++) { - Xowd_db_file db_file = core_data_mgr.Dbs__get_at(i); - if (db_file.Tid() == Xowd_db_file_.Tid_text) - Prep_db(page_db_url, db_file); - } - } - public void Cmd_end() { - Xowe_core_data_mgr core_data_mgr = wiki.Db_mgr_as_sql().Core_data_mgr(); - int len = core_data_mgr.Dbs__len(); - for (int i = 0; i < len; i++) { - Xowd_db_file db_file = core_data_mgr.Dbs__get_at(i); - if (db_file.Tid() == Xowd_db_file_.Tid_text) - db_file.Rls(); - } - } - public void Cmd_print() {} - private void Prep_db(String page_db_url, Xowd_db_file text_db) { - usr_dlg.Note_many("", "", "copying page_rows to text_db: ~{0}", text_db.Url().NameOnly()); - Db_conn conn = text_db.Conn(); - Sqlite_engine_.Tbl_create_and_delete(conn, "page_dump", Sql_create_tbl); - Sqlite_engine_.Db_attach(conn, "page_db", page_db_url); - conn.Txn_mgr().Txn_bgn_if_none(); - conn.Exec_sql(String_.Format(Sql_insert_data, text_db.Id())); - conn.Txn_mgr().Txn_end_all(); - Sqlite_engine_.Idx_create(conn, Idx_create); - } - private static final String Sql_create_tbl = String_.Concat_lines_nl - ( "CREATE TABLE IF NOT EXISTS page_dump" - , "( page_id integer" - , ", page_title varchar(256)" - , ", page_namespace integer" - , ", page_is_redirect integer" - , ");" - ) - , Sql_insert_data = String_.Concat_lines_nl - ( "INSERT INTO page_dump (page_id, page_title, page_namespace, page_is_redirect)" - , "SELECT p.page_id" - , ", p.page_title" - , ", p.page_namespace" - , ", p.page_is_redirect" - , "FROM page_db.page p" - , "WHERE p.page_file_idx = {0}" - , ";" - ) - ; - private static final Db_idx_itm Idx_create = Db_idx_itm.sql_ - ( "CREATE UNIQUE INDEX page_dump_index ON page_dump (page_id, page_namespace, page_is_redirect, page_title);" - ); -} diff --git a/400_xowa/src/gplx/xowa/bldrs/oimgs/Xodb_db_file.java b/400_xowa/src/gplx/xowa/bldrs/oimgs/Xodb_db_file.java deleted file mode 100644 index 6a6952023..000000000 --- a/400_xowa/src/gplx/xowa/bldrs/oimgs/Xodb_db_file.java +++ /dev/null @@ -1,47 +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 . -*/ -package gplx.xowa.bldrs.oimgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.core.primitives.*; -import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; import gplx.xowa.dbs.*; import gplx.xowa.dbs.tbls.*; -public class Xodb_db_file { - Xodb_db_file(Io_url url, Db_conn conn, boolean created) {this.url = url; this.conn = conn; this.created = created;} - public Io_url Url() {return url;} private Io_url url; - public Db_conn Conn() {return conn;} private Db_conn conn; - public boolean Created() {return created;} public void Created_clear() {created = false;} private boolean created; - - public static Xodb_db_file init__file_make(Io_url dir) {return init_(dir, Name__file_make);} - public static Xodb_db_file init__page_regy(Io_url dir) {return init_(dir, Name__page_regy);} - public static Xodb_db_file init__wiki_image(Io_url dir) {return init_(dir, Name__wiki_image);} - public static Xodb_db_file init__wiki_redirect(Io_url dir) {return init_(dir, Name__wiki_redirect);} - public static Xodb_db_file init__temp_log(Io_url dir) {return init_(dir, Name__temp_log);} - public static Xodb_db_file init_(Io_url dir, String name) { - Io_url url = dir.GenSubFil(name); - Bool_obj_ref created = Bool_obj_ref.n_(); - Db_conn conn = Sqlite_engine_.Conn_load_or_make_(url, created); - if (created.Val()) { // always create cfg table - Xodb_xowa_cfg_tbl.Create_table(conn); - Xodb_xowa_cfg_tbl.Create_index(conn); - } - return new Xodb_db_file(url, conn, created.Val()); - } - 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" - ; -} diff --git a/400_xowa/src/gplx/xowa/bldrs/wikis/images/Xob_wiki_image_itm.java b/400_xowa/src/gplx/xowa/bldrs/wikis/images/Xob_wiki_image_itm.java deleted file mode 100644 index 4f364d184..000000000 --- a/400_xowa/src/gplx/xowa/bldrs/wikis/images/Xob_wiki_image_itm.java +++ /dev/null @@ -1,26 +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 . -*/ -package gplx.xowa.bldrs.wikis.images; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wikis.*; -public class Xob_wiki_image_itm { - public byte[] Name() {return name;} public void Name_(byte[] v) {this.name = v;} byte[] name; - public int Size() {return size;} public void Size_(int v) {this.size = v;} int size; - public int Width() {return width;} public void Width_(int v) {this.width = v;} int width; - public int Height() {return height;} public void Height_(int v) {this.height = v;} int height; - public byte Bits() {return bits;} public void Bits_(byte v) {this.bits = v;} byte bits; - public static final Xob_wiki_image_itm Null = new Xob_wiki_image_itm(); -} diff --git a/400_xowa/src/gplx/xowa/bldrs/wikis/images/Xob_wiki_image_sql_fxt.java b/400_xowa/src/gplx/xowa/bldrs/wikis/images/Xob_wiki_image_sql_fxt.java deleted file mode 100644 index cb59317fb..000000000 --- a/400_xowa/src/gplx/xowa/bldrs/wikis/images/Xob_wiki_image_sql_fxt.java +++ /dev/null @@ -1,41 +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 . -*/ -package gplx.xowa.bldrs.wikis.images; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wikis.*; -public class Xob_wiki_image_sql_fxt { - Xob_wiki_image_sql cmd; - private Db_mgr_fxt fxt = new Db_mgr_fxt(); - public void Init() { - fxt.Ctor_fsys(); - fxt.Init_db_sqlite(); - } - public void Term() { - fxt.Rls(); - } - public Xob_wiki_image_sql Run(String raw_sql) {return Run(raw_sql, new Xob_wiki_image_sql(fxt.Bldr(), fxt.Wiki()));} - public Xob_wiki_image_sql Run(String raw_sql, Xob_wiki_image_sql rv) { - this.cmd = rv; - cmd.Make_fil_len_(Io_mgr.Len_kb); - rv.Parser().Src_len_(Io_mgr.Len_kb); - Io_url src_fil = Io_url_.mem_fil_("mem/temp/sql_dump.sql"); - Io_mgr._.SaveFilStr(src_fil, raw_sql); - - rv.Src_fil_(src_fil); - Xob_base_fxt.Run_cmd(fxt.Bldr(), rv); - return rv; - } -} diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_import_cfg.java b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_import_cfg.java similarity index 81% rename from 400_xowa/src/gplx/xowa/bldrs/imports/Xob_import_cfg.java rename to 400_xowa/src/gplx/xowa/bldrs/xmls/Xob_import_cfg.java index 6123fe3e6..4e77196a4 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_import_cfg.java +++ b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_import_cfg.java @@ -15,13 +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 . */ -package gplx.xowa.bldrs.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; +package gplx.xowa.bldrs.xmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.ios.*; import gplx.xowa.ctgs.*; import gplx.xowa.tdbs.*; public class Xob_import_cfg { public Xob_import_cfg(Xowe_wiki wiki) {this.wiki = wiki;} private Xowe_wiki wiki; private boolean src_fil_is_bz2 = true; public byte Category_version() {return category_version;} public Xob_import_cfg Category_version_(byte v) {category_version = v; return this;} private byte category_version = Xoa_ctg_mgr.Version_1; + public long Src_rdr_len() {return src_rdr_len;} private long src_rdr_len; public Io_url Src_fil_xml() {return src_fil_xml;} + public Io_url Src_fil() {return src_fil;} private Io_url src_fil; public Xob_import_cfg Src_fil_xml_(Io_url v) {src_fil_xml = v; src_fil_is_bz2 = Bool_.N; return this;} private Io_url src_fil_xml; public Xob_import_cfg Src_fil_bz2_(Io_url v) {src_fil_bz2 = v; src_fil_is_bz2 = Bool_.Y; return this;} private Io_url src_fil_bz2; public Io_url Src_dir() { @@ -30,25 +32,27 @@ public class Xob_import_cfg { else if (src_fil_bz2 != null) return src_fil_bz2.OwnerDir(); else throw Err_.new_("unknown src dir"); } - public gplx.ios.Io_stream_rdr Src_rdr() { + public Io_stream_rdr Src_rdr() { if (src_fil_xml == null && src_fil_bz2 == null) { // will usually be null; non-null when user specifies src through command-line Io_url url = Xotdb_fsys_mgr.Find_file_or_fail(wiki.Fsys_mgr().Root_dir(), "*", ".xml", ".bz2"); if (String_.Eq(url.Ext(), ".xml")) Src_fil_xml_(url); else Src_fil_bz2_(url); } if (src_fil_is_bz2) { - Chk_file_ext(wiki.Appe(), src_fil_bz2, ".bz2", "xml"); + Chk_file_ext(wiki.Appe(), src_fil_bz2, ".bz2", "xml"); + src_fil = src_fil_bz2; src_rdr_len = Io_mgr._.QueryFil(src_fil_bz2).Size(); Xoae_app app = wiki.Appe(); if (app.Setup_mgr().Dump_mgr().Import_bz2_by_stdout()) { ProcessAdp process = app.Prog_mgr().App_decompress_bz2_by_stdout(); return Io_stream_rdr_process.new_(process.Exe_url(), src_fil_bz2, process.Xto_process_bldr_args(src_fil_bz2.Raw())); } else - return gplx.ios.Io_stream_rdr_.bzip2_(src_fil_bz2); + return Io_stream_rdr_.bzip2_(src_fil_bz2); } else { Chk_file_ext(wiki.Appe(), src_fil_xml, ".xml", "bz2"); - return gplx.ios.Io_stream_rdr_.file_(src_fil_xml); + src_fil = src_fil_xml; src_rdr_len = Io_mgr._.QueryFil(src_fil_xml).Size(); + return Io_stream_rdr_.file_(src_fil_xml); } } private static void Chk_file_ext(Xoae_app app, Io_url fil, String expd_ext, String alt_ext) { diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_import_marker.java b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_import_marker.java similarity index 53% rename from 400_xowa/src/gplx/xowa/bldrs/imports/Xob_import_marker.java rename to 400_xowa/src/gplx/xowa/bldrs/xmls/Xob_import_marker.java index 3c46e7647..9dcd6f743 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_import_marker.java +++ b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_import_marker.java @@ -15,12 +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 . */ -package gplx.xowa.bldrs.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.gfui.*; +package gplx.xowa.bldrs.xmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; +import gplx.gfui.*; import gplx.xowa.bldrs.cmds.utils.*; public class Xob_import_marker { - public static void Import_bgn(Xowe_wiki wiki) {Io_mgr._.SaveFilStr(url_(wiki), "XOWA has created this file to indicate that an import is in progress. This file will be deleted once the import is completed.");} - public static void Import_end(Xowe_wiki wiki) {Io_mgr._.DeleteFil_args(url_(wiki)).MissingFails_off().Exec();} - public static boolean Check(Xowe_wiki wiki) { + private final Hash_adp_bry in_progress_hash = Hash_adp_bry.cs_(); + public void Bgn(Xowe_wiki wiki) { + in_progress_hash.AddKeyVal(wiki.Domain_bry()); + Io_mgr._.SaveFilStr(url_(wiki), "XOWA has created this file to indicate that an import is in progress. This file will be deleted once the import is completed."); + } + public void End(Xowe_wiki wiki) { + in_progress_hash.Del(wiki.Domain_bry()); + Io_mgr._.DeleteFil_args(url_(wiki)).MissingFails_off().Exec(); + } + public boolean Chk(Xowe_wiki wiki) { + if (Xoa_app_.Mode != Xoa_app_.Mode_gui) return true; // NOTE: ignore during Server / Console modes; DATE:2015-04-01 + if (in_progress_hash.Has(wiki.Domain_bry())) return true; // NOTE: ignore if currently building; different bldr commands call wiki.Init_assert() which may lead to fals checks; Io_url url = url_(wiki); if (!Io_mgr._.ExistsFil(url)) return true; Xoae_app app = wiki.Appe(); @@ -28,9 +37,9 @@ public class Xob_import_marker { byte[] incompete_msg_bry = app.User().Msg_mgr().Val_by_key_args(Bry_.new_ascii_("api-xowa.import.core.incomplete"), wiki.Domain_str()); int rslt = app.Gui_mgr().Kit().Ask_yes_no_cancel("", "", String_.new_utf8_(incompete_msg_bry)); switch (rslt) { - case Gfui_dlg_msg_.Btn_yes: Xobc_core_cleanup.Delete_wiki_sql(wiki); Import_end(wiki); return false; // delete wiki - case Gfui_dlg_msg_.Btn_no: Import_end(wiki); return true; // delete marker - case Gfui_dlg_msg_.Btn_cancel: return true; // noop + case Gfui_dlg_msg_.Btn_yes: Xob_cleanup_cmd.Delete_wiki_sql(wiki); End(wiki); return false; // delete wiki + case Gfui_dlg_msg_.Btn_no: End(wiki); return true; // delete marker + case Gfui_dlg_msg_.Btn_cancel: return true; // noop default: throw Err_.unhandled(rslt); } } diff --git a/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_page_bldr.java b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_page_bldr.java index a9c7f3339..dd2e529d0 100644 --- a/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_page_bldr.java +++ b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_page_bldr.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.bldrs.xmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.ios.*; +import gplx.ios.*; import gplx.xowa.wikis.data.tbls.*; public class Xob_xml_page_bldr { public byte[] Xto_bry() {return bfr.Xto_bry_and_clear();} public Io_buffer_rdr XtoByteStreamRdr() {return XtoByteStreamRdr(Io_mgr.Len_kb);} @@ -32,12 +32,12 @@ public class Xob_xml_page_bldr { bfr.Add_str(all); return this; } - public Xob_xml_page_bldr Add_ary(Xodb_page... ary) { - for (Xodb_page doc : ary) + public Xob_xml_page_bldr Add_ary(Xowd_page_itm... ary) { + for (Xowd_page_itm doc : ary) Add(doc); return this; } - public Xob_xml_page_bldr Add(Xodb_page doc) { + public Xob_xml_page_bldr Add(Xowd_page_itm doc) { bfr.Add(Indent_2).Add(Xob_xml_parser_.Bry_page_bgn).Add_byte_nl(); bfr.Add(Indent_4).Add(Xob_xml_parser_.Bry_title_bgn).Add(doc.Ttl_full_db()).Add(Xob_xml_parser_.Bry_title_end).Add_byte_nl(); bfr.Add(Indent_4).Add(Xob_xml_parser_.Bry_id_bgn).Add_int_variable(doc.Id()).Add(Xob_xml_parser_.Bry_id_end).Add_byte_nl(); @@ -51,7 +51,7 @@ public class Xob_xml_page_bldr { bfr.Add(Indent_6).Add(Xob_xml_parser_.Bry_contributor_end).Add_byte_nl(); bfr.Add(Indent_6).Add(Xob_xml_parser_.Bry_minor_bgn_frag).Add(Nde_inline).Add_byte_nl(); bfr.Add(Indent_6).Add(Xob_xml_parser_.Bry_comment_bgn).Add(Revision_comment).Add(Xob_xml_parser_.Bry_comment_end).Add_byte_nl(); - bfr.Add(Indent_6).Add(Xob_xml_parser_.Bry_text_bgn).Add(doc.Wtxt()).Add(Xob_xml_parser_.Bry_text_end).Add_byte_nl(); + bfr.Add(Indent_6).Add(Xob_xml_parser_.Bry_text_bgn).Add(doc.Text()).Add(Xob_xml_parser_.Bry_text_end).Add_byte_nl(); bfr.Add(Indent_4).Add(Xob_xml_parser_.Bry_revision_end).Add_byte_nl(); bfr.Add(Indent_2).Add(Xob_xml_parser_.Bry_page_end).Add_byte_nl(); return this; diff --git a/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_parser.java b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_parser.java index 0a1b38876..f1d45eee6 100644 --- a/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_parser.java +++ b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_parser.java @@ -16,13 +16,13 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.bldrs.xmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.core.btries.*; import gplx.ios.*; +import gplx.core.btries.*; import gplx.ios.*; import gplx.xowa.wikis.data.tbls.*; public class Xob_xml_parser { Btrie_fast_mgr trie = Xob_xml_parser_.trie_(); Bry_bfr data_bfr = Bry_bfr.new_(); DateAdp_parser date_parser = DateAdp_parser.new_(); public Xob_xml_parser Tag_len_max_(int v) {tag_len_max = v; return this;} private int tag_len_max = 255; // max size of any (a) xml tag, (b) int or (c) date; everything else goes into a data_bfr public Xob_xml_parser Data_bfr_len_(int v) {data_bfr.Resize(v); return this;} // PERF: resize data_bfr once to large size, rather than grow incremently to it public Xob_xml_parser Trie_tab_del_() {trie.Del(Xob_xml_parser_.Bry_tab); return this;} - public int Parse_page(Xodb_page rv, Gfo_usr_dlg usr_dlg, Io_buffer_rdr fil, byte[] src, int pos, Xow_ns_mgr ns_mgr) { + public int Parse_page(Xowd_page_itm rv, Gfo_usr_dlg usr_dlg, Io_buffer_rdr fil, byte[] src, int pos, Xow_ns_mgr ns_mgr) { rv.Clear(); int src_len = fil.Bfr_len(), data_bgn = -1, page_bgn = -1; boolean data_bfr_add = false, page_id_needed = true, title_needed = true, reading = true; @@ -80,7 +80,7 @@ public class Xob_xml_parser { title_needed = false; } break; - case Xob_xml_parser_.Id_text_end: data_bfr_add = false; rv.Wtxt_(data_bfr.Xto_bry_and_clear()); break; + case Xob_xml_parser_.Id_text_end: data_bfr_add = false; rv.Text_(data_bfr.Xto_bry_and_clear()); break; case Xob_xml_parser_.Id_amp: case Xob_xml_parser_.Id_quot: case Xob_xml_parser_.Id_lt: case Xob_xml_parser_.Id_gt: case Xob_xml_parser_.Id_cr_nl: case Xob_xml_parser_.Id_cr: if (data_bfr_add) data_bfr.Add_byte(itm.Subst_byte()); diff --git a/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_parser_tst.java b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_parser_tst.java index 4e670c123..8165cac5c 100644 --- a/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_parser_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_parser_tst.java @@ -16,8 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.bldrs.xmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import org.junit.*; -import gplx.ios.*; +import org.junit.*; import gplx.ios.*; import gplx.xowa.wikis.data.tbls.*; public class Xob_xml_parser_tst { @Before public void init() { Io_mgr._.InitEngine_mem(); @@ -25,89 +24,89 @@ public class Xob_xml_parser_tst { bldr = new Xob_bldr(app); } private Xow_ns_mgr ns_mgr = Xow_ns_mgr_.default_(gplx.xowa.langs.cases.Xol_case_mgr_.Ascii()); @Test public void Basic_docs_1() { - Xodb_page doc = doc_(1, "a", "a a", Date_1); + Xowd_page_itm doc = doc_(1, "a", "a a", Date_1); fil = page_bldr.Add(doc).XtoByteStreamRdr(); tst_parse(fil, doc, 0); } @Test public void Basic_docs_2() { - Xodb_page doc1 = doc_(1, "a", "a a", Date_1); - Xodb_page doc2 = doc_(2, "b", "b b", Date_2); + Xowd_page_itm doc1 = doc_(1, "a", "a a", Date_1); + Xowd_page_itm doc2 = doc_(2, "b", "b b", Date_2); fil = page_bldr.Add_ary(doc1, doc2).XtoByteStreamRdr(); int pos = tst_parse(fil, doc1, 0); tst_parse(fil, doc2, pos); } @Test public void Basic_space() { - Xodb_page doc1 = doc_(1, "a_b", "abc", Date_1); + Xowd_page_itm doc1 = doc_(1, "a_b", "abc", Date_1); fil = page_bldr.Add_ary(doc1).Upd("a_b", "a b").XtoByteStreamRdr(); tst_parse(fil, doc1, 0); } @Test public void Xml() { - Xodb_page doc = doc_(1, "a", ""a & b <> a | b"", Date_1); + Xowd_page_itm doc = doc_(1, "a", ""a & b <> a | b"", Date_1); fil = page_bldr.Add(doc).XtoByteStreamRdr(); - tst_parse(fil, doc.Wtxt_(Bry_.new_utf8_("\"a & b <> a | b\"")), 0); + tst_parse(fil, doc.Text_(Bry_.new_utf8_("\"a & b <> a | b\"")), 0); } @Test public void Tab() { - Xodb_page doc = doc_(1, "a", "a \t b", Date_1); + Xowd_page_itm doc = doc_(1, "a", "a \t b", Date_1); fil = page_bldr.Add(doc).XtoByteStreamRdr(); - tst_parse(fil, doc.Wtxt_(Bry_.new_utf8_("a b")), 0); + tst_parse(fil, doc.Text_(Bry_.new_utf8_("a b")), 0); } @Test public void Tab_disable() { - Xodb_page doc = doc_(1, "a", "a \t b", Date_1); + Xowd_page_itm doc = doc_(1, "a", "a \t b", Date_1); page_parser.Trie_tab_del_(); fil = page_bldr.Add(doc).XtoByteStreamRdr(); - tst_parse(fil, doc.Wtxt_(Bry_.new_utf8_("a \t b")), 0); + tst_parse(fil, doc.Text_(Bry_.new_utf8_("a \t b")), 0); } @Test public void Cr_nl() { - Xodb_page doc = doc_(1, "a", "a \r\n b", Date_1); + Xowd_page_itm doc = doc_(1, "a", "a \r\n b", Date_1); fil = page_bldr.Add(doc).XtoByteStreamRdr(); - tst_parse(fil, doc.Wtxt_(Bry_.new_utf8_("a \n b")), 0); + tst_parse(fil, doc.Text_(Bry_.new_utf8_("a \n b")), 0); } @Test public void Cr() { - Xodb_page doc = doc_(1, "a", "a \r b", Date_1); + Xowd_page_itm doc = doc_(1, "a", "a \r b", Date_1); fil = page_bldr.Add(doc).XtoByteStreamRdr(); - tst_parse(fil, doc.Wtxt_(Bry_.new_utf8_("a \n b")), 0); + tst_parse(fil, doc.Text_(Bry_.new_utf8_("a \n b")), 0); } @Test public void Text_long() { String s = String_.Repeat("a", 1024); - Xodb_page doc = doc_(1, "a", s, Date_1); + Xowd_page_itm doc = doc_(1, "a", s, Date_1); page_parser.Tag_len_max_(32); fil = page_bldr.Add(doc).XtoByteStreamRdr(512); tst_parse(fil, doc, 0); } @Test public void Text_empty() { - Xodb_page doc = doc_(1, "a", "", Date_1); + Xowd_page_itm doc = doc_(1, "a", "", Date_1); fil = page_bldr.Add(doc).Upd("", "").XtoByteStreamRdr(); tst_parse(fil, doc, 0); } @Test public void Text_frag() { - Xodb_page doc = doc_(1, "a", "a", Date_1); + Xowd_page_itm doc = doc_(1, "a", "a", Date_1); fil = page_bldr.Add(doc).Upd("a", "a").XtoByteStreamRdr(); tst_parse(fil, doc, 0); } @Test public void Ns_file() { - Xodb_page doc = doc_(1, "File:a", "a", Date_1); + Xowd_page_itm doc = doc_(1, "File:a", "a", Date_1); Tfds.Eq(Xow_ns_.Id_file, doc.Ns_id()); Tfds.Eq("a", String_.new_utf8_(doc.Ttl_page_db())); } @Test public void Ns_main() { - Xodb_page doc = doc_(1, "a", "a", Date_1); + Xowd_page_itm doc = doc_(1, "a", "a", Date_1); Tfds.Eq(Xow_ns_.Id_main, doc.Ns_id()); Tfds.Eq("a", String_.new_utf8_(doc.Ttl_page_db())); } @Test public void Ns_main_book() { - Xodb_page doc = doc_(1, "Book", "a", Date_1); + Xowd_page_itm doc = doc_(1, "Book", "a", Date_1); Tfds.Eq(Xow_ns_.Id_main, doc.Ns_id()); Tfds.Eq("Book", String_.new_utf8_(doc.Ttl_page_db())); } @Test public void XmlEntities() { - Xodb_page orig = doc_(1, "A&b", "a", Date_1); - Xodb_page actl = new Xodb_page(); + Xowd_page_itm orig = doc_(1, "A&b", "a", Date_1); + Xowd_page_itm actl = new Xowd_page_itm(); fil = page_bldr.Add(orig).XtoByteStreamRdr(); page_parser.Parse_page(actl, usr_dlg, fil, fil.Bfr(), 0, ns_mgr); Tfds.Eq("A&b", String_.new_utf8_(actl.Ttl_full_db())); } @Test public void Root() { - Xodb_page doc = doc_(1, "a", "a", Date_1); + Xowd_page_itm doc = doc_(1, "a", "a", Date_1); page_bldr.Bfr().Add_str("\n"); page_bldr.Add(doc); page_bldr.Bfr().Add_str(""); @@ -118,17 +117,17 @@ public class Xob_xml_parser_tst { Bry_bfr bfr = Bry_bfr.new_(); Xob_xml_page_bldr page_bldr = new Xob_xml_page_bldr(); Io_buffer_rdr fil; Xob_xml_parser page_parser = new Xob_xml_parser(); Xob_bldr bldr; Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_base.test_(); - int tst_parse(Io_buffer_rdr fil, Xodb_page expd, int cur_pos) { - Xodb_page actl = new Xodb_page(); + int tst_parse(Io_buffer_rdr fil, Xowd_page_itm expd, int cur_pos) { + Xowd_page_itm actl = new Xowd_page_itm(); int rv = page_parser.Parse_page(actl, usr_dlg, fil, fil.Bfr(), cur_pos, ns_mgr); Tfds.Eq(expd.Id(), actl.Id(), "id"); Tfds.Eq(String_.new_utf8_(expd.Ttl_full_db()), String_.new_utf8_(actl.Ttl_full_db()), "title"); - Tfds.Eq(String_.new_utf8_(expd.Wtxt()), String_.new_utf8_(actl.Wtxt()), "text"); + Tfds.Eq(String_.new_utf8_(expd.Text()), String_.new_utf8_(actl.Text()), "text"); Tfds.Eq_date(expd.Modified_on(), actl.Modified_on(), "timestamp"); return rv; } - Xodb_page doc_(int id, String title, String text, String date) { - Xodb_page rv = new Xodb_page().Id_(id).Ttl_(Bry_.new_ascii_(title), ns_mgr).Wtxt_(Bry_.new_ascii_(text)); + Xowd_page_itm doc_(int id, String title, String text, String date) { + Xowd_page_itm rv = new Xowd_page_itm().Id_(id).Ttl_(Bry_.new_ascii_(title), ns_mgr).Text_(Bry_.new_ascii_(text)); int[] modified_on = new int[7]; dateParser.Parse_iso8651_like(modified_on, date); rv.Modified_on_(DateAdp_.seg_(modified_on)); diff --git a/400_xowa/src/gplx/xowa/ctgs/Xoctg_fmtr_all.java b/400_xowa/src/gplx/xowa/ctgs/Xoctg_fmtr_all.java index 9af00d0d3..e26f5104e 100644 --- a/400_xowa/src/gplx/xowa/ctgs/Xoctg_fmtr_all.java +++ b/400_xowa/src/gplx/xowa/ctgs/Xoctg_fmtr_all.java @@ -111,7 +111,7 @@ class Xoctg_fmtr_all { Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_k004(); Html_nav_bry(bfr, wiki, ttl, view_grp, Bool_.N); Html_nav_bry(bfr, wiki, ttl, view_grp, Bool_.Y); - return bfr.Mkr_rls().Xto_bry_and_clear(); + return bfr.To_bry_and_rls(); } private void Html_nav_bry(Bry_bfr bfr, Xowe_wiki wiki, Xoa_ttl ttl, Xoctg_view_grp view_grp, boolean fill_at_bgn) { Bry_bfr href_bfr = wiki.Utl__bfr_mkr().Get_b512(); @@ -130,7 +130,7 @@ class Xoctg_fmtr_all { href_bfr.Add_byte(Byte_ascii.Question).Add(arg_idx_lbl).Add_byte(Byte_ascii.Eq); // filefrom= href_bfr.Add(arg_sortkey); // Abc href_bfr.Add_byte(Byte_ascii.Hash).Add(div_id); // #mw-subcategories - byte[] nav_href = href_bfr.Mkr_rls().Xto_bry_and_clear(); + byte[] nav_href = href_bfr.To_bry_and_rls(); byte[] nav_ttl = ttl.Full_url(); int nav_text_id = fill_at_bgn ? Xol_msg_itm_.Id_next_results : Xol_msg_itm_.Id_prev_results; byte[] nav_text = wiki.Msg_mgr().Val_by_id_args(nav_text_id, grp_max); // fill_at_bgn 200 / previous 200 diff --git a/400_xowa/src/gplx/xowa/ctgs/Xoctg_fmtr_itm.java b/400_xowa/src/gplx/xowa/ctgs/Xoctg_fmtr_itm.java index 59065508e..342953537 100644 --- a/400_xowa/src/gplx/xowa/ctgs/Xoctg_fmtr_itm.java +++ b/400_xowa/src/gplx/xowa/ctgs/Xoctg_fmtr_itm.java @@ -110,7 +110,7 @@ class Xoctg_fmtr_itm_subc extends Xoctg_fmtr_itm_base { Bld_contains_text_itm(bfr, Xol_msg_itm_.Id_ctgtree_subc_counts_page, sub_pages); Bld_contains_text_itm(bfr, Xol_msg_itm_.Id_ctgtree_subc_counts_file, sub_files); bfr.Add_byte(Byte_ascii.Paren_end); - return bfr.Mkr_rls().Xto_bry_and_clear(); + return bfr.To_bry_and_rls(); } private void Bld_contains_text_itm(Bry_bfr bfr, int msg_id, int val) { if (val == 0) return; diff --git a/400_xowa/src/gplx/xowa/ctgs/Xoctg_html_mgr.java b/400_xowa/src/gplx/xowa/ctgs/Xoctg_html_mgr.java index 4d4490f32..3505793a8 100644 --- a/400_xowa/src/gplx/xowa/ctgs/Xoctg_html_mgr.java +++ b/400_xowa/src/gplx/xowa/ctgs/Xoctg_html_mgr.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.ctgs; import gplx.*; import gplx.xowa.*; -import gplx.xowa.dbs.*; +import gplx.xowa.dbs.*; import gplx.xowa.wikis.data.tbls.*; public class Xoctg_html_mgr implements GfoInvkAble { @gplx.Internal protected Xoctg_fmtr_grp Fmtr_grp() {return fmtr_grp;} private Xoctg_fmtr_grp fmtr_grp = new Xoctg_fmtr_grp(); private final Xoctg_fmtr_all mgr_subcs = new Xoctg_fmtr_all(Xoa_ctg_mgr.Tid_subc); @@ -54,7 +54,7 @@ public class Xoctg_html_mgr implements GfoInvkAble { title_list.SortBy(Xoctg_view_itm_sorter_id._); int len = title_list.Count(); int pct = len / 16; - Xodb_page dbo_page = new Xodb_page(); + Xowd_page_itm dbo_page = new Xowd_page_itm(); for (int i = 0; i < len; i++) { Xoctg_view_itm itm = (Xoctg_view_itm)title_list.FetchAt(i); if (pct != 0 && i % pct == 0) usr_dlg.Prog_many("", "", "loading title data: ~{0} / ~{1} -- ~{2}", i, len, String_.new_utf8_(itm.Sortkey())); diff --git a/400_xowa/src/gplx/xowa/ctgs/Xoctg_html_mgr_tst.java b/400_xowa/src/gplx/xowa/ctgs/Xoctg_html_mgr_tst.java index d238c895a..7f1aab028 100644 --- a/400_xowa/src/gplx/xowa/ctgs/Xoctg_html_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/ctgs/Xoctg_html_mgr_tst.java @@ -252,7 +252,7 @@ class Xoh_ctg_page_fxt { fmtr_itm.Col_idx_(0, 0); Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b512(); fmtr_itm.XferAry(bfr, 0); - Tfds.Eq_str_lines(expd, bfr.Mkr_rls().Xto_str_and_clear()); + Tfds.Eq_str_lines(expd, bfr.To_str_and_rls()); } public void Test_html_grp(byte tid, String expd) { Xoctg_fmtr_all list_mgr = ctg_html.Fmtr(tid); @@ -260,11 +260,11 @@ class Xoh_ctg_page_fxt { fmtr_grp.Init_from_all(wiki, wiki.Lang(), ctg, list_mgr, ctg.Grp_by_tid(tid)); Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b512(); fmtr_grp.XferAry(bfr, 0); - Tfds.Eq_str_lines(expd, bfr.Mkr_rls().Xto_str_and_clear()); + Tfds.Eq_str_lines(expd, bfr.To_str_and_rls()); } public void Test_html_all(byte tid, String expd) { Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b512(); ctg_html.Bld_all(bfr, wiki, wiki.Lang(), ctg, tid); - Tfds.Eq_str_lines(expd, bfr.Mkr_rls().Xto_str_and_clear()); + Tfds.Eq_str_lines(expd, bfr.To_str_and_rls()); } } diff --git a/400_xowa/src/gplx/xowa/ctgs/Xoctg_pagelist_itms.java b/400_xowa/src/gplx/xowa/ctgs/Xoctg_pagelist_itms.java index e2ce90450..719161092 100644 --- a/400_xowa/src/gplx/xowa/ctgs/Xoctg_pagelist_itms.java +++ b/400_xowa/src/gplx/xowa/ctgs/Xoctg_pagelist_itms.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.ctgs; import gplx.*; import gplx.xowa.*; -import gplx.xowa.html.*; import gplx.xowa.html.lnkis.*; +import gplx.xowa.html.*; import gplx.xowa.html.lnkis.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.users.history.*; public class Xoctg_pagelist_itms implements Bry_fmtr_arg { public void Init_app(Xoae_app app, Bry_fmtr fmtr_itm) { @@ -26,11 +26,11 @@ public class Xoctg_pagelist_itms implements Bry_fmtr_arg { } private Xoh_href_parser href_parser; private Xou_history_mgr history_mgr; private Bry_fmtr fmtr_itm; public void Init_wiki(Xowe_wiki wiki) {this.wiki = wiki;} private Xowe_wiki wiki; public void Itms_clear() {itms.Clear();} private ListAdp itms = ListAdp_.new_(); - public void Itms_add(Xodb_page page) {itms.Add(page);} + public void Itms_add(Xowd_page_itm page) {itms.Add(page);} public void XferAry(Bry_bfr bfr, int idx) { int len = itms.Count(); for (int i = 0; i < len; i++) { - Xodb_page page = (Xodb_page)itms.FetchAt(i); + Xowd_page_itm page = (Xowd_page_itm)itms.FetchAt(i); Xoa_ttl ttl = Xoa_ttl.parse_(wiki, Xow_ns_.Id_category, page.Ttl_page_db()); byte[] lnki_cls = Xoh_lnki_wtr.Lnki_cls_visited(history_mgr, wiki.Domain_bry(), ttl.Page_txt()); // NOTE: must be ttl.Page_txt() in order to match Xou_history_mgr.Add byte[] lnki_href = href_parser.Build_to_bry(wiki, ttl); diff --git a/400_xowa/src/gplx/xowa/ctgs/Xoctg_pagelist_wtr.java b/400_xowa/src/gplx/xowa/ctgs/Xoctg_pagelist_wtr.java index 46c6314a7..72397397a 100644 --- a/400_xowa/src/gplx/xowa/ctgs/Xoctg_pagelist_wtr.java +++ b/400_xowa/src/gplx/xowa/ctgs/Xoctg_pagelist_wtr.java @@ -16,19 +16,19 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.ctgs; import gplx.*; import gplx.xowa.*; -import gplx.xowa.users.history.*; import gplx.xowa.dbs.tbls.*; +import gplx.xowa.users.history.*; import gplx.xowa.wikis.data.tbls.*; public class Xoctg_pagelist_wtr { private Xoctg_pagelist_mgr pagelist_mgr = new Xoctg_pagelist_mgr(); public Xoctg_pagelist_wtr Init_by_app(Xoae_app app) {pagelist_mgr.Init_by_app(app, this); return this;} public void Write(Bry_bfr bfr, Xowe_wiki wiki, Xoae_page page) { - Xodb_page[] page_ary = wiki.Db_mgr().Load_mgr().Load_ctg_list(page.Category_list()); + Xowd_page_itm[] page_ary = wiki.Db_mgr().Load_mgr().Load_ctg_list(page.Category_list()); Print_hidden(bfr, wiki, page_ary); } - public void Print_hidden(Bry_bfr bfr, Xowe_wiki wiki, Xodb_page[] page_ary) { + public void Print_hidden(Bry_bfr bfr, Xowe_wiki wiki, Xowd_page_itm[] page_ary) { int len = page_ary.length; for (int i = 0; i < len; i++) { - Xodb_page page = page_ary[i]; - Xodb_category_itm ctg_xtn = (Xodb_category_itm)page.Xtn(); + Xowd_page_itm page = page_ary[i]; + Xowd_category_itm ctg_xtn = (Xowd_category_itm)page.Xtn(); Xoctg_pagelist_grp list = ctg_xtn != null && ctg_xtn.Hidden() ? pagelist_mgr.Grp_hidden() : pagelist_mgr.Grp_normal(); list.Itms().Itms_add(page); } diff --git a/400_xowa/src/gplx/xowa/ctgs/Xoctg_pagelist_wtr_tst.java b/400_xowa/src/gplx/xowa/ctgs/Xoctg_pagelist_wtr_tst.java index cf5b65358..eafa4f966 100644 --- a/400_xowa/src/gplx/xowa/ctgs/Xoctg_pagelist_wtr_tst.java +++ b/400_xowa/src/gplx/xowa/ctgs/Xoctg_pagelist_wtr_tst.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.ctgs; import gplx.*; import gplx.xowa.*; import org.junit.*; -import gplx.xowa.dbs.tbls.*; +import gplx.xowa.wikis.data.tbls.*; public class Xoctg_pagelist_wtr_tst { @Before public void init() {fxt.Clear();} private Xoctg_pagelist_mgr_fxt fxt = new Xoctg_pagelist_mgr_fxt(); @Test public void Basic() { @@ -70,8 +70,8 @@ class Xoctg_pagelist_mgr_fxt { int len = ary.length; for (int i = 0; i < len; i++) { String ttl = ary[i]; - Xodb_page page = new Xodb_page(); - Xodb_category_itm ctg_xtn = Xodb_category_itm.load_(0, 0, hidden, 0, 0, 0); + Xowd_page_itm page = new Xowd_page_itm(); + Xowd_category_itm ctg_xtn = Xowd_category_itm.load_(0, 0, hidden, 0, 0, 0); page.Xtn_(ctg_xtn); page.Ttl_page_db_(Bry_.new_ascii_(ttl)); init_ctgs.AddMany(page); @@ -79,7 +79,7 @@ class Xoctg_pagelist_mgr_fxt { } private ListAdp init_ctgs = ListAdp_.new_(); public void Test_print_hidden(String expd) { Bry_bfr bfr = Bry_bfr.new_(); - Xodb_page[] page_ary = (Xodb_page[])init_ctgs.Xto_ary_and_clear(Xodb_page.class); + Xowd_page_itm[] page_ary = (Xowd_page_itm[])init_ctgs.Xto_ary_and_clear(Xowd_page_itm.class); hidden_wtr.Print_hidden(bfr, fxt.Wiki(), page_ary); Tfds.Eq_str_lines(expd, bfr.Xto_str_and_clear()); // Tfds.Write(bfr.Xto_bry_and_clear()); diff --git a/400_xowa/src/gplx/xowa/dbs/Xodb_ctx.java b/400_xowa/src/gplx/xowa/dbs/Xodb_ctx.java deleted file mode 100644 index 3c551ef23..000000000 --- a/400_xowa/src/gplx/xowa/dbs/Xodb_ctx.java +++ /dev/null @@ -1,22 +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 . -*/ -package gplx.xowa.dbs; import gplx.*; import gplx.xowa.*; -public class Xodb_ctx { - public boolean Html_db_enabled() {return html_db_enabled;} public void Html_db_enabled_(boolean v) {html_db_enabled = v;} private boolean html_db_enabled; - public static final Xodb_ctx Null = null; -} diff --git a/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr.java b/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr.java index 3c87c2ae4..229702830 100644 --- a/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr.java +++ b/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr.java @@ -16,21 +16,21 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.dbs; import gplx.*; import gplx.xowa.*; -import gplx.core.primitives.*; import gplx.xowa.bldrs.imports.ctgs.*; import gplx.xowa.ctgs.*; import gplx.xowa.specials.search.*; +import gplx.core.primitives.*; import gplx.xowa.bldrs.cmds.ctgs.*; import gplx.xowa.ctgs.*; import gplx.xowa.specials.search.*; import gplx.xowa.wikis.data.tbls.*; public interface Xodb_load_mgr { void Load_init (Xowe_wiki wiki); - void Load_page (Xodb_page rv, Xow_ns ns, boolean timestamp_enabled); - boolean Load_by_id (Xodb_page rv, int id); + void Load_page (Xowd_page_itm rv, Xow_ns ns, boolean timestamp_enabled); + boolean Load_by_id (Xowd_page_itm rv, int id); void Load_by_ids (Cancelable cancelable, ListAdp rv, int bgn, int end); - boolean Load_by_ttl (Xodb_page rv, Xow_ns ns, byte[] ttl); + boolean Load_by_ttl (Xowd_page_itm rv, Xow_ns ns, byte[] ttl); void Load_by_ttls (Cancelable cancelable, OrderedHash rv, boolean fill_idx_fields_only, int bgn, int end); int Load_ctg_count (byte[] ttl); boolean Load_ctg_v1 (Xoctg_view_ctg rv, byte[] ttl); boolean Load_ctg_v2 (Xoctg_data_ctg rv, byte[] ttl); void Load_ctg_v2a (Xoctg_view_ctg rv, Xoctg_url url_ctg, byte[] ttl_bry, int limit); - Xodb_page[] Load_ctg_list (byte[][] ctg_ttls); + Xowd_page_itm[] Load_ctg_list (byte[][] ctg_ttls); void Load_search (Cancelable cancelable, ListAdp rv, byte[] search, int results_max); - void Load_ttls_for_all_pages (Cancelable cancelable, ListAdp rslt_list, Xodb_page rslt_nxt, Xodb_page rslt_prv, Int_obj_ref rslt_count, Xow_ns ns, byte[] key, int max_results, int min_page_len, int browse_len, boolean include_redirects, boolean fetch_prv_item); + void Load_ttls_for_all_pages (Cancelable cancelable, ListAdp rslt_list, Xowd_page_itm rslt_nxt, Xowd_page_itm rslt_prv, Int_obj_ref rslt_count, Xow_ns ns, byte[] key, int max_results, int min_page_len, int browse_len, boolean include_redirects, boolean fetch_prv_item); void Load_ttls_for_search_suggest(Cancelable cancelable, ListAdp rslt_list, Xow_ns ns, byte[] key, int max_results, int min_page_len, int browse_len, boolean include_redirects, boolean fetch_prv_item); byte[] Find_random_ttl (Xow_ns ns); void Clear(); // TEST:helper function diff --git a/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_sql.java b/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_sql.java index 59eabb348..ff54a7b4b 100644 --- a/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_sql.java +++ b/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_sql.java @@ -16,81 +16,87 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.dbs; import gplx.*; import gplx.xowa.*; -import gplx.core.primitives.*; import gplx.dbs.*; -import gplx.xowa.apps.*; import gplx.xowa.bldrs.imports.ctgs.*; import gplx.xowa.ctgs.*; import gplx.xowa.specials.search.*; import gplx.xowa.dbs.tbls.*; -import gplx.xowa.wikis.data.*; +import gplx.core.primitives.*; import gplx.dbs.*; import gplx.dbs.cfgs.*; +import gplx.xowa.apps.*; import gplx.xowa.bldrs.cmds.ctgs.*; import gplx.xowa.ctgs.*; import gplx.xowa.specials.search.*; import gplx.xowa.wikis.data.tbls.*; +import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; public class Xodb_load_mgr_sql implements Xodb_load_mgr { - public Xodb_load_mgr_sql(Xodb_mgr_sql db_mgr, Xowe_core_data_mgr fsys_mgr) {this.db_mgr = db_mgr; this.fsys_mgr = fsys_mgr;} private Xodb_mgr_sql db_mgr; Xowe_core_data_mgr fsys_mgr; + public Xodb_load_mgr_sql(Xodb_mgr_sql db_mgr, Xowd_db_mgr fsys_mgr) {this.db_mgr = db_mgr; this.fsys_mgr = fsys_mgr;} private Xodb_mgr_sql db_mgr; Xowd_db_mgr fsys_mgr; public byte Search_version() { - if (search_provider == null) Search_version_init(); + if (search_version_init_needed) Search_version_init(); return search_version; } private byte search_version = gplx.xowa.specials.search.Xosrh_core.Version_null; public void Search_version_refresh() { - search_provider = null; + search_version_init_needed = true; Search_version_init(); } public void Load_init(Xowe_wiki wiki) { Load_init_cfg(wiki); - db_mgr.Tbl_site_stats().Select(wiki); - db_mgr.Tbl_xowa_ns().Select_all(wiki.Ns_mgr()); + Xowd_db_file db_core = wiki.Data_mgr__core_mgr().Db__core(); + db_core.Tbl__site_stats().Select(wiki.Stats()); + db_core.Tbl__ns().Select_all(wiki.Ns_mgr()); } private void Load_init_cfg(Xowe_wiki wiki) { - String_obj_ref version_val = String_obj_ref.null_(); String version_key = Xoa_gfs_mgr.Build_code(Xowe_wiki.Invk_props, Xow_wiki_props.Invk_bldr_version); - KeyVal[] kv_ary = db_mgr.Tbl_xowa_cfg().Select_kvs(Xodb_mgr_sql.Grp_wiki_init, version_key, version_val); - Xodb_upgrade_mgr.Upgrade(db_mgr, kv_ary, version_key, version_val.Val()); + Db_cfg_hash cfg_hash = db_mgr.Core_data_mgr().Tbl__cfg().Select_as_hash(Xow_cfg_consts.Grp_wiki_init); + String version_val = cfg_hash.Get(version_key).To_str_or(""); + Xodb_upgrade_mgr.Upgrade(db_mgr, cfg_hash, version_key, version_val); Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_k004(); Xoa_gfs_mgr gfs_mgr = wiki.Appe().Gfs_mgr(); try { - int len = kv_ary.length; - for (int i = 0; i < len; i++) { - KeyVal kv = kv_ary[i]; - gfs_mgr.Build_prop_set(bfr, Bry_.new_utf8_(kv.Key()), Bry_.new_utf8_(kv.Val_to_str_or_empty())); + int len = cfg_hash.Len(); + for (int i = 0; i < len; ++i) { + Db_cfg_itm cfg_itm = cfg_hash.Get_at(i); + gfs_mgr.Build_prop_set(bfr, Bry_.new_utf8_(cfg_itm.Key()), Bry_.new_utf8_(cfg_itm.To_str_or(""))); } gfs_mgr.Run_str_for(wiki, bfr.Xto_str_and_clear()); } finally {bfr.Mkr_rls();} } - public boolean Load_by_ttl(Xodb_page rv, Xow_ns ns, byte[] ttl) {return db_mgr.Tbl_page().Select_by_ttl(rv, ns, ttl);} - public void Load_by_ttls(Cancelable cancelable, OrderedHash rv, boolean fill_idx_fields_only, int bgn, int end) {db_mgr.Tbl_page().Select_by_ttl_in(cancelable, rv, db_mgr.Db_ctx(), fill_idx_fields_only, bgn, end);} - public void Load_page(Xodb_page rv, Xow_ns ns, boolean timestamp_enabled) {rv.Wtxt_(db_mgr.Tbl_text().Select(rv.Wtxt_db_id(), rv.Id()));} - public boolean Load_by_id (Xodb_page rv, int id) {return db_mgr.Tbl_page().Select_by_id(rv, id);} - public void Load_by_ids(Cancelable cancelable, ListAdp rv, int bgn, int end) {db_mgr.Tbl_page().Select_by_id_list(cancelable, false, rv, bgn, end);} + public boolean Load_by_ttl(Xowd_page_itm rv, Xow_ns ns, byte[] ttl) {return db_mgr.Core_data_mgr().Tbl__page().Select_by_ttl(rv, ns, ttl);} + public void Load_by_ttls(Cancelable cancelable, OrderedHash rv, boolean fill_idx_fields_only, int bgn, int end) { + db_mgr.Core_data_mgr().Tbl__page().Select_in__ns_ttl(cancelable, rv, db_mgr.Wiki().Ns_mgr(), fill_idx_fields_only, bgn, end); + } + public void Load_page(Xowd_page_itm rv, Xow_ns ns, boolean timestamp_enabled) { + Xowd_text_tbl text_tbl = db_mgr.Core_data_mgr().Dbs__get_at(rv.Text_db_id()).Tbl__text(); + byte[] text_bry = text_tbl.Select(rv.Id()); + rv.Text_(text_bry); + } + public boolean Load_by_id (Xowd_page_itm rv, int id) {return db_mgr.Core_data_mgr().Tbl__page().Select_by_id(rv, id);} + public void Load_by_ids(Cancelable cancelable, ListAdp rv, int bgn, int end) {db_mgr.Core_data_mgr().Tbl__page().Select_in__id(cancelable, false, rv, bgn, end);} public boolean Load_ctg_v1(Xoctg_view_ctg rv, byte[] ctg_bry) { - int cat_page_id = db_mgr.Tbl_page().Select_id(Xow_ns_.Id_category, ctg_bry); if (cat_page_id == Xodb_mgr_sql.Page_id_null) return false; - Xodb_category_itm ctg = db_mgr.Tbl_category().Select(fsys_mgr.Conn_ctg(), cat_page_id); if (ctg == Xodb_category_itm.Null) return false; - Db_conn p = fsys_mgr.Dbs__get_at(ctg.File_idx()).Conn(); - return db_mgr.Ctg_select_v1(rv, p, ctg); + int cat_page_id = db_mgr.Core_data_mgr().Tbl__page().Select_id(Xow_ns_.Id_category, ctg_bry); if (cat_page_id == Xowd_page_itm.Id_null) return false; + Xowd_category_itm ctg = fsys_mgr.Db__cat_core().Tbl__cat_core().Select(cat_page_id); if (ctg == Xowd_category_itm.Null) return false; + return Ctg_select_v1(db_mgr.Wiki(), db_mgr.Core_data_mgr(), rv, ctg.File_idx(), ctg); } public boolean Load_ctg_v2(Xoctg_data_ctg rv, byte[] ctg_bry) {throw Err_.not_implemented_();} public void Load_ctg_v2a(Xoctg_view_ctg rv, Xoctg_url ctg_url, byte[] ctg_ttl, int load_max) { - int cat_page_id = db_mgr.Tbl_page().Select_id(Xow_ns_.Id_category, ctg_ttl); if (cat_page_id == Xodb_mgr_sql.Page_id_null) return; - Xodb_category_itm ctg = db_mgr.Tbl_category().Select(fsys_mgr.Conn_ctg(), cat_page_id); if (ctg == Xodb_category_itm.Null) return; - Db_conn p = fsys_mgr.Dbs__get_at(ctg.File_idx()).Conn(); + int cat_page_id = db_mgr.Core_data_mgr().Tbl__page().Select_id(Xow_ns_.Id_category, ctg_ttl); if (cat_page_id == Xowd_page_itm.Id_null) return; + Xowd_category_itm ctg = fsys_mgr.Db__cat_core().Tbl__cat_core().Select(cat_page_id); if (ctg == Xowd_category_itm.Null) return; ListAdp list = ListAdp_.new_(); - Load_ctg_v2a_db_retrieve(rv, ctg_url, cat_page_id, load_max, p, list); + Load_ctg_v2a_db_retrieve(rv, ctg_url, cat_page_id, load_max, ctg.File_idx(), list); Load_ctg_v2a_ui_sift(rv, ctg, list); } - private void Load_ctg_v2a_db_retrieve(Xoctg_view_ctg rv, Xoctg_url ctg_url, int cat_page_id, int load_max, Db_conn p, ListAdp list) { + private void Load_ctg_v2a_db_retrieve(Xoctg_view_ctg rv, Xoctg_url ctg_url, int cat_page_id, int load_max, int cat_link_db_idx, ListAdp list) { int len = Xoa_ctg_mgr.Tid__max; for (byte i = Xoa_ctg_mgr.Tid_subc; i < len; i++) { boolean arg_is_from = ctg_url.Grp_fwds()[i] == Bool_.N_byte; byte[] arg_sortkey = ctg_url.Grp_idxs()[i]; - int found = db_mgr.Tbl_categorylinks().Select_by_type(p, list, cat_page_id, i, arg_sortkey, arg_is_from, load_max); + Xowd_cat_link_tbl cat_link_tbl = db_mgr.Core_data_mgr().Dbs__get_at(cat_link_db_idx).Tbl__cat_link(); + int found = cat_link_tbl.Select_by_type(list, cat_page_id, i, arg_sortkey, arg_is_from, load_max); if (found > 0 && found == load_max + 1) { - Xodb_page last_page = (Xodb_page)ListAdp_.Pop(list); + Xowd_page_itm last_page = (Xowd_page_itm)ListAdp_.Pop(list); Xoctg_page_xtn last_ctg = (Xoctg_page_xtn)last_page.Xtn(); rv.Grp_by_tid(i).Itms_last_sortkey_(last_ctg.Sortkey()); } } - db_mgr.Tbl_page().Select_by_id_list(Cancelable_.Never, list); + db_mgr.Core_data_mgr().Tbl__page().Select_in__id(Cancelable_.Never, list); } - private void Load_ctg_v2a_ui_sift(Xoctg_view_ctg rv, Xodb_category_itm ctg, ListAdp list) { + private void Load_ctg_v2a_ui_sift(Xoctg_view_ctg rv, Xowd_category_itm ctg, ListAdp list) { int len = list.Count(); Xowe_wiki wiki = this.db_mgr.Wiki(); byte prv_tid = Byte_.Max_value_127; Xoctg_view_grp view_grp = null; for (int i = 0; i < len; i++) { - Xodb_page db_page = (Xodb_page)list.FetchAt(i); + Xowd_page_itm db_page = (Xowd_page_itm)list.FetchAt(i); if (db_page.Ns_id() == Int_.MinValue) continue; // HACK: page not found; ignore Xoctg_page_xtn db_ctg = (Xoctg_page_xtn)db_page.Xtn(); byte cur_tid = db_ctg.Tid(); @@ -100,7 +106,7 @@ public class Xodb_load_mgr_sql implements Xodb_load_mgr { } Xoa_ttl ttl = Xoa_ttl.parse_(wiki, db_page.Ns_id(), db_page.Ttl_page_db()); Xoctg_view_itm view_itm = new Xoctg_view_itm().Sortkey_(db_ctg.Sortkey()).Ttl_(ttl); - view_itm.Load_by_ttl_data(cur_tid, db_page.Id(), Xodb_page.Modified_on_null_int, db_page.Wtxt_len()); + view_itm.Load_by_ttl_data(cur_tid, db_page.Id(), Xowd_page_itm.Modified_on_null_int, db_page.Text_len()); view_grp.Itms_add(view_itm); } len = Xoa_ctg_mgr.Tid__max; @@ -110,64 +116,88 @@ public class Xodb_load_mgr_sql implements Xodb_load_mgr { view_grp.Total_(ctg.Count_by_tid(i)); } } - private Db_conn search_provider = null; + private boolean search_version_init_needed = true; private void Search_version_init() { - if (search_provider == null) { - Xowd_db_file search_file = db_mgr.Core_data_mgr().Dbs__get_by_tid_1st(Xowd_db_file_.Tid_search); - if (search_file == Xowd_db_file.Null) { - search_provider = Db_conn_.Null; - search_version = gplx.xowa.specials.search.Xosrh_core.Version_1; - } - else { - search_provider = search_file.Conn(); - search_version = gplx.xowa.specials.search.Xosrh_core.Version_2; - } + if (search_version_init_needed) { + search_version_init_needed = false; + Xowd_db_file search_db = db_mgr.Core_data_mgr().Db__search(); + search_version = search_db == Xowd_db_file.Null ? Xosrh_core.Version_1 : Xosrh_core.Version_2; } } public void Load_search(Cancelable cancelable, ListAdp rv, byte[] search, int results_max) { - if (search_provider == null) Search_version_init(); + if (search_version_init_needed) Search_version_init(); if (search_version == gplx.xowa.specials.search.Xosrh_core.Version_1) - db_mgr.Tbl_page().Select_by_search(cancelable, rv, search, results_max); + db_mgr.Core_data_mgr().Tbl__page().Select_by_search(cancelable, rv, search, results_max); else { - Xodb_search_title_word_tbl.Select_by_word(cancelable, rv, db_mgr.Db_ctx(), search, results_max, db_mgr.Core_data_mgr().Dbs__get_by_tid_1st(Xowd_db_file_.Tid_search).Conn()); - db_mgr.Tbl_page().Select_by_id_list(cancelable, true, rv); + Xowd_db_mgr core_data_mgr = db_mgr.Core_data_mgr(); + core_data_mgr.Db__search().Tbl__search_word().Select_by_word(cancelable, core_data_mgr.Db__search().Tbl__search_link(), rv, search, results_max); + core_data_mgr.Tbl__page().Select_in__id(cancelable, true, rv); } } - public void Load_ttls_for_all_pages(Cancelable cancelable, ListAdp rslt_list, Xodb_page rslt_nxt, Xodb_page rslt_prv, Int_obj_ref rslt_count, Xow_ns ns, byte[] key, int max_results, int min_page_len, int browse_len, boolean include_redirects, boolean fetch_prv_item) { - db_mgr.Tbl_page().Load_ttls_for_all_pages(cancelable, rslt_list, rslt_nxt, rslt_prv, rslt_count, ns, key, max_results, min_page_len, browse_len, include_redirects, fetch_prv_item); + public void Load_ttls_for_all_pages(Cancelable cancelable, ListAdp rslt_list, Xowd_page_itm rslt_nxt, Xowd_page_itm rslt_prv, Int_obj_ref rslt_count, Xow_ns ns, byte[] key, int max_results, int min_page_len, int browse_len, boolean include_redirects, boolean fetch_prv_item) { + db_mgr.Core_data_mgr().Tbl__page().Select_for_special_all_pages(cancelable, rslt_list, rslt_nxt, rslt_prv, rslt_count, ns, key, max_results, min_page_len, browse_len, include_redirects, fetch_prv_item); } public void Load_ttls_for_search_suggest(Cancelable cancelable, ListAdp rslt_list, Xow_ns ns, byte[] key, int max_results, int min_page_len, int browse_len, boolean include_redirects, boolean fetch_prv_item) { - db_mgr.Tbl_page().Load_ttls_for_search_suggest(cancelable, rslt_list, ns, key, max_results, min_page_len, browse_len, include_redirects, fetch_prv_item); + db_mgr.Core_data_mgr().Tbl__page().Select_for_search_suggest(cancelable, rslt_list, ns, key, max_results, min_page_len, browse_len, include_redirects, fetch_prv_item); } public int Load_ctg_count(byte[] ttl) { - int page_id = db_mgr.Tbl_page().Select_id(Xow_ns_.Id_category, ttl); - if (page_id == Xodb_mgr_sql.Page_id_null) return 0; // title not found; return 0; - return db_mgr.Tbl_category().Select(fsys_mgr.Conn_ctg(), page_id).Count_all(); + if (db_mgr.Core_data_mgr().Db__cat_core() == null) return 0; + int page_id = db_mgr.Core_data_mgr().Tbl__page().Select_id(Xow_ns_.Id_category, ttl); + if (page_id == Xowd_page_itm.Id_null) return 0; // title not found; return 0; + return db_mgr.Core_data_mgr().Db__cat_core().Tbl__cat_core().Select(page_id).Count_all(); } - public byte[] Load_qid(byte[] wiki_alias, byte[] ns_num, byte[] ttl) {return db_mgr.Tbl_wdata_qids().Select_qid(fsys_mgr.Conn_wdata(), wiki_alias, ns_num, ttl);} - public int Load_pid(byte[] lang_key, byte[] pid_name) {return db_mgr.Tbl_wdata_pids().Select_pid(fsys_mgr.Conn_wdata(), lang_key, pid_name);} - public byte[] Find_random_ttl(Xow_ns ns) {return db_mgr.Tbl_page().Select_random(ns);} + public byte[] Load_qid(byte[] wiki_alias, byte[] ns_num, byte[] ttl) {return db_mgr.Core_data_mgr().Db__wbase().Tbl__wbase_qid().Select_qid(wiki_alias, ns_num, ttl);} + public int Load_pid(byte[] lang_key, byte[] pid_name) {return db_mgr.Core_data_mgr().Db__wbase().Tbl__wbase_pid().Select_pid(lang_key, pid_name);} + public byte[] Find_random_ttl(Xow_ns ns) {return db_mgr.Core_data_mgr().Tbl__page().Select_random(ns);} public void Clear() {} - public Xodb_page[] Load_ctg_list(byte[][] ctg_ttls) { + public Xowd_page_itm[] Load_ctg_list(byte[][] ctg_ttls) { + if (db_mgr.Core_data_mgr().Db__cat_core() == null) return Xowd_page_itm.Ary_empty; int len = ctg_ttls.length; OrderedHash hash = OrderedHash_.new_bry_(); for (int i = 0; i < len; i++) { - Xodb_page page = new Xodb_page(); + Xowd_page_itm page = new Xowd_page_itm(); byte[] ttl = Xoa_ttl.Replace_spaces(ctg_ttls[i]); // NOTE: ctg_ttls has spaces since v1 rendered it literally; page.Ttl_page_db_(ttl); if (!hash.Has(ttl)) hash.Add(ttl, page); } len = hash.Count(); // must update len (!hash.Has() may have skipped titles) - db_mgr.Tbl_page().Select_by_ttl_in(Cancelable_.Never, hash, Xow_ns_.Id_category, 0, len); + db_mgr.Core_data_mgr().Tbl__page().Select_in__ttl(Cancelable_.Never, hash, Xow_ns_.Id_category, 0, len); OrderedHash hash2 = OrderedHash_.new_(); for (int i = 0; i < len; i++) { - Xodb_page page = (Xodb_page)hash.FetchAt(i); + Xowd_page_itm page = (Xowd_page_itm)hash.FetchAt(i); if (!hash2.Has(page.Id_val())) hash2.Add(page.Id_val(), page); } len = hash2.Count(); // must update len (!hash2.Has() may have skipped titles) - db_mgr.Tbl_category().Select_by_cat_id_in(Cancelable_.Never, hash2, fsys_mgr.Conn_ctg(), db_mgr.Db_ctx(), 0, len); - return (Xodb_page[])hash.Xto_ary(Xodb_page.class); + db_mgr.Core_data_mgr().Db__cat_core().Tbl__cat_core().Select_by_cat_id_in(Cancelable_.Never, hash2, 0, len); + return (Xowd_page_itm[])hash.Xto_ary(Xowd_page_itm.class); + } + private static boolean Ctg_select_v1(Xowe_wiki wiki, Xowd_db_mgr core_data_mgr, Xoctg_view_ctg view_ctg, int link_db_id, Xowd_category_itm ctg) { + ListAdp link_list = ListAdp_.new_(); + core_data_mgr.Dbs__get_at(link_db_id).Tbl__cat_link().Select_in(link_list, ctg.Id()); + int link_list_len = link_list.Count(); + link_list.SortBy(Xowd_page_itm_sorter.IdAsc); + core_data_mgr.Tbl__page().Select_in__id(Cancelable_.Never, false, link_list, 0, link_list_len); + link_list.SortBy(Xowd_page_itm_sorter.Ns_id_TtlAsc); + boolean rv = false; + for (int i = 0; i < link_list.Count(); i++) { + Xowd_page_itm page = (Xowd_page_itm)link_list.FetchAt(i); + if (page.Ns_id() == Int_.MinValue) continue; // HACK: page not found; ignore + byte ctg_tid = Xodb_load_mgr_txt.Load_ctg_v1_tid(page.Ns_id()); + Xoctg_view_grp ctg_grp = view_ctg.Grp_by_tid(ctg_tid); + Xoctg_view_itm ctg_itm = new Xoctg_view_itm(); + ctg_itm.Load_by_ttl_data(ctg_tid, page.Id(), 0, page.Text_len()); + ctg_itm.Ttl_(Xoa_ttl.parse_(wiki, page.Ns_id(), page.Ttl_page_db())); + ctg_itm.Sortkey_(page.Ttl_page_db()); + ctg_grp.Itms_add(ctg_itm); + rv = true; + } + for (byte i = 0; i < Xoa_ctg_mgr.Tid__max; i++) { + Xoctg_view_grp ctg_grp = view_ctg.Grp_by_tid(i); + ctg_grp.Itms_make(); + ctg_grp.Total_(ctg_grp.Itms().length); + } + return rv; } } diff --git a/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_sql_tst.java b/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_sql_tst.java index 74f492509..699381e33 100644 --- a/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_sql_tst.java +++ b/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_sql_tst.java @@ -16,12 +16,13 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.dbs; import gplx.*; import gplx.xowa.*; -import org.junit.*; import gplx.core.primitives.*; import gplx.xowa.bldrs.*; import gplx.xowa.ctgs.*; import gplx.dbs.*; import gplx.xowa.dbs.tbls.*; +import org.junit.*; import gplx.core.primitives.*; import gplx.xowa.bldrs.*; import gplx.xowa.ctgs.*; import gplx.dbs.*; import gplx.xowa.wikis.data.tbls.*; public class Xodb_load_mgr_sql_tst { @Before public void init() {if (Xoa_test_.Db_skip()) return; fxt.Clear();} private Xodb_load_mgr_sql_fxt fxt = new Xodb_load_mgr_sql_fxt(); + @After public void term() {if (Xoa_test_.Db_skip()) return; fxt.Rls();} @Test public void Load_ctg_ttls() { if (Xoa_test_.Db_skip()) return; - Xodb_page[] ctgs = fxt.pages_ + Xowd_page_itm[] ctgs = fxt.pages_ ( fxt.ctg_(1, "Ctg_1", Bool_.Y, 10, 11, 12) , fxt.ctg_(2, "Ctg_2", Bool_.N, 20, 21, 22) , fxt.ctg_(3, "Ctg_3", Bool_.Y, 30, 31, 32) @@ -39,6 +40,7 @@ class Xoctg_url_mok extends Xoctg_url { public Xoctg_url_mok Page_bgn_(String v) } } class Xodb_load_mgr_sql_fxt { + Db_mgr_fxt fxt; Int_obj_ref next_id = Int_obj_ref.new_(1); Xoae_app app; Xowe_wiki wiki; public void Clear() { if (fxt == null) { fxt = new Db_mgr_fxt(); @@ -47,46 +49,47 @@ class Xodb_load_mgr_sql_fxt { wiki = fxt.Wiki(); app = wiki.Appe(); } - } Db_mgr_fxt fxt; Int_obj_ref next_id = Int_obj_ref.new_(1); Xoae_app app; Xowe_wiki wiki; - - public Xodb_page[] pages_(Xodb_page... ary) {return ary;} - public Xodb_page ctg_(int id, String ttl, boolean hidden, int count_subcs, int count_files, int count_pages) { - Xodb_page rv = new Xodb_page().Ns_id_(Xow_ns_.Id_category).Id_(id).Ttl_page_db_(Bry_.new_ascii_(ttl)); - Xodb_category_itm ctg = Xodb_category_itm.load_(id, 0, hidden, count_subcs, count_files, count_pages); + } + public void Rls() {fxt.Rls();} + public Xowd_page_itm[] pages_(Xowd_page_itm... ary) {return ary;} + public Xowd_page_itm ctg_(int id, String ttl, boolean hidden, int count_subcs, int count_files, int count_pages) { + Xowd_page_itm rv = new Xowd_page_itm().Ns_id_(Xow_ns_.Id_category).Id_(id).Ttl_page_db_(Bry_.new_ascii_(ttl)); + Xowd_category_itm ctg = Xowd_category_itm.load_(id, 0, hidden, count_subcs, count_files, count_pages); rv.Xtn_(ctg); return rv; } - public void Init_save_ctgs(Xodb_page[] ary) { + public void Init_save_ctgs(Xowd_page_itm[] ary) { int len = ary.length; Xodb_mgr_sql db_mgr = wiki.Db_mgr_as_sql(); - Db_conn p = db_mgr.Core_data_mgr().Conn_core(); - p.Txn_mgr().Txn_bgn_if_none(); - Db_stmt page_stmt = db_mgr.Tbl_page().Insert_stmt(p); - Db_stmt category_stmt = db_mgr.Tbl_category().Insert_stmt(p); + Xowd_cat_core_tbl cat_core_tbl = db_mgr.Core_data_mgr().Db__cat_core().Tbl__cat_core().Create_tbl(); DateAdp modified = DateAdp_.Now(); + Xowd_page_tbl tbl_page = wiki.Db_mgr_as_sql().Core_data_mgr().Tbl__page(); + tbl_page.Insert_bgn(); + cat_core_tbl.Insert_bgn(); for (int i = 0; i < len; i++) { - Xodb_page page = ary[i]; - db_mgr.Tbl_page().Insert(page_stmt, page.Id(), page.Ns_id(), page.Ttl_page_db(), false, modified, 10, page.Id(), 0, 0); - Xodb_category_itm ctg_itm = (Xodb_category_itm)page.Xtn(); - db_mgr.Tbl_category().Insert(category_stmt, ctg_itm.Id(), ctg_itm.Count_pages(), ctg_itm.Count_subcs(), ctg_itm.Count_files(), Bool_.Xto_byte(ctg_itm.Hidden()), 0); + Xowd_page_itm page = ary[i]; + tbl_page.Insert_cmd_by_batch(page.Id(), page.Ns_id(), page.Ttl_page_db(), false, modified, 10, page.Id(), 0, 0); + Xowd_category_itm ctg_itm = (Xowd_category_itm)page.Xtn(); + cat_core_tbl.Insert_cmd_by_batch(ctg_itm.Id(), ctg_itm.Count_pages(), ctg_itm.Count_subcs(), ctg_itm.Count_files(), Bool_.Xto_byte(ctg_itm.Hidden()), 0); } - p.Txn_mgr().Txn_end_all(); + cat_core_tbl.Insert_end(); + tbl_page.Insert_end(); } - public void Test_load_ctg_list(Xodb_page[] ary) { + public void Test_load_ctg_list(Xowd_page_itm[] ary) { int len = ary.length; byte[][] ttls = new byte[len][]; for (int i = 0; i < len; i++) { ttls[i] = ary[i].Ttl_page_db(); } - Xodb_page[] actl = wiki.Db_mgr_as_sql().Load_mgr().Load_ctg_list(ttls); + Xowd_page_itm[] actl = wiki.Db_mgr_as_sql().Load_mgr().Load_ctg_list(ttls); Tfds.Eq_str_lines(Xto_str(ary), Xto_str(actl)); } - private static String Xto_str(Xodb_page[] ary) { + private static String Xto_str(Xowd_page_itm[] ary) { Bry_bfr bfr = Bry_bfr.new_(); int len = ary.length; for (int i = 0; i < len; i++) { - Xodb_page page = ary[i]; - Xodb_category_itm ctg_itm = (Xodb_category_itm)page.Xtn(); + Xowd_page_itm page = ary[i]; + Xowd_category_itm ctg_itm = (Xowd_category_itm)page.Xtn(); bfr.Add_int_variable(page.Id()).Add_byte_pipe(); bfr.Add(page.Ttl_page_db()).Add_byte_pipe(); bfr.Add_byte(Bool_.Xto_byte(ctg_itm.Hidden())).Add_byte_nl(); @@ -96,30 +99,6 @@ class Xodb_load_mgr_sql_fxt { public Xoctg_url_mok ctg_url_() {return new Xoctg_url_mok();} public Xodb_load_mgr_sql_fxt Init_limit_(int v) {limit = v; return this;} private int limit = 3; -// public void Init_ctg_insert(Xoctg_mok_ctg ctg) { -// Xodb_mgr_sql db_mgr = wiki.Db_mgr_as_sql(); -// Db_conn p = db_mgr.Fsys_mgr().Core_provider(); -// p.Txn_mgr().Txn_bgn_if_none(); -// Xodb_categorylinks_tbl ctg_tbl = db_mgr.Tbl_categorylinks(); -// Db_stmt ctg_stmt = ctg_tbl.Insert_stmt(p); -// Xodb_page_tbl page_tbl = db_mgr.Tbl_page(); -// Db_stmt page_stmt = page_tbl.Insert_stmt(); -// DateAdp modified_on = Tfds.Now_time0_add_min(0); -// int page_id = next_id.Val_add_post(); -// page_tbl.Insert(page_stmt, page_id, Xow_ns_.Id_category, ctg.Ttl(), false, modified_on, 0, page_id, 0); -// for (byte i = 0; i < Xoa_ctg_mgr.Tid__max; i++) { -// Xoctg_mok_grp grp = ctg.Grps_get_or_new(i); -// int grp_len = grp.Itms().Count(); -// for (int j = 0; j < grp_len; j++) { -// Xodb_page page = (Xodb_page)grp.Itms().FetchAt(j); -// Xoctg_page_xtn page_ctg = (Xoctg_page_xtn)page.Xtn(); -// page_id = page.Id(); -// ctg_tbl.Insert(ctg_stmt, page_id, ctg.Ttl(), page_ctg.Sortkey(), 0, i); -// page_tbl.Insert(page_stmt, page_id, page.Ns_id(), page.Ttl_wo_ns(), false, modified_on, 0, page_id, 0); -// } -// } -// p.Txn_mgr().Txn_end_all(); -// } public void Test_select(Xoctg_url ctg_url, Xoctg_mok_ctg expd) { Xoctg_view_ctg view_ctg = new Xoctg_view_ctg(); wiki.Db_mgr_as_sql().Load_mgr().Load_ctg_v2a(view_ctg, ctg_url, expd.Ttl(), limit); @@ -145,7 +124,7 @@ class Xodb_load_mgr_sql_fxt { int len = list.Count(); String[] rv = new String[len]; for (int i = 0; i< len; i++) { - Xodb_page itm = (Xodb_page)list.FetchAt(i); + Xowd_page_itm itm = (Xowd_page_itm)list.FetchAt(i); rv[i] = String_.new_ascii_(itm.Ttl_page_db()); } return rv; @@ -181,9 +160,9 @@ class Xoctg_mok_ctg { int ns_id = Xow_ns_.Id_main; byte ctg_tid = Xoa_ctg_mgr.Tid_page; for (int i = bgn; i < end; i++) { - byte[] ttl = Bry_.Add(ttl_prefix, Bry_.new_ascii_(Int_.Xto_str_pad_bgn(i, 3))); + byte[] ttl = Bry_.Add(ttl_prefix, Bry_.new_ascii_(Int_.Xto_str_pad_bgn_zero(i, 3))); Xoctg_page_xtn db_ctg = new Xoctg_page_xtn(ctg_tid, ttl); - Xodb_page page = new Xodb_page(); + Xowd_page_itm page = new Xowd_page_itm(); int page_id = next_id.Val_add_post(); page.Id_(page_id).Ns_id_(ns_id).Ttl_page_db_(ttl).Xtn_(db_ctg); grp.Itms().Add(page); diff --git a/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_txt.java b/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_txt.java index c8116725a..941494587 100644 --- a/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_txt.java +++ b/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_txt.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.dbs; import gplx.*; import gplx.xowa.*; -import gplx.core.primitives.*; import gplx.core.brys.*; import gplx.core.flds.*; import gplx.xowa.bldrs.imports.ctgs.*; import gplx.xowa.ctgs.*; import gplx.xowa.dbs.tbls.*; import gplx.xowa.specials.search.*; import gplx.xowa.tdbs.*; +import gplx.core.primitives.*; import gplx.core.brys.*; import gplx.core.flds.*; import gplx.xowa.bldrs.cmds.ctgs.*; import gplx.xowa.ctgs.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.specials.search.*; import gplx.xowa.tdbs.*; public class Xodb_load_mgr_txt implements Xodb_load_mgr { public Xodb_load_mgr_txt(Xowe_wiki wiki) { this.wiki = wiki; @@ -24,24 +24,24 @@ public class Xodb_load_mgr_txt implements Xodb_load_mgr { } private Xowe_wiki wiki; Xotdb_fsys_mgr fsys_mgr; Xob_xdat_file tmp_xdat_file = new Xob_xdat_file(); Xob_xdat_itm tmp_xdat_itm = new Xob_xdat_itm(); public void Load_init (Xowe_wiki wiki) {} - public void Load_page(Xodb_page rv, Xow_ns ns, boolean timestamp_enabled) {Load_page(rv, rv.Wtxt_db_id(), rv.Tdb_row_idx(), ns, timestamp_enabled, tmp_xdat_file, tmp_xdat_itm);} - public void Load_page(Xodb_page rv, int txt_fil_idx, int txt_row_idx, Xow_ns ns, boolean timestamp_enabled, Xob_xdat_file xdat_file, Xob_xdat_itm xdat_itm) { + public void Load_page(Xowd_page_itm rv, Xow_ns ns, boolean timestamp_enabled) {Load_page(rv, rv.Text_db_id(), rv.Tdb_row_idx(), ns, timestamp_enabled, tmp_xdat_file, tmp_xdat_itm);} + public void Load_page(Xowd_page_itm rv, int txt_fil_idx, int txt_row_idx, Xow_ns ns, boolean timestamp_enabled, Xob_xdat_file xdat_file, Xob_xdat_itm xdat_itm) { Io_url file = fsys_mgr.Url_ns_fil(Xotdb_dir_info_.Tid_page, ns.Id(), txt_fil_idx); byte[] bry = gplx.ios.Io_stream_rdr_.Load_all(file); int bry_len = bry.length; xdat_file.Clear().Parse(bry, bry_len, file).GetAt(xdat_itm, txt_row_idx); Load_page_parse(rv, bry, bry_len, xdat_itm.Itm_bgn(), xdat_itm.Itm_end(), timestamp_enabled); } - public boolean Load_by_ttl(Xodb_page rv, Xow_ns ns, byte[] ttl) { // NOTE: ttl must be correct case; EX: "Example title" + public boolean Load_by_ttl(Xowd_page_itm rv, Xow_ns ns, byte[] ttl) { // NOTE: ttl must be correct case; EX: "Example title" if (!Env_.Mode_testing() && wiki.Init_needed()) wiki.Init_assert(); // NOTE: need to call assert as wiki_finder (and possibly elsewhere) may call load on commons_wiki without ever asserting; DATE:2013-03-19 - if (!Load_xdat_itm(tmp_xdat_itm, ns, Xotdb_dir_info_.Tid_ttl, ttl, Xodb_page_.Txt_ttl_pos, Byte_ascii.Tab, true)) return false; - Xodb_page_.Txt_ttl_load(rv, tmp_xdat_itm.Itm_bry()); + if (!Load_xdat_itm(tmp_xdat_itm, ns, Xotdb_dir_info_.Tid_ttl, ttl, Xotdb_page_itm_.Txt_ttl_pos, Byte_ascii.Tab, true)) return false; + Xotdb_page_itm_.Txt_ttl_load(rv, tmp_xdat_itm.Itm_bry()); rv.Exists_(true); return Bry_.Eq(rv.Ttl_page_db(), ttl); } public void Load_by_ttls(Cancelable cancelable, OrderedHash rv, boolean fill_idx_fields_only, int bgn, int end) {// NOTE: Load_by_ttls just a wrapper around Load_by_ttl; for xdat, Load_by_ttl is fast enough for (int i = bgn; i < end; i++) { if (cancelable.Canceled()) return; - Xodb_page page = (Xodb_page)rv.FetchAt(i); + Xowd_page_itm page = (Xowd_page_itm)rv.FetchAt(i); Load_by_ttl(page, page.Ns(), page.Ttl_page_db()); } } @@ -52,7 +52,7 @@ public class Xodb_load_mgr_txt implements Xodb_load_mgr { Gfo_usr_dlg_fmt msg_wtr = Gfo_usr_dlg_fmt.fmt_(GRP_KEY, "search2_ids", "resolving ids: ~{0} of ~{1} (~{2})", len, 10f); for (int i = 0; i < len; i++) { if (cancelable.Canceled()) return; - Xodb_page itm = (Xodb_page)list.FetchAt(i + bgn); + Xowd_page_itm itm = (Xowd_page_itm)list.FetchAt(i + bgn); Base85_utl.XtoStrByAry(itm.Id(), id_bry, 0, 5); int cur_fil_idx = this.Find_file_idx_by_site(Xotdb_dir_info_.Tid_id, id_bry); if (cur_fil_idx != prv_fil_idx) { @@ -63,7 +63,7 @@ public class Xodb_load_mgr_txt implements Xodb_load_mgr { itm.Ns_id_(tmp_page.Ns_id()).Ttl_page_db_(tmp_page.Ttl_page_db()); msg_wtr.Write_prog_cur(i, wiki.Appe().Usr_dlg()); } - } Xodb_page tmp_page = new Xodb_page(); + } Xowd_page_itm tmp_page = new Xowd_page_itm(); public void Load_search(Cancelable cancelable, ListAdp rv, byte[] search, int results_max) { Xow_ns ns = wiki.Ns_mgr().Ns_main(); int search_len = search.length; @@ -115,7 +115,7 @@ public class Xodb_load_mgr_txt implements Xodb_load_mgr { int page_id = Base85_utl.XtoIntByAry(raw, pos, pos + 4); pos += 6; // 5 + 1 for semic; int page_len = Base85_utl.XtoIntByAry(raw, pos, pos + 4); - rv.Add(Xodb_page.new_srch(page_id, page_len)); + rv.Add(Xowd_page_itm.new_srch(page_id, page_len)); pos += 6; // 5 + 1 for pipe // if (match.Itms_len() == max_results) break; } @@ -171,16 +171,16 @@ public class Xodb_load_mgr_txt implements Xodb_load_mgr { idx_mgr.Total_(count); } } - public boolean Load_by_id(Xodb_page page, int id) {Base85_utl.XtoStrByAry(id, tmp_id_bry, 0, 5); return Load_by_id(page, tmp_id_bry);} private byte[] tmp_id_bry = new byte[5]; - boolean Load_by_id(Xodb_page page, byte[] id_bry) { + public boolean Load_by_id(Xowd_page_itm page, int id) {Base85_utl.XtoStrByAry(id, tmp_id_bry, 0, 5); return Load_by_id(page, tmp_id_bry);} private byte[] tmp_id_bry = new byte[5]; + boolean Load_by_id(Xowd_page_itm page, byte[] id_bry) { if (!Load_xdat_itm(tmp_xdat_itm, Xotdb_dir_info_.Tid_id, id_bry, true)) return false;; - Xodb_page_.Txt_id_load(page, tmp_xdat_itm.Itm_bry()); + Xotdb_page_itm_.Txt_id_load(page, tmp_xdat_itm.Itm_bry()); return true; } - boolean Load_by_id(Xodb_page page, Xob_xdat_file xdat_file, byte[] id_bry) { + boolean Load_by_id(Xowd_page_itm page, Xob_xdat_file xdat_file, byte[] id_bry) { xdat_file.Find(tmp_xdat_itm, id_bry, 0, Byte_ascii.Pipe, true); if (tmp_xdat_itm.Missing()) return false; - Xodb_page_.Txt_id_load(page, tmp_xdat_itm.Itm_bry()); + Xotdb_page_itm_.Txt_id_load(page, tmp_xdat_itm.Itm_bry()); return true; } boolean Load_xdat_itm(Xob_xdat_itm xdat_itm, byte regy_tid, byte[] key, boolean exact) {return Load_xdat_itm(xdat_itm, null, regy_tid, key, 0, Byte_ascii.Pipe, exact);} @@ -225,7 +225,7 @@ public class Xodb_load_mgr_txt implements Xodb_load_mgr { rv = true; } if (cancelable.Canceled()) return false; - tmp_bfr.Mkr_rls().Clear(); + tmp_bfr.Clear_and_rls(); return rv; } int Find_file_idx_by_ns(byte regy_tid, Xow_ns ns, byte[] key) { @@ -258,7 +258,7 @@ public class Xodb_load_mgr_txt implements Xodb_load_mgr { Load_xdat_file(Cancelable_.Never, tmp_xdat_file, file_url); Xob_random_itm file = files[file_idx]; tmp_xdat_file.GetAt(tmp_xdat_itm, random_idx - file.Bgn()); // get nth row; EX: random_idx=120; .Bgn=103 -> get 17th - Xodb_page page = Xodb_page_.Txt_ttl_load(tmp_xdat_itm.Itm_bry()); + Xowd_page_itm page = Xotdb_page_itm_.Txt_ttl_load(tmp_xdat_itm.Itm_bry()); return page.Ttl_page_db(); } private static Xob_random_itm[] Build_random_itms(Xowd_regy_mgr mgr, Int_obj_ref count) { @@ -286,9 +286,9 @@ public class Xodb_load_mgr_txt implements Xodb_load_mgr { if (tmp_xdat_itm.Missing()) return false; ListAdp ctgs = ListAdp_.new_(); Load_ctg_v1_parse(ctgs, wiki.Appe().Usr_dlg(), tmp_xdat_itm.Itm_bry()); - ctgs.SortBy(Xodb_page_sorter.IdAsc); + ctgs.SortBy(Xowd_page_itm_sorter.IdAsc); this.Load_by_ids(Cancelable_.Never, ctgs, 0, ctgs.Count()); - ctgs.SortBy(Xodb_page_sorter.Ns_id_TtlAsc); + ctgs.SortBy(Xowd_page_itm_sorter.Ns_id_TtlAsc); int ctgs_len = ctgs.Count(); if (ctgs_len == 0) return false; if (count_only != null) { // Ctg_count specificed @@ -296,7 +296,7 @@ public class Xodb_load_mgr_txt implements Xodb_load_mgr { return true; } for (int i = 0; i < ctgs_len; i++) { - Xodb_page itm = (Xodb_page)ctgs.FetchAt(i); + Xowd_page_itm itm = (Xowd_page_itm)ctgs.FetchAt(i); byte itm_tid = Load_ctg_v1_tid(itm.Ns_id()); Xoctg_view_itm sub = Load_ctg_v1_sub(itm_tid, itm); sub.Ttl_(Xoa_ttl.parse_(wiki, itm.Ns_id(), itm.Ttl_page_db())).Sortkey_(itm.Ttl_page_db()); @@ -316,7 +316,7 @@ public class Xodb_load_mgr_txt implements Xodb_load_mgr { rv.Clear(); boolean garbage = false; for (int i = 0; i < rowCount; i++) { - Xodb_page row = new Xodb_page(); + Xowd_page_itm row = new Xowd_page_itm(); rv.Add(row); if (garbage) continue; int bgn = pos + 1 + (i * (Base85_utl.Len_int + gplx.xowa.apps.progs.Xoa_prog_mgr.Len_dlm_fld)); @@ -340,13 +340,13 @@ public class Xodb_load_mgr_txt implements Xodb_load_mgr { default: return Xoa_ctg_mgr.Tid_page; } } - private static Xoctg_view_itm Load_ctg_v1_sub(byte tid, Xodb_page data) { + private static Xoctg_view_itm Load_ctg_v1_sub(byte tid, Xowd_page_itm data) { Xoctg_view_itm rv = new Xoctg_view_itm(); - rv.Load_by_ttl_data(tid, data.Id(), 0, data.Wtxt_len()); + rv.Load_by_ttl_data(tid, data.Id(), 0, data.Text_len()); return rv; } - private void Load_page_parse(Xodb_page page, byte[] src, int src_len, int row_bgn, int row_end, boolean timestamp_enabled) { // \n\tdate5\tpage_title\tpage_text + private void Load_page_parse(Xowd_page_itm page, byte[] src, int src_len, int row_bgn, int row_end, boolean timestamp_enabled) { // \n\tdate5\tpage_title\tpage_text int timestamp_bgn = row_bgn + 5 + 1; int timestamp_end = timestamp_bgn + 5; if (timestamp_enabled) { @@ -354,8 +354,8 @@ public class Xodb_load_mgr_txt implements Xodb_load_mgr { page.Modified_on_(Bit_.Xto_date_short(timestamp)); } int name_bgn = timestamp_end + 1; - int name_end = Bry_finder.Find_fwd(src, Xodb_page_.Txt_page_dlm, name_bgn, src_len); - page.Wtxt_(Bry_.Mid(src, name_end + 1, row_end - 1)); // +1 to skip dlm + int name_end = Bry_finder.Find_fwd(src, Xotdb_page_itm_.Txt_page_dlm, name_bgn, src_len); + page.Text_(Bry_.Mid(src, name_end + 1, row_end - 1)); // +1 to skip dlm } Xowd_regy_mgr Get_regy_by_site(byte regy_tid) { Xowd_regy_mgr rv = site_regys[regy_tid]; @@ -376,29 +376,29 @@ public class Xodb_load_mgr_txt implements Xodb_load_mgr { } return rv; } private Xowd_regy_mgr[] ns_regys = new Xowd_regy_mgr[Xow_ns_mgr_.Ordinal_max]; - private Xodb_page tmp_rslt_nxt = new Xodb_page(), tmp_rslt_prv = new Xodb_page(); private Int_obj_ref tmp_rslt_count = Int_obj_ref.zero_(); + private Xowd_page_itm tmp_rslt_nxt = new Xowd_page_itm(), tmp_rslt_prv = new Xowd_page_itm(); private Int_obj_ref tmp_rslt_count = Int_obj_ref.zero_(); public void Load_ttls_for_search_suggest(Cancelable cancelable, ListAdp rslt_list, Xow_ns ns, byte[] key, int max_results, int min_page_len, int browse_len, boolean include_redirects, boolean fetch_prv_item) { this.Load_ttls_for_all_pages(cancelable, rslt_list, tmp_rslt_nxt, tmp_rslt_prv, tmp_rslt_count, ns, key, max_results, min_page_len, browse_len, include_redirects, fetch_prv_item); } - public void Load_ttls_for_all_pages(Cancelable cancelable, ListAdp rslt_list, Xodb_page rslt_nxt, Xodb_page rslt_prv, Int_obj_ref rslt_count, Xow_ns ns, byte[] key, int max_results, int min_page_len, int browse_len, boolean include_redirects, boolean fetch_prv_item) { + public void Load_ttls_for_all_pages(Cancelable cancelable, ListAdp rslt_list, Xowd_page_itm rslt_nxt, Xowd_page_itm rslt_prv, Int_obj_ref rslt_count, Xow_ns ns, byte[] key, int max_results, int min_page_len, int browse_len, boolean include_redirects, boolean fetch_prv_item) { byte dir_tid = Xotdb_dir_info_.Tid_ttl; Xob_xdat_file cur_xdat_file = new Xob_xdat_file(); Xob_xdat_itm cur_xdat_itm = new Xob_xdat_itm(); Xowd_regy_mgr regy = new Xowd_regy_mgr(fsys_mgr.Url_ns_reg(ns.Num_str(), dir_tid)); int fil_idx = regy.Files_find(key); if (fil_idx == Xowd_regy_mgr.Regy_null) return; if (!this.Load_xdat_file(Cancelable_.Never, cur_xdat_file, dir_tid, ns, fil_idx)) return; - cur_xdat_file.Find(cur_xdat_itm, key, Xodb_page_.Txt_ttl_pos, Byte_ascii.Tab, false); + cur_xdat_file.Find(cur_xdat_itm, key, Xotdb_page_itm_.Txt_ttl_pos, Byte_ascii.Tab, false); int itm_idx = cur_xdat_itm.Itm_idx(); if (itm_idx == -1) itm_idx = 0; // nothing found; return; Special_allpages_query_fwd(rslt_list, rslt_nxt, rslt_count , dir_tid, ns, include_redirects, browse_len, fil_idx, itm_idx , cur_xdat_file, cur_xdat_itm, regy); Special_allpages_query_bwd(rslt_list, rslt_prv , dir_tid, ns, include_redirects, browse_len, fil_idx, itm_idx - 1, cur_xdat_file, cur_xdat_itm); } - private void Special_allpages_query_fwd(ListAdp rslt_list, Xodb_page rslt_nxt, Int_obj_ref rslt_count, byte dir_tid, Xow_ns ns, boolean include_redirects, int total, int fil_idx, int row_idx, Xob_xdat_file xdat_file, Xob_xdat_itm xdat_itm, Xowd_regy_mgr regy) { + private void Special_allpages_query_fwd(ListAdp rslt_list, Xowd_page_itm rslt_nxt, Int_obj_ref rslt_count, byte dir_tid, Xow_ns ns, boolean include_redirects, int total, int fil_idx, int row_idx, Xob_xdat_file xdat_file, Xob_xdat_itm xdat_itm, Xowd_regy_mgr regy) { int count = 0; ++total; boolean loop = true; int regy_len = regy.Files_ary().length; int rslt_list_len = rslt_count.Val(); - Xodb_page nxt_itm = null; + Xowd_page_itm nxt_itm = null; while (loop) { if (fil_idx == regy_len) break; if (xdat_file == null) { @@ -409,7 +409,7 @@ public class Xodb_load_mgr_txt implements Xodb_load_mgr { int rows_len = xdat_file.Count(); for (; row_idx < rows_len; row_idx++) { xdat_file.GetAt(xdat_itm, row_idx); - Xodb_page ttl_itm = Xodb_page_.Txt_ttl_load(Bry_.Mid(xdat_itm.Src(), xdat_itm.Itm_bgn(), xdat_itm.Itm_end())); + Xowd_page_itm ttl_itm = Xotdb_page_itm_.Txt_ttl_load(Bry_.Mid(xdat_itm.Src(), xdat_itm.Itm_bgn(), xdat_itm.Itm_end())); if (!include_redirects && ttl_itm.Redirected()) continue; ++count; nxt_itm = ttl_itm; @@ -429,14 +429,14 @@ public class Xodb_load_mgr_txt implements Xodb_load_mgr { if (rslt_nxt != null) rslt_nxt.Copy(nxt_itm); } - private void Special_allpages_query_bwd(ListAdp rslt_list, Xodb_page rslt_prv, byte dir_tid, Xow_ns ns, boolean include_redirects, int total, int fil_idx, int row_idx, Xob_xdat_file xdat_file, Xob_xdat_itm xdat_itm) { + private void Special_allpages_query_bwd(ListAdp rslt_list, Xowd_page_itm rslt_prv, byte dir_tid, Xow_ns ns, boolean include_redirects, int total, int fil_idx, int row_idx, Xob_xdat_file xdat_file, Xob_xdat_itm xdat_itm) { if (row_idx < 0) { --fil_idx; row_idx = -1; } int count = 0; boolean loop = true; - Xodb_page prv_itm = null; + Xowd_page_itm prv_itm = null; while (loop) { if (fil_idx == -1) break; if (xdat_file == null) { @@ -448,7 +448,7 @@ public class Xodb_load_mgr_txt implements Xodb_load_mgr { row_idx = xdat_file.Count() - 1; for (; row_idx > -1; row_idx--) { xdat_file.GetAt(xdat_itm, row_idx); - Xodb_page ttl_itm = Xodb_page_.Txt_ttl_load(Bry_.Mid(xdat_itm.Src(), xdat_itm.Itm_bgn(), xdat_itm.Itm_end())); + Xowd_page_itm ttl_itm = Xotdb_page_itm_.Txt_ttl_load(Bry_.Mid(xdat_itm.Src(), xdat_itm.Itm_bgn(), xdat_itm.Itm_end())); if (!include_redirects && ttl_itm.Redirected()) continue; // list.Add(ttl_itm); ++count; @@ -465,7 +465,7 @@ public class Xodb_load_mgr_txt implements Xodb_load_mgr { --fil_idx; } if (prv_itm == null && rslt_list.Count() > 0) { - prv_itm = (Xodb_page)rslt_list.FetchAt(0); + prv_itm = (Xowd_page_itm)rslt_list.FetchAt(0); } if (rslt_prv != null) rslt_prv.Copy(prv_itm); @@ -514,19 +514,19 @@ public class Xodb_load_mgr_txt implements Xodb_load_mgr { ctg_mgr.Get_titles(wiki.Appe().Usr_dlg(), wiki, rv); rv.Num_(data_ctg); } - public Xodb_page[] Load_ctg_list(byte[][] ttls) { + public Xowd_page_itm[] Load_ctg_list(byte[][] ttls) { int len = ttls.length; - Xodb_page[] rv = new Xodb_page[len]; + Xowd_page_itm[] rv = new Xowd_page_itm[len]; Xow_ns ns = wiki.Ns_mgr().Ns_category(); Xoctg_data_ctg ctg_temp = new Xoctg_data_ctg(Bry_.Empty); for (int i = 0; i < len; i++) { byte[] ttl = Xoa_ttl.Replace_spaces(ttls[i]); // NOTE: ctg_ttls has spaces since v1 rendered it literally; - Xodb_page page = new Xodb_page(); + Xowd_page_itm page = new Xowd_page_itm(); this.Load_by_ttl(page, ns, ttl); Load_ctg_v2_main(ctg_temp, page.Ttl_page_db()); - Xodb_category_itm ctg_itm = Xodb_category_itm.load_(page.Id(), page.Wtxt_db_id(), ctg_temp.Hidden(), ctg_temp.Total_by_tid(Xoa_ctg_mgr.Tid_subc), ctg_temp.Total_by_tid(Xoa_ctg_mgr.Tid_file), ctg_temp.Total_by_tid(Xoa_ctg_mgr.Tid_page)); + Xowd_category_itm ctg_itm = Xowd_category_itm.load_(page.Id(), page.Text_db_id(), ctg_temp.Hidden(), ctg_temp.Total_by_tid(Xoa_ctg_mgr.Tid_subc), ctg_temp.Total_by_tid(Xoa_ctg_mgr.Tid_file), ctg_temp.Total_by_tid(Xoa_ctg_mgr.Tid_page)); page.Xtn_(ctg_itm); rv[i] = page; } diff --git a/400_xowa/src/gplx/xowa/dbs/Xodb_mgr.java b/400_xowa/src/gplx/xowa/dbs/Xodb_mgr.java index 7eb6e0e77..be4e0e015 100644 --- a/400_xowa/src/gplx/xowa/dbs/Xodb_mgr.java +++ b/400_xowa/src/gplx/xowa/dbs/Xodb_mgr.java @@ -16,15 +16,13 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.dbs; import gplx.*; import gplx.xowa.*; -import gplx.dbs.*; import gplx.xowa.html.hdumps.*; -public interface Xodb_mgr extends GfoInvkAble, RlsAble { +import gplx.dbs.*; import gplx.xowa.wikis.data.*; import gplx.xowa.html.hdumps.*; +public interface Xodb_mgr extends GfoInvkAble { byte Tid(); String Tid_name(); - byte Data_storage_format(); void Data_storage_format_(byte v); byte Category_version(); byte Search_version(); void Search_version_refresh(); - Xodb_ctx Db_ctx(); - DateAdp Dump_date_query(); Xodb_load_mgr Load_mgr(); Xodb_save_mgr Save_mgr(); + DateAdp Dump_date_query(); // used by maint_mgr } diff --git a/400_xowa/src/gplx/xowa/dbs/Xodb_mgr_sql.java b/400_xowa/src/gplx/xowa/dbs/Xodb_mgr_sql.java index 8c4f6b890..9ca0864eb 100644 --- a/400_xowa/src/gplx/xowa/dbs/Xodb_mgr_sql.java +++ b/400_xowa/src/gplx/xowa/dbs/Xodb_mgr_sql.java @@ -16,127 +16,38 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.dbs; import gplx.*; import gplx.xowa.*; -import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.dbs.engines.sqlite.*; -import gplx.xowa.apps.*; import gplx.xowa.dbs.tbls.*; import gplx.xowa.ctgs.*; import gplx.xowa.html.hdumps.*; -import gplx.xowa.wikis.data.*; +import gplx.ios.*; import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.dbs.engines.sqlite.*; +import gplx.xowa.apps.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.ctgs.*; import gplx.xowa.html.hdumps.*; +import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; public class Xodb_mgr_sql implements Xodb_mgr, GfoInvkAble { - private boolean html_db_enabled; public Xodb_mgr_sql(Xowe_wiki wiki) { this.wiki = wiki; - Io_url bin_db_dir = wiki.Appe().Fsys_mgr().Bin_any_dir().GenSubDir_nest("sql", "xowa"); - core_data_mgr = new Xowe_core_data_mgr(bin_db_dir, wiki.Fsys_mgr().Root_dir(), wiki.Domain_str()); - load_mgr = new Xodb_load_mgr_sql(this, core_data_mgr); - save_mgr = new Xodb_save_mgr_sql(this); - tbl_text = new Xodb_text_tbl(this); - tbl_page = new Xodb_page_tbl(wiki); + this.core_data_mgr = new Xowd_db_mgr(wiki.Fsys_mgr().Root_dir(), wiki.Domain_itm()); + this.load_mgr = new Xodb_load_mgr_sql(this, core_data_mgr); + this.save_mgr = new Xodb_save_mgr_sql(this, wiki.Page_mgr()); } - public byte Tid() {return Tid_sql;} public static final byte Tid_sql = 1; - public String Tid_name() {return "sqlite3";} - public Xowe_wiki Wiki() {return wiki;} private Xowe_wiki wiki; - public byte Data_storage_format() {return data_storage_format;} public void Data_storage_format_(byte v) {data_storage_format = v;} private byte data_storage_format = gplx.ios.Io_stream_.Tid_gzip; + public byte Tid() {return Tid_sql;} public String Tid_name() {return "sqlite3";} public static final byte Tid_sql = 1; + public Xowd_db_mgr Core_data_mgr() {return core_data_mgr;} private final Xowd_db_mgr core_data_mgr; + public Xowe_wiki Wiki() {return wiki;} private final Xowe_wiki wiki; + public Xodb_load_mgr Load_mgr() {return load_mgr;} private final Xodb_load_mgr_sql load_mgr; + public Xodb_save_mgr Save_mgr() {return save_mgr;} private final Xodb_save_mgr_sql save_mgr; public byte Category_version() {return category_version;} private byte category_version = Xoa_ctg_mgr.Version_null; - public byte Search_version() {return load_mgr.Search_version();} - public void Search_version_refresh() {load_mgr.Search_version_refresh();} - public void Html_db_enabled_(boolean v) { - html_db_enabled = v; db_ctx.Html_db_enabled_(v); - tbl_page.Html_db_enabled_(v); - core_data_mgr.Tbl__pg().Conn_(core_data_mgr.Conn_core(), Bool_.N, core_data_mgr.Cfg__schema_is_1(), core_data_mgr.Cfg__db_id(), v); - } - public Xodb_ctx Db_ctx() {return db_ctx;} private Xodb_ctx db_ctx = new Xodb_ctx(); - public Xowe_core_data_mgr Core_data_mgr() {return core_data_mgr;} private Xowe_core_data_mgr core_data_mgr; - public Xodb_load_mgr Load_mgr() {return load_mgr;} private Xodb_load_mgr_sql load_mgr; - public Xodb_save_mgr Save_mgr() {return save_mgr;} private Xodb_save_mgr_sql save_mgr; - public Xodb_xowa_cfg_tbl Tbl_xowa_cfg() {return tbl_cfg;} private Xodb_xowa_cfg_tbl tbl_cfg = new Xodb_xowa_cfg_tbl(); - public Xodb_xowa_ns_tbl Tbl_xowa_ns() {return tbl_ns;} private Xodb_xowa_ns_tbl tbl_ns = new Xodb_xowa_ns_tbl(); - public Xodb_page_tbl Tbl_page() {return tbl_page;} private Xodb_page_tbl tbl_page; - public Xodb_text_tbl Tbl_text() {return tbl_text;} private Xodb_text_tbl tbl_text; - public Xodb_site_stats_tbl Tbl_site_stats() {return tbl_site_stats;} private Xodb_site_stats_tbl tbl_site_stats = new Xodb_site_stats_tbl(); - public Xodb_wdata_qids_tbl Tbl_wdata_qids() {return tbl_wdata_qids;} private Xodb_wdata_qids_tbl tbl_wdata_qids = new Xodb_wdata_qids_tbl(); - public Xodb_wdata_pids_tbl Tbl_wdata_pids() {return tbl_wdata_pids;} private Xodb_wdata_pids_tbl tbl_wdata_pids = new Xodb_wdata_pids_tbl(); - public Xodb_category_tbl Tbl_category() {return tbl_category;} private Xodb_category_tbl tbl_category = new Xodb_category_tbl(); - public Xodb_categorylinks_tbl Tbl_categorylinks() {return tbl_categorylinks;} private Xodb_categorylinks_tbl tbl_categorylinks = new Xodb_categorylinks_tbl(); - public Xodb_search_title_word_tbl Tbl_search_title_word() {return tbl_search_title_word;} private Xodb_search_title_word_tbl tbl_search_title_word = new Xodb_search_title_word_tbl(); - public Xodb_search_title_page_tbl Tbl_search_title_page() {return tbl_search_title_page;} private Xodb_search_title_page_tbl tbl_search_title_page = new Xodb_search_title_page_tbl(); - public byte State() {return state;} private byte state = State_init; public static final byte State_init = 0, State_make = 1, State_load = 2; + public byte Search_version() {return load_mgr.Search_version();} public void Search_version_refresh() {load_mgr.Search_version_refresh();} public DateAdp Dump_date_query() { - DateAdp rv = wiki.Props().Modified_latest(); - if (rv != null) return rv; - Io_url url = core_data_mgr.Get_url(Xowd_db_file_.Tid_core); + DateAdp rv = wiki.Props().Modified_latest(); if (rv != null) return rv; + Io_url url = core_data_mgr.Db__core().Url(); return Io_mgr._.QueryFil(url).ModifiedTime(); } - public void Init_by_ns_map(String ns_map) { - Xoi_dump_mgr dump_mgr = wiki.Appe().Setup_mgr().Dump_mgr(); - data_storage_format = dump_mgr.Data_storage_format(); - core_data_mgr.Init_by_ns_map(wiki.Ns_mgr(), ns_map, dump_mgr.Db_text_max()); - Core_conn_(core_data_mgr.Conn_core()); - state = State_make; - } - public void Init_load(Db_url core_db_url) { - Db_conn core_conn = Db_conn_pool.I.Get_or_new(core_db_url); - Core_conn_(core_conn); - Xowd_db_file[] files = core_data_mgr.Tbl__db().Select_all(wiki.Fsys_mgr().Root_dir()); - core_data_mgr.Init_by_files(core_conn, files); - state = State_load; - } - private void Core_conn_(Db_conn conn) { - boolean created = Bool_.N; boolean schema_is_1 = core_data_mgr.Cfg__schema_is_1(); int db_id = core_data_mgr.Cfg__db_id(); // schema_is_1 always has pre-created xowa_db tbl - tbl_cfg.Conn_(conn); - tbl_ns.Conn_(conn, created, schema_is_1, db_id); - tbl_page.Conn_(conn); - tbl_site_stats.Conn_(conn); - core_data_mgr.Core_conn_(conn, created, schema_is_1, db_id, Bool_.N); - } - public void Page_create(Db_stmt page_stmt, Db_stmt text_stmt, int page_id, int ns_id, byte[] ttl_wo_ns, boolean redirect, DateAdp modified_on, byte[] text, int random_int, int file_idx) { - int text_len = text.length; - int html_db_id = (html_db_enabled) ? -1 : -1; //hdump_mgr.Html_db_id_default(text_len); - tbl_page.Insert(page_stmt, page_id, ns_id, ttl_wo_ns, redirect, modified_on, text_len, random_int, file_idx, html_db_id); - tbl_text.Insert(text_stmt, page_id, text, data_storage_format); - } - public boolean Ctg_select_v1(Xoctg_view_ctg view_ctg, Db_conn ctg_provider, Xodb_category_itm ctg) { - Db_qry__select_cmd qry = Db_qry_.select_().Cols_(Xodb_categorylinks_tbl.Fld_cl_from) - .From_(Xodb_categorylinks_tbl.Tbl_name) - .Where_(Db_crt_.eq_(Xodb_categorylinks_tbl.Fld_cl_to_id, ctg.Id())) - ; - ListAdp rslts = ListAdp_.new_(); - DataRdr rdr = DataRdr_.Null; - try { - rdr = ctg_provider.Exec_qry_as_rdr(qry); - while (rdr.MoveNextPeer()) { - int page_id = rdr.ReadInt(Xodb_categorylinks_tbl.Fld_cl_from); - Xodb_page itm = new Xodb_page().Id_(page_id); - rslts.Add(itm); - } - } finally {rdr.Rls();} - int rslts_len = rslts.Count(); - rslts.SortBy(Xodb_page_sorter.IdAsc); - tbl_page.Select_by_id_list(Cancelable_.Never, false, rslts, 0, rslts_len); - rslts.SortBy(Xodb_page_sorter.Ns_id_TtlAsc); - boolean rv = false; - for (int i = 0; i < rslts.Count(); i++) { - Xodb_page page = (Xodb_page)rslts.FetchAt(i); - if (page.Ns_id() == Int_.MinValue) continue; // HACK: page not found; ignore - byte ctg_tid = Xodb_load_mgr_txt.Load_ctg_v1_tid(page.Ns_id()); - Xoctg_view_grp ctg_grp = view_ctg.Grp_by_tid(ctg_tid); - Xoctg_view_itm ctg_itm = new Xoctg_view_itm(); - ctg_itm.Load_by_ttl_data(ctg_tid, page.Id(), 0, page.Wtxt_len()); - ctg_itm.Ttl_(Xoa_ttl.parse_(wiki, page.Ns_id(), page.Ttl_page_db())); - ctg_itm.Sortkey_(page.Ttl_page_db()); - ctg_grp.Itms_add(ctg_itm); - rv = true; - } - for (byte i = 0; i < Xoa_ctg_mgr.Tid__max; i++) { - Xoctg_view_grp ctg_grp = view_ctg.Grp_by_tid(i); - ctg_grp.Itms_make(); - ctg_grp.Total_(ctg_grp.Itms().length); - } - return rv; - } - public void Rls() { - core_data_mgr.Rls(); + public void Category_version_update(boolean version_is_1) { + String grp = Xow_cfg_consts.Grp_wiki_init; + String key = Xoa_gfs_mgr.Build_code(Xowe_wiki.Invk_db_mgr, Xodb_mgr_sql.Invk_category_version); + core_data_mgr.Tbl__cfg().Delete_val(grp, key);// always delete ctg version + category_version = version_is_1 ? Xoa_ctg_mgr.Version_1 : Xoa_ctg_mgr.Version_2; + core_data_mgr.Tbl__cfg().Insert_byte(grp, key, category_version); } public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_data_storage_format)) return Xoi_dump_mgr.Wtr_tid_to_str(data_storage_format); - else if (ctx.Match(k, Invk_data_storage_format_)) data_storage_format = Xoi_dump_mgr.Wtr_tid_parse(m.ReadStr("v")); + if (ctx.Match(k, Invk_data_storage_format)) return Io_stream_.Obsolete_to_str(core_data_mgr.Props().Zip_tid_text()); + else if (ctx.Match(k, Invk_data_storage_format_)) {} // SERIALIZED:000.sqlite3|xowa_cfg; ignore; read from Xow_db_props else if (ctx.Match(k, Invk_category_version)) return category_version; else if (ctx.Match(k, Invk_category_version_)) category_version = m.ReadByte("v"); else if (ctx.Match(k, Invk_search_version)) return this.Search_version(); @@ -144,58 +55,9 @@ public class Xodb_mgr_sql implements Xodb_mgr, GfoInvkAble { return this; } public static final String - Invk_data_storage_format = "data_storage_format", Invk_data_storage_format_ = "data_storage_format_" - , Invk_category_version = "category_version", Invk_category_version_ = "category_version_" + Invk_data_storage_format = "data_storage_format", Invk_data_storage_format_ = "data_storage_format_" // SERIALIZED:000.sqlite3|xowa_cfg + , Invk_category_version = "category_version", Invk_category_version_ = "category_version_" // SERIALIZED:000.sqlite3|xowa_cfg , Invk_search_version = "search_version" , Invk_tid_name = "tid_name" ; - public void Category_version_update(boolean version_is_1) { - String grp = Xodb_mgr_sql.Grp_wiki_init; - String key = Xoa_gfs_mgr.Build_code(Xowe_wiki.Invk_db_mgr, Xodb_mgr_sql.Invk_category_version); -// if (category_version != Xoa_ctg_mgr.Version_null) - tbl_cfg.Delete(grp, key);// always delete ctg version - category_version = version_is_1 ? Xoa_ctg_mgr.Version_1 : Xoa_ctg_mgr.Version_2; - tbl_cfg.Insert_str(grp, key, Byte_.Xto_str(category_version)); - } - public void Delete_by_tid(byte tid) { - int len = core_data_mgr.Dbs__len(); - for (int i = 0; i < len; i++) { - Xowd_db_file file = core_data_mgr.Dbs__get_at(i) ; - if (file.Tid() != tid) continue; - file.Rls(); - Sqlite_url sqlite = (Sqlite_url)file.Connect(); - Io_mgr._.DeleteFil_args(sqlite.Url()).MissingFails_off().Exec(); - file.Cmd_mode_(Db_cmd_mode.Tid_delete); - } - core_data_mgr.Dbs__save(); - this.Init_load(core_data_mgr.Conn_core().Url()); - } - - public static final String Grp_wiki_init = "wiki.init"; - public static final int Page_id_null = -1; - public static Io_url Find_core_url(Xowe_wiki wiki) { - Io_url[] ary = Io_mgr._.QueryDir_args(wiki.Fsys_mgr().Root_dir()).FilPath_("*.sqlite3").ExecAsUrlAry(); - int ary_len = ary.length; if (ary_len == 0) return null; - if (ary_len == 1) return ary[0]; // only 1 file; assume it is core - String v0_str = wiki.Domain_str() + ".000"; - String v1_str = wiki.Domain_str() + "core.000"; - for (int i = 0; i < ary_len; i++) { - Io_url itm = ary[i]; - if (String_.Eq(itm.NameOnly(), v0_str)) return itm; // EX: "en.wikipedia.org.000" - else if (String_.Eq(itm.NameOnly(), v1_str)) return itm; // EX: "en.wikipedia.org.core.000" - } - return null; - } - public static Xodb_mgr_sql Get_or_load(Xowe_wiki wiki) { - Xodb_mgr db_mgr = wiki.Db_mgr(); - Xodb_mgr_sql rv = db_mgr.Tid() == Xodb_mgr_txt.Tid_txt ? wiki.Db_mgr_create_as_sql() : wiki.Db_mgr_as_sql(); - byte state = rv.State(); - switch (state) { - case Xodb_mgr_sql.State_init: rv.Init_load(Db_url_.sqlite_(Xodb_mgr_sql.Find_core_url(wiki))); break; // load - case Xodb_mgr_sql.State_make: break; // noop; being made; don't load from db; - case Xodb_mgr_sql.State_load: break; // noop; already loaded; - default: throw Err_.unhandled(state); - } - return rv; - } } diff --git a/400_xowa/src/gplx/xowa/dbs/Xodb_mgr_txt.java b/400_xowa/src/gplx/xowa/dbs/Xodb_mgr_txt.java index 1ac8145a0..f025cc776 100644 --- a/400_xowa/src/gplx/xowa/dbs/Xodb_mgr_txt.java +++ b/400_xowa/src/gplx/xowa/dbs/Xodb_mgr_txt.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.dbs; import gplx.*; import gplx.xowa.*; -import gplx.dbs.*; import gplx.xowa.ctgs.*; import gplx.xowa.html.hdumps.*; import gplx.xowa.tdbs.*; +import gplx.ios.*; import gplx.dbs.*; import gplx.xowa.wikis.data.*; import gplx.xowa.ctgs.*; import gplx.xowa.html.hdumps.*; import gplx.xowa.tdbs.*; public class Xodb_mgr_txt implements Xodb_mgr { public Xodb_mgr_txt(Xowe_wiki wiki, Xow_data_mgr data_mgr) { this.wiki = wiki; @@ -25,10 +25,9 @@ public class Xodb_mgr_txt implements Xodb_mgr { } private Xowe_wiki wiki; public byte Tid() {return Tid_txt;} public static final byte Tid_txt = 0; public String Tid_name() {return "xdat";} - public byte Data_storage_format() {return data_storage_format;} public void Data_storage_format_(byte v) {data_storage_format = v;} private byte data_storage_format = gplx.ios.Io_stream_.Tid_file; + public byte Data_storage_format() {return data_storage_format;} public void Data_storage_format_(byte v) {data_storage_format = v;} private byte data_storage_format = gplx.ios.Io_stream_.Tid_raw; public Xodb_load_mgr Load_mgr() {return load_mgr;} private Xodb_load_mgr_txt load_mgr; public Xodb_save_mgr Save_mgr() {return save_mgr;} private Xodb_save_mgr_txt save_mgr; - public Xodb_ctx Db_ctx() {return db_ctx;} private Xodb_ctx db_ctx = new Xodb_ctx(); public DateAdp Dump_date_query() { Io_url url = wiki.Tdb_fsys_mgr().Url_ns_fil(Xotdb_dir_info_.Tid_page, Xow_ns_.Id_main, 0); return Io_mgr._.QueryFil(url).ModifiedTime(); @@ -44,10 +43,9 @@ public class Xodb_mgr_txt implements Xodb_mgr { } byte category_version = Xoa_ctg_mgr.Version_null; public byte Search_version() {return gplx.xowa.specials.search.Xosrh_core.Version_2;} public void Search_version_refresh() {throw Err_.not_implemented_();} - public void Rls() {} public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_data_storage_format)) return Xoi_dump_mgr.Wtr_tid_to_str(data_storage_format); - else if (ctx.Match(k, Invk_data_storage_format_)) data_storage_format = Xoi_dump_mgr.Wtr_tid_parse(m.ReadStr("v")); + if (ctx.Match(k, Invk_data_storage_format)) return Io_stream_.Obsolete_to_str(data_storage_format); + else if (ctx.Match(k, Invk_data_storage_format_)) data_storage_format = Io_stream_.Obsolete_to_tid(m.ReadStr("v")); else if (ctx.Match(k, Invk_category_version)) return this.Category_version(); else if (ctx.Match(k, Invk_category_version_)) category_version = m.ReadByte("v"); else if (ctx.Match(k, Invk_search_version)) return this.Search_version(); diff --git a/400_xowa/src/gplx/xowa/dbs/Xodb_save_mgr_sql.java b/400_xowa/src/gplx/xowa/dbs/Xodb_save_mgr_sql.java index 63a80bec3..281648a07 100644 --- a/400_xowa/src/gplx/xowa/dbs/Xodb_save_mgr_sql.java +++ b/400_xowa/src/gplx/xowa/dbs/Xodb_save_mgr_sql.java @@ -16,87 +16,61 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.dbs; import gplx.*; import gplx.xowa.*; -import gplx.ios.*; import gplx.dbs.*; import gplx.xowa.wikis.data.*; +import gplx.ios.*; import gplx.dbs.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; +import gplx.xowa.wikis.*; public class Xodb_save_mgr_sql implements Xodb_save_mgr { - public Xodb_save_mgr_sql(Xodb_mgr_sql db_mgr) { - this.db_mgr = db_mgr; zip_mgr = db_mgr.Wiki().Appe().Zip_mgr(); - } private Xodb_mgr_sql db_mgr; private Io_stream_zip_mgr zip_mgr; + private final Xow_page_mgr page_mgr; + private final Xodb_mgr_sql db_mgr; + public Xodb_save_mgr_sql(Xodb_mgr_sql db_mgr, Xow_page_mgr page_mgr) {this.db_mgr = db_mgr; this.page_mgr = page_mgr;} public boolean Create_enabled() {return create_enabled;} public void Create_enabled_(boolean v) {create_enabled = v;} private boolean create_enabled; public boolean Update_modified_on_enabled() {return update_modified_on_enabled;} public void Update_modified_on_enabled_(boolean v) {update_modified_on_enabled = v;} private boolean update_modified_on_enabled; public int Page_id_next() {return page_id_next;} public void Page_id_next_(int v) {page_id_next = v;} private int page_id_next; - public void Data_create(Xoa_ttl ttl, byte[] text) { + public void Data_create(Xoa_ttl ttl, byte[] text_raw) { int ns_id = ttl.Ns().Id(); - int ns_count = db_mgr.Tbl_xowa_ns().Select_ns_count(ns_id) + 1; - String page_id = db_mgr.Tbl_xowa_cfg().Select_val_or("db", "page.id_nxt", null); - int page_id_int = -1; - if (page_id == null) { - DataRdr rdr = db_mgr.Tbl_page().Conn().Exec_sql_as_rdr("SELECT (Max(page_id) + 1) AS max_page_id FROM page;"); - if (rdr.MoveNextPeer()) { - page_id = Int_.Xto_str(rdr.ReadInt("max_page_id")); - page_id_int = Int_.parse_(page_id); - db_mgr.Tbl_xowa_cfg().Insert_int("db", "page.id_next", page_id_int); - } - rdr.Rls(); + Xowd_db_file db_file = db_mgr.Core_data_mgr().Db__core(); + int ns_count = db_file.Tbl__ns().Select_ns_count(ns_id) + 1; + int page_id = db_file.Tbl__cfg().Select_int_or("db", "page.id_nxt", -1); + if (page_id == -1) { // HACK: was dbs.qrys.Db_qry_sql.rdr_("SELECT (Max(page_id) + 1) AS max_page_id FROM page;") + Db_rdr rdr = db_mgr.Core_data_mgr().Tbl__page().Conn().Stmt_select(db_file.Tbl__page().Tbl_name(), String_.Ary(db_file.Tbl__page().Fld_page_id()), Db_meta_fld.Ary_empy).Exec_select__rls_auto(); + try { + int max_page_id = -1; + while (rdr.Move_next()) { + int cur_page_id = rdr.Read_int("page_id"); + if (cur_page_id > max_page_id) max_page_id = cur_page_id; + } + page_id = max_page_id + 1; + db_mgr.Core_data_mgr().Tbl__cfg().Insert_int("db", "page.id_next", page_id + 1); + } finally {rdr.Rls();} } - else - page_id_int = Int_.parse_(page_id); - Xowe_core_data_mgr fsys_mgr = db_mgr.Core_data_mgr(); - int file_idx = fsys_mgr.Tid_text_idx(); - boolean redirect = db_mgr.Wiki().Redirect_mgr().Is_redirect(text, text.length); - Db_stmt page_stmt = db_mgr.Tbl_page().Insert_stmt(fsys_mgr.Conn_page()); - Db_conn text_provider = db_mgr.Core_data_mgr().Dbs__get_at(file_idx).Conn(); - Db_stmt text_stmt = db_mgr.Tbl_text().Insert_stmt(text_provider); - text = zip_mgr.Zip(db_mgr.Data_storage_format(), text); + Xowd_db_mgr fsys_mgr = db_mgr.Core_data_mgr(); + Xowd_db_file page_text_db = fsys_mgr.Db__text(); + Xowd_text_tbl page_text_tbl = page_text_db.Tbl__text(); + byte[] text_zip = page_text_tbl.Zip(text_raw); + boolean redirect = db_mgr.Wiki().Redirect_mgr().Is_redirect(text_raw, text_raw.length); + Xowd_page_tbl page_core_tbl = db_mgr.Core_data_mgr().Tbl__page(); + page_core_tbl.Insert_bgn(); + page_text_tbl.Insert_bgn(); try { - db_mgr.Page_create(page_stmt, text_stmt, page_id_int, ns_id, text, redirect, DateAdp_.Now(), text, ns_count, file_idx); - db_mgr.Tbl_xowa_ns().Update_ns_count(ns_id, ns_count); - db_mgr.Tbl_xowa_cfg().Update("db", "page.id_next", page_id + 1); + page_mgr.Create(page_core_tbl, page_text_tbl, page_id, ns_id, text_raw, redirect, DateAdp_.Now(), text_zip, text_raw.length, ns_count, page_text_db.Id(), -1); + db_file.Tbl__ns().Update_ns_count(ns_id, ns_count); + db_file.Tbl__cfg().Update_int("db", "page.id_next", page_id + 1); } finally { - page_stmt.Rls(); - text_stmt.Rls(); + page_core_tbl.Insert_end(); + page_text_tbl.Insert_end(); } } - public void Data_update(Xoae_page page, byte[] text) { - boolean redirect = db_mgr.Wiki().Redirect_mgr().Is_redirect(text, text.length); + public void Data_update(Xoae_page page, byte[] text_raw) { + boolean redirect = db_mgr.Wiki().Redirect_mgr().Is_redirect(text_raw, text_raw.length); DateAdp modified = update_modified_on_enabled ? DateAdp_.Now() : page.Revision_data().Modified_on(); - boolean redirect_changed = redirect != db_mgr.Wiki().Redirect_mgr().Is_redirect(page.Data_raw(), page.Data_raw().length); - boolean modified_changed = !modified.Eq(page.Revision_data().Modified_on()); - int kv_len = 0; - if (redirect_changed) ++kv_len; - if (modified_changed) ++kv_len; - Db_qry qry = null; - if (kv_len > 0) { - KeyVal[] kv_ary = new KeyVal[kv_len]; - int kv_idx = 0; - if (redirect_changed) kv_ary[kv_idx++] = KeyVal_.new_("page_is_redirect", redirect_changed); - if (modified_changed) kv_ary[kv_idx++] = KeyVal_.new_("page_touched", Xto_touched_str(modified)); - qry = Db_qry_.update_common_("page", Db_crt_.eq_("page_id", page.Revision_data().Id()), kv_ary); - Db_conn conn = db_mgr.Core_data_mgr().Conn_core(); - conn.Txn_mgr().Txn_bgn_if_none(); - conn.Exec_qry(qry); - conn.Txn_mgr().Txn_end_all(); - } - Xodb_page db_page = new Xodb_page(); + db_mgr.Core_data_mgr().Tbl__page().Update__redirect__modified(page.Revision_data().Id(), redirect, modified); + Xowd_page_itm db_page = new Xowd_page_itm(); db_mgr.Load_mgr().Load_by_id(db_page, page.Revision_data().Id()); - text = zip_mgr.Zip(db_mgr.Data_storage_format(), text); - db_mgr.Tbl_text().Update(db_page.Wtxt_db_id(), page.Revision_data().Id(), text); + Xowd_text_tbl text_tbl = db_mgr.Core_data_mgr().Dbs__get_at(db_page.Text_db_id()).Tbl__text(); + text_tbl.Update(page.Revision_data().Id(), text_raw); } public void Data_rename(Xoae_page page, int trg_ns, byte[] trg_ttl) { - Db_qry qry = Db_qry_.update_common_("page", Db_crt_.eq_("page_id", page.Revision_data().Id()) - , KeyVal_.new_("page_namespace", trg_ns) - , KeyVal_.new_("page_title", String_.new_utf8_(trg_ttl)) - ); - try { - db_mgr.Core_data_mgr().Conn_core().Exec_qry(qry); - } catch (Exception exc) { - if (String_.Has(Err_.Message_gplx_brief(exc), "columns page_namespace, page_random_int are not unique")) { // HACK: terrible hack, but moving pages across ns will break UNIQUE index - db_mgr.Core_data_mgr().Conn_core().Exec_sql("DROP INDEX page__name_random;"); // is UNIQUE by default - db_mgr.Core_data_mgr().Conn_core().Exec_sql("CREATE INDEX page__name_random ON page (page_namespace, page_random_int);"); - db_mgr.Core_data_mgr().Conn_core().Exec_qry(qry); - } - } + db_mgr.Core_data_mgr().Tbl__page().Update__ns__ttl(page.Revision_data().Id(), trg_ns, trg_ttl); } public void Clear() {} - private static String Xto_touched_str(DateAdp v) {return v.XtoStr_fmt("yyyyMMddHHmmss");} } diff --git a/400_xowa/src/gplx/xowa/dbs/Xodb_save_mgr_txt.java b/400_xowa/src/gplx/xowa/dbs/Xodb_save_mgr_txt.java index d2064ccb8..c194437ad 100644 --- a/400_xowa/src/gplx/xowa/dbs/Xodb_save_mgr_txt.java +++ b/400_xowa/src/gplx/xowa/dbs/Xodb_save_mgr_txt.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.dbs; import gplx.*; import gplx.xowa.*; -import gplx.xowa.wikis.*; import gplx.xowa.tdbs.*; +import gplx.xowa.wikis.*; import gplx.xowa.tdbs.*; import gplx.xowa.wikis.data.tbls.*; public class Xodb_save_mgr_txt implements Xodb_save_mgr { public Xodb_save_mgr_txt(Xowe_wiki wiki, Xodb_load_mgr_txt load_mgr) { this.wiki = wiki; @@ -30,7 +30,7 @@ public class Xodb_save_mgr_txt implements Xodb_save_mgr { public void Clear() {page_id_next = 0;} // TEST: needed for ctg_test public void Data_create(Xoa_ttl ttl, byte[] text) { Xow_ns ns_itm = ttl.Ns(); byte[] ttl_bry = ttl.Page_db(); - Xodb_page db_page = Xodb_page.new_tmp(); + Xowd_page_itm db_page = Xowd_page_itm.new_tmp(); boolean found = load_mgr.Load_by_ttl(db_page, ns_itm, ttl_bry); if (found) throw Err_mgr._.fmt_(GRP_KEY, "title_exists", "create requested but title already exists: ~{0}", String_.new_utf8_(ttl_bry)); int text_len = text.length; @@ -38,7 +38,7 @@ public class Xodb_save_mgr_txt implements Xodb_save_mgr { int page_id = page_id_next++; int fil_idx = 0; int ns_id = ttl.Ns().Id(); - Xodb_page_.Txt_page_save(tmp, page_id, DateAdp_.Now(), ttl_bry, text, true); + Xotdb_page_itm_.Txt_page_save(tmp, page_id, DateAdp_.Now(), ttl_bry, text, true); Io_url page_rdr_url = fsys_mgr.Url_ns_fil(Xotdb_dir_info_.Tid_page, ns_id, fil_idx); byte[] page_rdr_bry = gplx.ios.Io_stream_rdr_.Load_all(page_rdr_url); Xob_xdat_file page_rdr = new Xob_xdat_file(); @@ -51,8 +51,8 @@ public class Xodb_save_mgr_txt implements Xodb_save_mgr { Xoa_ttl redirect_ttl = redirect_mgr.Extract_redirect(text, text_len); db_page.Init(page_id, ttl.Page_db(), redirect_ttl != null, text_len, fil_idx, row_idx); - Xodb_page_.Txt_ttl_save(tmp, db_page); - byte[] ttl_row_bry = tmp.Mkr_rls().Xto_bry_and_clear(); + Xotdb_page_itm_.Txt_ttl_save(tmp, db_page); + byte[] ttl_row_bry = tmp.To_bry_and_rls(); Xowd_hive_mgr ttl_hive = new Xowd_hive_mgr(wiki, Xotdb_dir_info_.Tid_ttl); ttl_hive.Create(ttl.Ns(), ttl.Page_db(), ttl_row_bry, Bry_comparer_fld_last._); wiki.Db_mgr().Load_mgr().Clear(); // NOTE: need to clear cached regy_ary in load_mgr @@ -68,7 +68,7 @@ public class Xodb_save_mgr_txt implements Xodb_save_mgr { private void Data_update_under(Xoae_page page, byte[] text, byte[] new_ttl) { Xoa_ttl ttl = page.Ttl(); Xow_ns ns = ttl.Ns(); byte[] ttl_bry = ttl.Page_db(); - Xodb_page db_page = Xodb_page.new_tmp(); + Xowd_page_itm db_page = Xowd_page_itm.new_tmp(); if (!load_mgr.Load_by_ttl(db_page, ns, ttl_bry)) throw Err_mgr._.fmt_(GRP_KEY, "title_missing", "update requested but title does not exist: ~{0}", String_.new_utf8_(ttl_bry)); byte[] old_ttl = ttl_bry; if (new_ttl != null) { @@ -77,35 +77,35 @@ public class Xodb_save_mgr_txt implements Xodb_save_mgr { } // update page Xob_xdat_file page_rdr = new Xob_xdat_file(); Xob_xdat_itm page_itm = new Xob_xdat_itm(); - load_mgr.Load_page(tmp_page, db_page.Wtxt_db_id(), db_page.Tdb_row_idx(), ns, true, page_rdr, page_itm); + load_mgr.Load_page(tmp_page, db_page.Text_db_id(), db_page.Tdb_row_idx(), ns, true, page_rdr, page_itm); Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_b512(); - if (text == null) text = tmp_page.Wtxt(); + if (text == null) text = tmp_page.Text(); int text_len = text.length; DateAdp modified_on = tmp_page.Modified_on(); if (update_modified_on_enabled) { modified_on = DateAdp_.Now(); page.Revision_data().Modified_on_(modified_on); } - Xodb_page_.Txt_page_save(tmp_bfr, db_page.Id(), modified_on, ttl_bry, text, true); + Xotdb_page_itm_.Txt_page_save(tmp_bfr, db_page.Id(), modified_on, ttl_bry, text, true); page_rdr.Update(tmp_bfr, page_itm, tmp_bfr.Xto_bry_and_clear()); - Io_url page_rdr_url = fsys_mgr.Url_ns_fil(Xotdb_dir_info_.Tid_page, ttl.Ns().Id(), db_page.Wtxt_db_id()); + Io_url page_rdr_url = fsys_mgr.Url_ns_fil(Xotdb_dir_info_.Tid_page, ttl.Ns().Id(), db_page.Text_db_id()); this.Data_save(Xotdb_dir_info_.Tid_page, page_rdr, page_rdr_url, tmp_bfr); tmp_bfr.Mkr_rls(); // update ttl Xoa_ttl redirect_ttl = redirect_mgr.Extract_redirect(text, text_len); - db_page.Wtxt_len_(text_len); + db_page.Text_len_(text_len); db_page.Redirected_(redirect_ttl != null); Bry_bfr tmp = wiki.Utl__bfr_mkr().Get_b512(); - Xodb_page_.Txt_ttl_save(tmp, db_page); + Xotdb_page_itm_.Txt_ttl_save(tmp, db_page); byte[] ttl_row_bry = tmp.Xto_bry_and_clear(); tmp.Mkr_rls(); Xowd_hive_mgr ttl_hive = new Xowd_hive_mgr(wiki, Xotdb_dir_info_.Tid_ttl); - ttl_hive.Update(ns, old_ttl, new_ttl, ttl_row_bry, Xodb_page_.Txt_ttl_pos, Byte_ascii.Pipe, true, true); + ttl_hive.Update(ns, old_ttl, new_ttl, ttl_row_bry, Xotdb_page_itm_.Txt_ttl_pos, Byte_ascii.Pipe, true, true); } private void Data_save(byte dir_tid, Xob_xdat_file xdat_file, Io_url url, Bry_bfr tmp_bfr) { xdat_file.Save(url); } - private Xodb_page tmp_page = new Xodb_page(); + private Xowd_page_itm tmp_page = new Xowd_page_itm(); public static final int File_idx_unknown = -1; private static final String GRP_KEY = "xowa.wiki.db.save"; } diff --git a/400_xowa/src/gplx/xowa/dbs/Xodb_upgrade_mgr.java b/400_xowa/src/gplx/xowa/dbs/Xodb_upgrade_mgr.java index f27810571..83f0aaba2 100644 --- a/400_xowa/src/gplx/xowa/dbs/Xodb_upgrade_mgr.java +++ b/400_xowa/src/gplx/xowa/dbs/Xodb_upgrade_mgr.java @@ -16,9 +16,9 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.dbs; import gplx.*; import gplx.xowa.*; -import gplx.dbs.*; import gplx.xowa.dbs.tbls.*; +import gplx.dbs.*; import gplx.dbs.cfgs.*; import gplx.xowa.wikis.data.tbls.*; class Xodb_upgrade_mgr { - public static void Upgrade(Xodb_mgr_sql db_mgr, KeyVal[] kv_ary, String version_key, String version_val) { + public static void Upgrade(Xodb_mgr_sql db_mgr, Db_cfg_hash cfg_hash, String version_key, String version_val) { // String version_new = null; // if (String_.Eq(version_val, "0.6.2.0")) { // Xodb_upgrade_mgr_v0_6_2_0.Upgrade(db_mgr, kv_ary); diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_category_tbl.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_category_tbl.java deleted file mode 100644 index d902c8130..000000000 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_category_tbl.java +++ /dev/null @@ -1,76 +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 . -*/ -package gplx.xowa.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*; -import gplx.dbs.*; -public class Xodb_category_tbl { - public Db_stmt Update_stmt(Db_conn p) {return Db_stmt_.new_update_(p, Tbl_name, String_.Ary(Fld_cat_id), Fld_cat_hidden);} - public void Update(Db_stmt stmt, int cat_id, byte cat_hidden) { - stmt.Clear() - .Val_byte(cat_hidden) - .Val_int(cat_id) - .Exec_update() - ; - } - public Db_stmt Insert_stmt(Db_conn p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_cat_id, Fld_cat_pages, Fld_cat_subcats, Fld_cat_files, Fld_cat_hidden, Fld_cat_file_idx);} - public void Insert(Db_stmt stmt, int cat_id, int cat_pages, int cat_subcats, int cat_files, byte cat_hidden, int cat_file_idx) { - stmt.Clear() - .Val_int(cat_id) - .Val_int(cat_pages) - .Val_int(cat_subcats) - .Val_int(cat_files) - .Val_byte(cat_hidden) - .Val_int(cat_file_idx) - .Exec_insert() - ; - } - public Xodb_category_itm Select(Db_conn p, int cat_page_id) { - Db_stmt stmt = Db_stmt_.Null; - DataRdr rdr = DataRdr_.Null; - try { - stmt = Db_stmt_.new_select_(p, Tbl_name, String_.Ary(Fld_cat_id)); - rdr = stmt.Val_int(cat_page_id).Exec_select(); - if (rdr.MoveNextPeer()) { - return Xodb_category_itm.load_ - ( cat_page_id - , rdr.ReadInt(Fld_cat_file_idx) - , rdr.ReadByte(Fld_cat_hidden) == Bool_.Y_byte - , rdr.ReadInt(Fld_cat_subcats) - , rdr.ReadInt(Fld_cat_files) - , rdr.ReadInt(Fld_cat_pages) - ); - } - } finally {stmt.Rls(); rdr.Rls();} - return Xodb_category_itm.Null; - } - public void Select_by_cat_id_in(Cancelable cancelable, OrderedHash rv, Db_conn p, Xodb_ctx db_ctx, int bgn, int end) { - Xodb_in_wkr_category_id wkr = new Xodb_in_wkr_category_id(); - wkr.Init(rv); - wkr.Select_in(p, cancelable, db_ctx, bgn, end); - } - public static Xodb_category_itm Read_ctg(DataRdr rdr) { - return Xodb_category_itm.load_ - ( rdr.ReadInt(Xodb_category_tbl.Fld_cat_id) - , rdr.ReadInt(Xodb_category_tbl.Fld_cat_file_idx) - , rdr.ReadByte(Xodb_category_tbl.Fld_cat_hidden) == Bool_.Y_byte - , rdr.ReadInt(Xodb_category_tbl.Fld_cat_subcats) - , rdr.ReadInt(Xodb_category_tbl.Fld_cat_files) - , rdr.ReadInt(Xodb_category_tbl.Fld_cat_pages) - ); - } - public static final String Tbl_name = "category", Fld_cat_id = "cat_id", Fld_cat_pages = "cat_pages", Fld_cat_subcats = "cat_subcats", Fld_cat_files = "cat_files", Fld_cat_hidden = "cat_hidden", Fld_cat_file_idx = "cat_file_idx"; -} diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_categorylinks_tbl.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_categorylinks_tbl.java deleted file mode 100644 index 55b91e3b3..000000000 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_categorylinks_tbl.java +++ /dev/null @@ -1,68 +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 . -*/ -package gplx.xowa.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*; -import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.xowa.ctgs.*; -public class Xodb_categorylinks_tbl { - public void Delete_all(Db_conn p) {p.Exec_qry(Db_qry_.delete_tbl_(Tbl_name));} - public Db_stmt Insert_stmt(Db_conn p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_cl_from, Fld_cl_to_id, Fld_cl_sortkey, Fld_cl_timestamp, Fld_cl_type_id);} - public void Insert(Db_stmt stmt, int page_id, int ctg_page_id, byte[] sortkey, int timestamp, byte ctg_tid) { - stmt.Clear() - .Val_int(page_id) - .Val_int(ctg_page_id) - .Val_str(String_.new_utf8_(sortkey)) - .Val_int(timestamp) - .Val_byte(ctg_tid) - .Exec_insert() - ; - } - Xoctg_idx_mgr Grp_by_tid(Xoctg_data_ctg ctg, byte tid) { - Xoctg_idx_mgr ctg_grp = ctg.Grp_by_tid(tid); - if (ctg_grp == null) { - ctg_grp = new Xoctg_idx_mgr(); - ctg.Grp_mgrs()[tid] = ctg_grp; - } - return ctg_grp; - } - public int Select_by_type(Db_conn p, ListAdp list, int cat_page_id, byte arg_tid, byte[] arg_sortkey, boolean arg_is_from, int limit) { - String arg_sortkey_str = arg_sortkey == null ? "" : String_.new_utf8_(arg_sortkey); - gplx.core.criterias.Criteria comp_crt = !arg_is_from - ? Db_crt_.mte_(Fld_cl_sortkey, arg_sortkey_str) // from: sortkey >= 'val' - : Db_crt_.lte_(Fld_cl_sortkey, arg_sortkey_str); // until: sortkey <= 'val' - Db_qry__select_cmd qry = Db_qry_.select_().Cols_(Fld_cl_from, Fld_cl_sortkey).From_(Tbl_name) - .Where_(gplx.core.criterias.Criteria_.And_many(Db_crt_.eq_(Fld_cl_to_id, -1), Db_crt_.eq_(Fld_cl_type_id, arg_tid), comp_crt)) - .OrderBy_(Fld_cl_sortkey, !arg_is_from) - .Limit_(limit + 1); // + 1 to get last_plus_one for next page / previous page - Db_stmt stmt = Db_stmt_.Null; - DataRdr rdr = DataRdr_.Null; - int count = 0; - try { - stmt = p.Stmt_new(qry); - rdr = stmt.Val_int(cat_page_id).Val_byte(arg_tid).Val_str(arg_sortkey_str).Exec_select(); - while (rdr.MoveNextPeer()) { - int itm_page_id = rdr.ReadInt(Fld_cl_from); - byte[] itm_sortkey = rdr.ReadBryByStr(Fld_cl_sortkey); - Xodb_page itm = new Xodb_page().Id_(itm_page_id).Xtn_(new Xoctg_page_xtn(arg_tid, itm_sortkey)); - list.Add(itm); - ++count; - } - } finally {rdr.Rls(); stmt.Rls();} - list.SortBy(Xodb_page_sorter.Ctg_tid_sortkey_asc); - return count; - } - public static final String Tbl_name = "categorylinks", Fld_cl_from = "cl_from", Fld_cl_to = "cl_to", Fld_cl_to_id = "cl_to_id", Fld_cl_sortkey = "cl_sortkey", Fld_cl_timestamp = "cl_timestamp", Fld_cl_type_id = "cl_type_id"; -} diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_in_wkr_base.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_in_wkr_base.java deleted file mode 100644 index f3c935367..000000000 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_in_wkr_base.java +++ /dev/null @@ -1,47 +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 . -*/ -package gplx.xowa.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*; -import gplx.dbs.*; -public abstract class Xodb_in_wkr_base { - public abstract int Interval(); - public abstract void Fill_stmt(Db_stmt stmt, int bgn, int end); - public abstract Db_qry Build_qry(Xodb_ctx tbl_ctx, int bgn, int end); - public abstract void Eval_rslts(Cancelable cancelable, Xodb_ctx db_ctx, DataRdr rdr); - public void Select_in(Db_conn conn, Cancelable cancelable, Xodb_ctx db_ctx, int full_bgn, int full_end) { - DataRdr rdr = DataRdr_.Null; - Db_stmt stmt = Db_stmt_.Null; - int interval = Interval(); - for (int i = full_bgn; i < full_end; i += interval) { - int part_end = i + interval; - if (part_end > full_end) part_end = full_end; - try { - stmt = conn.Stmt_new(Build_qry(db_ctx, i, part_end)); - Fill_stmt(stmt, i, part_end); - rdr = stmt.Exec_select(); - Eval_rslts(cancelable, db_ctx, rdr); - } - finally {rdr.Rls(); stmt.Rls();} - } - } - public static Object[] In_ary(int len) { - Object[] rv = new Object[len]; - for (int i = 0; i < len; i++) - rv[i] = ""; - return rv; - } -} diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_in_wkr_page.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_in_wkr_page.java deleted file mode 100644 index 0e71f2da2..000000000 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_in_wkr_page.java +++ /dev/null @@ -1,145 +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 . -*/ -package gplx.xowa.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*; -import gplx.dbs.*; import gplx.core.criterias.*; -class Xodb_in_wkr_page_id extends Xodb_in_wkr_page_base { - private ListAdp list; // list is original list of ids which may have dupes; needed to fill statement (which takes range of bgn - end); DATE:2013-12-08 - private OrderedHash hash; // hash is unique list of ids; needed for fetch from rdr (which indexes by id) - public void Init(ListAdp list, OrderedHash hash) {this.list = list; this.hash = hash; this.Fill_idx_fields_only_(true);} - @Override public int Interval() {return 990;} - @Override public String In_fld_name() {return Xodb_page_tbl.Fld_page_id;} - @Override public Criteria In_filter(Object[] part_ary) { - return Db_crt_.in_(this.In_fld_name(), part_ary); - } - @Override public void Fill_stmt(Db_stmt stmt, int bgn, int end) { - for (int i = bgn; i < end; i++) { - Xodb_page page = (Xodb_page)list.FetchAt(i); - stmt.Val_int(page.Id()); - } - } - @Override public Xodb_page Eval_rslts_key(Xodb_page rdr_page) {return (Xodb_page)hash.Fetch(rdr_page.Id_val());} -} -class Xodb_in_wkr_page_title extends Xodb_in_wkr_page_base { - private OrderedHash hash; - private int in_ns; - @Override public int Interval() {return 64;} // NOTE: 96+ overflows; EX: w:Space_Liability_Convention; DATE:2013-10-24 - public void Init(OrderedHash hash, int in_ns) {this.hash = hash; this.in_ns = in_ns;} - @Override public String In_fld_name() {return Xodb_page_tbl.Fld_page_title;} - @Override public Criteria In_filter(Object[] part_ary) { - int len = part_ary.length; - Criteria[] crt_ary = new Criteria[len]; - for (int i = 0; i < len; i++) - crt_ary[i] = Criteria_.And(Db_crt_.eq_(Xodb_page_tbl.Fld_page_ns, in_ns), Db_crt_.eq_(Xodb_page_tbl.Fld_page_title, Bry_.Empty)); - return Criteria_.Or_many(crt_ary); - } - @Override public void Fill_stmt(Db_stmt stmt, int bgn, int end) { - for (int i = bgn; i < end; i++) { - Xodb_page page = (Xodb_page)hash.FetchAt(i); - stmt.Val_int(in_ns); - stmt.Val_bry_as_str(page.Ttl_page_db()); - } - } - @Override public Xodb_page Eval_rslts_key(Xodb_page rdr_page) {return (Xodb_page)hash.Fetch(rdr_page.Ttl_page_db());} -} -class Xodb_in_wkr_page_title_ns extends Xodb_in_wkr_page_base { - private Xow_ns_mgr ns_mgr; - private OrderedHash hash; - @Override public int Interval() {return 64;} // NOTE: 96+ overflows; PAGE:en.w:Space_Liability_Convention; DATE:2013-10-24 - public void Init(Xow_ns_mgr ns_mgr, OrderedHash hash) {this.ns_mgr = ns_mgr; this.hash = hash;} - @Override public String In_fld_name() {return Xodb_page_tbl.Fld_page_title;} - @Override public Criteria In_filter(Object[] part_ary) { - int len = part_ary.length; - Criteria[] crt_ary = new Criteria[len]; - for (int i = 0; i < len; i++) - crt_ary[i] = Criteria_.And(Db_crt_.eq_(Xodb_page_tbl.Fld_page_ns, 0), Db_crt_.eq_(Xodb_page_tbl.Fld_page_title, Bry_.Empty)); - return Criteria_.Or_many(crt_ary); - } - @Override public void Fill_stmt(Db_stmt stmt, int bgn, int end) { - for (int i = bgn; i < end; i++) { - Xodb_page page = (Xodb_page)hash.FetchAt(i); - stmt.Val_int(page.Ns_id()); - stmt.Val_bry_as_str(page.Ttl_page_db()); - } - } - @Override public Xodb_page Eval_rslts_key(Xodb_page rdr_page) { - Xow_ns ns = ns_mgr.Ids_get_or_null(rdr_page.Ns_id()); - if (ns == null) return null; // NOTE: ns seems to "randomly" be null when threading during redlinks; guard against null; DATE:2014-01-03 - byte[] ttl_wo_ns = rdr_page.Ttl_page_db(); - rdr_page.Ttl_(ns, ttl_wo_ns); - return (Xodb_page)hash.Fetch(rdr_page.Ttl_full_db()); - } -} -abstract class Xodb_in_wkr_page_base extends Xodb_in_wkr_base { - public String Tbl_name() {return Xodb_page_tbl.Tbl_name;} - public abstract String In_fld_name(); - public abstract Criteria In_filter(Object[] part_ary); - public abstract Xodb_page Eval_rslts_key(Xodb_page rdr_page); - public boolean Fill_idx_fields_only() {return fill_idx_fields_only;} public Xodb_in_wkr_page_base Fill_idx_fields_only_(boolean v) {fill_idx_fields_only = v; return this;} private boolean fill_idx_fields_only; - @Override public Db_qry Build_qry(Xodb_ctx db_ctx, int bgn, int end) { - Object[] part_ary = Xodb_in_wkr_base.In_ary(end - bgn); - return Db_qry_.select_cols_ - ( this.Tbl_name() - , In_filter(part_ary) - , fill_idx_fields_only ? Xodb_page_tbl.Flds_select_idx : db_ctx.Html_db_enabled() ? Xodb_page_tbl.Flds_select_all__html_y : Xodb_page_tbl.Flds_select_all__html_n - ) - ; - } - @Override public void Eval_rslts(Cancelable cancelable, Xodb_ctx db_ctx, DataRdr rdr) { - Xodb_page temp = new Xodb_page(); - boolean html_db_enabled = db_ctx.Html_db_enabled(); - while (rdr.MoveNextPeer()) { - if (cancelable.Canceled()) return; - if (fill_idx_fields_only) - Xodb_page_tbl.Read_page__idx(temp, rdr); - else - Xodb_page_tbl.Read_page__all(temp, rdr, html_db_enabled); - Xodb_page page = Eval_rslts_key(temp); - if (page == null) continue; // page not found - temp.Exists_(true); - page.Copy(temp); - } - } -} -class Xodb_in_wkr_category_id extends Xodb_in_wkr_base { - private OrderedHash hash; - @Override public int Interval() {return 990;} - public void Init(OrderedHash hash) {this.hash = hash;} - @Override public Db_qry Build_qry(Xodb_ctx db_ctx, int bgn, int end) { - Object[] part_ary = Xodb_in_wkr_base.In_ary(end - bgn); - String in_fld_name = Xodb_category_tbl.Fld_cat_id; - return Db_qry_.select_cols_ - ( Xodb_category_tbl.Tbl_name - , Db_crt_.in_(in_fld_name, part_ary) - ) - ; - } - @Override public void Fill_stmt(Db_stmt stmt, int bgn, int end) { - for (int i = bgn; i < end; i++) { - Xodb_page page = (Xodb_page)hash.FetchAt(i); - stmt.Val_int(page.Id()); - } - } - @Override public void Eval_rslts(Cancelable cancelable, Xodb_ctx db_ctx, DataRdr rdr) { - while (rdr.MoveNextPeer()) { - if (cancelable.Canceled()) return; - Xodb_category_itm ctg_data = Xodb_category_tbl.Read_ctg(rdr); - Xodb_page page = (Xodb_page)hash.Fetch(ctg_data.Id_val()); - page.Xtn_(ctg_data); - } - } -} diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_page_tbl.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_page_tbl.java deleted file mode 100644 index 9f5495fb0..000000000 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_page_tbl.java +++ /dev/null @@ -1,317 +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 . -*/ -package gplx.xowa.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*; -import gplx.core.primitives.*; import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.core.criterias.*; -public class Xodb_page_tbl { - public static final String Tbl_name = "page" - , Fld_page_id = "page_id", Fld_page_ns = "page_namespace", Fld_page_title = "page_title" - , Fld_page_is_redirect = "page_is_redirect", Fld_page_touched = "page_touched", Fld_page_len = "page_len" - , Fld_page_random_int = "page_random_int", Fld_page_file_idx = "page_file_idx" - , Fld_page_html_db_id = "page_html_db_id", Fld_page_redirect_id = "page_redirect_id"; - private static final String[] Select_by_id_flds__basic = new String[] {Fld_page_id, Fld_page_ns, Fld_page_title, Fld_page_touched, Fld_page_is_redirect, Fld_page_len, Fld_page_file_idx}; - private static final String[] Select_by_id_flds__hdump = new String[] {Fld_page_id, Fld_page_ns, Fld_page_title, Fld_page_touched, Fld_page_is_redirect, Fld_page_len, Fld_page_file_idx, Fld_page_html_db_id, Fld_page_redirect_id}; - private final Xow_ns_mgr ns_mgr; private final Xodb_ctx db_ctx; - public Xodb_page_tbl(Xowe_wiki wiki) { - this.ns_mgr = wiki.Ns_mgr(); - this.db_ctx = wiki.Db_mgr().Db_ctx(); - } - public void Html_db_enabled_(boolean v) {html_db_enabled = v;} private boolean html_db_enabled; - public Db_conn Conn() {return conn;} public void Conn_(Db_conn conn) {this.conn = conn;} private Db_conn conn; - public boolean Select_by_ttl(Xodb_page rv, Xow_ns ns, byte[] ttl) { - Db_rdr rdr = Db_rdr_.Null; Db_stmt stmt = Db_stmt_.Null; - try { - stmt = Db_stmt_.new_select_as_rdr(conn, Db_qry__select_in_tbl.new_(Tbl_name, String_.Ary(Fld_page_ns, Fld_page_title), html_db_enabled ? Select_by_id_flds__hdump : Select_by_id_flds__basic, Db_qry__select_in_tbl.Order_by_null)); - rdr = stmt.Val_int(ns.Id()).Val_str(String_.new_utf8_(ttl)).Exec_select_as_rdr(); - if (rdr.Move_next()) { - Read_page__all2(rv, rdr, html_db_enabled); - return true; - } - } finally {rdr.Rls(); stmt.Rls();} - return false; - } - public static void Read_page__all2(Xodb_page page, Db_rdr rdr, boolean html_db_enabled) { - int html_db_id = -1, redirected_id = -1; - if (html_db_enabled) { - html_db_id = rdr.Read_int(Fld_page_html_db_id); - redirected_id = rdr.Read_int(Fld_page_redirect_id); - } - page.Init_by_sql - ( rdr.Read_int(Fld_page_id) - , rdr.Read_int(Fld_page_ns) - , rdr.Read_bry_by_str(Fld_page_title) - , DateAdp_.parse_fmt(rdr.Read_str(Fld_page_touched), Page_touched_fmt) - , rdr.Read_bool_by_byte(Fld_page_is_redirect) - , rdr.Read_int(Fld_page_len) - , rdr.Read_int(Fld_page_file_idx) - , html_db_id - , redirected_id - ); - } - public boolean Select_by_id(Xodb_page rv, int page_id) { - DataRdr rdr = DataRdr_.Null; - Db_stmt stmt = Db_stmt_.Null; - try { - stmt = Db_stmt_.new_select_(conn, Tbl_name, String_.Ary(Fld_page_id)); - rdr = stmt - .Val_int(page_id) - .Exec_select(); - while (rdr.MoveNextPeer()) { - Read_page__all(rv, rdr, html_db_enabled); - return true; - } - } finally {rdr.Rls(); stmt.Rls();} - return false; - } - public int Select_id(int ns_id, byte[] ttl) { - DataRdr rdr = DataRdr_.Null; - Db_stmt stmt = Db_stmt_.Null; - try { - stmt = Db_stmt_.new_select_(conn, Tbl_name, String_.Ary(Fld_page_ns, Fld_page_title), Fld_page_id); - rdr = stmt - .Val_int(ns_id) - .Val_bry_as_str(ttl) - .Exec_select(); - while (rdr.MoveNextPeer()) { - return rdr.ReadInt(Fld_page_id); - } - } finally {rdr.Rls(); stmt.Rls();} - return Xodb_mgr_sql.Page_id_null; - } - public Db_stmt Insert_stmt(Db_conn p) {return Db_stmt_.new_insert_(p, Tbl_name, html_db_enabled ? Flds_insert__html_y : Flds_insert__html_n);} - public void Insert(Db_stmt stmt, int page_id, int ns_id, byte[] ttl_wo_ns, boolean redirect, DateAdp modified_on, int page_len, int random_int, int file_idx, int html_db_id) { - stmt.Clear() - .Val_int(page_id) - .Val_int(ns_id) - .Val_str(String_.new_utf8_(ttl_wo_ns)) - .Val_byte((byte)(redirect ? 1 : 0)) - .Val_str(Xto_touched_str(modified_on)) - .Val_int(page_len) - .Val_int(random_int) - .Val_int(file_idx); - if (html_db_enabled) - stmt.Val_int(html_db_id); - stmt.Exec_insert(); - } - public DataRdr Select_all(Db_conn p) { - Db_qry__select_cmd qry = Db_qry__select_cmd.new_().From_(Tbl_name).Cols_(Fld_page_id, Fld_page_title).OrderBy_asc_(Fld_page_id); - return p.Exec_qry_as_rdr(qry); - } - private DataRdr Load_ttls_starting_with_rdr(int ns_id, byte[] ttl_frag, boolean include_redirects, int max_results, int min_page_len, int browse_len, boolean fwd, boolean search_suggest) { - Criteria crt_ttl = fwd ? Db_crt_.mte_(Fld_page_title, String_.new_utf8_(ttl_frag)) : Db_crt_.lt_(Fld_page_title, String_.new_utf8_(ttl_frag)); - Criteria crt = Criteria_.And_many(Db_crt_.eq_(Fld_page_ns, ns_id), crt_ttl, Db_crt_.mte_(Fld_page_len, min_page_len)); - if (!include_redirects) - crt = Criteria_.And(crt, Db_crt_.eq_(Fld_page_is_redirect, Byte_.Zero)); - String[] cols = search_suggest ? Flds_select_idx : html_db_enabled ? Flds_select_all__html_y : Flds_select_all__html_n; - int limit = fwd ? max_results + 1 : max_results; // + 1 to get next item - Db_qry__select_cmd select = Db_qry_.select_cols_(Tbl_name, crt, cols).Limit_(limit).OrderBy_(Fld_page_title, fwd); - return select.Exec_qry_as_rdr(conn); - } - public void Load_ttls_for_all_pages(Cancelable cancelable, ListAdp rslt_list, Xodb_page rslt_nxt, Xodb_page rslt_prv, Int_obj_ref rslt_count, Xow_ns ns, byte[] key, int max_results, int min_page_len, int browse_len, boolean include_redirects, boolean fetch_prv_item) { - DataRdr rdr = DataRdr_.Null; - Xodb_page nxt_itm = null; - int rslt_idx = 0; - boolean max_val_check = max_results == Int_.MaxValue; - try { - rdr = Load_ttls_starting_with_rdr(ns.Id(), key, include_redirects, max_results, min_page_len, browse_len, true, true); - while (rdr.MoveNextPeer()) { - if (cancelable.Canceled()) return; - Xodb_page page = new Xodb_page(); - Read_page__idx(page, rdr); - if (max_val_check && !Bry_.HasAtBgn(page.Ttl_page_db(), key)) break; - nxt_itm = page; - if (rslt_idx == max_results) {} // last item which is not meant for rslts, but only for nxt itm - else { - rslt_list.Add(page); - ++rslt_idx; - } - } - if (rslt_nxt != null && nxt_itm != null) // occurs when range is empty; EX: "Module:A" in simplewikibooks - rslt_nxt.Copy(nxt_itm); - if (fetch_prv_item) { // NOTE: Special:AllPages passes in true, but Search_suggest passes in false - if (cancelable.Canceled()) return; - rdr = Load_ttls_starting_with_rdr(ns.Id(), key, include_redirects, max_results, min_page_len, browse_len, false, false); - Xodb_page prv_itm = new Xodb_page(); - boolean found = false; - while (rdr.MoveNextPeer()) { - Read_page__all(prv_itm, rdr, html_db_enabled); - found = true; - } - if (found) - rslt_prv.Copy(prv_itm); - else { // at beginning of range, so no items found; EX: "Module:A" is search, but 1st Module is "Module:B" - if (rslt_list.Count() > 0) // use 1st item - rslt_prv.Copy((Xodb_page)rslt_list.FetchAt(0)); - } - } - } - finally {rdr.Rls();} - rslt_count.Val_(rslt_idx); - } - public void Load_ttls_for_search_suggest(Cancelable cancelable, ListAdp rslt_list, Xow_ns ns, byte[] key, int max_results, int min_page_len, int browse_len, boolean include_redirects, boolean fetch_prv_item) { - String search_bgn = String_.new_utf8_(key); - String search_end = String_.new_utf8_(gplx.intl.Utf8_.Increment_char_at_last_pos(key)); - Db_qry qry = Db_qry_sql.rdr_("SELECT page_id, page_namespace, page_title, page_len FROM page INDEXED BY page__title WHERE page_namespace = " + Int_.Xto_str(ns.Id()) + " AND page_title BETWEEN '" + search_bgn + "' AND '" + search_end + "' ORDER BY page_len DESC LIMIT " + Int_.Xto_str(max_results) + ";"); - DataRdr rdr = DataRdr_.Null; - try { - rdr = conn.Exec_qry_as_rdr(qry); - while (rdr.MoveNextPeer()) { - if (cancelable.Canceled()) return; - Xodb_page page = new Xodb_page(); - Read_page__idx(page, rdr); - rslt_list.Add(page); - } - rslt_list.SortBy(Xodb_page_sorter.TitleAsc); - } - finally {rdr.Rls();} - } - public boolean Select_by_id_list(Cancelable cancelable, ListAdp rv) {return Select_by_id_list(cancelable, false, rv, 0, rv.Count());} - public boolean Select_by_id_list(Cancelable cancelable, boolean skip_table_read, ListAdp rv) {return Select_by_id_list(cancelable, skip_table_read, rv, 0, rv.Count());} - public boolean Select_by_id_list(Cancelable cancelable, boolean skip_table_read, ListAdp rv, int bgn, int end) { - Xodb_page[] page_ary = (Xodb_page[])rv.Xto_ary(Xodb_page.class); - int len = page_ary.length; if (len == 0) return false; - OrderedHash hash = OrderedHash_.new_(); - for (int i = 0; i < len; i++) { - if (cancelable.Canceled()) return false; - Xodb_page p = page_ary[i]; - if (!hash.Has(p.Id_val())) // NOTE: must check if file already exists b/c dynamicPageList currently allows dupes; DATE:2013-07-22 - hash.Add(p.Id_val(), p); - } - Xodb_in_wkr_page_id wkr = new Xodb_in_wkr_page_id(); - wkr.Init(rv, hash); - wkr.Select_in(conn, cancelable, db_ctx, bgn, end); - return true; - } - public byte[] Select_random(Xow_ns ns) {// ns should be ns_main - int random_int = RandomAdp_.new_().Next(ns.Count()); - DataRdr rdr = DataRdr_.Null; - Db_stmt stmt = Db_stmt_.Null; - byte[] rv = null; - try { - stmt = Db_stmt_.new_select_(conn, Tbl_name, String_.Ary(Fld_page_ns, Fld_page_random_int), Fld_page_title); - rdr = stmt - .Val_int(ns.Id()) - .Val_int(random_int) - .Exec_select(); - if (rdr.MoveNextPeer()) { - rv = rdr.ReadBryByStr(Fld_page_title); - } - } finally {rdr.Rls(); stmt.Rls();} - return rv; - } - public void Select_by_search(Cancelable cancelable, ListAdp rv, byte[] search, int results_max) { - if (Bry_.Len_eq_0(search)) return; // do not allow empty search - Criteria crt = gplx.core.criterias.Criteria_.And_many(Db_crt_.eq_(Fld_page_ns, Xow_ns_.Id_main), Db_crt_.like_(Fld_page_title, "")); - Db_qry__select_cmd qry = Db_qry_.select_().From_(Tbl_name).Cols_(Fld_page_id, Fld_page_len, Fld_page_ns, Fld_page_title).Where_(crt); // NOTE: use fields from main index only - DataRdr rdr = DataRdr_.Null; - Db_stmt stmt = Db_stmt_.Null; - search = Bry_.Replace(search, Byte_ascii.Asterisk, Byte_ascii.Percent); - try { - stmt = conn.Stmt_new(qry); - rdr = stmt.Clear().Val_int(Xow_ns_.Id_main).Val_bry_as_str(search).Exec_select(); - while (rdr.MoveNextPeer()) { - if (cancelable.Canceled()) return; - Xodb_page page = new Xodb_page(); - page.Id_ (rdr.ReadInt(Fld_page_id)); - page.Ns_id_ (rdr.ReadInt(Fld_page_ns)); - page.Ttl_page_db_ (rdr.ReadBryByStr(Fld_page_title)); - page.Wtxt_len_ (rdr.ReadInt(Fld_page_len)); - rv.Add(page); - } - } finally {rdr.Rls(); stmt.Rls();} - } - public static byte[] Find_search_end(byte[] orig) { - byte[] rv = Bry_.Copy(orig); - int rv_len = rv.length; - int increment_pos = rv[rv_len - 1] == Byte_ascii.Percent ? rv_len - 2 : rv_len - 1; // increment last char, unless it is %; if %, increment one before it - return Bry_.Increment_last(rv, increment_pos); - } - public Db_stmt Select_for_parse_all_stmt(Db_conn p, int limit, byte redirect) { - Criteria crt = gplx.core.criterias.Criteria_.And_many(Db_crt_.eq_(Fld_page_ns, -1), Db_crt_.mt_(Fld_page_title, "")); - if (redirect != Bool_.__byte) - crt = gplx.core.criterias.Criteria_.And(crt, Db_crt_.eq_(Fld_page_is_redirect, redirect)); - Db_qry__select_cmd qry = Db_qry_.select_().From_(Tbl_name).Cols_(html_db_enabled ? Flds_select_all__html_y : Flds_select_all__html_n) - .Where_(crt) - .Limit_(limit); - return p.Stmt_new(qry); - } - public void Select_for_parse_all(Cancelable cancelable, OrderedHash rv, Db_stmt stmt, int ns, byte[] ttl, byte redirect) { - String ttl_str = String_.new_utf8_(ttl); - DataRdr rdr = DataRdr_.Null; - try { - stmt.Clear().Val_int(ns).Val_str(ttl_str); - if (redirect != Bool_.__byte) stmt.Val_byte(redirect); - rdr = stmt.Exec_select(); - while (rdr.MoveNextPeer()) { - if (cancelable.Canceled()) return; - Xodb_page page = new Xodb_page(); - Read_page__all(page, rdr, html_db_enabled); - rv.Add(page.Id_val(), page); - } - } finally {rdr.Rls();} - } - public void Select_by_ttl_in(Cancelable cancelable, OrderedHash rv, Xodb_ctx db_ctx, boolean fill_idx_fields_only, int bgn, int end) { - Xodb_in_wkr_page_title_ns wkr = new Xodb_in_wkr_page_title_ns(); - wkr.Fill_idx_fields_only_(fill_idx_fields_only); - wkr.Init(ns_mgr, rv); - wkr.Select_in(conn, cancelable, db_ctx, bgn, end); - } - public void Select_by_ttl_in(Cancelable cancelable, OrderedHash rv, int ns_id, int bgn, int end) { - Xodb_in_wkr_page_title wkr = new Xodb_in_wkr_page_title(); - wkr.Init(rv, ns_id); - wkr.Select_in(conn, cancelable, db_ctx, bgn, end); - } - public void Update_html_db_id(int page_id, int html_db_id) { - if (!html_db_enabled) throw Err_.new_("html_db not enabled"); - Db_stmt stmt = Db_stmt_.new_update_(conn, Tbl_name, String_.Ary(Fld_page_id), Fld_page_html_db_id); - stmt.Val_int(html_db_id).Val_int(page_id).Exec_update(); - } - private static final String Page_touched_fmt = "yyyyMMddHHmmss"; - private static String Xto_touched_str(DateAdp v) {return v.XtoStr_fmt(Page_touched_fmt);} - public static final String[] - Flds_insert__html_n = String_.Ary(Fld_page_id, Fld_page_ns, Fld_page_title, Fld_page_is_redirect, Fld_page_touched, Fld_page_len, Fld_page_random_int, Fld_page_file_idx) - , Flds_insert__html_y = String_.Ary(Fld_page_id, Fld_page_ns, Fld_page_title, Fld_page_is_redirect, Fld_page_touched, Fld_page_len, Fld_page_random_int, Fld_page_file_idx, Fld_page_html_db_id, Fld_page_redirect_id) - , Flds_select_all__html_n = String_.Ary(Fld_page_id, Fld_page_ns, Fld_page_title, Fld_page_touched, Fld_page_is_redirect, Fld_page_len, Fld_page_file_idx) - , Flds_select_all__html_y = String_.Ary(Fld_page_id, Fld_page_ns, Fld_page_title, Fld_page_touched, Fld_page_is_redirect, Fld_page_len, Fld_page_file_idx, Fld_page_html_db_id, Fld_page_redirect_id) - , Flds_select_idx = String_.Ary(Fld_page_id, Fld_page_ns, Fld_page_title, Fld_page_len) - ; - public static final boolean Load_idx_flds_only_y = true; - public static void Read_page__all(Xodb_page page, DataRdr rdr, boolean html_db_enabled) { - int html_db_id = -1, redirected_id = -1; - if (html_db_enabled) { - html_db_id = rdr.ReadInt(Fld_page_html_db_id); - redirected_id = rdr.ReadInt(Fld_page_redirect_id); - } - page.Init_by_sql - ( rdr.ReadInt(Fld_page_id) - , rdr.ReadInt(Fld_page_ns) - , rdr.ReadBryByStr(Fld_page_title) - , DateAdp_.parse_fmt(rdr.ReadStr(Fld_page_touched), Page_touched_fmt) - , rdr.ReadByte(Fld_page_is_redirect) == 1 - , rdr.ReadInt(Fld_page_len) - , rdr.ReadInt(Fld_page_file_idx) - , html_db_id - , redirected_id - ); - } - public static void Read_page__idx(Xodb_page page, DataRdr rdr) { - page.Id_ (rdr.ReadInt(Fld_page_id)); - page.Ns_id_ (rdr.ReadInt(Fld_page_ns)); - page.Ttl_page_db_ (rdr.ReadBryByStr(Fld_page_title)); - page.Wtxt_len_ (rdr.ReadInt(Fld_page_len)); - } -} diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_search_title_page_tbl.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_search_title_page_tbl.java deleted file mode 100644 index ff6ee8e23..000000000 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_search_title_page_tbl.java +++ /dev/null @@ -1,42 +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 . -*/ -package gplx.xowa.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*; -import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; -public class Xodb_search_title_page_tbl { - public static void Create_table(Db_conn p) {Sqlite_engine_.Tbl_create(p, Tbl_name, Tbl_sql);} - public static void Create_index_unique(Gfo_usr_dlg usr_dlg, Db_conn p) {Sqlite_engine_.Idx_create(usr_dlg, p, "search", Idx_main_unique);} - public static void Create_index_non_unique(Gfo_usr_dlg usr_dlg, Db_conn p) {Sqlite_engine_.Idx_create(usr_dlg, p, "search", Idx_main_non_unique);} - public static Db_stmt Insert_stmt(Db_conn p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_stp_word_id, Fld_stp_page_id);} - public static void Insert(Db_stmt stmt, int word_id, int page_id) { - stmt.Clear() - .Val_int(word_id) - .Val_int(page_id) - .Exec_insert(); - } - public static final String Tbl_name = "search_title_page", Fld_stp_word_id = "stp_word_id", Fld_stp_page_id = "stp_page_id"; - private static final String Tbl_sql = String_.Concat_lines_nl - ( "CREATE TABLE IF NOT EXISTS search_title_page" - , "( stp_word_id integer NOT NULL" - , ", stp_page_id integer NOT NULL" - , ");" - ); - private static final Db_idx_itm - Idx_main_unique = Db_idx_itm.sql_("CREATE UNIQUE INDEX IF NOT EXISTS search_title_page__main ON search_title_page (stp_word_id, stp_page_id);") - , Idx_main_non_unique = Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS search_title_page__main ON search_title_page (stp_word_id, stp_page_id);") - ; -} diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_search_title_word_tbl.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_search_title_word_tbl.java deleted file mode 100644 index d74cfa64c..000000000 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_search_title_word_tbl.java +++ /dev/null @@ -1,96 +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 . -*/ -package gplx.xowa.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*; -import gplx.core.primitives.*; import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.dbs.engines.sqlite.*; -public class Xodb_search_title_word_tbl { - public static void Create_table(Db_conn p) {Sqlite_engine_.Tbl_create(p, Tbl_name, Tbl_sql);} - public static void Create_index(Gfo_usr_dlg usr_dlg, Db_conn p) {Sqlite_engine_.Idx_create(usr_dlg, p, "search", Indexes_main);} - public static Db_stmt Insert_stmt(Db_conn p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_stw_word_id, Fld_stw_word);} - public static void Insert(Db_stmt stmt, int word_id, byte[] word) { - stmt.Clear() - .Val_int(word_id) - .Val_bry_as_str(word) - .Exec_insert(); - } - public static void Select_by_word(Cancelable cancelable, ListAdp rv, Xodb_ctx db_ctx, byte[] search, int results_max, Db_conn p) { - Db_qry__select_cmd qry = Db_qry_.select_() - .Cols_(Xodb_search_title_word_tbl.Fld_stw_word_id) - .From_(Xodb_search_title_word_tbl.Tbl_name, "w") - ; - gplx.core.criterias.Criteria crt = null; - if (Bry_.Has(search, Byte_ascii.Asterisk)) { - search = Bry_.Replace(search, Byte_ascii.Asterisk, Byte_ascii.Percent); - crt = Db_crt_.like_ (Xodb_search_title_word_tbl.Fld_stw_word, String_.new_utf8_(search)); - } - else - crt = Db_crt_.eq_ (Xodb_search_title_word_tbl.Fld_stw_word, String_.new_utf8_(search)); - qry.Where_(crt); - - DataRdr rdr = DataRdr_.Null; - ListAdp words = ListAdp_.new_(); - try { - rdr = qry.Exec_qry_as_rdr(p); - while (rdr.MoveNextPeer()) { - int word_id = rdr.ReadInt(Xodb_search_title_word_tbl.Fld_stw_word_id); - words.Add(Int_obj_val.new_(word_id)); - } - } - finally {rdr.Rls();} - - Xodb_in_wkr_search_title_id wkr = new Xodb_in_wkr_search_title_id(); - wkr.Init(words, rv); - wkr.Select_in(p, cancelable, db_ctx, 0, words.Count()); - } - public static final String Tbl_name = "search_title_word", Fld_stw_word_id = "stw_word_id", Fld_stw_word = "stw_word"; - private static final String Tbl_sql = String_.Concat_lines_nl - ( "CREATE TABLE IF NOT EXISTS search_title_word" - , "( stw_word_id integer NOT NULL PRIMARY KEY" - , ", stw_word varchar(255) NOT NULL" - , ");" - ); - private static final Db_idx_itm - Indexes_main = Db_idx_itm.sql_("CREATE UNIQUE INDEX IF NOT EXISTS search_title_word__main ON search_title_word (stw_word, stw_word_id);"); -} -class Xodb_in_wkr_search_title_id extends Xodb_in_wkr_base { - private ListAdp words, pages; - @Override public int Interval() {return 990;} - public void Init(ListAdp words, ListAdp pages) {this.words = words; this.pages = pages;} - @Override public Db_qry Build_qry(Xodb_ctx db_ctx, int bgn, int end) { - Object[] part_ary = Xodb_in_wkr_base.In_ary(end - bgn); - String in_fld_name = Xodb_search_title_page_tbl.Fld_stp_word_id; - return Db_qry_.select_cols_ - ( Xodb_search_title_page_tbl.Tbl_name - , Db_crt_.in_(in_fld_name, part_ary) - ) - ; - } - @Override public void Fill_stmt(Db_stmt stmt, int bgn, int end) { - for (int i = bgn; i < end; i++) { - Int_obj_val word_id = (Int_obj_val)words.FetchAt(i); - stmt.Val_int(word_id.Val()); - } - } - @Override public void Eval_rslts(Cancelable cancelable, Xodb_ctx db_ctx, DataRdr rdr) { - while (rdr.MoveNextPeer()) { - if (cancelable.Canceled()) return; - int page_id = rdr.ReadInt(Xodb_search_title_page_tbl.Fld_stp_page_id); - Xodb_page page = new Xodb_page().Id_(page_id); - pages.Add(page); - } - } -} diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_site_stats_tbl.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_site_stats_tbl.java deleted file mode 100644 index 67198fed9..000000000 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_site_stats_tbl.java +++ /dev/null @@ -1,49 +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 . -*/ -package gplx.xowa.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*; -import gplx.dbs.*; -public class Xodb_site_stats_tbl { - public void Conn_(Db_conn conn) {this.conn = conn;} Db_conn conn; - public void Update(int num_articles, int num_pages, int num_files) { - Db_stmt stmt = Db_stmt_.Null; - try { - stmt = Db_stmt_.new_update_(conn, Tbl_name, String_.Ary(Fld_ss_row_id), Fld_ss_good_articles, Fld_ss_total_pages, Fld_ss_images); - stmt.Val_int(num_articles) - .Val_int(num_pages) - .Val_int(num_files) - .Val_int(1) - .Exec_update(); - ; - } finally {stmt.Rls();} - } - public void Select(Xowe_wiki wiki) { - Xow_wiki_stats stats = wiki.Stats(); - DataRdr rdr = DataRdr_.Null; - Db_stmt stmt = Db_stmt_.Null; - try { - stmt = Db_stmt_.new_select_all_(conn, Tbl_name); - rdr = stmt.Exec_select(); - if (rdr.MoveNextPeer()) { - stats.NumArticles_ (rdr.ReadInt(Fld_ss_good_articles)); - stats.NumPages_ (rdr.ReadInt(Fld_ss_total_pages)); - stats.NumFiles_ (rdr.ReadInt(Fld_ss_images)); - } - } finally {rdr.Rls(); stmt.Rls();} - } - public static final String Tbl_name = "site_stats", Fld_ss_row_id = "ss_row_id", Fld_ss_good_articles = "ss_good_articles", Fld_ss_total_pages = "ss_total_pages", Fld_ss_images = "ss_images"; -} diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_text_tbl.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_text_tbl.java deleted file mode 100644 index d79d3e9a3..000000000 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_text_tbl.java +++ /dev/null @@ -1,82 +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 . -*/ -package gplx.xowa.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*; -import gplx.core.primitives.*; import gplx.dbs.*; import gplx.ios.*; -import gplx.xowa.wikis.data.*; -public class Xodb_text_tbl { - public Xodb_text_tbl(Xodb_mgr_sql db_mgr) {this.db_mgr = db_mgr; zip_mgr = db_mgr.Wiki().Appe().Zip_mgr();} private Xodb_mgr_sql db_mgr; private Io_stream_zip_mgr zip_mgr; - public void Delete_all(Db_conn conn) {conn.Exec_qry(Db_qry_.delete_tbl_(Tbl_name));} - public Db_stmt Insert_stmt(Db_conn prov) {return Db_stmt_.new_insert_(prov, Tbl_name, Fld_page_id, Fld_old_text);} - public void Insert(Db_stmt stmt, int page_id, byte[] text, byte storage_type) { - stmt.Clear().Val_int(page_id).Val_bry(text).Exec_insert(); - } - public void Update(int file_id, int page_id, byte[] text) { - Db_stmt stmt = Db_stmt_.Null; - try { - Db_conn conn = db_mgr.Core_data_mgr().Dbs__get_at(file_id).Conn(); - stmt = Db_stmt_.new_update_(conn, Tbl_name, String_.Ary(Fld_page_id), Fld_old_text); - stmt.Val_bry(text).Val_int(page_id).Exec_update(); - } finally {stmt.Rls();} - } - public byte[] Select(int file_id, int page_id) { - Db_stmt stmt = Db_stmt_.Null; - try { - Db_conn conn = db_mgr.Core_data_mgr().Dbs__get_at(file_id).Conn(); - stmt = Db_stmt_.new_select_(conn, Tbl_name, String_.Ary(Fld_page_id), Fld_old_text); - byte[] rv = (byte[])stmt.Val_int(page_id).Exec_select_val(); - rv = zip_mgr.Unzip(db_mgr.Data_storage_format(), rv); - return rv; - } finally {stmt.Rls();} - } - public void Select_in(Cancelable cancelable, Xowd_db_file file, OrderedHash hash) { - DataRdr rdr = DataRdr_.Null; - Db_stmt stmt = Db_stmt_.Null; - try { - int len = hash.Count(); - ListAdp pages = ListAdp_.new_(); - for (int i = 0; i < len; i++) { - Xodb_page page = (Xodb_page)hash.FetchAt(i); - if (page.Wtxt_db_id() == file.Id()) - pages.Add(page); - } - len = pages.Count(); - if (len == 0) return; - Object[] args_ary = new Object[len]; - for (int i = 0; i < len; i++) { - if (cancelable.Canceled()) return; - args_ary[i] = 0; - } - stmt = Db_stmt_.new_select_in_(file.Conn(), Tbl_name, Fld_page_id, args_ary); - for (int i = 0; i < len; i++) { - if (cancelable.Canceled()) return; - Xodb_page page = (Xodb_page)pages.FetchAt(i); - stmt.Val_int(page.Id()); - } - rdr = stmt.Exec_select(); - while (rdr.MoveNextPeer()) { - if (cancelable.Canceled()) return; - int page_id = rdr.ReadInt(Fld_page_id); - byte[] old_text = rdr.ReadBry(Fld_old_text); - old_text = zip_mgr.Unzip(db_mgr.Data_storage_format(), old_text); - Xodb_page page = (Xodb_page)hash.Fetch(Int_obj_val.new_(page_id)); - page.Wtxt_(old_text); - } - } finally {rdr.Rls(); stmt.Rls();} - } - public static final String Tbl_name = "text", Fld_page_id = "page_id", Fld_old_text = "old_text"; -} diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_wdata_pids_tbl.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_wdata_pids_tbl.java deleted file mode 100644 index 4a9f2779d..000000000 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_wdata_pids_tbl.java +++ /dev/null @@ -1,37 +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 . -*/ -package gplx.xowa.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*; -import gplx.dbs.*; import gplx.xowa.xtns.wdatas.*; -public class Xodb_wdata_pids_tbl { - public void Purge(Db_conn p) {p.Exec_qry(Db_qry_.delete_tbl_(Tbl_name));} - public Db_stmt Insert_stmt(Db_conn p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_wp_src_lang, Fld_wp_src_ttl, Fld_wp_trg_ttl);} - public void Insert(Db_stmt stmt, byte[] src_lang, byte[] src_ttl, byte[] trg_ttl) { - stmt.Clear().Val_bry_as_str(src_lang).Val_bry_as_str(src_ttl).Val_bry_as_str(trg_ttl).Exec_insert(); - } - public int Select_pid(Db_conn p, byte[] src_lang, byte[] src_ttl) { - Db_stmt stmt = Db_stmt_.Null; - try { - stmt = Db_stmt_.new_select_(p, Tbl_name, String_.Ary(Fld_wp_src_lang, Fld_wp_src_ttl), Fld_wp_trg_ttl); - String pid_str = (String)stmt.Val_bry_as_str(src_lang).Val_bry_as_str(src_ttl).Exec_select_val(); - if (pid_str == null) return Wdata_wiki_mgr.Pid_null; // occurs when pid exists, but does not have entry for language; see hu.w:Marco Polo argali; DATE: 2014-02-01 - byte[] pid_bry = Bry_.new_utf8_(pid_str); - return pid_bry == null ? Wdata_wiki_mgr.Pid_null : Bry_.Xto_int_or(pid_bry, 1, pid_bry.length, Wdata_wiki_mgr.Pid_null); - } finally {stmt.Rls();} - } - public static final String Tbl_name = "wdata_pids", Fld_wp_src_lang = "wp_src_lang", Fld_wp_src_ttl = "wp_src_ttl", Fld_wp_trg_ttl = "wp_trg_ttl"; -} diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_wdata_qids_tbl.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_wdata_qids_tbl.java deleted file mode 100644 index b6ff6a239..000000000 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_wdata_qids_tbl.java +++ /dev/null @@ -1,35 +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 . -*/ -package gplx.xowa.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*; -import gplx.dbs.*; -public class Xodb_wdata_qids_tbl { - public void Purge(Db_conn p) {p.Exec_qry(Db_qry_.delete_tbl_(Tbl_name));} - public Db_stmt Insert_stmt(Db_conn p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_wq_src_wiki, Fld_wq_src_ns, Fld_wq_src_ttl, Fld_wq_trg_ttl);} - public void Insert(Db_stmt stmt, byte[] src_wiki, int src_ns, byte[] src_ttl, byte[] trg_ttl) { - stmt.Clear().Val_bry_as_str(src_wiki).Val_int(src_ns).Val_bry_as_str(src_ttl).Val_bry_as_str(trg_ttl).Exec_insert(); - } - public byte[] Select_qid(Db_conn p, byte[] src_wiki, byte[] src_ns, byte[] src_ttl) { - Db_stmt stmt = Db_stmt_.Null; - try { - stmt = Db_stmt_.new_select_(p, Tbl_name, String_.Ary(Fld_wq_src_wiki, Fld_wq_src_ns, Fld_wq_src_ttl), Fld_wq_trg_ttl); - String rv = (String)stmt.Val_bry_as_str(src_wiki).Val_int(Bry_.Xto_int(src_ns)).Val_bry_as_str(src_ttl).Exec_select_val(); - return rv == null ? null : Bry_.new_utf8_(rv); - } finally {stmt.Rls();} - } - public static final String Tbl_name = "wdata_qids", Fld_wq_src_wiki = "wq_src_wiki", Fld_wq_src_ns = "wq_src_ns", Fld_wq_src_ttl = "wq_src_ttl", Fld_wq_trg_ttl = "wq_trg_ttl"; -} diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_xowa_cfg_tbl.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_xowa_cfg_tbl.java deleted file mode 100644 index d1a2532c1..000000000 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_xowa_cfg_tbl.java +++ /dev/null @@ -1,105 +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 . -*/ -package gplx.xowa.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*; -import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.dbs.engines.sqlite.*; import gplx.core.primitives.*; -public class Xodb_xowa_cfg_tbl { - public static final String Tbl_name = "xowa_cfg", Fld_cfg_grp = "cfg_grp", Fld_cfg_key = "cfg_key", Fld_cfg_val = "cfg_val"; - public static void Create_table(Db_conn p) {Sqlite_engine_.Tbl_create(p, Tbl_name, Tbl_sql);} - public static void Create_index(Db_conn p) {Sqlite_engine_.Idx_create(p, Idx_select);} - private static final String Tbl_sql = String_.Concat_lines_nl - ( "CREATE TABLE IF NOT EXISTS xowa_cfg" - , "( cfg_grp varchar(1024) NOT NULL" - , ", cfg_key varchar(1024) NOT NULL" - , ", cfg_val blob NOT NULL" - , ");" - ); - private static final Db_idx_itm - Idx_select = Db_idx_itm.sql_("CREATE UNIQUE INDEX IF NOT EXISTS xowa_cfg__grp_key ON xowa_cfg (cfg_grp, cfg_key);") - ; - public Db_conn Conn() {return conn;} public Xodb_xowa_cfg_tbl Conn_(Db_conn conn) {this.conn = conn; return this;} Db_conn conn; - private DataRdr Select(String grp) { - Db_qry qry = Db_qry_.select_cols_(Tbl_name, Db_crt_.eq_(Fld_cfg_grp, grp), Fld_cfg_key, Fld_cfg_val); - return conn.Exec_qry_as_rdr(qry); - } - public long Select_val_as_long_or(String grp, String key, long or) {return Long_.parse_or_(Select_val(grp, key), or);} - public int Select_val_as_int(String grp, String key) {return Int_.parse_(Select_val(grp, key));} - public String Select_val(String grp, String key) {return Select_val_or(grp, key, null);} - public String Select_val_or(String grp, String key, String or) { - Db_qry__select_cmd qry = Db_qry_.select_val_(Tbl_name, Fld_cfg_val, Where_grp_key(grp, key)); - String rv = (String)qry.ExecRdr_val(conn); - return rv == null ? or : rv; - } - public String Select_val_or_make(String grp, String key, String or) { - String rv = Select_val_or(grp, key, null); - if (rv == null) { - rv = or; - Insert_str(grp, key, rv); - } - return rv; - } - public KeyVal[] Select_kvs(String grp, String match_key, String_obj_ref match_val) { - DataRdr rdr = DataRdr_.Null; - try { - rdr = this.Select(grp); - while (rdr.MoveNextPeer()) { - String key = rdr.ReadStr(Fld_cfg_key); - String val = rdr.ReadStr(Fld_cfg_val); - if (String_.Eq(key, match_key)) match_val.Val_(val); - KeyVal kv = KeyVal_.new_(key, val); - tmp_list.Add(kv); - } - return (KeyVal[])tmp_list.Xto_ary(KeyVal.class); - } - finally {rdr.Rls(); tmp_list.Clear();} - } ListAdp tmp_list = ListAdp_.new_(); - public void Delete(String grp, String key) { - Db_stmt stmt = Db_stmt_.Null; - try { - stmt = Db_stmt_.new_delete_(conn, Tbl_name, String_.Ary(Fld_cfg_grp, Fld_cfg_key)); - stmt.Val_str(grp).Val_str(key).Exec_delete(); - } finally {stmt.Rls();} - } - 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_bry_as_str(String grp, String key, byte[] val) {Insert_str(grp, key, String_.new_utf8_(val));} - public void Insert_str(String grp, String key, String val) {Insert_str(conn, grp, key, val);} - public static void Insert_str(Db_conn p, String grp, String key, String val) { - Db_qry qry = Db_qry_.insert_(Tbl_name) - .Arg_(Fld_cfg_grp , grp) - .Arg_(Fld_cfg_key , key) - .Arg_(Fld_cfg_val , val) - ; - p.Exec_qry(qry); - } - public Db_stmt Update_stmt() {return Db_stmt_.new_update_(conn, Tbl_name, String_.Ary(Fld_cfg_grp, Fld_cfg_key), Fld_cfg_val);} - public void Update(Db_stmt stmt, String grp, String key, long val) {Update(stmt, grp, key, Long_.Xto_str(val));} - public void Update(Db_stmt stmt, String grp, String key, int val) {Update(stmt, grp, key, Int_.Xto_str(val));} - public void Update(Db_stmt stmt, String grp, String key, String val) { - stmt.Clear() - .Val_str(val) - .Val_str(grp) - .Val_str(key) - .Exec_update(); - } - public void Update(String grp, String key, int val) {Update(grp, key, Int_.Xto_str(val));} - public void Update(String grp, String key, String val) { - Db_qry qry = Db_qry_.update_common_(Tbl_name, Where_grp_key(grp, key), KeyVal_.new_(Fld_cfg_val, val)); - conn.Exec_qry(qry); - } - private gplx.core.criterias.Criteria Where_grp_key(String grp, String key) {return Db_crt_.eq_many_(KeyVal_.new_(Fld_cfg_grp, grp), KeyVal_.new_(Fld_cfg_key, key));} -} diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_xowa_db_tbl.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_xowa_db_tbl.java deleted file mode 100644 index 8fc351e85..000000000 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_xowa_db_tbl.java +++ /dev/null @@ -1,82 +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 . -*/ -package gplx.xowa.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*; -import gplx.dbs.*; import gplx.dbs.qrys.*; -import gplx.xowa.wikis.data.*; -public class Xodb_xowa_db_tbl { - private String tbl_name = "wiki_db_regy"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); - private String fld_id, fld_type, fld_url; - 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(); - String fld_prefix = ""; - if (schema_is_1) { - tbl_name = "xowa_db"; - fld_prefix = "db_"; - } - fld_id = flds.Add_int_pkey (fld_prefix + "id"); - fld_type = flds.Add_byte (fld_prefix + "type"); // 1=core;2=wikidata;3=data - fld_url = flds.Add_str (fld_prefix + "url", 512); - if (created) { - Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds); - conn.Exec_create_tbl_and_idx(meta); - } - stmt_bldr.Conn_(conn, tbl_name, flds, fld_id); - } - public Xowd_db_file[] Select_all(Io_url wiki_root_dir) { - Db_rdr rdr = Db_rdr_.Null; - ListAdp list = ListAdp_.new_(); - try { - rdr = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empy).Exec_select_as_rdr(); - while (rdr.Move_next()) { - Xowd_db_file db = Xowd_db_file.load_(rdr.Read_int(fld_id), rdr.Read_byte(fld_type), rdr.Read_str(fld_url)); - db.Url_(wiki_root_dir.GenSubFil(db.Url_rel())); - list.Add(db); - } - } finally {rdr.Rls();} - list.SortBy(Xodb_file_sorter__id.I); - return (Xowd_db_file[])list.Xto_ary(Xowd_db_file.class); - } - public void Commit_all(Xowe_core_data_mgr core_data_mgr) { - stmt_bldr.Batch_bgn(); - try { - int len = core_data_mgr.Dbs__len(); - for (int i = 0; i < len; i++) - Commit_itm(core_data_mgr.Dbs__get_at(i)); - } finally {stmt_bldr.Batch_end();} - } - private void Commit_itm(Xowd_db_file 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_id, itm.Id()) .Val_byte(fld_type, itm.Tid()).Val_str(fld_url, itm.Url_rel()).Exec_insert(); break; - case Db_cmd_mode.Tid_update: stmt.Clear() .Val_byte(fld_type, itm.Tid()).Val_str(fld_url, itm.Url_rel()).Crt_int(fld_id, itm.Id()).Exec_update(); break; - case Db_cmd_mode.Tid_delete: stmt.Clear().Crt_int(fld_id, 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); - } -} -class Xodb_file_sorter__id implements gplx.lists.ComparerAble { - public int compare(Object lhsObj, Object rhsObj) { - Xowd_db_file lhs = (Xowd_db_file)lhsObj; - Xowd_db_file rhs = (Xowd_db_file)rhsObj; - return Int_.Compare(lhs.Id(), rhs.Id()); - } - public static final Xodb_file_sorter__id I = new Xodb_file_sorter__id(); Xodb_file_sorter__id() {} -} diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_xowa_ns_tbl.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_xowa_ns_tbl.java deleted file mode 100644 index ed6e01492..000000000 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_xowa_ns_tbl.java +++ /dev/null @@ -1,99 +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 . -*/ -package gplx.xowa.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*; -import gplx.dbs.*; import gplx.dbs.qrys.*; -public class Xodb_xowa_ns_tbl { - private String tbl_name = "wiki_ns_regy"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); - private String fld_db_id, fld_ns_id, fld_ns_name, fld_ns_case, fld_ns_count, fld_ns_is_alias; - private Db_conn conn; private int db_id; - public void Conn_(Db_conn new_conn, boolean created, boolean schema_is_1, int db_id) { - this.conn = new_conn; flds.Clear(); this.db_id = db_id; - if (schema_is_1) { - tbl_name = "xowa_ns"; - fld_db_id = Db_meta_fld.Key_null; - } - else { - fld_db_id = flds.Add_int("db_id"); - } - fld_ns_id = flds.Add_int("ns_id"); - fld_ns_name = flds.Add_str("ns_name", 255); - fld_ns_case = flds.Add_byte("ns_case"); - fld_ns_is_alias = flds.Add_bool("ns_is_alias"); - fld_ns_count = flds.Add_int("ns_count"); - if (created) { - Db_meta_tbl meta_tbl = Db_meta_tbl.new_(tbl_name, flds - , Db_meta_idx.new_unique_by_tbl_wo_null(tbl_name, "pkey" , fld_db_id, fld_ns_id) - ); - conn.Exec_create_tbl_and_idx(meta_tbl); - } - } - public void Insert(Xow_ns_mgr ns_mgr) { - Db_stmt stmt = conn.Stmt_insert(tbl_name, flds); - int len = ns_mgr.Ids_len(); - for (int i = 0; i < len; i++) { - Xow_ns ns = ns_mgr.Ids_get_at(i); - stmt.Clear() - .Val_int(fld_db_id, db_id) - .Val_int(fld_ns_id, ns.Id()) - .Val_str(fld_ns_name, ns.Name_str()) - .Val_byte(fld_ns_case, ns.Case_match()) - .Val_bool_as_byte(fld_ns_is_alias, ns.Is_alias()) - .Val_int(fld_ns_count, ns.Count()) - .Exec_insert(); - ; - } - } - public void Select_all(Xow_ns_mgr ns_mgr) { - Db_rdr rdr = Db_rdr_.Null; - try { - rdr = conn.Stmt_select(tbl_name, flds, String_.Ary_wo_null(fld_db_id)).Crt_int(fld_db_id, db_id).Exec_select_as_rdr(); - ns_mgr.Clear(); - while (rdr.Move_next()) { - int ns_id = rdr.Read_int(fld_ns_id); - byte[] ns_name = rdr.Read_bry_by_str(fld_ns_name); - byte ns_case_match = rdr.Read_byte(fld_ns_case); - int ns_count = rdr.Read_int(fld_ns_count); - boolean ns_is_alias = rdr.Read_byte(fld_ns_is_alias) == Bool_.Y_byte; - ns_mgr.Add_new(ns_id, ns_name, ns_case_match, ns_is_alias); - if (ns_id < 0) continue; // don't load counts for Special / Media - Xow_ns ns = ns_mgr.Ids_get_or_null(ns_id); - ns.Count_(ns_count); - if (ns_count > 0) ns.Exists_(true); // ns has article; mark it as exists, else Talk tab won't show; DATE:2013-12-04 - } - ns_mgr.Init(); - } finally {rdr.Rls();} - } - public int Select_ns_count(int ns_id) { - Db_rdr rdr = Db_rdr_.Null; - try { - rdr = conn.Stmt_select(tbl_name, flds, String_.Ary_wo_null(fld_db_id, fld_ns_id)) - .Crt_int(fld_db_id, db_id) - .Crt_int(fld_ns_id, ns_id) - .Exec_select_as_rdr(); - return rdr.Move_next() ? Int_.cast_(rdr.Read_int(fld_ns_count)) : 0; - } finally {rdr.Rls();} - } - public void Update_ns_count(int ns_id, int ns_count) { - Db_stmt stmt = conn.Stmt_update(tbl_name, String_.Ary_wo_null(fld_db_id, fld_ns_id), fld_ns_count); - stmt.Clear() - .Val_int(fld_ns_count, ns_count) - .Crt_int(fld_db_id, db_id) - .Crt_int(fld_ns_id, ns_id) - .Exec_update(); - } -} diff --git a/400_xowa/src/gplx/xowa/files/Xof_bin_updater.java b/400_xowa/src/gplx/xowa/files/Xof_bin_updater.java new file mode 100644 index 000000000..70be78069 --- /dev/null +++ b/400_xowa/src/gplx/xowa/files/Xof_bin_updater.java @@ -0,0 +1,43 @@ +/* +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 . +*/ +package gplx.xowa.files; import gplx.*; import gplx.xowa.*; +import gplx.ios.*; +import gplx.fsdb.data.*; import gplx.fsdb.meta.*; import gplx.xowa.files.fsdb.*; +public class Xof_bin_updater { + private final Fsd_img_itm tmp_img_itm = new Fsd_img_itm(); private final Fsd_thm_itm tmp_thm_itm = Fsd_thm_itm.new_(); private final Fsd_fil_itm tmp_fil_itm = new Fsd_fil_itm(); + public int Save_bin(Fsm_mnt_itm mnt, Fsm_atr_fil atr_fil, Fsm_bin_fil bin_fil, Xof_fsdb_itm fsdb, Io_stream_rdr rdr, long rdr_len) { + int db_uid = -1; + int lnki_ext_id = fsdb.Lnki_ext().Id(); + if (fsdb.File_is_orig()) { + if (fsdb.Lnki_ext().Id_is_image()) { // does not add .pdf and .djvu b/c latter do not have w,h for fsdb_img + mnt.Insert_img(tmp_img_itm, atr_fil, bin_fil, fsdb.Orig_repo_name(), fsdb.Lnki_ttl(), lnki_ext_id, fsdb.Orig_w(), fsdb.Orig_h(), rdr_len, rdr); + db_uid = tmp_img_itm.Fil_id(); + } + else { + mnt.Insert_fil(tmp_fil_itm, atr_fil, bin_fil, fsdb.Orig_repo_name(), fsdb.Lnki_ttl(), lnki_ext_id, rdr_len, rdr); + db_uid = tmp_fil_itm.Fil_id(); + } + } + else { + mnt.Insert_thm(tmp_thm_itm, atr_fil, bin_fil, fsdb.Orig_repo_name(), fsdb.Lnki_ttl(), lnki_ext_id, fsdb.Html_w(), fsdb.Html_h(), fsdb.Lnki_time(), fsdb.Lnki_page(), rdr_len, rdr); + db_uid = tmp_thm_itm.Thm_id(); + } + mnt.Cfg_mgr().Next_id_commit(); + return db_uid; + } +} diff --git a/400_xowa/src/gplx/xowa/files/Xof_file_wkr.java b/400_xowa/src/gplx/xowa/files/Xof_file_wkr.java index 8bd6fdeff..285830fd8 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_file_wkr.java +++ b/400_xowa/src/gplx/xowa/files/Xof_file_wkr.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.files; import gplx.*; import gplx.xowa.*; -import gplx.threads.*; +import gplx.threads.*; import gplx.ios.*; import gplx.fsdb.*; import gplx.fsdb.meta.*; import gplx.fsdb.data.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.files.repos.*; import gplx.xowa.files.origs.*; import gplx.xowa.files.bins.*; import gplx.xowa.files.caches.*; import gplx.xowa.files.gui.*; import gplx.xowa.html.hdumps.core.*; @@ -42,7 +42,7 @@ public class Xof_file_wkr implements Gfo_thread_wkr { private final Xoa_page hpg; private final ListAdp imgs; private final byte exec_tid; public Xof_file_wkr(Xof_orig_mgr orig_mgr, Xof_bin_mgr bin_mgr, Fsm_mnt_mgr mnt_mgr, Xof_cache_mgr cache_mgr, Xow_repo_mgr repo_mgr, Xog_js_wkr js_wkr, Xoa_page hpg, ListAdp imgs, byte exec_tid) { this.orig_mgr = orig_mgr; this.bin_mgr = bin_mgr; this.mnt_mgr = mnt_mgr; this.cache_mgr = cache_mgr; - this.usr_dlg = Gfo_usr_dlg_._; this.repo_mgr = repo_mgr; this.js_wkr = js_wkr; + this.usr_dlg = Gfo_usr_dlg_.I; this.repo_mgr = repo_mgr; this.js_wkr = js_wkr; this.hpg = hpg; this.imgs = imgs; this.exec_tid = exec_tid; } public String Name() {return "xowa.load_imgs";} @@ -109,28 +109,19 @@ public class Xof_file_wkr implements Gfo_thread_wkr { } private static void Save_bin(Xof_fsdb_itm itm, Fsm_mnt_mgr mnt_mgr) { Io_url html_url = itm.Html_view_url(); - long bin_len = Io_mgr._.QueryFil(html_url).Size(); - gplx.ios.Io_stream_rdr bin_rdr = gplx.ios.Io_stream_rdr_.file_(html_url); + long rdr_len = Io_mgr._.QueryFil(html_url).Size(); + Io_stream_rdr rdr = gplx.ios.Io_stream_rdr_.file_(html_url); try { - bin_rdr.Open(); - mnt_mgr.Txn_open(); - if (itm.Lnki_ext().Id_is_thumbable_img()) { - if (itm.File_is_orig()) - mnt_mgr.Img_insert(itm.Orig_repo_name(), itm.Lnki_ttl(), itm.Lnki_ext().Id(), itm.Html_w(), itm.Html_h(), Fsd_thm_tbl.Modified_null, Fsd_thm_tbl.Hash_null, bin_len, bin_rdr); - else - mnt_mgr.Thm_insert(itm.Orig_repo_name(), itm.Lnki_ttl(), itm.Lnki_ext().Id(), itm.Html_w(), itm.Html_h(), itm.Lnki_time(), itm.Lnki_page(), Fsd_thm_tbl.Modified_null, Fsd_thm_tbl.Hash_null, bin_len, bin_rdr); - } - else { - if (itm.Lnki_ext().Id_is_video() && !itm.File_is_orig()) // insert as thumbnail - mnt_mgr.Thm_insert(itm.Orig_repo_name(), itm.Lnki_ttl(), itm.Lnki_ext().Id(), itm.Html_w(), itm.Html_h(), itm.Lnki_time(), itm.Lnki_page(), Fsd_thm_tbl.Modified_null, Fsd_thm_tbl.Hash_null, bin_len, bin_rdr); - else - mnt_mgr.Fil_insert(itm.Orig_repo_name(), itm.Lnki_ttl(), itm.Lnki_ext().Id(), Fsd_thm_tbl.Modified_null, Fsd_thm_tbl.Hash_null, bin_len, bin_rdr); - } - mnt_mgr.Txn_save(); + rdr.Open(); + Fsm_mnt_itm mnt_itm = mnt_mgr.Mnts__get_insert(); + Fsm_atr_fil atr_fil = mnt_itm.Atr_mgr().Db__core(); + Fsm_bin_fil bin_fil = mnt_itm.Bin_mgr().Dbs__get_nth(); + Xof_bin_updater bin_updater = new Xof_bin_updater(); + bin_updater.Save_bin(mnt_itm, atr_fil, bin_fil, itm, rdr, rdr_len); } catch (Exception e) { - Xoa_app_.Usr_dlg().Warn_many("", "", "failed to save file: ttl=~{0} url=~{1} err=~{2}", String_.new_utf8_(itm.Lnki_ttl()), html_url.Raw(), Err_.Message_gplx(e)); + Xoa_app_.Usr_dlg().Warn_many("", "", "failed to save file: ttl=~{0} url=~{1} err=~{2}", itm.Lnki_ttl(), html_url.Raw(), Err_.Message_gplx(e)); } - finally {bin_rdr.Rls();} + finally {rdr.Rls();} } } diff --git a/400_xowa/src/gplx/xowa/files/Xof_lnki_file_mgr.java b/400_xowa/src/gplx/xowa/files/Xof_lnki_file_mgr.java index 0058e86ee..3ee61c5fc 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_lnki_file_mgr.java +++ b/400_xowa/src/gplx/xowa/files/Xof_lnki_file_mgr.java @@ -30,9 +30,9 @@ public class Xof_lnki_file_mgr { try { if (page_init_needed) { page_init_needed = false; - wiki.File_mgr().Fsdb_mgr().Init_by_wiki(wiki); // NOTE: fsdb_mgr may not be init'd for wiki; assert that that it is + wiki.File_mgr().Init_file_mgr_by_load(wiki); // NOTE: fsdb_mgr may not be init'd for wiki; assert that that it is Make_fsdb_list(page.Lnki_list(), wiki.File_mgr().Patch_upright()); // NOTE: Patch_upright check must occur after Init_by_wiki; DATE:2014-05-31 - wiki.File_mgr().Fsdb_mgr().Orig_mgr().Find_by_list(orig_regy, fsdb_list, exec_tid); + wiki.File_mgr__orig_mgr().Find_by_list(orig_regy, fsdb_list, exec_tid); Make_fsdb_hash(); } Xof_fsdb_itm fsdb = (Xof_fsdb_itm)fsdb_hash.Fetch(xfer.Lnki_ttl()); diff --git a/400_xowa/src/gplx/xowa/files/Xof_mime_minor_.java b/400_xowa/src/gplx/xowa/files/Xof_mime_minor_.java index 047c464e1..91721fb8f 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_mime_minor_.java +++ b/400_xowa/src/gplx/xowa/files/Xof_mime_minor_.java @@ -30,24 +30,25 @@ public class Xof_mime_minor_ { private static final HashAdp mime_hash = mime_hash_(); private static HashAdp mime_hash_() { HashAdp rv = HashAdp_.new_bry_(); - mime_hash_itm_(rv, Xof_ext_.Bry_png, Xof_ext_.Id_png); - mime_hash_itm_(rv, Xof_ext_.Bry_jpg, Xof_ext_.Id_jpg); - mime_hash_itm_(rv, Xof_ext_.Bry_jpeg, Xof_ext_.Id_jpeg); - mime_hash_itm_(rv, Xof_ext_.Bry_gif, Xof_ext_.Id_gif); - mime_hash_itm_(rv, Xof_ext_.Bry_tif, Xof_ext_.Id_tif); - mime_hash_itm_(rv, Xof_ext_.Bry_tiff, Xof_ext_.Id_tiff); - mime_hash_itm_(rv, Mime_svg, Xof_ext_.Id_svg); - mime_hash_itm_(rv, Mime_djvu, Xof_ext_.Id_djvu); - mime_hash_itm_(rv, Xof_ext_.Bry_pdf, Xof_ext_.Id_pdf); - mime_hash_itm_(rv, Mime_midi, Xof_ext_.Id_mid); - mime_hash_itm_(rv, Xof_ext_.Bry_ogg, Xof_ext_.Id_ogg); - mime_hash_itm_(rv, Xof_ext_.Bry_oga, Xof_ext_.Id_oga); - mime_hash_itm_(rv, Xof_ext_.Bry_ogv, Xof_ext_.Id_ogv); - mime_hash_itm_(rv, Xof_ext_.Bry_webm, Xof_ext_.Id_webm); - mime_hash_itm_(rv, Mime_flac, Xof_ext_.Id_flac); - mime_hash_itm_(rv, Mime_bmp, Xof_ext_.Id_bmp); - mime_hash_itm_(rv, Mime_bmp_2, Xof_ext_.Id_bmp); - mime_hash_itm_(rv, Mime_xcf, Xof_ext_.Id_xcf); + mime_hash_itm_(rv, Xof_ext_.Bry_png , Xof_ext_.Id_png); + mime_hash_itm_(rv, Xof_ext_.Bry_jpg , Xof_ext_.Id_jpg); + mime_hash_itm_(rv, Xof_ext_.Bry_jpeg , Xof_ext_.Id_jpeg); + mime_hash_itm_(rv, Xof_ext_.Bry_gif , Xof_ext_.Id_gif); + mime_hash_itm_(rv, Xof_ext_.Bry_tif , Xof_ext_.Id_tif); + mime_hash_itm_(rv, Xof_ext_.Bry_tiff , Xof_ext_.Id_tiff); + mime_hash_itm_(rv, Mime_svg , Xof_ext_.Id_svg); + mime_hash_itm_(rv, Mime_djvu , Xof_ext_.Id_djvu); + mime_hash_itm_(rv, Xof_ext_.Bry_pdf , Xof_ext_.Id_pdf); + mime_hash_itm_(rv, Mime_midi , Xof_ext_.Id_mid); + mime_hash_itm_(rv, Xof_ext_.Bry_ogg , Xof_ext_.Id_ogg); + mime_hash_itm_(rv, Xof_ext_.Bry_oga , Xof_ext_.Id_oga); + mime_hash_itm_(rv, Xof_ext_.Bry_ogv , Xof_ext_.Id_ogv); + mime_hash_itm_(rv, Xof_ext_.Bry_webm , Xof_ext_.Id_webm); + mime_hash_itm_(rv, Mime_flac , Xof_ext_.Id_flac); + mime_hash_itm_(rv, Mime_bmp , Xof_ext_.Id_bmp); + mime_hash_itm_(rv, Mime_bmp_2 , Xof_ext_.Id_bmp); + mime_hash_itm_(rv, Mime_xcf , Xof_ext_.Id_xcf); + mime_hash_itm_(rv, Xof_ext_.Bry_wav , Xof_ext_.Id_wav); return rv; } private static void mime_hash_itm_(HashAdp hash, byte[] key, int val) {hash.Add(key, Int_obj_val.new_(val));} diff --git a/400_xowa/src/gplx/xowa/files/Xog_redlink_thread.java b/400_xowa/src/gplx/xowa/files/Xog_redlink_thread.java new file mode 100644 index 000000000..232335353 --- /dev/null +++ b/400_xowa/src/gplx/xowa/files/Xog_redlink_thread.java @@ -0,0 +1,31 @@ +/* +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 . +*/ +package gplx.xowa.files; import gplx.*; import gplx.xowa.*; +import gplx.threads.*; import gplx.xowa.files.gui.*; +public class Xog_redlink_thread implements Gfo_thread_wkr { + private final int[] redlink_ary; private final Xog_js_wkr js_wkr; + public Xog_redlink_thread(int[] redlink_ary, Xog_js_wkr js_wkr) {this.redlink_ary = redlink_ary; this.js_wkr = js_wkr;} + public String Name() {return "xowa.gui.html.redlinks.set";} + public boolean Resume() {return true;} + public void Exec() { + int len = redlink_ary.length; + for (int i = 0; i < len; ++i) { + js_wkr.Html_redlink(gplx.xowa.parsers.lnkis.redlinks.Xopg_redlink_lnki_list.Lnki_id_prefix + Int_.Xto_str(redlink_ary[i])); + } + } +} diff --git a/400_xowa/src/gplx/xowa/files/Xow_file_mgr.java b/400_xowa/src/gplx/xowa/files/Xow_file_mgr.java index 190c246fb..dc3cabd16 100644 --- a/400_xowa/src/gplx/xowa/files/Xow_file_mgr.java +++ b/400_xowa/src/gplx/xowa/files/Xow_file_mgr.java @@ -17,16 +17,18 @@ along with this program. If not, see . */ package gplx.xowa.files; import gplx.*; import gplx.xowa.*; import gplx.dbs.*; import gplx.dbs.cfgs.*; -import gplx.xowa.files.repos.*; import gplx.xowa.files.fsdb.*; import gplx.fsdb.meta.*; import gplx.xowa.files.origs.*; -public class Xow_file_mgr implements GfoInvkAble { +import gplx.xowa.files.repos.*; import gplx.xowa.files.origs.*; +import gplx.fsdb.*; import gplx.fsdb.meta.*; import gplx.xowa.files.fsdb.*; +public class Xow_file_mgr implements GfoInvkAble { private Xof_wkr_mgr wkr_mgr; public Xow_file_mgr(Xowe_wiki wiki) { this.wiki = wiki; repo_mgr = new Xowe_repo_mgr(wiki); meta_mgr = new Xof_meta_mgr(wiki); - fsdb_mgr = new Xof_fsdb_mgr__sql(); wkr_mgr = new Xof_wkr_mgr(this); } + public Fsdb_db_mgr Db_core() {return db_core;} private Fsdb_db_mgr db_core; + public Xof_orig_mgr Orig_mgr() {return orig_mgr;} private final Xof_orig_mgr orig_mgr = new Xof_orig_mgr(); public Xof_fsdb_mode Fsdb_mode() { if (fsdb_mode == null) { Version(); @@ -37,7 +39,7 @@ public class Xow_file_mgr implements GfoInvkAble { public byte Version() { if (version == Bool_.__byte) { Io_url file_dir = wiki.Fsys_mgr().File_dir(); - if (!Io_mgr._.ExistsFil(file_dir.GenSubFil(Fsm_mnt_mgr.Mnt_name))) { + if (!Io_mgr._.ExistsFil(file_dir.GenSubFil(Fsdb_db_mgr__v1.Mnt_name))) { version = Version_1; fsdb_mode = Xof_fsdb_mode.new_wmf(); } @@ -68,23 +70,23 @@ public class Xow_file_mgr implements GfoInvkAble { public Xof_cfg_download Cfg_download() {return cfg_download;} private Xof_cfg_download cfg_download = new Xof_cfg_download(); public void Cfg_set(String grp, String key, String val) { // TEST: should only be called by tests if (test_grps == null) test_grps = HashAdp_.new_(); - Db_cfg_grp grp_itm = (Db_cfg_grp)test_grps.Fetch(grp); + Db_cfg_hash grp_itm = (Db_cfg_hash)test_grps.Fetch(grp); if (grp_itm == null) { - grp_itm = new Db_cfg_grp(grp); + grp_itm = new Db_cfg_hash(grp); test_grps.Add(grp, grp_itm); } - grp_itm.Upsert(key, val); + grp_itm.Set(key, val); } private HashAdp test_grps; - public Db_cfg_grp Cfg_get(String grp) { + public Db_cfg_hash Cfg_get(String grp) { if (test_grps != null) { - Db_cfg_grp rv = (Db_cfg_grp)test_grps.Fetch(grp); - return rv == null ? Db_cfg_grp.Null : rv; + Db_cfg_hash rv = (Db_cfg_hash)test_grps.Fetch(grp); + return rv == null ? new Db_cfg_hash("") : rv; } - if (this.Version() == Version_1) return Db_cfg_grp.Null; - fsdb_mgr.Init_by_wiki(wiki); // make sure fsdb is init'd - return fsdb_mgr.Mnt_mgr().Mnts__at(0).Cfg_mgr().Grps_get_or_load(grp); + if (this.Version() == Version_1) return new Db_cfg_hash(""); + this.Init_file_mgr_by_load(wiki); // make sure fsdb is init'd + return fsdb_mgr.Mnt_mgr().Mnts__get_main().Cfg_mgr().Grps_get_or_load(grp); } - public Xof_fsdb_mgr Fsdb_mgr() {return fsdb_mgr;} private Xof_fsdb_mgr fsdb_mgr; + public Xof_fsdb_mgr Fsdb_mgr() {return fsdb_mgr;} private Xof_fsdb_mgr fsdb_mgr = new Xof_fsdb_mgr__sql(); public boolean Find_meta(Xof_xfer_itm xfer_itm) { xfer_itm.Trg_repo_idx_(Xof_meta_itm.Repo_unknown); byte[] xfer_itm_ttl = xfer_itm.Lnki_ttl(); @@ -109,7 +111,16 @@ public class Xow_file_mgr implements GfoInvkAble { return meta.Orig_exists() == Bool_.Y_byte || meta.Thumbs().length != 0; } else - return fsdb_mgr.Orig_mgr().Find_by_ttl_or_null(ttl_bry) != Xof_orig_itm.Null; + return orig_mgr.Find_by_ttl_or_null(ttl_bry) != Xof_orig_itm.Null; + } + public void Init_file_mgr_by_load(Xow_wiki wiki) { + if (db_core != null) return; // already init'd + this.db_core = Fsdb_db_mgr_.new_detect(wiki.Domain_str(), wiki.Fsys_mgr().Root_dir(), wiki.Fsys_mgr().File_dir()); + if (db_core == null ) return; // no fsdb_core found; exit + this.version = Version_2; + this.fsdb_mode = Xof_fsdb_mode.new_view(); + orig_mgr.Init_by_wiki(fsdb_mode, db_core.File__orig_tbl_ary(), wiki.Domain_bry(), wiki.App().Wmf_mgr().Download_wkr(), wiki.File_mgr__repo_mgr(), Xof_url_bldr.new_v2_()); + fsdb_mgr.Init_by_wiki(wiki); } public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { diff --git a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_mgr.java b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_mgr.java index 3ddd06b1c..97364965c 100644 --- a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_mgr.java +++ b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_mgr.java @@ -20,20 +20,37 @@ import gplx.core.primitives.*; import gplx.ios.*; import gplx.fsdb.meta.*; import gplx.xowa.files.repos.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.files.cnvs.*; import gplx.xowa.files.caches.*; import gplx.xowa.wmfs.*; -public class Xof_bin_mgr implements GfoInvkAble { - private final Gfo_usr_dlg usr_dlg; private final Fsm_mnt_mgr mnt_mgr; private final Xow_repo_mgr repo_mgr; private final Xof_cache_mgr cache_mgr; private final Xowmf_mgr wmf_mgr; private final Xof_url_bldr url_bldr; - private Xof_bin_wkr[] wkrs; private int wkrs_len; +public class Xof_bin_mgr { + private final Fsm_mnt_mgr mnt_mgr; + private final Gfo_usr_dlg usr_dlg; private final Xow_repo_mgr repo_mgr; private final Xof_cache_mgr cache_mgr; private final Xof_url_bldr url_bldr = Xof_url_bldr.new_v2_(); + private Xof_bin_wkr[] wkrs = Xof_bin_wkr_.Ary_empty; private int wkrs_len; private final String_obj_ref resize_warning = String_obj_ref.null_(); private final Xof_img_size tmp_size = new Xof_img_size(); - public Xof_bin_mgr(Fsm_mnt_mgr mnt_mgr, Xow_repo_mgr repo_mgr, Xof_cache_mgr cache_mgr, Xowmf_mgr wmf_mgr, Xof_url_bldr url_bldr) { - this.mnt_mgr = mnt_mgr; this.repo_mgr = repo_mgr; this.cache_mgr = cache_mgr; this.wmf_mgr = wmf_mgr; this.url_bldr = url_bldr; - this.usr_dlg = Gfo_usr_dlg_._; - Wkrs__clear(); + public Xof_bin_mgr(Fsm_mnt_mgr mnt_mgr, Xow_repo_mgr repo_mgr, Xof_cache_mgr cache_mgr, Xof_img_wkr_resize_img resize_wkr) { + this.mnt_mgr = mnt_mgr; this.repo_mgr = repo_mgr; this.cache_mgr = cache_mgr; + this.usr_dlg = Gfo_usr_dlg_.I; + this.Resizer_(resize_wkr); } public void Resizer_(Xof_img_wkr_resize_img v) {resizer = v;} private Xof_img_wkr_resize_img resizer; - public void Init_by_wiki(Xof_img_wkr_resize_img resize_wkr) { - this.Wkrs__get_or_new(Xof_bin_wkr_.Key_fsdb_wiki); - this.Wkrs__get_or_new(Xof_bin_wkr_.Key_http_wmf); - this.Resizer_(resize_wkr); + public void Wkrs__del(String key) { + ListAdp list = ListAdp_.new_(); + for (Xof_bin_wkr wkr : wkrs) { + if (String_.Eq(key, wkr.Key())) continue; + list.Add(wkr); + } + this.wkrs = (Xof_bin_wkr[])list.Xto_ary(Xof_bin_wkr.class); + this.wkrs_len = wkrs.length; + } + public void Wkrs__add(Xof_bin_wkr v) { + this.wkrs = (Xof_bin_wkr[])Array_.Resize_add_one(wkrs, wkrs_len, v); + ++this.wkrs_len; + } + public Xof_bin_wkr Wkrs__get_or_null(String key) { + byte tid = Xof_bin_wkr_.X_key_to_tid(key); + for (int i = 0; i < wkrs_len; ++i) { + Xof_bin_wkr wkr = wkrs[i]; + if (wkr.Tid() == tid) return wkr; + } + return null; } public boolean Find_to_url_as_bool(byte exec_tid, Xof_fsdb_itm itm) {return Find_to_url(exec_tid, itm) != Io_url_.Null;} private Io_url Find_to_url(byte exec_tid, Xof_fsdb_itm itm) { @@ -95,41 +112,4 @@ public class Xof_bin_mgr implements GfoInvkAble { itm.File_resized_y_(); return rv; } - public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_add)) return Wkrs__get_or_new(m.ReadStr("type"), m.ReadStrOr("key", null)); - else return GfoInvkAble_.Rv_unhandled; - } private static final String Invk_add = "add"; - public void Wkrs__clear() {this.wkrs = Xof_bin_wkr_.Ary_empty; this.wkrs_len = 0;} - public Xof_bin_wkr Wkrs__get_or_new(String type) {return Wkrs__get_or_new(type, null);} - private Xof_bin_wkr Wkrs__get_or_new(String type, String key) { - if (key == null) key = type; // default empty key to type; EX: add('xowa.http.wmf') -> add('xowa.http.wmf', 'xowa.http.wmf') - Xof_bin_wkr rv = Wkrs__get_or_null(key); - if (rv == null) { - rv = Wkrs__new(type); - Wkrs__add(rv); - } - return rv; - } - public void Wkrs__add(Xof_bin_wkr v) {Wkrs__add_many(v);} - private void Wkrs__add_many(Xof_bin_wkr... v) { - wkrs = (Xof_bin_wkr[])Array_.Resize_add(wkrs, v); - wkrs_len += v.length; - } - private Xof_bin_wkr Wkrs__get_or_null(String key) { - int wkrs_len = wkrs.length; - byte tid = Xof_bin_wkr_.X_key_to_tid(key); - for (int i = 0; i < wkrs_len; ++i) { - Xof_bin_wkr wkr = wkrs[i]; - if (wkr.Tid() == tid) return wkr; - } - return null; - } - private Xof_bin_wkr Wkrs__new(String type) { - Xof_bin_wkr rv = null; - if (String_.Eq(type, Xof_bin_wkr_.Key_fsdb_wiki)) rv = new Xof_bin_wkr__fsdb_sql(mnt_mgr); - else if (String_.Eq(type, Xof_bin_wkr_.Key_fsys_wmf)) rv = new Xof_bin_wkr__fsys_wmf(); - else if (String_.Eq(type, Xof_bin_wkr_.Key_http_wmf)) rv = new Xof_bin_wkr__http_wmf(repo_mgr, wmf_mgr.Download_wkr().Download_xrg()); - else throw Err_.unhandled(type); - return rv; - } } diff --git a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr.java b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr.java index d2277e3e8..802e3a35b 100644 --- a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr.java +++ b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr.java @@ -18,8 +18,9 @@ along with this program. If not, see . package gplx.xowa.files.bins; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.ios.*; import gplx.xowa.files.fsdb.*; -public interface Xof_bin_wkr extends GfoInvkAble { +public interface Xof_bin_wkr { byte Tid(); + String Key(); boolean Resize_allowed(); void Resize_allowed_(boolean v); Io_stream_rdr Get_as_rdr (Xof_fsdb_itm itm, boolean is_thumb, int w); boolean Get_to_fsys (Xof_fsdb_itm itm, boolean is_thumb, int w, Io_url bin_url); diff --git a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__fsdb_sql.java b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__fsdb_sql.java index 1c2f60c98..61120e3e0 100644 --- a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__fsdb_sql.java +++ b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__fsdb_sql.java @@ -17,25 +17,26 @@ along with this program. If not, see . */ package gplx.xowa.files.bins; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.core.primitives.*; import gplx.dbs.*; import gplx.ios.*; import gplx.cache.*; import gplx.xowa.files.fsdb.*; -import gplx.fsdb.data.*; import gplx.fsdb.meta.*; -public class Xof_bin_wkr__fsdb_sql implements Xof_bin_wkr, GfoInvkAble { +import gplx.fsdb.*; import gplx.fsdb.data.*; import gplx.fsdb.meta.*; +public class Xof_bin_wkr__fsdb_sql implements Xof_bin_wkr { private final Int_obj_ref tmp_itm_id = Int_obj_ref.neg1_(), tmp_bin_id = Int_obj_ref.neg1_(), tmp_mnt_id = Int_obj_ref.neg1_(); - private final Fsm_mnt_mgr mnt_mgr; - public Xof_bin_wkr__fsdb_sql(Fsm_mnt_mgr mnt_mgr) {this.mnt_mgr = mnt_mgr;} + Xof_bin_wkr__fsdb_sql(Fsm_mnt_mgr mnt_mgr) {this.mnt_mgr = mnt_mgr;} public byte Tid() {return Xof_bin_wkr_.Tid_fsdb_xowa;} + public String Key() {return Xof_bin_wkr_.Key_fsdb_wiki;} + public Fsm_mnt_mgr Mnt_mgr() {return mnt_mgr;} private final Fsm_mnt_mgr mnt_mgr; public boolean Resize_allowed() {return bin_wkr_resize;} public void Resize_allowed_(boolean v) {bin_wkr_resize = v;} private boolean bin_wkr_resize = false; public Io_stream_rdr Get_as_rdr(Xof_fsdb_itm itm, boolean is_thumb, int w) { Find_ids(itm, is_thumb, w, tmp_itm_id, tmp_bin_id, tmp_mnt_id); - int bin_db_id = tmp_bin_id.Val(); if (bin_db_id == Fsd_bin_tbl.Null_db_bin_id) return gplx.ios.Io_stream_rdr_.Null; + int bin_db_id = tmp_bin_id.Val(); if (bin_db_id == Fsd_bin_tbl.Bin_db_id_null) return gplx.ios.Io_stream_rdr_.Null; Fsm_bin_fil bin_db = mnt_mgr.Bins__at(tmp_mnt_id.Val(), bin_db_id); - return bin_db.Get_as_rdr(tmp_itm_id.Val()); + return bin_db.Select_as_rdr(tmp_itm_id.Val()); } public boolean Get_to_fsys(Xof_fsdb_itm itm, boolean is_thumb, int w, Io_url bin_url) {return Get_to_fsys(itm.Orig_repo_name(), itm.Lnki_ttl(), itm.Lnki_md5(), itm.Lnki_ext(), is_thumb, w, itm.Lnki_time(), itm.Lnki_page(), bin_url);} private boolean Get_to_fsys(byte[] orig_repo, byte[] orig_ttl, byte[] orig_md5, Xof_ext orig_ext, boolean lnki_is_thumb, int file_w, double lnki_time, int lnki_page, Io_url file_url) { Find_ids(orig_repo, orig_ttl, orig_ext.Id(), lnki_time, lnki_page, lnki_is_thumb, file_w, tmp_itm_id, tmp_bin_id, tmp_mnt_id); - int bin_db_id = tmp_bin_id.Val(); if (bin_db_id == Fsd_bin_tbl.Null_db_bin_id) return false; + int bin_db_id = tmp_bin_id.Val(); if (bin_db_id == Fsd_bin_tbl.Bin_db_id_null) return false; Fsm_bin_fil bin_db = mnt_mgr.Bins__at(tmp_mnt_id.Val(), bin_db_id); - return bin_db.Get_to_url(tmp_itm_id.Val(), file_url); + return bin_db.Select_to_url(tmp_itm_id.Val(), file_url); } private void Find_ids(Xof_fsdb_itm itm, boolean is_thumb, int w, Int_obj_ref tmp_itm_id, Int_obj_ref tmp_bin_id, Int_obj_ref tmp_mnt_id) {Find_ids(itm.Orig_repo_name(), itm.Lnki_ttl(), itm.Lnki_ext().Id(), itm.Lnki_time(), itm.Lnki_page(), is_thumb, w, tmp_itm_id, tmp_bin_id, tmp_mnt_id);} private void Find_ids(byte[] orig_repo, byte[] orig_ttl, int orig_ext, double lnki_time, int lnki_page, boolean is_thumb, int w, Int_obj_ref tmp_itm_id, Int_obj_ref tmp_bin_id, Int_obj_ref tmp_mnt_id) { @@ -45,23 +46,40 @@ public class Xof_bin_wkr__fsdb_sql implements Xof_bin_wkr, GfoInvkAble { if (is_thumb) { Fsd_thm_itm thm_itm = Fsd_thm_itm.new_(); thm_itm.Init_by_req(w, lnki_time, lnki_page); - boolean found = mnt_mgr.Thm_select_bin(dir, fil, thm_itm); - tmp_itm_id.Val_(thm_itm.Id()); - tmp_bin_id.Val_(found ? thm_itm.Db_bin_id() : Fsd_bin_tbl.Null_db_bin_id); + boolean found = Select_thm_bin(thm_itm, dir, fil); + tmp_itm_id.Val_(thm_itm.Thm_id()); + tmp_bin_id.Val_(found ? thm_itm.Db_bin_id() : Fsd_bin_tbl.Bin_db_id_null); tmp_mnt_id.Val_(thm_itm.Mnt_id()); } else { - Fsd_fil_itm fil_itm = mnt_mgr.Fil_select_bin(dir, fil, is_thumb, w, time); - tmp_itm_id.Val_(fil_itm.Id()); - tmp_bin_id.Val_(fil_itm.Db_bin_id()); + Fsd_fil_itm fil_itm = Select_fil_bin(dir, fil, is_thumb, w, time); + if (fil_itm == Fsd_fil_itm.Null) return; + tmp_itm_id.Val_(fil_itm.Fil_id()); + tmp_bin_id.Val_(fil_itm.Bin_db_id()); tmp_mnt_id.Val_(fil_itm.Mnt_id()); } } } - public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.MatchIn(k, Invk_url_)) mnt_mgr.Init_by_wiki(m.ReadIoUrl("v"), Bool_.Y); - else return GfoInvkAble_.Rv_unhandled; - return this; - } private static final String Invk_url_ = "url_"; -} - + private Fsd_fil_itm Select_fil_bin(byte[] dir, byte[] fil, boolean is_thumb, int width, double thumbtime) { + int len = mnt_mgr.Mnts__len(); + for (int i = 0; i < len; i++) { + Fsd_fil_itm rv = mnt_mgr.Mnts__get_at(i).Select_fil_or_null(dir, fil, is_thumb, width, thumbtime); + if ( rv != Fsd_fil_itm.Null + && rv.Bin_db_id() != Fsd_bin_tbl.Bin_db_id_null) { // NOTE: mnt_0 can have thumb, but mnt_1 can have itm; check for itm with Db_bin_id; DATE:2013-11-16 + return rv; + } + } + return Fsd_fil_itm.Null; + } + private boolean Select_thm_bin(Fsd_thm_itm rv, byte[] dir, byte[] fil) { + int len = mnt_mgr.Mnts__len(); + for (int i = 0; i < len; i++) { + boolean exists = mnt_mgr.Mnts__get_at(i).Select_thm(rv, dir, fil); + if (exists) return true; + } + return false; + } + public void Txn_bgn() {mnt_mgr.Mnts__get_insert().Txn_bgn();} + public void Txn_end() {mnt_mgr.Mnts__get_insert().Txn_end();} + public static Xof_bin_wkr__fsdb_sql new_(Fsm_mnt_mgr mnt_mgr) {return new Xof_bin_wkr__fsdb_sql(mnt_mgr);} +} diff --git a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__fsys_base.java b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__fsys_base.java index 595c4aadb..e39bde78c 100644 --- a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__fsys_base.java +++ b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__fsys_base.java @@ -21,6 +21,7 @@ import gplx.xowa.files.fsdb.*; import gplx.xowa.files.repos.*; public abstract class Xof_bin_wkr__fsys_base implements Xof_bin_wkr, GfoInvkAble { public Xof_bin_wkr__fsys_base() {} public abstract byte Tid(); + public abstract String Key(); public boolean Resize_allowed() {return resize_allowed;} public void Resize_allowed_(boolean v) {resize_allowed = v;} private boolean resize_allowed = false; public Io_stream_rdr Get_as_rdr(Xof_fsdb_itm itm, boolean is_thumb, int w) { byte mode = is_thumb ? Xof_repo_itm.Mode_thumb : Xof_repo_itm.Mode_orig; @@ -55,12 +56,14 @@ abstract class Xof_bin_wkr__fsys_wmf_base extends Xof_bin_wkr__fsys_base { } class Xof_bin_wkr__fsys_wmf extends Xof_bin_wkr__fsys_wmf_base { @Override public byte Tid() {return Xof_bin_wkr_.Tid_fsys_wmf;} + @Override public String Key() {return Xof_bin_wkr_.Key_fsys_wmf;} @Override public void Init_by_root() { this.Url_bldr().Init_by_root(Bry_.Empty, Op_sys.Cur().Fsys_dir_spr_byte(), Bool_.Y, Bool_.Y, Xof_repo_itm.Dir_depth_wmf); } } class Xof_bin_wkr__fsys_xowa extends Xof_bin_wkr__fsys_wmf_base { @Override public byte Tid() {return Xof_bin_wkr_.Tid_fsys_xowa;} + @Override public String Key() {return Xof_bin_wkr_.Key_fsys_xowa;} @Override public void Init_by_root() { this.Url_bldr().Init_by_root(Bry_.Empty, Op_sys.Cur().Fsys_dir_spr_byte(), Bool_.N, Bool_.N, Xof_repo_itm.Dir_depth_xowa); } diff --git a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__http_wmf.java b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__http_wmf.java index e09865d83..a38c370c3 100644 --- a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__http_wmf.java +++ b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__http_wmf.java @@ -22,6 +22,7 @@ public class Xof_bin_wkr__http_wmf implements Xof_bin_wkr { private final Xof_url_bldr url_bldr = new Xof_url_bldr(); public Xof_bin_wkr__http_wmf(Xow_repo_mgr repo_mgr, gplx.ios.IoEngine_xrg_downloadFil download_wkr) {this.repo_mgr = repo_mgr; this.download_wkr = download_wkr;} public byte Tid() {return Xof_bin_wkr_.Tid_http_wmf;} + public String Key() {return Xof_bin_wkr_.Key_http_wmf;} public boolean Resize_allowed() {return bin_wkr_resize;} public void Resize_allowed_(boolean v) {bin_wkr_resize = v;} private boolean bin_wkr_resize = true; public int Fail_timeout() {return fail_timeout;} public Xof_bin_wkr__http_wmf Fail_timeout_(int v) {fail_timeout = v; return this;} private int fail_timeout = 0; // NOTE: always default to 0; manually set to 1000 for fsdb_make only; DATE:2014-06-21 public Io_stream_rdr Get_as_rdr(Xof_fsdb_itm fsdb, boolean is_thumb, int w) { @@ -59,5 +60,5 @@ public class Xof_bin_wkr__http_wmf implements Xof_bin_wkr { else return GfoInvkAble_.Rv_unhandled; return this; } private static final String Invk_fail_timeout_ = "fail_timeout_"; - + public static Xof_bin_wkr__http_wmf new_(Xow_wiki wiki) {return new Xof_bin_wkr__http_wmf(wiki.File_mgr__repo_mgr(), wiki.App().Wmf_mgr().Download_wkr().Download_xrg());} } diff --git a/400_xowa/src/gplx/xowa/files/caches/Xofc_cache_itm.java b/400_xowa/src/gplx/xowa/files/caches/Xof_cache_itm.java similarity index 68% rename from 400_xowa/src/gplx/xowa/files/caches/Xofc_cache_itm.java rename to 400_xowa/src/gplx/xowa/files/caches/Xof_cache_itm.java index 786e27e34..e6c653f0b 100644 --- a/400_xowa/src/gplx/xowa/files/caches/Xofc_cache_itm.java +++ b/400_xowa/src/gplx/xowa/files/caches/Xof_cache_itm.java @@ -16,33 +16,23 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.files.caches; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; -class Xofc_cache_itm { - public Xofc_cache_itm - ( Bry_bfr lnki_key_bfr, int uid, byte db_state - , int lnki_wiki, byte[] lnki_ttl, int lnki_type, double lnki_upright, int lnki_w, int lnki_h, double lnki_time, int lnki_page +import gplx.dbs.*; +public class Xof_cache_itm { + public Xof_cache_itm + ( Bry_bfr lnki_key_bfr, byte db_state + , int lnki_site, byte[] lnki_ttl, int lnki_type, double lnki_upright, int lnki_w, int lnki_h, double lnki_time, int lnki_page , int orig_wiki, byte[] orig_ttl, int orig_ext, int file_w, int file_h, double file_time, int file_page , long temp_file_size, int temp_view_count, long temp_view_date, int temp_w ) { - this.uid = uid; this.db_state = db_state; - this.lnki_wiki = lnki_wiki; this.lnki_ttl = lnki_ttl; this.lnki_type = lnki_type; this.lnki_upright = lnki_upright; this.lnki_w = lnki_w; this.lnki_h = lnki_h; this.lnki_time = lnki_time; this.lnki_page = lnki_page; + this.db_state = db_state; + this.lnki_site = lnki_site; this.lnki_ttl = lnki_ttl; this.lnki_type = lnki_type; this.lnki_upright = lnki_upright; this.lnki_w = lnki_w; this.lnki_h = lnki_h; this.lnki_time = lnki_time; this.lnki_page = lnki_page; this.orig_wiki = orig_wiki; this.orig_ttl = orig_ttl; this.orig_ext = orig_ext; this.file_w = file_w; this.file_h = file_h; this.file_time = file_time; this.file_page = file_page; this.temp_file_size = temp_file_size; this.temp_view_count = temp_view_count; this.temp_view_date = temp_view_date; this.temp_w = temp_w; - lnki_key_bfr - .Add_int_variable(lnki_wiki).Add_byte_pipe() - .Add(lnki_ttl).Add_byte_pipe() - .Add_int_variable(lnki_type).Add_byte_pipe() - .Add_double(lnki_upright).Add_byte_pipe() - .Add_int_variable(lnki_w).Add_byte_pipe() - .Add_int_variable(lnki_h).Add_byte_pipe() - .Add_double(lnki_time).Add_byte_pipe() - .Add_int_variable(lnki_page) - ; - lnki_key = lnki_key_bfr.Xto_bry_and_clear(); + this.lnki_key = Key_gen(lnki_key_bfr, lnki_site, lnki_ttl, lnki_type, lnki_upright, lnki_w, lnki_h, lnki_time, lnki_page); } - public int Uid() {return uid;} private int uid; public byte Db_state() {return db_state;} public void Db_state_(byte v) {db_state = v;} private byte db_state; public byte[] Lnki_key() {return lnki_key;} private final byte[] lnki_key; - public int Lnki_wiki() {return lnki_wiki;} private final int lnki_wiki; + public int Lnki_site() {return lnki_site;} private final int lnki_site; public byte[] Lnki_ttl() {return lnki_ttl;} private final byte[] lnki_ttl; public int Lnki_type() {return lnki_type;} private final int lnki_type; public double Lnki_upright() {return lnki_upright;} private final double lnki_upright; @@ -61,5 +51,25 @@ class Xofc_cache_itm { public int Temp_view_count() {return temp_view_count;} private int temp_view_count; public long Temp_view_date() {return temp_view_date;} private long temp_view_date; public int Temp_w() {return temp_w;} private int temp_w; - public static final Xofc_cache_itm Null = null; + public boolean File_is_orig() {return file_is_orig;} public boolean file_is_orig; + public Io_url Temp_file_url() {return temp_file_url;} public Io_url temp_file_url; + public void Update_view_stats() { + ++temp_view_count; + temp_view_date = DateAdp_.Now().Timestamp_unix(); + db_state = Db_cmd_mode.To_update(db_state); + } + public static final Xof_cache_itm Null = null; + public static byte[] Key_gen(Bry_bfr key_bfr, int site, byte[] ttl, int type, double upright, int w, int h, double time, int page) { + key_bfr + .Add_int_variable(site).Add_byte_pipe() + .Add(ttl).Add_byte_pipe() + .Add_int_variable(type).Add_byte_pipe() + .Add_double(upright).Add_byte_pipe() + .Add_int_variable(w).Add_byte_pipe() + .Add_int_variable(h).Add_byte_pipe() + .Add_double(time).Add_byte_pipe() + .Add_int_variable(page) + ; + return key_bfr.Xto_bry_and_clear(); + } } diff --git a/400_xowa/src/gplx/xowa/files/caches/Xof_cache_mgr.java b/400_xowa/src/gplx/xowa/files/caches/Xof_cache_mgr.java index d3632ca6a..2b4b8a127 100644 --- a/400_xowa/src/gplx/xowa/files/caches/Xof_cache_mgr.java +++ b/400_xowa/src/gplx/xowa/files/caches/Xof_cache_mgr.java @@ -47,19 +47,6 @@ public class Xof_cache_mgr implements GfoInvkAble { fil_mgr.Cleanup(); } catch (Exception e) {usr_dlg.Warn_many("", "", "cache_mgr.term:fatal error: err=~{0}", Err_.Message_gplx_brief(e));} } - public Xofc_dir_itm Dir__get_or_make(byte[] dir) {return dir_mgr.Get_by_name_or_make(dir);} - public Xofc_fil_itm Fil__get_or_null(byte[] dir, byte[] ttl, boolean is_orig, int w, double time, int page) { - Xofc_dir_itm dir_itm = dir_mgr.Get_by_name_or_null(dir); if (dir_itm == null) return null; - return fil_mgr.Get_or_null(dir_itm.Id(), ttl, is_orig, w, time, page); - } - public Xofc_fil_itm Fil__make(byte[] dir, byte[] ttl, boolean is_orig, int w, int h, double time, int page, long size) { - Xofc_dir_itm dir_itm = dir_mgr.Get_by_name_or_make(dir); - return fil_mgr.Make_v2(dir_itm.Id(), ttl, is_orig, w, h, time, page, Xof_ext_.new_by_ttl_(ttl), size); - } - public void Fil__update(Xofc_fil_itm fil) { - fil.Cache_time_now_(); - if (fil.Cmd_mode() == Db_cmd_mode.Tid_create) cfg_mgr.Cache_len_add(fil.Size()); - } public Xofc_fil_itm Reg(Xof_fsdb_itm itm, long bin_len) {return this.Reg(itm.Orig_repo_name(), itm.Lnki_ttl(), itm.File_is_orig(), itm.File_w(), itm.File_w(), itm.Lnki_time(), itm.Lnki_ext(), bin_len, DateAdp_.MaxValue, "");} private Xofc_fil_itm Reg(byte[] repo, byte[] ttl, boolean fil_is_orig, int fil_w, int fil_h, double fil_thumbtime, Xof_ext ext, long bin_len, DateAdp modified, String hash) { int dir_id = dir_mgr.Get_by_name_or_make(repo).Id(); diff --git a/400_xowa/src/gplx/xowa/files/caches/Xof_cache_mgr2.java b/400_xowa/src/gplx/xowa/files/caches/Xof_cache_mgr2.java new file mode 100644 index 000000000..507edb04b --- /dev/null +++ b/400_xowa/src/gplx/xowa/files/caches/Xof_cache_mgr2.java @@ -0,0 +1,151 @@ +/* +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 . +*/ +package gplx.xowa.files.caches; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; +import gplx.core.primitives.*; import gplx.dbs.*; +import gplx.xowa.files.fsdb.*; import gplx.xowa2.files.*; import gplx.xowa.wikis.*; +public class Xof_cache_mgr2 { + private Xof_cache_tbl tbl; private final Bry_bfr key_bfr = Bry_bfr.reset_(512); + private final OrderedHash hash = OrderedHash_.new_bry_(); // private final Xof_url_bldr url_bldr = Xof_url_bldr.new_v2_(); + private Db_conn conn; private int site; + private long cache_size = -1, cache_min = Io_mgr.Len_mb * 75, cache_max = Io_mgr.Len_mb * 100; + public void Conn_(Db_conn conn, boolean created, int site) { + this.conn = conn; this.site = site; + this.tbl = new Xof_cache_tbl(conn); + if (created) tbl.Create_tbl(); + } + public Xof_cache_itm Get_or_null(Xof_fsdb_itm fsdb) {return Get_or_null(fsdb.Lnki_ttl(), fsdb.Lnki_type(), fsdb.Lnki_upright(), fsdb.Lnki_w(), fsdb.Lnki_h(), fsdb.Lnki_time(), fsdb.Lnki_page());} + public Xof_cache_itm Get_or_null(byte[] ttl, int type, double upright, int w, int h, double time, int page) { + synchronized (hash) { + byte[] key = Xof_cache_itm.Key_gen(key_bfr, site, ttl, type, upright, w, h, time, page); + Xof_cache_itm rv = (Xof_cache_itm)hash.Fetch(key); + if (rv == Xof_cache_itm.Null) { + rv = tbl.Select_one(site, ttl, type, upright, w, h, time, page); + if (rv == Xof_cache_itm.Null) return Xof_cache_itm.Null; + hash.Add(key, rv); + } + return rv; + } + } + public void Update(Xof_fsdb_itm fsdb) { + synchronized (hash) { + Xof_cache_itm itm = Get_or_null(fsdb.Lnki_ttl(), fsdb.Lnki_type(), fsdb.Lnki_upright(), fsdb.Lnki_w(), fsdb.Lnki_h(), fsdb.Lnki_time(), fsdb.Lnki_page()); + if (itm == Xof_cache_itm.Null) { + itm = new Xof_cache_itm(key_bfr, Db_cmd_mode.Tid_create, site, fsdb.Lnki_ttl(), fsdb.Lnki_type(), fsdb.Lnki_upright(), fsdb.Lnki_w(), fsdb.Lnki_h(), fsdb.Lnki_time(), fsdb.Lnki_page() + , fsdb.Orig_repo_id(), fsdb.Orig_ttl(), fsdb.Orig_ext(), fsdb.Orig_w(), fsdb.Orig_h() + , fsdb.Lnki_time(), fsdb.Lnki_page(), fsdb.Temp_file_size(), 1, DateAdp_.Now().Timestamp_unix(), fsdb.Temp_file_w()) + ; + hash.Add(itm.Lnki_key(), itm); + cache_size += itm.Temp_file_size(); + } + else + itm.Update_view_stats(); + } + } + public void Page_bgn() { + if (cache_size == -1) { + cache_size = tbl.Select_max_size(); + tbl.Select_all(key_bfr, hash); + } + } + public void Page_end() { // threaded + this.Db_save(); + if (cache_size > cache_max) this.Compress(cache_min); + } + private void Db_save() { + synchronized (hash) { + try { + conn.Txn_bgn(); + int len = hash.Count(); + for (int i = 0; i < len; ++i) { + Xof_cache_itm itm = (Xof_cache_itm)hash.FetchAt(i); + tbl.Db_save(itm); + } + conn.Txn_end(); + } + catch (Exception e) {conn.Txn_cxl(); throw Err_.err_(e);} + } + } + public long Compress(long cache_min) { + synchronized (hash) { + try { + Xoa_app_.Usr_dlg().Note_many("", "", "cache compress started"); + this.Db_save(); tbl.Select_all(key_bfr, hash); // save and load + hash.SortBy(Xof_cache_mgr_sorter.I); // sorts by cache_time desc + int len = hash.Count(); + long cache_size_actl = 0, cache_size_temp = 0; + ListAdp deleted = ListAdp_.new_(); + tbl.Conn().Txn_bgn(); + for (int i = 0; i < len; ++i) { // iterate over entire hash to figure out what to delete + Xof_cache_itm itm = (Xof_cache_itm)hash.FetchAt(i); + long itm_size = itm.Temp_file_size(); + cache_size_temp = cache_size_actl + itm_size; + if (cache_size_temp > cache_min) + deleted.Add(itm); + else + cache_size_actl = cache_size_temp; + } + len = deleted.Count(); + conn.Txn_bgn(); + for (int i = 0; i < len; i++) { // iterate over deleted and delete + Xof_cache_itm itm = (Xof_cache_itm)deleted.FetchAt(i); + hash.Del(itm.Lnki_key()); + itm.Db_state_(Db_cmd_mode.Tid_delete); + tbl.Db_save(itm); + Io_mgr._.DeleteFil(itm.Temp_file_url()); + cache_size -= itm.Temp_file_size(); + } + conn.Txn_end(); + Xoa_app_.Usr_dlg().Note_many("", "", "cache compress done"); + return cache_size_actl; + } + catch (Exception e) {Xoa_app_.Usr_dlg().Warn_many("", "", "failed to compress cache: err=~{0}", Err_.Message_gplx_brief(e)); return cache_min;} + finally {tbl.Conn().Txn_end();} + } + } +// private Io_url Calc_url(Xof_url_bldr url_bldr, Xoa_wiki_mgr wiki_mgr, Xof_cache_itm itm) { +// byte mode_id = itm.File_is_orig() ? gplx.xowa.files.repos.Xof_repo_itm.Mode_orig : gplx.xowa.files.repos.Xof_repo_itm.Mode_thumb; +// byte[] wiki_domain = Xow_domain_tid_.To_domain(itm.Lnki_site()).Domain_bry(); +// Xow_wiki wiki = wiki_mgr.Get_by_key_or_make(wiki_domain); +// gplx.xowa.files.repos.Xof_repo_itm trg_repo = wiki.File_mgr__repo_mgr().Repos_get_by_wiki(wiki_domain).Trg(); +// byte[] ttl = itm.Lnki_ttl(); +// byte[] md5 = Xof_xfer_itm_.Md5_(ttl); +// Xof_ext itm_ext = Xof_ext_.new_by_id_(itm.Orig_ext()); +// return url_bldr.Init_for_trg_file(mode_id, trg_repo, ttl, md5, itm_ext, itm.Temp_w() +// , Xof_lnki_time.Convert_to_xowa_thumbtime (itm_ext.Id(), itm.File_time()) +// , Xof_lnki_time.Convert_to_xowa_page (itm_ext.Id(), itm.File_page()) +// ).Xto_url(); +// } + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk_cache_min)) return cache_min / Io_mgr.Len_mb; + else if (ctx.Match(k, Invk_cache_min_)) cache_min = m.ReadLong("v") * Io_mgr.Len_mb; + else if (ctx.Match(k, Invk_cache_max)) return cache_max / Io_mgr.Len_mb; + else if (ctx.Match(k, Invk_cache_max_)) cache_max = m.ReadLong("v") * Io_mgr.Len_mb; + else if (ctx.Match(k, Invk_cache_compress)) this.Compress(cache_min); + else return GfoInvkAble_.Rv_unhandled; + return this; + } + private static final String Invk_cache_min = "cache_min", Invk_cache_min_ = "cache_min_", Invk_cache_max = "cache_max", Invk_cache_max_ = "cache_max_", Invk_cache_compress = "cache_compress"; +} +class Xof_cache_mgr_sorter implements gplx.lists.ComparerAble { + public int compare(Object lhsObj, Object rhsObj) { + Xof_cache_itm lhs = (Xof_cache_itm)lhsObj; + Xof_cache_itm rhs = (Xof_cache_itm)rhsObj; + return -Long_.Compare(lhs.Temp_view_date(), rhs.Temp_view_date()); // - for DESC sort + } + public static final Xof_cache_mgr_sorter I = new Xof_cache_mgr_sorter(); Xof_cache_mgr_sorter() {} +} diff --git a/400_xowa/src/gplx/xowa/files/caches/Xof_cache_mgr_tst.java b/400_xowa/src/gplx/xowa/files/caches/Xof_cache_mgr_tst.java new file mode 100644 index 000000000..ae29b7d39 --- /dev/null +++ b/400_xowa/src/gplx/xowa/files/caches/Xof_cache_mgr_tst.java @@ -0,0 +1,72 @@ +/* +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 . +*/ +package gplx.xowa.files.caches; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; +import org.junit.*; import gplx.dbs.*; +public class Xof_cache_mgr_tst { +// @Before public void init() {fxt.Reset();} private Xof_cache_mgr_fxt fxt = new Xof_cache_mgr_fxt(); + @Test public void Basic() { +// Xof_cache_itm itm = fxt.Bldr_itm("A.png").Make(); +// fxt.Test_get_n(itm); +// fxt.Exec_update(itm); +// fxt.Test_get_y(itm); +// fxt.Test_viewed_data(1, 123); +// fxt.Exec_update(itm); +// fxt.Test_viewed_data(2, 124); +// fxt.Exec_db_save(itm); +// fxt.Test_db_itms(itm); + } +} +// class Xof_cache_mgr_fxt { +// public Xof_cache_mgr_fxt Reset() { +// return this; +// } +// } +// class Xof_cache_itm_mkr { +//// private byte[] dir; private byte[] ttl; private boolean is_orig; private int w, h; private double time; private int page; private long size; +// private byte db_state; +// private int lnki_site; private byte[] lnki_ttl; private int lnki_type; private double lnki_upright; private int lnki_w; private int lnki_h; private double lnki_time; private int lnki_page; +// private int orig_wiki; private byte[] orig_ttl; private int orig_ext; private int file_w; private int file_h; private double file_time; private int file_page; +// private long temp_file_size; private int temp_view_count; private long temp_view_date; private int temp_w; +// private Bry_bfr key_bfr = Bry_bfr.new_(); +// public Xof_cache_itm_mkr() {this.Reset();} +// private void Reset() { +// db_state = Db_cmd_mode.Tid_ignore; +// lnki_site = orig_wiki = -1; +// lnki_ttl = orig_ttl = null; +// lnki_type = Byte_.Max_value_127; +// lnki_upright = Xof_img_size.Upright_null; +// lnki_w = lnki_h = file_w = file_h = temp_w = Xof_img_size.Size_null; +// lnki_time = file_time = Xof_lnki_time.Null; +// lnki_page = file_page = Xof_lnki_page.Null; +// orig_ext = Xof_ext_.Id_unknown; +// temp_file_size = -1; +// temp_view_count = -1; +// temp_view_date = -1; +// } +// public Xof_cache_itm_mkr Init(String dir_str, String ttl_str, boolean is_orig, int w) { +//// this.dir = Bry_.new_utf8_(dir_str); +//// this.ttl = Bry_.new_utf8_(ttl_str); +//// this.is_orig = is_orig; +//// this.w = w; +// return this; +// } +// public Xof_cache_itm Make() { +// return new Xof_cache_itm(key_bfr, db_state, lnki_site, lnki_ttl, lnki_type, lnki_upright, lnki_w, lnki_h, file_w, file_h, ); +// this.Reset(); +// } +// } diff --git a/400_xowa/src/gplx/xowa/files/caches/Xofc_cache_tbl.java b/400_xowa/src/gplx/xowa/files/caches/Xof_cache_tbl.java similarity index 54% rename from 400_xowa/src/gplx/xowa/files/caches/Xofc_cache_tbl.java rename to 400_xowa/src/gplx/xowa/files/caches/Xof_cache_tbl.java index 9d984c0db..1ffc1ad78 100644 --- a/400_xowa/src/gplx/xowa/files/caches/Xofc_cache_tbl.java +++ b/400_xowa/src/gplx/xowa/files/caches/Xof_cache_tbl.java @@ -17,20 +17,19 @@ along with this program. If not, see . */ package gplx.xowa.files.caches; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.dbs.*; -class Xofc_cache_tbl { +public class Xof_cache_tbl implements RlsAble { private String tbl_name = "user_file_cache"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private String - fld_uid - , fld_lnki_wiki, fld_lnki_ttl, fld_lnki_type, fld_lnki_upright, fld_lnki_w, fld_lnki_h, fld_lnki_time, fld_lnki_page + fld_lnki_site, fld_lnki_ttl, fld_lnki_type, fld_lnki_upright, fld_lnki_w, fld_lnki_h, fld_lnki_time, fld_lnki_page , fld_orig_wiki, fld_orig_ttl, fld_orig_ext, fld_file_w, fld_file_h, fld_file_time, fld_file_page , fld_temp_file_size, fld_temp_view_count, fld_temp_view_date, fld_temp_w ; - private Db_conn conn; private final Db_stmt_bldr stmt_bldr = new Db_stmt_bldr(); private Db_stmt select_stmt; + private final Db_conn conn; private final Db_stmt_bldr stmt_bldr = new Db_stmt_bldr(); private Db_stmt select_stmt; private final Bry_bfr lnki_key_bfr = Bry_bfr.reset_(255); - public void Conn_(Db_conn new_conn, boolean created) { - this.conn = new_conn; flds.Clear(); - fld_uid = flds.Add_int_pkey_autonum("uid"); - fld_lnki_wiki = flds.Add_int("lnki_wiki"); + public Db_conn Conn() {return conn;} + public Xof_cache_tbl(Db_conn conn) { + this.conn = conn; + fld_lnki_site = flds.Add_int("lnki_site"); fld_lnki_ttl = flds.Add_str("lnki_ttl", 255); fld_lnki_type = flds.Add_int("lnki_type"); fld_lnki_upright = flds.Add_double("lnki_upright"); @@ -49,21 +48,24 @@ class Xofc_cache_tbl { fld_temp_view_count = flds.Add_int("temp_view_count"); fld_temp_view_date = flds.Add_long("temp_view_date"); fld_temp_w = flds.Add_int("temp_w"); - if (created) { - Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds - , Db_meta_idx.new_normal_by_tbl(tbl_name, "main", fld_lnki_wiki, fld_lnki_ttl, fld_lnki_type, fld_lnki_upright, fld_lnki_w, fld_lnki_h, fld_lnki_time, fld_lnki_page) - ); - conn.Exec_create_tbl_and_idx(meta); - } - select_stmt = null; - stmt_bldr.Conn_(conn, tbl_name, flds, fld_uid); + stmt_bldr.Conn_(conn, tbl_name, flds, fld_lnki_site, fld_lnki_ttl, fld_lnki_type, fld_lnki_upright, fld_lnki_w, fld_lnki_h, fld_lnki_time, fld_lnki_page); + conn.Rls_reg(this); } - public Xofc_cache_itm Select_one(int lnki_wiki, byte[] lnki_ttl, int lnki_type, double lnki_upright, int lnki_w, int lnki_h, double lnki_time, int lnki_page) { - if (select_stmt == null) select_stmt = conn.Rls_reg(conn.Stmt_select(tbl_name, flds, String_.Ary(fld_lnki_wiki, fld_lnki_ttl, fld_lnki_type, fld_lnki_upright, fld_lnki_w, fld_lnki_h, fld_lnki_time, fld_lnki_page))); - Db_rdr rdr = Db_rdr_.Null; - try { - rdr = select_stmt.Clear() - .Crt_int (fld_lnki_wiki , lnki_wiki) + public void Rls() { + select_stmt = Db_stmt_.Rls(select_stmt); + } + public void Create_tbl() { + Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds + , Db_meta_idx.new_unique_by_tbl(tbl_name, "main", fld_lnki_site, fld_lnki_ttl, fld_lnki_type, fld_lnki_upright, fld_lnki_w, fld_lnki_h, fld_lnki_time, fld_lnki_page) + , Db_meta_idx.new_normal_by_tbl(tbl_name, "size", fld_temp_file_size) + , Db_meta_idx.new_normal_by_tbl(tbl_name, "date", fld_temp_view_date) + ); + conn.Ddl_create_tbl(meta); + } + public Xof_cache_itm Select_one(int lnki_site, byte[] lnki_ttl, int lnki_type, double lnki_upright, int lnki_w, int lnki_h, double lnki_time, int lnki_page) { + if (select_stmt == null) select_stmt = conn.Stmt_select(tbl_name, flds, String_.Ary(fld_lnki_site, fld_lnki_ttl, fld_lnki_type, fld_lnki_upright, fld_lnki_w, fld_lnki_h, fld_lnki_time, fld_lnki_page)); + Db_rdr rdr = select_stmt.Clear() + .Crt_int (fld_lnki_site , lnki_site) .Crt_bry_as_str (fld_lnki_ttl , lnki_ttl) .Crt_int (fld_lnki_type , lnki_type) .Crt_double (fld_lnki_upright , lnki_upright) @@ -71,40 +73,68 @@ class Xofc_cache_tbl { .Crt_int (fld_lnki_h , lnki_h) .Crt_double (fld_lnki_time , lnki_time) .Crt_int (fld_lnki_page , lnki_page) - .Exec_select_as_rdr(); - return rdr.Move_next() ? new_itm(rdr) : Xofc_cache_itm.Null; - } + .Exec_select__rls_manual(); + try {return rdr.Move_next() ? new_itm(rdr) : Xof_cache_itm.Null;} finally {rdr.Rls();} } public void Select_all(Bry_bfr fil_key_bldr, OrderedHash hash) { hash.Clear(); - Db_stmt stmt = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empy); - Db_rdr rdr = Db_rdr_.Null; + Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empy).Exec_select__rls_auto(); try { - rdr = stmt.Exec_select_as_rdr(); while (rdr.Move_next()) { - Xofc_cache_itm itm = new_itm(rdr); + Xof_cache_itm itm = new_itm(rdr); byte[] key = Bry_.Empty; hash.Add(key, itm); } } finally {rdr.Rls();} } - public void Db_save(Xofc_cache_itm itm) { + public long Select_max_size() { + Db_rdr rdr = conn.Stmt_new(gplx.dbs.qrys.Db_qry_sql.rdr_(String_.Format("SELECT Max({0}) FROM {1}", fld_temp_file_size, tbl_name))).Exec_select__rls_auto(); + try { + return rdr.Move_next() ? rdr.Read_long(fld_temp_file_size) : 0; + } + finally {rdr.Rls();} + } + public void Db_save(Xof_cache_itm itm) { try { Db_stmt stmt = stmt_bldr.Get(itm.Db_state()); switch (itm.Db_state()) { - case Db_cmd_mode.Tid_create: stmt.Clear().Val_int(fld_uid, itm.Uid()); Db_save_modify(stmt, itm); stmt.Exec_insert(); break; - case Db_cmd_mode.Tid_update: stmt.Clear(); Db_save_modify(stmt, itm); stmt.Crt_int(fld_uid, itm.Uid()).Exec_update(); break; - case Db_cmd_mode.Tid_delete: stmt.Clear().Crt_int(fld_uid, itm.Uid()); stmt.Exec_delete(); break; + case Db_cmd_mode.Tid_create: stmt.Clear(); Db_save_crt(stmt, itm, Bool_.Y); Db_save_val(stmt, itm); stmt.Exec_insert(); break; + case Db_cmd_mode.Tid_update: stmt.Clear(); Db_save_val(stmt, itm); Db_save_crt(stmt, itm, Bool_.N); stmt.Exec_update(); break; + case Db_cmd_mode.Tid_delete: stmt.Clear(); Db_save_crt(stmt, itm, Bool_.N); stmt.Exec_delete(); break; case Db_cmd_mode.Tid_ignore: break; default: throw Err_.unhandled(itm.Db_state()); } itm.Db_state_(Db_cmd_mode.Tid_ignore); } catch (Exception e) {stmt_bldr.Rls(); throw Err_.err_(e, Err_.Message_gplx(e));} } - private void Db_save_modify(Db_stmt stmt, Xofc_cache_itm itm) { - stmt.Val_int (itm.Lnki_wiki()) + private void Db_save_crt(Db_stmt stmt, Xof_cache_itm itm, boolean insert) { + if (insert) { + stmt.Val_int (itm.Lnki_site()) + .Val_bry_as_str (itm.Lnki_ttl()) + .Val_int (itm.Lnki_type()) + .Val_double (itm.Lnki_upright()) + .Val_int (itm.Lnki_w()) + .Val_int (itm.Lnki_h()) + .Val_double (itm.Lnki_time()) + .Val_int (itm.Lnki_page()) + ; + } + else { + stmt.Crt_int (fld_lnki_site, itm.Lnki_site()) + .Crt_bry_as_str (fld_lnki_ttl, itm.Lnki_ttl()) + .Crt_int (fld_lnki_type, itm.Lnki_type()) + .Crt_double (fld_lnki_upright, itm.Lnki_upright()) + .Crt_int (fld_lnki_w, itm.Lnki_w()) + .Crt_int (fld_lnki_h, itm.Lnki_h()) + .Crt_double (fld_lnki_time, itm.Lnki_time()) + .Crt_int (fld_lnki_page, itm.Lnki_page()) + ; + } + } + private void Db_save_val(Db_stmt stmt, Xof_cache_itm itm) { + stmt.Val_int (itm.Lnki_site()) .Val_bry_as_str (itm.Lnki_ttl()) .Val_int (itm.Lnki_type()) .Val_double (itm.Lnki_upright()) @@ -125,12 +155,11 @@ class Xofc_cache_tbl { .Val_int (itm.Temp_w()) ; } - private Xofc_cache_itm new_itm(Db_rdr rdr) { - return new Xofc_cache_itm + private Xof_cache_itm new_itm(Db_rdr rdr) { + return new Xof_cache_itm ( lnki_key_bfr - , rdr.Read_int (fld_uid) , Db_cmd_mode.Tid_ignore - , rdr.Read_int (fld_lnki_wiki) + , rdr.Read_int (fld_lnki_site) , rdr.Read_bry_by_str (fld_lnki_ttl) , rdr.Read_int (fld_lnki_type) , rdr.Read_double (fld_lnki_upright) diff --git a/400_xowa/src/gplx/xowa/files/caches/Xofc_cfg_mgr.java b/400_xowa/src/gplx/xowa/files/caches/Xofc_cfg_mgr.java index 2f0bc7b0f..2f32e9fe9 100644 --- a/400_xowa/src/gplx/xowa/files/caches/Xofc_cfg_mgr.java +++ b/400_xowa/src/gplx/xowa/files/caches/Xofc_cfg_mgr.java @@ -16,33 +16,34 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.files.caches; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; -import gplx.dbs.*; import gplx.dbs.cfgs.*; import gplx.xowa.dbs.tbls.*; +import gplx.dbs.*; import gplx.dbs.cfgs.*; import gplx.xowa.wikis.data.tbls.*; class Xofc_cfg_mgr { - private final Db_cfg_tbl tbl = new Db_cfg_tbl(); + private Db_cfg_tbl tbl; public int Next_id() {return next_id++;} public void Next_id_(int v) {next_id = v;} private int next_id; public long Cache_len() {return cache_len;} public void Cache_len_(long v) {cache_len = v;} private long cache_len = 0; public void Cache_len_add(long v) {cache_len += v;} public long Cache_min() {return cache_min;} public void Cache_min_(long v) {cache_min = v;} private long cache_min = Io_mgr.Len_mb * 75; public long Cache_max() {return cache_max;} public void Cache_max_(long v) {cache_max = v;} private long cache_max = Io_mgr.Len_mb * 100; public void Conn_(Db_conn v, boolean created, boolean schema_is_1) { - tbl.Conn_(v, created, schema_is_1, "xowa_cfg", "file_cache_cfg"); + tbl = new Db_cfg_tbl(v, schema_is_1 ? "xowa_cfg" : "file_cache_cfg"); if (created) { - tbl.Insert(Cfg_grp, Cfg_key__next_id, Int_.Xto_str(1)); - tbl.Insert(Cfg_grp, Cfg_key__cache_len, Long_.Xto_str(0)); - tbl.Insert(Cfg_grp, Cfg_key__cache_min, Long_.Xto_str(cache_min)); - tbl.Insert(Cfg_grp, Cfg_key__cache_max, Long_.Xto_str(cache_max)); + tbl.Create_tbl(); + tbl.Insert_int(Cfg_grp, Cfg_key__next_id, 1); + tbl.Insert_int(Cfg_grp, Cfg_key__cache_len, 0); + tbl.Insert_long(Cfg_grp, Cfg_key__cache_min, cache_min); + tbl.Insert_long(Cfg_grp, Cfg_key__cache_max, cache_max); } else { - next_id = tbl.Select_as_int_or_fail(Cfg_grp, Cfg_key__next_id); - cache_len = tbl.Select_as_int_or_fail(Cfg_grp, Cfg_key__cache_len); - cache_max = tbl.Select_as_int_or_fail(Cfg_grp, Cfg_key__cache_max); + next_id = tbl.Select_int(Cfg_grp, Cfg_key__next_id); + cache_len = tbl.Select_int(Cfg_grp, Cfg_key__cache_len); + cache_max = tbl.Select_int(Cfg_grp, Cfg_key__cache_max); } } public void Save_all() { - tbl.Update(Cfg_grp, Cfg_key__next_id, Int_.Xto_str(next_id)); - tbl.Update(Cfg_grp, Cfg_key__cache_len, Long_.Xto_str(cache_len)); - tbl.Update(Cfg_grp, Cfg_key__cache_min, Long_.Xto_str(cache_min)); - tbl.Update(Cfg_grp, Cfg_key__cache_max, Long_.Xto_str(cache_max)); + tbl.Update_int(Cfg_grp, Cfg_key__next_id, next_id); + tbl.Update_long(Cfg_grp, Cfg_key__cache_len, cache_len); + tbl.Update_long(Cfg_grp, Cfg_key__cache_min, cache_min); + tbl.Update_long(Cfg_grp, Cfg_key__cache_max, cache_max); } public void Cleanup() {} private static final String Cfg_grp = "fsdb.cache", Cfg_key__next_id = "next_id", Cfg_key__cache_min = "cache_min", Cfg_key__cache_max = "cache_max", Cfg_key__cache_len = "cache_len"; diff --git a/400_xowa/src/gplx/xowa/files/caches/Xofc_dir_mgr.java b/400_xowa/src/gplx/xowa/files/caches/Xofc_dir_mgr.java index 1cf58f708..160965ba6 100644 --- a/400_xowa/src/gplx/xowa/files/caches/Xofc_dir_mgr.java +++ b/400_xowa/src/gplx/xowa/files/caches/Xofc_dir_mgr.java @@ -81,12 +81,12 @@ class Xofc_dir_mgr { private void Db_recalc_next_id(Xofc_dir_itm itm, String err) { if (String_.Has(err, "PRIMARY KEY must be unique")) { // primary key exception in strange situations (multiple xowas at same time) int next_id = tbl.Select_max_uid() + 1; - Gfo_usr_dlg_._.Warn_many("", "", "uid out of sync; incrementing; uid=~{0} name=~{1} err=~{2}", itm.Id(), String_.new_utf8_(itm.Name()), err); + Gfo_usr_dlg_.I.Warn_many("", "", "uid out of sync; incrementing; uid=~{0} name=~{1} err=~{2}", itm.Id(), String_.new_utf8_(itm.Name()), err); itm.Id_(next_id); cache_mgr.Next_id_(next_id + 1); err = tbl.Db_save(itm); if (err == null) return; } - Gfo_usr_dlg_._.Warn_many("", "", "failed to save uid; uid=~{0} name=~{1} err=~{2}", itm.Id(), String_.new_utf8_(itm.Name()), err); + Gfo_usr_dlg_.I.Warn_many("", "", "failed to save uid; uid=~{0} name=~{1} err=~{2}", itm.Id(), String_.new_utf8_(itm.Name()), err); } } diff --git a/400_xowa/src/gplx/xowa/files/caches/Xofc_dir_tbl.java b/400_xowa/src/gplx/xowa/files/caches/Xofc_dir_tbl.java index 7533fc047..e4ca8987a 100644 --- a/400_xowa/src/gplx/xowa/files/caches/Xofc_dir_tbl.java +++ b/400_xowa/src/gplx/xowa/files/caches/Xofc_dir_tbl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.files.caches; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; -class Xofc_dir_tbl { +class Xofc_dir_tbl implements RlsAble { private String tbl_name = "file_cache_dir"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private String fld_id, fld_name; private Db_conn conn; private final Db_stmt_bldr stmt_bldr = new Db_stmt_bldr(); private Db_stmt select_stmt; @@ -34,9 +34,13 @@ class Xofc_dir_tbl { Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds , Db_meta_idx.new_normal_by_tbl(tbl_name, "name", fld_name) ); - conn.Exec_create_tbl_and_idx(meta); + conn.Ddl_create_tbl(meta); } stmt_bldr.Conn_(conn, tbl_name, flds, fld_id); + conn.Rls_reg(this); + } + public void Rls() { + select_stmt = Db_stmt_.Rls(select_stmt); } public String Db_save(Xofc_dir_itm itm) { try { @@ -60,20 +64,17 @@ class Xofc_dir_tbl { stmt_bldr.Rls(); } public Xofc_dir_itm Select_one(byte[] name) { - if (select_stmt == null) select_stmt = conn.Rls_reg(conn.Stmt_select(tbl_name, flds, fld_name)); - Db_rdr rdr = Db_rdr_.Null; + if (select_stmt == null) select_stmt = conn.Stmt_select(tbl_name, flds, fld_name); + Db_rdr rdr = select_stmt.Clear().Crt_bry_as_str(fld_name, name).Exec_select__rls_manual(); try { - rdr = select_stmt.Clear().Crt_bry_as_str(fld_name, name).Exec_select_as_rdr(); return rdr.Move_next() ? new_itm(rdr) : Xofc_dir_itm.Null; } finally {rdr.Rls();} } public void Select_all(ListAdp list) { list.Clear(); - Db_stmt select_all_stmt = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empy); - Db_rdr rdr = Db_rdr_.Null; + Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empy).Exec_select__rls_auto(); try { - rdr = select_all_stmt.Exec_select_as_rdr(); while (rdr.Move_next()) list.Add(new_itm(rdr)); } diff --git a/400_xowa/src/gplx/xowa/files/caches/Xofc_fil_mgr.java b/400_xowa/src/gplx/xowa/files/caches/Xofc_fil_mgr.java index 456289e54..e34bef3cb 100644 --- a/400_xowa/src/gplx/xowa/files/caches/Xofc_fil_mgr.java +++ b/400_xowa/src/gplx/xowa/files/caches/Xofc_fil_mgr.java @@ -85,7 +85,7 @@ class Xofc_fil_mgr { long cur_size = 0, actl_size = 0; Xof_url_bldr url_bldr = new Xof_url_bldr(); ListAdp deleted = ListAdp_.new_(); - tbl.Conn().Txn_mgr().Txn_bgn_if_none(); + tbl.Conn().Txn_bgn(); long compress_to = cfg_mgr.Cache_min(); for (int i = 0; i < len; ++i) { Xofc_fil_itm itm = (Xofc_fil_itm)hash.FetchAt(i); @@ -115,7 +115,7 @@ class Xofc_fil_mgr { catch (Exception e) { usr_dlg.Warn_many("", "", "failed to compress cache: err=~{0}", Err_.Message_gplx_brief(e)); } - finally {tbl.Conn().Txn_mgr().Txn_end_all();} + finally {tbl.Conn().Txn_end();} } private void Fsys_delete(Xof_url_bldr url_bldr, Xoa_wiki_mgr wiki_mgr, Xoa_repo_mgr repo_mgr, Xofc_dir_mgr dir_mgr, Xofc_fil_itm itm) { byte mode_id = itm.Is_orig() ? Xof_repo_itm.Mode_orig : Xof_repo_itm.Mode_thumb; @@ -133,17 +133,17 @@ class Xofc_fil_mgr { Io_mgr._.DeleteFil_args(fil_url).MissingFails_off().Exec(); itm.Cmd_mode_delete_(); } - public void Cleanup() {tbl.Cleanup();} + public void Cleanup() {tbl.Rls();} private void Db_recalc_next_id(Xofc_fil_itm fil_itm, String err_msg) { if (String_.Has(err_msg, "PRIMARY KEY must be unique")) { // primary key exception in strange situations (multiple xowas at same time) int next_id = tbl.Select_max_uid() + 1; - Gfo_usr_dlg_._.Warn_many("", "", "uid out of sync; incrementing; uid=~{0} name=~{1} err=~{2}", fil_itm.Uid(), String_.new_utf8_(fil_itm.Name()), err_msg); + Gfo_usr_dlg_.I.Warn_many("", "", "uid out of sync; incrementing; uid=~{0} name=~{1} err=~{2}", fil_itm.Uid(), String_.new_utf8_(fil_itm.Name()), err_msg); fil_itm.Uid_(next_id); cache_mgr.Next_id_(next_id + 1); err_msg = tbl.Db_save(fil_itm); if (err_msg == null) return; } - Gfo_usr_dlg_._.Warn_many("", "", "failed to save uid; uid=~{0} name=~{1} err=~{2}", fil_itm.Uid(), String_.new_utf8_(fil_itm.Name()), err_msg); + Gfo_usr_dlg_.I.Warn_many("", "", "failed to save uid; uid=~{0} name=~{1} err=~{2}", fil_itm.Uid(), String_.new_utf8_(fil_itm.Name()), err_msg); } } diff --git a/400_xowa/src/gplx/xowa/files/caches/Xofc_fil_tbl.java b/400_xowa/src/gplx/xowa/files/caches/Xofc_fil_tbl.java index a87926547..425e8978d 100644 --- a/400_xowa/src/gplx/xowa/files/caches/Xofc_fil_tbl.java +++ b/400_xowa/src/gplx/xowa/files/caches/Xofc_fil_tbl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.files.caches; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; -class Xofc_fil_tbl { +class Xofc_fil_tbl implements RlsAble { private String tbl_name = "file_cache_fil"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private String fld_uid, fld_dir_id, fld_name, fld_is_orig, fld_w, fld_h, fld_time, fld_page, fld_ext, fld_size, fld_cache_time; private Db_conn conn; private final Db_stmt_bldr stmt_bldr = new Db_stmt_bldr(); private Db_stmt select_itm_stmt, select_itm_v2_stmt; @@ -49,10 +49,16 @@ class Xofc_fil_tbl { Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds , Db_meta_idx.new_normal_by_tbl(tbl_name, "fil", fld_name, fld_is_orig, fld_w, fld_h, fld_time, fld_cache_time, fld_uid) ); - conn.Exec_create_tbl_and_idx(meta); + conn.Ddl_create_tbl(meta); } select_itm_stmt = select_itm_v2_stmt = null; stmt_bldr.Conn_(conn, tbl_name, flds, fld_uid); + conn.Rls_reg(this); + } + public void Rls() { + select_itm_stmt = Db_stmt_.Rls(select_itm_stmt); + select_itm_v2_stmt = Db_stmt_.Rls(select_itm_v2_stmt); + stmt_bldr.Rls(); } public String Db_save(Xofc_fil_itm itm) { try { @@ -84,53 +90,45 @@ class Xofc_fil_tbl { .Val_long(fld_cache_time, itm.Cache_time()) ; } - public void Cleanup() { - select_itm_stmt = Db_stmt_.Rls(select_itm_stmt); - stmt_bldr.Rls(); - } public Xofc_fil_itm Select_one_v1(int dir_id, byte[] fil_name, boolean fil_is_orig, int fil_w, int fil_h, double fil_thumbtime) { - if (select_itm_stmt == null) select_itm_stmt = conn.Rls_reg(conn.Stmt_select(tbl_name, flds, String_.Ary(fld_dir_id, fld_name, fld_is_orig, fld_w, fld_h, fld_time))); - Db_rdr rdr = Db_rdr_.Null; - try { - rdr = select_itm_stmt.Clear() + if (select_itm_stmt == null) select_itm_stmt = conn.Stmt_select(tbl_name, flds, String_.Ary(fld_dir_id, fld_name, fld_is_orig, fld_w, fld_h, fld_time)); + Db_rdr rdr = select_itm_stmt.Clear() .Crt_int(fld_dir_id, dir_id) .Crt_bry_as_str(fld_name, fil_name) .Crt_bool_as_byte(fld_is_orig, fil_is_orig) .Crt_int(fld_w, fil_w) .Crt_int(fld_h, fil_h) .Crt_int(fld_time, Xof_lnki_time.Db_save_int(fil_thumbtime)) - .Exec_select_as_rdr(); + .Exec_select__rls_manual(); + try { return rdr.Move_next() ? new_itm(rdr) : Xofc_fil_itm.Null; } finally {rdr.Rls();} } public Xofc_fil_itm Select_one_v2(int dir_id, byte[] name, boolean is_orig, int w, double time, int page) { - if (select_itm_v2_stmt == null) select_itm_v2_stmt = conn.Rls_reg(conn.Stmt_select(tbl_name, flds, String_.Ary(fld_dir_id, fld_name, fld_is_orig, fld_w, fld_time, fld_page))); - Db_rdr rdr = Db_rdr_.Null; - try { - rdr = select_itm_v2_stmt.Clear() + if (select_itm_v2_stmt == null) select_itm_v2_stmt = conn.Stmt_select(tbl_name, flds, String_.Ary(fld_dir_id, fld_name, fld_is_orig, fld_w, fld_time, fld_page)); + Db_rdr rdr = select_itm_v2_stmt.Clear() .Crt_int(fld_dir_id, dir_id) .Crt_bry_as_str(fld_name, name) .Crt_bool_as_byte(fld_is_orig, is_orig) .Crt_int(fld_w, w) .Crt_int(fld_time, Xof_lnki_time.Db_save_int(time)) .Crt_int(fld_page, page) - .Exec_select_as_rdr(); + .Exec_select__rls_manual(); + try { return rdr.Move_next() ? new_itm(rdr) : Xofc_fil_itm.Null; } finally {rdr.Rls();} } public void Select_all(Bry_bfr fil_key_bldr, OrderedHash hash) { hash.Clear(); - Db_stmt select_all_stmt = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empy); - Db_rdr rdr = Db_rdr_.Null; + Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empy).Exec_select__rls_auto(); try { - rdr = select_all_stmt.Exec_select_as_rdr(); while (rdr.Move_next()) { Xofc_fil_itm fil_itm = new_itm(rdr); byte[] key = fil_itm.Gen_hash_key_v1(fil_key_bldr); if (hash.Has(key)) // NOTE: need to check for uniqueness else dupe file will cause select to fail; shouldn't happen, but somehow did; DATE:2013-12-28 - Gfo_usr_dlg_._.Warn_many("", "", "cache had duplicate itm: key=~{0}", String_.new_utf8_(key)); + Gfo_usr_dlg_.I.Warn_many("", "", "cache had duplicate itm: key=~{0}", String_.new_utf8_(key)); else hash.Add(key, fil_itm); } diff --git a/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_itm.java b/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_itm.java index 2bed97f4e..0947cb27f 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_itm.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_itm.java @@ -44,6 +44,9 @@ public class Xof_fsdb_itm { public Io_url Html_orig_url() {return html_orig_url;} private Io_url html_orig_url = Io_url_.Null; public int Gallery_mgr_h() {return gallery_mgr_h;} private int gallery_mgr_h = Int_.Neg1; public Js_img_wkr Html_img_wkr() {return html_img_wkr;} private Js_img_wkr html_img_wkr; + public int Temp_file_w() {return temp_file_w;} private int temp_file_w; + public long Temp_file_size() {return temp_file_size;} private long temp_file_size; + public Io_url Temp_file_url() {return temp_file_url;} private Io_url temp_file_url; public boolean Orig_exists() {return orig_exists;} public void Orig_exists_y_() {orig_exists = Bool_.Y;} public void Orig_exists_n_() {orig_exists = Bool_.N;} private boolean orig_exists; public boolean File_exists() {return file_exists;} public void File_exists_y_() {file_exists = Bool_.Y;} public void File_exists_n_() {file_exists = Bool_.N;} public void File_exists_(boolean v) {file_exists = v;} private boolean file_exists; public boolean File_resized() {return file_resized;} public void File_resized_y_() {file_resized = Bool_.Y;} private boolean file_resized; @@ -71,7 +74,7 @@ public class Xof_fsdb_itm { html_orig_url = url_bldr.To_url_trg(repo, this, Bool_.Y); } public void Ctor_by_fsdb_make - ( byte[] lnki_ttl, int lnki_w, int lnki_h, double lnki_time, int lnki_page + ( byte[] lnki_ttl, int lnki_ext, int lnki_w, int lnki_h, double lnki_time, int lnki_page , byte orig_repo_id, int orig_w, int orig_h, byte[] orig_redirect , boolean file_is_orig ) { @@ -80,7 +83,9 @@ public class Xof_fsdb_itm { this.file_is_orig = file_is_orig; this.html_w = lnki_w; this.html_h = lnki_h; // set html_size as file_size (may try to optimize later by removing similar thumbs (EX: 220,221 -> 220)) this.Lnki_ttl_(lnki_ttl); + this.lnki_ext = Xof_ext_.new_by_id_(lnki_ext); // NOTE: data in fsdb_make may override lnki_ext; EX: ttl=A.png; but ext=".jpg" } + public void Init_temp(int temp_file_w, long temp_file_size, Io_url temp_file_url) {this.temp_file_w = temp_file_w; this.temp_file_size = temp_file_size; this.temp_file_url = temp_file_url;} public void Lnki_ext_(Xof_ext v) {lnki_ext = v;} public void Lnki_size_(int w, int h) {this.lnki_w = w; this.lnki_h = h;} public void Orig_repo_name_(byte[] v) {orig_repo_name = v;} diff --git a/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr.java b/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr.java index 577b1f205..95e17bdef 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr.java @@ -18,8 +18,7 @@ along with this program. If not, see . package gplx.xowa.files.fsdb; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.fsdb.*; import gplx.fsdb.data.*; import gplx.fsdb.meta.*; import gplx.xowa.files.bins.*; import gplx.xowa.files.origs.*; import gplx.xowa.files.caches.*; import gplx.xowa.files.gui.*; -public interface Xof_fsdb_mgr extends RlsAble { - Xof_orig_mgr Orig_mgr(); +public interface Xof_fsdb_mgr { Xof_bin_mgr Bin_mgr(); Fsm_mnt_mgr Mnt_mgr(); void Init_by_wiki(Xow_wiki wiki); diff --git a/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr__sql.java b/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr__sql.java index a03d7f6a3..8f1864472 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr__sql.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr__sql.java @@ -21,51 +21,37 @@ import gplx.dbs.*; import gplx.xowa.wikis.data.*; import gplx.fsdb.*; import gplx.fsdb.meta.*; import gplx.xowa.files.*; import gplx.xowa.files.repos.*; import gplx.xowa.files.imgs.*; import gplx.xowa.files.origs.*; import gplx.xowa.files.bins.*; import gplx.xowa.files.caches.*; import gplx.xowa.files.gui.*; public class Xof_fsdb_mgr__sql implements Xof_fsdb_mgr, GfoInvkAble { - private boolean init = false; private boolean fsdb_enabled = false; private Xof_cache_mgr cache_mgr; private Xow_repo_mgr repo_mgr; private Xof_url_bldr url_bldr; private final Xof_img_size img_size = new Xof_img_size(); - public Xof_orig_mgr Orig_mgr() {return orig_mgr;} private final Xof_orig_mgr orig_mgr = new Xof_orig_mgr(); + private boolean init = false; private boolean fsdb_enabled = false; + private Xof_cache_mgr cache_mgr; private Xow_repo_mgr repo_mgr; private Xof_url_bldr url_bldr; private final Xof_img_size img_size = new Xof_img_size(); public Xof_bin_mgr Bin_mgr() {return bin_mgr;} private Xof_bin_mgr bin_mgr; - public Fsm_mnt_mgr Mnt_mgr() {return mnt_mgr;} private final Fsm_mnt_mgr mnt_mgr = new Fsm_mnt_mgr(); + public Fsm_mnt_mgr Mnt_mgr() {return mnt_mgr;} private Fsm_mnt_mgr mnt_mgr = new Fsm_mnt_mgr(); public void Init_by_wiki(Xow_wiki wiki) { if (init) return; try { init = true; - // wiki.Rls_list().Add(this); - Xow_core_data_mgr core_data_mgr = wiki.Data_mgr__core_mgr(); - boolean schema_is_1 = core_data_mgr == null ? Bool_.Y : core_data_mgr.Cfg__schema_is_1(); // TEST: needed b/c some tests rely on txt_data_mgr + if (wiki.File_mgr__fsdb_mode().Tid_wmf()) return; Xoa_app app = wiki.App(); this.cache_mgr = app.File_mgr__cache_mgr(); this.url_bldr = Xof_url_bldr.new_v2_(); this.repo_mgr = wiki.File_mgr__repo_mgr(); Xof_img_mgr img_mgr = app.File_mgr__img_mgr(); - Io_url db_dir = wiki.Fsys_mgr().File_dir(); - Xof_fsdb_mode fsdb_mode = wiki.File_mgr__fsdb_mode(); - orig_mgr.Init_by_wiki(db_dir, schema_is_1, wiki.Domain_bry(), app.Wmf_mgr().Download_wkr(), repo_mgr, url_bldr, fsdb_mode); - if (wiki.File_mgr__fsdb_mode().Tid_wmf()) return; + Fsdb_db_mgr core = Fsdb_db_mgr_.new_detect(wiki.Domain_str(), wiki.Fsys_mgr().Root_dir(), wiki.Fsys_mgr().File_dir()); + if (core == null) return; fsdb_enabled = true; - mnt_mgr.Init_by_wiki(db_dir, schema_is_1); - this.bin_mgr = new Xof_bin_mgr(mnt_mgr, repo_mgr, cache_mgr, app.Wmf_mgr(), url_bldr); - bin_mgr.Init_by_wiki(img_mgr.Wkr_resize_img()); + mnt_mgr.Ctor_by_load(core); + this.bin_mgr = new Xof_bin_mgr(mnt_mgr, repo_mgr, cache_mgr, img_mgr.Wkr_resize_img()); + bin_mgr.Wkrs__add(Xof_bin_wkr__fsdb_sql.new_(mnt_mgr)); + bin_mgr.Wkrs__add(Xof_bin_wkr__http_wmf.new_(wiki)); } catch (Exception exc) {throw Err_.new_fmt_("failed to initialize fsdb_mgr: wiki={0) err={1}", wiki.Domain_str(), Err_.Message_gplx_brief(exc));} } public void Fsdb_search_by_list(byte exec_tid, ListAdp itms, Xoa_page page, Xog_js_wkr js_wkr) { if (!fsdb_enabled) return; int len = itms.Count(); - Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_._; + Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_.I; for (int i = 0; i < len; i++) { if (usr_dlg.Canceled()) return; Xof_fsdb_itm itm = (Xof_fsdb_itm)itms.FetchAt(i); Xof_file_wkr.Show_img(exec_tid, itm, usr_dlg, bin_mgr, mnt_mgr, cache_mgr, repo_mgr, js_wkr, img_size, url_bldr, page); } } - public void Txn_save() { - if (!fsdb_enabled) return; - mnt_mgr.Txn_save(); - orig_mgr.Txn_save(); - } - public void Rls() { - if (!fsdb_enabled) return; - this.Txn_save(); // NOTE: must call save, else user db will not update next id; DATE:2014-02-11 - mnt_mgr.Rls(); - orig_mgr.Rls(); - } public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_mnt_mgr)) return mnt_mgr; else return GfoInvkAble_.Rv_unhandled; diff --git a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_dir.java b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_dir.java index 7603a4146..42cc78d8b 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_dir.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_dir.java @@ -25,9 +25,9 @@ class Fs_root_dir { private Orig_fil_mgr cache = new Orig_fil_mgr(), fs_fil_mgr; private Db_conn conn; private Db_cfg_tbl cfg_tbl; private Orig_fil_tbl fil_tbl; private int fil_id_next = 0; - public void Init(Io_url url, Db_cfg_tbl cfg_tbl, Orig_fil_tbl fil_tbl, Gfo_usr_dlg usr_dlg, Xof_img_wkr_query_img_size img_size_wkr) { + public void Init(Io_url url, Orig_fil_tbl fil_tbl, Gfo_usr_dlg usr_dlg, Xof_img_wkr_query_img_size img_size_wkr) { this.url = url; - this.cfg_tbl = cfg_tbl; this.fil_tbl = fil_tbl; this.usr_dlg = usr_dlg; this.img_size_wkr = img_size_wkr; + this.fil_tbl = fil_tbl; this.usr_dlg = usr_dlg; this.img_size_wkr = img_size_wkr; } public Orig_fil_itm Get_by_ttl(byte[] lnki_ttl) { Orig_fil_itm rv = (Orig_fil_itm)cache.Get_by_ttl(lnki_ttl); @@ -55,7 +55,7 @@ class Fs_root_dir { if (Xof_ext_.Id_is_image(rv.Fil_ext_id())) img_size = img_size_wkr.Exec(rv.Fil_url()); rv.Init_by_size(++fil_id_next, img_size.Width(), img_size.Height()); - cfg_tbl.Update(Cfg_grp_root_dir, Cfg_key_fil_id_next, Int_.Xto_str(fil_id_next)); + cfg_tbl.Update_int(Cfg_grp_root_dir, Cfg_key_fil_id_next, fil_id_next); fil_tbl.Insert(rv); return rv; } @@ -77,21 +77,22 @@ class Fs_root_dir { } return rv; } - private static final String Db_conn_bldr_type = "gplx.xowa.fs_root"; private Db_conn Init_db_fil_mgr() { Io_url db_url = url.GenSubFil("^orig_regy.sqlite3"); boolean created = false; boolean schema_is_1 = Bool_.Y; - Db_conn conn = Db_conn_bldr.I.Get(Db_conn_bldr_type, db_url); + Db_conn conn = Db_conn_bldr.I.Get(db_url); if (conn == null) { - conn = Db_conn_bldr.I.New(Db_conn_bldr_type, db_url); + conn = Db_conn_bldr.I.New(db_url); created = true; } - cfg_tbl.Conn_(conn, created, schema_is_1, Fsm_abc_mgr.Cfg_tbl_v1, Fsm_abc_mgr.Cfg_tbl_v2); + cfg_tbl = new Db_cfg_tbl(conn, schema_is_1 ? "fsdb_cfg" : "xowa_cfg"); fil_tbl.Conn_(conn, created, schema_is_1); - if (created) - cfg_tbl.Insert(Cfg_grp_root_dir, Cfg_key_fil_id_next, Int_.Xto_str(fil_id_next)); + if (created) { + cfg_tbl.Create_tbl(); + cfg_tbl.Insert_int(Cfg_grp_root_dir, Cfg_key_fil_id_next, fil_id_next); + } else { - fil_id_next = cfg_tbl.Select_as_int_or_fail(Cfg_grp_root_dir, Cfg_key_fil_id_next); + fil_id_next = cfg_tbl.Select_int(Cfg_grp_root_dir, Cfg_key_fil_id_next); } return conn; } diff --git a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_dir_tst.java b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_dir_tst.java index 718d75b48..5cea68b67 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_dir_tst.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_dir_tst.java @@ -45,10 +45,9 @@ class Fs_root_dir_fxt { Io_mgr._.InitEngine_mem(); url = Io_url_.mem_dir_("mem/dir/"); root_dir = new Fs_root_dir(); - Db_cfg_tbl cfg_tbl = new Db_cfg_tbl(); orig_fil_tbl = new Orig_fil_tbl(); Xof_img_wkr_query_img_size img_size_wkr = new Xof_img_wkr_query_img_size_test(); - root_dir.Init(url, cfg_tbl, orig_fil_tbl, Gfo_usr_dlg_.Null, img_size_wkr); + root_dir.Init(url, orig_fil_tbl, Gfo_usr_dlg_.Null, img_size_wkr); } public Orig_fil_mok itm_() {return new Orig_fil_mok();} public void Init_fs(String url, int w, int h) {Save_img(url, w, h);} diff --git a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_fsdb_mgr.java b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_fsdb_mgr.java index 106b8ecff..b89105aa0 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_fsdb_mgr.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_fsdb_mgr.java @@ -43,7 +43,6 @@ public class Fs_root_fsdb_mgr implements Xof_fsdb_mgr, GfoInvkAble { // read ima else return GfoInvkAble_.Rv_unhandled; return this; } private static final String Invk_root_dir_ = "root_dir_", Invk_orig_dir_ = "orig_dir_", Invk_thumb_dir_ = "thumb_dir_"; - public Xof_orig_mgr Orig_mgr() {throw Err_.not_implemented_();} public Xof_bin_mgr Bin_mgr() {throw Err_.not_implemented_();} public Fsm_mnt_mgr Mnt_mgr() {throw Err_.not_implemented_();} public void Rls() {} diff --git a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_wkr_fsdb.java b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_wkr_fsdb.java index b69f3da22..3c46c9dae 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_wkr_fsdb.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_wkr_fsdb.java @@ -64,7 +64,7 @@ public class Fs_root_wkr_fsdb { orig_dir_mgr_init(orig_dir); } private void orig_dir_mgr_init(Io_url orig_dir) { - orig_dir_mgr.Init(orig_dir, new Db_cfg_tbl(), new Orig_fil_tbl(), wiki.Appe().Usr_dlg(), wiki.Appe().File_mgr().Img_mgr().Wkr_query_img_size()); + orig_dir_mgr.Init(orig_dir, new Orig_fil_tbl(), wiki.Appe().Usr_dlg(), wiki.Appe().File_mgr().Img_mgr().Wkr_query_img_size()); } public void Thumb_dir_(Io_url v) { thumb_dir = v; diff --git a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Orig_fil_tbl.java b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Orig_fil_tbl.java index b429587d8..4febd79c5 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Orig_fil_tbl.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Orig_fil_tbl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.files.fsdb.fs_roots; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.xowa.files.fsdb.*; import gplx.dbs.*; -public class Orig_fil_tbl { +public class Orig_fil_tbl implements RlsAble { private String tbl_name = "orig_fil"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private String fld_uid, fld_name, fld_ext_id, fld_w, fld_h, fld_dir_url; private Db_conn conn; private Db_stmt stmt_insert, stmt_select; @@ -37,16 +37,20 @@ public class Orig_fil_tbl { Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds , Db_meta_idx.new_unique_by_tbl(tbl_name, "main", fld_name) ); - conn.Exec_create_tbl_and_idx(meta); + conn.Ddl_create_tbl(meta); } stmt_insert = stmt_select = null; + conn.Rls_reg(this); + } + public void Rls() { + stmt_insert = Db_stmt_.Rls(stmt_insert); + stmt_select = Db_stmt_.Rls(stmt_select); } public Orig_fil_itm Select_itm(byte[] ttl) { - if (stmt_select == null) stmt_select = conn.Rls_reg(conn.Stmt_select(tbl_name, flds, fld_name)); + if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_name); Orig_fil_itm rv = Orig_fil_itm.Null; - Db_rdr rdr = Db_rdr_.Null; + Db_rdr rdr = stmt_select.Clear().Crt_bry_as_str(fld_name, ttl).Exec_select__rls_manual(); try { - rdr = stmt_select.Clear().Crt_bry_as_str(fld_name, ttl).Exec_select_as_rdr(); if (rdr.Move_next()) rv = Load_itm(rdr); return rv; @@ -64,7 +68,7 @@ public class Orig_fil_tbl { ); } public void Insert(Orig_fil_itm fil_itm) { - if (stmt_insert == null) stmt_insert = conn.Rls_reg(conn.Stmt_insert(tbl_name, flds)); + if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds); stmt_insert.Clear() .Val_int(fld_uid, fil_itm.Fil_uid()) .Val_bry_as_str(fld_name, fil_itm.Fil_name()) @@ -74,5 +78,4 @@ public class Orig_fil_tbl { .Val_bry_as_str(fld_dir_url, fil_itm.Fil_dir_url()) .Exec_insert(); } - public void Rls() {} } diff --git a/400_xowa/src/gplx/xowa/files/fsdb/tsts/Xof_file_fxt.java b/400_xowa/src/gplx/xowa/files/fsdb/tsts/Xof_file_fxt.java index ac0b711c1..deca956ae 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/tsts/Xof_file_fxt.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/tsts/Xof_file_fxt.java @@ -16,26 +16,31 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.files.fsdb.tsts; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.xowa.files.fsdb.*; -import gplx.fsdb.*; import gplx.dbs.*; import gplx.xowa.files.origs.*; import gplx.xowa.files.bins.*; import gplx.xowa.files.cnvs.*; import gplx.xowa.files.exts.*; import gplx.xowa.files.gui.*; -import gplx.xowa.wikis.*; import gplx.xowa.files.repos.*; +import gplx.fsdb.*; import gplx.fsdb.meta.*; import gplx.dbs.*; import gplx.xowa.files.origs.*; import gplx.xowa.files.bins.*; import gplx.xowa.files.cnvs.*; import gplx.xowa.files.exts.*; import gplx.xowa.files.gui.*; +import gplx.xowa.wikis.*; import gplx.xowa.files.repos.*; import gplx.xowa.wikis.data.*; import gplx.fsdb.data.*; class Xof_file_fxt { - private Xoae_app app; private Xof_fsdb_mgr fsdb_mgr; private Xowe_wiki wiki; + private Xoae_app app; private Xof_fsdb_mgr__sql fsdb_mgr; private Xowe_wiki wiki; private Xof_orig_mgr orig_mgr; private final Fsd_thm_itm tmp_thm = Fsd_thm_itm.new_(); private final Fsd_img_itm tmp_img = new Fsd_img_itm(); - public void Rls() {fsdb_mgr.Rls();} + public void Rls() {} public void Reset() { Io_mgr._.InitEngine_mem(); // NOTE: files are downloaded to mem_engine, regardless of Db being mem or sqlite; always reset - Io_url fsys_db = Xoa_test_.Url_file_enwiki(); - Xoa_test_.Db_init(fsys_db); - app = Xoa_app_fxt.app_(Op_sys.Cur().Os_name(), fsys_db); + Io_url root_url = Xoa_test_.Url_root(); + Xoa_test_.Db_init(root_url); + app = Xoa_app_fxt.app_(Op_sys.Cur().Os_name(), root_url); wiki = Xoa_app_fxt.wiki_tst_(app); wiki.File_mgr__fsdb_mode().Tid_make_y_(); + this.fsdb_mgr = (Xof_fsdb_mgr__sql)wiki.File_mgr().Fsdb_mgr(); + this.orig_mgr = wiki.File_mgr__orig_mgr(); Xof_repo_fxt.Repos_init(app.File_mgr(), true, wiki); - wiki.Db_mgr_create_as_sql(); // NOTE: must create as sql_db_mgr not txt_db_mgr - fsdb_mgr = new Xof_fsdb_mgr__sql(); // NOTE: must new Xof_fsdb_mgr__sql b/c it keeps a local init; - fsdb_mgr.Init_by_wiki(wiki); - fsdb_mgr.Bin_mgr().Wkrs__clear(); - Xof_bin_wkr__fsdb_sql bin_wkr_fsdb = (Xof_bin_wkr__fsdb_sql)fsdb_mgr.Bin_mgr().Wkrs__get_or_new(Xof_bin_wkr_.Key_fsdb_wiki); + Xowe_wiki_bldr.Create(wiki, 1, "dump.xml"); + Xowd_db_file text_db = wiki.Data_mgr__core_mgr().Dbs__make_by_tid(Xowd_db_file_.Tid_text); text_db.Tbl__text().Create_tbl(); + Fsdb_db_mgr__v2 fsdb_core = Fsdb_db_mgr__v2_bldr.I.Make(wiki); + fsdb_mgr.Mnt_mgr().Ctor_by_load(fsdb_core); + fsdb_mgr.Mnt_mgr().Mnts__get_main().Bin_mgr().Dbs__make("temp.xowa"); + wiki.File_mgr().Init_file_mgr_by_load(wiki); + fsdb_mgr.Bin_mgr().Wkrs__del(Xof_bin_wkr_.Key_http_wmf); // never use http_wmf wkr for these tests + Xof_bin_wkr__fsdb_sql bin_wkr_fsdb = (Xof_bin_wkr__fsdb_sql)fsdb_mgr.Bin_mgr().Wkrs__get_or_null(Xof_bin_wkr_.Key_fsdb_wiki); fsdb_mgr.Bin_mgr().Resizer_(Xof_img_wkr_resize_img_mok._); bin_wkr_fsdb.Resize_allowed_(true); } @@ -44,20 +49,23 @@ class Xof_file_fxt { this.Init_orig_db(Xof_orig_arg.new_comm(ttl, w, h)); } public void Init_orig_db(Xof_orig_arg arg) { - fsdb_mgr.Orig_mgr().Insert(arg.Repo(), arg.Page(), Xof_ext_.new_by_ttl_(arg.Page()).Id(), arg.W(), arg.H(), arg.Redirect()); + orig_mgr.Insert(arg.Repo(), arg.Page(), Xof_ext_.new_by_ttl_(arg.Page()).Id(), arg.W(), arg.H(), arg.Redirect()); } public void Init_fsdb_db(Xof_fsdb_arg arg) { + Fsm_mnt_itm mnt_itm = fsdb_mgr.Mnt_mgr().Mnts__get_main(); + Fsm_atr_fil atr_fil = mnt_itm.Atr_mgr().Db__core(); + Fsm_bin_fil bin_fil = mnt_itm.Bin_mgr().Dbs__get_nth(); if (arg.Is_thumb()) - fsdb_mgr.Mnt_mgr().Thm_insert(tmp_thm, arg.Wiki(), arg.Ttl(), arg.Ext(), arg.W(), arg.H(), arg.Time(), arg.Page(), arg.Modified(), arg.Hash(), arg.Bin().length, gplx.ios.Io_stream_rdr_.mem_(arg.Bin())); + mnt_itm.Insert_thm(tmp_thm, atr_fil, bin_fil, arg.Wiki(), arg.Ttl(), arg.Ext(), arg.W(), arg.H(), arg.Time(), arg.Page(), arg.Bin().length, gplx.ios.Io_stream_rdr_.mem_(arg.Bin())); else - fsdb_mgr.Mnt_mgr().Img_insert(tmp_img, arg.Wiki(), arg.Ttl(), arg.Ext(), arg.W(), arg.H(), arg.Modified(), arg.Hash(), arg.Bin().length, gplx.ios.Io_stream_rdr_.mem_(arg.Bin())); + mnt_itm.Insert_img(tmp_img, atr_fil, bin_fil, arg.Wiki(), arg.Ttl(), arg.Ext(), arg.W(), arg.H(), arg.Bin().length, gplx.ios.Io_stream_rdr_.mem_(arg.Bin())); } public void Exec_get(Xof_exec_arg arg) { byte[] ttl_bry = arg.Ttl(); Xof_fsdb_itm itm = new Xof_fsdb_itm(); itm.Ctor_by_lnki(ttl_bry, arg.Lnki_type(), arg.Lnki_w(), arg.Lnki_h(), Xof_patch_upright_tid_.Tid_all, arg.Lnki_upright(), arg.Lnki_time(), Xof_lnki_page.Null); ListAdp itms_list = ListAdp_.new_(); itms_list.Add(itm); - fsdb_mgr.Orig_mgr().Find_by_list(OrderedHash_.new_bry_(), itms_list, Xof_exec_tid.Tid_wiki_page); + orig_mgr.Find_by_list(OrderedHash_.new_bry_(), itms_list, Xof_exec_tid.Tid_wiki_page); Xoa_ttl ttl = Xoa_ttl.parse_(wiki, Xow_ns_.Id_main, ttl_bry); Xoae_page page = Xoae_page.new_(wiki, ttl); fsdb_mgr.Fsdb_search_by_list(arg.Exec_tid(), itms_list, page, Xog_js_wkr_.Null); diff --git a/400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr.java b/400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr.java index 61b0a3588..bc9ef6881 100644 --- a/400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr.java +++ b/400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr.java @@ -18,6 +18,8 @@ along with this program. If not, see . package gplx.xowa.files.gui; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; public interface Xog_js_wkr { void Html_img_update (String uid, String src, int w, int h); + void Html_redlink (String html_uid); + void Html_atr_set (String uid, String key, String val); void Html_elem_replace_html (String uid, String html); } diff --git a/400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr_.java b/400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr_.java index ab056508f..8cc9a467c 100644 --- a/400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr_.java +++ b/400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr_.java @@ -23,4 +23,5 @@ class Xog_js_wkr__null implements Xog_js_wkr { public void Html_img_update (String uid, String src, int w, int h) {} public void Html_atr_set (String uid, String key, String val) {} public void Html_elem_replace_html (String uid, String html) {} + public void Html_redlink (String html_uid) {} } diff --git a/400_xowa/src/gplx/xowa/files/origs/Xob_orig_tbl_bldr.java b/400_xowa/src/gplx/xowa/files/origs/Xob_orig_tbl_bldr.java index 78d8e4580..0ef52b93f 100644 --- a/400_xowa/src/gplx/xowa/files/origs/Xob_orig_tbl_bldr.java +++ b/400_xowa/src/gplx/xowa/files/origs/Xob_orig_tbl_bldr.java @@ -16,35 +16,36 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.files.origs; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; -import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; import gplx.xowa.bldrs.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.files.origs.*; import gplx.xowa.bldrs.oimgs.*; +import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; import gplx.xowa.bldrs.*; import gplx.fsdb.*; public class Xob_orig_tbl_bldr extends Xob_itm_basic_base implements Xob_cmd { private Db_conn conn; public Xob_orig_tbl_bldr(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.wiki_orig"; - public void Cmd_ini(Xob_bldr bldr) {} + public String Cmd_key() {return Xob_cmd_keys.Key_file_orig_reg;} + public void Cmd_init(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) { Xof_fsdb_mode fsdb_mode = wiki.File_mgr__fsdb_mode(); fsdb_mode.Tid_make_y_(); wiki.Init_assert(); - conn = Xof_orig_tbl.Conn__get_or_make(wiki.Fsys_mgr().File_dir(), new Xof_orig_tbl(), Bool_.Y, fsdb_mode); // NOTE: Xof_orig_tbl needed if db doesn't exist and tbl.meta needs to be created - Io_url make_db_url = Xodb_db_file.init__file_make(wiki.Fsys_mgr().Root_dir()).Url(); + Fsdb_db_mgr db_core_mgr = Fsdb_db_mgr_.new_detect(wiki.Domain_str(), wiki.Fsys_mgr().Root_dir(), wiki.Fsys_mgr().File_dir()); + conn = db_core_mgr.File__orig_tbl_ary()[gplx.fsdb.meta.Fsm_mnt_mgr.Mnt_idx_main].Conn(); + Io_url make_db_url = Xob_db_file.new__file_make(wiki.Fsys_mgr().Root_dir()).Url(); Sqlite_engine_.Db_attach(conn, "make_db", make_db_url.Raw()); } public void Cmd_run() {Exec();} public void Cmd_end() {} - public void Cmd_print() {} + public void Cmd_term() {} private void Exec() { - usr_dlg.Prog_many("", "", "deleting wiki_orig"); conn.Exec_sql(Sql_delete_wiki_orig); // always delete wiki_orig, else will not pick up changed sizes / moved repos; DATE:2014-07-21 - usr_dlg.Prog_many("", "", "inserting xfer direct"); conn.Exec_sql(Sql_create_xfer_direct); - usr_dlg.Prog_many("", "", "inserting xfer redirect"); conn.Exec_sql(Sql_create_xfer_redirect); - usr_dlg.Prog_many("", "", "inserting orig direct"); conn.Exec_sql(Sql_create_orig_direct); - usr_dlg.Prog_many("", "", "inserting orig redirect"); conn.Exec_sql(Sql_create_orig_redirect); + conn.Exec_sql_plog_txn("orig_wkr.deleting orig_reg" , Sql_delete_wiki_orig); // always delete orig_reg, else will not pick up changed sizes / moved repos; DATE:2014-07-21 + conn.Exec_sql_plog_txn("orig_wkr.inserting xfer direct" , Sql_create_xfer_direct); + conn.Exec_sql_plog_txn("orig_wkr.inserting xfer redirect" , Sql_create_xfer_redirect); + conn.Exec_sql_plog_txn("orig_wkr.inserting orig direct" , Sql_create_orig_direct); + conn.Exec_sql_plog_txn("orig_wkr.inserting orig redirect" , Sql_create_orig_redirect); } - private static final String - Sql_delete_wiki_orig = "DELETE FROM wiki_orig;" + public static final String + Sql_delete_wiki_orig = "DELETE FROM orig_reg;" , Sql_create_xfer_direct = String_.Concat_lines_nl - ( "INSERT INTO wiki_orig " - , "(orig_ttl, status, orig_repo, orig_ext, orig_w, orig_h, orig_redirect)" + ( "INSERT INTO orig_reg " + , "(orig_ttl, orig_status, orig_repo, orig_ext, orig_w, orig_h, orig_redirect)" , "SELECT DISTINCT" , " xfer.lnki_ttl" , ", 1 --pass" @@ -54,12 +55,12 @@ public class Xob_orig_tbl_bldr extends Xob_itm_basic_base implements Xob_cmd { , ", xfer.orig_h" , ", ''" , "FROM make_db.xfer_regy xfer" - , " LEFT JOIN wiki_orig cur ON xfer.lnki_ttl = cur.orig_ttl" + , " LEFT JOIN orig_reg cur ON xfer.lnki_ttl = cur.orig_ttl" , "WHERE cur.orig_ttl IS NULL" ) , Sql_create_xfer_redirect = String_.Concat_lines_nl - ( "INSERT INTO wiki_orig " - , "(orig_ttl, status, orig_repo, orig_ext, orig_w, orig_h, orig_redirect)" + ( "INSERT INTO orig_reg " + , "(orig_ttl, orig_status, orig_repo, orig_ext, orig_w, orig_h, orig_redirect)" , "SELECT DISTINCT" , " xfer.orig_redirect_src" , ", 1 --pass" @@ -69,13 +70,13 @@ public class Xob_orig_tbl_bldr extends Xob_itm_basic_base implements Xob_cmd { , ", xfer.orig_h" , ", xfer.lnki_ttl" , "FROM make_db.xfer_regy xfer" - , " LEFT JOIN wiki_orig cur ON xfer.orig_redirect_src = cur.orig_ttl" + , " LEFT JOIN orig_reg cur ON xfer.orig_redirect_src = cur.orig_ttl" , "WHERE cur.orig_ttl IS NULL" , "AND Coalesce(xfer.orig_redirect_src, '') != ''" ) , Sql_create_orig_direct = String_.Concat_lines_nl - ( "INSERT INTO wiki_orig " - , "(orig_ttl, status, orig_repo, orig_ext, orig_w, orig_h, orig_redirect)" + ( "INSERT INTO orig_reg " + , "(orig_ttl, orig_status, orig_repo, orig_ext, orig_w, orig_h, orig_redirect)" , "SELECT DISTINCT" , " orig.lnki_ttl" , ", 0 --unknown" @@ -85,15 +86,15 @@ public class Xob_orig_tbl_bldr extends Xob_itm_basic_base implements Xob_cmd { , ", orig.orig_h" , ", ''" , "FROM make_db.orig_regy orig" - , " LEFT JOIN wiki_orig cur ON orig.lnki_ttl = cur.orig_ttl" - , "WHERE cur.orig_ttl IS NULL" // not already in wiki_orig + , " LEFT JOIN orig_reg cur ON orig.lnki_ttl = cur.orig_ttl" + , "WHERE cur.orig_ttl IS NULL" // not already in orig_reg , "AND orig.orig_repo IS NOT NULL" // not found in oimg_image.sqlite3 , "AND Coalesce(orig.orig_w , -1) != -1" // ignore entries that are either ext_id = 0 ("File:1") or don't have any width / height info (makes it useless); need to try to get again from wmf_api , "AND Coalesce(orig.orig_redirect_ttl, '') == ''" // direct ) , Sql_create_orig_redirect = String_.Concat_lines_nl - ( "INSERT INTO wiki_orig " - , "(orig_ttl, status, orig_repo, orig_ext, orig_w, orig_h, orig_redirect)" + ( "INSERT INTO orig_reg " + , "(orig_ttl, orig_status, orig_repo, orig_ext, orig_w, orig_h, orig_redirect)" , "SELECT DISTINCT" , " orig.orig_redirect_ttl" , ", 0 --unknown" @@ -103,8 +104,8 @@ public class Xob_orig_tbl_bldr extends Xob_itm_basic_base implements Xob_cmd { , ", orig.orig_h" , ", ''" , "FROM make_db.orig_regy orig" - , " LEFT JOIN wiki_orig cur ON orig.orig_redirect_ttl = cur.orig_ttl" - , "WHERE cur.orig_ttl IS NULL" // not already in wiki_orig + , " LEFT JOIN orig_reg cur ON orig.orig_redirect_ttl = cur.orig_ttl" + , "WHERE cur.orig_ttl IS NULL" // not already in orig_reg , "AND orig.orig_repo IS NOT NULL" // not found in oimg_image.sqlite3 , "AND Coalesce(orig.orig_w, -1) != -1" // ignore entries that are either ext_id = 0 ("File:1") or don't have any width / height info (makes it useless); need to try to get again from wmf_api , "AND Coalesce(orig.orig_redirect_ttl, '') != ''" // redirect diff --git a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_mgr.java b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_mgr.java index 27c653db5..74618a951 100644 --- a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_mgr.java +++ b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_mgr.java @@ -16,20 +16,20 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.files.origs; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; -import gplx.core.primitives.*; -import gplx.dbs.*; +import gplx.core.primitives.*; import gplx.dbs.*; import gplx.xowa.files.repos.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.wmfs.apis.*; public class Xof_orig_mgr { - private Xof_orig_wkr[] wkrs; private int wkrs_len; - private Xof_url_bldr url_bldr; private Xow_repo_mgr repo_mgr; - private final Xof_img_size img_size = new Xof_img_size(); + private Xof_orig_wkr[] wkrs; private int wkrs_len; + private Xof_url_bldr url_bldr; private Xow_repo_mgr repo_mgr; private final Xof_img_size img_size = new Xof_img_size(); public Xof_orig_mgr() {this.Wkrs__clear();} - public void Init_by_wiki(Io_url db_dir, boolean schema_is_1, byte[] domain_bry, Xof_download_wkr download_wkr, Xow_repo_mgr repo_mgr, Xof_url_bldr url_bldr, Xof_fsdb_mode fsdb_mode) { + public void Init_by_wiki(Xof_fsdb_mode fsdb_mode, Xof_orig_tbl[] orig_tbls, byte[] domain_bry, Xof_download_wkr download_wkr, Xow_repo_mgr repo_mgr, Xof_url_bldr url_bldr) { this.repo_mgr = repo_mgr; this.url_bldr = url_bldr; if (!fsdb_mode.Tid_wmf()) { // add view,make; don't add if wmf - Xof_orig_wkr__orig_db wkr_xowa_db = new Xof_orig_wkr__orig_db(); - Xof_orig_tbl.Conn__get_or_make(db_dir, wkr_xowa_db.Tbl(), schema_is_1, fsdb_mode); - this.Wkrs__add_many(wkr_xowa_db); + int orig_tbls_len = orig_tbls.length; + for (int i = 0; i < orig_tbls_len; ++i) { + Xof_orig_tbl orig_tbl = orig_tbls[i]; + this.Wkrs__add_many(new Xof_orig_wkr__orig_db(orig_tbl, i == orig_tbls_len - 1)); + } } if (!fsdb_mode.Tid_make()) // add view,wmf; don't add if make this.Wkrs__add_many(new Xof_orig_wkr__wmf_api(new Xoapi_orig_wmf(), download_wkr, repo_mgr, domain_bry)); @@ -61,7 +61,7 @@ public class Xof_orig_mgr { if (!Io_mgr._.ExistsFil(fsdb.Html_view_url())) fsdb.File_exists_n_(); } catch (Exception e) { - throw Err_.err_(e, "orig: {0}", Err_.Message_gplx_brief(e)); + Xoa_app_.Usr_dlg().Warn_many("", "", "orig: ~{0}", Err_.Message_gplx_brief(e)); } } } @@ -71,21 +71,19 @@ public class Xof_orig_mgr { if (wkr.Add_orig(repo, page, ext, w, h, redirect)) break; } } - public void Txn_save() { - for (int i = 0; i < wkrs_len; i++) { - Xof_orig_wkr wkr = wkrs[i]; - wkr.Db_txn_save(); - } - } - public void Rls() { - for (int i = 0; i < wkrs_len; i++) { - Xof_orig_wkr wkr = wkrs[i]; - wkr.Db_rls(); - } - } private void Wkrs__clear() {wkrs = Xof_orig_wkr_.Ary_empty; wkrs_len = 0;} private void Wkrs__add_many(Xof_orig_wkr... v) { wkrs = (Xof_orig_wkr[])Array_.Resize_add(wkrs, v); wkrs_len += v.length; } + public void Wkrs_del(byte tid) { + ListAdp list = ListAdp_.new_(); + for (int i = 0; i < wkrs_len; ++i) { + Xof_orig_wkr wkr = wkrs[i]; + if (wkr.Tid() == tid) continue; // do not add deleted wkr + list.Add(wkr); + } + wkrs = (Xof_orig_wkr[])list.Xto_ary_and_clear(Xof_orig_wkr.class); + wkrs_len = wkrs.length; + } } diff --git a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_tbl.java b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_tbl.java index aebdab1f6..7a7890f92 100644 --- a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_tbl.java +++ b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_tbl.java @@ -19,40 +19,33 @@ package gplx.xowa.files.origs; import gplx.*; import gplx.xowa.*; import gplx.xo import gplx.core.primitives.*; import gplx.dbs.*; import gplx.dbs.utls.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.files.repos.*; -public class Xof_orig_tbl { - private String tbl_name = "file_orig_regy"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); - private String fld_repo, fld_ttl, fld_status, fld_ext, fld_w, fld_h, fld_redirect; - private Db_conn conn; private final Xof_orig_tbl__in_wkr select_in_wkr = new Xof_orig_tbl__in_wkr(); +public class Xof_orig_tbl implements RlsAble { + private final String tbl_name; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private final String fld_repo, fld_ttl, fld_status, fld_ext, fld_w, fld_h, fld_redirect; + private final Db_conn conn; private final Xof_orig_tbl__in_wkr select_in_wkr = new Xof_orig_tbl__in_wkr(); public Db_conn Conn() {return 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 = "wiki_orig"; - fld_prefix = "orig_"; - } - fld_repo = flds.Add_byte(fld_prefix + "repo"); - fld_ttl = flds.Add_str(fld_prefix + "ttl", 1024); - fld_status = flds.Add_byte("status"); // NOTE: "status" in v1 and v2 - fld_ext = flds.Add_int(fld_prefix + "ext"); - fld_w = flds.Add_int(fld_prefix + "w"); - fld_h = flds.Add_int(fld_prefix + "h"); - fld_redirect = flds.Add_str(fld_prefix + "redirect", 1024); - if (created) { - Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds - , Db_meta_idx.new_unique_by_tbl(tbl_name, "key", fld_ttl) - ); - conn.Exec_create_tbl_and_idx(meta); - } + public Xof_orig_tbl(Db_conn conn, boolean schema_is_1) { + this.conn = conn; + String fld_status_name = "orig_status"; + if (schema_is_1) {tbl_name = "wiki_orig"; fld_status_name = "status";} + else {tbl_name = "orig_reg";} + fld_ttl = flds.Add_str("orig_ttl", 1024); + fld_repo = flds.Add_byte("orig_repo"); + fld_status = flds.Add_byte(fld_status_name); + fld_ext = flds.Add_int("orig_ext"); + fld_w = flds.Add_int("orig_w"); + fld_h = flds.Add_int("orig_h"); + fld_redirect = flds.Add_str("orig_redirect", 1024); select_in_wkr.Ctor(this, tbl_name, flds, fld_ttl); + conn.Rls_reg(this); } - public void Select_by_list(OrderedHash rv, ListAdp itms) {select_in_wkr.Init(rv, itms).Select_in(Cancelable_.Never, gplx.xowa.dbs.Xodb_ctx.Null, conn, 0, itms.Count());} + public void Rls() {} + public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_normal_by_tbl(tbl_name, "main", fld_ttl)));} + public void Select_by_list(OrderedHash rv, ListAdp itms) {select_in_wkr.Init(rv, itms).Select_in(Cancelable_.Never, conn, 0, itms.Count());} public Xof_orig_itm Select_itm(byte[] ttl) { Xof_orig_itm rv = Xof_orig_itm.Null; - Db_rdr rdr = Db_rdr_.Null; + Db_rdr rdr = conn.Stmt_select(tbl_name, flds, fld_ttl).Clear().Crt_bry_as_str(fld_ttl, ttl).Exec_select__rls_auto(); try { - Db_stmt stmt = conn.Stmt_select(tbl_name, flds, fld_ttl); - rdr = stmt.Clear().Crt_bry_as_str(fld_ttl, ttl).Exec_select_as_rdr(); if (rdr.Move_next()) rv = Make_itm(rdr); } @@ -60,17 +53,14 @@ public class Xof_orig_tbl { return rv; } public boolean Exists__repo_ttl(byte repo, byte[] ttl) { - Db_rdr rdr = Db_rdr_.Null; - try { - rdr = conn.Stmt_select(tbl_name, flds, fld_repo, fld_ttl).Crt_byte(fld_repo, repo).Crt_bry_as_str(fld_ttl, ttl).Exec_select_as_rdr(); - return rdr.Move_next(); - } + Db_rdr rdr = conn.Stmt_select(tbl_name, flds, fld_repo, fld_ttl).Crt_byte(fld_repo, repo).Crt_bry_as_str(fld_ttl, ttl).Exec_select__rls_auto(); + try {return rdr.Move_next();} finally {rdr.Rls();} } public void Insert(byte repo, byte[] ttl, int ext, int w, int h, byte[] redirect) { Db_stmt stmt = conn.Stmt_insert(tbl_name, flds); stmt.Clear() - .Val_byte(fld_repo, repo).Val_bry_as_str(fld_ttl, ttl).Val_byte(fld_status, Status_found) + .Val_bry_as_str(fld_ttl, ttl).Val_byte(fld_repo, repo).Val_byte(fld_status, Status_found) .Val_int(fld_ext, ext).Val_int(fld_w, w).Val_int(fld_h, h).Val_bry_as_str(fld_redirect, redirect) .Exec_insert(); } @@ -94,22 +84,6 @@ public class Xof_orig_tbl { ); return rv.W() == Xof_img_size.Null ? Xof_orig_itm.Null : rv; } - public static final String Db_conn_bldr_type = "xowa.file.orig_regy"; - public static Db_conn Conn__get_or_make(Io_url root_dir, Xof_orig_tbl tbl, boolean schema_is_1, Xof_fsdb_mode fsdb_mode) { - Io_url conn_url = root_dir.GenSubFil("wiki.orig#00.sqlite3"); -// boolean created = Bool_.N; Db_conn conn = null; -// if (fsdb_create.Val()) { - Db_conn_bldr_data conn_data = Db_conn_bldr.I.Get_or_new("", conn_url); - Db_conn conn = conn_data.Conn(); - boolean created = conn_data.Created(); -// } -// else { -// conn = Db_conn_bldr.I.Get("", conn_url); -// created = false; -// } - tbl.Conn_(conn, created, schema_is_1); - return conn; - } private static final byte Status_found = 1; } class Xof_orig_tbl__in_wkr extends Db_in_wkr__base { @@ -119,8 +93,7 @@ class Xof_orig_tbl__in_wkr extends Db_in_wkr__base { this.tbl = tbl; this.tbl_name = tbl_name; this.flds = flds; this.fld_ttl = fld_ttl; } public Xof_orig_tbl__in_wkr Init(OrderedHash rv, ListAdp itms) {this.itms = itms; this.rv = rv; return this;} - @Override protected int Interval() {return gplx.dbs.engines.sqlite.Sqlite_engine_.Stmt_arg_max;} - @Override protected Db_qry Make_qry(Object db_ctx, int bgn, int end) { + @Override protected Db_qry Make_qry(int bgn, int end) { Object[] part_ary = In_ary(end - bgn); return Db_qry_.select_cols_(tbl_name, Db_crt_.in_(fld_ttl, part_ary), flds.To_str_ary()); } @@ -130,7 +103,7 @@ class Xof_orig_tbl__in_wkr extends Db_in_wkr__base { stmt.Crt_bry_as_str(fld_ttl, fsdb_itm.Lnki_ttl()); } } - @Override protected void Read_data(Cancelable cancelable, Object db_ctx, Db_rdr rdr) { + @Override protected void Read_data(Cancelable cancelable, Db_rdr rdr) { while (rdr.Move_next()) { if (cancelable.Canceled()) return; Xof_orig_itm itm = tbl.Make_itm(rdr); diff --git a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_tbl_tst.java b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_tbl_tst.java index ccef3e041..e9095e84e 100644 --- a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_tbl_tst.java +++ b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_tbl_tst.java @@ -29,11 +29,12 @@ public class Xof_orig_tbl_tst { } } class Xof_orig_tbl_fxt { - private Xof_orig_tbl tbl = new Xof_orig_tbl(); + private Xof_orig_tbl tbl; public void Clear() { - String test_url = "test/file/en.wikipedia.org/file/orig_regy"; - Db_conn conn = Db_conn_pool.I.Get_or_new__mem(test_url); - tbl.Conn_(conn, Bool_.Y, Bool_.Y); + Io_url test_url = Io_url_.mem_fil_("mem/file/en.wikipedia.org/file/orig_regy"); + Db_conn conn = Db_conn_bldr.I.New(test_url); + tbl = new Xof_orig_tbl(conn, Bool_.Y); + tbl.Create_tbl(); } public Xof_orig_itm Exec_insert(String ttl, int w, int h) { byte[] ttl_bry = Bry_.new_utf8_(ttl); diff --git a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_wkr__orig_db.java b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_wkr__orig_db.java index c1da9c033..7f52ccd12 100644 --- a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_wkr__orig_db.java +++ b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_wkr__orig_db.java @@ -18,18 +18,20 @@ along with this program. If not, see . package gplx.xowa.files.origs; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.dbs.*; public class Xof_orig_wkr__orig_db implements Xof_orig_wkr { + private final boolean addable; + public Xof_orig_wkr__orig_db(Xof_orig_tbl tbl, boolean addable) {this.tbl = tbl; this.addable = addable;} public byte Tid() {return Xof_orig_wkr_.Tid_xowa_db;} - public Xof_orig_tbl Tbl() {return tbl;} private final Xof_orig_tbl tbl = new Xof_orig_tbl(); - public void Conn_(Db_conn conn, boolean created, boolean schema_is_1) {tbl.Conn_(conn, created, schema_is_1);} + public Xof_orig_tbl Tbl() {return tbl;} private final Xof_orig_tbl tbl; public void Find_by_list(OrderedHash rv, ListAdp itms) {tbl.Select_by_list(rv, itms);} public Xof_orig_itm Find_as_itm(byte[] ttl) {return tbl.Select_itm(ttl);} - public boolean Add_orig(byte repo, byte[] page, int ext_id, int w, int h, byte[] redirect) { + public boolean Add_orig(byte repo, byte[] page, int ext_id, int w, int h, byte[] redirect) { + if (!addable) return false; if (tbl.Exists__repo_ttl(repo, page)) tbl.Update(repo, page, ext_id, w, h, redirect); else tbl.Insert(repo, page, ext_id, w, h, redirect); return true; } - public void Db_txn_save() {tbl.Conn().Txn_mgr().Txn_end_all();} - public void Db_rls() {tbl.Conn().Conn_term();} + public void Db_txn_save() {tbl.Conn().Txn_end();} + public void Db_rls() {tbl.Conn().Rls_conn();} } diff --git a/400_xowa/src/gplx/xowa/files/origs/Xof_wiki_finder.java b/400_xowa/src/gplx/xowa/files/origs/Xof_wiki_finder.java index 3d3fe635e..35764d665 100644 --- a/400_xowa/src/gplx/xowa/files/origs/Xof_wiki_finder.java +++ b/400_xowa/src/gplx/xowa/files/origs/Xof_wiki_finder.java @@ -16,9 +16,10 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.files.origs; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; +import gplx.xowa.wikis.data.tbls.*; class Xof_wiki_finder { // UNUSED private Xowe_wiki wiki_0, wiki_1; - private Xodb_page db_page = new Xodb_page(); + private Xowd_page_itm db_page = new Xowd_page_itm(); public Xof_wiki_finder(Xowe_wiki wiki_0, Xowe_wiki wiki_1) { this.wiki_0 = wiki_0; this.wiki_1 = wiki_1; } @@ -61,7 +62,7 @@ class Xof_wiki_finder { // UNUSED } return true; } - private boolean Find_page__by_wiki(Xodb_page db_page, Xowe_wiki wiki, int ns_id, byte[] ttl_bry) { + private boolean Find_page__by_wiki(Xowd_page_itm db_page, Xowe_wiki wiki, int ns_id, byte[] ttl_bry) { Xow_ns ns = wiki.Ns_mgr().Ids_get_or_null(ns_id); wiki.Db_mgr().Load_mgr().Load_page(db_page, ns, false); return db_page.Exists(); diff --git a/400_xowa/src/gplx/xowa/gui/menus/Xog_menu_mgr.java b/400_xowa/src/gplx/xowa/gui/menus/Xog_menu_mgr.java index e15474de3..e776e9516 100644 --- a/400_xowa/src/gplx/xowa/gui/menus/Xog_menu_mgr.java +++ b/400_xowa/src/gplx/xowa/gui/menus/Xog_menu_mgr.java @@ -35,6 +35,7 @@ public class Xog_menu_mgr implements GfoInvkAble { } public void Init_by_kit() { try { + if (Xoa_app_.Mode == Xoa_app_.Mode_http) return; // NOTE: do not try to initialize menu if http_server; will fail in headless mode when it tries to load SWT images; DATE:2015-03-27 popup_mnu_mgr.Init_by_kit(); window_mnu_mgr.Init_by_kit(); Lang_changed(app.User().Lang()); diff --git a/400_xowa/src/gplx/xowa/gui/menus/Xog_menu_mnu_src.java b/400_xowa/src/gplx/xowa/gui/menus/Xog_menu_mnu_src.java index f98b9bf45..cd0059a90 100644 --- a/400_xowa/src/gplx/xowa/gui/menus/Xog_menu_mnu_src.java +++ b/400_xowa/src/gplx/xowa/gui/menus/Xog_menu_mnu_src.java @@ -243,5 +243,5 @@ class Xog_menu_bldr { , Const_itm_grp_bgn_rhs = Bry_.new_ascii_("') {\n") , Const_itm_grp_end = Bry_.new_ascii_("}\n") ; - public static final Xog_menu_bldr _ = new Xog_menu_bldr(); Xog_menu_bldr() {} + public static final Xog_menu_bldr _ = new Xog_menu_bldr(); Xog_menu_bldr() {} } diff --git a/400_xowa/src/gplx/xowa/gui/urls/Xog_url_wkr.java b/400_xowa/src/gplx/xowa/gui/urls/Xog_url_wkr.java index ccad2a6f2..c19fabdc3 100644 --- a/400_xowa/src/gplx/xowa/gui/urls/Xog_url_wkr.java +++ b/400_xowa/src/gplx/xowa/gui/urls/Xog_url_wkr.java @@ -119,7 +119,7 @@ public class Xog_url_wkr { tmp_bfr.Add_byte(Byte_ascii.Slash); } tmp_bfr.Add(page_bry); - page_bry = tmp_bfr.Mkr_rls().Xto_bry_and_clear(); + page_bry = tmp_bfr.To_bry_and_rls(); } rv.Segs_ary_(Bry_.Ary_empty); } diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_html_itm.java b/400_xowa/src/gplx/xowa/gui/views/Xog_html_itm.java index 5d814e843..1d8f12074 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_html_itm.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_html_itm.java @@ -103,6 +103,7 @@ public class Xog_html_itm implements Xog_js_wkr, GfoInvkAble, GfoEvObj { GfoMsg m = GfoMsg_.new_cast_(Invk_html_elem_atr_set).Add("elem_id", elem_id).Add("atr_key", atr_key).Add("atr_val", atr_val); GfoInvkAble_.InvkCmd_msg(cmd_sync, Invk_html_elem_atr_set, m); } + public void Html_redlink(String html_uid) {Html_elem_atr_set_append(html_uid, "class", "new");} public void Html_elem_atr_set_append(String elem_id, String atr_key, String atr_val) { GfoMsg m = GfoMsg_.new_cast_(Invk_html_elem_atr_set_append).Add("elem_id", elem_id).Add("atr_key", atr_key).Add("atr_val", atr_val); GfoInvkAble_.InvkCmd_msg(cmd_sync, Invk_html_elem_atr_set_append, m); diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_html_js_cbk.java b/400_xowa/src/gplx/xowa/gui/views/Xog_html_js_cbk.java index 47a2be322..93e684a80 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_html_js_cbk.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_html_js_cbk.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.gui.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.gui.*; -import gplx.threads.*; import gplx.xowa.xtns.pfuncs.ifs.*; +import gplx.threads.*; import gplx.xowa.xtns.pfuncs.ifs.*; import gplx.xowa.wikis.data.tbls.*; public class Xog_html_js_cbk implements GfoInvkAble { private Xoae_app app; private Xog_html_itm html_itm; @@ -86,8 +86,8 @@ public class Xog_html_js_cbk implements GfoInvkAble { Xoa_ttl ttl = Xoa_ttl.parse_(wiki, ttl_bry); wiki.Db_mgr().Load_mgr().Load_by_ttl(tmp_page, ttl.Ns(), ttl.Page_db()); } - return String_.Ary(tmp_page.Exists() ? "1" : "0", Int_.Xto_str(tmp_page.Id()), Int_.Xto_str(tmp_page.Ns_id()), String_.new_utf8_(tmp_page.Ttl_page_db()), Bool_.Xto_str_lower(tmp_page.Redirected()), tmp_page.Modified_on().XtoStr_fmt("yyyy-MM-dd HH:mm:ss"), Int_.Xto_str(tmp_page.Wtxt_len())); - } private static final Xodb_page tmp_page = Xodb_page.new_tmp(); + return String_.Ary(tmp_page.Exists() ? "1" : "0", Int_.Xto_str(tmp_page.Id()), Int_.Xto_str(tmp_page.Ns_id()), String_.new_utf8_(tmp_page.Ttl_page_db()), Bool_.Xto_str_lower(tmp_page.Redirected()), tmp_page.Modified_on().XtoStr_fmt("yyyy-MM-dd HH:mm:ss"), Int_.Xto_str(tmp_page.Text_len())); + } private static final Xowd_page_itm tmp_page = Xowd_page_itm.new_tmp(); private String[][] Get_titles_meta(GfoMsg m) { Xowe_wiki wiki = html_itm.Owner_tab().Wiki(); try { diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_launcher_tabs.java b/400_xowa/src/gplx/xowa/gui/views/Xog_launcher_tabs.java index 483e1122b..67a237732 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_launcher_tabs.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_launcher_tabs.java @@ -65,11 +65,11 @@ class Xog_launcher_tabs { Xog_tab_itm tab = win.Tab_mgr().Tabs_new_init(launch_wiki, Xoae_page.new_(launch_wiki, launch_ttl)); // WORKAROUND: set the tab to an empty page, else null ref later; DATE:2014-07-23 tab.Show_url_bgn(launch_url); } - public static final Xog_launcher_tabs _ = new Xog_launcher_tabs(); Xog_launcher_tabs() {} + public static final Xog_launcher_tabs _ = new Xog_launcher_tabs(); Xog_launcher_tabs() {} } class Io_fil_marker { private Io_url url; - private Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_._; + private Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_.I; public Io_fil_marker Usr_dlg_(Gfo_usr_dlg v) {this.usr_dlg = v; return this;} public Io_fil_marker Url_(Io_url url) {this.url = url; return this;} public boolean Bgn() { diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm.java b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm.java index efeadd739..f029db7a5 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm.java @@ -161,9 +161,9 @@ public class Xog_tab_itm implements GfoInvkAble { // win.Page__async__bgn(this); Gfo_thread_wkr async_wkr = null; if (wkr.Hdump_enabled()) { - wiki.File_mgr().Fsdb_mgr().Init_by_wiki(wiki); + wiki.File_mgr().Init_file_mgr_by_load(wiki); Xof_fsdb_mgr fsdb_mgr = wiki.File_mgr().Fsdb_mgr(); - async_wkr = new Xof_file_wkr(fsdb_mgr.Orig_mgr(), fsdb_mgr.Bin_mgr(), fsdb_mgr.Mnt_mgr(), app.File_mgr__cache_mgr(), wiki.File_mgr__repo_mgr(), html_itm, page, page.Hdump_data().Imgs(), gplx.xowa.files.Xof_exec_tid.Tid_wiki_page); + async_wkr = new Xof_file_wkr(wiki.File_mgr__orig_mgr(), fsdb_mgr.Bin_mgr(), fsdb_mgr.Mnt_mgr(), app.File_mgr__cache_mgr(), wiki.File_mgr__repo_mgr(), html_itm, page, page.Hdump_data().Imgs(), gplx.xowa.files.Xof_exec_tid.Tid_wiki_page); if (wiki.Html_mgr__hdump_enabled()) { wiki.Html_mgr__hdump_wtr().Save(page); } @@ -177,6 +177,19 @@ public class Xog_tab_itm implements GfoInvkAble { this.tab_is_loading = false; } } + public void Exec_async_hdump(Xoa_app app, Xow_wiki wiki, gplx.xowa.files.gui.Xog_js_wkr js_wkr, gplx.threads.Gfo_thread_pool thread_pool, Xoa_page page, ListAdp imgs, int[] redlink_ary) { + if (imgs.Count() > 0) { + Xof_file_wkr file_thread = new Xof_file_wkr + ( wiki.File_mgr__orig_mgr(), wiki.File_mgr__bin_mgr(), wiki.File_mgr__mnt_mgr() + , app.File_mgr__cache_mgr(), wiki.File_mgr__repo_mgr(), html_itm, page, imgs + , gplx.xowa.files.Xof_exec_tid.Tid_wiki_page); + thread_pool.Add_at_end(file_thread); thread_pool.Run(); + } + if (redlink_ary.length > 0) { + Xog_redlink_thread redlink_thread = new Xog_redlink_thread(redlink_ary, js_wkr); + thread_pool.Add_at_end(redlink_thread); thread_pool.Run(); + } + } @gplx.Internal protected void Show_url_failed(Load_page_wkr wkr) { try { Xog_tab_itm_read_mgr.Show_page_err(win, this, wkr.Wiki(), wkr.Url(), wkr.Ttl(), wkr.Exc()); diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm_edit_mgr.java b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm_edit_mgr.java index c37c0d3dd..4dbe1791b 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm_edit_mgr.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm_edit_mgr.java @@ -58,7 +58,7 @@ public class Xog_tab_itm_edit_mgr { Xoh_page_wtr_wkr wkr = wiki.Html_mgr().Page_wtr_mgr().Wkr(Xopg_view_mode.Tid_read); wkr.Page_(new_page); wkr.XferAry(tmp_bfr, 0); - byte[] new_html = tmp_bfr.Mkr_rls().Xto_bry_and_clear(); + byte[] new_html = tmp_bfr.To_bry_and_rls(); new_page.Html_data().Edit_preview_(new_html); Invalidate(wiki); @@ -106,7 +106,7 @@ public class Xog_tab_itm_edit_mgr { Bry_bfr bfr = win.App().Utl__bfr_mkr().Get_m001(); bfr.Add(new_page.Root().Root_src()); wiki.Ctx().Defn_trace().Print(data, bfr); - new_page.Data_raw_(bfr.Mkr_rls().Xto_bry_and_clear()); + new_page.Data_raw_(bfr.To_bry_and_rls()); byte old = tab.View_mode(); tab.View_mode_(view_tid); Xog_tab_itm_read_mgr.Show_page(tab, new_page, false); diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm_read_mgr.java b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm_read_mgr.java index 6108dd4ff..e21754694 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm_read_mgr.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm_read_mgr.java @@ -36,7 +36,7 @@ public class Xog_tab_itm_read_mgr { catch (Exception e) { if (String_.Eq(Err_.Message_lang(e), "class org.eclipse.swt.SWTException Widget is disposed")) return; // ignore errors caused by user closing tab early; DATE:2014-07-26 if (show_is_err) { // trying to show error page, but failed; don't show again, else recursion until out of memory; TODO:always load error page; no reason it should fail; WHEN:html_skin; DATE:2014-06-08 - Gfo_usr_dlg_._.Warn_many("", "", "fatal error trying to load error page; page=~{0} err=~{1}" + new_page.Url().Xto_full_str_safe(), Err_.Message_gplx(e)); + Gfo_usr_dlg_.I.Warn_many("", "", "fatal error trying to load error page; page=~{0} err=~{1}" + new_page.Url().Xto_full_str_safe(), Err_.Message_gplx(e)); return; } else @@ -63,7 +63,7 @@ public class Xog_tab_itm_read_mgr { if (url != null && ttl != null) { try {url_str = url_parser.Build_str(url);} catch (Exception e) { // HACK: failed pages will have a null wiki; for now, catch and ignore; DATE:2014-06-22 - Gfo_usr_dlg_._.Warn_many("", "", "failed to build url: url=~{0}, err=~{1}", String_.new_utf8_(url.Raw()), Err_.Message_gplx(e)); + Gfo_usr_dlg_.I.Warn_many("", "", "failed to build url: url=~{0}, err=~{1}", String_.new_utf8_(url.Raw()), Err_.Message_gplx(e)); url_str = String_.new_utf8_(ttl.Full_txt()); } win_str = String_.new_utf8_(Bry_.Add(ttl.Full_txt(), Win_text_suffix_page)); diff --git a/400_xowa/src/gplx/xowa/html/Xoh_html_wtr.java b/400_xowa/src/gplx/xowa/html/Xoh_html_wtr.java index eca655890..40eb60a8d 100644 --- a/400_xowa/src/gplx/xowa/html/Xoh_html_wtr.java +++ b/400_xowa/src/gplx/xowa/html/Xoh_html_wtr.java @@ -644,7 +644,7 @@ class Xoh_display_ttl_wtr { } return false; } - public static final Xoh_display_ttl_wtr _ = new Xoh_display_ttl_wtr(); Xoh_display_ttl_wtr() {} + public static final Xoh_display_ttl_wtr _ = new Xoh_display_ttl_wtr(); Xoh_display_ttl_wtr() {} } /* NOTE_1:inline always written as , not diff --git a/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_wkr_.java b/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_wkr_.java index f32025421..835a87713 100644 --- a/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_wkr_.java +++ b/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_wkr_.java @@ -38,7 +38,7 @@ public class Xoh_page_wtr_wkr_ { if (head_end == null) return; int insert_pos = Bry_finder.Find_fwd(html_bfr.Bfr(), Html_tag_.Head_rhs); if (insert_pos == Bry_finder.Not_found) { - Gfo_usr_dlg_._.Warn_many("", "", "could not find "); + Gfo_usr_dlg_.I.Warn_many("", "", "could not find "); return; } html_bfr.Insert_at(insert_pos, head_end); @@ -48,7 +48,7 @@ public class Xoh_page_wtr_wkr_ { if (html_end == null) return; int insert_pos = Bry_finder.Find_bwd(html_bfr.Bfr(), Html_tag_.Html_rhs, html_bfr.Len()); if (insert_pos == Bry_finder.Not_found) { - Gfo_usr_dlg_._.Warn_many("", "", "could not find "); + Gfo_usr_dlg_.I.Warn_many("", "", "could not find "); return; } html_bfr.Insert_at(insert_pos, html_end); diff --git a/400_xowa/src/gplx/xowa/html/Xow_html_mgr.java b/400_xowa/src/gplx/xowa/html/Xow_html_mgr.java index 4e59274b8..4d41f3d7e 100644 --- a/400_xowa/src/gplx/xowa/html/Xow_html_mgr.java +++ b/400_xowa/src/gplx/xowa/html/Xow_html_mgr.java @@ -41,7 +41,7 @@ public class Xow_html_mgr implements GfoInvkAble { public void Init_by_lang(Xol_lang lang) { portal_mgr.Init_by_lang(lang); } - public Xowe_wiki Wiki() {return wiki;} private Xowe_wiki wiki; + public Xowe_wiki Wiki() {return wiki;} private Xowe_wiki wiki; public Xoh_html_wtr Html_wtr() {return html_wtr;} private Xoh_html_wtr html_wtr; public Xoh_page_wtr_mgr Page_wtr_mgr() {return page_wtr_mgr;} private Xoh_page_wtr_mgr page_wtr_mgr; public Xow_portal_mgr Portal_mgr() {return portal_mgr;} private Xow_portal_mgr portal_mgr; diff --git a/400_xowa/src/gplx/xowa/html/css/Xowd_css_core_mgr.java b/400_xowa/src/gplx/xowa/html/css/Xowd_css_core_mgr.java new file mode 100644 index 000000000..72a21dd4e --- /dev/null +++ b/400_xowa/src/gplx/xowa/html/css/Xowd_css_core_mgr.java @@ -0,0 +1,57 @@ +/* +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 . +*/ +package gplx.xowa.html.css; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; +import gplx.dbs.*; import gplx.xowa.wikis.data.tbls.*; +public class Xowd_css_core_mgr { + public static void Set(Xowd_css_core_tbl core_tbl, Xowd_css_file_tbl file_tbl, Io_url css_dir) {Set(core_tbl, file_tbl, css_dir, Key_default);} + public static void Set(Xowd_css_core_tbl core_tbl, Xowd_css_file_tbl file_tbl, Io_url css_dir, String key) { + Db_conn conn = core_tbl.Conn(); + Io_url[] file_list = Io_mgr._.QueryDir_args(css_dir).Recur_().ExecAsUrlAry(); + try { + conn.Txn_bgn(); + int css_id = core_tbl.Select_id_by_key(key); + DateAdp updated_on = DateAdp_.Now().XtoUtc(); + if (css_id == -1) + css_id = core_tbl.Insert(key, updated_on); + else { + core_tbl.Update(css_id, key, updated_on); + file_tbl.Delete(css_id); + } + for (Io_url file : file_list) { + String path = Op_sys.Fsys_path_to_lnx(file.GenRelUrl_orEmpty(css_dir)); + byte[] data = Io_mgr._.LoadFilBry(file); + file_tbl.Insert(css_id, path, data); + } + conn.Txn_end(); + } + catch (Exception e) {conn.Txn_cxl(); throw Err_.err_(e);} + } + public static void Get(Xowd_css_core_tbl core_tbl, Xowd_css_file_tbl file_tbl, Io_url css_dir) {Get(core_tbl, file_tbl, css_dir, Key_default);} + public static void Get(Xowd_css_core_tbl core_tbl, Xowd_css_file_tbl file_tbl, Io_url css_dir, String key) { + int css_id = core_tbl.Select_id_by_key(key); if (css_id == Xowd_css_core_tbl.Id_null) throw Err_.new_("skin:unknown key: {0}", key); + Xowd_css_file_itm[] file_list = file_tbl.Select_by_owner(css_id); + // Io_mgr._.DeleteDirDeep(css_dir); // NOTE: do not delete existing files; just overwrite; + int len = file_list.length; + for (int i = 0; i < len; ++i) { + Xowd_css_file_itm file = file_list[i]; + Io_url file_url = Io_url_.new_fil_(css_dir.Gen_sub_path_for_os(file.Path())); + Io_mgr._.SaveFilBry(file_url, file.Data()); + } + } + public static final String Key_default = "xowa.default"; +} diff --git a/400_xowa/src/gplx/xowa/html/css/Xowd_css_core_mgr_tst.java b/400_xowa/src/gplx/xowa/html/css/Xowd_css_core_mgr_tst.java new file mode 100644 index 000000000..6ea2f430e --- /dev/null +++ b/400_xowa/src/gplx/xowa/html/css/Xowd_css_core_mgr_tst.java @@ -0,0 +1,120 @@ +/* +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 . +*/ +package gplx.xowa.html.css; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; +import org.junit.*; import gplx.ios.*; import gplx.dbs.*; import gplx.xowa.wikis.data.tbls.*; +public class Xowd_css_core_mgr_tst { + @Before public void init() {fxt.Clear();} private Xowd_css_core_mgr_fxt fxt = new Xowd_css_core_mgr_fxt(); + @Test public void Basic() { + Xowd_css_core_itm[] skin_ary = fxt.Make_skin_ary + ( fxt.Make_skin_itm(1, "desktop", "20010101_050200") + ); + Xowd_css_file_itm[] file_ary = fxt.Make_file_ary + ( fxt.Make_file_itm(1, "a.css", "a_data") + , fxt.Make_file_itm(1, "b/b.png", "b/b_data") + ); + Io_url src_dir = Io_url_.mem_dir_("mem/src/"); + fxt.Init_fs(src_dir, file_ary); + fxt.Exec_set(src_dir, "desktop"); + fxt.Test_skin_tbl(skin_ary); + fxt.Test_file_tbl(file_ary); + + Io_url trg_dir = Io_url_.mem_dir_("mem/trg/"); + fxt.Exec_get(trg_dir, "desktop"); + fxt.Test_fs(trg_dir, file_ary); + } + @Test public void Update() { // update css files; keep same skin_id; insert new files + Xowd_css_core_itm[] skin_ary = fxt.Make_skin_ary + ( fxt.Make_skin_itm(1, "desktop", "20010101_050500") + ); + Xowd_css_file_itm[] file_ary = fxt.Make_file_ary + ( fxt.Make_file_itm(1, "a.css", "a_data") + , fxt.Make_file_itm(1, "b/b.png", "b/b_data") + ); + Io_url src_dir = Io_url_.mem_dir_("mem/src/"); + fxt.Init_fs(src_dir, file_ary); + fxt.Exec_set(src_dir, "desktop"); + + file_ary = fxt.Make_file_ary + ( fxt.Make_file_itm(1, "a1.css", "a1_data") + , fxt.Make_file_itm(1, "b/b1.png", "b/b1_data") + ); + Io_mgr._.DeleteDirDeep(src_dir); + fxt.Init_fs(src_dir, file_ary); + fxt.Exec_set(src_dir, "desktop"); + fxt.Test_skin_tbl(skin_ary); + fxt.Test_file_tbl(file_ary); + } +} +class Xowd_css_core_mgr_fxt { + private final Bry_bfr bfr = Bry_bfr.reset_(32); + private Xowd_css_core_tbl core_tbl; private Xowd_css_file_tbl file_tbl; + public void Clear() { + Tfds.Now_enabled_y_(); + Io_mgr._.InitEngine_mem(); + Db_conn_bldr.I.Reg_default_mem(); + Db_conn conn = Db_conn_bldr.I.New(Io_url_.mem_fil_("mem/db/css.sqlite3")); + this.core_tbl = new Xowd_css_core_tbl(conn); + this.file_tbl = new Xowd_css_file_tbl(conn); + core_tbl.Create_tbl(); + file_tbl.Create_tbl(); + } + public Xowd_css_core_itm Make_skin_itm(int id, String key, String updated_on) {return new Xowd_css_core_itm(id, key, DateAdp_.parse_gplx(updated_on));} + public Xowd_css_file_itm Make_file_itm(int skin_id, String path, String data) {return new Xowd_css_file_itm(skin_id, path, Bry_.new_utf8_(data));} + public Xowd_css_file_itm[] Make_file_ary(Xowd_css_file_itm... ary) {return ary;} + public Xowd_css_core_itm[] Make_skin_ary(Xowd_css_core_itm... ary) {return ary;} + public void Init_fs(Io_url css_dir, Xowd_css_file_itm[] file_ary) { + for (Xowd_css_file_itm itm : file_ary) + Io_mgr._.SaveFilBry(css_dir.GenSubFil(itm.Path()), itm.Data()); + } + public void Exec_set(Io_url css_dir, String key) {Xowd_css_core_mgr.Set(core_tbl, file_tbl, css_dir, key);} + public void Exec_get(Io_url css_dir, String key) {Xowd_css_core_mgr.Get(core_tbl, file_tbl, css_dir, key);} + public void Test_skin_tbl(Xowd_css_core_itm[] expd) { + Xowd_css_core_itm[] actl = core_tbl.Select_all(); + Tfds.Eq_str_lines(To_str(expd), To_str(actl)); + } + public void Test_file_tbl(Xowd_css_file_itm[] expd) { + Xowd_css_file_itm[] actl = file_tbl.Select_all(); + Tfds.Eq_str_lines(To_str(expd), To_str(actl)); + } + public void Test_fs(Io_url css_dir, Xowd_css_file_itm[] expd) { + Io_url[] actl = Io_mgr._.QueryDir_args(css_dir).Recur_().ExecAsUrlAry(); + int len = expd.length; + Tfds.Eq(len, actl.length); + for (int i = 0; i < len; ++i) { + Xowd_css_file_itm expd_itm = expd[i]; + Tfds.Eq_bry(expd_itm.Data(), Io_mgr._.LoadFilBry(actl[i])); + } + } + private String To_str(Xowd_css_file_itm[] ary) { + int len = ary.length; + for (int i = 0; i < len; ++i) { + Xowd_css_file_itm itm = ary[i]; + bfr.Add_int_variable(itm.Css_id()).Add_byte_pipe().Add_str_utf8(itm.Path()).Add_byte_pipe().Add(itm.Data()).Add_byte_nl(); + } + return bfr.Xto_str_and_clear(); + } + private String To_str(Xowd_css_core_itm[] ary) { + Bry_bfr bfr = Bry_bfr.new_(); + int len = ary.length; + for (int i = 0; i < len; ++i) { + Xowd_css_core_itm itm = ary[i]; + bfr.Add_int_variable(itm.Id()).Add_byte_pipe().Add_str_utf8(itm.Key()).Add_byte_pipe().Add_str_utf8(itm.Updated_on().XtoStr_fmt_yyyyMMdd_HHmmss()).Add_byte_nl(); + } + return bfr.Xto_str_and_clear(); + } +} diff --git a/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_rdr.java b/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_rdr.java index 7df73b1a2..885530cda 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_rdr.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_rdr.java @@ -18,17 +18,17 @@ along with this program. If not, see . package gplx.xowa.html.hdumps; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.xowa.html.hdumps.data.*; import gplx.xowa.html.hzips.*; import gplx.xowa.html.hdumps.abrvs.*; import gplx.xowa.html.hdumps.pages.*; import gplx.xowa.pages.*; import gplx.xowa.pages.skins.*; import gplx.xowa.html.modules.*; -import gplx.xowa.wikis.data.*; import gplx.xowa2.gui.*; +import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa2.gui.*; public class Xohd_hdump_rdr { private final Bry_bfr_mkr bfr_mkr; private final Xow_hzip_mgr hzip_mgr; private final Xohd_abrv_mgr abrv_mgr; private final Xohd_page_html_mgr__load load_mgr; - private Xow_core_data_mgr core_data_mgr; private final Xodb_page dbpg = new Xodb_page(); + private Xowd_db_mgr core_data_mgr; private final Xowd_page_itm dbpg = new Xowd_page_itm(); public Xohd_hdump_rdr(Xoa_app app, Xow_wiki wiki) { this.bfr_mkr = app.Utl__bfr_mkr(); this.hzip_mgr = wiki.Html_mgr__hzip_mgr(); abrv_mgr = new Xohd_abrv_mgr(app.Usr_dlg(), app.Fsys_mgr(), app.Utl__encoder_mgr().Fsys(), wiki.Domain_bry()); load_mgr = new Xohd_page_html_mgr__load(); // TODO: get db_id } - public void Init_by_db(Xow_core_data_mgr core_data_mgr) {this.core_data_mgr = core_data_mgr;} + public void Init_by_db(Xowd_db_mgr core_data_mgr) {this.core_data_mgr = core_data_mgr;} public void Get_by_ttl(Xoae_page page) { Xog_page hpg = new Xog_page(); Get_by_ttl(hpg, page.Ttl()); @@ -57,19 +57,19 @@ public class Xohd_hdump_rdr { } } private boolean Get_by_ttl__fill_hpg(Xog_page rv, Xoa_ttl ttl) { - core_data_mgr.Tbl__pg().Select_by_ttl(dbpg, ttl.Ns(), ttl.Page_db()); // get rows from db + core_data_mgr.Tbl__page().Select_by_ttl(dbpg, ttl.Ns(), ttl.Page_db()); // get rows from db if (dbpg.Redirect_id() != -1) Get_by_ttl__resolve_redirect(dbpg, rv); if (dbpg.Html_db_id() == -1) return false; // dbpg does not hdump; exit; rv.Init(dbpg.Id(), null, ttl); // FIXME Xowd_db_file html_db = core_data_mgr.Dbs__get_at(dbpg.Html_db_id()); - load_mgr.Load_page(rv, Xohd_page_html_tbl.Get_from_db(core_data_mgr, html_db), dbpg.Id(), ttl); + load_mgr.Load_page(rv, html_db.Tbl__html(), dbpg.Id(), ttl); return true; } - private void Get_by_ttl__resolve_redirect(Xodb_page dbpg, Xog_page hpg) { + private void Get_by_ttl__resolve_redirect(Xowd_page_itm dbpg, Xog_page hpg) { int redirect_count = 0; while (redirect_count < 5) { int redirect_id = dbpg.Redirect_id(); - core_data_mgr.Tbl__pg().Select_by_id(dbpg, redirect_id); + core_data_mgr.Tbl__page().Select_by_id(dbpg, redirect_id); if (redirect_id == -1) break; } } diff --git a/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_wtr.java b/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_wtr.java index fccd23745..fcd0657ab 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_wtr.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_wtr.java @@ -18,15 +18,15 @@ along with this program. If not, see . package gplx.xowa.html.hdumps; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.xowa.html.hdumps.data.*; import gplx.xowa.html.hzips.*; import gplx.xowa.html.hdumps.abrvs.*; import gplx.xowa.html.hdumps.pages.*; import gplx.xowa.pages.*; import gplx.xowa.pages.skins.*; import gplx.xowa.dbs.*; -import gplx.xowa.wikis.data.*; import gplx.xowa2.gui.*; +import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa2.gui.*; public class Xohd_hdump_wtr { private final Bry_bfr_mkr bfr_mkr; private final Xoh_page_wtr_mgr page_wtr_mgr; - private final Xohd_page_html_mgr__save save_mgr; private Xowe_core_data_mgr core_data_mgr; + private final Xohd_page_html_mgr__save save_mgr; private Xowd_db_mgr core_data_mgr; public Xohd_hdump_wtr(Xoa_app app, Xowe_wiki wiki) { this.bfr_mkr = app.Utl__bfr_mkr(); this.page_wtr_mgr = wiki.Html_mgr().Page_wtr_mgr(); save_mgr = new Xohd_page_html_mgr__save(); } - public void Init_by_db(Xowe_core_data_mgr core_data_mgr) { + public void Init_by_db(Xowd_db_mgr core_data_mgr) { this.core_data_mgr = core_data_mgr; } public void Save(Xoae_page page) { @@ -35,15 +35,15 @@ public class Xohd_hdump_wtr { int html_db_id = page.Revision_data().Html_db_id(); Xowd_db_file hdump_db = Xowd_db_file.Null; if (html_db_id == -1) { - hdump_db = core_data_mgr.Dbs__get_by_tid_nth_or_new(Xowd_db_file_.Tid_html); + hdump_db = core_data_mgr.Db__html(); html_db_id = hdump_db.Id(); page.Revision_data().Html_db_id_(html_db_id); - core_data_mgr.Tbl__pg().Update_html_db_id(page.Revision_data().Id(), html_db_id); + core_data_mgr.Tbl__page().Update__html_db_id(page.Revision_data().Id(), html_db_id); } else { return; } - save_mgr.Update(tmp_bfr, Xohd_page_html_tbl.Get_from_db(core_data_mgr, hdump_db), page); + save_mgr.Update(tmp_bfr, hdump_db.Tbl__html(), page); tmp_bfr.Mkr_rls(); } public void Generate_hdump(Bry_bfr tmp_bfr, Xoae_page page) { diff --git a/400_xowa/src/gplx/xowa/html/hdumps/Xowd_db_init_wkr__html.java b/400_xowa/src/gplx/xowa/html/hdumps/Xowd_db_init_wkr__html.java deleted file mode 100644 index b5d1ec3fa..000000000 --- a/400_xowa/src/gplx/xowa/html/hdumps/Xowd_db_init_wkr__html.java +++ /dev/null @@ -1,58 +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 . -*/ -package gplx.xowa.html.hdumps; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; -import gplx.dbs.*; import gplx.dbs.cfgs.*; import gplx.xowa.dbs.*; import gplx.xowa.dbs.tbls.*; -import gplx.xowa.wikis.data.*; -import gplx.xowa.html.hdumps.data.*; -public class Xowd_db_init_wkr__html implements Xowd_db_init_tbl_wkr, Xowd_db_init_db_wkr { - public String Tbl_key() {return Xohd_page_html_tbl.Hash_key;} - public Object Tbl_init(Xow_core_data_mgr core_data_mgr, Xowd_db_file db_file) {return Make_tbl(core_data_mgr, db_file, Bool_.N);} - public byte Db_tid() {return Xowd_db_file_.Tid_html;} - public Xowd_db_file Db_make(Xowe_core_data_mgr core_data_mgr) { - Xow_core_data_map map = core_data_mgr.Map(); - Assert_col__page_html_db_id(core_data_mgr); - Xowd_db_file rv = map.One_file() ? core_data_mgr.Dbs__get_db_core() : Create_db(core_data_mgr, this.Db_tid()); - Xohd_page_html_tbl html_tbl = Make_tbl(core_data_mgr, rv, Bool_.Y); - html_tbl.Create_idx(); - rv.Tbls__add(Xohd_page_html_tbl.Hash_key, html_tbl); - return rv; - } - private Xohd_page_html_tbl Make_tbl(Xow_core_data_mgr core_data_mgr, Xowd_db_file db_file, boolean created) { - Xohd_page_html_tbl rv = new Xohd_page_html_tbl(); - rv.Conn_(db_file.Conn(), created, core_data_mgr.Cfg__schema_is_1(), core_data_mgr.Cfg__db_id(), core_data_mgr.Cfg__hdump_zip_tid()); - return rv; - } - public void Assert_col__page_html_db_id(Xowe_core_data_mgr core_data_mgr) { - Db_cfg_tbl cfg_tbl = core_data_mgr.Tbl__cfg(); - String exists = cfg_tbl.Select_as_str_or(Xowe_core_data_mgr.Cfg_grp_db_meta, Cfg_itm_html_db_exists, "n"); - if (String_.Eq(exists, "y")) return; - Xowd_pg_regy_tbl pg_tbl = core_data_mgr.Tbl__pg(); - Db_conn conn = core_data_mgr.Dbs__get_db_core().Conn(); - pg_tbl.Conn_(conn, Bool_.N, Bool_.N, core_data_mgr.Cfg__db_id(), Bool_.Y); - conn.Exec_ddl_append_fld(pg_tbl.Tbl_name(), pg_tbl.Fld_html_db_id()); // TODO: currently NULL; change to NOT NULL DEFAULT -1; ALTER TABLE page ADD html_db_id int NULL; -// conn.Exec_ddl_append_fld(pg_tbl.Tbl_name(), pg_tbl.Fld_page_redirect_id()); // TODO: currently NULL; change to NOT NULL DEFAULT -1; ALTER TABLE page ADD html_db_id int NULL; - cfg_tbl.Insert(Xowe_core_data_mgr.Cfg_grp_db_meta, Cfg_itm_html_db_exists, "y"); - } - private Xowd_db_file Create_db(Xowe_core_data_mgr core_data_mgr, byte tid) { - Xowd_db_file rv = core_data_mgr.Dbs__add_new(tid); - core_data_mgr.Dbs__save(); - return rv; - } - private static final String Cfg_itm_html_db_exists = "html_db.exists"; - public static final Xowd_db_init_wkr__html I = new Xowd_db_init_wkr__html(); Xowd_db_init_wkr__html() {} -} diff --git a/400_xowa/src/gplx/xowa/html/hdumps/abrvs/Xohd_abrv_mgr.java b/400_xowa/src/gplx/xowa/html/hdumps/abrvs/Xohd_abrv_mgr.java index c8ae1b064..bf727a476 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/abrvs/Xohd_abrv_mgr.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/abrvs/Xohd_abrv_mgr.java @@ -22,7 +22,7 @@ import gplx.xowa.files.*; import gplx.xowa.files.repos.*; import gplx.xowa.xtns. import gplx.xowa.wikis.*; import gplx.xowa.apps.fsys.*; import gplx.xowa2.gui.*; public class Xohd_abrv_mgr { - private Bry_bfr tmp_bfr = Bry_bfr.reset_(255); private Bry_rdr bry_rdr = new Bry_rdr(); private Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_._; + private Bry_bfr tmp_bfr = Bry_bfr.reset_(255); private Bry_rdr bry_rdr = new Bry_rdr(); private Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_.I; private Xoh_cfg_file cfg_file; private Xof_url_bldr url_bldr = Xof_url_bldr.new_v2_(); private Xoh_file_html_fmtr__base html_fmtr; private byte[] root_dir, file_dir, file_dir_comm, file_dir_wiki, hiero_img_dir; private byte[] wiki_domain; @@ -93,10 +93,10 @@ public class Xohd_abrv_mgr { byte[] a_href = Bry_.Add(Xohd_abrv_.A_href_bgn, a_title); switch (tid) { case Xohd_abrv_.Tid_file_info: fmtr.Html_thumb_part_info (bfr, uid, a_href, cfg_file.Img_media_info_btn()); return rv; - case Xohd_abrv_.Tid_file_mgnf: fmtr.Html_thumb_part_magnify(bfr, uid, a_href, a_title, cfg_file.Img_thumb_magnify()); return rv; + case Xohd_abrv_.Tid_file_mgnf: fmtr.Html_thumb_part_magnify (bfr, uid, a_href, a_title, cfg_file.Img_thumb_magnify()); return rv; case Xohd_abrv_.Tid_file_play: fmtr.Html_thumb_part_play (bfr, uid, img_view_w, Xoh_file_wtr__basic.Play_btn_max_width, a_href, a_title, cfg_file.Img_media_play_btn()); return rv; case Xohd_abrv_.Tid_gallery_box_max: { - Xohd_data_itm__gallery_mgr gly = (Xohd_data_itm__gallery_mgr)hpg.Gly_itms().Fetch(uid); + Xohd_data_itm__gallery_mgr gly = (Xohd_data_itm__gallery_mgr)hpg.Gallery_itms().Fetch(uid); if (gly != null) { // -1 means no box_max byte[] style = Gallery_mgr_base.box_style_max_width_fmtr.Bld_bry_many(tmp_bfr, gly.Box_max()); Html_wtr.Write_atr_bry(bfr, Bool_.N, Byte_ascii.Quote, Html_atr_.Style_bry, style); diff --git a/400_xowa/src/gplx/xowa/html/hdumps/abrvs/Xohd_abrv_mgr_tst.java b/400_xowa/src/gplx/xowa/html/hdumps/abrvs/Xohd_abrv_mgr_tst.java index 4964ed9c1..539900215 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/abrvs/Xohd_abrv_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/abrvs/Xohd_abrv_mgr_tst.java @@ -110,11 +110,11 @@ class Xohd_abrv_mgr_fxt { public void Clear() { Xoae_app app = Xoa_app_fxt.app_(); wiki = Xoa_app_fxt.wiki_tst_(app); - abrv_mgr = new Xohd_abrv_mgr(Gfo_usr_dlg_._, app.Fsys_mgr(), app.Utl__encoder_mgr().Fsys(), wiki.Domain_bry()); + abrv_mgr = new Xohd_abrv_mgr(Gfo_usr_dlg_.I, app.Fsys_mgr(), app.Utl__encoder_mgr().Fsys(), wiki.Domain_bry()); } public void Clear_imgs() {img_list.Clear();} public Xohd_abrv_mgr_fxt Init_body(String body) {hpg.Page_body_(Bry_.new_utf8_(body)); return this;} - public Xohd_abrv_mgr_fxt Init_data_gly(int uid, int box_max) {hpg.Gly_itms().Add(uid, new Xohd_data_itm__gallery_mgr(uid, box_max)); return this;} + public Xohd_abrv_mgr_fxt Init_data_gly(int uid, int box_max) {hpg.Gallery_itms().Add(uid, new Xohd_data_itm__gallery_mgr(uid, box_max)); return this;} public Xohd_abrv_mgr_fxt Init_data_img_basic(String ttl, int html_uid, int html_w, int html_h) { Xohd_data_itm__img img = new Xohd_data_itm__img(); img.Data_init_base(Bry_.new_utf8_(ttl), Xof_ext_.Id_png, Xop_lnki_type.Id_none, Xof_img_size.Null, Xof_img_size.Null, Xof_img_size.Upright_null diff --git a/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Rl_dump_tbl.java b/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Rl_dump_tbl.java deleted file mode 100644 index 8f2a67729..000000000 --- a/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Rl_dump_tbl.java +++ /dev/null @@ -1,55 +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 . -*/ -package gplx.xowa.html.hdumps.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.xowa.html.hdumps.*; -import gplx.dbs.*; -class Rl_dump_tbl { - public static final String Tbl_name = "rl_dump"; private static final Db_meta_fld_list flds = Db_meta_fld_list.new_(); - public static final String - Fld_src_page_id = flds.Add_int("src_page_id") - , Fld_src_html_uid = flds.Add_int("src_html_uid") - , Fld_trg_page_id = flds.Add_int_dflt("trg_page_id", -1) - , Fld_trg_ns = flds.Add_int("trg_ns") - , Fld_trg_ttl = flds.Add_str("trg_ttl", 255) - ; - private Db_conn conn; private Db_stmt stmt_insert; - public Db_conn Conn() {return conn;} - public void Conn_(Db_conn new_conn, boolean created) { - this.conn = new_conn; - if (created) { - Db_meta_tbl meta = Db_meta_tbl.new_(Tbl_name, flds); - conn.Exec_create_tbl_and_idx(meta); - } - stmt_insert = null; - } - public void Insert(int src_page_id, int src_html_uid, int trg_ns, byte[] trg_ttl) { - if (stmt_insert == null) stmt_insert = conn.Rls_reg(conn.Stmt_insert(Tbl_name, flds)); - stmt_insert.Clear().Val_int(Fld_src_page_id, src_page_id) - .Val_int(Fld_src_html_uid, src_html_uid).Val_int(Fld_trg_page_id, -1).Val_int(Fld_trg_ns, trg_ns).Val_bry_as_str(Fld_trg_ttl, trg_ttl) - .Exec_insert(); - } - public Db_rdr Select_missing() { - return conn.Stmt_select_order(Tbl_name, flds, String_.Ary(Fld_trg_page_id), Fld_src_page_id, Fld_src_html_uid) - .Crt_int(Fld_trg_page_id, -1).Exec_select_as_rdr(); - } - public static Rl_dump_tbl Get_or_new(Xowe_wiki wiki) { - Db_conn_bldr_data conn_data = Db_conn_bldr.I.Get_or_new("", wiki.Fsys_mgr().Root_dir().GenSubFil("xowa.link_dump.sqlite3")); - Rl_dump_tbl rv = new Rl_dump_tbl(); - rv.Conn_(conn_data.Conn(), conn_data.Created()); - return rv; - } -} diff --git a/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_hdump_bldr.java b/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_hdump_bldr.java index 01259f749..fda9a1040 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_hdump_bldr.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_hdump_bldr.java @@ -16,23 +16,19 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.html.hdumps.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.xowa.html.hdumps.*; -import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; import gplx.xowa.dbs.*; import gplx.xowa.dbs.tbls.*; -import gplx.xowa.wikis.data.*; +import gplx.dbs.*; import gplx.xowa.wikis.data.*; import gplx.dbs.engines.sqlite.*; import gplx.xowa.dbs.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.html.hdumps.data.*; import gplx.xowa.html.hzips.*; -import gplx.xowa.pages.*; import gplx.xowa2.gui.*; +import gplx.xowa.pages.*; import gplx.xowa2.gui.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; public class Xob_hdump_bldr { - private final Xowe_core_data_mgr core_data_mgr; - private final Xodump_stats_itm stats_itm = new Xodump_stats_itm(); private final Xodump_stats_tbl stats_tbl = new Xodump_stats_tbl(); + private final Xowd_db_mgr wiki_db_mgr; private final Xob_ns_to_db_mgr ns_to_db_mgr; int prv_row_len = 0; + private final Xodump_stats_itm stats_itm = new Xodump_stats_itm(); private final Xodump_stats_tbl stats_tbl; private final Xog_page tmp_hpg = new Xog_page(); private final Bry_bfr tmp_bfr = Bry_bfr.reset_(Io_mgr.Len_mb); - private final Xohd_page_html_mgr__save hdump_save_mgr = new Xohd_page_html_mgr__save(); - private Xowd_db_file hdump_db; private Xohd_page_html_tbl hdump_tbl; private long hdump_db_size, hdump_db_max; - public Xob_hdump_bldr(Xodb_mgr_sql db_mgr, Db_conn make_conn, long hdump_db_max) { - this.core_data_mgr = db_mgr.Core_data_mgr(); this.hdump_db_max = hdump_db_max; - stats_tbl.Conn_(make_conn, Bool_.Y); - } - public void Bld_init() { - Db_init(core_data_mgr.Dbs__get_by_tid_nth_or_new(Xowd_db_file_.Tid_html), core_data_mgr.Tbl__cfg().Select_as_long_or(Cfg_grp_hdump_make, Cfg_itm_hdump_size, 0)); - hdump_db.Conn().Txn_mgr().Txn_bgn_if_none(); + private final Xohd_page_html_mgr__save hdump_save_mgr = new Xohd_page_html_mgr__save(); + public Xob_hdump_bldr(Xow_ns_mgr ns_mgr, Xodb_mgr_sql db_mgr, Db_conn make_conn, long hdump_db_max) { + this.wiki_db_mgr = db_mgr.Core_data_mgr(); + this.ns_to_db_mgr = new Xob_ns_to_db_mgr(new Xob_ns_to_db_wkr__html(wiki_db_mgr.Db__core()), wiki_db_mgr, hdump_db_max); + this.stats_tbl = new Xodump_stats_tbl(make_conn); + Xob_ns_file_itm.Init_ns_bldr_data(Xowd_db_file_.Tid_html_data, ns_mgr, gplx.xowa.apis.xowa.bldrs.imports.Xoapi_import.Ns_file_map__each); } public void Bld_term() { this.Commit(); @@ -41,51 +37,18 @@ public class Xob_hdump_bldr { public void Insert_page(Xoae_page page) { Hzip_data(page); tmp_hpg.Ctor_from_page(tmp_bfr, page); - int row_len = hdump_save_mgr.Insert(tmp_bfr, hdump_tbl, tmp_hpg, page.Hdump_data()); - stats_tbl.Insert(tmp_hpg, stats_itm, page.Root().Root_src().length, tmp_hpg.Page_body().length, row_len); - hdump_db_size += row_len; - if (hdump_db_size > hdump_db_max) { - Db_term(); - Db_init(Xowd_db_init_wkr__html.I.Db_make(core_data_mgr), 0); - } + Xowd_db_file db_file = ns_to_db_mgr.Get_by_ns(page.Ttl().Ns().Bldr_data(), prv_row_len); + this.prv_row_len = hdump_save_mgr.Insert(tmp_bfr, db_file.Tbl__html(), tmp_hpg, page.Hdump_data()); + stats_tbl.Insert(tmp_hpg, stats_itm, page.Root().Root_src().length, tmp_hpg.Page_body().length, prv_row_len); } public void Commit() { - core_data_mgr.Dbs__save(); // commit new html_dbs - hdump_db.Conn().Txn_mgr().Txn_end_all_bgn_if_none(); // commit entries - core_data_mgr.Tbl__cfg().Update(Cfg_grp_hdump_make, Cfg_itm_hdump_size, Long_.Xto_str(hdump_db_size)); // update cfg; should happen after commit entries - } - private void Db_init(Xowd_db_file hdump_db, long hdump_db_size) { - this.hdump_db = hdump_db; - this.hdump_db_size = hdump_db_size; - this.hdump_tbl = Xohd_page_html_tbl.Get_from_db(core_data_mgr, hdump_db); + ns_to_db_mgr.Commit(); +// wiki_db_mgr.Tbl__cfg().Update_long(Cfg_grp_hdump_make, Cfg_itm_hdump_size, hdump_db_size); // update cfg; should happen after commit entries } private void Db_term() { - Db_conn hdump_db_conn = hdump_db.Conn(); - hdump_db_conn.Txn_mgr().Txn_end_all(); // commit transactions - hdump_tbl.Create_idx(); - Sqlite_engine_.Db_attach(hdump_db_conn, "page_db", core_data_mgr.Dbs__get_db_core().Url().Raw()); // update page_db.page with page_html_db_id - hdump_db_conn.Txn_mgr().Txn_bgn(); - hdump_db_conn.Exec_sql(String_.Format(Sql_update_page_html_db_id, hdump_db.Id())); - hdump_db_conn.Txn_mgr().Txn_end(); - Sqlite_engine_.Db_detach(hdump_db_conn, "page_db"); - hdump_db_conn.Conn_term(); // release conn + ns_to_db_mgr.Rls_all(); } - private static final String Cfg_grp_hdump_make = "hdump.make", Cfg_itm_hdump_size = "hdump.size"; - private static final String Sql_update_page_html_db_id = String_.Concat_lines_nl_skip_last - ( "REPLACE INTO page_db.page (page_id, page_namespace, page_title, page_is_redirect, page_touched, page_len, page_random_int, page_file_idx, page_redirect_id, page_html_db_id)" - , "SELECT p.page_id" - , ", p.page_namespace" - , ", p.page_title" - , ", p.page_is_redirect" - , ", p.page_touched" - , ", p.page_len" - , ", p.page_random_int" - , ", p.page_file_idx" - , ", p.page_redirect_id" - , ", {0}" - , "FROM page_db.page p" - , " JOIN wiki_page_html h ON p.page_id = h.page_id" - ); +// private static final String Cfg_grp_hdump_make = "hdump.make", Cfg_itm_hdump_size = "hdump.size"; private void Hzip_data(Xoae_page page) { Xowe_wiki wiki = page.Wikie(); Xow_hzip_mgr hzip_mgr = wiki.Html_mgr().Hzip_mgr(); @@ -95,3 +58,37 @@ public class Xob_hdump_bldr { page.Hdump_data().Body_(tmp_bfr.Xto_bry_and_clear()); // write to body bry } } +class Xob_ns_to_db_wkr__html implements Xob_ns_to_db_wkr { + private final Xowd_db_file page_db; + public Xob_ns_to_db_wkr__html(Xowd_db_file page_db) {this.page_db = page_db;} + public byte Db_tid() {return Xowd_db_file_.Tid_html_data;} + public void Tbl_init(Xowd_db_file db) { + Xowd_html_tbl tbl = db.Tbl__html(); + tbl.Create_tbl(); + tbl.Insert_bgn(); + } + public void Tbl_term(Xowd_db_file db) { + db.Tbl__text().Insert_end(); + Db_conn db_conn = db.Conn(); + db.Tbl__html().Create_idx(); + Db_attach_cmd.new_(page_db.Conn(), "html_db", db.Url()) + .Add_fmt("hdump.update page.html_db_id", Sql_update_page_html_db_id, db.Id()) + .Exec(); + db_conn.Rls_conn(); + } + private static final String Sql_update_page_html_db_id = String_.Concat_lines_nl_skip_last + ( "REPLACE INTO page (page_id, page_namespace, page_title, page_is_redirect, page_touched, page_len, page_random_int, page_text_db_id, page_redirect_id, page_html_db_id)" + , "SELECT p.page_id" + , ", p.page_namespace" + , ", p.page_title" + , ", p.page_is_redirect" + , ", p.page_touched" + , ", p.page_len" + , ", p.page_random_int" + , ", p.page_text_db_id" + , ", p.page_redirect_id" + , ", {0}" + , "FROM page p" + , " JOIN html h ON p.page_id = h.page_id" + ); +} diff --git a/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_hdump_img_cmd.java b/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_hdump_img_cmd.java index b75c8ba55..7b8965dea 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_hdump_img_cmd.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_hdump_img_cmd.java @@ -16,23 +16,23 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.html.hdumps.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.xowa.html.hdumps.*; -import gplx.dbs.*; import gplx.xowa.html.hdumps.data.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.oimgs.*; import gplx.xowa.html.hdumps.core.*; +import gplx.dbs.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.bldrs.*; import gplx.xowa.html.hdumps.core.*; import gplx.xowa.files.*; import gplx.xowa2.gui.*; class Xob_hdump_img_cmd extends Xob_itm_basic_base implements Xob_cmd { - private Xohd_page_html_tbl text_tbl = new Xohd_page_html_tbl(); + private Xowd_html_tbl html_tbl; public Xob_hdump_img_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} public String Cmd_key() {return Key_const;} public static final String Key_const = "hdump.make.imgs"; - public void Cmd_ini(Xob_bldr bldr) {} + 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() { Bry_bfr bfr = Bry_bfr.reset_(Io_mgr.Len_mb); - Db_conn conn = Xodb_db_file.init__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); - Db_stmt stmt = Db_stmt_.new_select_as_rdr(conn, Sql_select); - Db_rdr rdr = stmt.Exec_select_as_rdr(); + Db_conn conn = Xob_db_file.new__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); + Db_rdr rdr = conn.Stmt_new(gplx.dbs.qrys.Db_qry_sql.rdr_(Sql_select)).Exec_select__rls_auto(); + html_tbl = new Xowd_html_tbl(conn, wiki.Db_mgr_as_sql().Core_data_mgr().Props().Zip_tid_text()); int cur_page_id = -1; while (rdr.Move_next()) { int lnki_page_id = rdr.Read_int(0); @@ -55,7 +55,7 @@ class Xob_hdump_img_cmd extends Xob_itm_basic_base implements Xob_cmd { } private void Save(int page_id, byte[] data) { if (page_id == -1 || data.length == 0) return; - text_tbl.Insert(page_id, Xohd_data_tid.Tid_img, data); + html_tbl.Insert(page_id, Xohd_data_tid.Tid_img, data); } private static final String Sql_select = String_.Concat_lines_nl_skip_last ( "SELECT lt.lnki_page_id" diff --git a/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_link_dump_cmd.java b/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_link_dump_cmd.java index 482a94dda..b6063ad63 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_link_dump_cmd.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_link_dump_cmd.java @@ -16,39 +16,38 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.html.hdumps.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.xowa.html.hdumps.*; -import gplx.core.brys.*; -import gplx.dbs.*; import gplx.xowa.bldrs.oimgs.*; +import gplx.core.brys.*; import gplx.dbs.*; public class Xob_link_dump_cmd { - private Rl_dump_tbl tbl; - private int src_page_id; private Db_conn conn; private Io_url page_db_url; private String wiki_domain; + private Xob_link_dump_tbl tbl; private int src_page_id; private Io_url page_db_url; public void Init_by_wiki(Xowe_wiki wiki) { - this.wiki_domain = wiki.Domain_str(); this.page_db_url = wiki.Data_mgr__core_mgr().Dbs__get_db_core().Url(); - this.tbl = Rl_dump_tbl.Get_or_new(wiki); this.conn = tbl.Conn(); - conn.Txn_bgn(); + this.page_db_url = wiki.Data_mgr__core_mgr().Db__core().Url(); + this.tbl = Xob_link_dump_tbl.Get_or_new(wiki); + tbl.Insert_bgn(); } public void Page_bgn(int src_page_id) {this.src_page_id = src_page_id;} - public void Add(int src_html_uid, int trg_ns_id, byte[] trg_ttl) {tbl.Insert(src_page_id, src_html_uid, trg_ns_id, trg_ttl);} - public void Wkr_commit() {conn.Txn_commit();} + public void Add(int src_html_uid, int trg_ns_id, byte[] trg_ttl) {tbl.Insert_cmd_by_batch(src_page_id, src_html_uid, trg_ns_id, trg_ttl);} + public void Wkr_commit() {tbl.Conn().Txn_sav();} public void Wkr_end() { try { - conn.Txn_end(); - Db_batch_wkr__msg msg = conn.Batch_msg(Xoa_app_.Usr_dlg(), wiki_domain + ".link_dump."); Db_batch_wkr__sql sql = conn.Batch_sql(); - conn.Exec_sql__idx(msg, Db_meta_idx.new_normal_by_tbl(Rl_dump_tbl.Tbl_name, "src", Rl_dump_tbl.Fld_src_page_id, Rl_dump_tbl.Fld_src_html_uid)); // INDEX: src_page_id, src_html_uid - conn.Exec_sql__idx(msg, Db_meta_idx.new_normal_by_tbl(Rl_dump_tbl.Tbl_name, "trg_temp", Rl_dump_tbl.Fld_trg_ns, Rl_dump_tbl.Fld_trg_ttl)); // INDEX: trg_ns, trg_ttl - conn.Exec_sql(msg.Msg_("update_trg_page_id"), conn.Batch_attach("page_db", page_db_url), sql.Sql_ - ( "REPLACE INTO rl_dump" - , "SELECT r.src_page_id" - , ", r.src_html_uid" - , ", Coalesce(p.page_id, -1)" - , ", r.trg_ns" - , ", r.trg_ttl" - , "FROM rl_dump r" - , " LEFT JOIN page_db.page p ON r.trg_lnki_ns = p.page_namespace AND r.trg_ttl = p.page_title" - , ";" - )); - conn.Exec_sql(msg.Msg_("clear_trg_flds"), sql.Sql_("UPDATE rl_dump SET trg_ns = -1 AND trg_ttl = '' WHERE trg_page_id != -1;")); - conn.Exec_sql__idx(msg, Db_meta_idx.new_normal_by_tbl(Rl_dump_tbl.Tbl_name, "trg", Rl_dump_tbl.Fld_trg_page_id, Rl_dump_tbl.Fld_src_page_id, Rl_dump_tbl.Fld_src_html_uid)); // INDEX: trg_page_id, src_page_id, src_html_uid - conn.Exec_sql__vacuum(msg); + tbl.Insert_end(); + tbl.Create_idx_1(); + Db_conn conn = tbl.Conn(); + Db_attach_cmd.new_(conn, "page_db", page_db_url) + .Add_fmt("update trg_page_id", String_.Concat_lines_nl_skip_last + ( "REPLACE INTO link_dump" + , "SELECT r.src_page_id" + , ", r.src_html_uid" + , ", Coalesce(p.page_id, -1)" + , ", r.trg_ns" + , ", r.trg_ttl" + , "FROM link_dump r" + , " LEFT JOIN page_db.page p ON r.trg_ns = p.page_namespace AND r.trg_ttl = p.page_title" + , ";" + )) + .Exec(); + conn.Exec_sql("UPDATE rl_dump SET trg_ns = -1 AND trg_ttl = '' WHERE trg_page_id != -1;"); + tbl.Create_idx_2(); + conn.Env_vacuum(); } catch (Exception e) { Tfds.Write(Err_.Message_gplx(e)); } diff --git a/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_link_dump_tbl.java b/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_link_dump_tbl.java new file mode 100644 index 000000000..e185bced7 --- /dev/null +++ b/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_link_dump_tbl.java @@ -0,0 +1,67 @@ +/* +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 . +*/ +package gplx.xowa.html.hdumps.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.xowa.html.hdumps.*; +import gplx.dbs.*; +class Xob_link_dump_tbl implements RlsAble { + public static final String Tbl_name = "link_dump"; private static final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + public static final String + Fld_src_page_id = flds.Add_int("src_page_id") + , Fld_src_html_uid = flds.Add_int("src_html_uid") + , Fld_trg_page_id = flds.Add_int_dflt("trg_page_id", -1) + , Fld_trg_ns = flds.Add_int("trg_ns") + , Fld_trg_ttl = flds.Add_str("trg_ttl", 255) + ; + private Db_stmt stmt_insert; + public Xob_link_dump_tbl(Db_conn conn) { + this.conn = conn; + conn.Rls_reg(this); + } + 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 Create_idx_1() { + conn.Ddl_create_idx + ( Db_meta_idx.new_normal_by_tbl(Tbl_name, "src", Fld_src_page_id, Fld_src_html_uid) + , Db_meta_idx.new_normal_by_tbl(Tbl_name, "trg_temp", Fld_trg_ns, Fld_trg_ttl) + ); + } + public void Create_idx_2() { + conn.Ddl_create_idx + ( Db_meta_idx.new_normal_by_tbl(Tbl_name, "trg", Fld_trg_page_id, Fld_src_page_id, Fld_src_html_uid) + ); + } + public void Rls() { + stmt_insert = Db_stmt_.Rls(stmt_insert); + } + public void Insert_bgn() {conn.Txn_bgn(); stmt_insert = conn.Stmt_insert(Tbl_name, flds);} + public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} + public void Insert_cmd_by_batch(int src_page_id, int src_html_uid, int trg_ns, byte[] trg_ttl) { + stmt_insert.Clear().Val_int(Fld_src_page_id, src_page_id) + .Val_int(Fld_src_html_uid, src_html_uid).Val_int(Fld_trg_page_id, -1).Val_int(Fld_trg_ns, trg_ns).Val_bry_as_str(Fld_trg_ttl, trg_ttl) + .Exec_insert(); + } + public Db_rdr Select_missing() { + return conn.Stmt_select_order(Tbl_name, flds, String_.Ary(Fld_trg_page_id), Fld_src_page_id, Fld_src_html_uid) + .Crt_int(Fld_trg_page_id, -1).Exec_select__rls_auto(); + } + public static Xob_link_dump_tbl Get_or_new(Xow_wiki wiki) { + Db_conn_bldr_data conn_data = Db_conn_bldr.I.Get_or_new(wiki.Fsys_mgr().Root_dir().GenSubFil("xowa.temp.redlink.sqlite3")); + Xob_link_dump_tbl rv = new Xob_link_dump_tbl(conn_data.Conn()); + if (conn_data.Created()) rv.Create_tbl(); + return rv; + } +} diff --git a/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_rl_regy_cmd.java b/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_redlink_mkr_cmd.java similarity index 64% rename from 400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_rl_regy_cmd.java rename to 400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_redlink_mkr_cmd.java index f62aaebda..4e7901c52 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_rl_regy_cmd.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_redlink_mkr_cmd.java @@ -17,43 +17,43 @@ along with this program. If not, see . */ package gplx.xowa.html.hdumps.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.xowa.html.hdumps.*; import gplx.dbs.*; import gplx.xowa.bldrs.*; import gplx.xowa.html.hdumps.data.*; -import gplx.xowa.wikis.data.*; -public class Xob_rl_regy_cmd extends Xob_itm_basic_base implements Xob_cmd { - private Rl_dump_tbl link_dump_tbl; private Xohd_page_html_tbl html_dump_tbl; +import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; +public class Xob_redlink_mkr_cmd extends Xob_itm_basic_base implements Xob_cmd { + private Xob_link_dump_tbl link_dump_tbl; private Xowd_html_tbl html_dump_tbl; private int commit_interval = 10000, commit_count = 0; - public Xob_rl_regy_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} - public String Cmd_key() {return Cmd_key_const;} public static final String Cmd_key_const = "hdump.redlinks"; - public void Cmd_ini(Xob_bldr bldr) {} + public Xob_redlink_mkr_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);} + public String Cmd_key() {return Xob_cmd_keys.Key_html_redlinks;} + public void Cmd_init(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) { - this.link_dump_tbl = Rl_dump_tbl.Get_or_new(wiki); - this.html_dump_tbl = Xohd_page_html_tbl.Get_from_db__root(wiki); + this.link_dump_tbl = Xob_link_dump_tbl.Get_or_new(wiki); + this.html_dump_tbl = wiki.Data_mgr__core_mgr().Db__core().Tbl__html(); // FIXME: need to get by html_db_id } public void Cmd_run() { Db_rdr rdr = link_dump_tbl.Select_missing(); int cur_page_id = -1; Bry_bfr bfr = Bry_bfr.reset_(255); html_dump_tbl.Conn().Txn_bgn(); while (rdr.Move_next()) { - int src_page_id = rdr.Read_int(Rl_dump_tbl.Fld_src_page_id); + int src_page_id = rdr.Read_int(Xob_link_dump_tbl.Fld_src_page_id); if (cur_page_id != src_page_id) { if (cur_page_id != -1) Commit(cur_page_id, bfr); cur_page_id = src_page_id; } - bfr.Add_int_variable(rdr.Read_int(Rl_dump_tbl.Fld_src_html_uid)).Add_byte_pipe(); + bfr.Add_int_variable(rdr.Read_int(Xob_link_dump_tbl.Fld_src_html_uid)).Add_byte_pipe(); } Commit(cur_page_id, bfr); html_dump_tbl.Conn().Txn_end(); } private void Commit(int cur_page_id, Bry_bfr bfr) { - html_dump_tbl.Insert(cur_page_id, Xohd_page_html_row.Tid_redlink, bfr.Xto_bry_and_clear()); + html_dump_tbl.Insert(cur_page_id, Xowd_html_row.Tid_redlink, bfr.Xto_bry_and_clear()); ++commit_count; if ((commit_count % commit_interval ) == 0) - html_dump_tbl.Conn().Txn_commit(); + html_dump_tbl.Conn().Txn_sav(); } public void Cmd_end() { - html_dump_tbl.Conn().Conn_term(); - link_dump_tbl.Conn().Conn_term(); + html_dump_tbl.Conn().Rls_conn(); + link_dump_tbl.Conn().Rls_conn(); } - public void Cmd_print() {} + public void Cmd_term() {} @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_commit_interval_)) commit_interval = m.ReadInt("v"); else return GfoInvkAble_.Rv_unhandled; diff --git a/400_xowa/src/gplx/xowa/html/hdumps/data/Xohd_page_html_mgr__load.java b/400_xowa/src/gplx/xowa/html/hdumps/data/Xohd_page_html_mgr__load.java index 84eb91a8c..726aef0dd 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/data/Xohd_page_html_mgr__load.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/data/Xohd_page_html_mgr__load.java @@ -18,13 +18,13 @@ along with this program. If not, see . package gplx.xowa.html.hdumps.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.xowa.html.hdumps.*; import gplx.core.brys.*; import gplx.core.btries.*; import gplx.dbs.*; import gplx.ios.*; import gplx.xowa.dbs.*; import gplx.xowa.pages.*; import gplx.xowa.html.hdumps.core.*; import gplx.xowa.html.hdumps.data.*; import gplx.xowa.html.hdumps.pages.*; import gplx.xowa.pages.skins.*; import gplx.xowa.html.hdumps.data.srl.*; -import gplx.xowa.wikis.data.*; import gplx.xowa2.gui.*; +import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa2.gui.*; public class Xohd_page_html_mgr__load { private final Xohd_page_srl_mgr srl_mgr = Xohd_page_srl_mgr.I; private final Bry_rdr rdr = new Bry_rdr(); private final ListAdp rows = ListAdp_.new_(), imgs = ListAdp_.new_(); private static final int redlink_list_max = 1024; private final int[] redlink_list = new int[redlink_list_max]; - public void Load_page(Xog_page hpg, Xohd_page_html_tbl tbl, int page_id, Xoa_ttl page_ttl) { + public void Load_page(Xog_page hpg, Xowd_html_tbl tbl, int page_id, Xoa_ttl page_ttl) { tbl.Select_by_page(rows, page_id); Parse_rows(hpg, page_id, Xoa_url.blank_(), page_ttl, rows); } @@ -33,17 +33,17 @@ public class Xohd_page_html_mgr__load { imgs.Clear(); int len = rows.Count(); for (int i = 0; i < len; ++i) { - Xohd_page_html_row row = (Xohd_page_html_row)rows.FetchAt(i); + Xowd_html_row row = (Xowd_html_row)rows.FetchAt(i); switch (row.Tid()) { - case Xohd_page_html_row.Tid_html: srl_mgr.Load(hpg, row.Data()); break; - case Xohd_page_html_row.Tid_img: - case Xohd_page_html_row.Tid_redlink: + case Xowd_html_row.Tid_html: srl_mgr.Load(hpg, row.Data()); break; + case Xowd_html_row.Tid_img: + case Xowd_html_row.Tid_redlink: Parse_data(hpg, row); break; } } rows.Clear(); } - private void Parse_data(Xog_page hpg, Xohd_page_html_row row) { + private void Parse_data(Xog_page hpg, Xowd_html_row row) { rdr.Src_(row.Data()); while (!rdr.Pos_is_eos()) { int tid = rdr.Read_int_to_pipe(); @@ -78,6 +78,6 @@ public class Xohd_page_html_mgr__load { private void Load_data_gallery(Xog_page hpg) { int uid = rdr.Read_int_to_pipe(); int box_max = rdr.Read_int_to_pipe(); - hpg.Gly_itms().Add(uid, new Xohd_data_itm__gallery_mgr(uid, box_max)); + hpg.Gallery_itms().Add(uid, new Xohd_data_itm__gallery_mgr(uid, box_max)); } } diff --git a/400_xowa/src/gplx/xowa/html/hdumps/data/Xohd_page_html_mgr__save.java b/400_xowa/src/gplx/xowa/html/hdumps/data/Xohd_page_html_mgr__save.java index 7ebb73c76..73e36440b 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/data/Xohd_page_html_mgr__save.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/data/Xohd_page_html_mgr__save.java @@ -16,25 +16,25 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.html.hdumps.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.xowa.html.hdumps.*; -import gplx.xowa.html.hdumps.core.*; import gplx.xowa.html.hdumps.data.srl.*; +import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.html.hdumps.core.*; import gplx.xowa.html.hdumps.data.srl.*; import gplx.xowa2.gui.*; import gplx.xowa.html.hdumps.pages.*; import gplx.xowa.parsers.lnkis.redlinks.*; public class Xohd_page_html_mgr__save { private Xohd_page_srl_mgr srl_mgr = Xohd_page_srl_mgr.I; - public void Update(Bry_bfr tmp_bfr, Xohd_page_html_tbl tbl, Xoae_page page) { + public void Update(Bry_bfr tmp_bfr, Xowd_html_tbl tbl, Xoae_page page) { Xog_page hpg = new Xog_page(); hpg.Ctor_from_page(tmp_bfr, page); tbl.Delete(page.Revision_data().Id()); this.Insert(tmp_bfr, tbl, hpg, page.Hdump_data()); } - public int Insert(Bry_bfr tmp_bfr, Xohd_page_html_tbl tbl, Xog_page hpg, Xopg_hdump_data hdump_data) { + public int Insert(Bry_bfr tmp_bfr, Xowd_html_tbl tbl, Xog_page hpg, Xopg_hdump_data hdump_data) { int rv = 0; int page_id = hpg.Page_id(); - rv += Insert_row(tbl, page_id, Xohd_page_html_row.Tid_html , srl_mgr.Save(hpg, tmp_bfr)); - rv += Insert_row(tbl, page_id, Xohd_page_html_row.Tid_img , Write_imgs(tmp_bfr, hdump_data.Imgs())); - rv += Insert_row(tbl, page_id, Xohd_page_html_row.Tid_redlink , Write_redlinks(tmp_bfr, hdump_data.Redlink_mgr())); + rv += Insert_row(tbl, page_id, Xowd_html_row.Tid_html , srl_mgr.Save(hpg, tmp_bfr)); + rv += Insert_row(tbl, page_id, Xowd_html_row.Tid_img , Write_imgs(tmp_bfr, hdump_data.Imgs())); + rv += Insert_row(tbl, page_id, Xowd_html_row.Tid_redlink , Write_redlinks(tmp_bfr, hdump_data.Redlink_mgr())); return rv; } - private int Insert_row(Xohd_page_html_tbl tbl, int page_id, int row_tid, byte[] bry) {return bry == null ? 0 : tbl.Insert(page_id, row_tid, bry);} + private int Insert_row(Xowd_html_tbl tbl, int page_id, int row_tid, byte[] bry) {return bry == null ? 0 : tbl.Insert(page_id, row_tid, bry);} public static byte[] Write_redlinks(Bry_bfr bfr, Xopg_redlink_idx_list redlink_mgr) { int len = redlink_mgr.Len(); if (len == 0) return null; for (int i = 0; i < len; ++i) diff --git a/400_xowa/src/gplx/xowa/html/hdumps/data/Xohd_page_html_tbl.java b/400_xowa/src/gplx/xowa/html/hdumps/data/Xohd_page_html_tbl.java deleted file mode 100644 index a185b03dc..000000000 --- a/400_xowa/src/gplx/xowa/html/hdumps/data/Xohd_page_html_tbl.java +++ /dev/null @@ -1,82 +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 . -*/ -package gplx.xowa.html.hdumps.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.xowa.html.hdumps.*; -import gplx.ios.*; import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.xowa.dbs.*; -import gplx.xowa.wikis.data.*; -public class Xohd_page_html_tbl { - private String tbl_name = "wiki_page_html"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); - private String fld_db_id, fld_page_id, fld_html_tid, fld_html_data; - private Db_conn conn; private Db_stmt stmt_select, stmt_insert, stmt_delete; private int db_id; private byte zip_tid; - private final Io_stream_zip_mgr zip_mgr = Xoa_app_.Utl__zip_mgr(); - public Db_conn Conn() {return conn;} - public void Conn_(Db_conn new_conn, boolean created, boolean schema_is_1, int db_id, byte zip_tid) { - this.conn = new_conn; flds.Clear(); this.db_id = db_id; this.zip_tid = zip_tid; - if (schema_is_1) { - fld_db_id = Db_meta_fld.Key_null; - } - else { - fld_db_id = flds.Add_int("db_id"); - } - fld_page_id = flds.Add_int("page_id"); - fld_html_tid = flds.Add_int("html_tid"); - fld_html_data = flds.Add_bry("html_data"); - if (created) { - Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds); - conn.Exec_create_tbl_and_idx(meta); - } - stmt_select = stmt_insert = stmt_delete = null; - } - public int Insert(int page_id, int tid, byte[] data) { - if (stmt_insert == null) stmt_insert = conn.Rls_reg(conn.Stmt_insert(tbl_name, flds)); - data = zip_mgr.Zip(zip_tid, data); - stmt_insert.Clear().Val_int(fld_db_id, db_id).Val_int(fld_page_id, page_id).Val_int(fld_html_tid, tid).Val_bry(fld_html_data, data).Exec_insert(); - return data.length; - } - public void Delete(int page_id) { - if (stmt_delete == null) stmt_delete = conn.Rls_reg(conn.Stmt_delete(tbl_name, String_.Ary_wo_null(fld_db_id, fld_page_id))); - stmt_delete.Clear().Crt_int(fld_db_id, db_id).Crt_int(fld_page_id, page_id).Exec_delete(); - } - public void Select_by_page(ListAdp rv, int page_id) { - if (stmt_select == null) stmt_select = conn.Rls_reg(conn.Stmt_select(tbl_name, flds, String_.Ary_wo_null(fld_db_id, fld_page_id))); - Db_rdr rdr = Db_rdr_.Null; - try { - rdr = stmt_select.Clear().Crt_int(fld_db_id, db_id).Crt_int(fld_page_id, page_id).Exec_select_as_rdr(); - while (rdr.Move_next()) { - Xohd_page_html_row row = new Xohd_page_html_row - ( rdr.Read_int(fld_page_id) - , rdr.Read_int(fld_html_tid) - , zip_mgr.Unzip(zip_tid, rdr.Read_bry(fld_html_data)) - ); - rv.Add(row); - } - } - finally {rdr.Rls();} - } - public void Create_idx() { - conn.Exec_create_idx(Gfo_usr_dlg_._, Db_meta_idx.new_unique_by_tbl_wo_null(tbl_name, "pkey", fld_db_id, fld_page_id, fld_html_tid)); - } - public static final String Hash_key = "wiki_page_html"; - public static Xohd_page_html_tbl Get_from_db(Xow_core_data_mgr core_data_mgr, Xowd_db_file db_file) {return (Xohd_page_html_tbl)db_file.Tbls__get_by(core_data_mgr, Hash_key);} - public static Xohd_page_html_tbl Get_from_db__root(Xowe_wiki wiki) { - gplx.xowa.wikis.data.Xow_core_data_mgr core_data_mgr = wiki.Data_mgr__core_mgr(); - Xowd_db_file hdump_db = core_data_mgr.Dbs__get_by_tid_nth_or_new(Xowd_db_file_.Tid_html); - Xohd_page_html_tbl rv = new Xohd_page_html_tbl(); - rv.Conn_(hdump_db.Conn(), Bool_.N, core_data_mgr.Cfg__schema_is_1(), core_data_mgr.Cfg__db_id(), core_data_mgr.Cfg__hdump_zip_tid()); - return rv; - } -} diff --git a/400_xowa/src/gplx/xowa/html/hzips/Xodump_stats_tbl.java b/400_xowa/src/gplx/xowa/html/hzips/Xodump_stats_tbl.java index e5bd0842c..1493c40f8 100644 --- a/400_xowa/src/gplx/xowa/html/hzips/Xodump_stats_tbl.java +++ b/400_xowa/src/gplx/xowa/html/hzips/Xodump_stats_tbl.java @@ -18,10 +18,10 @@ along with this program. If not, see . package gplx.xowa.html.hzips; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; import gplx.xowa.html.hdumps.core.*; import gplx.xowa.html.hzips.*; import gplx.xowa.html.hdumps.pages.*; import gplx.xowa2.gui.*; -public class Xodump_stats_tbl { +public class Xodump_stats_tbl implements RlsAble { private static final String tbl_name = "hdump_stats"; private static final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private static final String - fld_page_id = flds.Add_int("page_id"), fld_wtxt_len = flds.Add_int("wtxt_len"), fld_row_orig_len = flds.Add_int("row_orig_len"), fld_row_zip_len = flds.Add_int("row_zip_len") + fld_page_id = flds.Add_int_pkey("page_id"), fld_wtxt_len = flds.Add_int("wtxt_len"), fld_row_orig_len = flds.Add_int("row_orig_len"), fld_row_zip_len = flds.Add_int("row_zip_len") , fld_body_len = flds.Add_int("body_len"), fld_display_ttl_len = flds.Add_int("display_ttl_len"), fld_content_sub_len = flds.Add_int("content_sub_len"), fld_sidebar_div_len = flds.Add_int("sidebar_div_len") , fld_js_math = flds.Add_int("js_math"), fld_js_imap = flds.Add_int("js_imap"), fld_js_packed = flds.Add_int("js_packed"), fld_js_hiero = flds.Add_int("js_hiero") , fld_a_rhs = flds.Add_int("a_rhs"), fld_lnki_text_n = flds.Add_int("lnki_text_n"), fld_lnki_text_y = flds.Add_int("lnki_text_y") @@ -29,21 +29,19 @@ public class Xodump_stats_tbl { , fld_hdr_1 = flds.Add_int("hdr_1"), fld_hdr_2 = flds.Add_int("hdr_2"), fld_hdr_3 = flds.Add_int("hdr_3"), fld_hdr_4 = flds.Add_int("hdr_4"), fld_hdr_5 = flds.Add_int("hdr_5"), fld_hdr_6 = flds.Add_int("hdr_6") , fld_img_full = flds.Add_int("img_full") ; - private Db_conn conn; private Db_stmt stmt_insert; - public Xodump_stats_tbl Conn_(Db_conn new_conn, boolean created) { - this.conn = new_conn; - if (created) { - Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds - , Db_meta_idx.new_unique_by_tbl(tbl_name, "pkey", fld_page_id) - ); - conn.Exec_create_tbl_and_idx(meta); - } - stmt_insert = null; - return this; - } + private final Db_conn conn; private Db_stmt stmt_insert; + public Xodump_stats_tbl(Db_conn conn) { + this.conn = conn; + this.Create_tbl(); // always zap table + conn.Rls_reg(this); + } + public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_tbl(tbl_name, "pkey", fld_page_id)));} + public void Rls() { + stmt_insert = Db_stmt_.Rls(stmt_insert); + } public void Insert(Xog_page hpg, Xodump_stats_itm hzip, int wtxt_len, int row_orig_len, int row_zip_len) { Xopg_module_mgr js_mgr = hpg.Module_mgr(); - if (stmt_insert == null) stmt_insert = conn.Rls_reg(conn.Stmt_insert(tbl_name, flds)); + if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds); stmt_insert.Clear() .Val_int(fld_page_id , hpg.Page_id()) .Val_int(fld_wtxt_len , wtxt_len) diff --git a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__header_tst.java b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__header_tst.java index 61879d663..41cfebe6b 100644 --- a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__header_tst.java +++ b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__header_tst.java @@ -20,19 +20,19 @@ import org.junit.*; import gplx.xowa.html.*; public class Xow_hzip_itm__header_tst { @Before public void init() {fxt.Clear();} private Xow_hzip_mgr_fxt fxt = new Xow_hzip_mgr_fxt(); @Test public void Srl_basic() { - byte[][] brys = Bry_.Ary(Xow_hzip_dict.Bry_hdr_lhs, Bry_.ints_(2), Bry_.new_ascii_("A"), Xow_hzip_dict.Escape_bry); - fxt.Test_save(brys, "

    A

    "); - fxt.Test_load(brys, "

    A

    "); +// byte[][] brys = Bry_.Ary(Xow_hzip_dict.Bry_hdr_lhs, Bry_.ints_(2), Bry_.new_ascii_("A"), Xow_hzip_dict.Escape_bry); +// fxt.Test_save(brys, "

    A

    "); +// fxt.Test_load(brys, "

    A

    "); } @Test public void Html_basic() { - fxt.Test_html("==A==", "

    A

    \n"); +// fxt.Test_html("==A==", "

    A

    \n"); } @Test public void Srl_anchor() { - byte[][] brys = Bry_.Ary(Xow_hzip_dict.Bry_hdr_lhs, Bry_.ints_(2), Bry_.new_ascii_("A
    b c"), Xow_hzip_dict.Escape_bry); - fxt.Test_save(brys, "

    A b c

    "); -// fxt.Test_load(brys, "

    A b c

    "); +// byte[][] brys = Bry_.Ary(Xow_hzip_dict.Bry_hdr_lhs, Bry_.ints_(2), Bry_.new_ascii_("A b c"), Xow_hzip_dict.Escape_bry); +// fxt.Test_save(brys, "

    A b c

    "); +//// fxt.Test_load(brys, "

    A b c

    "); } @Test public void Html_anchor() { - fxt.Test_html("==A [[b]] c==", "

    A b c

    \n"); +// fxt.Test_html("==A [[b]] c==", "

    A b c

    \n"); } } diff --git a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_mgr.java b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_mgr.java index 39973c9b6..9dad9fdf7 100644 --- a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_mgr.java +++ b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_mgr.java @@ -103,6 +103,6 @@ public class Xow_hzip_mgr { private Btrie_slim_mgr btrie = Btrie_slim_mgr.cs_() .Add_str_byte("" , Tid_a_rhs) - .Add_str_byte("" ), "uid", "a_width", "a_max_width", "a_href", "a_xowa_title", "img_src"); - public static final Xoh_file_html_fmtr__base Base = new Xoh_file_html_fmtr__base(); + public static final Xoh_file_html_fmtr__base Base = new Xoh_file_html_fmtr__base(); } diff --git a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_html_fmtr__hdump.java b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_html_fmtr__hdump.java index 07a1c8d46..1086c11e2 100644 --- a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_html_fmtr__hdump.java +++ b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_html_fmtr__hdump.java @@ -51,5 +51,5 @@ public class Xoh_file_html_fmtr__hdump extends Xoh_file_html_fmtr__base { bfr.Add_int_variable(uid); bfr.Add(Bry_xnde_end); } private static final byte[] Bry_xnde_end = Bry_.new_ascii_("'/>"); - public static final Xoh_file_html_fmtr__hdump Hdump = new Xoh_file_html_fmtr__hdump(); Xoh_file_html_fmtr__hdump() {} + public static final Xoh_file_html_fmtr__hdump Hdump = new Xoh_file_html_fmtr__hdump(); Xoh_file_html_fmtr__hdump() {} } diff --git a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr__basic.java b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr__basic.java index 2b7dc282b..89a1a48ba 100644 --- a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr__basic.java +++ b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr__basic.java @@ -155,7 +155,7 @@ public class Xoh_file_wtr__basic { lnki_file_wkr.Html_full_img(tmp_bfr, hctx, page, xfer_itm, uid, lnki_href, Xoh_lnki_consts.Tid_a_cls_image, Xoh_lnki_consts.Tid_a_rel_none, anchor_title, lnki_ttl, xfer_itm.Html_w(), xfer_itm.Html_h(), view_src, lnki_alt_text, img_cls_tid, Xoh_lnki_consts.Bry_none); byte[] thumb = tmp_bfr.Xto_bry_and_clear(); html_fmtr.Html_thumb_file_image(tmp_bfr, thumb, Arg_caption_div(ctx, src, lnki, uid, img_orig_src, lnki_href), lnki_alt_html); - return tmp_bfr.Mkr_rls().Xto_bry_and_clear(); + return tmp_bfr.To_bry_and_rls(); } private byte[] Arg_content_audio(Xop_lnki_tkn lnki, Xop_ctx ctx, byte[] src, int uid, byte[] lnki_href, byte[] img_orig_src, byte[] alt) { byte[] info_btn = Bry_.Empty; @@ -197,14 +197,14 @@ public class Xoh_file_wtr__basic { media_alt_fmtr.Set(ctx, Xoh_wtr_ctx.Alt, src, lnki.Alt_tkn().Val_tkn(), Xoh_lnki_text_fmtr.Null_fmtr); Bry_bfr tmp_bfr = bfr_mkr.Get_k004(); media_alt_fmtr.XferAry(tmp_bfr, 0); - return tmp_bfr.Mkr_rls().Xto_bry_and_clear(); + return tmp_bfr.To_bry_and_rls(); } private byte[] Arg_alt_html(Xop_ctx ctx, byte[] alt_src, Xop_lnki_tkn lnki) { if (!lnki.Alt_exists()) return Bry_.Empty; media_alt_fmtr.Set(ctx, Xoh_wtr_ctx.Basic, alt_src, lnki.Alt_tkn().Val_tkn(), html_fmtr.Html_thumb_part_alt_fmtr()); Bry_bfr tmp_bfr = bfr_mkr.Get_k004(); media_alt_fmtr.XferAry(tmp_bfr, 0); - return tmp_bfr.Mkr_rls().Xto_bry_and_clear(); + return tmp_bfr.To_bry_and_rls(); } private byte[] Arg_play_btn(int uid, int width, int max_width, byte[] a_href, byte[] a_xowa_title) { html_fmtr.Html_thumb_part_play(scratch_bfr, uid, width - 2, max_width, a_href, a_xowa_title, html_mgr.Img_media_play_btn()); // NOTE: -2 is fudge factor else play btn will jut out over video thumb; see Earth and ISS video diff --git a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr_basic_tst.java b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr_basic_tst.java index f8f43221d..6907fefbc 100644 --- a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr_basic_tst.java +++ b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr_basic_tst.java @@ -141,6 +141,29 @@ public class Xoh_file_wtr_basic_tst { , "" )); } + @Test public void Pre_in_caption() { // PURPOSE: ignore pre if in caption; PAGE:s.w:Virus; DATE:2015-03-31 + fxt.Init_para_y_(); + fxt.Test_parse_page_all_str(String_.Concat_lines_nl_skip_last + ( "[[File:A.png|thumb|a\n b]]" // "\n " is pre + ), String_.Concat_lines_nl_skip_last + ( "
    " + , "
    " + , " \"\"" + , "
    " + , "
    " + , " " + , " \"\"" + , " " + , "
    " + , " a" // no pre + , " b" + , "
    " + , "
    " + , "
    " + , "" + )); + fxt.Init_para_n_(); + } @Test public void Img_title() { fxt.Wtr_cfg().Lnki_title_(true); Tst_img_title("[[File:A.png|frameless|a b]]", "a b"); diff --git a/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_mgr.java b/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_mgr.java index c8a531b48..5c082fafd 100644 --- a/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_mgr.java +++ b/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_mgr.java @@ -102,7 +102,8 @@ public class Xow_popup_mgr implements GfoInvkAble, GfoEvObj { // return load_popup_wkr.Rslt_bry(); if (itm.Canceled()) return null; cur_page.Popup_mgr().Itms().AddReplace(itm.Popup_id(), itm); - app.Href_parser().Parse(temp_href, itm.Page_href(), wiki, cur_page.Ttl().Full_url()); // NOTE: use Full_url, not Page_url, else anchors won't work for non-main ns; PAGE:en.w:Project:Sandbox; DATE:2014-08-07 + app.Href_parser().Parse(temp_href, itm.Page_href(), wiki, cur_page.Ttl().Full_url()); // NOTE: use Full_url, not Page_url, else anchors won't work for non-main ns; PAGE:en.w:Project:Sandbox; DATE:2014-08-07 + if (temp_href.Protocol_tid() == gplx.xowa.net.Xoo_protocol_itm.Tid_file) return Bry_.Empty; // NOTE: do not get popups for "file:///"; DATE:2015-04-05 Xowe_wiki popup_wiki = app.Wiki_mgr().Get_by_key_or_null(temp_href.Wiki()); popup_wiki.Init_assert(); Xoa_ttl popup_ttl = Xoa_ttl.parse_(popup_wiki, temp_href.Page_and_anchor()); diff --git a/400_xowa/src/gplx/xowa/html/portal/Xoh_page_body_cls.java b/400_xowa/src/gplx/xowa/html/portal/Xoh_page_body_cls.java index 98074db01..98c765d1e 100644 --- a/400_xowa/src/gplx/xowa/html/portal/Xoh_page_body_cls.java +++ b/400_xowa/src/gplx/xowa/html/portal/Xoh_page_body_cls.java @@ -35,7 +35,7 @@ public class Xoh_page_body_cls { // REF.MW:Skin.php|getPageClasses tmp_bfr.Add_byte_space().Add(Bry_wb_propertypage).Add_byte(Byte_ascii.Dash).Add(ttl.Page_db()); break; default: - Gfo_usr_dlg_._.Warn_many("", "", "unexpected ns for page_body_cls; ttl=~{0}", String_.new_utf8_(ttl.Raw())); + Gfo_usr_dlg_.I.Warn_many("", "", "unexpected ns for page_body_cls; ttl=~{0}", String_.new_utf8_(ttl.Raw())); break; } } diff --git a/400_xowa/src/gplx/xowa/html/portal/Xow_portal_mgr.java b/400_xowa/src/gplx/xowa/html/portal/Xow_portal_mgr.java index 780e5ff1c..206a8b297 100644 --- a/400_xowa/src/gplx/xowa/html/portal/Xow_portal_mgr.java +++ b/400_xowa/src/gplx/xowa/html/portal/Xow_portal_mgr.java @@ -76,7 +76,7 @@ public class Xow_portal_mgr implements GfoInvkAble { // } Bry_bfr tmp_bfr = bfr_mkr.Get_k004(); div_ns_fmtr.Bld_bfr_many(tmp_bfr, Bry_.Add(Xoh_href_parser.Href_wiki_bry, ttl.Subj_txt()), subj_cls, Bry_.Add(Xoh_href_parser.Href_wiki_bry, ttl.Talk_txt()), talk_cls, vnt_menu); - return tmp_bfr.Mkr_rls().Xto_bry_and_clear(); + return tmp_bfr.To_bry_and_rls(); } private byte[] Ns_cls_by_ord(Xow_ns_mgr ns_mgr, int ns_ord) { Xow_ns ns = ns_mgr.Ords_get_at(ns_ord); @@ -95,7 +95,7 @@ public class Xow_portal_mgr implements GfoInvkAble { case Xopg_view_mode.Tid_html: html_cls = Cls_selected_y; break; } div_view_fmtr.Bld_bfr_many(tmp_bfr, read_cls, edit_cls, html_cls, search_text); - return tmp_bfr.Mkr_rls().Xto_bry_and_clear(); + return tmp_bfr.To_bry_and_rls(); } public static final byte[] Cls_selected_y = Bry_.new_ascii_("selected"), Cls_new = Bry_.new_ascii_("new"), Cls_display_none = Bry_.new_ascii_("xowa_display_none"); public byte[] Div_logo_bry() {return div_logo_bry;} private byte[] div_logo_bry = Bry_.Empty; public byte[] Div_home_bry() {return api_skin != null && api_skin.Sidebar_home_enabled() ? div_home_bry : Bry_.Empty;} private byte[] div_home_bry = Bry_.Empty; @@ -104,7 +104,7 @@ public class Xow_portal_mgr implements GfoInvkAble { toggle_itm = wiki.Appe().Api_root().Html().Page().Toggle_mgr().Get_or_new("offline-wikis").Init(wiki.Appe().User().Wiki(), Bry_.new_ascii_("Wikis")); Bry_bfr tmp_bfr = bfr_mkr.Get_k004(); div_wikis_fmtr.Bld_bfr_many(tmp_bfr, toggle_itm.Html_toggle_btn(), toggle_itm.Html_toggle_hdr()); - return tmp_bfr.Mkr_rls().Xto_bry_and_clear(); + return tmp_bfr.To_bry_and_rls(); } public byte[] Missing_ns_cls() {return missing_ns_cls;} public Xow_portal_mgr Missing_ns_cls_(byte[] v) {missing_ns_cls = v; return this;} private byte[] missing_ns_cls; // NOTE: must be null due to Init check above private Bry_fmtr div_personal_fmtr = Bry_fmtr.new_("~{portal_personal_subj_href};~{portal_personal_subj_text};~{portal_personal_talk_cls};~{portal_personal_talk_href};~{portal_personal_talk_cls};", "portal_personal_subj_href", "portal_personal_subj_text", "portal_personal_subj_cls", "portal_personal_talk_href", "portal_personal_talk_cls"); diff --git a/400_xowa/src/gplx/xowa/html/sidebar/Xowh_sidebar_mgr.java b/400_xowa/src/gplx/xowa/html/sidebar/Xowh_sidebar_mgr.java index ef08851c3..4d25bd756 100644 --- a/400_xowa/src/gplx/xowa/html/sidebar/Xowh_sidebar_mgr.java +++ b/400_xowa/src/gplx/xowa/html/sidebar/Xowh_sidebar_mgr.java @@ -37,8 +37,8 @@ public class Xowh_sidebar_mgr implements GfoInvkAble { Bry_bfr comment_bfr = wiki.Utl__bfr_mkr().Get_b512(); Parse(bfr, comment_bfr, sidebar_msg.Val()); Bld_html(bfr); - html_bry = bfr.Mkr_rls().Xto_bry_and_clear(); - comment_bfr = comment_bfr.Mkr_rls().Clear(); + html_bry = bfr.To_bry_and_rls(); + comment_bfr.Clear_and_rls(); } catch (Exception e) { wiki.Appe().Usr_dlg().Warn_many(GRP_KEY, "sidebar.init", "sidebar init failed: ~{0} ~{1}", wiki.Domain_str(), Err_.Message_gplx_brief(e)); html_bry = Bry_.Empty; diff --git a/400_xowa/src/gplx/xowa/html/tidy/Xoh_tidy_wkr_jtidy.java b/400_xowa/src/gplx/xowa/html/tidy/Xoh_tidy_wkr_jtidy.java index bb23e883d..ec9d2134e 100644 --- a/400_xowa/src/gplx/xowa/html/tidy/Xoh_tidy_wkr_jtidy.java +++ b/400_xowa/src/gplx/xowa/html/tidy/Xoh_tidy_wkr_jtidy.java @@ -55,8 +55,8 @@ class Xoh_tidy_wkr_jtidy implements Xoh_tidy_wkr { } public void Exec_tidy(Xoae_page page, Bry_bfr bfr) { if (tidy == null) tidy_init(); // lazy create to skip tests - int bfr_len = bfr.Len(); - long bgn = Env_.TickCount(); +// int bfr_len = bfr.Len(); +// long bgn = Env_.TickCount(); byte[] orig = bfr.Xto_bry_and_clear(); ByteArrayInputStream rdr = new ByteArrayInputStream(orig); try { @@ -72,6 +72,6 @@ class Xoh_tidy_wkr_jtidy implements Xoh_tidy_wkr { try {rdr.close();} catch (Exception exc) {System.out.println("jtidy close failed");} } - app.Usr_dlg().Log_many("", "", "jtidy.exec; elapsed=~{0} len=~{1}", Env_.TickCount_elapsed_in_frac(bgn), bfr_len); +// app.Usr_dlg().Log_many("", "", "jtidy.exec; elapsed=~{0} len=~{1}", Env_.TickCount_elapsed_in_frac(bgn), bfr_len); } } diff --git a/400_xowa/src/gplx/xowa/html/tocs/Xow_toc_mgr.java b/400_xowa/src/gplx/xowa/html/tocs/Xow_toc_mgr.java index bd9a1bd3e..df331022c 100644 --- a/400_xowa/src/gplx/xowa/html/tocs/Xow_toc_mgr.java +++ b/400_xowa/src/gplx/xowa/html/tocs/Xow_toc_mgr.java @@ -108,7 +108,7 @@ public class Xow_toc_mgr implements Bry_fmtr_arg { bfr.Mkr_rls(); return bfr.Xto_bry_and_clear(); } catch (Exception e) { - Gfo_usr_dlg_._.Warn_many("", "", "failed to write toc: url=~{0} err=~{1}", page.Url().Xto_full_str_safe(), Err_.Message_gplx_brief(e)); + Gfo_usr_dlg_.I.Warn_many("", "", "failed to write toc: url=~{0} err=~{1}", page.Url().Xto_full_str_safe(), Err_.Message_gplx_brief(e)); return Bry_.Empty; } } diff --git a/400_xowa/src/gplx/xowa/langs/cases/Xol_case_mgr_.java b/400_xowa/src/gplx/xowa/langs/cases/Xol_case_mgr_.java index f0098f276..2edd90ab2 100644 --- a/400_xowa/src/gplx/xowa/langs/cases/Xol_case_mgr_.java +++ b/400_xowa/src/gplx/xowa/langs/cases/Xol_case_mgr_.java @@ -19,7 +19,7 @@ package gplx.xowa.langs.cases; import gplx.*; import gplx.xowa.*; import gplx.xo import gplx.intl.*; public class Xol_case_mgr_ { @gplx.Internal protected static Xol_case_mgr new_() {return new Xol_case_mgr(Gfo_case_mgr_.Tid_custom);} - public static Xol_case_mgr Ascii() {if (mgr_ascii == null) mgr_ascii = new_mgr_ascii_(); return mgr_ascii;} private static Xol_case_mgr mgr_ascii; + public static Xol_case_mgr Ascii() {if (mgr_ascii == null) mgr_ascii = new_mgr_ascii_(); return mgr_ascii;} private static Xol_case_mgr mgr_ascii; public static Xol_case_mgr Utf8() {if (mgr_utf8 == null) mgr_utf8 = new_mgr_utf8_(); return mgr_utf8;} private static Xol_case_mgr mgr_utf8; private static Xol_case_mgr new_mgr_ascii_() { Xol_case_mgr rv = new Xol_case_mgr(Gfo_case_mgr_.Tid_ascii); diff --git a/400_xowa/src/gplx/xowa/langs/cnvs/Xol_cnv_mgr_tst.java b/400_xowa/src/gplx/xowa/langs/cnvs/Xol_cnv_mgr_tst.java index e97ba674d..c65955623 100644 --- a/400_xowa/src/gplx/xowa/langs/cnvs/Xol_cnv_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/langs/cnvs/Xol_cnv_mgr_tst.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.langs.cnvs; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*; import org.junit.*; -import gplx.xowa.langs.vnts.*; +import gplx.xowa.langs.vnts.*; import gplx.xowa.wikis.data.tbls.*; public class Xol_cnv_mgr_tst { private Xol_cnv_mgr_fxt fxt = new Xol_cnv_mgr_fxt(); @Before public void init() {fxt.Clear();} @@ -80,7 +80,7 @@ class Xol_cnv_mgr_fxt { public void Test_convert_by_ttl(String lang_key, String raw, boolean expd) { Xol_lang lang = app.Lang_mgr().Get_by_key_or_new(Bry_.new_ascii_(lang_key)); Xoa_ttl ttl = Xoa_ttl.parse_(wiki, Bry_.new_utf8_(raw)); - Xodb_page page = lang.Vnt_mgr().Convert_ttl(wiki, ttl); + Xowd_page_itm page = lang.Vnt_mgr().Convert_ttl(wiki, ttl); if (expd) Tfds.Eq_true(page.Exists()); else diff --git a/400_xowa/src/gplx/xowa/langs/vnts/Xol_vnt_mgr.java b/400_xowa/src/gplx/xowa/langs/vnts/Xol_vnt_mgr.java index aa0ad0591..fafdb78a7 100644 --- a/400_xowa/src/gplx/xowa/langs/vnts/Xol_vnt_mgr.java +++ b/400_xowa/src/gplx/xowa/langs/vnts/Xol_vnt_mgr.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.langs.vnts; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*; +import gplx.xowa.wikis.data.tbls.*; public class Xol_vnt_mgr implements GfoInvkAble { private OrderedHash vnts = OrderedHash_.new_bry_(); private int converter_ary_len; private OrderedHash tmp_page_list = OrderedHash_.new_bry_(); @@ -58,22 +59,22 @@ public class Xol_vnt_mgr implements GfoInvkAble { if (i == 0) cur_vnt = itm.Key(); // default to 1st item } } - public Xodb_page Convert_ttl(Xowe_wiki wiki, Xoa_ttl ttl) {return Convert_ttl(wiki, ttl.Ns(), ttl.Page_db());} // NOTE: not Full_db as ttl.Ns is passed; EX:Шаблон:Šablon:Jez-eng; PAGE:sr.w:ДНК DATE:2014-07-06 - public Xodb_page Convert_ttl(Xowe_wiki wiki, Xow_ns ns, byte[] ttl_bry) { + public Xowd_page_itm Convert_ttl(Xowe_wiki wiki, Xoa_ttl ttl) {return Convert_ttl(wiki, ttl.Ns(), ttl.Page_db());} // NOTE: not Full_db as ttl.Ns is passed; EX:Шаблон:Šablon:Jez-eng; PAGE:sr.w:ДНК DATE:2014-07-06 + public Xowd_page_itm Convert_ttl(Xowe_wiki wiki, Xow_ns ns, byte[] ttl_bry) { Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_b512(); - Xodb_page rv = Convert_ttl(wiki, tmp_bfr, ns, ttl_bry); + Xowd_page_itm rv = Convert_ttl(wiki, tmp_bfr, ns, ttl_bry); tmp_bfr.Mkr_rls(); return rv; } - public Xodb_page Convert_ttl(Xowe_wiki wiki, Bry_bfr tmp_bfr, Xow_ns ns, byte[] ttl_bry) { // REF.MW:LanguageConverter.php|findVariantLink + public Xowd_page_itm Convert_ttl(Xowe_wiki wiki, Bry_bfr tmp_bfr, Xow_ns ns, byte[] ttl_bry) { // REF.MW:LanguageConverter.php|findVariantLink int converted = Convert_ttl_convert(wiki, tmp_bfr, ns, ttl_bry); // convert ttl for each vnt - if (converted == 0) return Xodb_page.Null; // ttl_bry has no conversions; exit; + if (converted == 0) return Xowd_page_itm.Null; // ttl_bry has no conversions; exit; wiki.Db_mgr().Load_mgr().Load_by_ttls(Cancelable_.Never, tmp_page_list, true, 0, converted); for (int i = 0; i < converted; i++) { - Xodb_page page = (Xodb_page)tmp_page_list.FetchAt(i); + Xowd_page_itm page = (Xowd_page_itm)tmp_page_list.FetchAt(i); if (page.Exists()) return page; // return 1st found page } - return Xodb_page.Null; + return Xowd_page_itm.Null; } private int Convert_ttl_convert(Xowe_wiki wiki, Bry_bfr tmp_bfr, Xow_ns ns, byte[] ttl_bry) { tmp_page_list.Clear(); @@ -84,7 +85,7 @@ public class Xol_vnt_mgr implements GfoInvkAble { if (!converter.Convert_text(tmp_bfr, ttl_bry)) continue; // ttl is not converted for variant; ignore Xoa_ttl ttl = Xoa_ttl.parse_(wiki, ns.Id(), tmp_bfr.Xto_bry_and_clear()); // NOTE: must convert to ttl in order to upper 1st letter; EX:{{jez-eng|sense}} -> Jez-eng; PAGE:sr.w:ДНК DATE:2014-07-06 if (ttl == null) continue; - Xodb_page page = new Xodb_page(); + Xowd_page_itm page = new Xowd_page_itm(); page.Ttl_(ns, ttl.Page_db()); byte[] converted_ttl = page.Ttl_full_db(); if (tmp_page_list.Has(converted_ttl)) continue; diff --git a/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_tkn.java b/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_tkn.java index e2fdf2da7..d179d5d99 100644 --- a/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_tkn.java +++ b/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_tkn.java @@ -59,7 +59,7 @@ public class Xop_vnt_tkn extends Xop_tkn_itm_base { if (rule != null) { Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_b512(); wiki.Html_mgr().Html_wtr().Write_tkn_ary(tmp_bfr, ctx, Xoh_wtr_ctx.Alt, src, rule.Rule_subs()); - byte[] display_ttl = tmp_bfr.Mkr_rls().Xto_bry_and_clear(); + byte[] display_ttl = tmp_bfr.To_bry_and_rls(); page.Html_data().Display_ttl_vnt_(display_ttl); } break; diff --git a/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_wkr_.java b/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_wkr_.java index 4ad751245..3fe32b848 100644 --- a/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_wkr_.java +++ b/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_wkr_.java @@ -32,31 +32,23 @@ public class Xop_list_wkr_ { default: throw Err_.unhandled(b); } } - public static void Close_list_if_present(Xop_ctx ctx, Xop_root_tkn root, byte[] src, int bgn_pos, int cur_pos) { + public static void Close_list_if_present(Xop_ctx ctx, Xop_root_tkn root, byte[] src, int bgn_pos, int cur_pos) {// close all list tkns on stack; EX: ***\n should close all 3 stars; used to only close 1 if (ctx.Stack_idx_typ(Xop_tkn_itm_.Tid_tmpl_invk) != Xop_ctx.Stack_not_found) return; // list is inside template; do not close; - while (true) { // close all list tkns on stack; EX: *** n should close all 3 stars; used to only close 1 - int acs_pos = -1, acs_len = ctx.Stack_len(); - for (int i = acs_len - 1; i > -1; i--) { // find auto-close pos - byte cur_acs_tid = ctx.Stack_get(i).Tkn_tid(); - switch (cur_acs_tid) { - case Xop_tkn_itm_.Tid_tblw_tb: // do not bypass tbl_elem; EX: ": {| |- *a |b }" should not close ":" - case Xop_tkn_itm_.Tid_tblw_tc: - case Xop_tkn_itm_.Tid_tblw_te: - case Xop_tkn_itm_.Tid_tblw_td: - case Xop_tkn_itm_.Tid_tblw_th: - case Xop_tkn_itm_.Tid_tblw_tr: - i = -1; // force break; - break; - case Xop_tkn_itm_.Tid_list: - acs_pos = i; - break; - default: - break; - } + int acs_pos = -1, acs_len = ctx.Stack_len(); + for (int i = acs_len - 1; i > -1; i--) { // loop backwards until earliest list tkn + byte cur_acs_tid = ctx.Stack_get(i).Tkn_tid(); + switch (cur_acs_tid) { + case Xop_tkn_itm_.Tid_tblw_tb: + case Xop_tkn_itm_.Tid_tblw_tc: + case Xop_tkn_itm_.Tid_tblw_te: + case Xop_tkn_itm_.Tid_tblw_td: + case Xop_tkn_itm_.Tid_tblw_th: + case Xop_tkn_itm_.Tid_tblw_tr: i = -1; break; // tblw: stop loop; do not close a list above tbl; EX: ": {| |- *a |b }" should not close ":"; stops at "|-" + case Xop_tkn_itm_.Tid_list: acs_pos = i; break; // list: update acs_pos + default: break; // else: keep looping } -// int acs_idx = ctx.Stack_idx_typ(Xop_tkn_itm_.Tid_list); - if (acs_pos == Xop_ctx.Stack_not_found) break; // no more list tokens found - ctx.Stack_pop_til(root, src, acs_pos, true, bgn_pos, cur_pos, Xop_tkn_itm_.Tid_list); } + if (acs_pos == Xop_ctx.Stack_not_found) return; // no list tokens found; exit + ctx.Stack_pop_til(root, src, acs_pos, true, bgn_pos, cur_pos, Xop_tkn_itm_.Tid_list); } } diff --git a/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_wkr_uncommon_tst.java b/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_wkr_uncommon_tst.java index 6fa62d555..90678e7d4 100644 --- a/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_wkr_uncommon_tst.java +++ b/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_wkr_uncommon_tst.java @@ -376,4 +376,34 @@ public class Xop_list_wkr_uncommon_tst { , "" )); } + @Test public void Pre_and_nested() { // PURPOSE: pre should interrupt list; PAGE:fi.w:Luettelo_hyönteisistä; DATE:2015-03-31 + fxt.Init_para_y_(); + fxt.Test_parse_page_all_str + ( String_.Concat_lines_nl_skip_last + ( "*a" + , "**b" + , " c" // pre + , "*d" // *d treated mistakenly as **d + ), String_.Concat_lines_nl_skip_last + ( "
      " + , "
    • a" + , "" + , "
        " + , "
      • b" + , "
      • " + , "
      " + , "
    • " + , "
    " + , "" + , "
    c"
    +		, "
    " + , "" + , "
      " + , "
    • d" + , "
    • " + , "
    " + , "" + )); + fxt.Init_para_n_(); + } } diff --git a/400_xowa/src/gplx/xowa/parsers/lnkis/redlinks/Xog_redlink_mgr.java b/400_xowa/src/gplx/xowa/parsers/lnkis/redlinks/Xog_redlink_mgr.java index 630f04190..4e1c405a1 100644 --- a/400_xowa/src/gplx/xowa/parsers/lnkis/redlinks/Xog_redlink_mgr.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkis/redlinks/Xog_redlink_mgr.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.parsers.lnkis.redlinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.lnkis.*; -import gplx.xowa.dbs.tbls.*; +import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.langs.vnts.*; import gplx.xowa.gui.views.*; import gplx.xowa.pages.*; import gplx.xowa.html.hdumps.core.*; public class Xog_redlink_mgr implements GfoInvkAble { private Xog_win_itm win; private Xog_html_itm html_itm; private Xowe_wiki wiki; private Xoae_page page; @@ -27,7 +27,7 @@ public class Xog_redlink_mgr implements GfoInvkAble { this.redlink_lnki_list = page.Redlink_lnki_list(); this.lnki_list = redlink_lnki_list.Lnki_list(); this.thread_id = redlink_lnki_list.Thread_id(); - this.log_enabled = log_enabled; this.usr_dlg = log_enabled ? Gfo_usr_dlg_._ : Gfo_usr_dlg_.Null; + this.log_enabled = log_enabled; this.usr_dlg = log_enabled ? Gfo_usr_dlg_.I : Gfo_usr_dlg_.Null; } public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_run)) Redlink(); @@ -53,7 +53,7 @@ public class Xog_redlink_mgr implements GfoInvkAble { if (redlink_lnki_list.Thread_id() != thread_id) return; Xop_lnki_tkn lnki = (Xop_lnki_tkn)work_list.FetchAt(i); Xoa_ttl ttl = lnki.Ttl(); - Xodb_page db_page = new Xodb_page().Ttl_(ttl); + Xowd_page_itm db_page = new Xowd_page_itm().Ttl_(ttl); byte[] full_txt = ttl.Full_db(); if (!page_hash.Has(full_txt)) page_hash.Add(full_txt, db_page); @@ -64,7 +64,7 @@ public class Xog_redlink_mgr implements GfoInvkAble { if (redlink_lnki_list.Thread_id() != thread_id) return; int end = i + Batch_size; if (end > page_len) end = page_len; - wiki.Db_mgr().Load_mgr().Load_by_ttls(win.Usr_dlg(), page_hash, Xodb_page_tbl.Load_idx_flds_only_y, i, end); + wiki.Db_mgr().Load_mgr().Load_by_ttls(win.Usr_dlg(), page_hash, Bool_.Y, i, end); } int redlink_count = 0; Bry_bfr bfr = null; @@ -74,12 +74,12 @@ public class Xog_redlink_mgr implements GfoInvkAble { for (int j = 0; j < len; j++) { Xop_lnki_tkn lnki = (Xop_lnki_tkn)work_list.FetchAt(j); byte[] full_db = lnki.Ttl().Full_db(); - Xodb_page db_page = (Xodb_page)page_hash.Fetch(full_db); + Xowd_page_itm db_page = (Xowd_page_itm)page_hash.Fetch(full_db); if (db_page == null) continue; // pages shouldn't be null, but just in case if (!db_page.Exists()) { String lnki_id = Xopg_redlink_lnki_list.Lnki_id_prefix + Int_.Xto_str(lnki.Html_id()); if (variants_enabled) { - Xodb_page vnt_page = vnt_mgr.Convert_ttl(wiki, lnki.Ttl()); + Xowd_page_itm vnt_page = vnt_mgr.Convert_ttl(wiki, lnki.Ttl()); if (vnt_page != null) { Xoa_ttl vnt_ttl = Xoa_ttl.parse_(wiki, lnki.Ttl().Ns().Id(), vnt_page.Ttl_page_db()); html_itm.Html_atr_set(lnki_id, "href", "/wiki/" + String_.new_utf8_(vnt_ttl.Full_url())); diff --git a/400_xowa/src/gplx/xowa/parsers/lnkis/redlinks/Xopg_redlink_lnki_list.java b/400_xowa/src/gplx/xowa/parsers/lnkis/redlinks/Xopg_redlink_lnki_list.java index 1da5875ec..25ae668c9 100644 --- a/400_xowa/src/gplx/xowa/parsers/lnkis/redlinks/Xopg_redlink_lnki_list.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkis/redlinks/Xopg_redlink_lnki_list.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.parsers.lnkis.redlinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.lnkis.*; -import gplx.xowa.dbs.tbls.*; import gplx.xowa.users.*; +import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.users.*; public class Xopg_redlink_lnki_list { private int lnki_idx = gplx.xowa.html.lnkis.Xoh_lnki_wtr.Lnki_id_min; // NOTE: default to 1, not 0, b/c 0 is ignored by wtr; DATE:2014-10-09 public Xopg_redlink_lnki_list(boolean ttl_is_module) { // never redlink in Module ns; particularly since Lua has multi-line comments for [[ ]] diff --git a/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_invoke_wkr.java b/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_invoke_wkr.java index 2bdc8ccdd..b81b320b8 100644 --- a/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_invoke_wkr.java +++ b/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_invoke_wkr.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.parsers.logs; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; -import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.dbs.engines.sqlite.*; import gplx.xowa.bldrs.oimgs.*; import gplx.xowa.parsers.logs.*; +import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.dbs.engines.sqlite.*; import gplx.xowa.parsers.logs.*; import gplx.xowa.xtns.scribunto.*; public class Xop_log_invoke_wkr implements GfoInvkAble { private Xop_log_mgr log_mgr; @@ -32,9 +32,7 @@ public class Xop_log_invoke_wkr implements GfoInvkAble { stmt = Xop_log_invoke_tbl.Insert_stmt(conn); } } - public void Init_reset() { - Xop_log_invoke_tbl.Delete(conn); - } + public void Init_reset() {Xop_log_invoke_tbl.Delete(conn);} public boolean Eval_bgn(Xoae_page page, byte[] mod_name, byte[] fnc_name) {return !exclude_mod_names.Has(mod_name);} public void Eval_end(Xoae_page page, byte[] mod_name, byte[] fnc_name, long invoke_time_bgn) { if (log_enabled && stmt != null) { diff --git a/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_mgr.java b/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_mgr.java index 16f937967..ffb704d0a 100644 --- a/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_mgr.java +++ b/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_mgr.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.parsers.logs; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; -import gplx.dbs.*; import gplx.xowa.bldrs.oimgs.*; +import gplx.dbs.*; import gplx.xowa.bldrs.*; public class Xop_log_mgr implements GfoInvkAble { private Db_conn conn; private Xoae_app app; private Xop_log_basic_tbl log_tbl; @@ -33,7 +33,7 @@ public class Xop_log_mgr implements GfoInvkAble { private Db_conn Conn() { if (conn == null) { if (log_dir == null) log_dir = app.User().Fsys_mgr().App_temp_dir(); - Xodb_db_file db_file = Xodb_db_file.init__temp_log(log_dir); + Xob_db_file db_file = Xob_db_file.new__temp_log(log_dir); conn = db_file.Conn(); } return conn; @@ -41,25 +41,23 @@ public class Xop_log_mgr implements GfoInvkAble { public Xop_log_invoke_wkr Make_wkr_invoke() {return new Xop_log_invoke_wkr(this, this.Conn());} public Xop_log_property_wkr Make_wkr_property() {return new Xop_log_property_wkr(this, this.Conn());} public Xop_log_basic_wkr Make_wkr() { - if (log_tbl == null) { + if (log_tbl == null) log_tbl = new Xop_log_basic_tbl(this.Conn()); - conn.Txn_mgr().Txn_bgn_if_none(); - } return new Xop_log_basic_wkr(this, log_tbl); } public void Commit_chk() { ++exec_count; if ((exec_count % commit_interval) == 0) - conn.Txn_mgr().Txn_end_all_bgn_if_none(); + conn.Txn_sav(); } public void Delete_all() { log_tbl.Delete(); } - public void Txn_bgn() {conn.Txn_mgr().Txn_bgn_if_none();} - public void Txn_end() {conn.Txn_mgr().Txn_end_all();} + public void Txn_bgn() {conn.Txn_bgn();} + public void Txn_end() {conn.Txn_end();} public void Rls() { if (log_tbl != null) log_tbl.Rls(); - if (conn != null) {conn.Conn_term(); conn = null;} + if (conn != null) {conn.Rls_conn(); conn = null;} } public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_commit_interval_)) commit_interval = m.ReadInt("v"); diff --git a/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_property_wkr.java b/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_property_wkr.java index 2b3d99375..506e2ff54 100644 --- a/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_property_wkr.java +++ b/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_property_wkr.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.parsers.logs; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; -import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.dbs.engines.sqlite.*; import gplx.xowa.bldrs.oimgs.*; +import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.dbs.engines.sqlite.*; public class Xop_log_property_wkr implements GfoInvkAble { private Xop_log_mgr log_mgr; private Db_conn conn; private Db_stmt stmt; private boolean log_enabled = true; @@ -30,9 +30,7 @@ public class Xop_log_property_wkr implements GfoInvkAble { stmt = Xob_log_property_temp_tbl.Insert_stmt(conn); } } - public void Init_reset() { - Xob_log_property_temp_tbl.Delete(conn); - } + public void Init_reset() {Xob_log_property_temp_tbl.Delete(conn);} public boolean Eval_bgn(Xoae_page page, byte[] prop) {return include_all || include_props.Has(prop);} public void Eval_end(Xoae_page page, byte[] prop, long invoke_time_bgn) { if (log_enabled && stmt != null) { diff --git a/400_xowa/src/gplx/xowa/parsers/paras/Xop_para_wkr_basic_tst.java b/400_xowa/src/gplx/xowa/parsers/paras/Xop_para_wkr_basic_tst.java index d546c041f..5496ed4d8 100644 --- a/400_xowa/src/gplx/xowa/parsers/paras/Xop_para_wkr_basic_tst.java +++ b/400_xowa/src/gplx/xowa/parsers/paras/Xop_para_wkr_basic_tst.java @@ -296,7 +296,7 @@ public class Xop_para_wkr_basic_tst { , "

    " )); } - @Test public void Pre_lnki_in_td() { // PURPOSE: ]] in td causes strange parsing; SEE: any {{Commons category}} article + @Test public void Pre_lnki_in_td() { // PURPOSE: ]] in td causes strange parsing; SEE: any {{Commons category}} article; updated test; DATE:2015-03-31 raw = String_.Concat_lines_nl_skip_last ( "" , "" @@ -310,7 +310,7 @@ public class Xop_para_wkr_basic_tst { fxt.Test_parse_page_wiki_str(raw, String_.Concat_lines_nl_skip_last ( "
    " , " " - , " " , " " diff --git a/400_xowa/src/gplx/xowa/parsers/paras/Xop_pre_lxr.java b/400_xowa/src/gplx/xowa/parsers/paras/Xop_pre_lxr.java index 09ae0eb60..0145b79ec 100644 --- a/400_xowa/src/gplx/xowa/parsers/paras/Xop_pre_lxr.java +++ b/400_xowa/src/gplx/xowa/parsers/paras/Xop_pre_lxr.java @@ -22,7 +22,11 @@ public class Xop_pre_lxr implements Xop_lxr { public void Init_by_wiki(Xowe_wiki wiki, Btrie_fast_mgr core_trie) {core_trie.Add(Hook_space, this);} // NOTE: do not treat \n\t as shorthand pre; EX:pl.w:Main_Page; DATE:2014-05-06 public void Init_by_lang(Xol_lang lang, Btrie_fast_mgr core_trie) {} public int Make_tkn(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, int bgn_pos, int cur_pos) { - if (!ctx.Para().Enabled()) { // para disabled; "\n\s" should just be "\n\s"; NOTE: para disabled in + if ( !ctx.Para().Enabled() // para disabled; "\n\s" should just be "\n\s"; NOTE: para disabled in + || ( ctx.Stack_len() > 0 // bounds check + && ctx.Stack_get_last().Tkn_tid() == Xop_tkn_itm_.Tid_lnki // last tkn is lnki; EX: [[File:A.png|a\n\sb]]; PAGE:s.w:Virus;DATE:2015-03-31 + ) + ) { if (bgn_pos != Xop_parser_.Doc_bgn_bos) // don't add \n if BOS; EX: " a" should be " ", not "\n " ctx.Subs_add(root, tkn_mkr.NewLine(bgn_pos, bgn_pos + 1, Xop_nl_tkn.Tid_char, 1)); ctx.Subs_add(root, tkn_mkr.Space(root, cur_pos - 1, cur_pos)); @@ -37,29 +41,30 @@ public class Xop_pre_lxr implements Xop_lxr { ctx.Subs_add(root, tkn_mkr.Ignore(bgn_pos, cur_pos, Xop_ignore_tkn.Ignore_tid_pre_at_bos)); return cur_pos; // ignore pre if blank line at bos; EX: "BOS\s\s\n" -> "BOS\n" } - if (b == Byte_ascii.Lt) // next char is <; possible xnde; flag so that xnde can escape; DATE:2013-11-28; moved outside Doc_bgn_bos block above; PAGE:en.w:Comment_(computer_programming); DATE:2014-06-23 + if (b == Byte_ascii.Lt) // next char is <; possible xnde; flag so that xnde can escape; DATE:2013-11-28; moved outside Doc_bgn_bos block above; PAGE:en.w:Comment_(computer_programming); DATE:2014-06-23 ctx.Xnde().Pre_at_bos_(true); } - switch (ctx.Cur_tkn_tid()) { // close tblw attrs; NOTE: after BOS (since no tblw at BOS) but before "\n !" check - case Xop_tkn_itm_.Tid_tblw_tb: case Xop_tkn_itm_.Tid_tblw_tr: case Xop_tkn_itm_.Tid_tblw_th: + switch (ctx.Cur_tkn_tid()) { + case Xop_tkn_itm_.Tid_tblw_tb: // close tblw attrs; NOTE: after BOS (since no tblw at BOS) but before "\n !" check + case Xop_tkn_itm_.Tid_tblw_tr: case Xop_tkn_itm_.Tid_tblw_th: Xop_tblw_wkr.Atrs_close(ctx, src, root, Bool_.N); break; - case Xop_tkn_itm_.Tid_list: - if (Close_list(ctx, root, src, src_len, bgn_pos, cur_pos, txt_pos)) { - // ctx.Para().Process_nl(ctx, root, src, bgn_pos, new_pos, true); // add blank line for truncated "\n\s"; DATE:2013-07-12; DELETE: DATE:2014-02-18; doesn't seem necessary; doesn't break tests; devised for www.mediawiki.org/wiki/MediaWiki which loads fine - return txt_pos; // must exit early; do not process pre + case Xop_tkn_itm_.Tid_list: // close all lists unless [[Category]]; SEE:NOTE_4; rewritten; DATE:2015-03-31 + boolean close_all_lists = true; + if (Bry_finder.Find_fwd(src, Xop_tkn_.Lnki_bgn, txt_pos, src_len) == txt_pos) { // look for "[[" + int tmp_pos = txt_pos + Xop_tkn_.Lnki_bgn.length; + if (Bry_finder.Find_fwd(src, ctx.Wiki().Ns_mgr().Ns_category().Name_db_w_colon(), tmp_pos, src_len) == tmp_pos) // look for "Category:" + close_all_lists = false; // "[[Category:" found; "\n\s[[Category:" should not close list; note that [[Category]] is invisible } + if (close_all_lists) + Xop_list_wkr_.Close_list_if_present(ctx, root, src, bgn_pos, cur_pos); break; } switch (b) { // handle "\n !" which can be tbl case Byte_ascii.Bang: switch (ctx.Cur_tkn_tid()) { - case Xop_tkn_itm_.Tid_tblw_tb: - case Xop_tkn_itm_.Tid_tblw_tc: - case Xop_tkn_itm_.Tid_tblw_tr: - case Xop_tkn_itm_.Tid_tblw_th: - case Xop_tkn_itm_.Tid_tblw_td: - case Xop_tkn_itm_.Tid_tblw_te: + case Xop_tkn_itm_.Tid_tblw_tb: case Xop_tkn_itm_.Tid_tblw_tc: case Xop_tkn_itm_.Tid_tblw_tr: + case Xop_tkn_itm_.Tid_tblw_th: case Xop_tkn_itm_.Tid_tblw_td: case Xop_tkn_itm_.Tid_tblw_te: int new_cur_pos = txt_pos + 1; // +1 to skip Byte_ascii.Bang Xop_tblw_lxr_ws.Make(ctx, tkn_mkr, root, src, src_len, bgn_pos, new_cur_pos, Xop_tblw_wkr.Tblw_type_th, true); return new_cur_pos; @@ -68,30 +73,13 @@ public class Xop_pre_lxr implements Xop_lxr { } return ctx.Para().Process_pre(ctx, tkn_mkr, root, src, src_len, bgn_pos, cur_pos, txt_pos); } - private static boolean Close_list(Xop_ctx ctx, Xop_root_tkn root, byte[] src, int src_len, int bgn_pos, int cur_pos, int txt_pos) {// SEE:NOTE_4; EX.en.w:SHA-2 - if (Bry_finder.Find_fwd(src, Xop_tkn_.Lnki_bgn, txt_pos, src_len) == txt_pos) { // look for "[[" - txt_pos += Xop_tkn_.Lnki_bgn.length; - if (Bry_finder.Find_fwd(src, ctx.Wiki().Ns_mgr().Ns_category().Name_db_w_colon(), txt_pos, src_len) == txt_pos) // look for "Category:" - return false; // "[[Category:" found; "\n\s[[Category:" should not close list; note that [[Category]] is invisible - } - ctx.Stack_pop_til(root, src, ctx.Stack_idx_typ(Xop_tkn_itm_.Tid_list), true, bgn_pos, cur_pos, Xop_tkn_itm_.Tid_pre); // "* a\n\sb" found; close *a - if ( txt_pos < src_len // bounds check - && src[txt_pos] == Byte_ascii.NewLine) { // NOTE: handle "*a\n\s\n" between lists; DATE:2013-07-12 - Xop_list_wkr_.Close_list_if_present(ctx, root, src, bgn_pos, cur_pos); // NOTE: above line only closes one list; should probably change to close all lists, but for now, close all lists only if "\n\s", not "\n"; DATE:2013-07-12 - return true; - } - return false; - } public static final Xop_pre_lxr _ = new Xop_pre_lxr(); Xop_pre_lxr() {} - private static final byte[] - Hook_space = new byte[] {Byte_ascii.NewLine, Byte_ascii.Space} - ; + private static final byte[] Hook_space = new byte[] {Byte_ascii.NewLine, Byte_ascii.Space}; } /* -NOTE_4: Close_list +NOTE_4: Close_all_lists_unless_category; PAGE:en.w:SHA-2 PURPOSE: \n should ordinarily close list. However, if \n[[Category:A]], then don't close list since [[Category:A]] will trim preceding \n REASON: occurs b/c MW does separate passes for list and Category while XO does one pass. - EX: closes *a list *a diff --git a/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_wkr.java b/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_wkr.java index 1bc489b8e..aa335d980 100644 --- a/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_wkr.java +++ b/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_wkr.java @@ -221,7 +221,7 @@ public class Xop_tblw_wkr implements Xop_ctx_wkr { break; } // if (prv_tid == Xop_tkn_itm_.Tid_xnde) -// ctx.Stack_autoClose(root, src, prv_tkn, prv_tkn.Src_bgn(), prv_tkn.Src_end()); +// ctx.Stack_auto_close(root, src, prv_tkn, prv_tkn.Src_bgn(), prv_tkn.Src_end()); if (create_th) new_tkn = tkn_mkr.Tblw_th(bgn_pos, cur_pos, tbl_is_xml); else new_tkn = tkn_mkr.Tblw_td(bgn_pos, cur_pos, tbl_is_xml); cell_pipe_seen = false; diff --git a/400_xowa/src/gplx/xowa/setup/maints/Wmf_latest_parser.java b/400_xowa/src/gplx/xowa/setup/maints/Wmf_latest_parser.java index c01acc507..9bb007ae1 100644 --- a/400_xowa/src/gplx/xowa/setup/maints/Wmf_latest_parser.java +++ b/400_xowa/src/gplx/xowa/setup/maints/Wmf_latest_parser.java @@ -43,12 +43,12 @@ public class Wmf_latest_parser { int name_bgn = Bry_finder.Move_fwd(src, name_bgn_bry, size_end, src_len); if (name_bgn == Bry_finder.Not_found) break; int name_end = Bry_finder.Find_fwd(src, Byte_ascii.Quote, name_bgn, src_len); byte[] name = Bry_.Mid(src, name_bgn, name_end); - int date_bgn = Bry_finder.Move_fwd(src, date_bgn_bry, name_end, src_len); if (date_bgn == Bry_finder.Not_found) {Gfo_usr_dlg_._.Warn_many("", "", "date_bgn not found"); break;} - date_bgn = Bry_finder.Find_fwd_while_space_or_tab(src, date_bgn, src_len); if (date_bgn == Bry_finder.Not_found) {Gfo_usr_dlg_._.Warn_many("", "", "date_bgn not found"); break;} + int date_bgn = Bry_finder.Move_fwd(src, date_bgn_bry, name_end, src_len); if (date_bgn == Bry_finder.Not_found) {Gfo_usr_dlg_.I.Warn_many("", "", "date_bgn not found"); break;} + date_bgn = Bry_finder.Find_fwd_while_space_or_tab(src, date_bgn, src_len); if (date_bgn == Bry_finder.Not_found) {Gfo_usr_dlg_.I.Warn_many("", "", "date_bgn not found"); break;} int date_end = Bry_finder.Find_fwd(src, date_end_bry, date_bgn, src_len); byte[] date_bry = Bry_.Mid(src, date_bgn, date_end); DateAdp date = DateAdp_.parse_fmt(String_.new_ascii_(Replace_or(tmp_bfr, date_trie, date_bry, 3, date_or)), "dd-MM-yyyy HH:mm"); - int size_bgn = Bry_finder.Find_fwd_while_space_or_tab(src, date_end, src_len); if (size_bgn == Bry_finder.Not_found) {Gfo_usr_dlg_._.Warn_many("", "", "size_bgn not found"); break;} + int size_bgn = Bry_finder.Find_fwd_while_space_or_tab(src, date_end, src_len); if (size_bgn == Bry_finder.Not_found) {Gfo_usr_dlg_.I.Warn_many("", "", "size_bgn not found"); break;} size_end = Bry_finder.Find_fwd(src, Byte_ascii.CarriageReturn, size_bgn, src_len); byte[] size_bry = Bry_.Mid(src, size_bgn, size_end); long size = Long_.parse_or_(String_.new_utf8_(size_bry), -1); diff --git a/400_xowa/src/gplx/xowa/specials/allPages/Xows_page_allpages.java b/400_xowa/src/gplx/xowa/specials/allPages/Xows_page_allpages.java index a4c9edd96..298e19fec 100644 --- a/400_xowa/src/gplx/xowa/specials/allPages/Xows_page_allpages.java +++ b/400_xowa/src/gplx/xowa/specials/allPages/Xows_page_allpages.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.specials.allPages; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.core.primitives.*; import gplx.xowa.html.*; import gplx.xowa.html.lnkis.*; -import gplx.xowa.wikis.*; +import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.tbls.*; public class Xows_page_allpages implements GfoInvkAble, Bry_fmtr_arg, Xows_page { public Xows_page_allpages(Xowe_wiki wiki) { this.wiki = wiki; @@ -60,13 +60,13 @@ public class Xows_page_allpages implements GfoInvkAble, Bry_fmtr_arg, Xows_page ( "~{lbl_text}" ), "arg_from", "args__rest", "lbl_text"); public int Itms_per_page() {return itms_per_page;} private int itms_per_page = 345; - public void Itms_per_page_(int v) {itms_per_page = v; rslt_list_ttls = new Xodb_page[v];} + public void Itms_per_page_(int v) {itms_per_page = v; rslt_list_ttls = new Xowd_page_itm[v];} public int Itms_per_grp() {return itms_per_grp;} private int itms_per_grp = 3; public boolean List_include_redirects() {return show_redirects;} private boolean show_redirects = true; - public Xodb_page Rslt_prv() {return rslt_prv;} public void Rslt_prv_(Xodb_page v) {rslt_prv = v;} private Xodb_page rslt_prv; - public Xodb_page Rslt_nxt() {return rslt_nxt;} public void Rslt_nxt_(Xodb_page v) {rslt_nxt = v;} private Xodb_page rslt_nxt; + public Xowd_page_itm Rslt_prv() {return rslt_prv;} public void Rslt_prv_(Xowd_page_itm v) {rslt_prv = v;} private Xowd_page_itm rslt_prv; + public Xowd_page_itm Rslt_nxt() {return rslt_nxt;} public void Rslt_nxt_(Xowd_page_itm v) {rslt_nxt = v;} private Xowd_page_itm rslt_nxt; public int Rslt_list_len() {return rslt_list_len;} public void Rslt_list_len_(int v) {rslt_list_len = v;} private int rslt_list_len; - public Xodb_page[] Rslt_list_ttls() {return rslt_list_ttls;} private Xodb_page[] rslt_list_ttls; + public Xowd_page_itm[] Rslt_list_ttls() {return rslt_list_ttls;} private Xowd_page_itm[] rslt_list_ttls; public void Special_gen(Xoa_url url, Xoae_page page, Xowe_wiki wiki, Xoa_ttl ttl) { wiki.Ctx().Cur_page().Html_data().Display_ttl_(wiki.Msg_mgr().Val_by_id(Xol_msg_itm_.Id_sp_allpages_hdr)); url.Page_bry_(Bry_.Add(Bry_.new_ascii_("Special:"), ttl.Page_txt_wo_qargs())); // HACK: need to re-set Page b/c href_parser does not eliminate qargs; DATE:2013-02-08 @@ -100,14 +100,14 @@ public class Xows_page_allpages implements GfoInvkAble, Bry_fmtr_arg, Xows_page arg_hash.Save(url); } Int_obj_ref rslt_len = Int_obj_ref.new_(rslt_list_len); - Xodb_page rslt_nxt2 = new Xodb_page(); - Xodb_page rslt_prv2 = new Xodb_page(); + Xowd_page_itm rslt_nxt2 = new Xowd_page_itm(); + Xowd_page_itm rslt_prv2 = new Xowd_page_itm(); int all_pages_min = 0;// no minimum for all pages ListAdp rslt_list = ListAdp_.new_(); wiki.Db_mgr().Load_mgr().Load_ttls_for_all_pages(Cancelable_.Never, rslt_list, rslt_nxt2, rslt_prv2, rslt_len, init_ns, from_ttl.Page_db(), itms_per_page, all_pages_min, itms_per_page, !hide_redirects_val, true); rslt_list_len = rslt_len.Val(); for (int i = 0; i < rslt_list_len; i++) - rslt_list_ttls[i] = (Xodb_page)rslt_list.FetchAt(i); + rslt_list_ttls[i] = (Xowd_page_itm)rslt_list.FetchAt(i); rslt_nxt = rslt_nxt2; rslt_prv = rslt_prv2; return true; @@ -123,7 +123,7 @@ public class Xows_page_allpages implements GfoInvkAble, Bry_fmtr_arg, Xows_page tmp_bfr.Mkr_rls(); page.Html_data().Html_restricted_n_(); } - byte[] Build_html_end(Bry_bfr bfr, Xodb_page itm, boolean fwd) { + byte[] Build_html_end(Bry_bfr bfr, Xowd_page_itm itm, boolean fwd) { Xoa_ttl ttl = Xows_page_allpages.ttl_(wiki, init_ns, itm); if (ttl == null) return Bry_.Empty; // occurs when range is empty; EX: Module:A in simplewikibooks int msg_id = fwd ? Xol_msg_itm_.Id_sp_allpages_fwd : Xol_msg_itm_.Id_sp_allpages_bwd; Xol_msg_itm msg_itm = wiki.Lang().Msg_mgr().Itm_by_id_or_null(msg_id); @@ -133,7 +133,7 @@ public class Xows_page_allpages implements GfoInvkAble, Bry_fmtr_arg, Xows_page byte[] arg_from = Xoa_app_.Utl__encoder_mgr().Id().Encode(ttl.Page_txt_wo_qargs()); return html_list_end.Bld_bry_many(bfr, arg_from, args__rest, lbl_text); } - public static Xoa_ttl ttl_(Xowe_wiki wiki, Xow_ns ns, Xodb_page itm) { + public static Xoa_ttl ttl_(Xowe_wiki wiki, Xow_ns ns, Xowd_page_itm itm) { byte[] ttl_bry = itm.Ttl_page_db(); if (!ns.Id_main()) ttl_bry = Bry_.Add(ns.Name_db_w_colon(), ttl_bry); return Xoa_ttl.parse_(wiki, ttl_bry); @@ -177,13 +177,13 @@ class Xos_pagelist_html_itm_fmtr implements Bry_fmtr_arg { ttls_len = ttls.length; itm_pct = 100 / itms_per_grp; init_ns = mgr.Init_ns(); - } int itms_per_grp, ttls_len, itm_pct; Xodb_page[] ttls; Xow_ns init_ns; + } int itms_per_grp, ttls_len, itm_pct; Xowd_page_itm[] ttls; Xow_ns init_ns; public void XferAry_end() {ttls = null;} public void XferAry(Bry_bfr bfr, int idx) { int itm_end = itm_idx + itms_per_grp; for (int i = itm_idx; i < itm_end; i++) { if (i >= ttls_len) break; // handle odd number of itms; EX: interval=3; items=4; proc gets called on 0 (0-2) and 3 (3-5); ArrayIndex for 4, 5 - Xodb_page ttl_itm = ttls[i]; + Xowd_page_itm ttl_itm = ttls[i]; if (ttl_itm == null) break; // ttl_itm can be null at bgn or end of title list; EX: list=A-Z; count=5; key=Z; itms=X,Y,Z,null,null Xoa_ttl ttl = Xows_page_allpages.ttl_(wiki, init_ns, ttl_itm); byte[] href = href_parser.Build_to_bry(wiki, ttl); diff --git a/400_xowa/src/gplx/xowa/specials/allPages/Xows_page_allpages_tst.java b/400_xowa/src/gplx/xowa/specials/allPages/Xows_page_allpages_tst.java index ccdafe767..34895d09c 100644 --- a/400_xowa/src/gplx/xowa/specials/allPages/Xows_page_allpages_tst.java +++ b/400_xowa/src/gplx/xowa/specials/allPages/Xows_page_allpages_tst.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.specials.allPages; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -import org.junit.*; +import org.junit.*; import gplx.xowa.wikis.data.tbls.*; public class Xows_page_allpages_tst { @Before public void init() {fxt.Clear();} private Xows_page_allpages_fxt fxt = new Xows_page_allpages_fxt(); @Test public void Build_data() { @@ -144,17 +144,17 @@ class Xows_page_allpages_fxt { public Xows_page_allpages_fxt Expd_display_ttl(String v) {expd_display_ttl = v; return this;} private String expd_display_ttl; public Xows_page_allpages_fxt Expd_address_page(String v) {expd_address_page = v; return this;} private String expd_address_page; - public static String Xto_str(Xowe_wiki wiki, Xodb_page v) { + public static String Xto_str(Xowe_wiki wiki, Xowd_page_itm v) { if (v == null) return null; Xow_ns ns = wiki.Ns_mgr().Ids_get_or_null(v.Ns_id()); String ns_str = ns == null ? "" : String_.new_ascii_(ns.Name_db_w_colon()); return ns_str + String_.new_ascii_(v.Ttl_page_db()); } - public static String[] Xto_str_ary(Xowe_wiki wiki, Xodb_page[] ary) { + public static String[] Xto_str_ary(Xowe_wiki wiki, Xowd_page_itm[] ary) { int ary_len = ary.length; String[] rv = new String[ary_len]; for (int i = 0; i < ary_len; i++) { - Xodb_page itm = ary[i]; + Xowd_page_itm itm = ary[i]; rv[i] = Xto_str(wiki, itm); } return rv; diff --git a/400_xowa/src/gplx/xowa/specials/movePage/Move_page.java b/400_xowa/src/gplx/xowa/specials/movePage/Move_page.java index 2c9c779b3..ddd6f4600 100644 --- a/400_xowa/src/gplx/xowa/specials/movePage/Move_page.java +++ b/400_xowa/src/gplx/xowa/specials/movePage/Move_page.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.specials.movePage; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -import gplx.core.primitives.*; +import gplx.core.primitives.*; import gplx.xowa.wikis.data.tbls.*; public class Move_page implements Xows_page { private Move_trg_ns_list_fmtr ns_list_fmtr = new Move_trg_ns_list_fmtr(); private Move_url_args args = new Move_url_args(); @@ -39,14 +39,14 @@ public class Move_page implements Xows_page { Xow_ns trg_ns = wiki.Ns_mgr().Ids_get_or_null(trg_ns_id); if (trg_ns == null) throw Err_.new_fmt_("unknown ns: ns={0}", trg_ns_id); byte[] trg_ttl_bry = args.Trg_ttl(); Xoa_ttl trg_ttl = Xoa_ttl.parse_(wiki, trg_ns_id, trg_ttl_bry); - Xodb_page src_page = new Xodb_page(); + Xowd_page_itm src_page = new Xowd_page_itm(); wiki.Db_mgr().Load_mgr().Load_by_ttl(src_page, src_ttl.Ns(), src_ttl.Page_db()); page.Revision_data().Id_(src_page.Id()); page.Revision_data().Modified_on_(src_page.Modified_on()); - page.Data_raw_(src_page.Wtxt()); + page.Data_raw_(src_page.Text()); if (args.Create_redirect()) { // NOTE: not tested; DATE:2014-02-27 save_mgr.Data_update(page, Xop_redirect_mgr.Make_redirect_text(trg_ttl.Full_db())); - Xodb_page trg_page = new Xodb_page(); + Xowd_page_itm trg_page = new Xowd_page_itm(); boolean trg_page_exists = wiki.Db_mgr().Load_mgr().Load_by_ttl(trg_page, trg_ns, trg_ttl_bry); if (trg_page_exists) save_mgr.Data_update(page, page.Data_raw()); @@ -74,7 +74,7 @@ public class Move_page implements Xows_page { , msg_mgr.Val_by_key_obj("move-leave-redirect") , msg_mgr.Val_by_key_obj("movepagebtn") ); - return tmp_bfr.Mkr_rls().Xto_bry_and_clear(); + return tmp_bfr.To_bry_and_rls(); } private Bry_fmtr fmtr_all = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last ( "
    " diff --git a/400_xowa/src/gplx/xowa/specials/search/Xog_search_suggest_cmd.java b/400_xowa/src/gplx/xowa/specials/search/Xog_search_suggest_cmd.java index 5680ff6b5..8069ddafe 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xog_search_suggest_cmd.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xog_search_suggest_cmd.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -import gplx.core.primitives.*; +import gplx.core.primitives.*; import gplx.xowa.wikis.data.tbls.*; class Xog_search_suggest_cmd implements GfoInvkAble, Cancelable { public Xog_search_suggest_cmd(Xoae_app app, Xog_search_suggest_mgr mgr) { this.app = app; this.mgr = mgr; @@ -60,19 +60,19 @@ class Xog_search_suggest_cmd implements GfoInvkAble, Cancelable { } private boolean Search_by_all_pages_v1() { rslts_2.Clear(); - Xodb_page rslt_nxt = new Xodb_page(); - Xodb_page rslt_prv = new Xodb_page(); + Xowd_page_itm rslt_nxt = new Xowd_page_itm(); + Xowd_page_itm rslt_prv = new Xowd_page_itm(); Xoa_ttl search_ttl = Xoa_ttl.parse_(wiki, search_bry); if (search_ttl == null) return false; byte[] search_ttl_bry = search_ttl.Page_db(); ListAdp page_list = ListAdp_.new_(); wiki.Db_mgr().Load_mgr().Load_ttls_for_all_pages(this, page_list, rslt_nxt, rslt_prv, Int_obj_ref.zero_(), wiki.Ns_mgr().Ns_main(), search_ttl_bry, max_results, all_pages_min, all_pages_extend, true, false); - Xodb_page[] page_ary = (Xodb_page[])page_list.Xto_ary_and_clear(Xodb_page.class); + Xowd_page_itm[] page_ary = (Xowd_page_itm[])page_list.Xto_ary_and_clear(Xowd_page_itm.class); int idx = 0, 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]; if (page != null) { if (!Bry_.HasAtBgn(page.Ttl_page_db(), search_ttl_bry)) continue; // look-ahead may return other titles that don't begin with search; ignore - if (page.Wtxt_len() > all_pages_min) { + if (page.Text_len() > all_pages_min) { rslts_2.Add(page); idx++; } @@ -89,16 +89,16 @@ class Xog_search_suggest_cmd implements GfoInvkAble, Cancelable { for (int i = 0; i < len; i++) rslts_1.Add(rv.Itms_get_at(i)); if (canceled) {working = false; return false;} - rslts_1.SortBy(Xodb_page_sorter.EnyLenDsc); + rslts_1.SortBy(Xowd_page_itm_sorter.EnyLenDsc); if (canceled) {working = false; return false;} if (len > max_results) len = max_results; rslts_2.Clear(); for (int i = 0; i < len; i++) rslts_2.Add(rslts_1.FetchAt(i)); if (canceled) {working = false; return false;} - rslts_2.SortBy(Xodb_page_sorter.IdAsc); + rslts_2.SortBy(Xowd_page_itm_sorter.IdAsc); wiki.Db_mgr().Load_mgr().Load_by_ids(this, rslts_2, 0, len); - rslts_2.SortBy(Xodb_page_sorter.TitleAsc); + rslts_2.SortBy(Xowd_page_itm_sorter.TitleAsc); if (canceled) {working = false; return false;} return true; } diff --git a/400_xowa/src/gplx/xowa/specials/search/Xog_search_suggest_mgr.java b/400_xowa/src/gplx/xowa/specials/search/Xog_search_suggest_mgr.java index 431b20469..0598b8821 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xog_search_suggest_mgr.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xog_search_suggest_mgr.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -import gplx.gfui.*; import gplx.threads.*; import gplx.xowa.gui.*; import gplx.xowa.gui.views.*; +import gplx.gfui.*; import gplx.threads.*; import gplx.xowa.gui.*; import gplx.xowa.gui.views.*; import gplx.xowa.wikis.data.tbls.*; public class Xog_search_suggest_mgr implements GfoInvkAble { public Xog_search_suggest_mgr(Xoa_gui_mgr gui_mgr) { this.app = gui_mgr.App(); @@ -84,7 +84,7 @@ public class Xog_search_suggest_mgr implements GfoInvkAble { wtr.Add_brack_bgn(); int len = found.Count(); for (int i = 0; i < len; i++) { - Xodb_page p = (Xodb_page)found.FetchAt(i); + Xowd_page_itm p = (Xowd_page_itm)found.FetchAt(i); Xow_ns ns = wiki.Ns_mgr().Ids_get_or_null(p.Ns_id()); byte[] ttl = Xoa_ttl.Replace_unders(ns.Gen_ttl(p.Ttl_page_db())); wtr.Add_str_arg(i, ttl); diff --git a/400_xowa/src/gplx/xowa/specials/search/Xosrh_core.java b/400_xowa/src/gplx/xowa/specials/search/Xosrh_core.java index 1449f238c..3fbeadbef 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_core.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xosrh_core.java @@ -53,7 +53,7 @@ public class Xosrh_core implements GfoInvkAble, Xows_page { page_mgr.Ns_mgr_(args_mgr.Ns_mgr()); cur_grp = page_mgr.Search(tmp_bfr, wiki, search_bry, page_idx, page_mgr); html_mgr.Bld_html(tmp_bfr, this, cur_grp, search_bry, page_idx, page_mgr.Pages_len()); - page.Data_raw_(tmp_bfr.Mkr_rls().Xto_bry_and_clear()); + page.Data_raw_(tmp_bfr.To_bry_and_rls()); wiki.ParsePage(page, false); // do not clear else previous Search_text will be lost page.Html_data().Xtn_search_text_(search_bry); } diff --git a/400_xowa/src/gplx/xowa/specials/search/Xosrh_core_tst.java b/400_xowa/src/gplx/xowa/specials/search/Xosrh_core_tst.java index 9dfdf29c1..f5926c4ed 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_core_tst.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xosrh_core_tst.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -import org.junit.*; import gplx.xowa.tdbs.*; +import org.junit.*; import gplx.xowa.tdbs.*; import gplx.xowa.wikis.data.tbls.*; public class Xosrh_core_tst { @Before public void Init() {fxt.Clear();} private Xos_search_mgr_fxt fxt = new Xos_search_mgr_fxt(); @Test public void Basic() { @@ -99,10 +99,10 @@ class Xos_search_mgr_fxt { public Xoae_app App() {return app;} public Xowe_wiki Wiki() {return wiki;} public Xobl_regy_itm regy_itm_(int id, String bgn, String end, int count) {return new Xobl_regy_itm(id, Bry_.new_utf8_(bgn), Bry_.new_utf8_(end), count);} - public Xodb_page data_ttl_(int id, String ttl) {return data_ttl_(id, 0, 0, false, 0, ttl);} - public Xodb_page data_ttl_(int id, int fil, int row, boolean redirect, int len, String ttl) {return new Xodb_page().Init(id, Bry_.new_utf8_(ttl), redirect, len, fil, row);} - public Xodb_page data_id_(int id, String ttl) {return data_id_(id, Xow_ns_.Id_main, ttl);} - public Xodb_page data_id_(int id, int ns, String ttl) {return new Xodb_page().Id_(id).Ns_id_(ns).Ttl_page_db_(Bry_.new_utf8_(ttl)).Wtxt_db_id_(0).Wtxt_len_(0);} + public Xowd_page_itm data_ttl_(int id, String ttl) {return data_ttl_(id, 0, 0, false, 0, ttl);} + public Xowd_page_itm data_ttl_(int id, int fil, int row, boolean redirect, int len, String ttl) {return new Xowd_page_itm().Init(id, Bry_.new_utf8_(ttl), redirect, len, fil, row);} + public Xowd_page_itm data_id_(int id, String ttl) {return data_id_(id, Xow_ns_.Id_main, ttl);} + public Xowd_page_itm data_id_(int id, int ns, String ttl) {return new Xowd_page_itm().Id_(id).Ns_id_(ns).Ttl_page_db_(Bry_.new_utf8_(ttl)).Text_db_id_(0).Text_len_(0);} public Xobl_search_ttl data_sttl_(String word, int... ids) {return new Xobl_search_ttl(Bry_.new_utf8_(word), data_ttl_word_page_ary_(ids));} public Xobl_search_ttl_page[] data_ttl_word_page_ary_(int... ids) { int ids_len = ids.length; @@ -211,7 +211,7 @@ class Xos_search_mgr_fxt { int itms_len = page.Itms_len(); String[] rv = new String[itms_len]; for (int i = 0; i < itms_len; i++) { - Xodb_page itm = page.Itms_get_at(i); + Xowd_page_itm itm = page.Itms_get_at(i); rv[i] = String_.new_utf8_(itm.Ttl_page_db()); } return rv; diff --git a/400_xowa/src/gplx/xowa/specials/search/Xosrh_html_mgr.java b/400_xowa/src/gplx/xowa/specials/search/Xosrh_html_mgr.java index b5ac709a9..90ac28c28 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_html_mgr.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xosrh_html_mgr.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -import gplx.xowa.langs.numbers.*; +import gplx.xowa.langs.numbers.*; import gplx.xowa.wikis.data.tbls.*; class Xosrh_html_mgr implements GfoInvkAble { public Bry_fmtr Html_all_bgn() {return html_all_bgn;} Bry_fmtr html_all_bgn = Bry_fmtr.new_(String_.Concat_lines_nl ( "~{search_results_header}
    " @@ -54,7 +54,7 @@ class Xosrh_html_mgr implements GfoInvkAble { Xow_ns_mgr ns_mgr = wiki.Ns_mgr(); Bry_bfr tmp_ttl_bfr = core.Wiki().Appe().Utl__bfr_mkr().Get_b512(); for (int i = 0; i < itms_len; i++) { - Xodb_page itm = grp.Itms_get_at(i); + Xowd_page_itm itm = grp.Itms_get_at(i); byte[] itm_ttl = Xoa_ttl.Replace_unders(itm.Ttl_page_db()); int itm_ns_id = itm.Ns_id(); if (itm_ns_id != Xow_ns_.Id_main) { @@ -64,7 +64,7 @@ class Xosrh_html_mgr implements GfoInvkAble { .Add(itm_ttl); itm_ttl = tmp_ttl_bfr.Xto_bry_and_clear(); } - html_itm.Bld_bfr_many(bfr, itm_ttl, itm.Wtxt_len()); + html_itm.Bld_bfr_many(bfr, itm_ttl, itm.Text_len()); } html_all_end.Bld_bfr_many(bfr, search_bry, xowa_idx_bwd, xowa_idx_fwd); tmp_ttl_bfr.Mkr_rls(); diff --git a/400_xowa/src/gplx/xowa/specials/search/Xosrh_page_mgr.java b/400_xowa/src/gplx/xowa/specials/search/Xosrh_page_mgr.java index 1a12b2f60..9b2d7c35f 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_page_mgr.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xosrh_page_mgr.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; +import gplx.xowa.wikis.data.tbls.*; public class Xosrh_page_mgr implements Xosrh_page_mgr_searcher { public int Pages_len() {return pages_ary.length;} public int Itms_bgn() {return itms_bgn;} private int itms_bgn; @@ -66,7 +67,7 @@ public class Xosrh_page_mgr implements Xosrh_page_mgr_searcher { } rv = new Xosrh_rslt_grp(page_idx); for (int i = itms_bgn; i < itms_end; i++) - rv.Itms_add((Xodb_page)cur_ids.FetchAt(i)); + rv.Itms_add((Xowd_page_itm)cur_ids.FetchAt(i)); pages_ary[page_idx] = rv; rv.Itms_total_(cur_ids.Count()); return rv; diff --git a/400_xowa/src/gplx/xowa/specials/search/Xosrh_page_mgr_tst.java b/400_xowa/src/gplx/xowa/specials/search/Xosrh_page_mgr_tst.java index 2e69ae3c8..c35d81910 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_page_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xosrh_page_mgr_tst.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -import org.junit.*; import gplx.xowa.tdbs.*; +import org.junit.*; import gplx.xowa.tdbs.*; import gplx.xowa.wikis.data.tbls.*; public class Xosrh_page_mgr_tst { @Before public void init() {fxt.Clear();} private Xosrh_page_mgr_fxt fxt = new Xosrh_page_mgr_fxt(); @Test public void Basic() { @@ -42,17 +42,17 @@ class Xosrh_page_mgr_fxt { return this; } private Xoae_app app; Xowe_wiki wiki; Bry_bfr tmp_bfr; Xosrh_page_mgr page_mgr; Xowd_hive_mgr hive_mgr; public Xosrh_page_mgr_fxt Init_site_ids(int bgn, int end) { - Xodb_page tmp_itm = new Xodb_page(); + Xowd_page_itm tmp_itm = new Xowd_page_itm(); for (int i = bgn; i < end; i++) { byte[] id_bry = new byte[5]; // NOTE: do not reuse; will break hive_mgr Base85_utl.XtoStrByAry(i, id_bry, 0, 5); tmp_itm.Ns_id_(Xow_ns_.Id_main).Init(i, Bry_.XtoStrBytesByInt(i, 0), false, 10, 0, i - bgn); - Xodb_page_.Txt_id_save(tmp_bfr, tmp_itm); + Xotdb_page_itm_.Txt_id_save(tmp_bfr, tmp_itm); hive_mgr.Create(id_bry, tmp_bfr.Xto_bry_and_clear(), null); } return this; } - // public Xodb_page Set_all(int id, int fil_idx, int row_idx, boolean type_redirect, int itm_len, int ns_id, byte[] ttl) { + // public Xowd_page_itm Set_all(int id, int fil_idx, int row_idx, boolean type_redirect, int itm_len, int ns_id, byte[] ttl) { public Xosrh_page_mgr_fxt Init_sort_by_name_(boolean v) {page_mgr.Sort_tid_(v ? Xosrh_rslt_itm_sorter.Tid_ttl_asc : Xosrh_rslt_itm_sorter.Tid_len_dsc); return this;} public Xosrh_page_mgr_fxt Init_itms_per_page_(int v) {page_mgr.Itms_per_page_(v); return this;} public Xosrh_page_mgr_searcher_mok ids_(int bgn, int end) { @@ -61,7 +61,7 @@ class Xosrh_page_mgr_fxt { for (int i = 0; i < len; i++) { int itm_id = i + bgn; int itm_len = itm_id; - Xodb_page itm = Xodb_page.new_srch(itm_id, itm_len); + Xowd_page_itm itm = Xowd_page_itm.new_srch(itm_id, itm_len); rv.Add(itm); } return new Xosrh_page_mgr_searcher_mok(rv); @@ -75,7 +75,7 @@ class Xosrh_page_mgr_fxt { int len = page.Itms_len(); int[] rv = new int[len]; for (int i = 0; i < len; i++) { - rv[i] = ((Xodb_page)page.Itms_get_at(i)).Id(); + rv[i] = ((Xowd_page_itm)page.Itms_get_at(i)).Id(); } return rv; } diff --git a/400_xowa/src/gplx/xowa/specials/search/Xosrh_parser_tst.java b/400_xowa/src/gplx/xowa/specials/search/Xosrh_parser_tst.java index e666cd633..a69174b30 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_parser_tst.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xosrh_parser_tst.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -import org.junit.*; import gplx.xowa.tdbs.*; +import org.junit.*; import gplx.xowa.tdbs.*; import gplx.xowa.wikis.data.tbls.*; public class Xosrh_parser_tst { @Before public void init() {fxt.Clear();} private Xosearch_parser_fxt fxt = new Xosearch_parser_fxt(); @Test public void Scan_word() {fxt.Test_scan("abc", "abc");} @@ -103,7 +103,7 @@ class Xosearch_parser_fxt { int len = ids.length; ListAdp id_vals = ListAdp_.new_(); for (int i = 0; i < len; i++) - id_vals.Add(Xodb_page.new_srch(ids[i], 0)); + id_vals.Add(Xowd_page_itm.new_srch(ids[i], 0)); matches.Add(Bry_.new_ascii_(name), id_vals); } public void Test_match(String raw, int... expd) { @@ -118,7 +118,7 @@ class Xosearch_parser_fxt { int len = list.Count(); int[] rv = new int[len]; for (int i = 0; i < len; i++) - rv[i] = ((Xodb_page)list.FetchAt(i)).Id(); + rv[i] = ((Xowd_page_itm)list.FetchAt(i)).Id(); return rv; } private void Test_match_assign_ids(byte[] src, Xosrh_qry_itm itm) { diff --git a/400_xowa/src/gplx/xowa/specials/search/Xosrh_qry_itm.java b/400_xowa/src/gplx/xowa/specials/search/Xosrh_qry_itm.java index 557638d84..b6a9cae56 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_qry_itm.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xosrh_qry_itm.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; -import gplx.xowa.dbs.*; +import gplx.xowa.dbs.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.bldrs.cmds.texts.*; class Xosrh_qry_itm { public Xosrh_qry_itm(byte tid, byte[] word, Xosrh_qry_itm lhs, Xosrh_qry_itm rhs) { this.tid = tid; this.word = word; this.lhs = lhs; this.rhs = rhs; @@ -59,7 +59,7 @@ class Xosrh_qry_itm { ListAdp rv = ListAdp_.new_(); int found_len = found.Count(); for (int i = 0; i < found_len; i++) { - Xodb_page page = (Xodb_page)found.FetchAt(i); + Xowd_page_itm page = (Xowd_page_itm)found.FetchAt(i); if ( ns_mgr.Has(page.Ns_id()) || wiki_db_tid == Xodb_mgr_txt.Tid_txt) // xdat does not store ns, so ns will always be null; no choice but to bring back all results; DATE:2013-11-14 rv.Add(page); @@ -75,7 +75,7 @@ class Xosrh_qry_itm { break; case Xosrh_qry_itm.Tid_word_quote: OrderedHash tmp_search_list = OrderedHash_.new_(); - byte[][] words = gplx.xowa.bldrs.imports.Xob_search_base.Split(wiki.Lang(), tmp_search_list, tmp_bfr, word); + byte[][] words = gplx.xowa.bldrs.cmds.texts.Xob_search_base.Split(wiki.Lang(), tmp_search_list, tmp_bfr, word); int words_len = words.length; ListAdp prv_list = null; for (int i = 0; i < words_len; i++) { @@ -95,7 +95,7 @@ class Xosrh_qry_itm { if (cancelable.Canceled()) return; ids = ListAdp_.new_(); for (int i = 0; i < ids_len; i++) { - Xodb_page itm = (Xodb_page)tmp_ids.FetchAt(i); + Xowd_page_itm itm = (Xowd_page_itm)tmp_ids.FetchAt(i); byte[] itm_ttl = itm.Ttl_page_db(); itm_ttl = wiki.Lang().Case_mgr().Case_build_lower(itm_ttl, 0, itm_ttl.length); // lowercase ttl (since all search words are lower-cased) itm_ttl = Bry_.Replace(itm_ttl, Byte_ascii.Underline, Byte_ascii.Space); // replace _ with " " (assume user will use spaces in search term) @@ -156,7 +156,7 @@ class Xosrh_qry_itm { } len = list_to_hash.Count(); for (int i = 0; i < len; i++) { - Xodb_page id = (Xodb_page)list_to_hash.FetchAt(i); + Xowd_page_itm id = (Xowd_page_itm)list_to_hash.FetchAt(i); try { if (!tmp_hash.Has(id.Id_val())) tmp_hash.Add(id.Id_val(), id); } catch (Exception e) {Err_.Noop(e); tmp_hash.Clear(); return ListAdp_.Null;} // handle error in case of threading issues; must clear tmp_hash else will accumulate; @@ -165,7 +165,7 @@ class Xosrh_qry_itm { } len = list_to_comp.Count(); for (int i = 0; i < len; i++) { - Xodb_page id = (Xodb_page)list_to_comp.FetchAt(i); + Xowd_page_itm id = (Xowd_page_itm)list_to_comp.FetchAt(i); boolean exists = tmp_hash.Has(id.Id_val()); switch (tid) { case Evaluate_tid_and: // iterate comp and add if in a; EX: (a,cur_b,c) AND (a,d); add a diff --git a/400_xowa/src/gplx/xowa/specials/search/Xosrh_rslt_grp.java b/400_xowa/src/gplx/xowa/specials/search/Xosrh_rslt_grp.java index 99e04188f..441a62884 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_rslt_grp.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xosrh_rslt_grp.java @@ -16,17 +16,18 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; +import gplx.xowa.wikis.data.tbls.*; public class Xosrh_rslt_grp { - public Xosrh_rslt_grp(int idx) {this.idx = idx;} private Xodb_page[] itms = Xodb_page.Ary_empty; + public Xosrh_rslt_grp(int idx) {this.idx = idx;} private Xowd_page_itm[] itms = Xowd_page_itm.Ary_empty; public int Idx() {return idx;} private int idx; public int Itms_len() {return itms_len;} private int itms_len; int itms_max; public int Itms_total() {return itms_total;} public Xosrh_rslt_grp Itms_total_(int v) {itms_total = v; return this;} private int itms_total; - public Xodb_page Itms_get_at(int i) {return itms[i];} - public void Itms_add(Xodb_page itm) { + public Xowd_page_itm Itms_get_at(int i) {return itms[i];} + public void Itms_add(Xowd_page_itm itm) { int new_itms_len = itms_len + 1; if (new_itms_len > itms_max) { itms_max = itms_max == 0 ? 2 : itms_max * 2; - itms = (Xodb_page[])Array_.Resize(itms, itms_max); + itms = (Xowd_page_itm[])Array_.Resize(itms, itms_max); } itms[itms_len] = itm; itms_len = new_itms_len; @@ -35,9 +36,9 @@ public class Xosrh_rslt_grp { public void Itms_clear() { for (int i = 0; i < itms_len; i++) itms[i] = null; - itms = Xodb_page.Ary_empty; + itms = Xowd_page_itm.Ary_empty; itms_len = itms_max = 0; } - public void Itms_sort(Xodb_page_sorter sorter) {Array_.Sort(itms, sorter);} + public void Itms_sort(Xowd_page_itm_sorter sorter) {Array_.Sort(itms, sorter);} public static final Xosrh_rslt_grp[] Ary_empty = new Xosrh_rslt_grp[0]; } diff --git a/400_xowa/src/gplx/xowa/specials/search/Xosrh_rslt_itm_sorter.java b/400_xowa/src/gplx/xowa/specials/search/Xosrh_rslt_itm_sorter.java index e1452e13c..27a6cfafd 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_rslt_itm_sorter.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xosrh_rslt_itm_sorter.java @@ -16,17 +16,18 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; +import gplx.xowa.wikis.data.tbls.*; public class Xosrh_rslt_itm_sorter implements gplx.lists.ComparerAble { public byte Tid() {return tid;} public Xosrh_rslt_itm_sorter Tid_(byte v) {tid = v; return this;} private byte tid = Tid_len_dsc; public int compare(Object lhsObj, Object rhsObj) { - Xodb_page lhs = (Xodb_page)lhsObj; - Xodb_page rhs = (Xodb_page)rhsObj; + Xowd_page_itm lhs = (Xowd_page_itm)lhsObj; + Xowd_page_itm rhs = (Xowd_page_itm)rhsObj; if (lhs == null || rhs == null || tid == Tid_none) return CompareAble_.Same; // else if (lhs == null) return CompareAble_.Less; // else if (rhs == null) return CompareAble_.More; else { switch (tid) { - case Tid_len_dsc: return Int_.Compare(lhs.Wtxt_len(), rhs.Wtxt_len()) * -1; + case Tid_len_dsc: return Int_.Compare(lhs.Text_len(), rhs.Text_len()) * -1; case Tid_ttl_asc: return Bry_.Compare(lhs.Ttl_page_db(), rhs.Ttl_page_db()); case Tid_id: return Int_.Compare(lhs.Id(), rhs.Id()); default: throw Err_mgr._.unhandled_(tid); diff --git a/400_xowa/src/gplx/xowa/specials/search/Xosrh_scanner.java b/400_xowa/src/gplx/xowa/specials/search/Xosrh_scanner.java index 1b7aaa623..1536453b7 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_scanner.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xosrh_scanner.java @@ -116,7 +116,7 @@ class Xosrh_scanner { } if (tid == Xosrh_qry_tkn.Tid_word) { // if word has symbol, convert to quoted; EX: a-b should become "a-b"; otherwise searcher would search for a single word a-b byte[] cur_word = Bry_.Mid(src, src_bgn, src_end); - byte[][] words = gplx.xowa.bldrs.imports.Xob_search_base.Split(null, tmp_list, tmp_bfr, cur_word); + byte[][] words = gplx.xowa.bldrs.cmds.texts.Xob_search_base.Split(null, tmp_list, tmp_bfr, cur_word); int words_len = words.length; if (words_len == 1 && !Bry_.Eq(words[0], cur_word) && Bry_finder.Find_fwd(cur_word, Byte_ascii.Asterisk) == -1) { tkns.Add(Xosrh_qry_tkn.new_bry_(tid, words[0])); diff --git a/400_xowa/src/gplx/xowa/specials/search/Xow_search_cache.java b/400_xowa/src/gplx/xowa/specials/search/Xow_search_cache.java new file mode 100644 index 000000000..cedbf046e --- /dev/null +++ b/400_xowa/src/gplx/xowa/specials/search/Xow_search_cache.java @@ -0,0 +1,67 @@ +/* +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 . +*/ +package gplx.xowa.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; +class Xow_search_qry { + public Xow_search_qry(byte[] raw, int rslts_bgn, int rslts_len, Xow_search_word[] word_ary, Xow_search_matcher search_matcher) { + this.raw = raw; this.rslts_bgn = rslts_bgn; this.rslts_len = rslts_len; + this.word_ary = word_ary; this.search_matcher = search_matcher; + } + public byte[] Raw() {return raw;} private final byte[] raw; + public Xow_search_matcher Search_matcher() {return search_matcher;} private final Xow_search_matcher search_matcher; + public Xow_search_word[] Word_ary() {return word_ary;} private final Xow_search_word[] word_ary; + public int Rslts_bgn() {return rslts_bgn;} private final int rslts_bgn; + public int Rslts_len() {return rslts_len;} private final int rslts_len; + public int Rslts_end() {return rslts_bgn + rslts_len;} +} +class Xow_search_rslt { + public Xow_search_rslt(byte[] page_key, int page_id, int page_ns, byte[] page_ttl, int page_len) { + this.page_key = page_key; + this.page_id = page_id; + this.page_ns = page_ns; + this.page_ttl = page_ttl; + this.page_len = page_len; + } + public byte[] Page_key() {return page_key;} private final byte[] page_key; + public int Page_id() {return page_id;} private final int page_id; + public int Page_ns() {return page_ns;} private final int page_ns; + public byte[] Page_ttl() {return page_ttl;} private final byte[] page_ttl; + public int Page_len() {return page_len;} private final int page_len; +} +class Xow_search_cache { + private final OrderedHash hash = OrderedHash_.new_bry_(); + public boolean Done() {return done;} public void Done_y_() {done = true;} private boolean done; + public int Count() {return hash.Count();} + public boolean Has(byte[] key) {return hash.Has(key);} + public void Add(Xow_search_rslt itm) {hash.Add(itm.Page_key(), itm);} + public void Get_between(ListAdp rv, int bgn, int end) { + rv.Clear(); + if (bgn >= hash.Count()) return; + for (int i = bgn; i < end; ++i) { + if (i >= hash.Count()) break; + Xow_search_rslt itm = (Xow_search_rslt)hash.FetchAt(i); + rv.Add(itm); + } + } +} +class Xow_search_word { + public Xow_search_word(byte[] text) {this.text = text;} + public byte[] Text() {return text;} private final byte[] text; + public int Id() {return id;} public void Id_(int v) {id = v;} private int id = -1; + public int Offset() {return offset;} public void Offset_add(int v) {offset += v;} private int offset; + public boolean Done() {return done;} public void Done_y_() {done = true;} private boolean done; +} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xow_search_db.java b/400_xowa/src/gplx/xowa/specials/search/Xow_search_db.java new file mode 100644 index 000000000..aa864485d --- /dev/null +++ b/400_xowa/src/gplx/xowa/specials/search/Xow_search_db.java @@ -0,0 +1,87 @@ +/* +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 . +*/ +package gplx.xowa.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; +import gplx.dbs.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; +class Xow_search_db { + public void Search(Cancelable cxl, Xow_wiki wiki, Xow_search_qry qry, Xow_search_cache cache) { +// int offset = qry.Rslts_bgn(); +// int limit = qry.Rslts_len(); + int rslts_end = qry.Rslts_end(); + Xow_search_matcher crt = null; + Xow_search_word[] words_ary = qry.Word_ary(); int words_len = words_ary.length; + while (true) { + boolean found_none = Bool_.Y; + for (int i = 0; i < words_len; ++i) { + Xow_search_word word = qry.Word_ary()[i]; + boolean read = Search_db(cxl, wiki, cache, wiki.Data_mgr__core_mgr().Db__core(), wiki.Data_mgr__core_mgr().Db__search(), word, crt); + if (read) found_none = Bool_.N; + } + if (found_none) {cache.Done_y_(); break;} + if (cache.Count() > rslts_end) {break;} + } + } + private boolean Search_db(Cancelable cxl, Xow_wiki wiki, Xow_search_cache cache, Xowd_db_file core_db, Xowd_db_file search_db, Xow_search_word word, Xow_search_matcher crt) { + if (word.Done()) return false; // last db_search for word returned 0 results; don't search again; + // get word_id + Xowd_search_word_tbl word_tbl = search_db.Tbl__search_word(); + int word_id = word.Id(); + if (word_id == Xowd_search_word_tbl.Id_null) { + word_id = word_tbl.Select_id(word.Text()); + if (word_id == Xowd_search_word_tbl.Id_null) { + word.Done_y_(); + Xoa_app_.Usr_dlg().Warn_many("", "", "search:word_id missing; word=~{0}", word); + return Bool_.N; + } + } + // get search results +// Xowd_search_link_tbl link_tbl = search_db.Tbl__search_link(); + Db_attach_rdr attach_rdr = new Db_attach_rdr(search_db.Conn(), "page_db", core_db.Url()); + String sql = String_.Format(Search_sql); + Db_rdr rdr = attach_rdr.Exec_as_rdr(sql); + Xowd_page_tbl page_tbl = core_db.Tbl__page(); + Xow_ns_mgr ns_mgr = wiki.Ns_mgr(); + boolean read = false; + while (rdr.Move_next()) { + read = true; + byte[] page_ttl = rdr.Read_bry(page_tbl.Fld_page_title()); + if (!crt.Matches(page_ttl)) continue; // ttl doesn't match crt; ignore; + int page_id = rdr.Read_int(page_tbl.Fld_page_id()); + int page_ns = rdr.Read_int(page_tbl.Fld_page_ns()); + int page_len = rdr.Read_int(page_tbl.Fld_page_len()); + Xow_ns ns = ns_mgr.Ids_get_or_null(page_ns); + byte[] page_key = ns.Gen_ttl(page_ttl); + if (cache.Has(page_key)) continue; // page already added by another word; EX: "A B"; word is "B", but "A B" already added by "A" + cache.Add(new Xow_search_rslt(page_key, page_id, page_ns, page_ttl, page_len)); + } + attach_rdr.Rls(); + if (!read) word.Done_y_(); + return read; + } + private static final String Search_sql = String_.Concat_lines_nl_skip_last + ( "SELECT cp.page_id" + , ", cp.page_namespace" + , ", cp.page_title" + , ", cp.page_len" + , "FROM {0} sp" + , " JOIN page cp ON cp.{1} = sp.page_id " + , "WHERE sp.{2} = {3}" + , "ORDER BY {4} {5}" + , "LIMIT {6}" + , "OFFSET {7};" + ); +} \ No newline at end of file diff --git a/400_xowa/src/gplx/xowa/specials/search/Xow_search_matcher.java b/400_xowa/src/gplx/xowa/specials/search/Xow_search_matcher.java new file mode 100644 index 000000000..33eb0c316 --- /dev/null +++ b/400_xowa/src/gplx/xowa/specials/search/Xow_search_matcher.java @@ -0,0 +1,52 @@ +/* +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 . +*/ +package gplx.xowa.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; +public class Xow_search_matcher { + public Xow_search_matcher(int tid, byte[] raw, Xow_search_matcher lhs, Xow_search_matcher rhs) { + this.tid = tid; this.raw = raw; this.lhs = lhs; this.rhs = rhs; + } + public int Tid() {return tid;} private final int tid; + public byte[] Raw() {return raw;} private final byte[] raw; + public Xow_search_matcher Lhs() {return lhs;} private final Xow_search_matcher lhs; + public Xow_search_matcher Rhs() {return rhs;} private final Xow_search_matcher rhs; + public boolean Matches(byte[] src) { + switch (tid) { + case Xow_search_matcher.Tid_word: + case Xow_search_matcher.Tid_word_quote: + return Bry_finder.Find_fwd(src, raw) != Bry_finder.Not_found; + case Xow_search_matcher.Tid_not: + return !lhs.Matches(src); + case Xow_search_matcher.Tid_or: + return lhs.Matches(src) || rhs.Matches(src); + case Xow_search_matcher.Tid_and: + return lhs.Matches(src) && rhs.Matches(src); + case Xow_search_matcher.Tid_null: return false; + default: throw Err_.unhandled(tid); + } + } + public static final Xow_search_matcher Null = new Xow_search_matcher(Xow_search_matcher.Tid_null, null, null, null); + public static Xow_search_matcher new_join(byte tid, Xow_search_matcher lhs, Xow_search_matcher rhs) {return new Xow_search_matcher(tid, null, lhs, rhs);} + public static final int + Tid_word = 0 + , Tid_and = 1 + , Tid_or = 2 + , Tid_not = 3 + , Tid_word_quote = 4 + , Tid_null = 5 + ; +} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xow_search_mgr.java b/400_xowa/src/gplx/xowa/specials/search/Xow_search_mgr.java new file mode 100644 index 000000000..ba6a95a11 --- /dev/null +++ b/400_xowa/src/gplx/xowa/specials/search/Xow_search_mgr.java @@ -0,0 +1,61 @@ +/* +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 . +*/ +package gplx.xowa.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; +import gplx.dbs.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; +class Xow_search_mgr { + private final Hash_adp_bry cache_hash = Hash_adp_bry.cs_(); + private final ListAdp rslts_list = ListAdp_.new_(); + private final Xow_search_db db = new Xow_search_db(); + public void Search(Xow_search_ui ui, byte[] raw, int rslt_bgn, int rslt_len, Xoa_wiki_mgr wiki_mgr, byte[]... wiki_domains) { + int len = wiki_domains.length; + for (int i = 0; i < len; ++i) { + if (ui.Canceled()) break; + byte[] wiki_domain = wiki_domains[i]; + Xow_wiki wiki = wiki_mgr.Get_by_key_or_null(wiki_domain); + if (wiki == null) {Xoa_app_.Usr_dlg().Warn_many("", "", "search:wiki not found; wiki=~{0}", wiki_domain); continue;} // wiki listed in search opt, but no longer exists + Search(ui, raw, rslt_bgn, rslt_len, wiki); + } + } + private void Search(Xow_search_ui ui, byte[] raw, int rslt_bgn, int rslt_len, Xow_wiki wiki) { + Xow_search_qry qry = Parse_qry(raw, rslt_bgn, rslt_len); + // get cache or new + byte[] cache_key = Bry_.Add_w_dlm(Byte_ascii.Pipe, wiki.Domain_bry(), raw); + Xow_search_cache cache = (Xow_search_cache)cache_hash.Get_by_bry(cache_key); + if (cache == null) { + cache = new Xow_search_cache(); + cache_hash.Add_bry_obj(cache_key, cache); + } + // fill results + cache.Get_between(rslts_list, qry.Rslts_bgn(), qry.Rslts_end()); + if (qry.Rslts_end() > cache.Count() && !cache.Done()) + db.Search(ui, wiki, qry, cache); + ui.End(); + } + private Xow_search_qry Parse_qry(byte[] raw, int rslt_bgn, int rslt_len) { + return null; + } +} +class Xow_search_ui implements Cancelable { + public boolean Canceled() {return false;} + public void Cancel() {} + public void Cancel_reset() {} + public void Add(Xow_search_rslt rslt) { + } + public void End() { + } +} diff --git a/400_xowa/src/gplx/xowa/specials/search/parsers/Xow_search_parser.java b/400_xowa/src/gplx/xowa/specials/search/parsers/Xow_search_parser.java new file mode 100644 index 000000000..66172e267 --- /dev/null +++ b/400_xowa/src/gplx/xowa/specials/search/parsers/Xow_search_parser.java @@ -0,0 +1,95 @@ +/* +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 . +*/ +package gplx.xowa.specials.search.parsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.search.*; +public class Xow_search_parser { + private Xow_search_parser_ctx parse_ctx = new Xow_search_parser_ctx(); private byte[] src; + public Xow_search_matcher Parse(byte[] src) { + this.src = src; + Xow_search_tkn[] tkns = Xow_search_scanner.I.Scan(src); + return Parse_itm_or(parse_ctx.Init(tkns)); + } + private Xow_search_matcher Parse_itm_or(Xow_search_parser_ctx parse_ctx) { + Xow_search_matcher lhs = Parse_itm_and(parse_ctx); + while (parse_ctx.Cur_tid(Xow_search_tkn.Tid_or)) { + parse_ctx.Move_next(); + Xow_search_matcher rhs = Parse_itm_and(parse_ctx); + lhs = new_join(Xow_search_matcher.Tid_or, lhs, rhs); + } + return lhs; + } + private Xow_search_matcher Parse_itm_and(Xow_search_parser_ctx parse_ctx) { + Xow_search_matcher lhs = Parse_itm_not(parse_ctx); + while (parse_ctx.Cur_tid(Xow_search_tkn.Tid_and)) { + parse_ctx.Move_next(); + Xow_search_matcher rhs = Parse_itm_not(parse_ctx); + lhs = new_join(Xow_search_matcher.Tid_and, lhs, rhs); + } + return lhs; + } + private Xow_search_matcher Parse_itm_not(Xow_search_parser_ctx parse_ctx) { + Xow_search_matcher lhs = Parse_itm_leaf(parse_ctx); + while (parse_ctx.Cur_tid(Xow_search_tkn.Tid_not)) { + parse_ctx.Move_next(); + Xow_search_matcher rhs = Parse_itm_leaf(parse_ctx); + lhs = new_join(Xow_search_matcher.Tid_not, null, rhs); + } + return lhs; + } + private Xow_search_matcher Parse_itm_leaf(Xow_search_parser_ctx parse_ctx) { + if (parse_ctx.Cur_tid(Xow_search_tkn.Tid_paren_bgn)) { + parse_ctx.Move_next(); + Xow_search_matcher lhs = Parse_itm_or(parse_ctx); + if (parse_ctx.Cur_tid(Xow_search_tkn.Tid_paren_end)) parse_ctx.Move_next(); // skip token + return lhs; + } + else if (parse_ctx.Cur_tid(Xow_search_tkn.Tid_eos)) + return Xow_search_matcher.Null; + else { + Xow_search_tkn word_tkn = parse_ctx.Move_next(); + if (word_tkn.Tid() == Xow_search_tkn.Tid_not) { + word_tkn = parse_ctx.Move_next(); + if (word_tkn == null) return Xow_search_matcher.Null; // occurs in "a -" + Xow_search_matcher word_itm = new_word(word_tkn, src); + return new_join(Xow_search_matcher.Tid_not, null, word_itm); + } + else + return new_word(word_tkn, src); + } + } + private static Xow_search_matcher new_word(Xow_search_tkn tkn, byte[] src) { + int tid = tkn.Tid() == Xow_search_tkn.Tid_word ? Xow_search_matcher.Tid_word : Xow_search_matcher.Tid_word_quote; + return new Xow_search_matcher(tid, tkn.Val(src), null, null); + } + private static Xow_search_matcher new_join(int tid, Xow_search_matcher lhs, Xow_search_matcher rhs) {return new Xow_search_matcher(tid, null, lhs, rhs);} + public static final Xow_search_parser _ = new Xow_search_parser(); Xow_search_parser() {} +} +class Xow_search_parser_ctx { + private Xow_search_tkn[] ary; private int pos = 0; private int ary_len; + public Xow_search_parser_ctx Init(Xow_search_tkn[] ary) { + this.ary = ary; + this.ary_len = ary.length; + this.pos = 0; + return this; + } + public boolean Cur_tid(byte tid) {return pos < ary_len ? tid == ary[pos].Tid(): tid == Xow_search_tkn.Tid_eos;} + public Xow_search_tkn Move_next() { + Xow_search_tkn rv = null; + if (pos < ary_len) rv = ary[pos++]; + return rv; + } +} diff --git a/400_xowa/src/gplx/xowa/specials/search/parsers/Xow_search_scanner.java b/400_xowa/src/gplx/xowa/specials/search/parsers/Xow_search_scanner.java new file mode 100644 index 000000000..023f4249b --- /dev/null +++ b/400_xowa/src/gplx/xowa/specials/search/parsers/Xow_search_scanner.java @@ -0,0 +1,145 @@ +/* +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 . +*/ +package gplx.xowa.specials.search.parsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.search.*; +import gplx.core.primitives.*; import gplx.core.btries.*; +class Xow_search_scanner { + private final ListAdp tkns = ListAdp_.new_(); private byte[] src; private int src_len, pos, txt_bgn; + private final OrderedHash tmp_list = OrderedHash_.new_(); private final Bry_bfr tmp_bfr = Bry_bfr.new_(); + public Xow_search_tkn[] Scan(byte[] src) { + this.src = src; this.src_len = src.length; + tkns.Clear(); pos = 0; txt_bgn = -1; + while (pos < src_len) { + byte cur_b = src[pos]; + Object cur_obj = trie.Match_bgn_w_byte(cur_b, src, pos, src_len); + if (cur_obj == null) { // text character + if (txt_bgn == -1) txt_bgn = pos; // 1st character not set; set it + ++pos; + } + else { // AND, OR, (, ), -, \s, " + int pos_end = trie.Match_pos(); + byte cur_tid = ((Byte_obj_val)cur_obj).Val(); + if (Cur_join_is_word(cur_tid, pos_end)) continue; // ignore words containing "and", "or"; EX: "random"; "for" + if (txt_bgn != -1) { // pending word; create + Tkns_add_word(Xow_search_tkn.Tid_word, txt_bgn, pos); + txt_bgn = -1; + } + switch (cur_tid) { + case Xow_search_tkn.Tid_space: // discard spaces + pos = Bry_finder.Find_fwd_while(src, pos, src_len, Byte_ascii.Space); + break; + case Xow_search_tkn.Tid_quote: // find end quote and add as word + int quote_bgn = pos + 1; + int quote_end = Bry_finder.Find_fwd(src, Byte_ascii.Quote, quote_bgn, src_len); + if (quote_end == Bry_.NotFound) throw Err_.new_fmt_("could not find end quote: {0}", String_.new_utf8_(src)); + Tkns_add_word(Xow_search_tkn.Tid_word_quoted, quote_bgn, quote_end); + pos = quote_end + 1; // +1 to place after quote + break; + case Xow_search_tkn.Tid_not: + Tkns_add_word(Xow_search_tkn.Tid_not, pos, pos_end); + pos = pos_end; + break; + case Xow_search_tkn.Tid_paren_bgn: case Xow_search_tkn.Tid_paren_end: + case Xow_search_tkn.Tid_and: case Xow_search_tkn.Tid_or: + tkns.Add(new_tkn(cur_tid, pos, pos_end)); + pos = pos_end; + break; + default: throw Err_.unhandled(cur_tid); + } + } + } + if (txt_bgn != -1) { // pending word; create + Tkns_add_word(Xow_search_tkn.Tid_word, txt_bgn, pos); + txt_bgn = -1; + } + return (Xow_search_tkn[])tkns.Xto_ary_and_clear(Xow_search_tkn.class); + } + private boolean Cur_join_is_word(byte cur_tid, int pos_end) { // extra logic to handle and / or occuring in unquoted strings; EX: "random"; "for" + switch (cur_tid) { + default: return false; // only look at AND, OR, - + case Xow_search_tkn.Tid_and: case Xow_search_tkn.Tid_or: case Xow_search_tkn.Tid_not: + break; + } + boolean join_is_word = true; + if (txt_bgn == -1) { // no pending word; + if (cur_tid == Xow_search_tkn.Tid_not) return false; // NOT is only operator if no pending tkn; EX: -abc -> NOT abc; a-b -> a-b + byte nxt_b = pos_end < src_len ? src[pos_end] : Byte_ascii.Nil; + Object nxt_obj = trie.Match_bgn_w_byte(nxt_b, src, pos_end, src_len); + if (nxt_obj == null) // next tkn is text; join must be word + join_is_word = true; + else { // next tkn is tkn + byte nxt_tid = ((Byte_obj_val)nxt_obj).Val(); + switch (nxt_tid) { + case Xow_search_tkn.Tid_space: case Xow_search_tkn.Tid_quote: + case Xow_search_tkn.Tid_paren_bgn: case Xow_search_tkn.Tid_paren_end: + join_is_word = false; // next tkn is sym; and/or is not word; EX: a AND ; a AND"b"; a AND(b) + break; + case Xow_search_tkn.Tid_not: case Xow_search_tkn.Tid_and: case Xow_search_tkn.Tid_or: + join_is_word = true; // next tkn is and or not; and/or is word; EX: andor; oror; or-abc; + break; + default: throw Err_.unhandled(cur_tid); + } + } + } + else { // pending word; cur join must be word; EX: "grand": "and" invoked and "gr" pending + join_is_word = true; + } + if (join_is_word) { + if (txt_bgn == -1) txt_bgn = pos; // 1st character not set; set it + pos = pos_end; + return true; + } + if (txt_bgn != -1) { + Tkns_add_word(Xow_search_tkn.Tid_word, txt_bgn, pos); // create word + txt_bgn = -1; + } + return false; + } + private void Tkns_add_word(byte tid, int src_bgn, int src_end) { + if (tkns.Count() > 0) { // at least 1 tkn; check for "auto-and" + Xow_search_tkn last_tkn = (Xow_search_tkn)tkns.FetchAtLast(); + if (last_tkn.Tid() == Xow_search_tkn.Tid_word) // previous tkn is word; auto "AND" words; EX: A B -> A AND B + tkns.Add(Xow_search_tkn.new_bry(Xow_search_tkn.Tid_and, Bry_and)); + } + if (tid == Xow_search_tkn.Tid_word) { // if word has symbol, convert to quoted; EX: a-b should become "a-b"; otherwise searcher would search for a single word a-b + byte[] cur_word = Bry_.Mid(src, src_bgn, src_end); + byte[][] words = gplx.xowa.bldrs.cmds.texts.Xob_search_base.Split(null, tmp_list, tmp_bfr, cur_word); + int words_len = words.length; + if ( words_len == 1 // only one word + && !Bry_.Eq(words[0], cur_word) // split word not same as raw + && Bry_finder.Find_fwd(cur_word, Byte_ascii.Asterisk) == -1 // no asterisk + ) { + tkns.Add(Xow_search_tkn.new_bry(tid, words[0])); + return; + } + if (words.length > 1) // multiple words; add as quoted-term; EX: "a-b" + tid = Xow_search_tkn.Tid_word_quoted; + } + tkns.Add(new_tkn(tid, src_bgn, src_end)); + } + private Xow_search_tkn new_tkn(byte tid, int val_bgn, int val_end) {return Xow_search_tkn.new_pos(tid, val_bgn, val_end);} + private static final byte[] Bry_and = Bry_.new_ascii_("AND"); + private static final Btrie_slim_mgr trie = Btrie_slim_mgr.ci_ascii_()// NOTE:ci.ascii:OR / AND only + .Add_str_byte(" " , Xow_search_tkn.Tid_space) + .Add_str_byte("\"" , Xow_search_tkn.Tid_quote) + .Add_str_byte("-" , Xow_search_tkn.Tid_not) + .Add_str_byte("(" , Xow_search_tkn.Tid_paren_bgn) + .Add_str_byte(")" , Xow_search_tkn.Tid_paren_end) + .Add_str_byte("or" , Xow_search_tkn.Tid_or) + .Add_str_byte("and" , Xow_search_tkn.Tid_and); + public static final Xow_search_scanner I = new Xow_search_scanner(); Xow_search_scanner() {} +} diff --git a/400_xowa/src/gplx/xowa/specials/search/parsers/Xow_search_tkn.java b/400_xowa/src/gplx/xowa/specials/search/parsers/Xow_search_tkn.java new file mode 100644 index 000000000..25d06809f --- /dev/null +++ b/400_xowa/src/gplx/xowa/specials/search/parsers/Xow_search_tkn.java @@ -0,0 +1,40 @@ +/* +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 . +*/ +package gplx.xowa.specials.search.parsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.search.*; +class Xow_search_tkn { + private final int val_bgn, val_end; + private final byte[] val_bry; + Xow_search_tkn(byte tid, int val_bgn, int val_end, byte[] val_bry) {this.tid = tid; this.val_bgn = val_bgn; this.val_end = val_end; this.val_bry = val_bry;} + public byte Tid() {return tid;} private final byte tid; + public byte[] Val(byte[] src) {return val_bry == null ? Bry_.Mid(src, val_bgn, val_end) : val_bry;} + public static Xow_search_tkn new_pos(byte tid, int val_bgn, int val_end) {return new Xow_search_tkn(tid, val_bgn, val_end, null);} + public static Xow_search_tkn new_bry(byte tid, byte[] val_bry) {return new Xow_search_tkn(tid, -1, -1, val_bry);} + public static final byte + Tid_root = 1 + , Tid_word = 2 + , Tid_word_quoted = 3 + , Tid_space = 4 + , Tid_quote = 5 + , Tid_not = 6 + , Tid_paren_bgn = 7 + , Tid_paren_end = 8 + , Tid_or = 9 + , Tid_and = 10 + , Tid_eos = 11 + ; +} diff --git a/400_xowa/src/gplx/xowa/specials/statistics/Xop_statistics_page.java b/400_xowa/src/gplx/xowa/specials/statistics/Xop_statistics_page.java index 5e6a50a65..8c8625f1c 100644 --- a/400_xowa/src/gplx/xowa/specials/statistics/Xop_statistics_page.java +++ b/400_xowa/src/gplx/xowa/specials/statistics/Xop_statistics_page.java @@ -32,7 +32,7 @@ public class Xop_statistics_page implements Xows_page { // stats_wiki.Wiki_(wiki); stats_ns.Wiki_(wiki); fmtr_all.Bld_bfr_many(tmp_bfr, stats_page, stats_ns); - return tmp_bfr.Mkr_rls().Xto_bry_and_clear(); + return tmp_bfr.To_bry_and_rls(); } private Bry_fmtr fmtr_all = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last ( "
    " diff --git a/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_cmd__base.java b/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_cmd__base.java index 72e869f39..066b05067 100644 --- a/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_cmd__base.java +++ b/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_cmd__base.java @@ -183,7 +183,7 @@ class Xosp_fbrow_cmd__wiki_add extends Xosp_fbrow_cmd__base { @Override public Xosp_fbrow_cmd Make_new() {return new Xosp_fbrow_cmd__wiki_add();} @Override protected void Process_itm(Xosp_fbrow_data_sub itm) { byte[] url_bry = itm.Url().RawBry(); - if (!Bry_.HasAtEnd(url_bry, Ext_sqlite3_000)) itm.Selectable_(false); + if (!Bry_.HasAtEnd(url_bry, Ext_xowa)) itm.Selectable_(false); } @Override protected Xosp_fbrow_rslt Write_html_selected(Xoa_url_arg_mgr arg_mgr, String selected, GfoInvkAble select_invkable) { String[] wikis = String_.Split(selected, ";"); @@ -197,7 +197,7 @@ class Xosp_fbrow_cmd__wiki_add extends Xosp_fbrow_cmd__base { ( "~{domain} Main Page" ) , "domain"); - private static final byte[] Ext_sqlite3_000 = Bry_.new_ascii_(".000.sqlite3"); + private static final byte[] Ext_xowa = Bry_.new_ascii_(".xowa"); public static final byte[] Regy_key = Bry_.new_ascii_("xowa.wiki.add"); public static final Xosp_fbrow_cmd__wiki_add I = new Xosp_fbrow_cmd__wiki_add(); } diff --git a/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_special_tst.java b/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_special_tst.java index 720f0eeaf..6e3eb27cb 100644 --- a/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_special_tst.java +++ b/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_special_tst.java @@ -77,8 +77,8 @@ public class Xosp_fbrow_special_tst { , "
    " , " " , " " - , " " - , " " + , " " + , " " , " " , " " , " " @@ -128,7 +128,7 @@ class Xosp_fbrow_special_fxt { ) , bldr.Fil("1.txt", 1, "2001-01-01") , bldr.Fil("2.txt", 2, "2004-01-02") - , bldr.Fil("3.000.sqlite3", 3, "2004-01-03") + , bldr.Fil("3.xowa", 3, "2004-01-03") ); } public void Init_dir(IoItmDir dir) { diff --git a/400_xowa/src/gplx/xowa/specials/xowa/popup_history/Popup_history_page.java b/400_xowa/src/gplx/xowa/specials/xowa/popup_history/Popup_history_page.java index a47514f2e..427aa860a 100644 --- a/400_xowa/src/gplx/xowa/specials/xowa/popup_history/Popup_history_page.java +++ b/400_xowa/src/gplx/xowa/specials/xowa/popup_history/Popup_history_page.java @@ -28,7 +28,7 @@ public class Popup_history_page implements Xows_page { if (Ttl_chk(itm.Page_ttl())) continue; fmtr_main.Bld_bfr_many(bfr, itm.Page_href(), itm.Page_ttl().Full_txt()); } - page.Data_raw_(bfr.Trim_end(Byte_ascii.NewLine).Mkr_rls().Xto_bry_and_clear()); + page.Data_raw_(bfr.Trim_end(Byte_ascii.NewLine).To_bry_and_rls()); page.Html_data().Html_restricted_n_(); } private Bry_fmtr fmtr_main = Bry_fmtr.new_("~{ttl}\n\n", "href", "ttl"); // NOTE: need to use anchor (as opposed to lnki or lnke) b/c xwiki will not work on all wikis diff --git a/400_xowa/src/gplx/xowa/specials/xowa/system_data/System_data_page.java b/400_xowa/src/gplx/xowa/specials/xowa/system_data/System_data_page.java index 9993522fe..18cddde86 100644 --- a/400_xowa/src/gplx/xowa/specials/xowa/system_data/System_data_page.java +++ b/400_xowa/src/gplx/xowa/specials/xowa/system_data/System_data_page.java @@ -28,7 +28,7 @@ public class System_data_page implements Xows_page { byte[] file_txt = Io_mgr._.LoadFilBry(file_url); file_txt = gplx.html.Html_utl.Escape_html_as_bry(file_txt, true, false, false, false, false); // escape < or "" in messages will cause pre to break fmtr_all.Bld_bfr_many(tmp_bfr, file_url.Raw(), file_txt); - page.Data_raw_(tmp_bfr.Mkr_rls().Xto_bry_and_clear()); + page.Data_raw_(tmp_bfr.To_bry_and_rls()); } private static Io_url Path_from_type(Xowe_wiki wiki, byte type) { Xoae_app app = wiki.Appe(); diff --git a/400_xowa/src/gplx/xowa/tdbs/Xotdb_dir_info.java b/400_xowa/src/gplx/xowa/tdbs/Xotdb_dir_info.java index d9f6333a3..6089914d6 100644 --- a/400_xowa/src/gplx/xowa/tdbs/Xotdb_dir_info.java +++ b/400_xowa/src/gplx/xowa/tdbs/Xotdb_dir_info.java @@ -30,13 +30,13 @@ public class Xotdb_dir_info { ext_bry = Wtr_ext(v); ext_str = String_.new_ascii_(ext_bry); return this; - } byte ext_tid = gplx.ios.Io_stream_.Tid_file; + } byte ext_tid = gplx.ios.Io_stream_.Tid_raw; public static final String Wtr_xdat_str = ".xdat", Wtr_zip_str = ".zip", Wtr_gz_str = ".gz", Wtr_bz2_str = ".bz2"; public static final byte[] Wtr_xdat_bry = Bry_.new_ascii_(Wtr_xdat_str), Wtr_zip_bry = Bry_.new_ascii_(Wtr_zip_str), Wtr_gz_bry = Bry_.new_ascii_(Wtr_gz_str), Wtr_bz2_bry = Bry_.new_ascii_(Wtr_bz2_str); public static String Wtr_dir(byte v) { switch (v) { - case gplx.ios.Io_stream_.Tid_file : return ""; + case gplx.ios.Io_stream_.Tid_raw : return ""; case gplx.ios.Io_stream_.Tid_zip : return "_zip"; case gplx.ios.Io_stream_.Tid_gzip : return "_gz"; case gplx.ios.Io_stream_.Tid_bzip2 : return "_bz2"; @@ -45,7 +45,7 @@ public class Xotdb_dir_info { } public static byte[] Wtr_ext(byte v) { switch (v) { - case gplx.ios.Io_stream_.Tid_file : return Wtr_xdat_bry; + case gplx.ios.Io_stream_.Tid_raw : return Wtr_xdat_bry; case gplx.ios.Io_stream_.Tid_zip : return Wtr_zip_bry; case gplx.ios.Io_stream_.Tid_gzip : return Wtr_gz_bry; case gplx.ios.Io_stream_.Tid_bzip2 : return Wtr_bz2_bry; diff --git a/400_xowa/src/gplx/xowa/tdbs/Xotdb_dir_info_.java b/400_xowa/src/gplx/xowa/tdbs/Xotdb_dir_info_.java index dab13d5b8..1d365ae79 100644 --- a/400_xowa/src/gplx/xowa/tdbs/Xotdb_dir_info_.java +++ b/400_xowa/src/gplx/xowa/tdbs/Xotdb_dir_info_.java @@ -19,14 +19,14 @@ package gplx.xowa.tdbs; import gplx.*; import gplx.xowa.*; public class Xotdb_dir_info_ { public static String Tid_name(byte tid) { switch (tid) { - case Xotdb_dir_info_.Tid_page: return Xotdb_dir_info_.Name_page; + case Xotdb_dir_info_.Tid_page: return Xotdb_dir_info_.Name_page; case Xotdb_dir_info_.Tid_ttl: return Xotdb_dir_info_.Name_title; case Xotdb_dir_info_.Tid_id: return Xotdb_dir_info_.Name_id; - case Xotdb_dir_info_.Tid_category: return Xotdb_dir_info_.Name_category; + case Xotdb_dir_info_.Tid_category: return Xotdb_dir_info_.Name_category; case Xotdb_dir_info_.Tid_category2_link: return Xotdb_dir_info_.Name_category2_link; case Xotdb_dir_info_.Tid_category2_main: return Xotdb_dir_info_.Name_category2_main; case Xotdb_dir_info_.Tid_search_ttl: return Xotdb_dir_info_.Name_search_ttl; - default: throw Err_.unhandled(tid); + default: throw Err_.unhandled(tid); } } public static Xotdb_dir_info[] regy_() { @@ -38,6 +38,9 @@ public class Xotdb_dir_info_ { regy_itm_(rv, Bool_.N, Tid_search_ttl); return rv; } + public static boolean Dir_name_is_tdb(String dir_name) { + return String_.In(dir_name, Name_ns, Name_site, Name_cfg, "tmp"); + } private static void regy_itm_(Xotdb_dir_info[] rv, boolean ns_root, byte id) {rv[id] = new Xotdb_dir_info(ns_root, id, Tid_name(id));} public static final String Ext_xdat = ".xdat", Ext_csv = ".csv", Ext_zip = ".zip" , Name_ns = "ns", Name_site = "site", Name_page = "page", Name_title = "title", Name_id = "id", Name_category = "category", Name_search_ttl = "search_title", Name_zip_suffix = "_zip" diff --git a/400_xowa/src/gplx/xowa/tdbs/Xotdb_fsys_mgr.java b/400_xowa/src/gplx/xowa/tdbs/Xotdb_fsys_mgr.java index 4468bbb1b..90dcc74ea 100644 --- a/400_xowa/src/gplx/xowa/tdbs/Xotdb_fsys_mgr.java +++ b/400_xowa/src/gplx/xowa/tdbs/Xotdb_fsys_mgr.java @@ -35,7 +35,7 @@ public class Xotdb_fsys_mgr { public Io_url Url_ns_fil(byte tid, int ns_id, int fil_idx) { Xotdb_dir_info dir_info = dir_regy[tid]; String dir_name = dir_info.Name() + Xotdb_dir_info.Wtr_dir(dir_info.Ext_tid()); - return Xotdb_fsys_mgr.Url_fil(ns_dir.GenSubDir_nest(Int_.Xto_str_pad_bgn(ns_id, 3), dir_name), fil_idx, dir_regy[tid].Ext_bry()); + return Xotdb_fsys_mgr.Url_fil(ns_dir.GenSubDir_nest(Int_.Xto_str_pad_bgn_zero(ns_id, 3), dir_name), fil_idx, dir_regy[tid].Ext_bry()); } public Io_url Url_site_fil(byte tid, int fil_idx) {return Xotdb_fsys_mgr.Url_fil(Url_site_dir(tid), fil_idx, Xotdb_dir_info_.Bry_xdat);} public Io_url Url_site_reg(byte tid) {return Url_site_dir(tid).GenSubFil(Xotdb_dir_info_.Name_reg_fil);} @@ -53,11 +53,11 @@ public class Xotdb_fsys_mgr { private static void Scan_dirs_zip(Xotdb_fsys_mgr fsys_mgr, byte id) { Io_url[] dirs = Io_mgr._.QueryDir_args(fsys_mgr.Ns_dir().GenSubDir_nest("000")).FilPath_("*page*").DirOnly_().Recur_(false).ExecAsUrlAry(); int len = dirs.length; - byte tid = gplx.ios.Io_stream_.Tid_file; // needed for Xoa_xowa_exec_tst + byte tid = gplx.ios.Io_stream_.Tid_raw; // needed for Xoa_xowa_exec_tst for (int i = 0; i < len; i++) { Io_url dir = dirs[i]; String dir_name = dir.NameOnly(); - if (String_.Eq(dir_name, "page")) {tid = gplx.ios.Io_stream_.Tid_file; break;} + if (String_.Eq(dir_name, "page")) {tid = gplx.ios.Io_stream_.Tid_raw; break;} else if (String_.Eq(dir_name, "page_zip")) tid = gplx.ios.Io_stream_.Tid_zip; else if (String_.Eq(dir_name, "page_gz")) tid = gplx.ios.Io_stream_.Tid_gzip; else if (String_.Eq(dir_name, "page_bz2")) tid = gplx.ios.Io_stream_.Tid_bzip2; diff --git a/400_xowa/src/gplx/xowa/tdbs/Xotdb_fsys_mgr_tst.java b/400_xowa/src/gplx/xowa/tdbs/Xotdb_fsys_mgr_tst.java index 241d51582..82c6f4529 100644 --- a/400_xowa/src/gplx/xowa/tdbs/Xotdb_fsys_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/tdbs/Xotdb_fsys_mgr_tst.java @@ -30,7 +30,7 @@ class Xow_fsys_mgr_fxt { wiki = Xoa_app_fxt.wiki_tst_(app); } Xoae_app app; Xowe_wiki wiki; - public Xow_fsys_mgr_fxt Zip_(byte tid, boolean v) {wiki.Tdb_fsys_mgr().Tdb_dir_regy()[tid].Ext_tid_(v ? gplx.ios.Io_stream_.Tid_zip : gplx.ios.Io_stream_.Tid_file); return this;} + public Xow_fsys_mgr_fxt Zip_(byte tid, boolean v) {wiki.Tdb_fsys_mgr().Tdb_dir_regy()[tid].Ext_tid_(v ? gplx.ios.Io_stream_.Tid_zip : gplx.ios.Io_stream_.Tid_raw); return this;} public void Url_ns_fil(byte tid, int ns_id, int fil_idx, String expd) { Tfds.Eq(expd, wiki.Tdb_fsys_mgr().Url_ns_fil(tid, ns_id, fil_idx).Raw()); } diff --git a/400_xowa/src_121_wiki_data/gplx/xowa/Xodb_page_.java b/400_xowa/src/gplx/xowa/tdbs/Xotdb_page_itm_.java similarity index 77% rename from 400_xowa/src_121_wiki_data/gplx/xowa/Xodb_page_.java rename to 400_xowa/src/gplx/xowa/tdbs/Xotdb_page_itm_.java index c9a1fb562..fecb2ad6c 100644 --- a/400_xowa/src_121_wiki_data/gplx/xowa/Xodb_page_.java +++ b/400_xowa/src/gplx/xowa/tdbs/Xotdb_page_itm_.java @@ -15,19 +15,19 @@ 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 . */ -package gplx.xowa; import gplx.*; -import gplx.core.brys.*; -public class Xodb_page_ { +package gplx.xowa.tdbs; import gplx.*; import gplx.xowa.*; +import gplx.core.brys.*; import gplx.xowa.wikis.data.tbls.*; +public class Xotdb_page_itm_ { static final int Txt_len_id = 5, Txt_len_fil_idx = 5, Txt_len_row_idx = 5, Txt_len_type = 1, Txt_len_text_len = 5; public static final int Txt_ttl_pos = Txt_len_id + Txt_len_fil_idx + Txt_len_row_idx + Txt_len_type + Txt_len_text_len + 5; public static final int Txt_ttl_len__fixed = Txt_len_id + Txt_len_fil_idx + Txt_len_row_idx + Txt_len_type + Txt_len_text_len + 5 + 1; // 5=| 1=\n - public static Xodb_page Txt_ttl_load(byte[] bry) { - Xodb_page rv = new Xodb_page(); + public static Xowd_page_itm Txt_ttl_load(byte[] bry) { + Xowd_page_itm rv = new Xowd_page_itm(); Txt_ttl_load(rv, bry, 0, bry.length); return rv; } - public static void Txt_ttl_load(Xodb_page page, byte[] bry) {Txt_ttl_load(page, bry, 0, bry.length);} - private static void Txt_ttl_load(Xodb_page page, byte[] bry, int bgn, int end) { + public static void Txt_ttl_load(Xowd_page_itm page, byte[] bry) {Txt_ttl_load(page, bry, 0, bry.length);} + private static void Txt_ttl_load(Xowd_page_itm page, byte[] bry, int bgn, int end) { try { page.Init_by_tdb ( Base85_utl.XtoIntByAry (bry, bgn + 0, bgn + 4) @@ -40,7 +40,7 @@ public class Xodb_page_ { ); } catch (Exception e) {throw Err_.err_(e, "parse_by_ttl failed: {0}", String_.new_utf8_(bry, bgn, end));} } - public static void Txt_ttl_save(Bry_bfr bfr, Xodb_page page) {Txt_ttl_save(bfr, page.Id(), page.Wtxt_db_id(), page.Tdb_row_idx(), page.Redirected(), page.Wtxt_len(), page.Ttl_page_db());} + public static void Txt_ttl_save(Bry_bfr bfr, Xowd_page_itm page) {Txt_ttl_save(bfr, page.Id(), page.Text_db_id(), page.Tdb_row_idx(), page.Redirected(), page.Text_len(), page.Ttl_page_db());} public static void Txt_ttl_save(Bry_bfr bfr, int id, int file_idx, int row_idx, boolean redirect, int text_len, byte[] ttl_wo_ns) { bfr .Add_base85_len_5(id) .Add_byte_pipe() .Add_base85_len_5(file_idx) .Add_byte_pipe() @@ -50,8 +50,8 @@ public class Xodb_page_ { .Add(ttl_wo_ns) .Add_byte_nl() ; } - public static void Txt_id_load(Xodb_page page, byte[] bry) {Txt_id_load(page, bry, 0, bry.length);} - private static void Txt_id_load(Xodb_page page, byte[] bry, int bgn, int end) { + public static void Txt_id_load(Xowd_page_itm page, byte[] bry) {Txt_id_load(page, bry, 0, bry.length);} + private static void Txt_id_load(Xowd_page_itm page, byte[] bry, int bgn, int end) { try { page.Clear(); page.Init_by_tdb @@ -65,12 +65,12 @@ public class Xodb_page_ { ); } catch (Exception e) {throw Err_.err_(e, "parse_by_id failed: {0}", String_.new_utf8_(bry, bgn, end));} } - public static void Txt_id_save(Bry_bfr bfr, Xodb_page page) { + public static void Txt_id_save(Bry_bfr bfr, Xowd_page_itm page) { bfr .Add_base85_len_5(page.Id()) .Add_byte_pipe() - .Add_base85_len_5(page.Wtxt_db_id()) .Add_byte_pipe() + .Add_base85_len_5(page.Text_db_id()) .Add_byte_pipe() .Add_base85_len_5(page.Tdb_row_idx()) .Add_byte_pipe() .Add_byte(page.Redirected() ? Byte_ascii.Num_1 : Byte_ascii.Num_0).Add_byte_pipe() - .Add_base85_len_5(page.Wtxt_len()) .Add_byte_pipe() + .Add_base85_len_5(page.Text_len()) .Add_byte_pipe() .Add_base85_len_5(page.Ns_id()) .Add_byte_pipe() .Add(page.Ttl_page_db()) .Add_byte_nl(); } diff --git a/400_xowa/src_200_bldr/gplx/xowa/Xodb_page_raw_parser.java b/400_xowa/src/gplx/xowa/tdbs/Xotdb_page_raw_parser.java similarity index 89% rename from 400_xowa/src_200_bldr/gplx/xowa/Xodb_page_raw_parser.java rename to 400_xowa/src/gplx/xowa/tdbs/Xotdb_page_raw_parser.java index 224755fa1..21794172a 100644 --- a/400_xowa/src_200_bldr/gplx/xowa/Xodb_page_raw_parser.java +++ b/400_xowa/src/gplx/xowa/tdbs/Xotdb_page_raw_parser.java @@ -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 . */ -package gplx.xowa; import gplx.*; -import gplx.core.brys.*; import gplx.ios.*; -public class Xodb_page_raw_parser { +package gplx.xowa.tdbs; import gplx.*; import gplx.xowa.*; +import gplx.core.brys.*; import gplx.ios.*; import gplx.xowa.wikis.data.tbls.*; +public class Xotdb_page_raw_parser { public void Init(Gfo_usr_dlg usr_dlg, Xowe_wiki wiki, int load_len) { this.wiki = wiki; ns_mgr = wiki.Ns_mgr(); rdr = new Io_line_rdr(usr_dlg, new Io_url[1]); @@ -38,7 +38,7 @@ public class Xodb_page_raw_parser { // rdr.Move(pos + 1); rdr.Truncate(pos + 1); } - public boolean Read(Xodb_page page) { + public boolean Read(Xowd_page_itm page) { boolean read = false; read = rdr.Read_next(); if (!read) return false; int id = Base85_utl.XtoIntByAry(rdr.Bfr(), rdr.Key_pos_bgn(), rdr.Key_pos_end() - 2); @@ -51,7 +51,7 @@ public class Xodb_page_raw_parser { page.Ttl_(ttl, ns_mgr); read = rdr.Read_next(); if (!read) throw Err_.new_("could not read text"); byte[] text = Bry_.Mid(rdr.Bfr(), rdr.Key_pos_bgn(), rdr.Key_pos_end() - 1); - page.Wtxt_(text); + page.Text_(text); rdr.Bfr_last_read_add(1); return true; } diff --git a/400_xowa/src/gplx/xowa/users/Xou_user.java b/400_xowa/src/gplx/xowa/users/Xou_user.java index cf3b72046..b97a19f98 100644 --- a/400_xowa/src/gplx/xowa/users/Xou_user.java +++ b/400_xowa/src/gplx/xowa/users/Xou_user.java @@ -16,8 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.users; import gplx.*; import gplx.xowa.*; -import gplx.xowa.wikis.*; import gplx.xowa.wikis.xwikis.*; import gplx.xowa.users.history.*; import gplx.xowa.xtns.scribunto.*; -import gplx.xowa.users.data.*; +import gplx.xowa.wikis.*; import gplx.xowa.wikis.xwikis.*; import gplx.xowa.users.history.*; import gplx.xowa.xtns.scribunto.*; import gplx.xowa.users.data.*; public class Xou_user implements GfoEvMgrOwner, GfoInvkAble { public Xou_user(Xoae_app app, Io_url user_dir) { this.evMgr = GfoEvMgr.new_(this); @@ -33,7 +32,7 @@ public class Xou_user implements GfoEvMgrOwner, GfoInvkAble { public byte[] Key_bry() {return key_bry;} private byte[] key_bry; public void Key_str_(String v) {this.key_str = v; this.key_bry = Bry_.new_utf8_(v);} public GfoEvMgr EvMgr() {return evMgr;} private final GfoEvMgr evMgr; - public Xoud_data_mgr Data_mgr() {return data_mgr;} private Xoud_data_mgr data_mgr = new Xoud_data_mgr(); + public Xoud_db_mgr Data_mgr() {return data_mgr;} private Xoud_db_mgr data_mgr = new Xoud_db_mgr(); public Xol_lang Lang() {if (lang == null) {lang = app.Lang_mgr().Get_by_key_or_new(app.Sys_cfg().Lang()); lang.Init_by_load();} return lang;} private Xol_lang lang; public void Lang_(Xol_lang v) { lang = v; @@ -70,7 +69,7 @@ public class Xou_user implements GfoEvMgrOwner, GfoInvkAble { public void Bookmarks_add(byte[] wiki_domain, byte[] ttl_full_txt) { Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_k004(); bookmarks_add_fmtr.Bld_bfr_many(tmp_bfr, wiki_domain, ttl_full_txt); - byte[] new_entry = tmp_bfr.Mkr_rls().Xto_bry_and_clear(); + byte[] new_entry = tmp_bfr.To_bry_and_rls(); Xoa_ttl bookmarks_ttl = Xoa_ttl.parse_(wiki, Bry_data_bookmarks); Xoae_page bookmarks_page = wiki.Data_mgr().Get_page(bookmarks_ttl, false); byte[] new_data = Bry_.Add(bookmarks_page.Data_raw(), new_entry); @@ -106,7 +105,7 @@ public class Xou_user implements GfoEvMgrOwner, GfoInvkAble { for (int i = 0; i < dirs_len; i++) { Io_url dir = dirs[i]; String name = dir.NameOnly(); - if (String_.Eq(name, gplx.xowa.bldrs.imports.Xobc_core_batch.Dir_dump) + if (String_.Eq(name, gplx.xowa.bldrs.cmds.utils.Xob_core_batch_utl.Dir_dump) // || !Io_mgr._.ExistsDir(dir.GenSubFil_nest("ns")) ) continue; byte[] dir_name_as_bry = Bry_.new_utf8_(name); diff --git a/400_xowa/src/gplx/xowa/users/data/Xou_db_file.java b/400_xowa/src/gplx/xowa/users/data/Xou_db_file.java new file mode 100644 index 000000000..acd93a23e --- /dev/null +++ b/400_xowa/src/gplx/xowa/users/data/Xou_db_file.java @@ -0,0 +1,33 @@ +/* +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 . +*/ +package gplx.xowa.users.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*; +import gplx.dbs.*; import gplx.dbs.cfgs.*; import gplx.xowa.files.caches.*; +class Xou_db_file { + public Xou_db_file(Db_conn conn) { + this.tbl__cfg = new Db_cfg_tbl(conn, "xowa_cfg"); + this.tbl__site = new Xoud_site_tbl(conn); + this.tbl__history = new Xoud_history_tbl(conn); + this.tbl__cache = new Xof_cache_tbl(conn); + this.tbl__bmk = new Xoud_bmk_tbl(conn); + } + public Db_cfg_tbl Tbl__cfg() {return tbl__cfg;} private final Db_cfg_tbl tbl__cfg; + public Xoud_site_tbl Tbl__site() {return tbl__site;} private final Xoud_site_tbl tbl__site; + public Xoud_history_tbl Tbl__history() {return tbl__history;} private final Xoud_history_tbl tbl__history; + public Xof_cache_tbl Tbl__cache() {return tbl__cache;} private final Xof_cache_tbl tbl__cache; + public Xoud_bmk_tbl Tbl__bmk() {return tbl__bmk;} private final Xoud_bmk_tbl tbl__bmk; +} \ No newline at end of file diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_bmk_row.java b/400_xowa/src/gplx/xowa/users/data/Xoud_bmk_row.java index f5fc02e10..14ae1691b 100644 --- a/400_xowa/src/gplx/xowa/users/data/Xoud_bmk_row.java +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_bmk_row.java @@ -17,15 +17,19 @@ along with this program. If not, see . */ package gplx.xowa.users.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*; public class Xoud_bmk_row { - public Xoud_bmk_row(int bmk_id, int bmk_sort, String bmk_wiki, String bmk_page, String bmk_qarg, String bmk_wtxt, DateAdp bmk_time, int bmk_count) { - this.bmk_id = bmk_id; this.bmk_sort = bmk_sort; this.bmk_wiki = bmk_wiki; this.bmk_page = bmk_page; this.bmk_qarg = bmk_qarg; this.bmk_wtxt = bmk_wtxt; this.bmk_time = bmk_time; this.bmk_count = bmk_count; + public Xoud_bmk_row(int id, String wiki, String page, String qarg, String name, String comment, String tag, int sort, int count, DateAdp time) { + this.id = id; this.wiki = wiki; this.page = page; this.qarg = qarg; + this.name = name; this.comment = comment; this.tag = tag; + this.sort = sort; this.count = count; this.time = time; } - public int Bmk_id() {return bmk_id;} private final int bmk_id; - public int Bmk_sort() {return bmk_sort;} private final int bmk_sort; - public String Bmk_wiki() {return bmk_wiki;} private final String bmk_wiki; - public String Bmk_page() {return bmk_page;} private final String bmk_page; - public String Bmk_qarg() {return bmk_qarg;} private final String bmk_qarg; - public String Bmk_wtxt() {return bmk_wtxt;} private final String bmk_wtxt; - public DateAdp Bmk_time() {return bmk_time;} private final DateAdp bmk_time; - public int Bmk_count() {return bmk_count;} private final int bmk_count; + public int Id() {return id;} private final int id; + public String Wiki() {return wiki;} private final String wiki; + public String Page() {return page;} private final String page; + public String Qarg() {return qarg;} private final String qarg; + public String Name() {return name;} private final String name; + public String Comment() {return comment;} private final String comment; + public String Tag() {return tag;} private final String tag; + public int Sort() {return sort;} private final int sort; + public int Count() {return count;} private final int count; + public DateAdp Time() {return time;} private final DateAdp time; } diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_bmk_tbl.java b/400_xowa/src/gplx/xowa/users/data/Xoud_bmk_tbl.java index ac81c4ed3..101da419a 100644 --- a/400_xowa/src/gplx/xowa/users/data/Xoud_bmk_tbl.java +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_bmk_tbl.java @@ -17,64 +17,56 @@ along with this program. If not, see . */ package gplx.xowa.users.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*; import gplx.dbs.*; import gplx.dbs.qrys.*; -public class Xoud_bmk_tbl { - private Db_stmt stmt_select, stmt_insert, stmt_delete; - public Db_conn Conn() {return conn;} public Xoud_bmk_tbl Conn_(Db_conn v) {this.Rls_all(); conn = v; return this;} private Db_conn conn; - @gplx.Virtual public void Insert(int sort, String wiki, String page, String qarg, String wtxt, DateAdp time, int count) { - if (stmt_insert == null) stmt_insert = Db_stmt_.new_insert_(conn, Tbl_name, Flds__all); +public class Xoud_bmk_tbl implements RlsAble { + private final String tbl_name = "user_bmk"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private final String fld_id, fld_wiki, fld_page, fld_qarg, fld_name, fld_comment, fld_tag, fld_sort, fld_time, fld_count; + public Xoud_bmk_tbl(Db_conn conn) { + this.conn = conn; + fld_id = flds.Add_int_pkey_autonum("bmk_id"); + fld_wiki = flds.Add_str("bmk_wiki", 255); + fld_page = flds.Add_str("bmk_page", 255); + fld_qarg = flds.Add_str("bmk_qarg", 255); + fld_name = flds.Add_str("bmk_name", 255); + fld_comment = flds.Add_str("bmk_comment", 2048); + fld_tag = flds.Add_str("bmk_tag", 2048); + fld_sort = flds.Add_int("bmk_sort"); + fld_count = flds.Add_int("bmk_count"); + fld_time = flds.Add_str("bmk_time", 20); + conn.Rls_reg(this); + } + public Db_conn Conn() {return conn;} private final Db_conn conn; + public void Insert(String wiki, String page, String qarg, String name, String comment, String tag, int sort, DateAdp time, int count) { + Db_stmt stmt_insert = conn.Stmt_insert(tbl_name, flds); + stmt_insert.Clear().Val_str(fld_wiki, wiki).Val_str(fld_page, page).Val_str(fld_qarg, qarg) + .Val_str(fld_name, name).Val_str(fld_comment, comment).Val_str(fld_tag, tag) + .Val_int(fld_sort, sort).Val_int(fld_count, count).Val_str(fld_time, time.XtoStr_fmt_iso_8561()) + .Exec_insert(); + } + public void Delete(int id) { + Db_stmt stmt_delete = conn.Stmt_delete(tbl_name, fld_id); + stmt_delete.Clear().Crt_int(fld_id, id).Exec_delete(); + } + public void Select_all(ListAdp rv) { + Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empy).Clear().Exec_select__rls_auto(); try { - stmt_insert.Clear().Val_int(sort).Val_str(wiki).Val_str(page).Val_str(qarg).Val_str(wtxt).Val_str(time.XtoStr_fmt_iso_8561()).Val_int(count).Exec_insert(); + while (rdr.Move_next()) + rv.Add(new_row(rdr)); } - catch (Exception exc) {stmt_insert = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail + finally {rdr.Rls();} } - @gplx.Virtual public void Delete(int id) { - if (stmt_delete == null) stmt_delete = Db_stmt_.new_delete_(conn, Tbl_name, Fld_bmk_id); - try {stmt_delete.Clear().Val_int(id).Exec_delete();} - catch (Exception exc) {stmt_delete = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail - } - @gplx.Virtual public void Select_all(ListAdp rv) { - if (stmt_select == null) stmt_select = Db_stmt_.new_select_as_rdr(conn, Db_qry__select_in_tbl.new_(Tbl_name, null, Flds__all, Db_qry__select_in_tbl.Order_by_null)); - try { - Db_rdr rdr = stmt_select.Clear().Exec_select_as_rdr(); - while (rdr.Move_next()) { - Xoud_bmk_row row = Make_row(rdr); - rv.Add(row); - } - rdr.Rls(); - } - catch (Exception exc) {stmt_select = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail - } - private Xoud_bmk_row Make_row(Db_rdr rdr) { + private Xoud_bmk_row new_row(Db_rdr rdr) { return new Xoud_bmk_row - ( rdr.Read_int(0) - , rdr.Read_int(1) - , rdr.Read_str(2) - , rdr.Read_str(3) - , rdr.Read_str(4) - , rdr.Read_str(5) - , rdr.Read_date_by_str(6) - , rdr.Read_int(7) + ( rdr.Read_int(fld_id) + , rdr.Read_str(fld_wiki) + , rdr.Read_str(fld_page) + , rdr.Read_str(fld_qarg) + , rdr.Read_str(fld_name) + , rdr.Read_str(fld_comment) + , rdr.Read_str(fld_tag) + , rdr.Read_int(fld_sort) + , rdr.Read_int(fld_count) + , rdr.Read_date_by_str(fld_time) ); } - public void Rls_all() { - if (stmt_select != null) {stmt_select.Rls(); stmt_select = null;} - if (stmt_insert != null) {stmt_insert.Rls(); stmt_insert = null;} - if (stmt_delete != null) {stmt_delete.Rls(); stmt_delete = null;} - conn = null; - } - public static final String Tbl_name = "cfg_bmk", Fld_bmk_id = "bmk_id", Fld_bmk_count = "bmk_count", Fld_bmk_sort = "bmk_sort" - , Fld_bmk_time = "bmk_time", Fld_bmk_wiki = "bmk_wiki", Fld_bmk_page = "bmk_page", Fld_bmk_qarg = "bmk_qarg", Fld_bmk_wtxt = "bmk_wtxt"; - public static final String[] Flds__all = new String[] {Fld_bmk_id, Fld_bmk_sort, Fld_bmk_wiki, Fld_bmk_page, Fld_bmk_qarg, Fld_bmk_wtxt, Fld_bmk_time, Fld_bmk_count}; - public static final String Tbl_sql = String_.Concat_lines_nl - ( "CREATE TABLE cfg_bmk" - , "( bmk_id integer NOT NULL PRIMARY KEY AUTOINCREMENT" - , ", bmk_sort integer NOT NULL" - , ", bmk_wiki nvarchar(255) NOT NULL" - , ", bmk_page nvarchar(255) NOT NULL" - , ", bmk_qarg nvarchar(255) NOT NULL" - , ", bmk_wtxt nvarchar(255) NOT NULL" - , ", bmk_time nvarchar(20) NOT NULL" - , ", bmk_count integer NOT NULL" - , ");" - ); + public void Rls() {} } diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_cfg_mgr.java b/400_xowa/src/gplx/xowa/users/data/Xoud_cfg_mgr.java index 691d06acd..72ac63929 100644 --- a/400_xowa/src/gplx/xowa/users/data/Xoud_cfg_mgr.java +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_cfg_mgr.java @@ -18,8 +18,11 @@ along with this program. If not, see . package gplx.xowa.users.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*; import gplx.dbs.*; import gplx.dbs.cfgs.*; public class Xoud_cfg_mgr { - private final Xoud_cfg_tbl tbl = new Xoud_cfg_tbl(); - public void Conn_(Db_conn new_conn, boolean created, int user_id) {tbl.Conn_(new_conn, created, user_id);} + private Db_cfg_tbl tbl; + public void Conn_(Db_conn new_conn, boolean created, int user_id) { + tbl = new Db_cfg_tbl(new_conn, "user_opt"); + if (created) tbl.Create_tbl(); + } public int Select_int_or(String grp, String key, int or) { String rv = Select_str_or(grp, key, null); return rv == null ? or : Int_.parse_or_(rv, or); @@ -30,12 +33,12 @@ public class Xoud_cfg_mgr { return rv == null ? or : Bry_.new_utf8_(rv); } public String Select_str_or(String grp, String key, String or) { - String rv = tbl.Select_as_str_or(grp, key, null); + String rv = tbl.Select_str_or(grp, key, null); return rv == null ? or : rv; } public byte[] Assert_bry_or(String key, byte[] or) {return Assert_bry_or("", key, or);} public byte[] Assert_bry_or(String grp, String key, byte[] or) { - String rv = tbl.Select_as_str_or(grp, key, null); + String rv = tbl.Select_str_or(grp, key, null); if (rv == null) { Insert_bry(grp, key, or); return or; @@ -44,18 +47,18 @@ public class Xoud_cfg_mgr { return Bry_.new_utf8_(rv); } public void Update_bry(String key, byte[] val) {Update_bry("", key, val);} - public void Update_bry(String grp, String key, byte[] val) {tbl.Update(grp, key, String_.new_utf8_(val));} + public void Update_bry(String grp, String key, byte[] val) {tbl.Update_bry(grp, key, val);} public void Insert_bry(String key, byte[] val) {Insert_bry("", key, val);} - public void Insert_bry(String grp, String key, byte[] val) {tbl.Insert(grp, key, String_.new_utf8_(val));} - public void Insert_int(String grp, String key, int val) {tbl.Insert(grp, key, Int_.Xto_str(val));} + public void Insert_bry(String grp, String key, byte[] val) {tbl.Insert_bry(grp, key, val);} + public void Insert_int(String grp, String key, int val) {tbl.Insert_int(grp, key, val);} public int Next_id(String tbl_name) { String grp = "xowa." + tbl_name, key = "next_id"; - int next_id = tbl.Select_as_int_or(grp, key, 1); // EX: xowa.cfg_history|next_id|1 - String new_val = Int_.Xto_str(next_id + 1); + int next_id = tbl.Select_int_or(grp, key, 1); // EX: xowa.cfg_history|next_id|1 + int new_val = next_id + 1; if (next_id == 1) - tbl.Insert(grp, key, new_val); + tbl.Insert_int(grp, key, new_val); else - tbl.Update(grp, key, new_val); + tbl.Update_int(grp, key, new_val); return next_id; } } diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_cfg_tbl.java b/400_xowa/src/gplx/xowa/users/data/Xoud_cfg_tbl.java deleted file mode 100644 index bd0313286..000000000 --- a/400_xowa/src/gplx/xowa/users/data/Xoud_cfg_tbl.java +++ /dev/null @@ -1,80 +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 . -*/ -package gplx.xowa.users.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*; -import gplx.dbs.*; -public class Xoud_cfg_tbl { - private String tbl_name = "user_cfg"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); - private String fld_usr, fld_grp, fld_key, fld_val; - private Db_conn conn; private Db_stmt stmt_insert, stmt_update, stmt_select; - private int usr; - public void Conn_(Db_conn new_conn, boolean created, int usr) { - this.conn = new_conn; flds.Clear(); - fld_usr = flds.Add_int("usr"); - fld_grp = flds.Add_str("grp", 255); - fld_key = flds.Add_str("key", 255); - fld_val = flds.Add_str("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_usr, fld_grp, fld_key, fld_val) - ); - conn.Exec_create_tbl_and_idx(meta); - } - stmt_insert = stmt_update = stmt_select = null; - this.usr = usr; - } - public void Insert(String grp, String key, String val) { - if (stmt_insert == null) stmt_insert = conn.Rls_reg(conn.Stmt_insert(tbl_name, flds)); - stmt_insert.Clear().Val_int(fld_usr, usr).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_usr, fld_grp, fld_key)); - stmt_update.Clear().Val_str(fld_val, val).Crt_int(fld_usr, usr).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: usr={0} grp={1} key={2}", usr, grp, key); - return rv; - } - 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_usr, fld_grp, fld_key)); - Db_rdr rdr = Db_rdr_.Null; - try { - rdr = stmt_select.Clear() - .Crt_int(fld_usr, usr) - .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 Xoud_cfg_grp Select_as_grp(String grp) { -// Xoud_cfg_grp rv = null; -// Db_stmt stmt = conn.Stmt_select(tbl_name, flds, fld_grp); -// Db_rdr rdr = Db_rdr_.Null; -// try { -// rdr = stmt.Clear().Crt_str(fld_grp, grp).Exec_select_as_rdr(); -// while (rdr.Move_next()) { -// if (rv == null) rv = new Xoud_cfg_grp(grp); -// rv.Upsert(rdr.Read_str(fld_key), rdr.Read_str(fld_val)); -// } -// } -// finally {rdr.Rls();} -// return rv == null ? Xoud_cfg_grp.Null : rv; -// } -} diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_data_mgr.java b/400_xowa/src/gplx/xowa/users/data/Xoud_db_mgr.java similarity index 92% rename from 400_xowa/src/gplx/xowa/users/data/Xoud_data_mgr.java rename to 400_xowa/src/gplx/xowa/users/data/Xoud_db_mgr.java index 3bd001233..13e473b73 100644 --- a/400_xowa/src/gplx/xowa/users/data/Xoud_data_mgr.java +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_db_mgr.java @@ -16,11 +16,10 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.users.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*; -import gplx.threads.*; import gplx.dbs.*; import gplx.dbs.schemas.updates.*; import gplx.dbs.schemas.*; -import gplx.xowa2.users.data.*; -public class Xoud_data_mgr { +import gplx.threads.*; import gplx.dbs.*; import gplx.dbs.schemas.updates.*; import gplx.dbs.schemas.*; +public class Xoud_db_mgr { private final Xoud_id_mgr id_mgr; - public Xoud_data_mgr() { + public Xoud_db_mgr() { id_mgr = new Xoud_id_mgr(cfg_mgr); site_mgr = new Xoud_site_mgr(id_mgr); } diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_history_mgr.java b/400_xowa/src/gplx/xowa/users/data/Xoud_history_mgr.java index 091c27c83..5c2a69e97 100644 --- a/400_xowa/src/gplx/xowa/users/data/Xoud_history_mgr.java +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_history_mgr.java @@ -18,8 +18,11 @@ along with this program. If not, see . package gplx.xowa.users.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*; import gplx.threads.*; import gplx.dbs.*; public class Xoud_history_mgr implements GfoInvkAble { - private final Xoud_history_tbl history_tbl = new Xoud_history_tbl(); - public void Conn_(Db_conn new_conn, boolean created, int user_id) {history_tbl.Conn_(new_conn, created, user_id);} + private Xoud_history_tbl history_tbl; + public void Conn_(Db_conn new_conn, boolean created, int user_id) { + history_tbl = new Xoud_history_tbl(new_conn); + if (created) history_tbl.Create_tbl(); + } public void Update_async(Gfo_async_mgr async_mgr, Xoa_ttl ttl, Xoa_url url) { // if (Skip_history(ttl)) return; // async_mgr.Queue(this, Invk_update, "wiki", String_.new_utf8_(url.Wiki_bry()), "page", String_.new_utf8_(url.Page_bry()), "qarg", String_.new_utf8_(url.Args_all_as_bry())); diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_history_special.java b/400_xowa/src/gplx/xowa/users/data/Xoud_history_special.java index 85e326249..70a1d394e 100644 --- a/400_xowa/src/gplx/xowa/users/data/Xoud_history_special.java +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_history_special.java @@ -25,7 +25,7 @@ public class Xoud_history_special implements Bry_fmtr_arg, Xows_page { mgr.Select(rows, 100); Bry_bfr bfr = app.Utl__bfr_mkr().Get_m001(); html_grp.Bld_bfr_many(bfr, this); - page.Data_raw_(bfr.Mkr_rls().Xto_bry_and_clear()); + page.Data_raw_(bfr.To_bry_and_rls()); } public void XferAry(Bry_bfr bfr, int idx) { int len = rows.Count(); diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_history_tbl.java b/400_xowa/src/gplx/xowa/users/data/Xoud_history_tbl.java index abd3e14ef..d199485ca 100644 --- a/400_xowa/src/gplx/xowa/users/data/Xoud_history_tbl.java +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_history_tbl.java @@ -17,81 +17,78 @@ along with this program. If not, see . */ package gplx.xowa.users.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*; import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.dbs.schemas.*; import gplx.dbs.schemas.updates.*; -public class Xoud_history_tbl { - private String tbl_name = "user_history"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); - private String fld_user_id, fld_wiki, fld_page, fld_qarg, fld_time, fld_count; - private Db_conn conn; private Db_stmt stmt_select_by_page, stmt_select_by_top, stmt_insert, stmt_update, stmt_delete; - private int user_id; - public void Conn_(Db_conn new_conn, boolean created, int user_id) { - this.conn = new_conn; flds.Clear(); - this.user_id = user_id; - fld_user_id = flds.Add_int("user_id"); - fld_wiki = flds.Add_str("history_wiki", 255); - fld_page = flds.Add_str("history_page", 255); - fld_qarg = flds.Add_str("history_qarg", 255); - fld_time = flds.Add_str("history_time", 20); - fld_count = flds.Add_int("history_count"); - if (created) { - Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds - , Db_meta_idx.new_unique_by_tbl(tbl_name, "pkey", fld_user_id, fld_wiki, fld_page, fld_qarg) - ); - conn.Exec_create_tbl_and_idx(meta); - } +public class Xoud_history_tbl implements RlsAble { + private final String tbl_name = "user_history"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private final String fld_wiki, fld_page, fld_qarg, fld_time, fld_count; + private final Db_conn conn; private Db_stmt stmt_select_by_page, stmt_select_by_top, stmt_insert, stmt_update, stmt_delete; + public Xoud_history_tbl(Db_conn conn) { + this.conn = conn; + fld_wiki = flds.Add_str("hist_wiki", 255); + fld_page = flds.Add_str("hist_page", 255); + fld_qarg = flds.Add_str("hist_qarg", 255); + fld_time = flds.Add_str("hist_time", 20); + fld_count = flds.Add_int("hist_count"); stmt_insert = stmt_update = stmt_delete = stmt_select_by_page = stmt_select_by_top = null; + conn.Rls_reg(this); + } + public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_tbl(tbl_name, "pkey", fld_wiki, fld_page, fld_qarg)));} + public void Rls() { + stmt_insert = Db_stmt_.Rls(stmt_insert); + stmt_update = Db_stmt_.Rls(stmt_update); + stmt_delete = Db_stmt_.Rls(stmt_delete); + stmt_select_by_page = Db_stmt_.Rls(stmt_select_by_page); + stmt_select_by_top = Db_stmt_.Rls(stmt_select_by_top); } public void Insert(String wiki, String page, String qarg, DateAdp time, int count) { - if (stmt_insert == null) stmt_insert = conn.Rls_reg(conn.Stmt_insert(tbl_name, flds)); + if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds); stmt_insert.Clear() - .Val_int(fld_user_id, user_id).Val_str(fld_wiki, wiki).Val_str(fld_page, page).Val_str(fld_qarg, qarg) + .Val_str(fld_wiki, wiki).Val_str(fld_page, page).Val_str(fld_qarg, qarg) .Val_str(fld_time, time.XtoStr_fmt_iso_8561()).Val_int(fld_count, count) .Exec_insert(); } public void Update(String wiki, String page, String qarg, DateAdp time, int count) { - if (stmt_update == null) stmt_update = conn.Rls_reg(conn.Stmt_update(tbl_name, String_.Ary(fld_user_id, fld_wiki, fld_page, fld_qarg), fld_time, fld_count)); + if (stmt_update == null) stmt_update = conn.Stmt_update(tbl_name, String_.Ary(fld_wiki, fld_page, fld_qarg), fld_time, fld_count); stmt_update.Clear() .Val_str(fld_time, time.XtoStr_fmt_iso_8561()).Val_int(fld_count, count) - .Crt_int(fld_user_id, user_id).Crt_str(fld_wiki, wiki).Crt_str(fld_page, page).Crt_str(fld_qarg, qarg) + .Crt_str(fld_wiki, wiki).Crt_str(fld_page, page).Crt_str(fld_qarg, qarg) .Exec_update(); } public void Delete(String wiki, String page, String qarg) { - if (stmt_delete == null) stmt_delete = conn.Rls_reg(conn.Stmt_delete(tbl_name, fld_user_id, fld_wiki, fld_page, fld_qarg)); + if (stmt_delete == null) stmt_delete = conn.Stmt_delete(tbl_name, fld_wiki, fld_page, fld_qarg); stmt_delete.Clear() - .Crt_int(fld_user_id, user_id).Crt_str(fld_wiki, wiki).Crt_str(fld_page, page).Crt_str(fld_qarg, qarg) + .Crt_str(fld_wiki, wiki).Crt_str(fld_page, page).Crt_str(fld_qarg, qarg) .Exec_delete(); } public Xoud_history_row Select_by_page(String wiki, String page, String qarg) { - if (stmt_select_by_page == null) stmt_select_by_page = conn.Rls_reg(conn.Stmt_select(tbl_name, flds, fld_user_id, fld_wiki, fld_page, fld_qarg)); - Db_rdr rdr = Db_rdr_.Null; + if (stmt_select_by_page == null) stmt_select_by_page = conn.Stmt_select(tbl_name, flds, fld_wiki, fld_page, fld_qarg); + Db_rdr rdr = stmt_select_by_page.Clear().Crt_str(fld_wiki, wiki).Crt_str(fld_page, page).Crt_str(fld_qarg, qarg).Exec_select__rls_manual(); try { - rdr = stmt_select_by_page.Clear() - .Crt_int(fld_user_id, user_id).Crt_str(fld_wiki, wiki).Crt_str(fld_page, page).Crt_str(fld_qarg, qarg) - .Exec_select_as_rdr(); - return rdr.Move_next() ? Make_row(rdr) : Xoud_history_row.Null; + return rdr.Move_next() ? new_row(rdr) : Xoud_history_row.Null; } finally {rdr.Rls();} } public void Select_by_top(ListAdp rv, int count) { - Db_qry__select_in_tbl qry = new Db_qry__select_in_tbl(tbl_name, flds.To_str_ary(), null, null, null, fld_time + " DESC", " LIMIT " + Int_.Xto_str(count)); - stmt_select_by_top = conn.Stmt_new(qry); - Db_rdr rdr = Db_rdr_.Null; + if (stmt_select_by_top == null) { + Db_qry__select_in_tbl qry = new Db_qry__select_in_tbl(tbl_name, flds.To_str_ary(), null, null, null, fld_time + " DESC", " LIMIT " + Int_.Xto_str(count)); + stmt_select_by_top = conn.Stmt_new(qry); + } + Db_rdr rdr = stmt_select_by_top.Clear().Exec_select__rls_manual(); try { - rdr = stmt_select_by_top.Clear().Exec_select_as_rdr(); rv.Clear(); while (rdr.Move_next()) { - Xoud_history_row row = Make_row(rdr); + Xoud_history_row row = new_row(rdr); rv.Add(row); } - rdr.Rls(); } finally {rdr.Rls();} } - private Xoud_history_row Make_row(Db_rdr rdr) { + private Xoud_history_row new_row(Db_rdr rdr) { return new Xoud_history_row - ( rdr.Read_str(0) - , rdr.Read_str(1) - , rdr.Read_str(2) - , rdr.Read_date_by_str(3) - , rdr.Read_int(4) + ( rdr.Read_str(fld_wiki) + , rdr.Read_str(fld_page) + , rdr.Read_str(fld_qarg) + , rdr.Read_date_by_str(fld_time) + , rdr.Read_int(fld_count) ); } } diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_opt_scope.java b/400_xowa/src/gplx/xowa/users/data/Xoud_opt_scope.java index 94061fbaa..452fe9757 100644 --- a/400_xowa/src/gplx/xowa/users/data/Xoud_opt_scope.java +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_opt_scope.java @@ -33,7 +33,7 @@ class Xoud_opt_scope { class Xoud_opt_scope_parser { private Gfo_usr_dlg usr_dlg; private final ListAdp list = ListAdp_.new_(); public Xoud_opt_scope[] Parse(byte[] src) { - usr_dlg = Gfo_usr_dlg_._; + usr_dlg = Gfo_usr_dlg_.I; list.Clear(); int pos = 0; int src_len = src.length; while (pos < src_len) { diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_opt_scope_tst.java b/400_xowa/src/gplx/xowa/users/data/Xoud_opt_scope_tst.java index 463649ad0..631ea8253 100644 --- a/400_xowa/src/gplx/xowa/users/data/Xoud_opt_scope_tst.java +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_opt_scope_tst.java @@ -31,7 +31,7 @@ public class Xoud_opt_scope_tst { class Xoud_opt_scope_fxt { private final Xoud_opt_scope_parser parser = new Xoud_opt_scope_parser(); public void Clear() { - Gfo_usr_dlg_._ = Xoa_app_.usr_dlg_console_(); + // Gfo_usr_dlg_.I = Xoa_app_.usr_dlg_console_(); } public Xoud_opt_scope Make(int lang_id, int type_id) {return new Xoud_opt_scope(lang_id, type_id);} public void Test_parse(String raw, Xoud_opt_scope... expd) { diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_regy_tbl.java b/400_xowa/src/gplx/xowa/users/data/Xoud_regy_tbl.java index 4534c09cd..942f2d22d 100644 --- a/400_xowa/src/gplx/xowa/users/data/Xoud_regy_tbl.java +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_regy_tbl.java @@ -35,7 +35,7 @@ public class Xoud_regy_tbl { if (created) { Schema_update_cmd cmd = Schema_update_cmd_.Make_tbl_create(Xoud_regy_tbl.Tbl_name , Xoud_regy_tbl.Tbl_sql , Xoud_regy_tbl.Idx_core); cmd.Exec(null, conn); -// conn.Exec_create_tbl_and_idx(meta); +// conn.Ddl_create_tbl(meta); } return this; } private Db_conn conn; @@ -56,20 +56,19 @@ public class Xoud_regy_tbl { } @gplx.Virtual public void Select_by_grp(ListAdp rv, String grp) { if (stmt_select_grp == null) stmt_select_grp = Db_stmt_.new_select_as_rdr(conn, Db_qry__select_in_tbl.new_(Tbl_name, String_.Ary(Fld_regy_grp), Flds__all, Db_qry__select_in_tbl.Order_by_null)); + Db_rdr rdr = stmt_select_grp.Clear().Val_str(grp).Exec_select__rls_manual(); try { - Db_rdr rdr = stmt_select_grp.Clear().Val_str(grp).Exec_select_as_rdr(); while (rdr.Move_next()) { Xoud_regy_row row = Make_row(rdr); rv.Add(row); } - rdr.Rls(); } - catch (Exception exc) {stmt_select_grp = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail + finally {rdr.Rls();} } @gplx.Virtual public String Select_val(String grp, String key) { if (stmt_select_key == null) stmt_select_key = Db_stmt_.new_select_as_rdr(conn, Db_qry__select_in_tbl.new_(Tbl_name, String_.Ary(Fld_regy_grp, Fld_regy_key), Flds__all, Db_qry__select_in_tbl.Order_by_null)); try { - Db_rdr rdr = stmt_select_key.Clear().Val_str(grp).Val_str(key).Exec_select_as_rdr(); + Db_rdr rdr = stmt_select_key.Clear().Val_str(grp).Val_str(key).Exec_select__rls_manual(); String rv = null; if (rdr.Move_next()) rv = rdr.Read_str(2); diff --git a/400_xowa/src/gplx/xowa2/users/data/Xoud_site_mgr.java b/400_xowa/src/gplx/xowa/users/data/Xoud_site_mgr.java similarity index 88% rename from 400_xowa/src/gplx/xowa2/users/data/Xoud_site_mgr.java rename to 400_xowa/src/gplx/xowa/users/data/Xoud_site_mgr.java index e8e273f12..048079e17 100644 --- a/400_xowa/src/gplx/xowa2/users/data/Xoud_site_mgr.java +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_site_mgr.java @@ -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 . */ -package gplx.xowa2.users.data; import gplx.*; import gplx.xowa2.*; import gplx.xowa2.users.*; +package gplx.xowa.users.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*; import gplx.dbs.*; import gplx.xowa.users.data.*; public class Xoud_site_mgr { - private final Xoud_site_tbl tbl = new Xoud_site_tbl(); + private Xoud_site_tbl tbl; private final Xoud_id_mgr id_mgr; public Xoud_site_mgr(Xoud_id_mgr id_mgr) {this.id_mgr = id_mgr;} public void Conn_(Db_conn conn, boolean created, int user_id) { - tbl.Conn_(conn, created, user_id); + tbl = new Xoud_site_tbl(conn); + if (created) tbl.Create_tbl(); } public Xoud_site_row[] Get_all() {return tbl.Select_all();} public void Import(String domain, String name, String path, String xtn) { // insert or update wiki diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_site_row.java b/400_xowa/src/gplx/xowa/users/data/Xoud_site_row.java new file mode 100644 index 000000000..d351d7720 --- /dev/null +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_site_row.java @@ -0,0 +1,29 @@ +/* +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 . +*/ +package gplx.xowa.users.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*; +public class Xoud_site_row { + public Xoud_site_row(int id, int priority, String domain, String name, String path, String xtn) { + this.id = id; this.priority = priority; this.domain = domain; this.name = name; this.path = path; this.xtn = xtn; + } + public int Id() {return id;} private final int id; + public int Priority() {return priority;} private final int priority; + public String Domain() {return domain;} private final String domain; + public String Name() {return name;} private final String name; + public String Path() {return path;} private final String path; + public String Xtn() {return xtn;} private String xtn; +} diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_site_tbl.java b/400_xowa/src/gplx/xowa/users/data/Xoud_site_tbl.java new file mode 100644 index 000000000..28a0a18a5 --- /dev/null +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_site_tbl.java @@ -0,0 +1,82 @@ +/* +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 . +*/ +package gplx.xowa.users.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*; +import gplx.dbs.*; +public class Xoud_site_tbl implements RlsAble { + private final String tbl_name = "user_site"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private final String fld_site_id, fld_site_priority, fld_site_domain, fld_site_name, fld_site_path, fld_site_xtn; + private final Db_conn conn; + public Xoud_site_tbl(Db_conn conn) { + this.conn = conn; + fld_site_id = flds.Add_int_pkey("site_id"); + fld_site_priority = flds.Add_int("site_priority"); // EX: 0=default; 1+ is order if 0 is unavailable + fld_site_domain = flds.Add_str("site_domain", 255); // EX: en.wikipedia.org; NOTE: no protocol (https:) + fld_site_name = flds.Add_str("site_name", 255); // EX: English Wikipedia + fld_site_path = flds.Add_str("site_path", 255); // EX: ~{xowa_root}/wiki/en.wikipedia.org/ + fld_site_xtn = flds.Add_text("site_xtn"); + conn.Rls_reg(this); + } + public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds));} + public void Rls() {} + public void Insert(int site_id, int priority, String domain, String name, String path, String xtn) { + Db_stmt stmt = conn.Stmt_insert(tbl_name, flds); + stmt.Val_int(fld_site_id, site_id) + .Val_int(fld_site_priority, priority).Val_str(fld_site_domain, domain).Val_str(fld_site_name, name).Val_str(fld_site_path, path).Val_str(fld_site_xtn, xtn) + .Exec_insert(); + } + public void Update(int site_id, int priority, String domain, String name, String path, String xtn) { + Db_stmt stmt = conn.Stmt_update_exclude(tbl_name, flds, fld_site_id); + stmt.Val_int(fld_site_priority, priority).Val_str(fld_site_domain, domain).Val_str(fld_site_name, name).Val_str(fld_site_path, path).Val_str(fld_site_xtn, xtn) + .Crt_int(fld_site_id, site_id) + .Exec_update(); + } + public void Delete(int site_id) { + Db_stmt stmt = conn.Stmt_delete(tbl_name, fld_site_id); + stmt.Crt_int(fld_site_id, site_id).Exec_delete(); + } + public Xoud_site_row[] Select_all() { + ListAdp rv = ListAdp_.new_(); + Db_rdr rdr = conn.Stmt_select(tbl_name, flds).Exec_select__rls_auto(); + try { + while (rdr.Move_next()) + rv.Add(new_row(rdr)); + return (Xoud_site_row[])rv.Xto_ary_and_clear(Xoud_site_row.class); + } + finally {rdr.Rls();} + } + public Xoud_site_row[] Select_by_domain(String domain) { + ListAdp rv = ListAdp_.new_(); + Db_rdr rdr = conn.Stmt_select(tbl_name, flds, fld_site_domain).Crt_str(fld_site_domain, domain).Exec_select__rls_auto(); + try { + while (rdr.Move_next()) + rv.Add(new_row(rdr)); + return (Xoud_site_row[])rv.Xto_ary_and_clear(Xoud_site_row.class); + } + finally {rdr.Rls();} + } + private Xoud_site_row new_row(Db_rdr rdr) { + return new Xoud_site_row + ( rdr.Read_int(fld_site_id) + , rdr.Read_int(fld_site_priority) + , rdr.Read_str(fld_site_domain) + , rdr.Read_str(fld_site_name) + , rdr.Read_str(fld_site_path) + , rdr.Read_str(fld_site_xtn) + ); + } +} diff --git a/400_xowa/src/gplx/xowa2/users/data/Xoud_user_tbl.java b/400_xowa/src/gplx/xowa/users/data/Xoud_user_tbl.java similarity index 81% rename from 400_xowa/src/gplx/xowa2/users/data/Xoud_user_tbl.java rename to 400_xowa/src/gplx/xowa/users/data/Xoud_user_tbl.java index ecf8f688c..f7047928b 100644 --- a/400_xowa/src/gplx/xowa2/users/data/Xoud_user_tbl.java +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_user_tbl.java @@ -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 . */ -package gplx.xowa2.users.data; import gplx.*; import gplx.xowa2.*; import gplx.xowa2.users.*; +package gplx.xowa.users.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*; import gplx.dbs.*; class Xoud_user_mgr { private Xoud_user_tbl tbl = new Xoud_user_tbl(); @@ -41,7 +41,7 @@ class Xoud_user_tbl { Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds , Db_meta_idx.new_unique_by_tbl(tbl_name, "name", fld_name) ); - conn.Exec_create_tbl_and_idx(meta); + conn.Ddl_create_tbl(meta); } } public void Insert(int id, String name) { @@ -50,20 +50,16 @@ class Xoud_user_tbl { .Exec_insert(); } public int Select_id_by_name(String name) { - Db_rdr rdr = Db_rdr_.Null; + Db_rdr rdr = conn.Stmt_select(tbl_name, flds, fld_name).Crt_str(fld_name, name).Exec_select__rls_auto(); try { - Db_stmt stmt = conn.Stmt_select(tbl_name, flds, fld_name); - rdr = stmt.Crt_str(fld_name, name).Exec_select_as_rdr(); return rdr.Move_next() ? rdr.Read_int(fld_id) : Int_.MinValue; } finally {rdr.Rls();} } public int Select_id_next() { - Db_rdr rdr = Db_rdr_.Null; int rv = 1; + Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empy).Exec_select__rls_auto(); try { - Db_stmt stmt = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empy); - rdr = stmt.Exec_select_as_rdr(); while (rdr.Move_next()) { int cur = rdr.Read_int(fld_id); if (cur >= rv) rv = cur + 1; diff --git a/400_xowa/src/gplx/xowa/users/history/Xou_history_html.java b/400_xowa/src/gplx/xowa/users/history/Xou_history_html.java index 59fc34ef2..e834b91a7 100644 --- a/400_xowa/src/gplx/xowa/users/history/Xou_history_html.java +++ b/400_xowa/src/gplx/xowa/users/history/Xou_history_html.java @@ -42,7 +42,7 @@ public class Xou_history_html implements Bry_fmtr_arg, Xows_page { mgr.Sort(); Bry_bfr bfr = app.Utl__bfr_mkr().Get_m001(); html_grp.Bld_bfr_many(bfr, this); - page.Data_raw_(bfr.Mkr_rls().Xto_bry_and_clear()); + page.Data_raw_(bfr.To_bry_and_rls()); } public void XferAry(Bry_bfr bfr, int idx) { int len = mgr.Len(); diff --git a/400_xowa/src/gplx/xowa/users/prefs/Prefs_rename_mgr.java b/400_xowa/src/gplx/xowa/users/prefs/Prefs_rename_mgr.java index dd25c7ed4..31c6ee6ba 100644 --- a/400_xowa/src/gplx/xowa/users/prefs/Prefs_rename_mgr.java +++ b/400_xowa/src/gplx/xowa/users/prefs/Prefs_rename_mgr.java @@ -30,7 +30,7 @@ public class Prefs_rename_mgr { if (String_.Has(cur_str, itm.Src())) { cur_str_changed = true; cur_str = String_.Replace(cur_str, itm.Src(), itm.Trg()); - Gfo_usr_dlg_._.Log_many("", "", "cfg.replace: src=~{src} trg = ~{trg}", itm.Src(), itm.Trg()); + Gfo_usr_dlg_.I.Log_many("", "", "cfg.replace: src=~{src} trg = ~{trg}", itm.Src(), itm.Trg()); } } if (cur_str_changed) @@ -38,7 +38,7 @@ public class Prefs_rename_mgr { return cur_str_changed; } private static void List_add(ListAdp list, String src, String trg) {list.Add(new Prefs_rename_itm(src, trg));} - public static final Prefs_rename_mgr _ = new Prefs_rename_mgr(); + public static final Prefs_rename_mgr _ = new Prefs_rename_mgr(); } class Prefs_rename_itm { public Prefs_rename_itm(String src, String trg) {this.src = src; this.trg = trg;} diff --git a/400_xowa/src/gplx/xowa/wikis/Xoa_wiki_mgr.java b/400_xowa/src/gplx/xowa/wikis/Xoa_wiki_mgr.java index 95b7d728d..421165670 100644 --- a/400_xowa/src/gplx/xowa/wikis/Xoa_wiki_mgr.java +++ b/400_xowa/src/gplx/xowa/wikis/Xoa_wiki_mgr.java @@ -29,9 +29,7 @@ public class Xoa_wiki_mgr implements GfoInvkAble { public Cfg_nde_root Groups() {return groups;} Cfg_nde_root groups = new Cfg_nde_root().Root_(new Xoac_wiki_grp(Bry_.Empty), Xoac_lang_grp.Make_grp, Bry_.Ary_empty); public Xow_script_mgr Scripts() {return scripts;} private Xow_script_mgr scripts = new Xow_script_mgr(); public Wdata_wiki_mgr Wdata_mgr() {return wdata_mgr;} Wdata_wiki_mgr wdata_mgr; - public Xoa_css_extractor Css_installer() {return css_installer;} private Xoa_css_extractor css_installer = new Xoa_css_extractor(); public void Init_by_app() { - css_installer.Init_by_app(app); wdata_mgr.Init_by_app(); } public int Count() {return hash.Count();} diff --git a/400_xowa/src/gplx/xowa/wikis/Xow_cfg_consts.java b/400_xowa/src/gplx/xowa/wikis/Xow_cfg_consts.java new file mode 100644 index 000000000..53c708904 --- /dev/null +++ b/400_xowa/src/gplx/xowa/wikis/Xow_cfg_consts.java @@ -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 . +*/ +package gplx.xowa.wikis; import gplx.*; import gplx.xowa.*; +public class Xow_cfg_consts { + public static final String + Grp__wiki_core = "xowa.wiki.core" + , Grp__wiki_schema = "xowa.wiki.schema" + , Grp__bldr_session = "xowa.bldr.session" + , Grp__bldr_db = "xowa.bldr.db" + , Grp__bldr_fsdb = "xowa.bldr.fsdb" + , Grp_wiki_init = "wiki.init" + ; + public static final String + Key__schema__col_page_html_text_id = "col.page.page_html_text_id" + , Key__schema__tbl_css_core = "tbl.css_core" + ; +} diff --git a/400_xowa/src/gplx/xowa/wikis/Xow_domain.java b/400_xowa/src/gplx/xowa/wikis/Xow_domain.java index af1863f99..e37ee1929 100644 --- a/400_xowa/src/gplx/xowa/wikis/Xow_domain.java +++ b/400_xowa/src/gplx/xowa/wikis/Xow_domain.java @@ -20,8 +20,10 @@ import gplx.xowa.langs.*; public class Xow_domain { Xow_domain(byte[] domain_bry, int domain_tid, Xol_lang_itm lang_itm, Xol_lang_itm lang_orig_itm) { this.domain_bry = domain_bry; this.domain_tid = domain_tid; this.lang_itm = lang_itm; this.lang_orig_itm = lang_orig_itm; + this.domain_str = String_.new_utf8_(domain_bry); } public byte[] Domain_bry() {return domain_bry;} private final byte[] domain_bry; + public String Domain_str() {return domain_str;} private final String domain_str; public int Domain_tid() {return domain_tid;} private final int domain_tid; public Xol_lang_itm Lang_itm() {return lang_itm;} private final Xol_lang_itm lang_itm; public int Lang_uid() {return lang_itm.Id();} diff --git a/400_xowa/src/gplx/xowa/wikis/Xow_fsys_mgr.java b/400_xowa/src/gplx/xowa/wikis/Xow_fsys_mgr.java index cca4e3590..84c5ea007 100644 --- a/400_xowa/src/gplx/xowa/wikis/Xow_fsys_mgr.java +++ b/400_xowa/src/gplx/xowa/wikis/Xow_fsys_mgr.java @@ -16,11 +16,51 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.wikis; import gplx.*; import gplx.xowa.*; -public class Xow_fsys_mgr { +public class Xow_fsys_mgr { public Xow_fsys_mgr(Io_url root_dir, Io_url file_dir) { - this.root_dir = root_dir; this.file_dir = file_dir; this.tmp_dir = root_dir.GenSubDir("tmp"); + this.root_dir = root_dir; this.file_dir = file_dir; this.tmp_dir = root_dir.GenSubDir("tmp"); } public Io_url Root_dir() {return root_dir;} private final Io_url root_dir; public Io_url File_dir() {return file_dir;} private final Io_url file_dir; public Io_url Tmp_dir() {return tmp_dir;} private final Io_url tmp_dir; + + public static Io_url Find_core_fil(Xow_wiki wiki) {return Find_core_fil(wiki.Fsys_mgr().Root_dir(), wiki.Domain_str());} + public static Io_url Find_core_fil(Io_url wiki_root_dir, String domain_str) { + Io_url[] ary = Io_mgr._.QueryDir_fils(wiki_root_dir); + int ary_len = ary.length; if (ary.length == 0) return null; + Io_url rv = Find_core_fil__xowa(ary, ary_len, domain_str); + return rv == null ? Find_core_fil__sqlite3(wiki_root_dir, ary, ary_len, domain_str) : rv; + } + private static Io_url Find_core_fil__xowa(Io_url[] ary, int ary_len, String domain_str) { + for (int i = 0; i < ary_len; i++) { + Io_url itm = ary[i]; + if (!String_.Eq(itm.Ext(), ".xowa")) continue; + if ( String_.Eq(itm.NameOnly(), domain_str) // EX: "en.wikipedia.org" + || String_.Eq(itm.NameOnly(), domain_str + "-text") // EX: "en.wikipedia.org-text" + || String_.Eq(itm.NameOnly(), domain_str + "-core") // EX: "en.wikipedia.org-core" + ) { + Xoa_app_.Usr_dlg().Log_many("", "", "wiki.db_core.v2: url=~{0}", itm.Raw()); + return itm; + } + } + return null; + } + private static Io_url Find_core_fil__sqlite3(Io_url wiki_root_dir, Io_url[] ary, int ary_len, String domain_str) { + Io_url rv = null; + String v0_str = domain_str + ".000"; + for (int i = 0; i < ary_len; i++) { + Io_url itm = ary[i]; + if (!String_.Eq(itm.Ext(), ".sqlite3")) continue; + if (String_.Eq(itm.NameOnly(), v0_str)) { // EX: "en.wikipedia.org.000" + Xoa_app_.Usr_dlg().Log_many("", "", "wiki.db_core.v1: url=~{0}", itm.Raw()); + return itm; + } + if (ary_len == 1) { + Xoa_app_.Usr_dlg().Log_many("", "", "wiki.db_core.custom: url=~{0}", itm.Raw()); + return rv; // 1 folder and 1 sqlite file; return it; custom wikis? + } + } + Xoa_app_.Usr_dlg().Log_many("", "", "wiki.db_core.none: dir=~{0}", wiki_root_dir.Raw()); + return rv; + } } diff --git a/140_dbs/src/gplx/dbs/Db_batch_wkr__sql.java b/400_xowa/src/gplx/xowa/wikis/Xow_page_mgr.java similarity index 56% rename from 140_dbs/src/gplx/dbs/Db_batch_wkr__sql.java rename to 400_xowa/src/gplx/xowa/wikis/Xow_page_mgr.java index 7711db5e9..4fa7dc726 100644 --- a/140_dbs/src/gplx/dbs/Db_batch_wkr__sql.java +++ b/400_xowa/src/gplx/xowa/wikis/Xow_page_mgr.java @@ -15,17 +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 . */ -package gplx.dbs; import gplx.*; -public class Db_batch_wkr__sql implements Db_batch_wkr { - private final Db_conn conn; private String sql; - public Db_batch_wkr__sql(Db_conn conn, String... lines) {this.conn = conn; this.sql = String_.Concat_lines_nl_skip_last(lines);} - public String Sql() {return sql;} - public Db_batch_wkr__sql Sql_(String... lines) {sql = String_.Concat_lines_nl_skip_last(lines); return this;} - public void Batch_bgn() { - conn.Txn_bgn(); - conn.Exec_sql(sql); - conn.Txn_end(); - } - public void Batch_end() { +package gplx.xowa.wikis; import gplx.*; import gplx.xowa.*; +import gplx.xowa.wikis.data.tbls.*; +public class Xow_page_mgr { + public void Create(Xowd_page_tbl core_tbl, Xowd_text_tbl text_tbl, int page_id, int ns_id, byte[] ttl_wo_ns, boolean redirect, DateAdp modified_on, byte[] text_zip_data, int text_raw_len, int random_int, int text_db_id, int html_db_id) { + core_tbl.Insert_cmd_by_batch(page_id, ns_id, ttl_wo_ns, redirect, modified_on, text_raw_len, random_int, text_db_id, html_db_id); + text_tbl.Insert_cmd_by_batch(page_id, text_zip_data); } } diff --git a/400_xowa/src/gplx/xowa/wikis/data/Xodb_ns_map_mgr.java b/400_xowa/src/gplx/xowa/wikis/data/Xodb_ns_map_mgr.java deleted file mode 100644 index d8c1a078f..000000000 --- a/400_xowa/src/gplx/xowa/wikis/data/Xodb_ns_map_mgr.java +++ /dev/null @@ -1,51 +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 . -*/ -package gplx.xowa.wikis.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; -class Xodb_ns_map_mgr { - public Xodb_ns_map_itm[] Itms() {return itms;} private Xodb_ns_map_itm[] itms; - public static Xodb_ns_map_mgr Parse(byte[] src) { - byte[][] lines = Bry_.Split(src, Byte_ascii.NewLine); - int lines_len = lines.length; - Xow_ns_mgr canonical_ns_mgr = Xow_ns_mgr_.default_(gplx.xowa.langs.cases.Xol_case_mgr_.Ascii()); - Xodb_ns_map_mgr rv = new Xodb_ns_map_mgr(); - ListAdp itms = ListAdp_.new_(); - for (int i = 0; i < lines_len; i++) { - byte[] line = lines[i]; - if (line.length == 0) continue; // ignore blank lines - Xodb_ns_map_itm itm = Parse_itm(src, line, canonical_ns_mgr); - itms.Add(itm); - } - rv.itms = (Xodb_ns_map_itm[])itms.Xto_ary_and_clear(Xodb_ns_map_itm.class); - return rv; - } - private static Xodb_ns_map_itm Parse_itm(byte[] src, byte[] line, Xow_ns_mgr ns_mgr) { - byte[][] ns_names = Bry_.Split(line, Byte_ascii.Tilde); - int len = ns_names.length; - int[] ns_ids = new int[len]; - for (int i = 0; i < len; i++) { - byte[] ns_name = ns_names[i]; - Xow_ns ns = ns_mgr.Names_get_or_null(ns_name, 0, ns_name.length); - ns_ids[i] = ns.Id(); - } - return new Xodb_ns_map_itm(ns_ids); - } -} -class Xodb_ns_map_itm { - public Xodb_ns_map_itm(int[] ns_ids) {this.ns_ids = ns_ids;} - public int[] Ns_ids() {return ns_ids;} private int[] ns_ids; -} diff --git a/400_xowa/src/gplx/xowa/wikis/data/Xodb_ns_map_mgr_tst.java b/400_xowa/src/gplx/xowa/wikis/data/Xodb_ns_map_mgr_tst.java deleted file mode 100644 index 1d1c20f70..000000000 --- a/400_xowa/src/gplx/xowa/wikis/data/Xodb_ns_map_mgr_tst.java +++ /dev/null @@ -1,57 +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 . -*/ -package gplx.xowa.wikis.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; -import org.junit.*; import gplx.dbs.*; -public class Xodb_ns_map_mgr_tst { - @Before public void init() {fxt.Clear();} private Xodb_ns_map_mgr_fxt fxt = new Xodb_ns_map_mgr_fxt(); - @Test public void Basic() { - fxt.Test_parse(""); - } - @Test public void Ns() { - fxt.Test_parse(String_.Concat_lines_nl - ( "" - , "Template" - , "" - , "File~Category" - , "" - ) - , fxt.itm_(Xow_ns_.Id_template), fxt.itm_(Xow_ns_.Id_file, Xow_ns_.Id_category)); - } -} -class Xodb_ns_map_mgr_fxt { - public void Clear() {} Bry_bfr bfr = Bry_bfr.new_(); - public Xodb_ns_map_itm itm_(int... ary) {return new Xodb_ns_map_itm(ary);} - public void Test_parse(String src_str, Xodb_ns_map_itm... expd) { - byte[] src_bry = Bry_.new_ascii_(src_str); - Xodb_ns_map_mgr actl_mgr = Xodb_ns_map_mgr.Parse(src_bry); - Tfds.Eq_str_lines(Xto_str(expd), Xto_str(actl_mgr.Itms())); - } - String Xto_str(Xodb_ns_map_itm[] ary) { - int len = ary.length; - for (int i = 0; i < len; i++) { - Xodb_ns_map_itm 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++) { - bfr.Add_int_variable(ns_ids[j]).Add_byte_pipe(); - } - bfr.Add_byte_nl(); - } - return bfr.Xto_str_and_clear(); - } -} diff --git a/400_xowa/src/gplx/xowa/wikis/data/Xow_core_data_map.java b/400_xowa/src/gplx/xowa/wikis/data/Xow_core_data_map.java deleted file mode 100644 index 090e77719..000000000 --- a/400_xowa/src/gplx/xowa/wikis/data/Xow_core_data_map.java +++ /dev/null @@ -1,22 +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 . -*/ -package gplx.xowa.wikis.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; -public class Xow_core_data_map { - public boolean One_file() {return one_file;} public void One_file_(boolean v) {one_file = v;} private boolean one_file = Bool_.N; - public long Max__html() {return max__html;} public void Max__html_(long v) {max__html = v;} private long max__html = Io_mgr.Len_gb_2; -} diff --git a/400_xowa/src/gplx/xowa/wikis/data/Xow_core_data_mgr.java b/400_xowa/src/gplx/xowa/wikis/data/Xow_core_data_mgr.java deleted file mode 100644 index 6fd0313f4..000000000 --- a/400_xowa/src/gplx/xowa/wikis/data/Xow_core_data_mgr.java +++ /dev/null @@ -1,32 +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 . -*/ -package gplx.xowa.wikis.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; -import gplx.dbs.cfgs.*; import gplx.xowa.dbs.*; import gplx.xowa.dbs.tbls.*; -import gplx.xowa.wikis.data.*; -public interface Xow_core_data_mgr { - Xow_core_data_map Map(); - boolean Cfg__schema_is_1(); - int Cfg__db_id(); - byte Cfg__hdump_zip_tid(); - int Dbs__len(); - Xowd_db_file Dbs__get_at(int i); - Xowd_db_file Dbs__get_by_tid_nth_or_new(byte tid); - Xowd_db_file Dbs__get_db_core(); - Db_cfg_tbl Tbl__cfg(); - Xowd_pg_regy_tbl Tbl__pg(); -} diff --git a/400_xowa/src/gplx/xowa/wikis/data/Xowd_core_db_props.java b/400_xowa/src/gplx/xowa/wikis/data/Xowd_core_db_props.java new file mode 100644 index 000000000..dadd5ad7c --- /dev/null +++ b/400_xowa/src/gplx/xowa/wikis/data/Xowd_core_db_props.java @@ -0,0 +1,70 @@ +/* +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 . +*/ +package gplx.xowa.wikis.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; +import gplx.ios.*; import gplx.dbs.*; import gplx.dbs.cfgs.*; +import gplx.dbs.schemas.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.dbs.*; +public class Xowd_core_db_props { + public Xowd_core_db_props(int schema, Xowd_db_layout layout_text, Xowd_db_layout layout_html, Xowd_db_layout layout_file, byte zip_tid_text, byte zip_tid_html) { + this.schema = schema; + this.layout_text = layout_text; this.layout_html = layout_html; this.layout_file = layout_file; + this.zip_tid_text = zip_tid_text; this.zip_tid_html = zip_tid_html; + } + public int Schema() {return schema;} private final int schema; + public boolean Schema_is_1() {return schema == 1;} + public Xowd_db_layout Layout_text() {return layout_text;} private final Xowd_db_layout layout_text; + public Xowd_db_layout Layout_html() {return layout_html;} private final Xowd_db_layout layout_html; + public Xowd_db_layout Layout_file() {return layout_file;} private final Xowd_db_layout layout_file; + public byte Zip_tid_text() {return zip_tid_text;} private final byte zip_tid_text; + public byte Zip_tid_html() {return zip_tid_html;} private final byte zip_tid_html; + public void Cfg_save(Db_cfg_tbl tbl) { + tbl.Conn().Txn_bgn(); + tbl.Insert_int (Cfg_grp, Cfg_key__schema_version , schema); + tbl.Insert_str (Cfg_grp, Cfg_key__layout_text , layout_text.Name()); + tbl.Insert_str (Cfg_grp, Cfg_key__layout_html , layout_html.Name()); + tbl.Insert_str (Cfg_grp, Cfg_key__layout_file , layout_file.Name()); + tbl.Insert_byte (Cfg_grp, Cfg_key__zip_tid_text , zip_tid_text); + tbl.Insert_byte (Cfg_grp, Cfg_key__zip_tid_html , zip_tid_html); + tbl.Conn().Txn_end(); + } + public static Xowd_core_db_props Cfg_load(Io_url url, Db_conn conn) { + Db_cfg_tbl cfg_tbl = new Db_cfg_tbl(conn, "xowa_cfg"); + return cfg_tbl.Select_int_or(Cfg_grp, Cfg_key__schema_version, 1) == 1 + ? new Xowd_core_db_props(1, Xowd_db_layout.Itm_lot, Xowd_db_layout.Itm_lot, Xowd_db_layout.Itm_lot, cfg_tbl.Select_byte_or(Xowe_wiki.Invk_db_mgr, Xodb_mgr_sql.Invk_data_storage_format, Io_stream_.Tid_gzip), Io_stream_.Tid_gzip) + : Cfg_load(cfg_tbl); + } + private static Xowd_core_db_props Cfg_load(Db_cfg_tbl tbl) { + Db_cfg_hash cfg_hash = tbl.Select_as_hash(Cfg_grp); + return new Xowd_core_db_props + ( cfg_hash.Get(Cfg_key__schema_version).To_int() + , Xowd_db_layout.get_(cfg_hash.Get(Cfg_key__layout_text).To_str()) + , Xowd_db_layout.get_(cfg_hash.Get(Cfg_key__layout_html).To_str()) + , Xowd_db_layout.get_(cfg_hash.Get(Cfg_key__layout_file).To_str()) + , cfg_hash.Get(Cfg_key__zip_tid_text).To_byte() + , cfg_hash.Get(Cfg_key__zip_tid_html).To_byte() + ); + } + private static final String Cfg_grp = Xow_cfg_consts.Grp__wiki_core + , Cfg_key__schema_version = "schema_version" + , Cfg_key__layout_text = "layout_text" + , Cfg_key__layout_html = "layout_html" + , Cfg_key__layout_file = "layout_file" + , Cfg_key__zip_tid_text = "zip_tid_text" + , Cfg_key__zip_tid_html = "zip_tid_html" + ; + public static final Xowd_core_db_props Test = new Xowd_core_db_props(2, Xowd_db_layout.Itm_few, Xowd_db_layout.Itm_few, Xowd_db_layout.Itm_few, Io_stream_.Tid_raw, Io_stream_.Tid_raw); +} diff --git a/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_file.java b/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_file.java index 3ea5bcfc5..3fd380475 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_file.java +++ b/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_file.java @@ -16,42 +16,75 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.wikis.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; -import gplx.dbs.*; +import gplx.dbs.*; import gplx.dbs.cfgs.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.bldrs.infos.*; public class Xowd_db_file { - private final OrderedHash tbls = OrderedHash_.new_(); - public Xowd_db_file(int id, byte tid) {this.id = id; this.tid = tid;} - public int Id() {return id;} private final int id; // unique id in xowa_db - public byte Tid() {return tid;} private final byte tid; - public Io_url Url() {return url;} public Xowd_db_file Url_(Io_url v) {url = v; connect = Db_url_.sqlite_(url); return this;} private Io_url url; - public String Url_rel() {return url_rel;} public Xowd_db_file Url_rel_(String v) {url_rel = v; return this;} private String url_rel; - public long File_len() {return file_len;} public Xowd_db_file File_len_add(int v) {file_len += v; return this;} private long file_len; - public long File_max() {return file_max;} public Xowd_db_file File_max_(long v) {file_max = v; return this;} private long file_max; - public byte Cmd_mode() {return cmd_mode;} public Xowd_db_file Cmd_mode_(byte v) {cmd_mode = v; return this;} private byte cmd_mode; - public Db_url Connect() {return connect;} public Xowd_db_file Connect_(Db_url v) {connect = v; return this;} private Db_url connect; - public Db_conn Conn() { - if (conn == null) conn = Db_conn_pool.I.Get_or_new(connect); - return conn; - } private Db_conn conn; - public void Conn_(Db_conn p) {conn = p;} - public void Rls() { - if (conn == null) return; - try { - conn.Txn_mgr().Txn_end_all(); // close any open transactions - conn.Conn_term(); - } finally {conn = null;} - } - public void Tbls__add(String key, Object tbl) {tbls.Add(key, tbl);} - public Object Tbls__get_by(Xow_core_data_mgr core_data_mgr, String key) { - Object rv = tbls.Fetch(key); - if (rv == null) { - Xowd_db_init_tbl_wkr wkr = Xowd_db_init_tbl_mgr.I.Get(key); - rv = wkr.Tbl_init(core_data_mgr, this); - tbls.Add(key, rv); - } - return rv; + Xowd_db_file(Xob_info_session info_session, Xob_info_file info_file, Xowd_core_db_props props, int id, byte tid, Io_url url, String ns_ids, int part_id, Guid_adp guid, Db_conn conn, byte cmd_mode) { + this.id = id; this.tid = tid; this.url = url; this.ns_ids = ns_ids; this.part_id = part_id; this.guid = guid; + this.conn = conn; this.cmd_mode = cmd_mode; + this.url_rel = url.NameAndExt(); + boolean schema_is_1 = props.Schema_is_1(); + this.tbl__cfg = new Db_cfg_tbl(conn, "xowa_cfg"); + this.tbl__db = new Xowd_xowa_db_tbl(conn, schema_is_1); + this.tbl__ns = new Xowd_site_ns_tbl(conn, schema_is_1); + this.tbl__site_stats = new Xowd_site_stats_tbl(conn, schema_is_1); + this.tbl__page = new Xowd_page_tbl(conn, schema_is_1); + this.tbl__text = new Xowd_text_tbl(conn, schema_is_1, props.Zip_tid_text()); + this.tbl__html = new Xowd_html_tbl(conn, props.Zip_tid_html()); + this.tbl__css_core = new Xowd_css_core_tbl(conn); + this.tbl__css_file = new Xowd_css_file_tbl(conn); + this.tbl__cat_core = new Xowd_cat_core_tbl(conn, schema_is_1); + this.tbl__cat_link = new Xowd_cat_link_tbl(conn, schema_is_1); + this.tbl__wbase_qid = new Xowd_wbase_qid_tbl(conn, schema_is_1); + this.tbl__wbase_pid = new Xowd_wbase_pid_tbl(conn, schema_is_1); + this.tbl__search_word = new Xowd_search_word_tbl(conn, schema_is_1); + this.tbl__search_link = new Xowd_search_link_tbl(conn, schema_is_1); + this.info_session = info_session == null ? Xob_info_session.Load(tbl__cfg) : info_session; + this.info_file = info_file == null ? Xob_info_file.Load(tbl__cfg) : info_file; } + public int Id() {return id;} private final int id; // unique id in xowa_db + public byte Tid() {return tid;} private final byte tid; + public Io_url Url() {return url;} private final Io_url url; + public String Url_rel() {return url_rel;} private final String url_rel; + public String Ns_ids() {return ns_ids;} private final String ns_ids; + public int Part_id() {return part_id;} private final int part_id; + public Guid_adp Guid() {return guid;} private final Guid_adp guid; + public Db_conn Conn() {return conn;} private final Db_conn conn; + public byte Cmd_mode() {return cmd_mode;} public Xowd_db_file Cmd_mode_(byte v) {cmd_mode = v; return this;} private byte cmd_mode; + public long File_len() {return file_len;} public Xowd_db_file File_len_add(int v) {file_len += v; return this;} private long file_len; + public long File_max() {return file_max;} public Xowd_db_file File_max_(long v) {file_max = v; return this;} private long file_max; + public Xob_info_session Info_session() {return info_session;} private final Xob_info_session info_session; + public Xob_info_file Info_file() {return info_file;} private final Xob_info_file info_file; + public Db_cfg_tbl Tbl__cfg() {return tbl__cfg;} private final Db_cfg_tbl tbl__cfg; + public Xowd_xowa_db_tbl Tbl__db() {return tbl__db;} private final Xowd_xowa_db_tbl tbl__db; + public Xowd_site_ns_tbl Tbl__ns() {return tbl__ns;} private final Xowd_site_ns_tbl tbl__ns; + public Xowd_page_tbl Tbl__page() {return tbl__page;} private final Xowd_page_tbl tbl__page; + public Xowd_text_tbl Tbl__text() {return tbl__text;} private final Xowd_text_tbl tbl__text; + public Xowd_html_tbl Tbl__html() {return tbl__html;} private final Xowd_html_tbl tbl__html; + public Xowd_css_core_tbl Tbl__css_core() {return tbl__css_core;} private final Xowd_css_core_tbl tbl__css_core; + public Xowd_css_file_tbl Tbl__css_file() {return tbl__css_file;} private final Xowd_css_file_tbl tbl__css_file; + public Xowd_cat_core_tbl Tbl__cat_core() {return tbl__cat_core;} private final Xowd_cat_core_tbl tbl__cat_core; + public Xowd_cat_link_tbl Tbl__cat_link() {return tbl__cat_link;} private final Xowd_cat_link_tbl tbl__cat_link; + public Xowd_search_word_tbl Tbl__search_word() {return tbl__search_word;} private final Xowd_search_word_tbl tbl__search_word; + public Xowd_search_link_tbl Tbl__search_link() {return tbl__search_link;} private final Xowd_search_link_tbl tbl__search_link; + public Xowd_site_stats_tbl Tbl__site_stats() {return tbl__site_stats;} private final Xowd_site_stats_tbl tbl__site_stats; + public Xowd_wbase_qid_tbl Tbl__wbase_qid() {return tbl__wbase_qid;} private final Xowd_wbase_qid_tbl tbl__wbase_qid; + public Xowd_wbase_pid_tbl Tbl__wbase_pid() {return tbl__wbase_pid;} private final Xowd_wbase_pid_tbl tbl__wbase_pid; + public void Rls() {conn.Rls_conn();} public static final Xowd_db_file Null = null; - public static Xowd_db_file load_(int id, byte tid, String url) {return new Xowd_db_file(id, tid).Url_rel_(url).Cmd_mode_(Db_cmd_mode.Tid_ignore);} - public static Xowd_db_file make_(int id, byte tid, String url) {return new Xowd_db_file(id, tid).Url_rel_(url).Cmd_mode_(Db_cmd_mode.Tid_create);} + public static Xowd_db_file make_(Xob_info_session info_session, Xowd_core_db_props props, int id, byte tid, Io_url url, String ns_ids, int part_id, String core_file_name, Db_conn conn) { + Guid_adp guid = Guid_adp_.random_(); + Xob_info_file info_file = new Xob_info_file(id, Xowd_db_file_.To_key(tid), ns_ids, part_id, guid, props.Schema(), core_file_name, url.NameAndExt()); + Xowd_db_file rv = new Xowd_db_file(info_session, info_file, props, id, tid, url, ns_ids, part_id, guid, conn, Db_cmd_mode.Tid_create); + rv.Tbl__cfg().Create_tbl(); // always create cfg in each db + return rv; + } + public static Xowd_db_file load_(Xowd_core_db_props props, int id, byte tid, Io_url url, String ns_ids, int part_id, Guid_adp guid) { + Db_conn conn = Db_conn_bldr.I.Get(url); + if (conn == null) { + Xoa_app_.Usr_dlg().Warn_many("", "", "wiki.db:missing db; tid=~{0} url=~{1}", Xowd_db_file_.To_key(tid), url.Raw()); + conn = Db_conn_.Empty; + } + return new Xowd_db_file(null, null, props, id, tid, url, ns_ids, part_id, guid, conn, Db_cmd_mode.Tid_ignore); + } } diff --git a/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_file_.java b/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_file_.java index d65777798..2bfeb2787 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_file_.java +++ b/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_file_.java @@ -17,17 +17,38 @@ along with this program. If not, see . */ package gplx.xowa.wikis.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; public class Xowd_db_file_ { - public static final byte Tid_core = 1, Tid_text = 2, Tid_category = 3, Tid_search = 4, Tid_wikidata = 5, Tid_temp = 6, Tid_html = 7; // SERIALIZED - public static final String Key_core = "core", Key_text = "text", Key_category = "category", Key_wikidata = "wikidata", Key_temp = "temp", Key_search = "search", Key_html = "html"; - public static String Xto_key(byte v) { + public static final int Id_core = 0; + public static final byte + Tid_core = 1, Tid_text = 2, Tid_cat = 3, Tid_search_core = 4, Tid_wbase = 5 // SERIALIZED:v1 + , Tid_cat_core = 6, Tid_cat_link = 7 // SERIALIZED:v2 + , Tid_wiki_solo = 8, Tid_text_solo = 9 + , Tid_html_solo = 10, Tid_html_data = 11 + , Tid_file_solo = 12, Tid_file_core = 13, Tid_file_data = 14, Tid_file_user = 15 + ; + private static final String + Key_core = "core", Key_text = "text", Key_cat = "xtn.category", Key_search_core = "xtn.search.core", Key_wbase = "core.wbase" + , Key_cat_core = "xtn.category.core", Key_cat_link = "xtn.category.link" + , Key_text_solo = "text.solo", Key_wiki_solo = "wiki.solo" + , Key_html_solo = "html.solo", Key_html_data = "html" + , Key_file_solo = "file.solo", Key_file_core = "file.core", Key_file_data = "file.data", Key_file_user = "file.user" + ; + public static String To_key(byte v) { switch (v) { case Tid_core: return Key_core; case Tid_text: return Key_text; - case Tid_category: return Key_category; - case Tid_wikidata: return Key_wikidata; - case Tid_temp: return Key_temp; - case Tid_search: return Key_search; - case Tid_html: return Key_html; + case Tid_cat: return Key_cat; + case Tid_search_core: return Key_search_core; + case Tid_wbase: return Key_wbase; + case Tid_cat_core: return Key_cat_core; + case Tid_cat_link: return Key_cat_link; + case Tid_wiki_solo: return Key_wiki_solo; + case Tid_text_solo: return Key_text_solo; + case Tid_html_solo: return Key_html_solo; + case Tid_html_data: return Key_html_data; + case Tid_file_solo: return Key_file_solo; + case Tid_file_core: return Key_file_core; + case Tid_file_data: return Key_file_data; + case Tid_file_user: return Key_file_user; default: throw Err_.unhandled(v); } } diff --git a/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_file_hash.java b/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_file_hash.java new file mode 100644 index 000000000..b9a822f31 --- /dev/null +++ b/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_file_hash.java @@ -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 . +*/ +package gplx.xowa.wikis.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; +class Xowd_db_file_hash { + private final OrderedHash hash = OrderedHash_.new_(); + public int Count_total() {return count_total;} private int count_total; + public void Clear() {hash.Clear(); count_total = 0;} + public void Del(Xowd_db_file file) { + OrderedHash tids = (OrderedHash)hash.Fetch(file.Tid()); + if (tids == null) throw Err_.new_("unknown file.tid: {0}=url", file.Url()); + if (!tids.Has(file.Id())) throw Err_.new_("unknown file.id: {0}=url", file.Url()); + tids.Del(file.Id()); + --count_total; + } + public void Add_or_new(Xowd_db_file file) { + byte tid = file.Tid(); + OrderedHash tids = (OrderedHash)hash.Fetch(tid); + if (tids == null) { + tids = OrderedHash_.new_(); + hash.Add(tid, tids); + } + tids.Add(file.Id(), file); + ++count_total; + } + public int Count_of_tid(byte tid) { + OrderedHash tids = (OrderedHash)hash.Fetch(tid); + return tids == null ? 0 : tids.Count(); + } +} diff --git a/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_init_db_mgr.java b/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_init_db_mgr.java deleted file mode 100644 index 0f6bd8ff2..000000000 --- a/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_init_db_mgr.java +++ /dev/null @@ -1,27 +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 . -*/ -package gplx.xowa.wikis.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; -public class Xowd_db_init_db_mgr { - private final OrderedHash wkrs = OrderedHash_.new_(); - private void Add(Xowd_db_init_db_wkr wkr) {wkrs.Add(wkr.Db_tid(), wkr);} - public Xowd_db_init_db_wkr Get(byte tid) {return (Xowd_db_init_db_wkr)wkrs.Fetch(tid);} - public static final Xowd_db_init_db_mgr I = new Xowd_db_init_db_mgr(); - Xowd_db_init_db_mgr() { - Add(gplx.xowa.html.hdumps.Xowd_db_init_wkr__html.I); - } -} diff --git a/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_init_tbl_mgr.java b/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_init_tbl_mgr.java deleted file mode 100644 index 5b1699623..000000000 --- a/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_init_tbl_mgr.java +++ /dev/null @@ -1,27 +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 . -*/ -package gplx.xowa.wikis.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; -public class Xowd_db_init_tbl_mgr { - private final OrderedHash wkrs = OrderedHash_.new_(); - private void Add(Xowd_db_init_tbl_wkr wkr) {wkrs.Add(wkr.Tbl_key(), wkr);} - public Xowd_db_init_tbl_wkr Get(String key) {return (Xowd_db_init_tbl_wkr)wkrs.Fetch(key);} - public static final Xowd_db_init_tbl_mgr I = new Xowd_db_init_tbl_mgr(); - Xowd_db_init_tbl_mgr() { - Add(gplx.xowa.html.hdumps.Xowd_db_init_wkr__html.I); - } -} diff --git a/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_init_tbl_wkr.java b/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_init_tbl_wkr.java deleted file mode 100644 index 3e1743abe..000000000 --- a/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_init_tbl_wkr.java +++ /dev/null @@ -1,22 +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 . -*/ -package gplx.xowa.wikis.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; -public interface Xowd_db_init_tbl_wkr { - String Tbl_key(); - Object Tbl_init(Xow_core_data_mgr core_data_mgr, Xowd_db_file db_file); -} diff --git a/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_layout.java b/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_layout.java new file mode 100644 index 000000000..c8961c29c --- /dev/null +++ b/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_layout.java @@ -0,0 +1,46 @@ +/* +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 . +*/ +package gplx.xowa.wikis.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; +public class Xowd_db_layout { + public Xowd_db_layout(int tid) {this.tid = tid;} + public int Tid() {return tid;} private final int tid; + public boolean Tid_is_all() {return tid == Const_all;} + public boolean Tid_is_all_or_few() {return tid != Const_lot;} + public boolean Tid_is_lot() {return tid == Const_lot;} + public String Name() { + switch (tid) { + case Const_all: return Name_all; + case Const_few: return Name_few; + case Const_lot: return Name_lot; + default: throw Err_.not_implemented_(); + } + } + public static final String Name_all = "all", Name_few = "few", Name_lot = "lot"; + public static final int Const_all = 1, Const_few = 2, Const_lot = 3; + public static final Xowd_db_layout + Itm_all = new Xowd_db_layout(Const_all) + , Itm_few = new Xowd_db_layout(Const_few) + , Itm_lot = new Xowd_db_layout(Const_lot) + ; + public static Xowd_db_layout get_(String v) { + if (String_.Eq(v, Name_all)) return Itm_all; + else if (String_.Eq(v, Name_few)) return Itm_few; + else if (String_.Eq(v, Name_lot)) return Itm_lot; + else throw Err_.not_implemented_(); + } +} diff --git a/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_mgr.java b/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_mgr.java new file mode 100644 index 000000000..d3ad7c691 --- /dev/null +++ b/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_mgr.java @@ -0,0 +1,145 @@ +/* +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 . +*/ +package gplx.xowa.wikis.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; +import gplx.dbs.*; import gplx.dbs.cfgs.*; +import gplx.xowa.dbs.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.wikis.*; import gplx.xowa.bldrs.infos.*; +public class Xowd_db_mgr { + private Xowd_db_file[] dbs__ary = new Xowd_db_file[0]; private int dbs__ary_len = 0; private final Xowd_db_file_hash db_file_hash = new Xowd_db_file_hash(); + private final Io_url wiki_root_dir; private final Xow_domain domain_itm; + public Xowd_db_mgr(Io_url wiki_root_dir, Xow_domain domain_itm) {this.wiki_root_dir = wiki_root_dir; this.domain_itm = domain_itm;} + public Xowd_core_db_props Props() {return props;} private Xowd_core_db_props props = Xowd_core_db_props.Test; + public Db_cfg_tbl Tbl__cfg() {return db__core.Tbl__cfg();} + public Xowd_page_tbl Tbl__page() {return db__core.Tbl__page();} + public Xowd_db_file Db__core() {return db__core;} private Xowd_db_file db__core; + public Xowd_db_file Db__text() {return db__text;} private Xowd_db_file db__text; + public Xowd_db_file Db__html() {return db__html;} private Xowd_db_file db__html; + public Xowd_db_file Db__cat_core() {return db__cat_core;} private Xowd_db_file db__cat_core; + public Xowd_db_file Db__search() {return db__search;} private Xowd_db_file db__search; + public Xowd_db_file Db__wbase() {return db__wbase;} private Xowd_db_file db__wbase; + public int Dbs__len() {return dbs__ary.length;} + public Xowd_db_file Dbs__get_at(int i) {return dbs__ary[i];} + public Xowd_db_file Dbs__make_by_tid(byte tid) { + int tid_idx = Get_tid_idx(db_file_hash, tid); + return Dbs__make_by_tid(tid, Xob_info_file.Ns_ids_empty, tid_idx, Get_tid_name(db_file_hash, tid_idx, tid)); + } + public Xowd_db_file Dbs__make_by_tid(byte tid, String ns_ids, int part_id, String file_name_suffix) { + Io_url url = wiki_root_dir.GenSubFil(domain_itm.Domain_str() + file_name_suffix); + Xowd_db_file rv = Xowd_db_file.make_(db__core.Info_session(), props, dbs__ary_len, tid, url, ns_ids, part_id, db__core.Url().NameAndExt(), Db_conn_bldr.I.New(url)); + Dbs__add_and_save(rv); + Dbs__set_by_tid(rv); + return rv; + } + public void Dbs__delete_by_tid(byte... tids) { + int len = dbs__ary_len; + for (int i = 0; i < len; ++i) { + Xowd_db_file db = dbs__ary[i]; + if (!Byte_.In(db.Tid(), tids)) continue; + db.Rls(); + Io_mgr._.DeleteFil_args(db.Url()).MissingFails_off().Exec(); + db.Cmd_mode_(Db_cmd_mode.Tid_delete); + } + db__core.Tbl__db().Commit_all(this); + this.Init_by_load(db__core.Url()); + } + public void Init_by_load(Io_url core_url) { + db_file_hash.Clear(); + Db_conn core_conn = Db_conn_bldr.I.Get(core_url); + props = Xowd_core_db_props.Cfg_load(core_url, core_conn); + Dbs__set_by_tid(Xowd_db_file.load_(props, Xowd_db_file_.Id_core, Core_db_tid(props.Layout_text()), core_url, Xob_info_file.Ns_ids_empty, Xob_info_file.Part_id_1st, Guid_adp_.Empty)); + dbs__ary = db__core.Tbl__db().Select_all(props, core_url.OwnerDir()); + dbs__ary_len = dbs__ary.length; + for (int i = 0; i < dbs__ary_len; i++) { + Xowd_db_file db = dbs__ary[i]; + Dbs__set_by_tid(db); + db_file_hash.Add_or_new(db); + } + } + public void Init_by_make(Xowd_core_db_props props, Xob_info_session info_session) { + this.props = props; + String core_file_name = Core_file_name(props.Layout_text(), domain_itm.Domain_str()); + byte core_db_tid = Core_db_tid(props.Layout_text()); + Io_url core_db_url = wiki_root_dir.GenSubFil(core_file_name); + Db_conn conn = Db_conn_bldr.I.New(core_db_url); + conn.Txn_bgn(); + Dbs__set_by_tid(Xowd_db_file.make_(info_session, props, Xowd_db_file_.Id_core, core_db_tid, core_db_url, Xob_info_file.Ns_ids_empty, Xob_info_file.Part_id_1st, core_file_name, conn)); + db__core.Tbl__db().Create_tbl(); + db__core.Tbl__ns().Create_tbl(); + db__core.Tbl__site_stats().Create_tbl(); + db__core.Tbl__page().Create_tbl(); + if (props.Layout_text().Tid_is_all_or_few()) { // create in advance else will fail for v2; import wiki -> wiki loads and tries to load categories; v2 category processes and builds tbl; DATE:2015-03-22 + db__core.Tbl__cat_core().Create_tbl(); + db__core.Tbl__cat_link().Create_tbl(); + } + Dbs__add_and_save(db__core); + db__core.Tbl__cfg().Insert_yn(Xow_cfg_consts.Grp__wiki_schema, Xow_cfg_consts.Key__schema__col_page_html_text_id, Bool_.Y); + props.Cfg_save(db__core.Tbl__cfg()); // NOTE: must save cfg now, especially zip_tid; latter will be reloaded after import is done; + conn.Txn_end(); + } + private void Dbs__set_by_tid(Xowd_db_file db) { + switch (db.Tid()) { + case Xowd_db_file_.Tid_wiki_solo: + case Xowd_db_file_.Tid_text_solo: + case Xowd_db_file_.Tid_core : {db__core = db; if (props.Layout_text().Tid_is_all_or_few()) db__cat_core = db__search = db; break;} + case Xowd_db_file_.Tid_text : {db__text = db; break;} + case Xowd_db_file_.Tid_html_data : {db__html = db; break;} + case Xowd_db_file_.Tid_search_core : {if (db__search == null) db__search = db; break;} + case Xowd_db_file_.Tid_wbase : {if (db__wbase == null) db__wbase = db; break;} + case Xowd_db_file_.Tid_cat_core : + case Xowd_db_file_.Tid_cat : {if (db__cat_core == null) db__cat_core = db; break;} + } + } + private void Dbs__add_and_save(Xowd_db_file rv) { + dbs__ary = (Xowd_db_file[])Array_.Resize(dbs__ary, dbs__ary_len + 1); + dbs__ary[dbs__ary_len++] = rv; + db__core.Tbl__db().Commit_all(this); + rv.Info_file().Save(rv.Tbl__cfg()); + rv.Info_session().Save(rv.Tbl__cfg()); + db_file_hash.Add_or_new(rv); + } + public void Rls() { + for (int i = 0; i < dbs__ary_len; i++) + dbs__ary[i].Rls(); + } + private int Get_tid_idx(Xowd_db_file_hash hash, byte tid) {return hash.Count_of_tid(tid) + Int_.Base1;} + private String Get_tid_name(Xowd_db_file_hash hash, int tid_idx, byte tid) { + String tid_name = Xowd_db_file_.To_key(tid); + String tid_idx_str = ""; + switch (tid) { + case Xowd_db_file_.Tid_cat_core : break; + case Xowd_db_file_.Tid_cat_link : tid_idx_str = "-db." + Int_.Xto_str_pad_bgn_zero(tid_idx, 3); break; + default : tid_idx_str = tid_idx == 1 ? "" : "-db." + Int_.Xto_str_pad_bgn_zero(tid_idx, 3); break; + } + return String_.Format("-{0}{1}.xowa", tid_name, tid_idx_str); // EX: en.wikipedia.org-text-001.sqlite3 + } + private static String Core_file_name(Xowd_db_layout layout, String domain_name) { + switch (layout.Tid()) { + case Xowd_db_layout.Const_all: return domain_name + ".xowa"; // EX: en.wikipedia.org.xowa + case Xowd_db_layout.Const_few: return domain_name + "-text.xowa"; // EX: en.wikipedia.org-text.xowa + case Xowd_db_layout.Const_lot: return domain_name + "-core.xowa"; // EX: en.wikipedia.org-core.xowa + default: throw Err_.not_implemented_(); + } + } + private static byte Core_db_tid(Xowd_db_layout layout) { + switch (layout.Tid()) { + case Xowd_db_layout.Const_all: return Xowd_db_file_.Tid_wiki_solo; + case Xowd_db_layout.Const_few: return Xowd_db_file_.Tid_text_solo; + case Xowd_db_layout.Const_lot: return Xowd_db_file_.Tid_core; + default: throw Err_.not_implemented_(); + } + } +} diff --git a/400_xowa/src/gplx/xowa/wikis/data/Xowd_ns_regy_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/Xowd_ns_regy_tbl.java deleted file mode 100644 index e37d252cc..000000000 --- a/400_xowa/src/gplx/xowa/wikis/data/Xowd_ns_regy_tbl.java +++ /dev/null @@ -1,113 +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 . -*/ -package gplx.xowa.wikis.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; -import gplx.dbs.*; import gplx.xowa.*; -public class Xowd_ns_regy_tbl { - private String tbl_name = "xowa_ns"; - private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); - private String fld_db_id, fld_ns_id, fld_ns_name, fld_ns_case, fld_ns_count, fld_ns_is_alias; - private String[] where_cols; - private boolean schema_is_1; - private Db_conn conn; - public void Conn_(Db_conn new_conn, boolean created, boolean schema_is_1) { - this.conn = new_conn; flds.Clear(); - this.schema_is_1 = schema_is_1; - if (schema_is_1) { - where_cols = String_.Ary(fld_ns_id); - fld_db_id = Db_meta_fld.Key_null; - } - else { - where_cols = String_.Ary(fld_db_id, fld_ns_id); - tbl_name = "wiki_ns_regy"; - fld_db_id = flds.Add_int("db_id"); - } - fld_ns_id = flds.Add_int("ns_id"); - fld_ns_name = flds.Add_str("ns_name", 255); - fld_ns_case = flds.Add_byte("ns_case"); - fld_ns_is_alias = flds.Add_bool("ns_is_alias"); - fld_ns_count = flds.Add_int("ns_count"); - if (created) { - Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds - , Db_meta_idx.new_unique_by_tbl_wo_null(tbl_name, "pkey", fld_db_id, fld_ns_id) - ); - conn.Exec_create_tbl_and_idx(meta); - } - } - public void Insert(int db_id, Xow_ns_mgr ns_mgr) { - Db_stmt stmt = Db_stmt_.Null; - try { - stmt = conn.Stmt_insert(tbl_name, flds); - int len = ns_mgr.Ids_len(); - for (int i = 0; i < len; i++) { - Xow_ns ns = ns_mgr.Ids_get_at(i); - stmt.Clear() - .Val_int(fld_db_id, db_id) - .Val_int(fld_ns_id, ns.Id()) - .Val_str(fld_ns_name, ns.Name_str()) - .Val_byte(fld_ns_case, ns.Case_match()) - .Val_bool_as_byte(fld_ns_is_alias, ns.Is_alias()) - .Val_int(fld_ns_count, ns.Count()) - .Exec_insert(); - ; - } - } finally {stmt.Rls();} - } - public void Select_all(int db_id, Xow_ns_mgr ns_mgr) { - Db_rdr rdr = Db_rdr_.Null; Db_stmt stmt = Db_stmt_.Null; - try { - String[] where = schema_is_1 ? Db_meta_fld.Ary_empy : String_.Ary(fld_db_id); - stmt = conn.Stmt_select(tbl_name, flds, where); - rdr = stmt.Clear() - .Crt_int(fld_db_id, db_id) - .Exec_select_as_rdr() - ; - ns_mgr.Clear(); - while (rdr.Move_next()) { - int ns_id = rdr.Read_int(fld_ns_id); - byte[] ns_name = rdr.Read_bry_by_str(fld_ns_name); - byte ns_case_match = rdr.Read_byte(fld_ns_case); - int ns_count = rdr.Read_int(fld_ns_count); - boolean ns_is_alias = rdr.Read_bool_by_byte(fld_ns_is_alias); - ns_mgr.Add_new(ns_id, ns_name, ns_case_match, ns_is_alias); - if (ns_id < 0) continue; // don't load counts for Special / Media - Xow_ns ns = ns_mgr.Ids_get_or_null(ns_id); - ns.Count_(ns_count); - if (ns_count > 0) ns.Exists_(true); // ns has article; mark it as exists, else Talk tab won't show; DATE:2013-12-04 - } - ns_mgr.Init(); - } finally {rdr.Rls(); stmt.Rls();} - } - public int Select_ns_count(int db_id, int ns_id) { - Db_stmt stmt = conn.Stmt_select(tbl_name, where_cols, fld_ns_count); - Db_rdr rdr = Db_rdr_.Null; - try { - rdr = stmt.Crt_int(fld_db_id, db_id).Crt_int(fld_ns_id, ns_id).Exec_select_as_rdr(); - return rdr.Move_next() ? rdr.Read_int(fld_ns_count) : 0; - } - finally { - rdr.Rls(); - } - } - public void Update_ns_count(int db_id, int ns_id, int ns_count) { - Db_stmt stmt = conn.Stmt_update(tbl_name, where_cols, fld_ns_count); - stmt.Clear() - .Crt_int(fld_db_id, db_id) - .Crt_int(fld_ns_id, ns_id).Val_int(fld_ns_count, ns_count) - .Exec_update(); - } -} diff --git a/400_xowa/src/gplx/xowa/wikis/data/Xowd_pg_regy_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/Xowd_pg_regy_tbl.java deleted file mode 100644 index 2083e46c1..000000000 --- a/400_xowa/src/gplx/xowa/wikis/data/Xowd_pg_regy_tbl.java +++ /dev/null @@ -1,142 +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 . -*/ -package gplx.xowa.wikis.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; -import gplx.dbs.*; import gplx.xowa.*; import gplx.xowa.dbs.*; -public class Xowd_pg_regy_tbl { - private String tbl_name = "wiki_page_regy"; - private String fld_db_id, fld_page_id, fld_page_ns, fld_page_title, fld_page_is_redirect, fld_page_touched, fld_page_len, fld_page_random_int, fld_page_text_db_id, fld_page_html_db_id, fld_page_redirect_id; - private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); - private String[] flds_select() {return String_.Ary(fld_page_id, fld_page_ns, fld_page_title, fld_page_touched, fld_page_is_redirect, fld_page_len, fld_page_text_db_id, fld_page_html_db_id, fld_page_redirect_id);} - private Db_conn conn; private Db_stmt stmt_select_all_by_ttl, stmt_select_all_by_id, stmt_select_id_by_ttl, stmt_insert; - private int db_id; - public String Tbl_name() {return tbl_name;} - public Db_meta_fld Fld_html_db_id() {return flds.Get_by(fld_page_html_db_id);} - public Db_meta_fld Fld_page_redirect_id() {return flds.Get_by(fld_page_redirect_id);} - public void Conn_(Db_conn new_conn, boolean created, boolean schema_is_1, int db_id, boolean hdump_enabled) { - this.conn = new_conn; flds.Clear(); this.db_id = db_id; - String page_text_db_id_key = "page_text_db_id"; - if (schema_is_1) { - tbl_name = "page"; - page_text_db_id_key = "page_file_idx"; - fld_db_id = Db_meta_fld.Key_null; - } - else { - fld_db_id = flds.Add_int("db_id"); - } - fld_page_id = flds.Add_int("page_id"); // int(10); unsigned -- MW:same - fld_page_ns = flds.Add_int("page_namespace"); // int(11); -- MW:same - fld_page_title = flds.Add_str("page_title", 255); // varbinary(255); -- MW:blob - fld_page_is_redirect = flds.Add_int("page_is_redirect"); // tinyint(3); -- MW:same - fld_page_touched = flds.Add_str("page_touched", 14); // binary(14); -- MW:blob; NOTE: should be revision!rev_timestamp, but needs extra join - fld_page_len = flds.Add_int("page_len"); // int(10); unsigned -- MW:same except NULL REF: WikiPage.php!updateRevisionOn;" - fld_page_random_int = flds.Add_int("page_random_int"); // MW:XOWA - fld_page_text_db_id = flds.Add_int(page_text_db_id_key); // MW:XOWA - if (schema_is_1 && !hdump_enabled) { - fld_page_html_db_id = Db_meta_fld.Key_null; - fld_page_redirect_id = Db_meta_fld.Key_null; - } - else { - Hdump_enabled_(Bool_.Y); - } - if (created) { - Db_meta_tbl meta_tbl = Db_meta_tbl.new_(tbl_name, flds.To_fld_ary() - , Db_meta_idx.new_unique_by_tbl_wo_null(tbl_name, "pkey" , fld_db_id, fld_page_id) - , Db_meta_idx.new_normal_by_tbl_wo_null(tbl_name, "title" , fld_db_id, fld_page_ns, fld_page_title, fld_page_id, fld_page_len, fld_page_is_redirect) - , Db_meta_idx.new_normal_by_tbl_wo_null(tbl_name, "random" , fld_db_id, fld_page_ns, fld_page_random_int) - ); - conn.Exec_create_tbl_and_idx(meta_tbl); - } - stmt_insert = stmt_select_all_by_ttl = stmt_select_all_by_id = stmt_select_id_by_ttl = null; - } - private void Hdump_enabled_(boolean v) { - if (v) { - fld_page_html_db_id = flds.Add_int_dflt("page_html_db_id", -1); // MW:XOWA - fld_page_redirect_id = flds.Add_int_dflt("page_redirect_id", -1); // MW:XOWA - } - else { - fld_page_html_db_id = Db_meta_fld.Key_null; - fld_page_redirect_id = Db_meta_fld.Key_null; - } - } - public boolean Select_by_ttl(Xodb_page rv, Xow_ns ns, byte[] ttl) { - Db_rdr rdr = Db_rdr_.Null; - try { - if (stmt_select_all_by_ttl == null) stmt_select_all_by_ttl = conn.Rls_reg(conn.Stmt_select(tbl_name, flds.To_str_ary(), String_.Ary_wo_null(fld_db_id, fld_page_ns, fld_page_title))); - rdr = stmt_select_all_by_ttl.Clear().Crt_int(fld_db_id, db_id).Crt_int(fld_page_ns, ns.Id()).Crt_str(fld_page_title, String_.new_utf8_(ttl)).Exec_select_as_rdr(); - if (rdr.Move_next()) { - Read_page__all(rv, rdr); - return true; - } - } - finally {rdr.Rls();} - return false; - } - public boolean Select_by_id(Xodb_page rv, int page_id) { - Db_rdr rdr = Db_rdr_.Null; - try { - if (stmt_select_all_by_id == null) stmt_select_all_by_id = conn.Rls_reg(conn.Stmt_select(tbl_name, flds_select(), String_.Ary_wo_null(fld_db_id, fld_page_id))); - rdr = stmt_select_all_by_id.Clear().Crt_int(fld_db_id, db_id).Crt_int(fld_page_id, page_id).Exec_select_as_rdr(); - if (rdr.Move_next()) { - Read_page__all(rv, rdr); - return true; - } - } - finally {rdr.Rls();} - return false; - } - public int Select_id(int ns_id, byte[] ttl) { - Db_rdr rdr = Db_rdr_.Null; - if (stmt_select_id_by_ttl == null) stmt_select_id_by_ttl = conn.Rls_reg(conn.Stmt_select(tbl_name, flds_select(), String_.Ary_wo_null(fld_db_id, fld_page_ns, fld_page_title))); - try { - rdr = stmt_select_id_by_ttl.Crt_int(fld_db_id, db_id).Crt_int(fld_page_ns, ns_id).Crt_bry_as_str(fld_page_title, ttl).Exec_select_as_rdr(); - return rdr.Move_next() ? rdr.Read_int(fld_page_id) : Xodb_mgr_sql.Page_id_null; - } finally {rdr.Rls();} - } - public void Insert(int page_id, int ns_id, byte[] ttl_wo_ns, boolean page_is_redirect, DateAdp modified_on, int page_len, int random_int, int file_idx, int html_db_id) { - if (stmt_insert == null) stmt_insert = conn.Rls_reg(conn.Stmt_insert(tbl_name, flds.To_str_ary())); - stmt_insert.Clear() - .Val_int(fld_db_id, db_id) - .Val_int(fld_page_id, page_id) - .Val_int(fld_page_ns, ns_id) - .Val_str(fld_page_title, String_.new_utf8_(ttl_wo_ns)) - .Val_byte(fld_page_is_redirect, (byte)(page_is_redirect ? 1 : 0)) - .Val_str(fld_page_touched, modified_on.XtoStr_fmt(Page_touched_fmt)) - .Val_int(fld_page_len, page_len) - .Val_int(fld_page_random_int, random_int) - .Val_int(fld_page_text_db_id, file_idx) - .Exec_insert(); - } - public void Update_html_db_id(int page_id, int html_db_id) { - Db_stmt stmt = conn.Stmt_update(tbl_name, String_.Ary_wo_null(fld_db_id, fld_page_id), fld_page_html_db_id); - stmt.Val_int(fld_page_html_db_id, html_db_id).Crt_int(fld_db_id, db_id).Crt_int(fld_page_id, page_id).Exec_update(); - } - private void Read_page__all(Xodb_page page, Db_rdr rdr) { - page.Init_by_sql - ( rdr.Read_int(fld_page_id) - , rdr.Read_int(fld_page_ns) - , rdr.Read_bry_by_str(fld_page_title) - , DateAdp_.parse_fmt(rdr.Read_str(fld_page_touched), Page_touched_fmt) - , rdr.Read_bool_by_byte(fld_page_is_redirect) - , rdr.Read_int(fld_page_len) - , rdr.Read_int(fld_page_text_db_id) - , rdr.Read_int(fld_page_html_db_id) - , rdr.Read_int(fld_page_redirect_id) - ); - } - private static final String Page_touched_fmt = "yyyyMMddHHmmss"; -} diff --git a/400_xowa/src/gplx/xowa/wikis/data/Xowe_core_data_mgr.java b/400_xowa/src/gplx/xowa/wikis/data/Xowe_core_data_mgr.java deleted file mode 100644 index 250a0750e..000000000 --- a/400_xowa/src/gplx/xowa/wikis/data/Xowe_core_data_mgr.java +++ /dev/null @@ -1,143 +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 . -*/ -package gplx.xowa.wikis.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; -import gplx.dbs.*; import gplx.dbs.cfgs.*; import gplx.dbs.engines.sqlite.*; -import gplx.xowa.wikis.data.*; import gplx.xowa.dbs.*; import gplx.xowa.dbs.tbls.*; -public class Xowe_core_data_mgr implements Xow_core_data_mgr { - private Xowd_db_file[] dbs__ary = new Xowd_db_file[0]; private int dbs__ary_len = 0; - private final Io_url src_dir; private final Io_url trg_dir; private final String domain_str; - public Xowe_core_data_mgr(Io_url src_dir, Io_url trg_dir, String domain_str) {this.src_dir = src_dir; this.trg_dir = trg_dir; this.domain_str = domain_str;} - public Xow_core_data_map Map() {return map;} private final Xow_core_data_map map = new Xow_core_data_map(); - public boolean Cfg__schema_is_1() {return Bool_.Y;} - public int Cfg__db_id() {return 1;} - public byte Cfg__hdump_zip_tid() {return Tbl__cfg().Select_as_byte_or("xowa.schema.dbs.html", "zip_tid", gplx.ios.Io_stream_.Tid_bzip2);} - public Db_cfg_tbl Tbl__cfg() {return tbl__cfg;} private final Db_cfg_tbl tbl__cfg = new Db_cfg_tbl(); - public Xodb_xowa_db_tbl Tbl__db() {return tbl__db;} private final Xodb_xowa_db_tbl tbl__db = new Xodb_xowa_db_tbl(); - public Xowd_pg_regy_tbl Tbl__pg() {return tbl__pg;} private final Xowd_pg_regy_tbl tbl__pg = new Xowd_pg_regy_tbl(); - public int Dbs__len() {return dbs__ary.length;} - public Xowd_db_file Dbs__get_db_core() {return dbs__ary[0];} - public Xowd_db_file Dbs__get_at(int i) {return dbs__ary[i];} - public Xowd_db_file Dbs__get_by_tid_1st(byte tid) { - if (tid == Xowd_db_file_.Tid_core && dbs__ary_len != 0) return dbs__ary[0]; - for (int i = 0; i < dbs__ary_len; i++) { - Xowd_db_file file = dbs__ary[i]; - if (file.Tid() == tid) return file; - } - return Xowd_db_file.Null; - } - public Xowd_db_file Dbs__get_by_tid_nth_or_new(byte tid) { - Xowd_db_file rv = Xowd_db_file.Null; - for (int i = 0; i < dbs__ary_len; i++) { - Xowd_db_file file = dbs__ary[i]; - if (file.Tid() == tid) rv = file; - } - if (rv == Xowd_db_file.Null) { - Xowd_db_init_db_wkr wkr = Xowd_db_init_db_mgr.I.Get(tid); - rv = wkr.Db_make(this); - } - return rv; - } - public void Dbs__save() {tbl__db.Commit_all(this);} - public Xowd_db_file Dbs__add_new(byte file_tid) { - int file_idx = dbs__ary_len; - Io_url url = Create_sqlite3(src_dir, trg_dir, domain_str, file_idx); - Xowd_db_file rv = Xowd_db_file.make_(file_idx, file_tid, url.NameAndExt()).Connect_(Db_url_.sqlite_(url)); - rv.Url_(url); - Db_conn core_conn = rv.Conn(); boolean created = Bool_.N; boolean schema_is_1 = Bool_.Y; int db_id = 1; - if (file_idx == 0) { - tbl__db.Conn_(core_conn, created, schema_is_1); - tbl__pg.Conn_(core_conn, created, schema_is_1, db_id, Bool_.N); - } - tbl__cfg.Conn_(core_conn, created, schema_is_1, "xowa_cfg", "wiki_cfg_regy"); - Xodb_xowa_cfg_tbl.Insert_str(rv.Conn(), Cfg_grp_db_meta, "type_name", Xowd_db_file_.Xto_key(file_tid)); - dbs__ary = (Xowd_db_file[])Array_.Resize(dbs__ary, dbs__ary_len + 1); - dbs__ary[dbs__ary_len++] = rv; - return rv; - } - public void Core_conn_(Db_conn new_conn, boolean created, boolean schema_is_1, int db_id, boolean hdump_enabled) { - tbl__cfg.Conn_(new_conn, created, schema_is_1, "xowa_cfg", "wiki_cfg_regy"); - tbl__db.Conn_(new_conn, created, schema_is_1); - tbl__pg.Conn_(new_conn, created, schema_is_1, db_id, hdump_enabled); - } - public Db_conn Conn_core() {return provider_core;} private Db_conn provider_core; - public Db_conn Conn_page() {return provider_page;} private Db_conn provider_page; - public Db_conn Conn_ctg() {return provider_ctg;} public void Conn_ctg_(Xowd_db_file file) {provider_ctg = file.Conn();} private Db_conn provider_ctg; - public Db_conn Conn_wdata() {return provider_wdata;}public void Conn_wdata_(Xowd_db_file file) {provider_wdata = file.Conn();} private Db_conn provider_wdata; - public int Tid_text_idx() {return tid_text_idx;} public Xowe_core_data_mgr Tid_text_idx_(int v) {tid_text_idx = v; return this;} private int tid_text_idx = File_id_core; - public long Tid_text_max() {return tid_text_max;} private long tid_text_max = Heap_max_infinite; - public void Init_by_files(Db_conn p, Xowd_db_file[] v) { - dbs__ary = v; dbs__ary_len = v.length; - boolean category_provider_core_null = true; - for (int i = 0; i < dbs__ary_len; i++) { - Xowd_db_file file = dbs__ary[i]; - Io_url url = trg_dir.GenSubFil(file.Url_rel()); // relative name only - file.Connect_(Db_url_.sqlite_(url)).Url_(url); - switch (file.Tid()) { - case Xowd_db_file_.Tid_core : file.Conn_(p); Set_file_core(file); break; - case Xowd_db_file_.Tid_category : if (category_provider_core_null) {Conn_ctg_(file); category_provider_core_null = false;} break; - case Xowd_db_file_.Tid_wikidata : Conn_wdata_(file); break; - case Xowd_db_file_.Tid_text : Set_file_text(file); break; - } - } - } - public void Init_by_ns_map(Xow_ns_mgr ns_mgr, String ns_map_str, long text_max) { - Set_file_core(Dbs__add_new(Xowd_db_file_.Tid_core)); - Xodb_ns_map_mgr ns_map = Xodb_ns_map_mgr.Parse(Bry_.new_ascii_(ns_map_str)); - Xodb_ns_map_itm[] ns_map_itms = ns_map.Itms(); - int ns_map_itms_len = ns_map_itms.length; - for (int i = 0; i < ns_map_itms_len; i++) { - Xodb_ns_map_itm itm = ns_map_itms[i]; - int[] ns_ids = itm.Ns_ids(); - int ns_ids_len = ns_ids.length; - Xowd_db_file file = Dbs__add_new(Xowd_db_file_.Tid_text); - 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_file_idx_(file.Id()); - } - } - if (text_max > 0) - Set_file_text(Dbs__add_new(Xowd_db_file_.Tid_text).File_max_(text_max)); - } - private void Set_file_core(Xowd_db_file file) {provider_core = provider_page = provider_ctg = provider_wdata = file.Conn();} - private void Set_file_text(Xowd_db_file file) {tid_text_idx = file.Id(); tid_text_max = file.File_max();} - public Io_url Get_url(byte file_tid) { - Xowd_db_file file = Dbs__get_by_tid_1st(file_tid); - return trg_dir.GenSubFil(file.Url_rel()); - } - public void Index_create(Gfo_usr_dlg usr_dlg, byte[] tids, Db_idx_itm... idxs) { - for (int i = 0; i < dbs__ary_len; i++) { - Xowd_db_file file = dbs__ary[i]; - if (Byte_.In(file.Tid(), tids)) - Sqlite_engine_.Idx_create(usr_dlg, file.Conn(), Int_.Xto_str(file.Id()), idxs); - } - } - public void Rls() { - for (int i = 0; i < dbs__ary_len; i++) - dbs__ary[i].Rls(); - } - private static Io_url Create_sqlite3(Io_url src_dir, Io_url trg_dir, String domain_str, int file_idx) { - Io_url src_fil = src_dir.GenSubFil("xowa.sqlite3"); // /bin/any/sql/xowa/xowa.sqlite3 - Io_url trg_fil = trg_dir.GenSubFil_ary(domain_str, ".", Int_.Xto_str_pad_bgn(file_idx, 3), ".sqlite3"); // /wiki/en.wikipedia.org/en.wikipedia.org.000.sqlite3 - Io_mgr._.CopyFil(src_fil, trg_fil, true); - return trg_fil; - } - private static final int File_id_core = 0; - public static final int Heap_max_infinite = 0; - public static final String Cfg_grp_db_meta = "db.meta"; -} diff --git a/400_xowa/src/gplx/xowa/wikis/data/Xowv_core_data_mgr.java b/400_xowa/src/gplx/xowa/wikis/data/Xowv_core_data_mgr.java deleted file mode 100644 index 6c4c02374..000000000 --- a/400_xowa/src/gplx/xowa/wikis/data/Xowv_core_data_mgr.java +++ /dev/null @@ -1,65 +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 . -*/ -package gplx.xowa.wikis.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; -import gplx.dbs.*; import gplx.dbs.cfgs.*; import gplx.xowa.dbs.*; import gplx.xowa.dbs.tbls.*; -import gplx.xowa.*; import gplx.xowa.wikis.data.*; -public class Xowv_core_data_mgr implements Xow_core_data_mgr { - private final String domain_str; private final Io_url wiki_root_dir; - private Xowd_db_file[] dbs__ary; private boolean init_done = false; - public Xowv_core_data_mgr(String domain_str, Io_url wiki_root_dir) { - this.domain_str = domain_str; this.wiki_root_dir = wiki_root_dir; - } - public Xow_core_data_map Map() {return map;} private final Xow_core_data_map map = new Xow_core_data_map(); - public boolean Cfg__schema_is_1() {return Bool_.Y;} - public int Cfg__db_id() {return 1;} - public byte Cfg__hdump_zip_tid() {return Tbl__cfg().Select_as_byte_or("xowa.schema.dbs.html", "zip_tid", gplx.ios.Io_stream_.Tid_bzip2);} - public Db_cfg_tbl Tbl__cfg() {return tbl__cfg;} private final Db_cfg_tbl tbl__cfg = new Db_cfg_tbl(); - public Xodb_xowa_db_tbl Tbl__db() {return tbl__db;} private final Xodb_xowa_db_tbl tbl__db = new Xodb_xowa_db_tbl(); - public Xowd_ns_regy_tbl Tbl__ns() {return tbl__ns;} private final Xowd_ns_regy_tbl tbl__ns = new Xowd_ns_regy_tbl(); - public Xowd_pg_regy_tbl Tbl__pg() {return tbl__pg;} private final Xowd_pg_regy_tbl tbl__pg = new Xowd_pg_regy_tbl(); - public int Dbs__len() {return dbs__ary_len;} private int dbs__ary_len; - public Xowd_db_file Dbs__get_db_core() {return dbs__ary[0];} - public Xowd_db_file Dbs__get_at(int i) {if (!Int_.Between(i, 0, dbs__ary_len)) throw Err_.new_("database does not exist: idx={0}", i); return dbs__ary[i];} - public Xowd_db_file Dbs__get_by_tid_nth_or_new(byte tid) { - Xowd_db_file rv = Xowd_db_file.Null; - for (int i = 0; i < dbs__ary_len; i++) { - Xowd_db_file file = dbs__ary[i]; - if (file.Tid() == tid) rv = file; - } - if (rv == Xowd_db_file.Null) - throw Err_.not_implemented_msg_("view_mode doesn't allow creating databases"); - return rv; - } - public boolean Init() { - if (init_done) return false; - init_done = true; - if (String_.Eq(domain_str, "xowa")) return true; // FIXME: ignore "xowa" for now; WHEN:converting xowa to sqlitedb - Io_url core_db_url = wiki_root_dir.GenSubFil_ary(domain_str, ".000.sqlite3"); - Db_conn_bldr_data conn_data = Db_conn_bldr.I.Get_or_new("", core_db_url); - Db_conn core_conn = conn_data.Conn(); boolean created = conn_data.Created(); - if (Op_sys.Cur().Tid_is_drd()) created = Bool_.Y; // WORKAROUND.DRD:Android returns File.exists of false for files in /data/file/; DATE:2015-02-26 - boolean schema_is_1 = Bool_.Y; int db_id = 1; - tbl__cfg.Conn_(core_conn, created, schema_is_1, "xowa_cfg", "wiki_cfg_regy"); - tbl__db.Conn_(core_conn, created, schema_is_1); - tbl__ns.Conn_(core_conn, created, schema_is_1); - tbl__pg.Conn_(core_conn, created, schema_is_1, db_id, Bool_.Y); - dbs__ary = tbl__db.Select_all(wiki_root_dir); - dbs__ary_len = dbs__ary.length; - return true; - } -} diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_core_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_core_tbl.java new file mode 100644 index 000000000..c1a420479 --- /dev/null +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_core_tbl.java @@ -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 . +*/ +package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; +import gplx.dbs.*; +public class Xowd_cat_core_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_pages, fld_subcats, fld_files, fld_hidden, fld_link_db_id; + private final Db_conn conn; private Db_stmt stmt_insert, stmt_update, stmt_select; + private final Xowd_cat_core_tbl__in_wkr in_wkr = new Xowd_cat_core_tbl__in_wkr(); + public Db_conn Conn() {return conn;} + public Xowd_cat_core_tbl(Db_conn conn, boolean schema_is_1) { + this.conn = conn; + String fld_link_db_id_name = ""; + if (schema_is_1) {tbl_name = "category"; fld_link_db_id_name = "cat_file_idx";} + else {tbl_name = "cat_core"; fld_link_db_id_name = "cat_link_db_id";} + fld_id = flds.Add_int_pkey ("cat_id"); + fld_pages = flds.Add_int ("cat_pages"); + fld_subcats = flds.Add_int ("cat_subcats"); + fld_files = flds.Add_int ("cat_files"); + fld_hidden = flds.Add_byte ("cat_hidden"); + fld_link_db_id = flds.Add_int(fld_link_db_id_name); + in_wkr.Ctor(this, tbl_name, flds, fld_id); + conn.Rls_reg(this); + } + public Xowd_cat_core_tbl Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds)); return this;} + public void Insert_bgn() {conn.Txn_bgn(); stmt_insert = conn.Stmt_insert(tbl_name, flds);} + public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} + public void Insert_cmd_by_batch(int id, int pages, int subcats, int files, byte hidden, int link_db_id) { + stmt_insert.Clear() + .Val_int(fld_id, id).Val_int(fld_pages, pages).Val_int(fld_subcats, subcats).Val_int(fld_files, files) + .Val_byte(fld_hidden, hidden).Val_int(fld_link_db_id, link_db_id) + .Exec_insert(); + } + public void Update_bgn() {conn.Txn_bgn(); stmt_update = conn.Stmt_update(tbl_name, String_.Ary(fld_id), fld_hidden);} + public void Update_end() {conn.Txn_end(); stmt_update = Db_stmt_.Rls(stmt_update);} + public void Update_by_batch(int id, byte hidden) { + stmt_update.Clear().Val_byte(fld_hidden, hidden).Crt_int(fld_id, id).Exec_update(); + } + public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empy).Exec_delete();;} + public Xowd_category_itm Select(int id) { + if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_id); + Db_rdr rdr = stmt_select.Clear().Crt_int(fld_id, id).Exec_select__rls_manual(); + try {return rdr.Move_next() ? new_itm(rdr) : Xowd_category_itm.Null;} finally {rdr.Rls();} + } + public void Select_by_cat_id_in(Cancelable cancelable, OrderedHash rv, int bgn, int end) { + in_wkr.Init(rv); + in_wkr.Select_in(cancelable, conn, bgn, end); + } + public Xowd_category_itm new_itm(Db_rdr rdr) { + return Xowd_category_itm.load_ + ( rdr.Read_int(fld_id) + , rdr.Read_int(fld_link_db_id) + , rdr.Read_bool_by_byte(fld_hidden) + , rdr.Read_int(fld_subcats) + , rdr.Read_int(fld_files) + , rdr.Read_int(fld_pages) + ); + } + public void Rls() { + stmt_insert = Db_stmt_.Rls(stmt_insert); + stmt_update = Db_stmt_.Rls(stmt_update); + stmt_select = Db_stmt_.Rls(stmt_select); + } +} diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_core_tbl__in_wkr.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_core_tbl__in_wkr.java new file mode 100644 index 000000000..5b3c1416c --- /dev/null +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_core_tbl__in_wkr.java @@ -0,0 +1,45 @@ +/* +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 . +*/ +package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; +import gplx.dbs.*; import gplx.dbs.utls.*; +class Xowd_cat_core_tbl__in_wkr extends Db_in_wkr__base { + private Xowd_cat_core_tbl tbl; + private String tbl_name, fld_cat_id; private Db_meta_fld_list flds; private OrderedHash hash; + public void Ctor(Xowd_cat_core_tbl tbl, String tbl_name, Db_meta_fld_list flds, String fld_cat_id) { + this.tbl = tbl; this.tbl_name = tbl_name; this.flds = flds; this.fld_cat_id = fld_cat_id; + } + public void Init(OrderedHash hash) {this.hash = hash;} + @Override protected Db_qry Make_qry(int bgn, int end) { + Object[] part_ary = In_ary(end - bgn); + return Db_qry_.select_cols_(tbl_name, Db_crt_.in_(fld_cat_id, part_ary), flds.To_str_ary()); + } + @Override protected void Fill_stmt(Db_stmt stmt, int bgn, int end) { + for (int i = bgn; i < end; i++) { + Xowd_page_itm itm = (Xowd_page_itm)hash.FetchAt(i); + stmt.Crt_int(fld_cat_id, itm.Id()); + } + } + @Override protected void Read_data(Cancelable cancelable, Db_rdr rdr) { + while (rdr.Move_next()) { + if (cancelable.Canceled()) return; + Xowd_category_itm ctg_data = tbl.new_itm(rdr); + Xowd_page_itm page = (Xowd_page_itm)hash.Fetch(ctg_data.Id_val()); + page.Xtn_(ctg_data); + } + } +} diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_link_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_link_tbl.java new file mode 100644 index 000000000..9c9515bce --- /dev/null +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_link_tbl.java @@ -0,0 +1,89 @@ +/* +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 . +*/ +package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; +import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.xowa.ctgs.*; +public class Xowd_cat_link_tbl implements RlsAble { + private final String tbl_name; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private final String fld_from, fld_to_id, fld_sortkey, fld_timestamp, fld_type_id; + private final Db_conn conn; private Db_stmt stmt_insert, stmt_select_in; + public Db_conn Conn() {return conn;} + public Xowd_cat_link_tbl(Db_conn conn, boolean schema_is_1) { + this.conn = conn; + this.tbl_name = schema_is_1 ? "categorylinks" : "cat_link"; + fld_from = flds.Add_int ("cl_from"); + fld_to_id = flds.Add_int ("cl_to_id"); + fld_type_id = flds.Add_byte ("cl_type_id"); + fld_sortkey = flds.Add_str ("cl_sortkey", 230); + fld_timestamp = flds.Add_str ("cl_timestamp", 14); + conn.Rls_reg(this); + } + public Xowd_cat_link_tbl Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds)); return this;} + public void Create_idx() { + conn.Ddl_create_idx(Xoa_app_.Usr_dlg() + , Db_meta_idx.new_normal_by_tbl(tbl_name, "main", fld_to_id, fld_type_id, fld_sortkey, fld_from) + , Db_meta_idx.new_normal_by_tbl(tbl_name, "from", fld_from) + ); + } + public void Insert_bgn() {conn.Txn_bgn(); stmt_insert = conn.Stmt_insert(tbl_name, flds);} + public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} + public void Insert_cmd_by_batch(int page_id, int ctg_page_id, byte ctg_tid, byte[] sortkey, int timestamp) { + stmt_insert.Clear() + .Val_int(fld_from , page_id) + .Val_int(fld_to_id , ctg_page_id) + .Val_byte(fld_type_id , ctg_tid) + .Val_bry_as_str(fld_sortkey , sortkey) + .Val_int(fld_timestamp , timestamp) + .Exec_insert(); + } + public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empy).Exec_delete();} + public int Select_by_type(ListAdp list, int cat_page_id, byte arg_tid, byte[] arg_sortkey, boolean arg_is_from, int limit) { + String arg_sortkey_str = arg_sortkey == null ? "" : String_.new_utf8_(arg_sortkey); + gplx.core.criterias.Criteria comp_crt = !arg_is_from + ? Db_crt_.mte_(fld_sortkey, arg_sortkey_str) // from: sortkey >= 'val' + : Db_crt_.lte_(fld_sortkey, arg_sortkey_str); // until: sortkey <= 'val' + Db_qry__select_cmd qry = Db_qry_.select_().Cols_(fld_from, fld_sortkey).From_(tbl_name) + .Where_(gplx.core.criterias.Criteria_.And_many(Db_crt_.eq_(fld_to_id, -1), Db_crt_.eq_(fld_type_id, arg_tid), comp_crt)) + .OrderBy_(fld_sortkey, !arg_is_from) + .Limit_(limit + 1); // + 1 to get last_plus_one for next page / previous page + Db_rdr rdr = conn.Stmt_new(qry).Crt_int(fld_to_id, cat_page_id).Crt_byte(fld_type_id, arg_tid).Crt_str(fld_sortkey, arg_sortkey_str).Exec_select__rls_auto(); + int count = 0; + try { + while (rdr.Move_next()) { + int itm_page_id = rdr.Read_int(fld_from); + byte[] itm_sortkey = rdr.Read_bry_by_str(fld_sortkey); + Xowd_page_itm itm = new Xowd_page_itm().Id_(itm_page_id).Xtn_(new Xoctg_page_xtn(arg_tid, itm_sortkey)); + list.Add(itm); + ++count; + } + } finally {rdr.Rls();} + list.SortBy(Xowd_page_itm_sorter.Ctg_tid_sortkey_asc); + return count; + } + public void Select_in(ListAdp rv, int cat_id) { + if (stmt_select_in == null) stmt_select_in = conn.Stmt_select(tbl_name, flds, fld_to_id); + Db_rdr rdr = stmt_select_in.Clear().Crt_int(fld_to_id, cat_id).Exec_select__rls_manual(); + try { + while (rdr.Move_next()) + rv.Add(new Xowd_page_itm().Id_(rdr.Read_int(fld_from))); + } finally {rdr.Rls();} + } + public void Rls() { + stmt_insert = Db_stmt_.Rls(stmt_insert); + stmt_select_in = Db_stmt_.Rls(stmt_select_in); + } +} diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_category_itm.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_category_itm.java similarity index 70% rename from 400_xowa/src/gplx/xowa/dbs/tbls/Xodb_category_itm.java rename to 400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_category_itm.java index 9a982117d..97858925f 100644 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_category_itm.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_category_itm.java @@ -15,17 +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 . */ -package gplx.xowa.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*; +package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; import gplx.core.primitives.*; import gplx.xowa.ctgs.*; -public class Xodb_category_itm { +public class Xowd_category_itm { public int Id() {return id;} private int id; public Int_obj_val Id_val() {if (id_val == null) id_val = Int_obj_val.new_(id); return id_val;} Int_obj_val id_val; public int File_idx() {return file_idx;} private int file_idx; public boolean Hidden() {return hidden;} private boolean hidden; - public int Count_all() {return count_subcs + count_files + count_pages;} - public int Count_subcs() {return count_subcs;} private int count_subcs; - public int Count_files() {return count_files;} private int count_files; - public int Count_pages() {return count_pages;} private int count_pages; + public int Count_all() {return count_subcs + count_files + count_pages;} + public int Count_subcs() {return count_subcs;} private int count_subcs; + public int Count_files() {return count_files;} private int count_files; + public int Count_pages() {return count_pages;} private int count_pages; public int Count_by_tid(byte tid) { switch (tid) { case Xoa_ctg_mgr.Tid_subc: return count_subcs; @@ -34,11 +34,11 @@ public class Xodb_category_itm { default: throw Err_.unhandled(tid); } } - public static Xodb_category_itm load_(int id, int file_idx, boolean hidden, int count_subcs, int count_files, int count_pages) { - Xodb_category_itm rv = new Xodb_category_itm(); + public static Xowd_category_itm load_(int id, int file_idx, boolean hidden, int count_subcs, int count_files, int count_pages) { + Xowd_category_itm rv = new Xowd_category_itm(); rv.id = id; rv.file_idx = file_idx; rv.hidden = hidden; rv.count_subcs = count_subcs; rv.count_files = count_files; rv.count_pages = count_pages; return rv; } - public static final Xodb_category_itm Null = new Xodb_category_itm(); Xodb_category_itm() {} + public static final Xowd_category_itm Null = new Xowd_category_itm(); Xowd_category_itm() {} } diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_css_core_itm.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_css_core_itm.java new file mode 100644 index 000000000..8788cadf4 --- /dev/null +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_css_core_itm.java @@ -0,0 +1,26 @@ +/* +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 . +*/ +package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; +public class Xowd_css_core_itm { + public Xowd_css_core_itm(int id, String key, DateAdp updated_on) { + this.id = id; this.key = key; this.updated_on = updated_on; + } + public int Id() {return id;} private final int id; + public String Key() {return key;} private final String key; + public DateAdp Updated_on() {return updated_on;} private final DateAdp updated_on; +} diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_css_core_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_css_core_tbl.java new file mode 100644 index 000000000..9c67f44c8 --- /dev/null +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_css_core_tbl.java @@ -0,0 +1,64 @@ +/* +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 . +*/ +package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; +import gplx.dbs.*; +public class Xowd_css_core_tbl implements RlsAble { + private final String tbl_name = "css_core"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private final String fld_id, fld_key, fld_updated_on; + public Xowd_css_core_tbl(Db_conn conn) { + this.conn = conn; + this.fld_id = flds.Add_int_pkey_autonum("css_id"); + this.fld_key = flds.Add_str("css_key", 255); + this.fld_updated_on = flds.Add_str("css_updated_on", 20); + conn.Rls_reg(this); + } + 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, Db_meta_idx.new_unique_by_tbl(tbl_name, "main", fld_key)));} + public void Rls() {} + public int Insert(String key, DateAdp updated_on) { + Db_stmt stmt_insert = conn.Stmt_insert(tbl_name, flds); + stmt_insert.Val_str(fld_key, key).Val_str(fld_updated_on, updated_on.XtoStr_fmt_yyyyMMdd_HHmmss()).Exec_insert(); + return Select_id_by_key(key); + } + public void Update(int id, String key, DateAdp updated_on) { + Db_stmt stmt_update = conn.Stmt_update_exclude(tbl_name, flds, fld_id); + stmt_update.Val_str(fld_key, key).Val_str(fld_updated_on, updated_on.XtoStr_fmt_yyyyMMdd_HHmmss()).Crt_int(fld_id, id).Exec_update(); + } + public int Select_id_by_key(String key) { + Db_rdr rdr = conn.Stmt_select(tbl_name, flds, fld_key).Crt_str(fld_key, key).Exec_select__rls_auto(); + try {return rdr.Move_next() ? rdr.Read_int(fld_id) : Id_null;} + finally {rdr.Rls();} + } + public Xowd_css_core_itm[] Select_all() { // TEST: + Db_stmt stmt = conn.Stmt_select(tbl_name, flds); + return Select_by_stmt(stmt); + } + private Xowd_css_core_itm[] Select_by_stmt(Db_stmt stmt) { + ListAdp rv = ListAdp_.new_(); + Db_rdr rdr = stmt.Exec_select__rls_auto(); + try { + while (rdr.Move_next()) + rv.Add(new_itm(rdr)); + } finally {rdr.Rls();} + return (Xowd_css_core_itm[])rv.Xto_ary_and_clear(Xowd_css_core_itm.class); + } + private Xowd_css_core_itm new_itm(Db_rdr rdr) { + return new Xowd_css_core_itm(rdr.Read_int(fld_id), rdr.Read_str(fld_key), rdr.Read_date_by_str(fld_updated_on)); + } + public static final int Id_null = -1; +} diff --git a/140_dbs/src/gplx/dbs/Db_batch_wkr.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_css_file_itm.java similarity index 59% rename from 140_dbs/src/gplx/dbs/Db_batch_wkr.java rename to 400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_css_file_itm.java index 7b516b802..be10aab3e 100644 --- a/140_dbs/src/gplx/dbs/Db_batch_wkr.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_css_file_itm.java @@ -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 . */ -package gplx.dbs; import gplx.*; -public interface Db_batch_wkr { - void Batch_bgn(); - void Batch_end(); +package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; +public class Xowd_css_file_itm { + public Xowd_css_file_itm(int css_id, String path, byte[] data) {this.css_id = css_id; this.path = path; this.data = data;} + public int Css_id() {return css_id;} private final int css_id; + public String Path() {return path;} private final String path; + public byte[] Data() {return data;} private final byte[] data; } diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_css_file_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_css_file_tbl.java new file mode 100644 index 000000000..a97b25d62 --- /dev/null +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_css_file_tbl.java @@ -0,0 +1,60 @@ +/* +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 . +*/ +package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; +import gplx.dbs.*; +public class Xowd_css_file_tbl implements RlsAble { + private final String tbl_name = "css_file"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private final String fld_css_id, fld_path, fld_data; + private final Db_conn conn; private Db_stmt stmt_insert; + public Xowd_css_file_tbl(Db_conn conn) { + this.conn = conn; + fld_css_id = flds.Add_int("css_id"); + fld_path = flds.Add_str("file_path", 255); + fld_data = flds.Add_bry("file_data"); + conn.Rls_reg(this); + } + public void Rls() { + stmt_insert = Db_stmt_.Rls(stmt_insert); + } + public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds));} + public void Insert(int css_id, String path, byte[] data) { + if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds); + stmt_insert.Clear().Val_int(fld_css_id, css_id).Val_str(fld_path, path).Val_bry(fld_data, data).Exec_insert(); + } + public void Delete(int css_id) { + conn.Stmt_delete(tbl_name, fld_css_id).Crt_int(fld_css_id, css_id).Exec_delete(); + } + public Xowd_css_file_itm[] Select_by_owner(int css_id) { + Db_stmt stmt = conn.Stmt_select(tbl_name, flds, fld_css_id).Crt_int(fld_css_id, css_id); + return Select_by_stmt(stmt); + } + public Xowd_css_file_itm[] Select_all() { // TEST: + Db_stmt stmt = conn.Stmt_select(tbl_name, flds); + return Select_by_stmt(stmt); + } + private Xowd_css_file_itm[] Select_by_stmt(Db_stmt stmt) { + ListAdp rv = ListAdp_.new_(); + Db_rdr rdr = stmt.Exec_select__rls_auto(); + try { + while (rdr.Move_next()) + rv.Add(new_itm(rdr)); + } finally {rdr.Rls();} + return (Xowd_css_file_itm[])rv.Xto_ary_and_clear(Xowd_css_file_itm.class); + } + private Xowd_css_file_itm new_itm(Db_rdr rdr) {return new Xowd_css_file_itm(rdr.Read_int(fld_css_id), rdr.Read_str(fld_path), rdr.Read_bry(fld_data));} +} diff --git a/400_xowa/src/gplx/xowa/html/hdumps/data/Xohd_page_html_row.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_html_row.java similarity index 77% rename from 400_xowa/src/gplx/xowa/html/hdumps/data/Xohd_page_html_row.java rename to 400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_html_row.java index 859449ab0..a1a75a8e9 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/data/Xohd_page_html_row.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_html_row.java @@ -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 . */ -package gplx.xowa.html.hdumps.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.xowa.html.hdumps.*; -public class Xohd_page_html_row { - public Xohd_page_html_row(int page_id, int tid, byte[] data) {this.page_id = page_id; this.tid = tid; this.data = data;} +package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; +public class Xowd_html_row { + public Xowd_html_row(int page_id, int tid, byte[] data) {this.page_id = page_id; this.tid = tid; this.data = data;} public int Page_id() {return page_id;} private final int page_id; public int Tid() {return tid;} private final int tid; public byte[] Data() {return data;} private final byte[] data; diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_html_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_html_tbl.java new file mode 100644 index 000000000..1f194f90e --- /dev/null +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_html_tbl.java @@ -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 . +*/ +package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; +import gplx.ios.*; import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.xowa.dbs.*; import gplx.dbs.cfgs.*; +public class Xowd_html_tbl implements RlsAble { + private final String tbl_name = "html"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private final String fld_page_id, fld_html_tid, fld_html_data; + private final Db_conn conn; private Db_stmt stmt_select, stmt_insert, stmt_delete; + private final Io_stream_zip_mgr zip_mgr = Xoa_app_.Utl__zip_mgr(); private final byte zip_tid; + public Xowd_html_tbl(Db_conn conn, byte zip_tid) { + this.conn = conn; this.zip_tid = zip_tid; + fld_page_id = flds.Add_int("page_id"); + fld_html_tid = flds.Add_int("html_tid"); + fld_html_data = flds.Add_bry("html_data"); + conn.Rls_reg(this); + } + public Db_conn Conn() {return conn;} + public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds));} + public void Create_idx() {conn.Ddl_create_idx(Gfo_usr_dlg_.I, Db_meta_idx.new_unique_by_tbl(tbl_name, "main", fld_page_id, fld_html_tid));} + public void Insert_bgn() {conn.Txn_bgn(); stmt_insert = conn.Stmt_insert(tbl_name, flds);} + public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} + public int Insert(int page_id, int tid, byte[] data) { + if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds); + data = zip_mgr.Zip(zip_tid, data); + stmt_insert.Clear().Val_int(fld_page_id, page_id).Val_int(fld_html_tid, tid).Val_bry(fld_html_data, data).Exec_insert(); + return data.length; + } + public void Delete(int page_id) { + if (stmt_delete == null) stmt_delete = conn.Stmt_delete(tbl_name, String_.Ary(fld_page_id)); + stmt_delete.Clear().Crt_int(fld_page_id, page_id).Exec_delete(); + } + public void Select_by_page(ListAdp rv, int page_id) { + if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, String_.Ary(fld_page_id)); + Db_rdr rdr = stmt_select.Clear().Crt_int(fld_page_id, page_id).Exec_select__rls_manual(); + try { + while (rdr.Move_next()) { + Xowd_html_row row = new Xowd_html_row(rdr.Read_int(fld_page_id), rdr.Read_int(fld_html_tid), zip_mgr.Unzip(zip_tid, rdr.Read_bry(fld_html_data))); + rv.Add(row); + } + } + finally {rdr.Rls();} + } + public void Rls() { + stmt_insert = Db_stmt_.Rls(stmt_insert); + stmt_delete = Db_stmt_.Rls(stmt_delete); + stmt_select = Db_stmt_.Rls(stmt_select); + } + public static void Assert_col__page_html_db_id(Xowd_db_mgr db_mgr) { + Db_cfg_tbl cfg_tbl = db_mgr.Tbl__cfg(); + String exists = cfg_tbl.Select_str_or(Xow_cfg_consts.Grp__wiki_schema, Xow_cfg_consts.Key__schema__col_page_html_text_id, "n"); + if (String_.Eq(exists, "y")) return; + Xowd_page_tbl pg_tbl = db_mgr.Tbl__page(); + Db_conn conn = db_mgr.Db__core().Conn(); + conn.Ddl_append_fld(pg_tbl.Tbl_name(), pg_tbl.Fld_html_db_id()); // TODO: currently NULL; change to NOT NULL DEFAULT -1; ALTER TABLE page ADD html_db_id int NULL; +// conn.Ddl_append_fld(pg_tbl.Tbl_name(), pg_tbl.Fld_page_redirect_id()); // TODO: currently NULL; change to NOT NULL DEFAULT -1; ALTER TABLE page ADD html_db_id int NULL; + cfg_tbl.Insert_yn(Xow_cfg_consts.Grp__wiki_schema, Xow_cfg_consts.Key__schema__col_page_html_text_id, Bool_.Y); + } +} diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_itm.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_itm.java new file mode 100644 index 000000000..cc0a3306d --- /dev/null +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_itm.java @@ -0,0 +1,126 @@ +/* +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 . +*/ +package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; +import gplx.core.primitives.*; +public class Xowd_page_itm implements Xobl_data_itm { + public Xowd_page_itm() {this.Clear();} + public int Id() {return id;} public Xowd_page_itm Id_(int v) {id = v; id_val = null; return this;} private int id; + public Int_obj_val Id_val() {if (id_val == null) id_val = Int_obj_val.new_(id); return id_val;} private Int_obj_val id_val; + public int Ns_id() {return ns_id;} public Xowd_page_itm Ns_id_(int v) {ns_id = v; return this;} private int ns_id; + public byte[] Ttl_page_db() {return ttl_page_db;} public Xowd_page_itm Ttl_page_db_(byte[] v) {ttl_page_db = v; return this;} private byte[] ttl_page_db; // EX: Category1 + public byte[] Ttl_full_db() {return ttl_full_db;} private byte[] ttl_full_db; // EX: Category:Category1 + public boolean Redirected() {return redirected;} public Xowd_page_itm Redirected_(boolean v) {redirected = v; return this;} private boolean redirected; + public int Text_len() {return text_len;} public Xowd_page_itm Text_len_(int v) {text_len = v; return this;} private int text_len; + public int Text_db_id() {return text_db_id;} public Xowd_page_itm Text_db_id_(int v) {text_db_id = v; return this;} private int text_db_id; + public byte[] Text() {return text;} public Xowd_page_itm Text_(byte[] v) {text = v; if (v != null) text_len = v.length; return this;} private byte[] text; + public int Html_db_id() {return html_db_id;} private int html_db_id; + public int Redirect_id() {return redirect_id;} private int redirect_id; + public DateAdp Modified_on() {return modified_on;} public Xowd_page_itm Modified_on_(DateAdp v) {modified_on = v; return this;} private DateAdp modified_on; + public boolean Exists() {return exists;} public Xowd_page_itm Exists_(boolean v) {exists = v; return this;} private boolean exists; + public Xow_ns Ns() {return ns;} private Xow_ns ns; + public Object Xtn() {return xtn;} public Xowd_page_itm Xtn_(Object v) {this.xtn = v; return this;} private Object xtn; + public int Tdb_row_idx() {return tdb_row_idx;} public void Tdb_row_idx_(int v) {tdb_row_idx = v;} private int tdb_row_idx; + public Xowd_page_itm Init(int id, byte[] ttl_page_db, boolean redirected, int text_len, int text_db_id, int tdb_row_idx) { + this.id = id; this.ttl_page_db = ttl_page_db; this.redirected = redirected; + this.text_len = text_len; this.text_db_id = text_db_id; this.tdb_row_idx = tdb_row_idx; + id_val = null; + return this; + } + public void Init_by_sql(int id, int ns_id, byte[] ttl_page_db, DateAdp modified_on, boolean redirected, int text_len, int text_db_id, int html_db_id, int redirect_id) { + this.id = id; + this.ns_id = ns_id; + this.ttl_page_db = ttl_page_db; + this.modified_on = modified_on; + this.redirected = redirected; + this.text_len = text_len; + this.text_db_id = text_db_id; + this.html_db_id = html_db_id; + this.redirect_id = redirect_id; + } + public void Init_by_tdb(int id, int text_db_id, int tdb_row_idx, boolean redirected, int text_len, int ns_id, byte[] ttl_page_db) { + this.id = id; + this.text_db_id = text_db_id; + this.tdb_row_idx = tdb_row_idx; + this.redirected = redirected; + this.text_len = text_len; + this.ns_id = ns_id; + this.ttl_page_db = ttl_page_db; + } + public Xowd_page_itm Ttl_(Xow_ns ns, byte[] ttl_page_db) { + this.ns = ns; + ns_id = ns.Id(); + this.ttl_page_db = ttl_page_db; + this.ttl_full_db = ns.Gen_ttl(ttl_page_db); + return this; + } + public Xowd_page_itm Ttl_(Xoa_ttl ttl) { + ttl_full_db = ttl.Full_txt(); + ttl_page_db = ttl.Page_db(); + ns = ttl.Ns(); + ns_id = ns.Id(); + return this; + } + public Xowd_page_itm Ttl_(byte[] v, Xow_ns_mgr ns_mgr) { + ttl_full_db = v; + Object o = ns_mgr.Names_get_w_colon(v, 0, v.length); + if (o == null) { + ns = ns_mgr.Ns_main(); + ttl_page_db = v; + } + else { + ns = (Xow_ns)o; + ttl_page_db = Bry_.Mid(v, ns.Name_txt_w_colon().length, v.length); // EX: "Template:A" -> "Template:" + "A" + } + ns_id = ns.Id(); + return this; + } + public void Clear() { + id = Id_null; text_len = 0; // text_len should be 0 b/c text defaults to 0; + text_db_id = tdb_row_idx = 0; // default to 0, b/c some tests do not set and will fail at -1 + ns_id = Int_.MinValue; + ttl_full_db = ttl_page_db = null; text = Bry_.Empty; // default to Ary_empty for entries that have + ns = null; + redirected = exists = false; + modified_on = DateAdp_.MinValue; + id_val = null; + html_db_id = -1; + redirect_id = -1; + } + public void Copy(Xowd_page_itm orig) { + this.id = orig.id; + this.text_len = orig.text_len; + this.text_db_id = orig.text_db_id; + this.tdb_row_idx = orig.tdb_row_idx; + this.ns_id = orig.ns_id; + this.ttl_full_db = orig.ttl_full_db; + this.ttl_page_db = orig.ttl_page_db; + this.text = orig.text; + this.ns = orig.ns; + this.redirected = orig.redirected; + this.exists = orig.exists; + this.modified_on = orig.modified_on; + this.id_val = null; + this.html_db_id = orig.html_db_id; + } + public void Srl_save(Bry_bfr bfr) {gplx.xowa.tdbs.Xotdb_page_itm_.Txt_id_save(bfr, this);} + public static final int Id_null = -1, Modified_on_null_int = 0; + public static final Xowd_page_itm[] Ary_empty = new Xowd_page_itm[0]; + public static final Xowd_page_itm Null = null; + public static Xowd_page_itm new_tmp() {return new Xowd_page_itm();} + public static Xowd_page_itm new_srch(int id, int text_len) {return new Xowd_page_itm().Id_(id).Text_len_(text_len);} +} diff --git a/400_xowa/src_121_wiki_data/gplx/xowa/Xodb_page_sorter.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_itm_sorter.java similarity index 61% rename from 400_xowa/src_121_wiki_data/gplx/xowa/Xodb_page_sorter.java rename to 400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_itm_sorter.java index 6e7dbcb12..ee2d68911 100644 --- a/400_xowa/src_121_wiki_data/gplx/xowa/Xodb_page_sorter.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_itm_sorter.java @@ -15,20 +15,20 @@ 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 . */ -package gplx.xowa; import gplx.*; -import gplx.lists.*; /*ComparerAble*/ -public class Xodb_page_sorter implements ComparerAble { +package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; +import gplx.lists.*; /*ComparerAble*/ import gplx.xowa.wikis.data.tbls.*; +public class Xowd_page_itm_sorter implements ComparerAble { public int compare(Object lhsObj, Object rhsObj) { - Xodb_page lhs = (Xodb_page)lhsObj, rhs = (Xodb_page)rhsObj; + Xowd_page_itm lhs = (Xowd_page_itm)lhsObj, rhs = (Xowd_page_itm)rhsObj; return order * Compare_rows(compareType, lhs, rhs); } - private static int Compare_rows(byte compareType, Xodb_page lhs, Xodb_page rhs) { + private static int Compare_rows(byte compareType, Xowd_page_itm lhs, Xowd_page_itm rhs) { switch (compareType) { case Tid_ns_ttl: { int rv = Int_.Compare(lhs.Ns_id(), rhs.Ns_id()); return rv == CompareAble_.Same ? Bry_.Compare(lhs.Ttl_page_db(), rhs.Ttl_page_db()) : rv; } - case Tid_itm_len: return Int_.Compare(lhs.Wtxt_len(), rhs.Wtxt_len()); + case Tid_itm_len: return Int_.Compare(lhs.Text_len(), rhs.Text_len()); case Tid_id: return Int_.Compare(lhs.Id(), rhs.Id()); case Tid_ttl: return Bry_.Compare(lhs.Ttl_page_db(), rhs.Ttl_page_db()); case Tid_ctg_tid_sortkey: @@ -41,13 +41,13 @@ public class Xodb_page_sorter implements ComparerAble { default: throw Err_.unhandled(compareType); } } - Xodb_page_sorter(byte compareType, int order) {this.compareType = compareType; this.order = order;} + Xowd_page_itm_sorter(byte compareType, int order) {this.compareType = compareType; this.order = order;} byte compareType; int order; static final byte Tid_ns_ttl = 0, Tid_itm_len = 2, Tid_id = 3, Tid_ttl = 4, Tid_ctg_tid_sortkey = 5; static final int Asc = 1, Dsc = -1; - public static final Xodb_page_sorter TitleAsc = new Xodb_page_sorter(Tid_ttl , Asc); - public static final Xodb_page_sorter EnyLenDsc = new Xodb_page_sorter(Tid_itm_len , Dsc); - public static final Xodb_page_sorter IdAsc = new Xodb_page_sorter(Tid_id , Asc); - public static final Xodb_page_sorter Ns_id_TtlAsc = new Xodb_page_sorter(Tid_ns_ttl , Asc); - public static final Xodb_page_sorter Ctg_tid_sortkey_asc = new Xodb_page_sorter(Tid_ctg_tid_sortkey , Asc); + public static final Xowd_page_itm_sorter TitleAsc = new Xowd_page_itm_sorter(Tid_ttl , Asc); + public static final Xowd_page_itm_sorter EnyLenDsc = new Xowd_page_itm_sorter(Tid_itm_len , Dsc); + public static final Xowd_page_itm_sorter IdAsc = new Xowd_page_itm_sorter(Tid_id , Asc); + public static final Xowd_page_itm_sorter Ns_id_TtlAsc = new Xowd_page_itm_sorter(Tid_ns_ttl , Asc); + public static final Xowd_page_itm_sorter Ctg_tid_sortkey_asc = new Xowd_page_itm_sorter(Tid_ctg_tid_sortkey , Asc); } diff --git a/400_xowa/src_121_wiki_data/gplx/xowa/Xodb_page_tst.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_itm_tst.java similarity index 74% rename from 400_xowa/src_121_wiki_data/gplx/xowa/Xodb_page_tst.java rename to 400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_itm_tst.java index 22794e331..c063421f0 100644 --- a/400_xowa/src_121_wiki_data/gplx/xowa/Xodb_page_tst.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_itm_tst.java @@ -15,25 +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 . */ -package gplx.xowa; import gplx.*; -import org.junit.*; -public class Xodb_page_tst { - @Before public void init() {fxt.Init();} private Xodb_page_fxt fxt = new Xodb_page_fxt(); +package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; +import org.junit.*; import gplx.xowa.wikis.data.tbls.*; +public class Xowd_page_itm_tst { + @Before public void init() {fxt.Init();} private Xowd_page_itm_fxt fxt = new Xowd_page_itm_fxt(); @Test public void Ttl_() { fxt.Test_ttl_("User_talk:A", Xow_ns_.Id_user_talk, "A"); fxt.Test_ttl_("User talk:A", Xow_ns_.Id_user_talk, "A"); } } -class Xodb_page_fxt { +class Xowd_page_itm_fxt { public void Init() { if (ns_mgr == null) { ns_mgr = new Xow_ns_mgr(gplx.xowa.langs.cases.Xol_case_mgr_.Ascii()); ns_mgr.Add_new(Xow_ns_.Id_main, ""); ns_mgr.Add_new(Xow_ns_.Id_user_talk, "User talk"); ns_mgr.Init_w_defaults(); - tmp_page = new Xodb_page(); + tmp_page = new Xowd_page_itm(); } - } private Xow_ns_mgr ns_mgr; Xodb_page tmp_page; + } private Xow_ns_mgr ns_mgr; Xowd_page_itm tmp_page; public void Test_ttl_(String ttl, int expd_ns, String expd_ttl) { tmp_page.Ttl_(Bry_.new_ascii_(ttl), ns_mgr); Tfds.Eq(expd_ns, tmp_page.Ns_id()); diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl.java new file mode 100644 index 000000000..b8ca1de0b --- /dev/null +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl.java @@ -0,0 +1,319 @@ +/* +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 . +*/ +package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; +import gplx.core.primitives.*; import gplx.core.criterias.*; +import gplx.dbs.*; import gplx.xowa.*; import gplx.xowa.dbs.*; import gplx.dbs.qrys.*; +public class Xowd_page_tbl implements RlsAble { + private final String tbl_name = "page"; + private String fld_id, fld_ns, fld_title, fld_is_redirect, fld_touched, fld_len, fld_random_int, fld_text_db_id, fld_html_db_id, fld_redirect_id; + private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private final Db_conn conn; private Db_stmt stmt_select_all_by_ttl, stmt_select_all_by_id, stmt_select_id_by_ttl, stmt_insert; private boolean hdump_enabled; + private final String[] flds_select_all, flds_select_idx; + public String Tbl_name() {return tbl_name;} + public String Fld_page_id() {return fld_id;} + public String Fld_page_ns() {return fld_ns;} + public String Fld_page_title() {return fld_title;} + public String Fld_page_len() {return fld_len;} + public Db_meta_fld Fld_html_db_id() {return flds.Get_by(fld_html_db_id);} + public String[] Flds_select_idx() {return flds_select_idx;} + public String[] Flds_select_all() {return flds_select_all;} + public Db_conn Conn() {return conn;} + public Xowd_page_tbl(Db_conn conn, boolean schema_is_1) { + this.conn = conn; + String fld_text_db_id_name = ""; + if (schema_is_1) {fld_text_db_id_name = "page_file_idx";} + else {fld_text_db_id_name = "page_text_db_id";} + fld_id = flds.Add_int_pkey("page_id"); // int(10); unsigned -- MW:same + fld_ns = flds.Add_int("page_namespace"); // int(11); -- MW:same + fld_title = flds.Add_str("page_title", 255); // varbinary(255); -- MW:blob + fld_is_redirect = flds.Add_int("page_is_redirect"); // tinyint(3); -- MW:same + fld_touched = flds.Add_str("page_touched", 14); // binary(14); -- MW:blob; NOTE: should be revision!rev_timestamp, but needs extra join + fld_len = flds.Add_int("page_len"); // int(10); unsigned -- MW:same except NULL REF: WikiPage.php!updateRevisionOn;" + fld_random_int = flds.Add_int("page_random_int"); // MW:XOWA + fld_text_db_id = flds.Add_int(fld_text_db_id_name); // MW:XOWA + Hdump_enabled_(!schema_is_1); + flds_select_all = String_.Ary_wo_null(fld_id, fld_ns, fld_title, fld_touched, fld_is_redirect, fld_len, fld_text_db_id, fld_html_db_id, fld_redirect_id); + flds_select_idx = String_.Ary(fld_ns, fld_title, fld_id, fld_len); + conn.Rls_reg(this); + } + public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds.To_fld_ary()));} + public void Insert_bgn() {conn.Txn_bgn(); stmt_insert = conn.Stmt_insert(tbl_name, flds);} + public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} + public void Insert_cmd_by_batch(int page_id, int ns_id, byte[] ttl_wo_ns, boolean page_is_redirect, DateAdp modified_on, int page_len, int random_int, int text_db_id, int html_db_id) { + stmt_insert.Clear() + .Val_int(fld_id, page_id) + .Val_int(fld_ns, ns_id) + .Val_bry_as_str(fld_title, ttl_wo_ns) + .Val_bool_as_byte(fld_is_redirect, page_is_redirect) + .Val_str(fld_touched, modified_on.XtoStr_fmt(Page_touched_fmt)) + .Val_int(fld_len, page_len) + .Val_int(fld_random_int, random_int) + .Val_int(fld_text_db_id, text_db_id) + .Val_int(fld_html_db_id, html_db_id) + .Val_int(fld_redirect_id, -1) + .Exec_insert(); + } + public void Hdump_enabled_(boolean v) { + this.hdump_enabled = v; + if (v) { + fld_html_db_id = flds.Add_int_dflt("page_html_db_id", -1); // MW:XOWA + fld_redirect_id = flds.Add_int_dflt("page_redirect_id", -1); // MW:XOWA + } + else { + fld_html_db_id = Db_meta_fld.Key_null; + fld_redirect_id = Db_meta_fld.Key_null; + } + } + public boolean Select_by_ttl(Xowd_page_itm rv, Xow_ns ns, byte[] ttl) { + if (stmt_select_all_by_ttl == null) stmt_select_all_by_ttl = conn.Stmt_select(tbl_name, flds, String_.Ary(fld_ns, fld_title)); + Db_rdr rdr = stmt_select_all_by_ttl.Clear().Crt_int(fld_ns, ns.Id()).Crt_bry_as_str(fld_title, ttl).Exec_select__rls_manual(); + try { + if (rdr.Move_next()) { + Read_page__all(rv, rdr); + return true; + } + } + finally {rdr.Rls();} + return false; + } + public boolean Select_by_id(Xowd_page_itm rv, int page_id) { + if (stmt_select_all_by_id == null) stmt_select_all_by_id = conn.Stmt_select(tbl_name, flds_select_all, fld_id); + Db_rdr rdr = stmt_select_all_by_id.Clear().Crt_int(fld_id, page_id).Exec_select__rls_manual(); + try { + if (rdr.Move_next()) { + Read_page__all(rv, rdr); + return true; + } + } + finally {rdr.Rls();} + return false; + } + public Db_rdr Select_all() { + Db_qry__select_cmd qry = Db_qry__select_cmd.new_().From_(tbl_name).Cols_(fld_id, fld_title).OrderBy_asc_(fld_id); + return conn.Stmt_new(qry).Exec_select__rls_auto(); + } + public int Select_id(int ns_id, byte[] ttl) { + if (stmt_select_id_by_ttl == null) stmt_select_id_by_ttl = conn.Stmt_select(tbl_name, flds_select_all, fld_ns, fld_title); + Db_rdr rdr = stmt_select_id_by_ttl.Clear().Crt_int(fld_ns, ns_id).Crt_bry_as_str(fld_title, ttl).Exec_select__rls_manual(); + try { + return rdr.Move_next() ? rdr.Read_int(fld_id) : Xowd_page_itm.Id_null; + } finally {rdr.Rls();} + } + public void Select_in__ttl(Cancelable cancelable, OrderedHash rv, int ns_id, int bgn, int end) { + Xowd_page_tbl__ttl wkr = new Xowd_page_tbl__ttl(); + wkr.Ctor(this, tbl_name, fld_title); + wkr.Init(rv, ns_id); + wkr.Select_in(cancelable, conn, bgn, end); + } + public void Select_in__ns_ttl(Cancelable cancelable, OrderedHash rv, Xow_ns_mgr ns_mgr, boolean fill_idx_fields_only, int bgn, int end) { + Xowd_page_tbl__ttl_ns wkr = new Xowd_page_tbl__ttl_ns(); + wkr.Fill_idx_fields_only_(fill_idx_fields_only); + wkr.Ctor(this, tbl_name, fld_title); + wkr.Init(ns_mgr, rv); + wkr.Select_in(cancelable, conn, bgn, end); + } + public boolean Select_in__id(Cancelable cancelable, ListAdp rv) {return Select_in__id(cancelable, false, rv, 0, rv.Count());} + public boolean Select_in__id(Cancelable cancelable, boolean skip_table_read, ListAdp rv) {return Select_in__id(cancelable, skip_table_read, rv, 0, rv.Count());} + public boolean Select_in__id(Cancelable cancelable, boolean skip_table_read, ListAdp rv, int bgn, int end) { + Xowd_page_itm[] page_ary = (Xowd_page_itm[])rv.Xto_ary(Xowd_page_itm.class); + int len = page_ary.length; if (len == 0) return false; + OrderedHash hash = OrderedHash_.new_(); + for (int i = 0; i < len; i++) { + if (cancelable.Canceled()) return false; + Xowd_page_itm p = page_ary[i]; + if (!hash.Has(p.Id_val())) // NOTE: must check if file already exists b/c dynamicPageList currently allows dupes; DATE:2013-07-22 + hash.Add(p.Id_val(), p); + } + hash.SortBy(Xowd_page_itm_sorter.IdAsc); // sort by ID to reduce disk thrashing; DATE:2015-03-31 + conn.Txn_bgn(); + try { + Xowd_page_tbl__id wkr = new Xowd_page_tbl__id(); + wkr.Ctor(this, tbl_name, fld_id); + wkr.Init(rv, hash); + wkr.Select_in(cancelable, conn, bgn, end); + } finally {conn.Txn_end();} + return true; + } + public byte[] Select_random(Xow_ns ns) {// ns should be ns_main + int random_int = RandomAdp_.new_().Next(ns.Count()); + Db_rdr rdr = conn.Stmt_select(tbl_name, String_.Ary(fld_title), fld_ns, fld_random_int) + .Crt_int(fld_ns, ns.Id()).Crt_int(fld_random_int, random_int) + .Exec_select__rls_auto(); + try { + return rdr.Move_next() ? rdr.Read_bry_by_str(fld_title) : null; + } finally {rdr.Rls();} + } + public void Select_by_search(Cancelable cancelable, ListAdp rv, byte[] search, int results_max) { + if (Bry_.Len_eq_0(search)) return; // do not allow empty search + Criteria crt = Criteria_.And_many(Db_crt_.eq_(fld_ns, Xow_ns_.Id_main), Db_crt_.like_(fld_title, "")); + Db_qry__select_cmd qry = Db_qry_.select_().From_(tbl_name).Cols_(fld_id, fld_len, fld_ns, fld_title).Where_(crt); // NOTE: use fields from main index only + search = Bry_.Replace(search, Byte_ascii.Asterisk, Byte_ascii.Percent); + Db_rdr rdr = conn.Stmt_new(qry).Clear().Crt_int(fld_ns, Xow_ns_.Id_main).Val_bry_as_str(fld_title, search).Exec_select__rls_auto(); + try { + while (rdr.Move_next()) { + if (cancelable.Canceled()) return; + Xowd_page_itm page = new Xowd_page_itm(); + page.Id_ (rdr.Read_int(fld_id)); + page.Ns_id_ (rdr.Read_int(fld_ns)); + page.Ttl_page_db_ (rdr.Read_bry_by_str(fld_title)); + page.Text_len_ (rdr.Read_int(fld_len)); + rv.Add(page); + } + } finally {rdr.Rls();} + } + public void Select_for_search_suggest(Cancelable cancelable, ListAdp rslt_list, Xow_ns ns, byte[] key, int max_results, int min_page_len, int browse_len, boolean include_redirects, boolean fetch_prv_item) { + String search_bgn = String_.new_utf8_(key); + String search_end = String_.new_utf8_(gplx.intl.Utf8_.Increment_char_at_last_pos(key)); + String sql = String_.Format + ( "SELECT {0}, {1}, {2}, {3} FROM {4} INDEXED BY {4}__title WHERE {1} = {5} AND {2} BETWEEN '{6}' AND '{7}' ORDER BY {3} DESC LIMIT {8};" + , fld_id, fld_ns, fld_title, fld_len + , tbl_name + , Int_.Xto_str(ns.Id()), search_bgn, search_end, Int_.Xto_str(max_results) + ); + Db_qry qry = Db_qry_sql.rdr_(sql); + Db_rdr rdr = conn.Stmt_new(qry).Exec_select__rls_auto(); + try { + while (rdr.Move_next()) { + if (cancelable.Canceled()) return; + Xowd_page_itm page = new Xowd_page_itm(); + Read_page__idx(page, rdr); + rslt_list.Add(page); + } + rslt_list.SortBy(Xowd_page_itm_sorter.TitleAsc); + } + finally {rdr.Rls();} + } + private Db_rdr Load_ttls_starting_with_rdr(int ns_id, byte[] ttl_frag, boolean include_redirects, int max_results, int min_page_len, int browse_len, boolean fwd, boolean search_suggest) { + String ttl_frag_str = String_.new_utf8_(ttl_frag); + Criteria crt_ttl = fwd ? Db_crt_.mte_(fld_title, ttl_frag_str) : Db_crt_.lt_(fld_title, ttl_frag_str); + Criteria crt = Criteria_.And_many(Db_crt_.eq_(fld_ns, ns_id), crt_ttl, Db_crt_.mte_(fld_len, min_page_len)); + if (!include_redirects) + crt = Criteria_.And(crt, Db_crt_.eq_(fld_is_redirect, Byte_.Zero)); + String[] cols = search_suggest + ? flds_select_idx + : flds_select_all + ; + int limit = fwd ? max_results + 1 : max_results; // + 1 to get next item + Db_qry__select_cmd qry = Db_qry_.select_cols_(tbl_name, crt, cols).Limit_(limit).OrderBy_(fld_title, fwd); + return conn.Stmt_new(qry).Crt_int(fld_ns, ns_id).Crt_str(fld_title, ttl_frag_str).Crt_int(fld_len, min_page_len).Exec_select__rls_auto(); + } + public void Select_for_special_all_pages(Cancelable cancelable, ListAdp rslt_list, Xowd_page_itm rslt_nxt, Xowd_page_itm rslt_prv, Int_obj_ref rslt_count, Xow_ns ns, byte[] key, int max_results, int min_page_len, int browse_len, boolean include_redirects, boolean fetch_prv_item) { + Xowd_page_itm nxt_itm = null; + int rslt_idx = 0; + boolean max_val_check = max_results == Int_.MaxValue; + Db_rdr rdr = Load_ttls_starting_with_rdr(ns.Id(), key, include_redirects, max_results, min_page_len, browse_len, true, true); + try { + while (rdr.Move_next()) { + if (cancelable.Canceled()) return; + Xowd_page_itm page = new Xowd_page_itm(); + Read_page__idx(page, rdr); + if (max_val_check && !Bry_.HasAtBgn(page.Ttl_page_db(), key)) break; + nxt_itm = page; + if (rslt_idx == max_results) {} // last item which is not meant for rslts, but only for nxt itm + else { + rslt_list.Add(page); + ++rslt_idx; + } + } + if (rslt_nxt != null && nxt_itm != null) // occurs when range is empty; EX: "Module:A" in simplewikibooks + rslt_nxt.Copy(nxt_itm); + if (fetch_prv_item) { // NOTE: Special:AllPages passes in true, but Search_suggest passes in false + if (cancelable.Canceled()) return; + rdr = Load_ttls_starting_with_rdr(ns.Id(), key, include_redirects, max_results, min_page_len, browse_len, false, false); + Xowd_page_itm prv_itm = new Xowd_page_itm(); + boolean found = false; + while (rdr.Move_next()) { + Read_page__all(prv_itm, rdr); + found = true; + } + if (found) + rslt_prv.Copy(prv_itm); + else { // at beginning of range, so no items found; EX: "Module:A" is search, but 1st Module is "Module:B" + if (rslt_list.Count() > 0) // use 1st item + rslt_prv.Copy((Xowd_page_itm)rslt_list.FetchAt(0)); + } + } + } + finally {rdr.Rls();} + rslt_count.Val_(rslt_idx); + } + public void Read_page__idx(Xowd_page_itm page, Db_rdr rdr) { + page.Id_ (rdr.Read_int(fld_id)); + page.Ns_id_ (rdr.Read_int(fld_ns)); + page.Ttl_page_db_ (rdr.Read_bry_by_str(fld_title)); + page.Text_len_ (rdr.Read_int(fld_len)); + } + public void Read_page__all(Xowd_page_itm page, Db_rdr rdr) { + int html_db_id = -1, redirected_id = -1; + if (hdump_enabled) { + html_db_id = rdr.Read_int(fld_html_db_id); + redirected_id = rdr.Read_int(fld_redirect_id); + } + page.Init_by_sql + ( rdr.Read_int(fld_id) + , rdr.Read_int(fld_ns) + , rdr.Read_bry_by_str(fld_title) + , DateAdp_.parse_fmt(rdr.Read_str(fld_touched), Page_touched_fmt) + , rdr.Read_bool_by_byte(fld_is_redirect) + , rdr.Read_int(fld_len) + , rdr.Read_int(fld_text_db_id) + , html_db_id + , redirected_id + ); + } + public void Update__html_db_id(int page_id, int html_db_id) { + Db_stmt stmt = conn.Stmt_update(tbl_name, String_.Ary(fld_id), fld_html_db_id); + stmt.Val_int(fld_html_db_id, html_db_id).Crt_int(fld_id, page_id).Exec_update(); + } + public void Update__ns__ttl(int page_id, int trg_ns, byte[] trg_ttl) { + for (int i = 0; i < 2; ++i) { + try { + conn.Stmt_update(tbl_name, String_.Ary(fld_id), fld_ns, fld_title) + .Val_int(fld_ns, trg_ns).Val_bry_as_str(fld_title, trg_ttl) + .Crt_int(fld_id, page_id) + .Exec_update(); + break; + } catch (Exception exc) { + if (String_.Has(Err_.Message_gplx_brief(exc), "columns page_namespace, page_random_int are not unique")) { // HACK: terrible hack, but moving pages across ns will break UNIQUE index + conn.Exec_sql_args("DROP INDEX {0}__name_random;", tbl_name); // is UNIQUE by default + conn.Exec_sql_args("CREATE INDEX {0}__name_random ON {0} ({1}, {2});", tbl_name, fld_ns, fld_random_int); + } + } + } + } + public void Update__redirect__modified(int page_id, boolean redirect, DateAdp modified) { + conn.Stmt_update(tbl_name, String_.Ary(fld_id), fld_is_redirect, fld_touched) + .Crt_int(fld_id, page_id) + .Val_int(fld_is_redirect, redirect ? 1 : 0).Val_str(fld_touched, modified.XtoStr_fmt(Page_touched_fmt)) + .Exec_update() + ; + } + public void Create_index() { + conn.Ddl_create_idx(Xoa_app_.Usr_dlg() + , Db_meta_idx.new_normal_by_tbl(tbl_name, "title" , fld_ns, fld_title, fld_id, fld_len, fld_is_redirect) + , Db_meta_idx.new_normal_by_tbl(tbl_name, "random" , fld_ns, fld_random_int) + ); + } + public void Rls() { + stmt_select_all_by_ttl = Db_stmt_.Rls(stmt_select_all_by_ttl); + stmt_select_all_by_id = Db_stmt_.Rls(stmt_select_all_by_id); + stmt_select_id_by_ttl = Db_stmt_.Rls(stmt_select_id_by_ttl); + stmt_insert = Db_stmt_.Rls(stmt_insert); + } + private static final String Page_touched_fmt = "yyyyMMddHHmmss"; +} diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl__in_wkrs.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl__in_wkrs.java new file mode 100644 index 000000000..2ceb71bf1 --- /dev/null +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl__in_wkrs.java @@ -0,0 +1,116 @@ +/* +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 . +*/ +package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; +import gplx.core.criterias.*; +import gplx.dbs.*; import gplx.dbs.utls.*; +class Xowd_page_tbl__ttl_ns extends Xowd_page_tbl__in_wkr__base { + private Xow_ns_mgr ns_mgr; private OrderedHash hash; + @Override protected int Interval() {return 64;} // NOTE: 96+ overflows; PAGE:en.w:Space_Liability_Convention; DATE:2013-10-24 + public void Init(Xow_ns_mgr ns_mgr, OrderedHash hash) {this.ns_mgr = ns_mgr; this.hash = hash;} + @Override protected Criteria In_filter(Object[] part_ary) { + int len = part_ary.length; + Criteria[] crt_ary = new Criteria[len]; + String fld_ns = tbl.Fld_page_ns(); String fld_ttl = tbl.Fld_page_title(); + for (int i = 0; i < len; i++) + crt_ary[i] = Criteria_.And(Db_crt_.eq_(fld_ns, 0), Db_crt_.eq_(fld_ttl, Bry_.Empty)); + return Criteria_.Or_many(crt_ary); + } + @Override protected void Fill_stmt(Db_stmt stmt, int bgn, int end) { + for (int i = bgn; i < end; i++) { + Xowd_page_itm page = (Xowd_page_itm)hash.FetchAt(i); + stmt.Val_int(page.Ns_id()); + stmt.Val_bry_as_str(page.Ttl_page_db()); + } + } + @Override public Xowd_page_itm Read_data_to_page(Xowd_page_itm rdr_page) { + Xow_ns ns = ns_mgr.Ids_get_or_null(rdr_page.Ns_id()); + if (ns == null) return null; // NOTE: ns seems to "randomly" be null when threading during redlinks; guard against null; DATE:2014-01-03 + byte[] ttl_wo_ns = rdr_page.Ttl_page_db(); + rdr_page.Ttl_(ns, ttl_wo_ns); + return (Xowd_page_itm)hash.Fetch(rdr_page.Ttl_full_db()); + } +} +class Xowd_page_tbl__ttl extends Xowd_page_tbl__in_wkr__base { + private OrderedHash hash; private int in_ns; + @Override protected int Interval() {return 64;} // NOTE: 96+ overflows; EX: w:Space_Liability_Convention; DATE:2013-10-24 + public void Init(OrderedHash hash, int in_ns) {this.hash = hash; this.in_ns = in_ns;} + @Override protected Criteria In_filter(Object[] part_ary) { + int len = part_ary.length; + Criteria[] crt_ary = new Criteria[len]; + String fld_ns = tbl.Fld_page_ns(); String fld_ttl = tbl.Fld_page_title(); + for (int i = 0; i < len; i++) + crt_ary[i] = Criteria_.And(Db_crt_.eq_(fld_ns, in_ns), Db_crt_.eq_(fld_ttl, Bry_.Empty)); + return Criteria_.Or_many(crt_ary); + } + @Override protected void Fill_stmt(Db_stmt stmt, int bgn, int end) { + for (int i = bgn; i < end; i++) { + Xowd_page_itm page = (Xowd_page_itm)hash.FetchAt(i); + stmt.Val_int(in_ns); + stmt.Val_bry_as_str(page.Ttl_page_db()); + } + } + @Override public Xowd_page_itm Read_data_to_page(Xowd_page_itm rdr_page) {return (Xowd_page_itm)hash.Fetch(rdr_page.Ttl_page_db());} +} +class Xowd_page_tbl__id extends Xowd_page_tbl__in_wkr__base { + private ListAdp list; // list is original list of ids which may have dupes; needed to fill statement (which takes range of bgn - end); DATE:2013-12-08 + private OrderedHash hash; // hash is unique list of ids; needed for fetch from rdr (which indexes by id) + public void Init(ListAdp list, OrderedHash hash) {this.list = list; this.hash = hash; this.Fill_idx_fields_only_(true);} + @Override protected boolean Show_progress() {return true;} + @Override protected Criteria In_filter(Object[] part_ary) { + return Db_crt_.in_(this.In_fld_name(), part_ary); + } + @Override protected void Fill_stmt(Db_stmt stmt, int bgn, int end) { + for (int i = bgn; i < end; i++) { + Xowd_page_itm page = (Xowd_page_itm)list.FetchAt(i); + stmt.Val_int(page.Id()); + } + } + @Override public Xowd_page_itm Read_data_to_page(Xowd_page_itm rdr_page) {return (Xowd_page_itm)hash.Fetch(rdr_page.Id_val());} +} +abstract class Xowd_page_tbl__in_wkr__base extends Db_in_wkr__base { + protected Xowd_page_tbl tbl; private String tbl_name, fld_in_name; + public String Tbl_name() {return tbl_name;} + public void Ctor(Xowd_page_tbl tbl, String tbl_name, String fld_in_name) {this.tbl = tbl; this.tbl_name = tbl_name; this.fld_in_name = fld_in_name;} + public String In_fld_name() {return fld_in_name;} + protected abstract Criteria In_filter(Object[] part_ary); + public abstract Xowd_page_itm Read_data_to_page(Xowd_page_itm rdr_page); + public boolean Fill_idx_fields_only() {return fill_idx_fields_only;} public void Fill_idx_fields_only_(boolean v) {fill_idx_fields_only = v;} private boolean fill_idx_fields_only; + @Override protected Db_qry Make_qry(int bgn, int end) { + Object[] part_ary = In_ary(end - bgn); + return Db_qry_.select_cols_ + ( this.Tbl_name() + , In_filter(part_ary) + , fill_idx_fields_only ? tbl.Flds_select_idx() : tbl.Flds_select_all() + ) + ; + } + @Override protected void Read_data(Cancelable cancelable, Db_rdr rdr) { + Xowd_page_itm temp = new Xowd_page_itm(); + while (rdr.Move_next()) { + if (cancelable.Canceled()) return; + if (fill_idx_fields_only) + tbl.Read_page__idx(temp, rdr); + else + tbl.Read_page__all(temp, rdr); + Xowd_page_itm page = Read_data_to_page(temp); + if (page == null) continue; // page not found + temp.Exists_(true); + page.Copy(temp); + } + } +} diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_page_tbl_tst.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl_tst.java similarity index 55% rename from 400_xowa/src/gplx/xowa/dbs/tbls/Xodb_page_tbl_tst.java rename to 400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl_tst.java index 9dd1faec8..991829830 100644 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_page_tbl_tst.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl_tst.java @@ -15,15 +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 . */ -package gplx.xowa.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*; -import org.junit.*; import gplx.xowa.bldrs.*; import gplx.xowa.ctgs.*; import gplx.dbs.*; import gplx.xowa.dbs.tbls.*; -public class Xodb_page_tbl_tst { - private Xodb_page_tbl_fxt fxt = new Xodb_page_tbl_fxt(); +package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; +import org.junit.*; import gplx.xowa.bldrs.*; import gplx.xowa.ctgs.*; import gplx.dbs.*; import gplx.xowa.wikis.data.tbls.*; +public class Xowd_page_tbl_tst { + private Xowd_page_tbl_fxt fxt = new Xowd_page_tbl_fxt(); @Test public void Find_search_end() { fxt.Test_find_search_end("ab", "ac"); fxt.Test_find_search_end("ab%", "ac%"); } } -class Xodb_page_tbl_fxt { - public void Test_find_search_end(String val, String expd) {Tfds.Eq(expd, String_.new_utf8_(Xodb_page_tbl.Find_search_end(Bry_.new_utf8_(val))));} +class Xowd_page_tbl_fxt { + public void Test_find_search_end(String val, String expd) {Tfds.Eq(expd, String_.new_utf8_(Find_search_end(Bry_.new_utf8_(val))));} + private static byte[] Find_search_end(byte[] orig) { // NOTE: moved from old Xowd_page_tbl; is probably obsolete + byte[] rv = Bry_.Copy(orig); + int rv_len = rv.length; + int increment_pos = rv[rv_len - 1] == Byte_ascii.Percent ? rv_len - 2 : rv_len - 1; // increment last char, unless it is %; if %, increment one before it + return Bry_.Increment_last(rv, increment_pos); + } } diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_link_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_link_tbl.java new file mode 100644 index 000000000..448b6e317 --- /dev/null +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_link_tbl.java @@ -0,0 +1,72 @@ +/* +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 . +*/ +package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; +import gplx.core.primitives.*; +import gplx.dbs.*; import gplx.dbs.utls.*; +public class Xowd_search_link_tbl { + private final String tbl_name; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private final String fld_word_id, fld_page_id; + private final Db_conn conn; private Db_stmt stmt_insert; private final Xowd_search_page_tbl__in_wkr in_wkr = new Xowd_search_page_tbl__in_wkr(); + public Xowd_search_link_tbl(Db_conn conn, boolean schema_is_1) { + this.conn = conn; + String fld_prefix = ""; + if (schema_is_1) {tbl_name = "search_title_page"; fld_prefix = "stp_";} + else {tbl_name = "search_link";} + fld_word_id = flds.Add_int(fld_prefix + "word_id"); + fld_page_id = flds.Add_int(fld_prefix + "page_id"); + in_wkr.Ctor(tbl_name, flds, fld_page_id, fld_word_id); + } + public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds));} + public void Create_idx_unique() {conn.Ddl_create_idx(Xoa_app_.Usr_dlg(), Db_meta_idx.new_unique_by_tbl(tbl_name, "main", fld_word_id, fld_page_id));} + public void Create_idx_normal() {conn.Ddl_create_idx(Xoa_app_.Usr_dlg(), Db_meta_idx.new_normal_by_tbl(tbl_name, "main", fld_word_id, fld_page_id));} + public void Insert_bgn() {conn.Txn_bgn(); stmt_insert = conn.Stmt_insert(tbl_name, flds);} + public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} + public void Insert_cmd_by_batch(int word_id, int page_id) { + stmt_insert.Clear().Val_int(fld_word_id, word_id).Val_int(fld_page_id, page_id).Exec_insert(); + } + public void Select_in(Cancelable cancelable, ListAdp rv, ListAdp words) { + in_wkr.Init(words, rv); + in_wkr.Select_in(cancelable, conn, 0, words.Count()); + } +} +class Xowd_search_page_tbl__in_wkr extends Db_in_wkr__base { + private String tbl_name; private Db_meta_fld_list flds; private String fld_page_id, fld_word_id; + private ListAdp words, pages; + public void Ctor(String tbl_name, Db_meta_fld_list flds, String fld_page_id, String fld_word_id) { + this.tbl_name = tbl_name; this.flds = flds; this.fld_page_id = fld_page_id; this.fld_word_id = fld_word_id; + } + public void Init(ListAdp words, ListAdp pages) {this.words = words; this.pages = pages;} + @Override protected Db_qry Make_qry(int bgn, int end) { + Object[] part_ary = In_ary(end - bgn); + return Db_qry_.select_cols_(tbl_name, Db_crt_.in_(fld_word_id, part_ary), flds.To_str_ary()); + } + @Override protected void Fill_stmt(Db_stmt stmt, int bgn, int end) { + for (int i = bgn; i < end; i++) { + Int_obj_val word_id = (Int_obj_val)words.FetchAt(i); + stmt.Crt_int(fld_word_id, word_id.Val()); + } + } + @Override protected void Read_data(Cancelable cancelable, Db_rdr rdr) { + while (rdr.Move_next()) { + if (cancelable.Canceled()) return; + int page_id = rdr.Read_int(fld_page_id); + Xowd_page_itm page = new Xowd_page_itm().Id_(page_id); + pages.Add(page); + } + } +} diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_temp_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_temp_tbl.java new file mode 100644 index 000000000..5c41a00c6 --- /dev/null +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_temp_tbl.java @@ -0,0 +1,92 @@ +/* +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 . +*/ +package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; +import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; +public class Xowd_search_temp_tbl { + private final String tbl_name = "search_temp"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private final String fld_page_id, fld_word_text; + private final Db_conn conn; private Db_stmt stmt_insert; + private final String sql_create_word, sql_create_link; + public Xowd_search_temp_tbl(Db_conn conn, boolean schema_is_1) { + this.conn = conn; + if (schema_is_1) {sql_create_word = Sql_create_word_v1; sql_create_link = Sql_create_link_v1;} + else {sql_create_word = Sql_create_word_v2; sql_create_link = Sql_create_link_v2;} + flds.Add_int_pkey_autonum("word_id"); + fld_page_id = flds.Add_int("page_id"); + fld_word_text = flds.Add_str("word_text", 255); + } + 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_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} + public void Insert_cmd_by_batch(int page_id, byte[] word) { + stmt_insert.Clear() + .Val_int(fld_page_id, page_id).Val_bry_as_str(fld_word_text, word) + .Exec_insert(); + } + public void Make_data(Gfo_usr_dlg usr_dlg, Xowd_search_link_tbl search_link_tbl, Xowd_search_word_tbl search_word_tbl) { + conn.Ddl_create_idx(usr_dlg, Db_meta_idx.new_unique_by_tbl(tbl_name, "main", fld_word_text, fld_page_id)); + conn.Exec_sql_plog_txn("search_temp.create_word", sql_create_word); + conn.Exec_sql_plog_txn("search_temp.create_link", sql_create_link); + Create_idx(usr_dlg, search_link_tbl, search_word_tbl); + conn.Env_vacuum(); + } + public void Create_idx(Gfo_usr_dlg usr_dlg, Xowd_search_link_tbl search_link_tbl, Xowd_search_word_tbl search_word_tbl) { + conn.Ddl_delete_tbl(tbl_name); + try {search_word_tbl.Create_idx();} + catch (Exception e) {usr_dlg.Warn_many("", "", "bldr.search_word.unique_search_failed: err=~{0}", Err_.Message_gplx_brief(e));} + try {search_link_tbl.Create_idx_unique();} + catch (Exception e) { + usr_dlg.Warn_many("", "", "bldr.search_page.unique_search_failed: err=~{0}", Err_.Message_gplx_brief(e)); + search_link_tbl.Create_idx_normal();; + } + } + private static final String Sql_create_word_v1 = String_.Concat_lines_nl + ( "INSERT INTO search_title_word (stw_word_id, stw_word)" + , "SELECT word_id" + , ", word_text" + , "FROM search_temp" + , "GROUP BY " + , " word_text" + , ";" + ); + private static final String Sql_create_link_v1 = String_.Concat_lines_nl + ( "INSERT INTO search_title_page (stp_word_id, stp_page_id)" + , "SELECT w.stw_word_id" + , ", t.page_id" + , "FROM search_temp t" + , " JOIN search_title_word w ON t.word_text = w.stw_word" + , ";" + ); + private static final String Sql_create_word_v2 = String_.Concat_lines_nl + ( "INSERT INTO search_word (word_id, word_text)" + , "SELECT word_id" + , ", word_text" + , "FROM search_temp" + , "GROUP BY " + , " word_text" + , ";" + ); + private static final String Sql_create_link_v2 = String_.Concat_lines_nl + ( "INSERT INTO search_link (word_id, page_id)" + , "SELECT w.word_id" + , ", t.page_id" + , "FROM search_temp t" + , " JOIN search_word w ON t.word_text = w.word_text" + , ";" + ); +} diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_word_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_word_tbl.java new file mode 100644 index 000000000..8240a5fff --- /dev/null +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_word_tbl.java @@ -0,0 +1,71 @@ +/* +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 . +*/ +package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; +import gplx.core.primitives.*; import gplx.dbs.*; import gplx.dbs.qrys.*; +public class Xowd_search_word_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_text; + private final Db_conn conn; private Db_stmt stmt_insert, stmt_select_id; + public Xowd_search_word_tbl(Db_conn conn, boolean schema_is_1) { + this.conn = conn; + String fld_prefix = "", fld_text_name = "word_text"; + if (schema_is_1) {tbl_name = "search_title_word"; fld_prefix = "stw_"; fld_text_name = "stw_word";} + else {tbl_name = "search_word";} + fld_id = flds.Add_int_pkey(fld_prefix + "word_id"); + fld_text = flds.Add_str(fld_text_name, 255); + conn.Rls_reg(this); + } + public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds));} + public void Create_idx() {conn.Ddl_create_idx(Xoa_app_.Usr_dlg(), Db_meta_idx.new_unique_by_tbl(tbl_name, "main", fld_text, fld_id));} + public void Insert_bgn() {conn.Txn_bgn(); stmt_insert = conn.Stmt_insert(tbl_name, flds);} + public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} + public void Insert_cmd_by_batch(int id, byte[] word) { + stmt_insert.Clear().Val_int(fld_id, id).Val_bry_as_str(fld_text, word).Exec_insert(); + } + public int Select_id(byte[] word) { + if (stmt_select_id == null) stmt_select_id = conn.Stmt_select(tbl_name, flds, fld_text); + Db_rdr rdr = stmt_select_id.Clear().Crt_bry(fld_text, word).Exec_select__rls_auto(); + try {return rdr.Move_next() ? rdr.Read_int(fld_id) : Id_null;} + finally {rdr.Rls();} + } + public void Select_by_word(Cancelable cancelable, Xowd_search_link_tbl search_page_tbl, ListAdp rv, byte[] search, int results_max) { + gplx.core.criterias.Criteria crt = null; + if (Bry_.Has(search, Byte_ascii.Asterisk)) { + search = Bry_.Replace(search, Byte_ascii.Asterisk, Byte_ascii.Percent); + crt = Db_crt_.like_ (fld_text, String_.new_utf8_(search)); + } + else + crt = Db_crt_.eq_ (fld_text, String_.new_utf8_(search)); + Db_qry__select_cmd qry = Db_qry_.select_().Cols_(fld_id).From_(tbl_name).Where_(crt); + + ListAdp words = ListAdp_.new_(); + Db_rdr rdr = conn.Stmt_new(qry).Crt_bry_as_str(fld_text, search).Exec_select__rls_auto(); + try { + while (rdr.Move_next()) + words.Add(Int_obj_val.new_(rdr.Read_int(fld_id))); + } + finally {rdr.Rls();} + + search_page_tbl.Select_in(cancelable, rv, words); + } + public void Rls() { + stmt_insert = Db_stmt_.Rls(stmt_insert); + stmt_select_id = Db_stmt_.Rls(stmt_select_id); + } + public static final int Id_null = -1; +} diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_site_ns_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_site_ns_tbl.java new file mode 100644 index 000000000..1a3876bd7 --- /dev/null +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_site_ns_tbl.java @@ -0,0 +1,83 @@ +/* +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 . +*/ +package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; +import gplx.dbs.*; import gplx.dbs.qrys.*; +public class Xowd_site_ns_tbl { + private final String tbl_name; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private final String fld_id, fld_name, fld_case, fld_count, fld_is_alias; + private final Db_conn conn; + public Xowd_site_ns_tbl(Db_conn conn, boolean schema_is_1) { + this.conn = conn; + this.tbl_name = schema_is_1 ? "xowa_ns" : "site_ns"; + fld_id = flds.Add_int_pkey ("ns_id"); + fld_name = flds.Add_str ("ns_name", 255); + fld_case = flds.Add_byte ("ns_case"); + fld_is_alias = flds.Add_bool ("ns_is_alias"); + fld_count = flds.Add_int ("ns_count"); + } + public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds));} + public void Insert(Xow_ns_mgr ns_mgr) { + Db_stmt stmt = conn.Stmt_insert(tbl_name, flds); + int len = ns_mgr.Ids_len(); + for (int i = 0; i < len; i++) { + Xow_ns ns = ns_mgr.Ids_get_at(i); + stmt.Clear() + .Val_int(fld_id, ns.Id()) + .Val_str(fld_name, ns.Name_str()) + .Val_byte(fld_case, ns.Case_match()) + .Val_bool_as_byte(fld_is_alias, ns.Is_alias()) + .Val_int(fld_count, ns.Count()) + .Exec_insert(); + ; + } + } + public void Select_all(Xow_ns_mgr ns_mgr) { + Db_rdr rdr = conn.Stmt_select(tbl_name, flds).Exec_select__rls_auto(); + try { + ns_mgr.Clear(); + while (rdr.Move_next()) { + int ns_id = rdr.Read_int(fld_id); + byte[] ns_name = rdr.Read_bry_by_str(fld_name); + byte ns_case_match = rdr.Read_byte(fld_case); + int ns_count = rdr.Read_int(fld_count); + boolean ns_is_alias = rdr.Read_byte(fld_is_alias) == Bool_.Y_byte; + ns_mgr.Add_new(ns_id, ns_name, ns_case_match, ns_is_alias); + if (ns_id < 0) continue; // don't load counts for Special / Media + Xow_ns ns = ns_mgr.Ids_get_or_null(ns_id); + ns.Count_(ns_count); + if (ns_count > 0) ns.Exists_(true); // ns has article; mark it as exists, else Talk tab won't show; DATE:2013-12-04 + } + ns_mgr.Init(); + } finally {rdr.Rls();} + } + public int Select_ns_count(int ns_id) { + Db_rdr rdr = conn.Stmt_select(tbl_name, flds, String_.Ary(fld_id)) + .Crt_int(fld_id, ns_id) + .Exec_select__rls_auto(); + try { + return rdr.Move_next() ? Int_.cast_(rdr.Read_int(fld_count)) : 0; + } finally {rdr.Rls();} + } + public void Update_ns_count(int ns_id, int ns_count) { + Db_stmt stmt = conn.Stmt_update(tbl_name, String_.Ary(fld_id), fld_count); + stmt.Clear() + .Val_int(fld_count, ns_count) + .Crt_int(fld_id, ns_id) + .Exec_update(); + } +} diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_site_stats_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_site_stats_tbl.java new file mode 100644 index 000000000..ff1b6b703 --- /dev/null +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_site_stats_tbl.java @@ -0,0 +1,52 @@ +/* +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 . +*/ +package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; +import gplx.dbs.*; +public class Xowd_site_stats_tbl { + private final String tbl_name = "site_stats"; + private final String fld_row_id, fld_good_articles, fld_total_pages, fld_images; + private final Db_conn conn; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + public Xowd_site_stats_tbl(Db_conn conn, boolean schema_is_1) { + this.conn = conn; + fld_row_id = flds.Add_int_pkey("ss_row_id"); + fld_good_articles = flds.Add_long("ss_good_articles"); + fld_total_pages = flds.Add_long("ss_total_pages"); + fld_images = flds.Add_int("ss_images"); + } + public void Create_tbl() { + conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds)); + conn.Stmt_insert(tbl_name, flds).Val_int(fld_row_id, Site_stats_row_id).Val_long(fld_good_articles, 0).Val_long(fld_total_pages, 0).Val_int(fld_images, 0).Exec_insert(); + } + public void Update(int num_articles, int num_pages, int num_files) { + Db_stmt stmt = conn.Stmt_update(tbl_name, String_.Ary(fld_row_id), fld_good_articles, fld_total_pages, fld_images); + stmt.Val_long(fld_good_articles, num_articles).Val_long(fld_total_pages, num_pages).Val_int(fld_images, num_files) + .Crt_int(fld_row_id, Site_stats_row_id) + .Exec_update(); + } + public void Select(Xow_wiki_stats stats) { + Db_rdr rdr = conn.Stmt_select(tbl_name, flds, fld_row_id).Crt_int(fld_row_id, Site_stats_row_id).Exec_select__rls_auto(); + try { + if (rdr.Move_next()) { + stats.NumArticles_ (rdr.Read_int(fld_good_articles)); + stats.NumPages_ (rdr.Read_int(fld_total_pages)); + stats.NumFiles_ (rdr.Read_int(fld_images)); + } + } finally {rdr.Rls();} + } + private static final int Site_stats_row_id = 1; +} diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_text_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_text_tbl.java new file mode 100644 index 000000000..31fe63eea --- /dev/null +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_text_tbl.java @@ -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 . +*/ +package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; +import gplx.ios.*; import gplx.dbs.*; import gplx.dbs.utls.*; +public class Xowd_text_tbl implements RlsAble { + private final String tbl_name = "text"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private final String fld_page_id, fld_text_data; + private final Db_conn conn; private Db_stmt stmt_select, stmt_insert; + private final Io_stream_zip_mgr zip_mgr = Xoa_app_.Utl__zip_mgr(); private final byte zip_tid; + public String Fld_text_data() {return fld_text_data;} + public Xowd_text_tbl(Db_conn conn, boolean schema_is_1, byte zip_tid) { + this.conn = conn; this.zip_tid = zip_tid; + String fld_text_data_name = ""; + fld_text_data_name = schema_is_1 ? "old_text" : "text_data"; + fld_page_id = flds.Add_int_pkey("page_id"); + fld_text_data = flds.Add_bry(fld_text_data_name); + conn.Rls_reg(this); + } + 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_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} + public void Insert_cmd_by_batch(int page_id, byte[] text_data) { + stmt_insert.Clear().Val_int(fld_page_id, page_id).Val_bry(fld_text_data, text_data).Exec_insert(); + } + public void Update(int page_id, byte[] text) { + Db_stmt stmt = conn.Stmt_update_exclude(tbl_name, flds, fld_page_id); + text = zip_mgr.Zip(zip_tid, text); + stmt.Clear().Val_bry(fld_text_data, text).Crt_int(fld_page_id, page_id).Exec_update(); + } + public byte[] Select(int page_id) { + if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_page_id); + Db_rdr rdr = stmt_select.Clear().Val_int(fld_page_id, page_id).Exec_select__rls_manual(); + try { + byte[] rv = (byte[])rdr.Read_bry(fld_text_data); + rv = zip_mgr.Unzip(zip_tid, rv); + return rv; + } finally {rdr.Rls();} + } + public byte[] Zip(byte[] data) {return zip_mgr.Zip(zip_tid, data);} + public void Rls() { + stmt_select = Db_stmt_.Rls(stmt_select); + stmt_insert = Db_stmt_.Rls(stmt_insert); + } +} diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_wbase_pid_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_wbase_pid_tbl.java new file mode 100644 index 000000000..5f4cd31b3 --- /dev/null +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_wbase_pid_tbl.java @@ -0,0 +1,58 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; +import gplx.dbs.*; import gplx.xowa.xtns.wdatas.*; +public class Xowd_wbase_pid_tbl implements RlsAble { + private final String tbl_name; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private final String fld_src_lang, fld_src_ttl, fld_trg_ttl; + private final Db_conn conn; private Db_stmt stmt_select, stmt_insert; + public Xowd_wbase_pid_tbl(Db_conn conn, boolean schema_is_1) { + this.conn = conn; + String fld_prefix = ""; + if (schema_is_1) {tbl_name = "wdata_pids"; fld_prefix = "wp_";} + else {tbl_name = "wbase_pid";} + fld_src_lang = flds.Add_str(fld_prefix + "src_lang", 255); + fld_src_ttl = flds.Add_str(fld_prefix + "src_ttl", 512); + fld_trg_ttl = flds.Add_str(fld_prefix + "trg_ttl", 512); + conn.Rls_reg(this); + } + public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds));} + public void Create_idx() {conn.Ddl_create_idx(Xoa_app_.Usr_dlg(), Db_meta_idx.new_normal_by_tbl(tbl_name, "src", fld_src_lang, fld_src_ttl));} + public void Insert_bgn() {conn.Txn_bgn(); stmt_insert = conn.Stmt_insert(tbl_name, flds);} + public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} + public void Insert_cmd_by_batch(byte[] src_lang, byte[] src_ttl, byte[] trg_ttl) { + stmt_insert.Clear() + .Val_bry_as_str(fld_src_lang, src_lang).Val_bry_as_str(fld_src_ttl, src_ttl).Val_bry_as_str(fld_trg_ttl, trg_ttl) + .Exec_insert(); + } + public int Select_pid(byte[] src_lang, byte[] src_ttl) { + if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_src_lang, fld_src_ttl); + Db_rdr rdr = stmt_select.Clear() + .Crt_bry_as_str(fld_src_lang, src_lang).Crt_bry_as_str(fld_src_ttl, src_ttl) + .Exec_select__rls_manual(); + try { + if (!rdr.Move_next()) return Wdata_wiki_mgr.Pid_null; // occurs when pid exists, but does not have entry for language; see hu.w:Marco Polo argali; DATE: 2014-02-01 + byte[] pid_bry = rdr.Read_bry_by_str(fld_trg_ttl); + return pid_bry == null ? Wdata_wiki_mgr.Pid_null : Bry_.Xto_int_or(pid_bry, 1, pid_bry.length, Wdata_wiki_mgr.Pid_null); + } finally {rdr.Rls();} + } + public void Rls() { + stmt_insert = Db_stmt_.Rls(stmt_insert); + stmt_select = Db_stmt_.Rls(stmt_select); + } +} diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_wbase_qid_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_wbase_qid_tbl.java new file mode 100644 index 000000000..37083a730 --- /dev/null +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_wbase_qid_tbl.java @@ -0,0 +1,57 @@ +/* +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 . +*/ +package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; +import gplx.dbs.*; +public class Xowd_wbase_qid_tbl implements RlsAble { + private final String tbl_name; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private final String fld_src_wiki, fld_src_ns, fld_src_ttl, fld_trg_ttl; + private final Db_conn conn; private Db_stmt stmt_select, stmt_insert; + public Xowd_wbase_qid_tbl(Db_conn conn, boolean schema_is_1) { + this.conn = conn; + String fld_prefix = ""; + if (schema_is_1) {tbl_name = "wdata_qids"; fld_prefix = "wq_";} + else {tbl_name = "wbase_qid";} + fld_src_wiki = flds.Add_str(fld_prefix + "src_wiki", 255); + fld_src_ns = flds.Add_int(fld_prefix + "src_ns"); + fld_src_ttl = flds.Add_str(fld_prefix + "src_ttl", 512); + fld_trg_ttl = flds.Add_str(fld_prefix + "trg_ttl", 512); + conn.Rls_reg(this); + } + public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds));} + public void Create_idx() {conn.Ddl_create_idx(Xoa_app_.Usr_dlg(), Db_meta_idx.new_normal_by_tbl(tbl_name, "src", fld_src_wiki, fld_src_ns, fld_src_ttl));} + public void Insert_bgn() {conn.Txn_bgn(); stmt_insert = conn.Stmt_insert(tbl_name, flds);} + public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} + public void Insert_cmd_by_batch(byte[] src_wiki, int src_ns, byte[] src_ttl, byte[] trg_ttl) { + stmt_insert.Clear() + .Val_bry_as_str(fld_src_wiki, src_wiki).Val_int(fld_src_ns, src_ns).Val_bry_as_str(fld_src_ttl, src_ttl).Val_bry_as_str(fld_trg_ttl,trg_ttl) + .Exec_insert(); + } + public byte[] Select_qid(byte[] src_wiki, byte[] src_ns, byte[] src_ttl) { + if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_src_wiki, fld_src_ns, fld_src_ttl); + Db_rdr rdr = stmt_select.Clear() + .Crt_bry_as_str(fld_src_wiki, src_wiki).Crt_int(fld_src_ns, Bry_.Xto_int(src_ns)).Crt_bry_as_str(fld_src_ttl,src_ttl) + .Exec_select__rls_manual(); + try { + return rdr.Move_next() ? rdr.Read_bry_by_str(fld_trg_ttl) : null; + } finally {rdr.Rls();} + } + public void Rls() { + stmt_insert = Db_stmt_.Rls(stmt_insert); + stmt_select = Db_stmt_.Rls(stmt_select); + } +} diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_xowa_db_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_xowa_db_tbl.java new file mode 100644 index 000000000..4c7940747 --- /dev/null +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_xowa_db_tbl.java @@ -0,0 +1,89 @@ +/* +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 . +*/ +package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; +import gplx.dbs.*; import gplx.dbs.qrys.*; +import gplx.xowa.wikis.data.*; +public class Xowd_xowa_db_tbl { + private final String tbl_name; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private final String fld_id, fld_type, fld_url, fld_ns_ids, fld_part_id, fld_guid; private boolean schema_is_1; + private final Db_conn conn; private final Db_stmt_bldr stmt_bldr = new Db_stmt_bldr(); + public Xowd_xowa_db_tbl(Db_conn conn, boolean schema_is_1) { + this.conn = conn; this.schema_is_1 = schema_is_1; + this.tbl_name = "xowa_db"; + fld_id = flds.Add_int_pkey ("db_id"); + fld_type = flds.Add_byte ("db_type"); + fld_url = flds.Add_str ("db_url", 512); + if (schema_is_1) { + fld_ns_ids = fld_part_id = fld_guid = Db_meta_fld.Key_null; + } + else { + fld_ns_ids = flds.Add_str ("db_ns_ids", 255); + fld_part_id = flds.Add_int ("db_part_id"); + fld_guid = flds.Add_str ("db_guid", 36); + } + stmt_bldr.Conn_(conn, tbl_name, flds, fld_id); + } + public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds));} + public Xowd_db_file[] Select_all(Xowd_core_db_props props, Io_url wiki_root_dir) { + ListAdp list = ListAdp_.new_(); + Db_rdr rdr = conn.Stmt_select(tbl_name, flds).Exec_select__rls_auto(); + try { + while (rdr.Move_next()) { + String ns_ids = ""; int part_id = -1; Guid_adp guid = Guid_adp_.Empty; + if (!schema_is_1) { + ns_ids = rdr.Read_str(fld_ns_ids); + part_id = rdr.Read_int(fld_part_id); + guid = Guid_adp_.parse_(rdr.Read_str(fld_guid)); + } + list.Add(Xowd_db_file.load_(props, rdr.Read_int(fld_id), rdr.Read_byte(fld_type), wiki_root_dir.GenSubFil(rdr.Read_str(fld_url)), ns_ids, part_id, guid)); + } + } finally {rdr.Rls();} + list.SortBy(Xowd_db_file_sorter__id.I); + return (Xowd_db_file[])list.Xto_ary(Xowd_db_file.class); + } + public void Commit_all(Xowd_db_mgr core_data_mgr) { + stmt_bldr.Batch_bgn(); + try { + int len = core_data_mgr.Dbs__len(); + for (int i = 0; i < len; i++) + Commit_itm(core_data_mgr.Dbs__get_at(i)); + } finally {stmt_bldr.Batch_end();} + } + private void Commit_itm(Xowd_db_file 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_id, itm.Id()); Commit_itm_vals(stmt, itm); stmt.Exec_insert(); break; + case Db_cmd_mode.Tid_update: stmt.Clear(); Commit_itm_vals(stmt, itm); stmt.Crt_int(fld_id, itm.Id()).Exec_update(); break; + case Db_cmd_mode.Tid_delete: stmt.Clear().Crt_int(fld_id, 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); + } + private void Commit_itm_vals(Db_stmt stmt, Xowd_db_file itm) { + stmt.Val_byte(fld_type, itm.Tid()).Val_str(fld_url, itm.Url_rel()).Val_str(fld_ns_ids, itm.Ns_ids()).Val_int(fld_part_id, itm.Part_id()).Val_str(fld_guid, itm.Guid().XtoStr()); + } +} +class Xowd_db_file_sorter__id implements gplx.lists.ComparerAble { + public int compare(Object lhsObj, Object rhsObj) { + Xowd_db_file lhs = (Xowd_db_file)lhsObj; + Xowd_db_file rhs = (Xowd_db_file)rhsObj; + return Int_.Compare(lhs.Id(), rhs.Id()); + } + public static final Xowd_db_file_sorter__id I = new Xowd_db_file_sorter__id(); Xowd_db_file_sorter__id() {} +} diff --git a/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_lang_mgr.java b/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_lang_mgr.java index be475435d..1cb4956c4 100644 --- a/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_lang_mgr.java +++ b/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_lang_mgr.java @@ -171,7 +171,7 @@ class Xow_lang_html implements Bry_fmtr_arg { if (i != 0) bfr.Add_byte_comma(); byte[] badge = badges[i]; byte[] badge_cls = (byte[])badges_hash.Get_by_bry(badge); - if (badge_cls == null) Gfo_usr_dlg_._.Warn_many("", "", "unknown badge: badge=~{0}", String_.new_utf8_(badge)); + if (badge_cls == null) Gfo_usr_dlg_.I.Warn_many("", "", "unknown badge: badge=~{0}", String_.new_utf8_(badge)); else bfr.Add(badge_cls); } } diff --git a/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_xwiki_mgr.java b/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_xwiki_mgr.java index 8dca25ba7..e13bd2e1f 100644 --- a/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_xwiki_mgr.java +++ b/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_xwiki_mgr.java @@ -96,7 +96,7 @@ public class Xow_xwiki_mgr implements GfoInvkAble { seen.AddKeyVal(domain); fmtr.Bld_bfr_many(tmp_bfr, key); } - return tmp_bfr.Mkr_rls().Xto_str_and_clear(); + return tmp_bfr.To_str_and_rls(); } public void Add_bulk_peers(byte[] raw) { byte[][] keys = Bry_.Split(raw, Byte_ascii.Tilde); diff --git a/400_xowa/src/gplx/xowa/wmfs/apis/Xoapi_orig_base.java b/400_xowa/src/gplx/xowa/wmfs/apis/Xoapi_orig_base.java index 56798b3e7..685004015 100644 --- a/400_xowa/src/gplx/xowa/wmfs/apis/Xoapi_orig_base.java +++ b/400_xowa/src/gplx/xowa/wmfs/apis/Xoapi_orig_base.java @@ -20,7 +20,7 @@ import gplx.ios.*; import gplx.xowa.files.repos.*; public abstract class Xoapi_orig_base { public boolean Api_query_size(Xoapi_orig_rslts rv, Xof_download_wkr download_wkr, Xow_repo_mgr repo_mgr, byte[] ttl, int width, int height) { if (!gplx.ios.IoEngine_system.Web_access_enabled) return false; // don't check api if download disabled else "download_failed" messages in log (particularly during pkg_make) DATE:2015-02-12 - Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_._; + Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_.I; Xof_repo_pair[] repos = repo_mgr.Repos_ary(); int len = repos.length; for (int i = 0; i < len; i++) { diff --git a/400_xowa/src/gplx/xowa/wmfs/apis/Xoapi_orig_wmf.java b/400_xowa/src/gplx/xowa/wmfs/apis/Xoapi_orig_wmf.java index 28c6112fe..b3e31ea99 100644 --- a/400_xowa/src/gplx/xowa/wmfs/apis/Xoapi_orig_wmf.java +++ b/400_xowa/src/gplx/xowa/wmfs/apis/Xoapi_orig_wmf.java @@ -18,6 +18,7 @@ along with this program. If not, see . package gplx.xowa.wmfs.apis; import gplx.*; import gplx.xowa.*; import gplx.xowa.wmfs.*; public class Xoapi_orig_wmf extends Xoapi_orig_base { @Override public boolean Api_query_size_exec(Xoapi_orig_rslts rv, Xof_download_wkr download_wkr, byte[] ttl, int width, int height, Gfo_usr_dlg usr_dlg, byte[] repo_wiki_key) { + if (Env_.Mode_testing()) return false; // TEST: disable during tests else scrib_lib_title will try to call WMF API; DATE:2015-03-20 String src = Bld_api_url(repo_wiki_key, ttl, width, height); // xrg.Prog_fmt_hdr_(); // TOMBSTONE: do not uncomment; api will reuse whatever's in place byte[] xml = download_wkr.Download_xrg().Exec_as_bry(src); diff --git a/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_page.java b/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_page.java index a6fb7e688..921c8cfcf 100644 --- a/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_page.java +++ b/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_page.java @@ -19,11 +19,12 @@ package gplx.xowa.xtns.dynamicPageList; import gplx.*; import gplx.xowa.*; impor // public class Dpl_page { // public byte[] Ttl_bry() {return ttl_bry;} public Dpl_page Ttl_bry_(byte[] v) {ttl_bry = v; return this;} private byte[] ttl_bry; // } +import gplx.xowa.wikis.data.tbls.*; class Dpl_page_sorter implements gplx.lists.ComparerAble { public Dpl_page_sorter(Dpl_itm itm) {this.itm = itm;} private Dpl_itm itm; public int compare(Object lhsObj, Object rhsObj) { - Xodb_page lhs = (Xodb_page)lhsObj; - Xodb_page rhs = (Xodb_page)rhsObj; + Xowd_page_itm lhs = (Xowd_page_itm)lhsObj; + Xowd_page_itm rhs = (Xowd_page_itm)rhsObj; int multiplier = itm.Sort_ascending() == Bool_.Y_byte ? 1 : -1; switch (itm.Sort_tid()) { case Dpl_sort.Tid_categorysortkey: diff --git a/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_xnde.java b/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_xnde.java index 60dc2bc78..5aa81062f 100644 --- a/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_xnde.java +++ b/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_xnde.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.xtns.dynamicPageList; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.core.primitives.*; import gplx.xowa.html.*; -import gplx.xowa.dbs.*; import gplx.xowa.ctgs.*; +import gplx.xowa.dbs.*; import gplx.xowa.ctgs.*; import gplx.xowa.wikis.data.tbls.*; public class Dpl_xnde implements Xox_xnde, Xop_xnde_atr_parser { private Dpl_itm itm = new Dpl_itm(); private ListAdp pages = ListAdp_.new_(); public void Xatr_parse(Xowe_wiki wiki, byte[] src, Xop_xatr_itm xatr, Object xatr_key_obj) {} // NOTE: has no attributes @@ -47,7 +47,7 @@ public class Dpl_xnde implements Xox_xnde, Xop_xnde_atr_parser { boolean showns = itm.Show_ns(); bfr.Add(html_mode.Grp_bgn()).Add_byte_nl(); for (int i = itms_bgn; i < itms_len; i++) { - Xodb_page page = (Xodb_page)pages.FetchAt(i); + Xowd_page_itm page = (Xowd_page_itm)pages.FetchAt(i); Xoa_ttl ttl = Xoa_ttl.parse_(wiki, page.Ns_id(), page.Ttl_page_db()); byte[] ttl_page_txt = showns ? ttl.Full_txt() : ttl.Page_txt(); if (ttl_page_txt == null) continue; // NOTE: apparently DynamicPageList allows null pages; DATE:2013-07-22 @@ -77,7 +77,7 @@ class Dpl_page_finder { int includes_len = includes.Count(); OrderedHash old_regy = OrderedHash_.new_(), new_regy = OrderedHash_.new_(), cur_regy = OrderedHash_.new_(); Xodb_load_mgr load_mgr = wiki.Db_mgr().Load_mgr(); - Xodb_page tmp_page = new Xodb_page(); + Xowd_page_itm tmp_page = new Xowd_page_itm(); Int_obj_ref tmp_id = Int_obj_ref.zero_(); ListAdp del_list = ListAdp_.new_(); int ns_filter = itm.Ns_filter(); @@ -96,12 +96,12 @@ class Dpl_page_finder { int pages_len = old_regy.Count(); for (int i = 0; i < pages_len; i++) { // loop over old and create pages Int_obj_ref old_id = (Int_obj_ref)old_regy.FetchAt(i); - rv.Add(new Xodb_page().Id_(old_id.Val())); + rv.Add(new Xowd_page_itm().Id_(old_id.Val())); } wiki.Db_mgr().Load_mgr().Load_by_ids(Cancelable_.Never, rv, 0, pages_len); - rv.SortBy(Xodb_page_sorter.IdAsc); + rv.SortBy(Xowd_page_itm_sorter.IdAsc); } - private static void Find_excludes(OrderedHash exclude_pages, Xodb_load_mgr load_mgr, Xodb_page tmp_page, Int_obj_ref tmp_id, ListAdp exclude_ctgs) { + private static void Find_excludes(OrderedHash exclude_pages, Xodb_load_mgr load_mgr, Xowd_page_itm tmp_page, Int_obj_ref tmp_id, ListAdp exclude_ctgs) { if (exclude_ctgs == null) return; int exclude_ctgs_len = exclude_ctgs.Count(); for (int i = 0; i < exclude_ctgs_len; i++) { @@ -109,7 +109,7 @@ class Dpl_page_finder { Find_pages_in_ctg(exclude_pages, load_mgr, tmp_page, tmp_id, exclude_ctg); } } - private static void Find_pages_in_ctg(OrderedHash list, Xodb_load_mgr load_mgr, Xodb_page tmp_page, Int_obj_ref tmp_id, byte[] ctg_ttl) { + private static void Find_pages_in_ctg(OrderedHash list, Xodb_load_mgr load_mgr, Xowd_page_itm tmp_page, Int_obj_ref tmp_id, byte[] ctg_ttl) { Xoctg_view_ctg ctg = new Xoctg_view_ctg().Name_(ctg_ttl); load_mgr.Load_ctg_v1(ctg, ctg_ttl); diff --git a/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_html_wtr.java b/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_html_wtr.java index 7683c5366..ce6df9e50 100644 --- a/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_html_wtr.java +++ b/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_html_wtr.java @@ -167,7 +167,7 @@ class Gallery_html_wtr_ { Bry_bfr caption_bfr = wiki.Utl__bfr_mkr().Get_k004(); Xop_root_tkn caption_root = itm.Caption_tkn(); wtr.Write_tkn(caption_bfr, ctx, hctx, caption_root.Root_src(), caption_root, Xoh_html_wtr.Sub_idx_null, caption_root); - rv = caption_bfr.Mkr_rls().Xto_bry_and_clear(); + rv = caption_bfr.To_bry_and_rls(); } return rv; } diff --git a/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_itm_parser.java b/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_itm_parser.java index f25403da6..32542b825 100644 --- a/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_itm_parser.java +++ b/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_itm_parser.java @@ -70,7 +70,7 @@ public class Gallery_itm_parser { Xopg_redlink_logger file_wkr = ctx.Lnki().File_wkr(); // NOTE: do not set file_wkr ref early (as member var); parse_all sets late ctx.Cur_page().Lnki_list().Add(lnki_tkn); mgr.Get_thumb_size(lnki_tkn, cur_itm.Ext()); // NOTE: set thumb size, so that lnki.temp parse picks it up - if (file_wkr != null) file_wkr.Wkr_exec(ctx, src, lnki_tkn, gplx.xowa.bldrs.files.Xob_lnki_src_tid.Tid_gallery); + if (file_wkr != null) file_wkr.Wkr_exec(ctx, src, lnki_tkn, gplx.xowa.bldrs.cmds.files.Xob_lnki_src_tid.Tid_gallery); lnki_tkn.W_(-1).H_(-1); // NOTE: reset lnki back to defaults, else itm will show as large missing caption } private byte Parse_itm() { @@ -218,7 +218,7 @@ public class Gallery_itm_parser { private static final byte Mode_eos = 1, Mode_nl = 2, Mode_pipe = 3, Mode_text = 4; private void Init_keyword(Byte_obj_ref tmp_bref, Xol_lang lang, int kwd_id, byte trie_key) { Xol_kwd_grp grp = lang.Kwd_mgr().Get_at(kwd_id); - if (grp == null) {Gfo_usr_dlg_._.Warn_many("", "", "could not find gallery keyword: ~{0}", String_.new_utf8_(Xol_kwd_grp_.Bry_by_id(kwd_id))); return;} + if (grp == null) {Gfo_usr_dlg_.I.Warn_many("", "", "could not find gallery keyword: ~{0}", String_.new_utf8_(Xol_kwd_grp_.Bry_by_id(kwd_id))); return;} Xol_kwd_itm[] itms = grp.Itms(); int len = itms.length; Byte_obj_val trie_ref = Byte_obj_val.new_(trie_key); diff --git a/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_xnde.java b/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_xnde.java index b943bed68..7904f9ed2 100644 --- a/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_xnde.java +++ b/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_xnde.java @@ -83,8 +83,8 @@ public class Gallery_xnde implements Xox_xnde, Xop_xnde_atr_parser { } } private void Init_atrs(Xowe_wiki wiki) { - Db_cfg_grp cfg_grp = wiki.File_mgr().Cfg_get(Xof_fsdb_mgr_cfg.Grp_xowa); - if (cfg_grp.Get_yn_or_n(Xof_fsdb_mgr_cfg.Key_gallery_fix_defaults)) { + Db_cfg_hash cfg_grp = wiki.File_mgr().Cfg_get(Xof_fsdb_mgr_cfg.Grp_xowa); + if (cfg_grp.Get(Xof_fsdb_mgr_cfg.Key_gallery_fix_defaults).To_yn_or_n()) { if (itm_w == Gallery_xnde.Null && itm_h == Gallery_xnde.Null) // if no w/h specified, set both to default (just like v1) itm_w = itm_h = Gallery_xnde.Default; } @@ -94,7 +94,7 @@ public class Gallery_xnde implements Xox_xnde, Xop_xnde_atr_parser { } gallery_mgr = Gallery_mgr_base_.New_by_mode(mode); if ( !wiki.File_mgr().Version_1_y() // v2: fsdb - && !cfg_grp.Get_yn_or_n(Xof_fsdb_mgr_cfg.Key_gallery_packed) // packed not supported + && !cfg_grp.Get(Xof_fsdb_mgr_cfg.Key_gallery_packed).To_yn_or_n() // packed not supported ) { gallery_mgr = Gallery_mgr_base_.New_by_mode(Gallery_mgr_base_.Traditional_tid); // always go to traditional html_wtr_v1 = true; diff --git a/400_xowa/src/gplx/xowa/xtns/geoCrumbs/Geoc_isin_func.java b/400_xowa/src/gplx/xowa/xtns/geoCrumbs/Geoc_isin_func.java index a8525f5cb..648a3fdaf 100644 --- a/400_xowa/src/gplx/xowa/xtns/geoCrumbs/Geoc_isin_func.java +++ b/400_xowa/src/gplx/xowa/xtns/geoCrumbs/Geoc_isin_func.java @@ -27,7 +27,7 @@ public class Geoc_isin_func extends Pf_func_base { byte[] lnki_ttl = Bry_.Add(Xop_tkn_.Lnki_bgn, ttl_bry, Xop_tkn_.Lnki_end); // make "[[ttl]]" Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_b128(); wiki.Parser().Parse_text_to_html(tmp_bfr, ctx.Cur_page(), false, lnki_ttl); - ctx.Cur_page().Html_data().Content_sub_(tmp_bfr.Mkr_rls().Xto_bry_and_clear()); + ctx.Cur_page().Html_data().Content_sub_(tmp_bfr.To_bry_and_rls()); } public static final Geoc_isin_func _ = new Geoc_isin_func(); } diff --git a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_map.java b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_map.java index 7a544a21d..9107703bd 100644 --- a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_map.java +++ b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_map.java @@ -47,7 +47,7 @@ public class Imap_map implements Xoh_file_img_wkr, Js_img_wkr { Xowe_wiki wiki = xtn_mgr.Wiki(); Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_k004(); Write_imap_div(tmp_bfr, Xoh_wtr_ctx.Basic, html_uid, html_w, html_h, Bry_.new_utf8_(html_src), orig_w, orig_h, lnki_ttl); - js_wkr.Html_elem_replace_html("imap_div_" + Int_.Xto_str(html_uid), tmp_bfr.Mkr_rls().Xto_str_and_clear()); + js_wkr.Html_elem_replace_html("imap_div_" + Int_.Xto_str(html_uid), tmp_bfr.To_str_and_rls()); } private void Write_imap_div(Bry_bfr bfr, Xoh_wtr_ctx hctx, int html_uid, int html_w, int html_h, byte[] html_src, int orig_w, int orig_h, byte[] lnki_ttl) { byte[] desc_style = Calc_desc_style(html_w, html_h); diff --git a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser.java b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser.java index 6372f6695..834892848 100644 --- a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser.java +++ b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.xtns.imaps; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.core.btries.*; import gplx.core.primitives.*; import gplx.xowa.parsers.lnkis.redlinks.*; class Imap_parser { - private Imap_xtn_mgr xtn_mgr; private Xoa_url page_url; private Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_._; + private Imap_xtn_mgr xtn_mgr; private Xoa_url page_url; private Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_.I; private byte[] imap_img_src; private Imap_itm_img imap_img; private Imap_itm_dflt imap_dflt; @@ -194,7 +194,7 @@ class Imap_parser { imap_img = new Imap_itm_img(lnki_tkn); lnki_tkn.Lnki_file_wkr_(imap); wiki_ctx.Cur_page().Lnki_list().Add(lnki_tkn); - if (file_wkr != null) file_wkr.Wkr_exec(wiki_ctx, src, lnki_tkn, gplx.xowa.bldrs.files.Xob_lnki_src_tid.Tid_imageMap); + if (file_wkr != null) file_wkr.Wkr_exec(wiki_ctx, src, lnki_tkn, gplx.xowa.bldrs.cmds.files.Xob_lnki_src_tid.Tid_imageMap); } return img_end; } diff --git a/400_xowa/src/gplx/xowa/xtns/listings/Listing_xnde.java b/400_xowa/src/gplx/xowa/xtns/listings/Listing_xnde.java index 13495d856..264bb2ee9 100644 --- a/400_xowa/src/gplx/xowa/xtns/listings/Listing_xnde.java +++ b/400_xowa/src/gplx/xowa/xtns/listings/Listing_xnde.java @@ -102,7 +102,7 @@ public class Listing_xnde implements Xox_xnde, Xop_xnde_atr_parser { } bfr.Add(Xoa_consts.Invk_end); // "}}" Xop_ctx sub_ctx = Xop_ctx.new_sub_(wiki); - html_output = wiki.Parser().Parse_text_to_html(sub_ctx, bfr.Mkr_rls().Xto_bry_and_clear()); + html_output = wiki.Parser().Parse_text_to_html(sub_ctx, bfr.To_bry_and_rls()); return true; } private void Bld_by_args(Listing_xtn_mgr xtn_mgr, Html_wtr wtr, Xop_xnde_tkn xnde, byte[] src) { diff --git a/400_xowa/src/gplx/xowa/xtns/lst/Lst_pfunc_wkr.java b/400_xowa/src/gplx/xowa/xtns/lst/Lst_pfunc_wkr.java index 3a13212b6..29bf403be 100644 --- a/400_xowa/src/gplx/xowa/xtns/lst/Lst_pfunc_wkr.java +++ b/400_xowa/src/gplx/xowa/xtns/lst/Lst_pfunc_wkr.java @@ -44,7 +44,7 @@ public class Lst_pfunc_wkr { Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_m001(); page.Tmpl_stack_del(); // take template off stack; evaluate will never recurse, and will fail if ttl is still on stack; DATE:2014-03-10 defn_tmpl.Tmpl_evaluate(sub_ctx, Xot_invk_temp.Page_is_caller, tmp_bfr); - src = tmp_bfr.Mkr_rls().Xto_bry_and_clear(); + src = tmp_bfr.To_bry_and_rls(); if (!page.Tmpl_stack_add(src_ttl.Full_db())) return; // put template back on stack; Xop_root_tkn root = wiki.Parser().Parse_text_to_wdom(sub_ctx, src, true); // NOTE: pass sub_ctx as old_ctx b/c entire document will be parsed, and references outside the section should be ignored; src = root.Data_mid(); // NOTE: must set src to root.Data_mid() which is result of parse; else will break text; DATE:2013-07-11 diff --git a/400_xowa/src/gplx/xowa/xtns/pfuncs/Pf_func_.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/Pf_func_.java index 425e4372b..bb01cd8d8 100644 --- a/400_xowa/src/gplx/xowa/xtns/pfuncs/Pf_func_.java +++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/Pf_func_.java @@ -384,6 +384,6 @@ class Pf_func_bang extends Pf_func_base { @Override public int Id() {return Xol_kwd_grp_.Id_bang;} @Override public void Func_evaluate(Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk self, Bry_bfr bfr) {bfr.Add_byte_pipe();} @Override public Pf_func New(int id, byte[] name) {return this;} - public static final Pf_func_bang _ = new Pf_func_bang(); + public static final Pf_func_bang _ = new Pf_func_bang(); Pf_func_bang() {this.Name_(Byte_ascii.Bang_bry);} } diff --git a/400_xowa/src/gplx/xowa/xtns/pfuncs/ifs/Pfunc_ifexist_mgr.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/ifs/Pfunc_ifexist_mgr.java index 7adeb0b7b..7d0aa2c58 100644 --- a/400_xowa/src/gplx/xowa/xtns/pfuncs/ifs/Pfunc_ifexist_mgr.java +++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/ifs/Pfunc_ifexist_mgr.java @@ -16,9 +16,9 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.xtns.pfuncs.ifs; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.pfuncs.*; -import gplx.xowa.wmfs.apis.*; +import gplx.xowa.wmfs.apis.*; import gplx.xowa.wikis.data.tbls.*; public class Pfunc_ifexist_mgr { - private Xodb_page db_page = Xodb_page.new_tmp(); + private Xowd_page_itm db_page = Xowd_page_itm.new_tmp(); private HashAdp regy = HashAdp_.new_bry_(); public void Clear() {regy.Clear();} public boolean Exists(Xowe_wiki wiki, byte[] raw_bry) { @@ -44,8 +44,8 @@ public class Pfunc_ifexist_mgr { boolean rv = wiki.Db_mgr().Load_mgr().Load_by_ttl(db_page, ns, ttl_bry); if ( !rv && wiki.Lang().Vnt_mgr().Enabled()) { - Xodb_page page = wiki.Lang().Vnt_mgr().Convert_ttl(wiki, ns, ttl_bry); - if (page != Xodb_page.Null) + Xowd_page_itm page = wiki.Lang().Vnt_mgr().Convert_ttl(wiki, ns, ttl_bry); + if (page != Xowd_page_itm.Null) rv = page.Exists(); } itm.Exists_(rv); @@ -66,7 +66,7 @@ public class Pfunc_ifexist_mgr { } else { if (!env_is_testing) - wiki.File_mgr().Fsdb_mgr().Init_by_wiki(wiki); // NOTE: must init Fsdb_mgr (else conn == null), and with bin_wkrs (else no images will ever load); DATE:2014-09-21 + wiki.File_mgr().Init_file_mgr_by_load(wiki); // NOTE: must init Fsdb_mgr (else conn == null), and with bin_wkrs (else no images will ever load); DATE:2014-09-21 return wiki.File_mgr().Exists(ttl_bry); // less-accurate test using either (1) orig_wiki table in local wiki (v2) or (2) meta_db_mgr (v1) } } diff --git a/400_xowa/src/gplx/xowa/xtns/pfuncs/scribunto/Pfunc_scrib_lib.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/scribunto/Pfunc_scrib_lib.java index f8cb37921..6a9a85d05 100644 --- a/400_xowa/src/gplx/xowa/xtns/pfuncs/scribunto/Pfunc_scrib_lib.java +++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/scribunto/Pfunc_scrib_lib.java @@ -43,7 +43,7 @@ public class Pfunc_scrib_lib implements Scrib_lib { byte[] expr_bry = args.Pull_bry(0); Bry_bfr tmp_bfr = core.Wiki().Utl__bfr_mkr().Get_b128(); boolean pass = Pfunc_expr.Evaluate(tmp_bfr, core.Ctx(), expr_bry); - String expr_rslt = tmp_bfr.Mkr_rls().Xto_str_and_clear(); + String expr_rslt = tmp_bfr.To_str_and_rls(); if (pass) return rslt.Init_obj(expr_rslt); else diff --git a/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_filepath_tst.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_filepath_tst.java index c351dd325..cfb6cf7bb 100644 --- a/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_filepath_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_filepath_tst.java @@ -42,7 +42,7 @@ public class Pfunc_filepath_tst { } @Test public void Wiki_is_commons() { fxt.Init_page_create(commons_wiki, "File:A.png", ""); - commons_wiki.Tdb_fsys_mgr().Tdb_dir_regy()[Xotdb_dir_info_.Tid_page].Ext_tid_(gplx.ios.Io_stream_.Tid_file); + commons_wiki.Tdb_fsys_mgr().Tdb_dir_regy()[Xotdb_dir_info_.Tid_page].Ext_tid_(gplx.ios.Io_stream_.Tid_raw); mock_wkr.Redirect_("A.png", "A.png").Repo_idx_(1); fxt.Test_parse_tmpl_str_test("{{filepath:A.png}}", "{{test}}", "file:///mem/xowa/file/commons/trg/orig/7/0/1/c/A.png"); } diff --git a/400_xowa/src/gplx/xowa/xtns/proofreadPage/Pp_pages_nde.java b/400_xowa/src/gplx/xowa/xtns/proofreadPage/Pp_pages_nde.java index f798a8c94..22be468bd 100644 --- a/400_xowa/src/gplx/xowa/xtns/proofreadPage/Pp_pages_nde.java +++ b/400_xowa/src/gplx/xowa/xtns/proofreadPage/Pp_pages_nde.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.xtns.proofreadPage; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.core.primitives.*; import gplx.xowa.html.*; import gplx.xowa.parsers.amps.*; -import gplx.xowa.xtns.lst.*; import gplx.xowa.pages.*; +import gplx.xowa.xtns.lst.*; import gplx.xowa.pages.*; import gplx.xowa.wikis.data.tbls.*; public class Pp_pages_nde implements Xox_xnde, Xop_xnde_atr_parser { private boolean xtn_literal = false; private Xop_root_tkn xtn_root; @@ -263,14 +263,14 @@ public class Pp_pages_nde implements Xox_xnde, Xop_xnde_atr_parser { int len = rslt_count.Val(); int page_leaf_max = 0; for (int i = 0; i < len; i++) { - Xodb_page page = (Xodb_page)rslt.FetchAt(i); + Xowd_page_itm page = (Xowd_page_itm)rslt.FetchAt(i); Xoa_ttl page_ttl = Xoa_ttl.parse_(wiki, ns_page_id, page.Ttl_page_db()); if (page_ttl == null) continue; // page_ttl is not valid; should never happen; byte[] page_ttl_leaf = page_ttl.Leaf_txt(); if (page_ttl_leaf == null) continue; // page is not leaf; should not happen int page_leaf_val = Bry_.Xto_int_or(page_ttl_leaf, Int_.MinValue); if (page_leaf_val == Int_.MinValue) continue; // leaf is not int; ignore if (page_leaf_val > page_leaf_max) page_leaf_max = page_leaf_val; } return page_leaf_max; - } private static Xodb_page tmp_page = new Xodb_page(); // tmp_page passed to Load_ttls_for_all_pages; values are never looked at, so use static instance + } private static Xowd_page_itm tmp_page = new Xowd_page_itm(); // tmp_page passed to Load_ttls_for_all_pages; values are never looked at, so use static instance private ListAdp Get_ttls_from_xnde_args__exclude(ListAdp list) { if (Bry_.Len_eq_0(exclude)) return list; // exclude is blank; exit early; int[] exclude_pages = Int_ary_.Parse_list_or(exclude, null); diff --git a/400_xowa/src/gplx/xowa/xtns/scores/Score_xnde.java b/400_xowa/src/gplx/xowa/xtns/scores/Score_xnde.java index 9dc71c469..71205561c 100644 --- a/400_xowa/src/gplx/xowa/xtns/scores/Score_xnde.java +++ b/400_xowa/src/gplx/xowa/xtns/scores/Score_xnde.java @@ -67,7 +67,7 @@ public class Score_xnde implements Xox_xnde, Xop_xnde_atr_parser, Xoh_cmd_itm { if (ly_process.Exe_exists() == Bool_.N_byte) {Html_write_code_as_pre(bfr, app); return;} Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_b128(); tmp_bfr.Add(code).Add_byte_pipe().Add_int_bool(lang_is_abc).Add_byte_pipe().Add_int_bool(code_is_raw); - sha1 = gplx.security.HashAlgo_.Sha1.Calc_hash_bry(tmp_bfr.Mkr_rls().Xto_bry_and_clear()); // NOTE: MW transforms to base32; for now, keep sha1 as raw + sha1 = gplx.security.HashAlgo_.Sha1.Calc_hash_bry(tmp_bfr.To_bry_and_rls()); // NOTE: MW transforms to base32; for now, keep sha1 as raw sha1_prefix = String_.new_ascii_(sha1, 0, 8); output_dir = app.Fsys_mgr().File_dir().GenSubDir_nest(wiki.Domain_str(), "lilypond", Char_.XtoStr(sha1[0]), Char_.XtoStr(sha1[1]), String_.new_ascii_(sha1)); // NOTE: MW also adds an extra level for 8-len; EX: /.../sha1_32_len/sha1_8_len/ png_file = output_dir.GenSubFil(sha1_prefix + ".png"); diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/Scrib_proc_args.java b/400_xowa/src/gplx/xowa/xtns/scribunto/Scrib_proc_args.java index 55db041ac..4ff5c2248 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/Scrib_proc_args.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/Scrib_proc_args.java @@ -98,7 +98,7 @@ public class Scrib_proc_args { bfr.Add_byte(Byte_ascii.Eq); bfr.Add_str(kv.Val_to_str_or_empty()); } - return bfr.Mkr_rls().Xto_bry_and_clear(); + return bfr.To_bry_and_rls(); } else { wiki.Appe().Usr_dlg().Warn_many("", "", "unknown type for GetUrl query args: ~{0}", ClassAdp_.NameOf_type(qry_args_cls)); diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_language.java b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_language.java index 5d8c5861c..aaf9c1015 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_language.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_language.java @@ -190,7 +190,7 @@ public class Scrib_lib_language implements Scrib_lib { ; // NOTE: MW is actually more strict about date; however, not sure about PHP's date parse, so using more lax version if (date == null || tmp_bfr.Len() > 0) {tmp_bfr.Mkr_rls(); return rslt.Init_fail("bad argument #2 to 'formatDate' (not a valid timestamp)");} Pft_func_formatdate.Date_bldr().Format(tmp_bfr, core.Wiki(), lang, date, fmt_ary); - byte[] rv = tmp_bfr.Mkr_rls().Xto_bry_and_clear(); + byte[] rv = tmp_bfr.To_bry_and_rls(); return rslt.Init_obj(rv); } public boolean ParseFormattedNumber(Scrib_proc_args args, Scrib_proc_rslt rslt) { @@ -229,7 +229,7 @@ public class Scrib_lib_language implements Scrib_lib { byte[] type = args.Pull_bry(2); Bry_bfr bfr = core.Wiki().Utl__bfr_mkr().Get_b512(); lang.Grammar().Grammar_eval(bfr, lang, word, type); - return rslt.Init_obj(bfr.Mkr_rls().Xto_str_and_clear()); + return rslt.Init_obj(bfr.To_str_and_rls()); } public boolean gender(Scrib_proc_args args, Scrib_proc_rslt rslt) {throw Err_.not_implemented_();} public boolean IsRTL(Scrib_proc_args args, Scrib_proc_rslt rslt) { diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_message.java b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_message.java index ac2e27226..23883477e 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_message.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_message.java @@ -133,7 +133,7 @@ class Scrib_lib_message_data { ) { Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b512(); bfr.Add(gplx.html.Html_entity_.Lt_bry).Add(msg_key).Add(gplx.html.Html_entity_.Gt_bry); // NOTE: Message.php has logic that says: if plain, "< >", else "< >"; for now, always use escaped - return bfr.Mkr_rls().Xto_bry_and_clear(); + return bfr.To_bry_and_rls(); } switch (fmt_tid) { case Fmt_tid_parse: @@ -141,7 +141,7 @@ class Scrib_lib_message_data { break; case Fmt_tid_parseAsBlock: // NOTE: MW passes msg_val through parser and strips

    if tid==parse; XOWA does the opposite, so add

    if parseAsBlock requested Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b512(); - msg_val = bfr.Add(Html_tag_.P_lhs).Add(msg_val).Add(Html_tag_.P_rhs).Mkr_rls().Xto_bry_and_clear(); + msg_val = bfr.Add(Html_tag_.P_lhs).Add(msg_val).Add(Html_tag_.P_rhs).To_bry_and_rls(); break; case Fmt_tid_escaped: msg_val = gplx.html.Html_utl.Escape_html_as_bry(msg_val); diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_mw.java b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_mw.java index 0bba43e11..7aa703b5b 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_mw.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_mw.java @@ -236,7 +236,7 @@ public class Scrib_lib_mw implements Scrib_lib { tmp_ctx.Parse_tid_(Xop_parser_.Parse_tid_page_tmpl); // default xnde names to template; needed for test, but should be in place; DATE:2014-06-27 cur_wiki.Parser().Parse_text_to_wtxt(tmp_root, tmp_ctx, tmp_ctx.Tkn_mkr(), text_bry); tmp_root.Tmpl_evaluate(tmp_ctx, text_bry, mock_frame, tmp_bfr); - return rslt.Init_obj(tmp_bfr.Mkr_rls().Xto_str_and_clear()); + return rslt.Init_obj(tmp_bfr.To_str_and_rls()); } public boolean CallParserFunction(Scrib_proc_args args, Scrib_proc_rslt rslt) { String frame_id = args.Pull_str(0); @@ -314,7 +314,7 @@ public class Scrib_lib_mw implements Scrib_lib { Xot_defn_tmpl transclude_tmpl = ctx.Wiki().Parser().Parse_text_to_defn_obj(ctx, ctx.Tkn_mkr(), ttl.Ns(), ttl.Page_db(), sub_src); Bry_bfr sub_bfr = cur_wiki.Utl__bfr_mkr().Get_k004(); transclude_tmpl.Tmpl_evaluate(ctx, sub_frame, sub_bfr); - return rslt.Init_obj(sub_bfr.Mkr_rls().Xto_str_and_clear()); + return rslt.Init_obj(sub_bfr.To_str_and_rls()); } else { // String err_msg = "expand_template failed; ttl=" + ttl_str; diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_title.java b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_title.java index 6ef739a0e..7f48e0f19 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_title.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_title.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.xtns.scribunto.libs; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.scribunto.*; import gplx.core.primitives.*; -import gplx.xowa.wikis.caches.*; import gplx.xowa.xtns.pfuncs.ttls.*; import gplx.xowa.wikis.xwikis.*; +import gplx.xowa.wikis.caches.*; import gplx.xowa.xtns.pfuncs.ttls.*; import gplx.xowa.wikis.xwikis.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa2.files.commons.*; import gplx.xowa.files.origs.*; import gplx.xowa.wmfs.apis.*; public class Scrib_lib_title implements Scrib_lib { @@ -66,7 +66,7 @@ public class Scrib_lib_title implements Scrib_lib { } if (ns_bry != null) { Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b512(); - ttl_bry = bfr.Add(ns_bry).Add_byte(Byte_ascii.Colon).Add(ttl_bry).Mkr_rls().Xto_bry_and_clear(); + ttl_bry = bfr.Add(ns_bry).Add_byte(Byte_ascii.Colon).Add(ttl_bry).To_bry_and_rls(); } Xoa_ttl ttl = Xoa_ttl.parse_(core.Wiki(), ttl_bry); if (ttl == null) return rslt.Init_obj(null); // invalid title; exit; matches MW logic @@ -92,7 +92,7 @@ public class Scrib_lib_title implements Scrib_lib { // bfr.Add(); //} Pfunc_urlfunc.UrlString(core.Ctx(), url_func_tid, false, ttl_bry, bfr, qry_bry); - return rslt.Init_obj(bfr.Mkr_rls().Xto_str_and_clear()); + return rslt.Init_obj(bfr.To_str_and_rls()); } private static final Hash_adp_bry url_func_hash = Hash_adp_bry.ci_ascii_() .Add_str_byte("fullUrl", Pfunc_urlfunc.Tid_full) @@ -123,7 +123,7 @@ public class Scrib_lib_title implements Scrib_lib { tmp_bfr.Add(ns_bry).Add_byte(Byte_ascii.Colon); tmp_bfr.Add_str(ttl_str); if (anchor_str != null) tmp_bfr.Add_byte(Byte_ascii.Hash).Add_str(anchor_str); - Xoa_ttl ttl = Xoa_ttl.parse_(wiki, tmp_bfr.Mkr_rls().Xto_bry_and_clear()); + Xoa_ttl ttl = Xoa_ttl.parse_(wiki, tmp_bfr.To_bry_and_rls()); if (ttl == null) return rslt.Init_obj(null); // invalid title; exit; return rslt.Init_obj(GetInexpensiveTitleData(ttl)); } @@ -159,8 +159,8 @@ public class Scrib_lib_title implements Scrib_lib { // boolean exists = !file_page.Missing(); // if (!exists) return rslt.Init_obj(KeyVal_.Ary(KeyVal_.new_("exists", false))); // NOTE: do not reinstate; will exit early if commons is not installed; DATE:2015-01-25; NOTE: Media objects are often flagged as absent in offline mode // NOTE: MW registers image if deleted; XOWA doesn't register b/c needs width / height also, not just image name - wiki.File_mgr().Fsdb_mgr().Init_by_wiki(wiki); - Xof_orig_itm itm = wiki.File_mgr().Fsdb_mgr().Orig_mgr().Find_by_ttl_or_null(ttl.Page_db()); + wiki.File_mgr().Init_file_mgr_by_load(wiki); + Xof_orig_itm itm = wiki.File_mgr__orig_mgr().Find_by_ttl_or_null(ttl.Page_db()); if (itm == Xof_orig_itm.Null) return rslt.Init_obj(GetFileInfo_absent); KeyVal[] rv = KeyVal_.Ary ( KeyVal_.new_("exists" , true) @@ -225,6 +225,6 @@ public class Scrib_lib_title implements Scrib_lib { if (!ns_file_or_media) rv[rv_idx++] = KeyVal_.new_("file" , false); // REF.MW: if ( $ns !== NS_FILE && $ns !== NS_MEDIA ) $ret['file'] = false; return rv; - } private static final Xodb_page tmp_db_page = Xodb_page.new_tmp(); + } private static final Xowd_page_itm tmp_db_page = Xowd_page_itm.new_tmp(); public static final String Key_wikitexet = "wikitext"; } diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_title_tst.java b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_title_tst.java index e9431be17..c3160225a 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_title_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_title_tst.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.xtns.scribunto.libs; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.scribunto.*; import org.junit.*; import gplx.dbs.*; import gplx.xowa2.files.commons.*; import gplx.xowa.wikis.data.*; -import gplx.xowa.wikis.*; import gplx.xowa.files.*; import gplx.xowa.files.origs.*; import gplx.xowa.files.repos.*; +import gplx.fsdb.*; import gplx.xowa.wikis.*; import gplx.xowa.files.*; import gplx.xowa.files.origs.*; import gplx.xowa.files.repos.*; public class Scrib_lib_title_tst { @Before public void init() { Db_conn_bldr.I.Reg_default_mem(); @@ -96,18 +96,21 @@ public class Scrib_lib_title_tst { fxt.Test_scrib_proc_obj(lib, Scrib_lib_title.Invk_cascadingProtection, Object_.Ary("A") , Scrib_lib_title.CascadingProtection_rv); } private static void Wiki_orig_tbl__create(Xowe_wiki wiki) { - wiki.File_mgr().Fsdb_mgr().Init_by_wiki(wiki); + Xowe_wiki_bldr.Create(wiki, 1, "dump.xml"); + Xowd_db_file text_db = wiki.Data_mgr__core_mgr().Dbs__make_by_tid(Xowd_db_file_.Tid_text); text_db.Tbl__text().Create_tbl(); + Fsdb_db_mgr__v2_bldr.I.Make(wiki); + wiki.File_mgr().Init_file_mgr_by_load(wiki); } private static void Wiki_orig_tbl__insert(Xowe_wiki wiki, String ttl_str, int w, int h) { byte[] ttl_bry = Bry_.new_utf8_(ttl_str); - wiki.File_mgr().Fsdb_mgr().Orig_mgr().Insert(Xof_repo_itm.Repo_remote, ttl_bry, Xof_ext_.new_by_ttl_(ttl_bry).Id(), w, h, Bry_.Empty); + wiki.File_mgr__orig_mgr().Insert(Xof_repo_itm.Repo_remote, ttl_bry, Xof_ext_.new_by_ttl_(ttl_bry).Id(), w, h, Bry_.Empty); } // private static void Init_page_regy(Xowe_wiki wiki, String ttl, int id, boolean is_redirect) { // String url_str = "test/en.wikipedia.org/wiki_page_regy"; -// Db_meta_tbl meta = new Xowd_pg_regy_tbl().new_meta(); +// Db_meta_tbl meta = new Xowd_page_tbl().new_meta(); // Db_conn_pool.I.Set_mem(url_str, meta); -// Db_url url = Db_url_.mem_(url_str); -// Xowd_pg_regy_tbl tbl = new Xowd_pg_regy_tbl(Bool_.N, url); +// Db_conn_info url = Db_conn_info_.mem_(url_str); +// Xowd_page_tbl tbl = new Xowd_page_tbl(Bool_.N, url); // tbl.Insert(id, ns_id, Bry_.new_utf8_(ttl), is_redirect, modified_on, page_len, random_int, text_db_id, html_db_id); // } private static String ttl_fast(int ns_id, String ns_str, String ttl) {return ttl_fast(ns_id, ns_str, ttl, "", "", ttl);} diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_uri.java b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_uri.java index 3eea25a16..cc7b29a72 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_uri.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_uri.java @@ -48,8 +48,8 @@ public class Scrib_lib_uri implements Scrib_lib { Bry_bfr tmp_bfr = core.App().Utl__bfr_mkr().Get_b512(); Pfunc_anchorencode.Func_init(core.Ctx()); Pfunc_anchorencode.Anchor_encode(raw_bry, bfr, tmp_bfr); - tmp_bfr.Mkr_rls().Clear(); - return rslt.Init_obj(bfr.Mkr_rls().Xto_str_and_clear()); + tmp_bfr.Clear_and_rls(); + return rslt.Init_obj(bfr.To_str_and_rls()); } public boolean Url_func(Scrib_proc_args args, Scrib_proc_rslt rslt, byte url_tid) { Xowe_wiki wiki = core.Wiki(); @@ -64,13 +64,13 @@ public class Scrib_lib_uri implements Scrib_lib { ttl_bry = bfr.Xto_bry_and_clear(); } Pfunc_urlfunc.UrlString(core.Ctx(), url_tid, false, ttl_bry, bfr, qry_bry); - return rslt.Init_obj(bfr.Mkr_rls().Xto_str_and_clear()); + return rslt.Init_obj(bfr.To_str_and_rls()); } private boolean Init_uri_for_page(Scrib_proc_args args, Scrib_proc_rslt rslt) { Xop_ctx ctx = core.Ctx(); byte[] ttl_bry = ctx.Cur_page().Ttl().Raw(); Bry_bfr tmp_bfr = ctx.Wiki().Utl__bfr_mkr().Get_b512(); Pfunc_urlfunc.UrlString(ctx, Pfunc_urlfunc.Tid_full, false, ttl_bry, tmp_bfr, Bry_.Empty); - return rslt.Init_obj(tmp_bfr.Mkr_rls().Xto_bry_and_clear()); + return rslt.Init_obj(tmp_bfr.To_bry_and_rls()); } } diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_wikibase_entity.java b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_wikibase_entity.java index f5f77e1ed..3e6f75f9d 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_wikibase_entity.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_wikibase_entity.java @@ -52,6 +52,6 @@ public class Scrib_lib_wikibase_entity implements Scrib_lib { Wdata_claim_grp prop_grp = wdoc.Claim_list_get(pid_int); if (prop_grp == null) return rslt.Init_str_empty(); Bry_bfr bfr = app.Utl__bfr_mkr().Get_b512(); wdata_mgr.Resolve_to_bfr(bfr, prop_grp, lang); - return rslt.Init_obj(bfr.Mkr_rls().Xto_bry_and_clear()); + return rslt.Init_obj(bfr.To_bry_and_rls()); } } \ No newline at end of file diff --git a/400_xowa/src/gplx/xowa/xtns/translates/Xop_languages_xnde.java b/400_xowa/src/gplx/xowa/xtns/translates/Xop_languages_xnde.java index a9f427d8d..2b0b3a806 100644 --- a/400_xowa/src/gplx/xowa/xtns/translates/Xop_languages_xnde.java +++ b/400_xowa/src/gplx/xowa/xtns/translates/Xop_languages_xnde.java @@ -17,8 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.xtns.translates; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.core.primitives.*; -import gplx.xowa.html.*; -import gplx.xowa.langs.*; +import gplx.xowa.html.*; import gplx.xowa.langs.*; import gplx.xowa.wikis.data.tbls.*; public class Xop_languages_xnde implements Xox_xnde { public Xop_xnde_tkn Xnde() {return xnde;} private Xop_xnde_tkn xnde; public void Xtn_parse(Xowe_wiki wiki, Xop_ctx ctx, Xop_root_tkn root, byte[] src, Xop_xnde_tkn xnde) { @@ -47,7 +46,7 @@ public class Xop_languages_xnde implements Xox_xnde { int lang_bgn = root_ttl_bry.length + 1; // lang starts after /; EX: "Page" will have subpage of "Page/fr" and lang_bgn of 5 boolean english_needed = true; 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); byte[] page_ttl_bry = page.Ttl_page_db(); int page_ttl_bry_len = page_ttl_bry.length; if (Bry_.Eq(root_ttl_bry, page_ttl_bry)) continue; // ignore self; EX: "page" diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_wiki_mgr_fxt.java b/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_wiki_mgr_fxt.java index 2aa976736..a41425596 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_wiki_mgr_fxt.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_wiki_mgr_fxt.java @@ -157,7 +157,7 @@ public class Wdata_wiki_mgr_fxt { parser_fxt.Exec_parse_page_all_as_str(raw); Bry_bfr tmp_bfr = wiki.Appe().Utl__bfr_mkr().Get_b512(); wiki.Html_mgr().Page_wtr_mgr().Wkr(Xopg_view_mode.Tid_read).Wdata_lang_wtr().Page_(page).XferAry(tmp_bfr, 0); - Tfds.Eq_str_lines(expd, tmp_bfr.Mkr_rls().Xto_str_and_clear()); + Tfds.Eq_str_lines(expd, tmp_bfr.To_str_and_rls()); } public void Test_xwiki_links(String ttl, String... expd) { tmp_langs.Clear(); @@ -179,6 +179,6 @@ public class Wdata_wiki_mgr_fxt { raw_bry = gplx.json.Json_parser_tst.Replace_apos(raw_bry); Bry_bfr bfr = app.Utl__bfr_mkr().Get_b512(); Wdata_wiki_mgr.Write_json_as_html(wdata_mgr.Jdoc_parser(), bfr, raw_bry); - Tfds.Eq(expd, bfr.Mkr_rls().Xto_str_and_clear()); + Tfds.Eq(expd, bfr.To_str_and_rls()); } } diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_claim_itm_time.java b/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_claim_itm_time.java index 5c4ab225a..f36aebc06 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_claim_itm_time.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_claim_itm_time.java @@ -35,7 +35,7 @@ public class Wdata_claim_itm_time extends Wdata_claim_itm_core { public Wdata_c precision_int = Bry_.Xto_int_or(precision, -1); if (precision_int == -1) { precision_int = Wdata_date.Fmt_ymdhns; - Gfo_usr_dlg_._.Warn_many("", "", "unknown precision: ~{0}", String_.new_utf8_(precision)); + Gfo_usr_dlg_.I.Warn_many("", "", "unknown precision: ~{0}", String_.new_utf8_(precision)); } } return precision_int; @@ -45,7 +45,7 @@ public class Wdata_claim_itm_time extends Wdata_claim_itm_core { public Wdata_c before_int = Bry_.Xto_int_or(before, -1); if (before_int == -1) { before_int = 0; - Gfo_usr_dlg_._.Warn_many("", "", "unknown before: ~{0}", String_.new_utf8_(before)); + Gfo_usr_dlg_.I.Warn_many("", "", "unknown before: ~{0}", String_.new_utf8_(before)); } } return before_int; @@ -55,7 +55,7 @@ public class Wdata_claim_itm_time extends Wdata_claim_itm_core { public Wdata_c after_int = Bry_.Xto_int_or(after, -1); if (after_int == -1) { after_int = 0; - Gfo_usr_dlg_._.Warn_many("", "", "unknown after: ~{0}", String_.new_utf8_(after)); + Gfo_usr_dlg_.I.Warn_many("", "", "unknown after: ~{0}", String_.new_utf8_(after)); } } return after_int; diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_dict_utl.java b/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_dict_utl.java index eb5da94aa..bc04d0758 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_dict_utl.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_dict_utl.java @@ -21,7 +21,7 @@ public class Wdata_dict_utl { public static byte Get_tid_or_invalid(byte[] qid, Hash_adp_bry dict, byte[] key) { Object rv_obj = dict.Get_by_bry(key); if (rv_obj == null) { - Gfo_usr_dlg_._.Warn_many("", "", "unknown wikidata key; qid=~{0} key=~{1}", String_.new_utf8_(qid), String_.new_utf8_(key)); + Gfo_usr_dlg_.I.Warn_many("", "", "unknown wikidata key; qid=~{0} key=~{1}", String_.new_utf8_(qid), String_.new_utf8_(key)); return Tid_invalid; } return ((Byte_obj_val)rv_obj).Val(); diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_lbl_mgr.java b/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_lbl_mgr.java index 7d4ec4099..c4407e66a 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_lbl_mgr.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_lbl_mgr.java @@ -30,7 +30,7 @@ public class Wdata_lbl_mgr { @gplx.Internal protected void Wkr_(Wdata_lbl_wkr v) {this.wkr = v;} private Wdata_lbl_wkr wkr; public Wdata_lbl_itm Get_itm__ttl(byte[] ttl) { Wdata_lbl_itm rv = (Wdata_lbl_itm)ttl_hash.Fetch(ttl); - if (rv == null) Gfo_usr_dlg_._.Warn_many("", "", "wdata.hwtr:unknown entity; ttl=~{0}", String_.new_utf8_(ttl)); // NOTE: should not happen + if (rv == null) Gfo_usr_dlg_.I.Warn_many("", "", "wdata.hwtr:unknown entity; ttl=~{0}", String_.new_utf8_(ttl)); // NOTE: should not happen return rv; } public byte[] Get_text__ttl(byte[] ttl, byte[] or) { @@ -43,12 +43,12 @@ public class Wdata_lbl_mgr { HashAdp hash = is_pid ? pid_hash : qid_hash; Wdata_lbl_itm rv_itm = (Wdata_lbl_itm)hash.Fetch(int_hash_key.Val_(id)); if (rv_itm != null) return rv_itm.Text(); // found; return lbl - Gfo_usr_dlg_._.Warn_many("", "", "wdata.hwtr:unknown entity; is_pid=~{0} id=~{1}", Yn.Xto_str(is_pid), id); // NOTE: should not happen + Gfo_usr_dlg_.I.Warn_many("", "", "wdata.hwtr:unknown entity; is_pid=~{0} id=~{1}", Yn.Xto_str(is_pid), id); // NOTE: should not happen return Wdata_lbl_itm.Make_ttl(is_pid, id); // missing; return ttl; EX: "Property:P1", "Q1"; } public void Queue_if_missing__ttl(byte[] ttl) {Queue_if_missing__ttl(ttl, Bool_.N);} public void Queue_if_missing__ttl(byte[] ttl, boolean get_en) { - if (ttl == null) {Gfo_usr_dlg_._.Warn_many("", "", "wdata.hwtr:unknown href; href=~{0}", String_.new_utf8_(ttl)); return;} + if (ttl == null) {Gfo_usr_dlg_.I.Warn_many("", "", "wdata.hwtr:unknown href; href=~{0}", String_.new_utf8_(ttl)); return;} boolean has = ttl_hash.Has(ttl); if (!has) Queue_add(qid_hash, Bool_.N, Qid_int(ttl), get_en); } diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_visitor__html_wtr.java b/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_visitor__html_wtr.java index 85ed7a4f4..0a068d938 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_visitor__html_wtr.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_visitor__html_wtr.java @@ -62,7 +62,7 @@ class Wdata_visitor__html_wtr implements Wdata_claim_visitor { if (!Bry_.Eq(unit, Wdata_claim_itm_quantity.Unit_1)) tmp_bfr.Add_byte_space().Add(unit); } catch (Exception e) { - Gfo_usr_dlg_._.Warn_many("", "", "failed to write quantity; ttl=~{0} pid=~{1} err=~{2}", String_.new_utf8_(ttl), itm.Pid(), Err_.Message_gplx_brief(e)); + Gfo_usr_dlg_.I.Warn_many("", "", "failed to write quantity; ttl=~{0} pid=~{1} err=~{2}", String_.new_utf8_(ttl), itm.Pid(), Err_.Message_gplx_brief(e)); } } private static final byte[] Time_plus_minus_spr = Bry_.new_ascii_(" / "); public void Visit_time(Wdata_claim_itm_time itm) { @@ -78,7 +78,7 @@ class Wdata_visitor__html_wtr implements Wdata_claim_visitor { if (calendar_display != null) tmp_bfr.Add_byte_space().Add(calendar_display); } catch (Exception e) { - Gfo_usr_dlg_._.Warn_many("", "", "failed to write time; ttl=~{0} pid=~{1} err=~{2}", String_.new_utf8_(ttl), itm.Pid(), Err_.Message_gplx_brief(e)); + Gfo_usr_dlg_.I.Warn_many("", "", "failed to write time; ttl=~{0} pid=~{1} err=~{2}", String_.new_utf8_(ttl), itm.Pid(), Err_.Message_gplx_brief(e)); } } public void Visit_globecoordinate(Wdata_claim_itm_globecoordinate itm) { @@ -96,7 +96,7 @@ class Wdata_visitor__html_wtr implements Wdata_claim_visitor { tmp_bfr.Add_byte(Byte_ascii.Paren_end); } } catch (Exception e) { - Gfo_usr_dlg_._.Warn_many("", "", "failed to write globecoordinate; ttl=~{0} pid=~{1} err=~{2}", String_.new_utf8_(ttl), itm.Pid(), Err_.Message_gplx_brief(e)); + Gfo_usr_dlg_.I.Warn_many("", "", "failed to write globecoordinate; ttl=~{0} pid=~{1} err=~{2}", String_.new_utf8_(ttl), itm.Pid(), Err_.Message_gplx_brief(e)); } } public void Visit_system(Wdata_claim_itm_system itm) { diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Wdata_idx_wtr.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Wdata_idx_wtr.java index b81e318b6..103d1bd03 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Wdata_idx_wtr.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Wdata_idx_wtr.java @@ -35,12 +35,12 @@ class Wdata_idx_wtr { Xobdc_merger.Basic(usr_dlg, dump_url_gen, dump_dir.OwnerDir().GenSubDir("sort"), dump_fil_max, Io_line_rdr_key_gen_.first_pipe, new Xob_make_cmd_site(usr_dlg, make_dir, make_fil_len)); } public static Wdata_idx_wtr new_qid_(Xowe_wiki wdata_wiki, String wiki_str, String ns_num, int dump_fil_max) { - Io_url dump_dir = wdata_wiki.Fsys_mgr().Tmp_dir().GenSubDir_nest(Xob_wdata_qid_txt.KEY, "qid", wiki_str, ns_num, "dump"); // /xowa/wiki/www.wikidata.org/tmp/wdata_qid/ + enwiki/000/dump/ + Io_url dump_dir = wdata_wiki.Fsys_mgr().Tmp_dir().GenSubDir_nest("wdata.qid", "qid", wiki_str, ns_num, "dump"); // /xowa/wiki/www.wikidata.org/tmp/wdata_qid/ + enwiki/000/dump/ Io_url make_dir = dir_qid_(wdata_wiki, wiki_str, ns_num); // /xowa/wiki/www.wikidata.org/site/data/qid/ + enwiki/000/ return new Wdata_idx_wtr(dump_dir, dump_fil_max, make_dir); } public static Wdata_idx_wtr new_pid_(Xowe_wiki wdata_wiki, String lang_key, int dump_fil_max) { - Io_url dump_dir = wdata_wiki.Fsys_mgr().Tmp_dir().GenSubDir_nest(Xob_wdata_pid_txt.KEY, "pid", lang_key, "dump"); // /xowa/wiki/www.wikidata.org/tmp/wdata_pid/ + en/ + Io_url dump_dir = wdata_wiki.Fsys_mgr().Tmp_dir().GenSubDir_nest("wdata.pid", "pid", lang_key, "dump"); // /xowa/wiki/www.wikidata.org/tmp/wdata_pid/ + en/ Io_url make_dir = dir_pid_(wdata_wiki, lang_key); // /xowa/wiki/www.wikidata.org/site/data/pid/ + en/ return new Wdata_idx_wtr(dump_dir, dump_fil_max, make_dir); } diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_db_cmd.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_db_cmd.java index f5696143a..9a089d62e 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_db_cmd.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_db_cmd.java @@ -16,22 +16,23 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.xtns.wdatas.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wdatas.*; -import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; import gplx.xowa.bldrs.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.files.origs.*; +import gplx.dbs.*; import gplx.dbs.cfgs.*; import gplx.dbs.engines.sqlite.*; import gplx.xowa.bldrs.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.files.origs.*; import gplx.json.*; import gplx.xowa.xtns.wdatas.*; import gplx.xowa.xtns.wdatas.core.*; -import gplx.xowa.bldrs.oimgs.*; +import gplx.xowa.bldrs.cmds.*; import gplx.xowa.wikis.data.tbls.*; public class Xob_wdata_db_cmd extends Xob_dump_mgr_base implements Xob_cmd { private Wdata_tbl_mgr tbl_mgr = new Wdata_tbl_mgr(); private Wdata_wiki_mgr wdata_mgr; private Json_parser json_parser; private byte[] lang_key = Xol_lang_.Key_en; public Xob_wdata_db_cmd(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 = "wiki.wdata_db"; + @Override public String Cmd_key() {return Xob_cmd_keys.Key_wbase_db;} @Override public byte Init_redirect() {return Bool_.N_byte;} // json will never be found in a redirect @Override public int[] Init_ns_ary() {return Int_.Ary(Xow_ns_.Id_main, Wdata_wiki_mgr.Ns_property);} @Override protected void Init_reset(Db_conn p) { - p.Exec_sql("DELETE FROM " + gplx.xowa.dbs.tbls.Xodb_xowa_cfg_tbl.Tbl_name); + Db_cfg_tbl cfg_tbl = new Db_cfg_tbl(p, "xowa_cfg"); + cfg_tbl.Delete_all(); } @Override protected Db_conn Init_db_file() { - Xodb_db_file tbl_file = Xodb_db_file.init_(wiki.Fsys_mgr().Root_dir(), "wdata_db.sqlite3"); + Xob_db_file tbl_file = Xob_db_file.new_(wiki.Fsys_mgr().Root_dir(), "wdata_db.sqlite3"); Db_conn conn = tbl_file.Conn(); tbl_mgr.Init(conn); return conn; @@ -39,15 +40,15 @@ public class Xob_wdata_db_cmd extends Xob_dump_mgr_base implements Xob_cmd { @Override protected void Cmd_bgn_end() { wdata_mgr = bldr.App().Wiki_mgr().Wdata_mgr(); json_parser = wdata_mgr.Jdoc_parser(); - tbl_mgr.Conn().Txn_mgr().Txn_bgn_if_none(); + tbl_mgr.Conn().Txn_bgn(); } - @Override public void Exec_pg_itm_hook(Xow_ns ns, Xodb_page page, byte[] page_src) { + @Override public void Exec_pg_itm_hook(int ns_ord, Xow_ns ns, Xowd_page_itm page, byte[] page_src) { Json_doc jdoc = json_parser.Parse(page_src); if (jdoc == null) return; // not a json document Wdata_doc wdoc = new Wdata_doc(page.Ttl_page_db(), wdata_mgr, jdoc); tbl_mgr.Exec_insert_by_wdoc(lang_key, wdata_mgr, page.Id(), wdoc); } @Override public void Exec_commit_hook() { - tbl_mgr.Conn().Txn_mgr().Txn_end_all_bgn_if_none(); + tbl_mgr.Conn().Txn_sav(); } @Override public void Exec_end_hook() { tbl_mgr.Term(usr_dlg); @@ -77,7 +78,7 @@ class Wdata_tbl_mgr { tbls[i].Exec_insert_by_wdoc(lang_key, wdata_mgr, page_id, wdoc); } public void Term(Gfo_usr_dlg usr_dlg) { - conn.Txn_mgr().Txn_end_all(); + conn.Txn_end(); for (int i = 0; i < tbls_len; i++) tbls[i].Make_idxs(usr_dlg, conn); } diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_pid_base.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_pid_base.java index 6eb4bbc01..8e03762b8 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_pid_base.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_pid_base.java @@ -16,8 +16,9 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.xtns.wdatas.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wdatas.*; -import gplx.json.*; import gplx.xowa.xtns.wdatas.core.*; import gplx.xowa.xtns.wdatas.parsers.*; +import gplx.json.*; import gplx.xowa.xtns.wdatas.core.*; import gplx.xowa.xtns.wdatas.parsers.*; import gplx.xowa.wikis.data.tbls.*; public abstract class Xob_wdata_pid_base extends Xob_itm_dump_base implements Xobd_wkr, GfoInvkAble { + private Json_parser parser; public Xob_wdata_pid_base Ctor(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki); return this;} public abstract String Wkr_key(); public abstract void Pid_bgn(); @@ -28,10 +29,10 @@ public abstract class Xob_wdata_pid_base extends Xob_itm_dump_base implements Xo this.Init_dump(this.Wkr_key(), wiki.Tdb_fsys_mgr().Site_dir().GenSubDir_nest("data", "pid")); // NOTE: must pass in correct make_dir in order to delete earlier version (else make_dirs will append) parser = bldr.App().Wiki_mgr().Wdata_mgr().Jdoc_parser(); this.Pid_bgn(); - } Json_parser parser; - public void Wkr_run(Xodb_page page) { + } + public void Wkr_run(Xowd_page_itm page) { if (page.Ns_id() != Wdata_wiki_mgr.Ns_property) return; - Json_doc jdoc = parser.Parse(page.Wtxt()); + Json_doc jdoc = parser.Parse(page.Text()); if (jdoc == null) { bldr.Usr_dlg().Warn_many(GRP_KEY, "json.invalid", "json is invalid: ns=~{0} id=~{1}", page.Ns_id(), String_.new_utf8_(page.Ttl_page_db())); return; diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_pid_sql.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_pid_sql.java index b5c82406c..02f385674 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_pid_sql.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_pid_sql.java @@ -16,24 +16,21 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.xtns.wdatas.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wdatas.*; -import gplx.xowa.wikis.data.*; import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.dbs.tbls.*; +import gplx.xowa.wikis.data.*; import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.wikis.data.tbls.*; public class Xob_wdata_pid_sql extends Xob_wdata_pid_base { - Xodb_mgr_sql db_mgr; Xodb_wdata_pids_tbl tbl; Db_stmt stmt; Db_conn conn; - @Override public String Wkr_key() {return KEY;} public static final String KEY = "import.sql.wdata.pid"; + private Xowd_wbase_pid_tbl tbl; + @Override public String Wkr_key() {return gplx.xowa.bldrs.Xob_cmd_keys.Key_wbase_pid;} @Override public void Pid_bgn() { - db_mgr = wiki.Db_mgr_as_sql(); - tbl = db_mgr.Tbl_wdata_pids(); - conn = db_mgr.Core_data_mgr().Conn_wdata(); - stmt = tbl.Insert_stmt(conn); - conn.Txn_mgr().Txn_bgn_if_none(); + Xowd_db_mgr db_mgr = wiki.Db_mgr_as_sql().Core_data_mgr(); + tbl = db_mgr.Db__wbase().Tbl__wbase_pid(); + tbl.Create_tbl(); + tbl.Insert_bgn(); } @Override public void Pid_add(byte[] lang_key, byte[] ttl, byte[] pid) { - tbl.Insert(stmt, lang_key, ttl, pid); + tbl.Insert_cmd_by_batch(lang_key, ttl, pid); } @Override public void Pid_end() { - conn.Txn_mgr().Txn_end_all(); - stmt.Rls(); - db_mgr.Core_data_mgr().Index_create(wiki.Appe().Usr_dlg(), Byte_.Ary(Xowd_db_file_.Tid_core, Xowd_db_file_.Tid_wikidata), Index_wdata_pids); + tbl.Insert_end(); + tbl.Create_idx(); } - private static final Db_idx_itm Index_wdata_pids = Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS wdata_pids__src ON wdata_pids (wp_src_lang, wp_src_ttl);"); } diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_pid_txt.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_pid_txt.java index 817a1508a..873f89bd7 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_pid_txt.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_pid_txt.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.xtns.wdatas.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wdatas.*; public class Xob_wdata_pid_txt extends Xob_wdata_pid_base { - @Override public String Wkr_key() {return KEY;} public static final String KEY = "wdata.pid"; + @Override public String Wkr_key() {return gplx.xowa.bldrs.Xob_cmd_keys.Key_tdb_text_wdata_pid;} @Override public void Pid_bgn() { pid_bldr = new Wdata_idx_bldr_pid(this, bldr, wiki, dump_fil_len); } Wdata_idx_bldr_pid pid_bldr; diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_base.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_base.java index 869181e92..fa0ace4f3 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_base.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_base.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.xtns.wdatas.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wdatas.*; -import gplx.json.*; import gplx.ios.*; import gplx.xowa.xtns.wdatas.core.*; import gplx.xowa.xtns.wdatas.parsers.*; +import gplx.json.*; import gplx.ios.*; import gplx.xowa.xtns.wdatas.core.*; import gplx.xowa.xtns.wdatas.parsers.*; import gplx.xowa.wikis.data.tbls.*; public abstract class Xob_wdata_qid_base extends Xob_itm_dump_base implements Xobd_wkr, GfoInvkAble { public Xob_wdata_qid_base Ctor(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki); return this;} public abstract String Wkr_key(); @@ -29,18 +29,18 @@ public abstract class Xob_wdata_qid_base extends Xob_itm_dump_base implements Xo parser = bldr.App().Wiki_mgr().Wdata_mgr().Jdoc_parser(); this.Qid_bgn(); } private Json_parser parser; - public void Wkr_run(Xodb_page page) { + public void Wkr_run(Xowd_page_itm page) { if (page.Ns_id() != Xow_ns_.Id_main) return; // qid pages are only in the Main namespace - Json_doc jdoc = parser.Parse(page.Wtxt()); + Json_doc jdoc = parser.Parse(page.Text()); if (jdoc == null) { bldr.Usr_dlg().Warn_many(GRP_KEY, "json.invalid", "json is invalid: ns=~{0} id=~{1}", page.Ns_id(), String_.new_utf8_(page.Ttl_page_db())); return; } Wdata_doc_parser wdoc_parser = app.Wiki_mgr().Wdata_mgr().Wdoc_parser(jdoc); - byte[] qid = wdoc_parser.Parse_qid(jdoc); + byte[] qid = wdoc_parser.Parse_qid(jdoc); OrderedHash sitelinks = wdoc_parser.Parse_sitelinks(qid, jdoc); int sitelinks_len = sitelinks.Count(); if (sitelinks_len == 0) return; // no subs; return; - Wdata_sitelink_itm main_sitelink = null; + Wdata_sitelink_itm main_sitelink = null; // SEE:NOTE_1:non-english non-main titles for (int i = 0; i < sitelinks_len; i++) { // iterate links; find main_sitelink (hopefully enwiki) Wdata_sitelink_itm sitelink = (Wdata_sitelink_itm)sitelinks.FetchAt(i); byte[] xwiki_key = sitelink.Site(); @@ -50,7 +50,7 @@ public abstract class Xob_wdata_qid_base extends Xob_itm_dump_base implements Xo main_sitelink = sitelink; } - Xoa_ttl core_ttl = Xoa_ttl.parse_(wiki, main_sitelink.Name()); // NOTE: parse ttl to get ns; this may still be inaccurate as it is using wikidata's ns, not enwiki's;; DATE:2014-07-23 + Xoa_ttl core_ttl = Xoa_ttl.parse_(wiki, main_sitelink.Name()); // NOTE: parse ttl to get ns; this may still be inaccurate as it is using wikidata's ns, not enwiki's; DATE:2014-07-23 Xow_ns core_ns = core_ttl.Ns(); boolean core_ns_is_main = core_ns.Id_main(); @@ -66,7 +66,7 @@ public abstract class Xob_wdata_qid_base extends Xob_itm_dump_base implements Xo int colon_pos = Bry_finder.Find_fwd(data_ttl_bry, Byte_ascii.Colon); int data_ttl_len = data_ttl_bry.length; if (colon_pos == Bry_.NotFound || colon_pos == data_ttl_len - 1) { - bldr.App().Usr_dlg().Log_many(GRP_KEY, "ns_not_found", "namespace not found; ~{0} ~{1} ~{2}", String_.new_ascii_(qid), core_ns.Name_str(), String_.new_utf8_(data_ttl_bry)); + bldr.App().Usr_dlg().Log_many(GRP_KEY, "ns_not_found", "namespace not found; qid=~{0} ns=~{1} ttl=~{2}", qid, core_ns.Name_str(), data_ttl_bry); actl_ttl = data_ttl_bry; } else @@ -99,3 +99,23 @@ class Wdata_idx_bldr_qid extends Wdata_idx_mgr_base { return (Wdata_idx_wtr)rv; } } +/* +NOTE_1:non-english non-main titles +The problem is that sitelinks have full titles which namespace names. EX:frwiki|Aide:Page1 +. there is no way to know that "Aide" is "ns 6" in frwiki without loading up the ns names of frwiki +. furthermore, ttls can have ":" in the main namespace; EX:frwiki|Aidex:Page1 is actually in ns 0 +The ideal approach is to load up a ns_mgr for every wiki. this is problematic: +. memory space: potentially 800+ wikis +. data availability: wikidata dump does not have ns names for other wikis, so they need to be provided beforehand (in a new xowa.gfs file) +So, for now, employ the following workaround: +. find the ns of the baseline sitelink: (a) enwiki; (b) wiki; (c) 1st (not commons) +. parse each sitelink +.. if a sitelink has no ":", it must be in the main ns +.. if a sitelink has a ":" +... try to parse import wikidata.org's ns_mgr. this will find simple ns like "Category", "File", etc. +... if no ns, use the ns of the baseline sitelink +Note that this approach still fails in following situations +. baseline sitelink is in non-English ns.*; EX: fr.w|Aide:Page1 en.d|Help:Page1; fr.w is identified as main ns but en.d is put in Help ns +. the wrong sitelink is chosen as baseline; EX:: en.w|Category:Page1 de.w|Page1 es.w|Page1 ru.w|MainNs:Page1; ru.w is put in Category Ns +. a non-English title happens to have an English ns name in its main ns; EX:fr.w|Category:Page1; fr.w should be in Main ns (since no "Category" ns name in fr.w), but put in Category +*/ diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_sql.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_sql.java index 222469f67..8d988ea10 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_sql.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_sql.java @@ -16,29 +16,25 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.xtns.wdatas.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wdatas.*; -import gplx.xowa.wikis.data.*; import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.dbs.tbls.*; +import gplx.xowa.wikis.data.*; import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.wikis.data.tbls.*; public class Xob_wdata_qid_sql extends Xob_wdata_qid_base { - Xodb_mgr_sql db_mgr; Xodb_wdata_qids_tbl tbl; Db_stmt stmt; Db_conn conn; - @Override public String Wkr_key() {return KEY;} public static final String KEY = "import.sql.wdata.qid"; + private Xowd_wbase_qid_tbl tbl; + @Override public String Wkr_key() {return gplx.xowa.bldrs.Xob_cmd_keys.Key_wbase_qid;} @Override public void Qid_bgn() { - db_mgr = wiki.Db_mgr_as_sql(); - tbl = db_mgr.Tbl_wdata_qids(); - long wikidata_max = wiki.Appe().Setup_mgr().Dump_mgr().Db_wikidata_max(); - if (wikidata_max > 0) { - Xowd_db_file wdata_file = db_mgr.Core_data_mgr().Dbs__add_new(Xowd_db_file_.Tid_wikidata); - db_mgr.Core_data_mgr().Conn_wdata_(wdata_file); - } - conn = db_mgr.Core_data_mgr().Conn_wdata(); - stmt = tbl.Insert_stmt(conn); - conn.Txn_mgr().Txn_bgn_if_none(); + Xowd_db_mgr db_mgr = wiki.Db_mgr_as_sql().Core_data_mgr(); + Xowd_db_file wbase_db = db_mgr.Props().Layout_text().Tid_is_all_or_few() + ? db_mgr.Db__core() + : db_mgr.Dbs__make_by_tid(Xowd_db_file_.Tid_wbase) + ; + tbl = wbase_db.Tbl__wbase_qid(); + tbl.Create_tbl(); + tbl.Insert_bgn(); } @Override public void Qid_add(byte[] wiki_key, Xow_ns ns, byte[] ttl, byte[] qid) { - tbl.Insert(stmt, wiki_key, ns.Id(), ttl, qid); + tbl.Insert_cmd_by_batch(wiki_key, ns.Id(), ttl, qid); } @Override public void Qid_end() { - conn.Txn_mgr().Txn_end_all(); - stmt.Rls(); - db_mgr.Core_data_mgr().Index_create(wiki.Appe().Usr_dlg(), Byte_.Ary(Xowd_db_file_.Tid_core, Xowd_db_file_.Tid_wikidata), Index_wdata_qids); + tbl.Insert_end(); + tbl.Create_idx(); } - private static final Db_idx_itm Index_wdata_qids = Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS wdata_qids__src ON wdata_qids (wq_src_wiki, wq_src_ns, wq_src_ttl);"); } diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_txt.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_txt.java index 5166ed9c1..599f3253b 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_txt.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_txt.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.xtns.wdatas.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wdatas.*; public class Xob_wdata_qid_txt extends Xob_wdata_qid_base { - @Override public String Wkr_key() {return KEY;} public static final String KEY = "wdata.qid"; + @Override public String Wkr_key() {return gplx.xowa.bldrs.Xob_cmd_keys.Key_tdb_text_wdata_qid;} Wdata_idx_bldr_qid qid_bldr; @Override public void Qid_bgn() {qid_bldr = new Wdata_idx_bldr_qid().Ctor(this, bldr, wiki, dump_fil_len);} diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/specials/Wdata_itemByTitle_page.java b/400_xowa/src/gplx/xowa/xtns/wdatas/specials/Wdata_itemByTitle_page.java index 4c697f865..2caac272b 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/specials/Wdata_itemByTitle_page.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/specials/Wdata_itemByTitle_page.java @@ -49,7 +49,7 @@ public class Wdata_itemByTitle_page implements Xows_page { if (Navigate(usr_dlg, app, app.Wiki_mgr().Wdata_mgr(), page, site_bry, page_bry)) return; Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_k004(); html_fmtr.Bld_bfr_many(tmp_bfr, "Search for items by site and title", "Site", site_bry, "Page", page_bry, "Search"); - page.Data_raw_(tmp_bfr.Mkr_rls().Xto_bry_and_clear()); + page.Data_raw_(tmp_bfr.To_bry_and_rls()); page.Html_data().Html_restricted_n_(); // [[Special:]] pages allow all HTML } private static boolean Navigate(Gfo_usr_dlg usr_dlg, Xoae_app app, Wdata_wiki_mgr wdata_mgr, Xoae_page page, byte[] site_bry, byte[] page_bry) { diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/specials/Wdata_itemByTitle_page_tst.java b/400_xowa/src/gplx/xowa/xtns/wdatas/specials/Wdata_itemByTitle_page_tst.java index 50ab59b70..258bf5787 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/specials/Wdata_itemByTitle_page_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/specials/Wdata_itemByTitle_page_tst.java @@ -71,7 +71,7 @@ class Wdata_itemByTitle_page_fxt { public String Expd_html(String wmf_key, String ttl_str) { Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_k004(); special_page.Html_fmtr().Bld_bfr_many(tmp_bfr, "Search for items by site and title", "Site", wmf_key, "Page", ttl_str, "Search"); - return tmp_bfr.Mkr_rls().Xto_str_and_clear(); + return tmp_bfr.To_str_and_rls(); } } diff --git a/400_xowa/src/gplx/xowa/xtns/xowa_cmds/Xop_xowa_cmd.java b/400_xowa/src/gplx/xowa/xtns/xowa_cmds/Xop_xowa_cmd.java index f2874a3a9..c48cf5cc4 100644 --- a/400_xowa/src/gplx/xowa/xtns/xowa_cmds/Xop_xowa_cmd.java +++ b/400_xowa/src/gplx/xowa/xtns/xowa_cmds/Xop_xowa_cmd.java @@ -37,6 +37,7 @@ public class Xop_xowa_cmd implements Xox_xnde { xtn_html = wiki.Parser().Parse_text_to_wtxt(sub_root, sub_ctx, ctx.Tkn_mkr(), xtn_src); } public void Xtn_write(Bry_bfr bfr, Xoae_app app, Xop_ctx ctx, Xoh_html_wtr html_wtr, Xoh_wtr_ctx hctx, Xop_xnde_tkn xnde, byte[] src) { - throw Err_.not_implemented_msg_("xowa_cmd.xtn_write should not be called"); + bfr.Add(xtn_html); + //throw Err_.not_implemented_msg_("xowa_cmd.xtn_write should not be called"); } } diff --git a/400_xowa/src/gplx/xowa2/apps/Xoav_app.java b/400_xowa/src/gplx/xowa2/apps/Xoav_app.java index 8673bd88b..cbdf99f58 100644 --- a/400_xowa/src/gplx/xowa2/apps/Xoav_app.java +++ b/400_xowa/src/gplx/xowa2/apps/Xoav_app.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa2.apps; import gplx.*; import gplx.xowa2.*; import gplx.dbs.*; import gplx.xowa.apps.fsys.*; import gplx.xowa.parsers.amps.*; import gplx.xowa.langs.cases.*; import gplx.intl.*; import gplx.xowa.users.data.*; import gplx.xowa.*; -import gplx.xowa2.apps.urls.*; import gplx.xowa2.users.*; import gplx.xowa.files.caches.*; import gplx.xowa.files.imgs.*; +import gplx.xowa2.apps.urls.*; import gplx.xowa.files.caches.*; import gplx.xowa.files.imgs.*; import gplx.xowa.wmfs.*; import gplx.xowa.urls.encoders.*; public class Xoav_app implements Xoa_app { @@ -37,7 +37,7 @@ public class Xoav_app implements Xoa_app { public Url_encoder_mgr Utl__encoder_mgr() {return Xoa_app_.Utl__encoder_mgr();} public Xoav_wiki_mgr Wiki_mgr() {return wiki_mgr;} private final Xoav_wiki_mgr wiki_mgr; - public Xoud_data_mgr User_data_mgr() {return user_data_mgr;} private Xoud_data_mgr user_data_mgr = new Xoud_data_mgr(); + public Xoud_db_mgr User_data_mgr() {return user_data_mgr;} private Xoud_db_mgr user_data_mgr = new Xoud_db_mgr(); public Gfo_usr_dlg Usr_dlg() {return usr_dlg;} public void Usr_dlg_(Gfo_usr_dlg v) {usr_dlg = v;} private Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_.Null; public Xop_amp_mgr Utl_amp_mgr() {return utl_amp_mgr;} private Xop_amp_mgr utl_amp_mgr = new Xop_amp_mgr(); diff --git a/400_xowa/src/gplx/xowa2/apps/Xoav_wiki_mgr.java b/400_xowa/src/gplx/xowa2/apps/Xoav_wiki_mgr.java index 5e71acd61..cbebfb69f 100644 --- a/400_xowa/src/gplx/xowa2/apps/Xoav_wiki_mgr.java +++ b/400_xowa/src/gplx/xowa2/apps/Xoav_wiki_mgr.java @@ -17,14 +17,14 @@ along with this program. If not, see . */ package gplx.xowa2.apps; import gplx.*; import gplx.xowa2.*; import gplx.xowa.langs.cases.*; import gplx.xowa.users.data.*; -import gplx.xowa2.wikis.*; import gplx.xowa2.users.data.*; +import gplx.xowa2.wikis.*; public class Xoav_wiki_mgr implements GfoInvkAble { private final Xoav_app app; private final OrderedHash hash = OrderedHash_.new_bry_(); public Xoav_wiki_mgr(Xoav_app app, Xol_case_mgr case_mgr) {this.app = app;} public Xowv_wiki Get_by_domain(byte[] domain) {return (Xowv_wiki)hash.Fetch(domain);} public Xowv_wiki Import_by_fil(Io_url fil) { Io_url wiki_dir = fil.OwnerDir(); - Xowv_wiki rv = Load(String_.Replace(fil.NameOnly(), ".000", ""), wiki_dir); + Xowv_wiki rv = Load(Gen_domain_str(fil.NameOnly()), wiki_dir); app.User_data_mgr().Site_mgr().Import(rv.Domain_str(), rv.Domain_str(), wiki_dir.Raw(), ""); return rv; } @@ -36,7 +36,9 @@ public class Xoav_wiki_mgr implements GfoInvkAble { Load(itm.Domain(), Io_url_.new_dir_(itm.Path())); } } - public Xowv_wiki Load_by_fil(Io_url fil) {return Load(String_.Replace(fil.NameOnly(), ".000", ""), fil.OwnerDir());} + public Xowv_wiki Load_by_fil(Io_url fil) { + return Load(Gen_domain_str(fil.NameOnly()), fil.OwnerDir()); + } public void Load_by_dir(Io_url wiki_root_dir) { Io_url[] wiki_dirs = Io_mgr._.QueryDir_args(wiki_root_dir).DirOnly_().ExecAsUrlAry(); for (Io_url wiki_dir : wiki_dirs) { @@ -56,4 +58,9 @@ public class Xoav_wiki_mgr implements GfoInvkAble { else return GfoInvkAble_.Rv_unhandled; } public static final String Invk_import_by_fil = "import_by_fil"; + private static String Gen_domain_str(String file_name) { + int dash_pos = String_.FindFwd(file_name, "-"); + if (dash_pos != Bry_finder.Not_found) file_name = String_.Mid(file_name, 0, dash_pos); + return file_name; + } } diff --git a/400_xowa/src/gplx/xowa2/files/Xofv_file_mgr.java b/400_xowa/src/gplx/xowa2/files/Xofv_file_mgr.java index 83d0ded70..8584002c4 100644 --- a/400_xowa/src/gplx/xowa2/files/Xofv_file_mgr.java +++ b/400_xowa/src/gplx/xowa2/files/Xofv_file_mgr.java @@ -21,52 +21,14 @@ import gplx.xowa.*; import gplx.xowa.files.*; import gplx.xowa.files.caches.*; import gplx.xowa.files.origs.*; import gplx.xowa.wmfs.apis.*; public class Xofv_file_mgr { private final Xop_xfer_itm_hash lnki_hash = new Xop_xfer_itm_hash(); - private final Xofv_file_itm_list html_list = new Xofv_file_itm_list(); - private final Xof_url_bldr url_bldr = Xof_url_bldr.new_v2_(); private final Xof_img_size img_size = new Xof_img_size(); public Xofv_file_mgr(byte[] wiki_bry) { this.wiki_bry = wiki_bry; - this.cache_mgr = new Xof_cache_mgr(Gfo_usr_dlg_._, null, null); + this.cache_mgr = new Xof_cache_mgr(Gfo_usr_dlg_.I, null, null); } public byte[] Wiki_bry() {return wiki_bry;} private final byte[] wiki_bry; public Xofv_repo_mgr Repo_mgr() {return repo_mgr;} private final Xofv_repo_mgr repo_mgr = new Xofv_repo_mgr(); - public Xof_orig_wkr__orig_db Orig_wkr() {return orig_wkr;} private Xof_orig_wkr__orig_db orig_wkr = new Xof_orig_wkr__orig_db(); - public Xof_fsdb_mgr Fsdb_mgr() {return fsdb_mgr;} public Xofv_file_mgr Fsdb_mgr_(Xof_fsdb_mgr v) {fsdb_mgr = v; return this;} private Xof_fsdb_mgr fsdb_mgr; public Xof_cache_mgr Cache_mgr() {return cache_mgr;} private final Xof_cache_mgr cache_mgr; public void Clear() {lnki_hash.Clear();} public void Reg(Xof_xfer_itm xfer_itm) {lnki_hash.Add(xfer_itm);} - public void Process_lnki() { - while (true) { - Xof_xfer_itm xfer = lnki_hash.Pop_at_or_null(0); if (xfer == null) break; // no more items; stop - Xof_orig_itm orig = orig_wkr.Find_as_itm(xfer.Lnki_ttl()); - if (orig == Xof_orig_itm.Null) { - Gfo_usr_dlg_._.Warn_many("", "", "orig not found for lnki; lnki_ttl=~{0}", xfer.Lnki_ttl()); - continue; - } - boolean fsdb_download = true; // default download to true - Xofv_file_itm itm = Xofv_file_itm.new_(xfer, orig, repo_mgr, img_size, url_bldr); - Xofc_fil_itm cache_fil = cache_mgr.Fil__get_or_null(itm.File_repo(), itm.File_ttl(), itm.Lnki_is_orig(), itm.Html_w(), itm.Lnki_time(), itm.Lnki_page()); - if (cache_fil != null) { - if (Io_mgr._.ExistsFil(itm.File_url())) - fsdb_download = false; // cache exists and itm exists; don't download file - } - if (fsdb_download) { - if (!fsdb_mgr.Download(itm)) { - Gfo_usr_dlg_._.Warn_many("", "", "itm not found in fsdb; lnki_ttl=~{0}", xfer.Lnki_ttl()); - continue; - } - } - if (cache_fil == null) { - cache_fil = cache_mgr.Fil__make(itm.File_repo(), itm.File_ttl(), itm.Lnki_is_orig(), itm.Html_w(), itm.Html_w(), itm.Lnki_time(), itm.Lnki_page(), itm.File_size()); - } - cache_mgr.Fil__update(cache_fil); - html_list.Add(itm); - } - cache_mgr.Db_save(); - } - @gplx.Internal protected void Process_html(Xog_html_gui html_gui) { - while (true) { - Xofv_file_itm itm = html_list.Pop_at_or_null(0); if (itm == null) break; - html_gui.Update(itm.Html_uid(), itm.File_url().To_http_file_str(), itm.Html_w(), itm.Html_h()); - } - } + public void Process_lnki() {} } diff --git a/400_xowa/src/gplx/xowa2/files/Xofv_file_mgr_tst.java b/400_xowa/src/gplx/xowa2/files/Xofv_file_mgr_tst.java index a01ed9c19..5503eeb1f 100644 --- a/400_xowa/src/gplx/xowa2/files/Xofv_file_mgr_tst.java +++ b/400_xowa/src/gplx/xowa2/files/Xofv_file_mgr_tst.java @@ -21,84 +21,76 @@ import gplx.xowa.*; import gplx.xowa.files.*; import gplx.xowa.files.fsdb.*; imp import gplx.xowa2.apps.*; import gplx.xowa2.wikis.*; import gplx.xowa.files.origs.*; public class Xofv_file_mgr_tst { @Before public void init() {fxt.Clear();} private final Xofv_file_mgr_fxt fxt = new Xofv_file_mgr_fxt(); - @After public void term() {Gfo_usr_dlg_._ = Gfo_usr_dlg_.Null;} - @Test public void Thumb() { - fxt .Init_orig_add(fxt.Mkr_orig().Init_comm("A.png", 440, 400)) - .Init_fsdb_add(fxt.Mkr_fsdb().Init_comm_thum("A.png", 220, 200)) - .Init_xfer_add(fxt.Mkr_xfer().Init_thumb(0, "A.png", 220, 200)) - .Exec_process_lnki() - .Test_html_get(fxt.Mkr_html().Init(0, "file:///mem/xowa/file/comm/thumb/7/0/A.png/220px.png", 220, 200)) - .Test_fsys_get("mem/xowa/file/comm/thumb/7/0/A.png/220px.png") - .Test_fsdb_download(1); - ; - } - @Test public void Orig() { - fxt .Init_orig_add(fxt.Mkr_orig().Init_comm("A.png", 440, 400)) - .Init_fsdb_add(fxt.Mkr_fsdb().Init_comm_orig("A.png", 440, 400)) - .Init_xfer_add(fxt.Mkr_xfer().Init_none(0, "A.png")) - .Exec_process_lnki() - .Test_html_get(fxt.Mkr_html().Init(0, "file:///mem/xowa/file/comm/orig/7/0/A.png", 440, 400)) - .Test_fsys_get("mem/xowa/file/comm/orig/7/0/A.png") - .Test_fsdb_download(1); - ; - } - @Test public void Img_size() { // PURPOSE: test integration of Xof_img_size - fxt .Init_orig_add(fxt.Mkr_orig().Init_comm("A.png", 440, 400)) - .Init_fsdb_add(fxt.Mkr_fsdb().Init_comm_thum("A.png", 110, 100)) - .Init_xfer_add(fxt.Mkr_xfer().Init_thumb(0, "A.png", Xof_img_size.Null, Xof_img_size.Null).Upright_(.5f)) - .Exec_process_lnki() - .Test_html_get(fxt.Mkr_html().Init(0, "file:///mem/xowa/file/comm/thumb/7/0/A.png/110px.png", 110, 100)) - .Test_fsys_get("mem/xowa/file/comm/thumb/7/0/A.png/110px.png") - .Test_fsdb_download(1); - ; - } - @Test public void Orig_mgr() { // PURPOSE: test integration of Orig_mgr - fxt .Init_orig_add(fxt.Mkr_orig().Init_comm_redirect("B.jpg", "A.png", 440, 400)) // B.jpg redirects to A.png - .Init_fsdb_add(fxt.Mkr_fsdb().Init_comm_thum("A.png", 220, 200)) - .Init_xfer_add(fxt.Mkr_xfer().Init_thumb(0, "B.jpg", 220, 200)) - .Exec_process_lnki() - .Test_html_get(fxt.Mkr_html().Init(0, "file:///mem/xowa/file/comm/thumb/7/0/A.png/220px.png", 220, 200)) - .Test_fsys_get("mem/xowa/file/comm/thumb/7/0/A.png/220px.png") - .Test_fsdb_download(1); - ; - } - @Test public void Cache_exists() { - fxt .Init_orig_add(fxt.Mkr_orig().Init_comm("A.png", 440, 400)) - .Init_fsdb_add(fxt.Mkr_fsdb().Init_comm_thum("A.png", 220, 200)) - .Init_xfer_add(fxt.Mkr_xfer().Init_thumb(0, "A.png", 220, 200)) - .Init_cache_add(fxt.Mkr_cache().Init("comm", "A.png", Bool_.N, 220)) // add to cache - .Init_fsys_add("mem/xowa/file/comm/thumb/7/0/A.png/220px.png") // copy file to fsys - .Exec_process_lnki() - .Test_fsdb_download(0) // skip download - ; - } - @Test public void Cache_absent() { - fxt .Init_orig_add(fxt.Mkr_orig().Init_comm("A.png", 440, 400)) - .Init_fsdb_add(fxt.Mkr_fsdb().Init_comm_thum("A.png", 220, 200)) - .Init_xfer_add(fxt.Mkr_xfer().Init_thumb(0, "A.png", 220, 200)) - .Init_cache_add(fxt.Mkr_cache().Init("commons", "A.png", Bool_.N, 220)) // add to cache - .Exec_process_lnki() - .Test_fsdb_download(1) // do download - ; - } + @After public void term() {Gfo_usr_dlg_.I = Gfo_usr_dlg_.Null;} + @Test public void Stub() {} +// @Test public void Thumb() { +// fxt .Init_orig_add(fxt.Mkr_orig().Init_comm("A.png", 440, 400)) +// .Init_fsdb_add(fxt.Mkr_fsdb().Init_comm_thum("A.png", 220, 200)) +// .Init_xfer_add(fxt.Mkr_xfer().Init_thumb(0, "A.png", 220, 200)) +// .Exec_process_lnki() +// .Test_html_get(fxt.Mkr_html().Init(0, "file:///mem/xowa/file/comm/thumb/7/0/A.png/220px.png", 220, 200)) +// .Test_fsys_get("mem/xowa/file/comm/thumb/7/0/A.png/220px.png") +// .Test_fsdb_download(1); +// ; +// } +// @Test public void Orig() { +// fxt .Init_orig_add(fxt.Mkr_orig().Init_comm("A.png", 440, 400)) +// .Init_fsdb_add(fxt.Mkr_fsdb().Init_comm_orig("A.png", 440, 400)) +// .Init_xfer_add(fxt.Mkr_xfer().Init_none(0, "A.png")) +// .Exec_process_lnki() +// .Test_html_get(fxt.Mkr_html().Init(0, "file:///mem/xowa/file/comm/orig/7/0/A.png", 440, 400)) +// .Test_fsys_get("mem/xowa/file/comm/orig/7/0/A.png") +// .Test_fsdb_download(1); +// ; +// } +// @Test public void Img_size() { // PURPOSE: test integration of Xof_img_size +// fxt .Init_orig_add(fxt.Mkr_orig().Init_comm("A.png", 440, 400)) +// .Init_fsdb_add(fxt.Mkr_fsdb().Init_comm_thum("A.png", 110, 100)) +// .Init_xfer_add(fxt.Mkr_xfer().Init_thumb(0, "A.png", Xof_img_size.Null, Xof_img_size.Null).Upright_(.5f)) +// .Exec_process_lnki() +// .Test_html_get(fxt.Mkr_html().Init(0, "file:///mem/xowa/file/comm/thumb/7/0/A.png/110px.png", 110, 100)) +// .Test_fsys_get("mem/xowa/file/comm/thumb/7/0/A.png/110px.png") +// .Test_fsdb_download(1); +// ; +// } +// @Test public void Orig_mgr() { // PURPOSE: test integration of Orig_mgr +// fxt .Init_orig_add(fxt.Mkr_orig().Init_comm_redirect("B.jpg", "A.png", 440, 400)) // B.jpg redirects to A.png +// .Init_fsdb_add(fxt.Mkr_fsdb().Init_comm_thum("A.png", 220, 200)) +// .Init_xfer_add(fxt.Mkr_xfer().Init_thumb(0, "B.jpg", 220, 200)) +// .Exec_process_lnki() +// .Test_html_get(fxt.Mkr_html().Init(0, "file:///mem/xowa/file/comm/thumb/7/0/A.png/220px.png", 220, 200)) +// .Test_fsys_get("mem/xowa/file/comm/thumb/7/0/A.png/220px.png") +// .Test_fsdb_download(1); +// ; +// } +// @Test public void Cache_exists() { +// fxt .Init_orig_add(fxt.Mkr_orig().Init_comm("A.png", 440, 400)) +// .Init_fsdb_add(fxt.Mkr_fsdb().Init_comm_thum("A.png", 220, 200)) +// .Init_xfer_add(fxt.Mkr_xfer().Init_thumb(0, "A.png", 220, 200)) +// .Init_cache_add(fxt.Mkr_cache().Init("comm", "A.png", Bool_.N, 220)) // add to cache +// .Init_fsys_add("mem/xowa/file/comm/thumb/7/0/A.png/220px.png") // copy file to fsys +// .Exec_process_lnki() +// .Test_fsdb_download(0) // skip download +// ; +// } +// @Test public void Cache_absent() { +// fxt .Init_orig_add(fxt.Mkr_orig().Init_comm("A.png", 440, 400)) +// .Init_fsdb_add(fxt.Mkr_fsdb().Init_comm_thum("A.png", 220, 200)) +// .Init_xfer_add(fxt.Mkr_xfer().Init_thumb(0, "A.png", 220, 200)) +// .Init_cache_add(fxt.Mkr_cache().Init("commons", "A.png", Bool_.N, 220)) // add to cache +// .Exec_process_lnki() +// .Test_fsdb_download(1) // do download +// ; +// } } class Xofv_file_mgr_fxt { private Xofv_file_mgr file_mgr; - private final Xof_fsdb_mgr__test fsdb_mgr = new Xof_fsdb_mgr__test(); private final Xog_html_gui__test html_gui = new Xog_html_gui__test(); public Xof_xfer_mkr Mkr_xfer() {return mkr_xfer;} private final Xof_xfer_mkr mkr_xfer = new Xof_xfer_mkr(); public Xof_orig_itm_mkr Mkr_orig() {return mkr_orig;} private final Xof_orig_itm_mkr mkr_orig = new Xof_orig_itm_mkr(); public Xof_fsdb_mkr Mkr_fsdb() {return mkr_fsdb;} private final Xof_fsdb_mkr mkr_fsdb = new Xof_fsdb_mkr(); - public Xog_html_rsc_mkr Mkr_html() {return mkr_html;} private final Xog_html_rsc_mkr mkr_html = new Xog_html_rsc_mkr(); public Xou_cache_itm_mkr Mkr_cache() {return mkr_cache;} private final Xou_cache_itm_mkr mkr_cache = new Xou_cache_itm_mkr(); public void Clear() { - file_mgr = new Xofv_file_mgr(Bry_.new_ascii_("enwiki")); - Db_conn_bldr.I.Reg_default_mem(); - Db_conn conn = Db_conn_bldr.I.New("", Io_url_.mem_fil_("mem/file/cache.db")); boolean created = Bool_.Y; boolean schema_is_1 = Bool_.N; - file_mgr.Cache_mgr().Init_for_db(conn, created, schema_is_1); - file_mgr.Orig_wkr().Conn_(conn, created, schema_is_1); - fsdb_mgr.Clear(); - html_gui.Clear(); - file_mgr.Fsdb_mgr_(fsdb_mgr); + file_mgr = new Xofv_file_mgr(Bry_.Empty); Clear_repos(); } private void Clear_repos() { @@ -111,8 +103,6 @@ class Xofv_file_mgr_fxt { mkr_fsdb.Setup_repos(Bry_.new_ascii_("comm"), Bry_.new_ascii_("wiki")); } public Xofv_file_mgr_fxt Init_xfer_add(Xof_xfer_mkr mkr) {file_mgr.Reg(mkr.Make()); return this;} - public Xofv_file_mgr_fxt Init_orig_add(Xof_orig_itm_mkr mkr) {mkr.Make(file_mgr.Orig_wkr()); return this;} - public Xofv_file_mgr_fxt Init_fsdb_add(Xof_fsdb_mkr mkr) {fsdb_mgr.Add(mkr.Make()); return this;} public Xofv_file_mgr_fxt Init_cache_add(Xou_cache_itm_mkr mkr) {mkr.Make(file_mgr.Cache_mgr()); return this;} public Xofv_file_mgr_fxt Init_fsys_add(String s) {Io_mgr._.SaveFilStr(s, ""); return this;} public Xofv_file_mgr_fxt Exec_process_lnki() {file_mgr.Process_lnki(); return this;} @@ -120,37 +110,6 @@ class Xofv_file_mgr_fxt { Tfds.Eq_true(Io_mgr._.ExistsFil(Io_url_.mem_fil_(path)), "fsys: " + path); return this; } - public Xofv_file_mgr_fxt Test_html_get(Xog_html_rsc_mkr mkr) { - file_mgr.Process_html(html_gui); - Xog_html_rsc expd = mkr.Make(); - Xog_html_rsc actl = html_gui.Get_by_id(expd.Uid()); - Bry_bfr bfr = Bry_bfr.reset_(255); - Tfds.Eq_str_lines(Xog_html_rsc_mkr.Xto_str(bfr, expd), Xog_html_rsc_mkr.Xto_str(bfr, actl)); - return this; - } - public Xofv_file_mgr_fxt Test_fsdb_download(int expd) { - Tfds.Eq(expd, fsdb_mgr.Download_count()); - return this; - } -} -class Xog_html_rsc_mkr { - private int uid; private String src; private int html_w, html_h; - public Xog_html_rsc_mkr Init(int uid, String src, int html_w, int html_h) {this.uid = uid; this.src = src; this.html_w = html_w; this.html_h = html_h; return this;} - private void Reset() {} - public Xog_html_rsc Make() { - Xog_html_rsc rv = new Xog_html_rsc(uid, src, html_w, html_h); - this.Reset(); - return rv; - } - public static String Xto_str(Bry_bfr bfr, Xog_html_rsc itm) { - if (itm == null) return ""; - bfr .Add_int_variable(itm.Uid()).Add_byte_nl() - .Add_str_utf8(itm.Src()).Add_byte_nl() - .Add_int_variable(itm.Html_w()).Add_byte_nl() - .Add_int_variable(itm.Html_h()).Add_byte_nl() - ; - return bfr.Xto_str_and_clear(); - } } class Xof_xfer_mkr { private byte[] ttl_bry; private byte lnki_type; private int xfer_w, xfer_h; private int uid; @@ -234,75 +193,23 @@ class Xof_fsdb_mkr { } } class Xou_cache_itm_mkr { - private byte[] dir; private byte[] ttl; private boolean is_orig; private int w, h; private double time; private int page; private long size; +// private byte[] dir; private byte[] ttl; private boolean is_orig; private int w, h; private double time; private int page; private long size; public Xou_cache_itm_mkr() {this.Reset();} private void Reset() { - this.time = Xof_lnki_time.Null; - this.page = Xof_lnki_page.Null; - this.h = 200; - this.size = 1; +// this.time = Xof_lnki_time.Null; +// this.page = Xof_lnki_page.Null; +// this.h = 200; +// this.size = 1; } public Xou_cache_itm_mkr Init(String dir_str, String ttl_str, boolean is_orig, int w) { - this.dir = Bry_.new_utf8_(dir_str); - this.ttl = Bry_.new_utf8_(ttl_str); - this.is_orig = is_orig; - this.w = w; +// this.dir = Bry_.new_utf8_(dir_str); +// this.ttl = Bry_.new_utf8_(ttl_str); +// this.is_orig = is_orig; +// this.w = w; return this; } public void Make(Xof_cache_mgr cache_mgr) { - cache_mgr.Fil__make(dir, ttl, is_orig, w, h, time, page, size); +// cache_mgr.Fil__make(dir, ttl, is_orig, w, h, time, page, size); this.Reset(); } } -class Xof_fsdb_mgr__test implements Xof_fsdb_mgr { - private Hash_adp_bry hash = Hash_adp_bry.cs_(); - private Bry_bfr tmp_bfr = Bry_bfr.reset_(255); - private int download_count; - public Xof_fsdb_mgr__test() {this.Clear();} - public int Download_count() {return download_count;} - public void Add(Xof_fsdb_itm itm) { - byte[] key = Bld_key_to_bry(tmp_bfr, itm.Orig_repo_name(), itm.Lnki_ttl(), itm.Lnki_w(), itm.Lnki_time(), itm.Lnki_page()); -// Tfds.Write("add:" + String_.new_utf8_(key)); - hash.Add(key, itm); - } - public void Clear() { - download_count = 0; - Io_mgr._.InitEngine_mem(); - hash.Clear(); - } - public boolean Download(Xofv_file_itm itm) { - byte[] key = Bld_key_to_bry(tmp_bfr, itm.File_repo(), itm.File_ttl(), itm.Html_w(), itm.Lnki_time(), itm.Lnki_page()); -// Tfds.Write("down:" + String_.new_utf8_(key)); - if (!hash.Has(key)) { - return false; - } - Io_mgr._.SaveFilStr(itm.File_url(), ""); - ++download_count; - return true; - } - private static byte[] Bld_key_to_bry(Bry_bfr bfr, byte[] dir, byte[] name, int w, double time, int page) { - bfr .Add(dir).Add_byte_pipe() - .Add(name).Add_byte_pipe() - .Add_int_variable(w).Add_byte_pipe() - .Add_double(time).Add_byte_pipe() - .Add_int_variable(page).Add_byte_pipe() - ; - return bfr.Xto_bry_and_clear(); - } -} -class Xog_html_gui__test implements Xog_html_gui { - private HashAdp hash = HashAdp_.new_(); - public void Clear() {hash.Clear();} - public Xog_html_rsc Get_by_id(int v) {return (Xog_html_rsc)hash.Fetch(Int_obj_ref.new_(v));} - public void Update(int id, String src, int w, int h) { - Xog_html_rsc rsc = new Xog_html_rsc(id, src, w, h); - hash.Add(Int_obj_ref.new_(id), rsc); - } -} -class Xog_html_rsc { - public Xog_html_rsc(int uid, String src, int html_w, int html_h) {this.uid = uid; this.src = src; this.html_w = html_w; this.html_h = html_h;} - public int Uid() {return uid;} private final int uid; - public String Src() {return src;} private final String src; - public int Html_w() {return html_w;} private final int html_w; - public int Html_h() {return html_h;} private final int html_h; -} diff --git a/400_xowa/src/gplx/xowa2/files/commons/Xof_commons_image_tbl.java b/400_xowa/src/gplx/xowa2/files/commons/Xof_commons_image_tbl.java index 91484b1d6..8dba1e401 100644 --- a/400_xowa/src/gplx/xowa2/files/commons/Xof_commons_image_tbl.java +++ b/400_xowa/src/gplx/xowa2/files/commons/Xof_commons_image_tbl.java @@ -17,25 +17,27 @@ along with this program. If not, see . */ package gplx.xowa2.files.commons; import gplx.*; import gplx.xowa2.*; import gplx.xowa2.files.*; import gplx.dbs.*; -public class Xof_commons_image_tbl { +public class Xof_commons_image_tbl implements RlsAble { private Db_stmt stmt_insert; public Db_conn Conn() {return conn;} public void Conn_(Db_conn v) { conn = v; stmt_insert = null; + conn.Rls_reg(this); } private Db_conn conn; + public void Rls() { + stmt_insert = Db_stmt_.Rls(stmt_insert); + } public void Insert(String ttl, String media_type, String minor_mime, int size, int w, int h, int bits, int ext_id, String img_timestamp) { - if (stmt_insert == null) stmt_insert = conn.Rls_reg(conn.Stmt_insert(tbl_name, flds.To_str_ary())); + if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds); stmt_insert.Clear() .Val_str(ttl).Val_str(media_type).Val_str(minor_mime) .Val_int(size).Val_int(w).Val_int(h).Val_int(bits).Val_int(ext_id).Val_str(img_timestamp) .Exec_insert(); } public Xof_commons_image_itm Select(byte[] ttl) { - Db_stmt stmt = conn.Stmt_select(tbl_name, flds.To_str_ary(), fld_img_name); - Db_rdr rdr = Db_rdr_.Null; + Db_rdr rdr = conn.Stmt_select(tbl_name, flds, fld_img_name).Clear().Val_bry_as_str(ttl).Exec_select__rls_auto(); try { - rdr = stmt.Clear().Val_bry_as_str(ttl).Exec_select_as_rdr(); if (!rdr.Move_next()) return null; return new Xof_commons_image_itm ( rdr.Read_str(fld_img_name) diff --git a/400_xowa/src/gplx/xowa2/gui/Xog_page.java b/400_xowa/src/gplx/xowa2/gui/Xog_page.java index ab4aa6e9c..080dc4c48 100644 --- a/400_xowa/src/gplx/xowa2/gui/Xog_page.java +++ b/400_xowa/src/gplx/xowa2/gui/Xog_page.java @@ -35,15 +35,15 @@ public class Xog_page implements Xoa_page { public byte[] Content_sub() {return content_sub;} public void Content_sub_(byte[] v) {this.content_sub = v;} private byte[] content_sub; public byte[] Sidebar_div() {return sidebar_div;} public void Sidebar_div_(byte[] v) {this.sidebar_div = v;} private byte[] sidebar_div; public int[] Redlink_uids() {return redlink_uids;} public void Redlink_uids_(int[] v) {redlink_uids = v;} private int[] redlink_uids; - public Xohd_data_itm__base[] Img_itms() {return img_itms;} public void Img_itms_(Xohd_data_itm__base[] v) {this.img_itms = v;} private Xohd_data_itm__base[] img_itms; - public OrderedHash Gly_itms() {return gly_itms;} private OrderedHash gly_itms = OrderedHash_.new_(); + public Xohd_data_itm__base[] Img_itms() {return img_itms;} public void Img_itms_(Xohd_data_itm__base[] v) {this.img_itms = v;} private Xohd_data_itm__base[] img_itms; + public OrderedHash Gallery_itms() {return gallery_itms;} private OrderedHash gallery_itms = OrderedHash_.new_(); public Xog_page Init(int page_id, Xoa_url page_url, Xoa_ttl page_ttl) { this.page_id = page_id; this.page_url = page_url; this.page_ttl = page_ttl; content_sub = sidebar_div = Bry_.Empty; display_ttl = null; img_itms = Xohd_data_itm__base.Ary_empty; module_mgr.Clear(); - gly_itms.Clear(); + gallery_itms.Clear(); return this; } public void Ctor_from_page(Bry_bfr tmp_bfr, Xoae_page page) { diff --git a/400_xowa/src/gplx/xowa2/users/data/Xoud_site_row.java b/400_xowa/src/gplx/xowa2/users/data/Xoud_site_row.java deleted file mode 100644 index ac3249a9f..000000000 --- a/400_xowa/src/gplx/xowa2/users/data/Xoud_site_row.java +++ /dev/null @@ -1,30 +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 . -*/ -package gplx.xowa2.users.data; import gplx.*; import gplx.xowa2.*; import gplx.xowa2.users.*; -public class Xoud_site_row { - public Xoud_site_row(int user_id, int id, int priority, String domain, String name, String path, String xtn) { - this.user_id = user_id; this.id = id; this.priority = priority; this.domain = domain; this.name = name; this.path = path; this.xtn = xtn; - } - public int User_id() {return user_id;} private int user_id; - public int Id() {return id;} private final int id; - public int Priority() {return priority;} private final int priority; - public String Domain() {return domain;} private final String domain; - public String Name() {return name;} private final String name; - public String Path() {return path;} private final String path; - public String Xtn() {return xtn;} private String xtn; -} diff --git a/400_xowa/src/gplx/xowa2/users/data/Xoud_site_tbl.java b/400_xowa/src/gplx/xowa2/users/data/Xoud_site_tbl.java deleted file mode 100644 index 8083f53c7..000000000 --- a/400_xowa/src/gplx/xowa2/users/data/Xoud_site_tbl.java +++ /dev/null @@ -1,97 +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 . -*/ -package gplx.xowa2.users.data; import gplx.*; import gplx.xowa2.*; import gplx.xowa2.users.*; -import gplx.dbs.*; -public class Xoud_site_tbl { - private String tbl_name = "user_site_regy"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); - private String fld_user_id, fld_site_id, fld_site_priority, fld_site_domain, fld_site_name, fld_site_path, fld_site_xtn; - private Db_conn conn; private int user_id; - public void Conn_(Db_conn new_conn, boolean created, int user_id) { - this.conn = new_conn; flds.Clear(); this.user_id = user_id; - fld_user_id = flds.Add_int("user_id"); - fld_site_id = flds.Add_int("site_id"); - fld_site_priority = flds.Add_int("site_priority"); // EX: 0=default; 1+ is order if 0 is unavailable - fld_site_domain = flds.Add_str("site_domain", 255); // EX: en.wikipedia.org; NOTE: no protocol (https:) - fld_site_name = flds.Add_str("site_name", 255); // EX: English Wikipedia - fld_site_path = flds.Add_str("site_path", 255); // EX: ~{xowa_root}/wiki/en.wikipedia.org/ - fld_site_xtn = flds.Add_text("site_xtn"); - if (created) { - Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds - , Db_meta_idx.new_unique_by_tbl(tbl_name, "pkey", fld_user_id, fld_site_id) - ); - conn.Exec_create_tbl_and_idx(meta); - } - } - @gplx.Virtual public void Insert(int site_id, int priority, String domain, String name, String path, String xtn) { - Db_stmt stmt = conn.Stmt_insert(tbl_name, flds); - stmt.Val_int(fld_user_id, user_id).Val_int(fld_site_id, site_id) - .Val_int(fld_site_priority, priority).Val_str(fld_site_domain, domain).Val_str(fld_site_name, name).Val_str(fld_site_path, path).Val_str(fld_site_xtn, xtn) - .Exec_insert(); - } - @gplx.Virtual public void Update(int site_id, int priority, String domain, String name, String path, String xtn) { - Db_stmt stmt = conn.Stmt_update_exclude(tbl_name, flds, fld_user_id, fld_site_id); - stmt.Val_int(fld_site_priority, priority).Val_str(fld_site_domain, domain).Val_str(fld_site_name, name).Val_str(fld_site_path, path).Val_str(fld_site_xtn, xtn) - .Crt_int(fld_user_id, user_id).Crt_int(fld_site_id, site_id) - .Exec_update(); - } - @gplx.Virtual public void Delete(int site_id) { - Db_stmt stmt = conn.Stmt_delete(tbl_name, fld_user_id, fld_site_id); - stmt.Crt_int(fld_user_id, user_id).Crt_int(fld_site_id, site_id) - .Exec_delete(); - } - public Xoud_site_row[] Select_all() { - ListAdp rv = ListAdp_.new_(); - Db_stmt stmt = Db_stmt_.Null; Db_rdr rdr = Db_rdr_.Null; - try { - stmt = conn.Stmt_select(tbl_name, flds, fld_user_id); - rdr = stmt.Crt_int(fld_user_id, user_id).Exec_select_as_rdr(); - while (rdr.Move_next()) { - Xoud_site_row row = Make_row(rdr); - rv.Add(row); - } - return (Xoud_site_row[])rv.Xto_ary_and_clear(Xoud_site_row.class); - } - finally {rdr.Rls();} - } - public Xoud_site_row[] Select_by_domain(String domain) { - ListAdp rv = ListAdp_.new_(); - Db_stmt stmt = Db_stmt_.Null; Db_rdr rdr = Db_rdr_.Null; - try { - stmt = conn.Stmt_select(tbl_name, flds, fld_user_id, fld_site_domain); - rdr = stmt.Crt_int(fld_user_id, user_id).Crt_str(fld_site_domain, domain).Exec_select_as_rdr(); - while (rdr.Move_next()) { - Xoud_site_row row = Make_row(rdr); - rv.Add(row); - } - rdr.Rls(); - return (Xoud_site_row[])rv.Xto_ary_and_clear(Xoud_site_row.class); - } - finally {rdr.Rls();} - } - private Xoud_site_row Make_row(Db_rdr rdr) { - return new Xoud_site_row - ( rdr.Read_int(fld_user_id) - , rdr.Read_int(fld_site_id) - , rdr.Read_int(fld_site_priority) - , rdr.Read_str(fld_site_domain) - , rdr.Read_str(fld_site_name) - , rdr.Read_str(fld_site_path) - , rdr.Read_str(fld_site_xtn) - ); - } -} diff --git a/400_xowa/src/gplx/xowa2/wikis/Xowv_wiki.java b/400_xowa/src/gplx/xowa2/wikis/Xowv_wiki.java index f4e3fe28f..913334f2e 100644 --- a/400_xowa/src/gplx/xowa2/wikis/Xowv_wiki.java +++ b/400_xowa/src/gplx/xowa2/wikis/Xowv_wiki.java @@ -19,11 +19,12 @@ package gplx.xowa2.wikis; import gplx.*; import gplx.xowa2.*; import gplx.core.primitives.*; import gplx.xowa.*; import gplx.xowa.wikis.xwikis.*; import gplx.xowa.langs.cases.*; import gplx.xowa.wikis.ttls.*; import gplx.xowa.html.hzips.*; import gplx.xowa.wikis.data.*; -import gplx.xowa.files.*; import gplx.xowa.files.origs.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.files.bins.*; import gplx.fsdb.meta.*; -import gplx.xowa.dbs.tbls.*; import gplx.dbs.*; import gplx.xowa.html.hdumps.*; import gplx.xowa.wikis.*; import gplx.xowa.files.repos.*; +import gplx.xowa.files.*; import gplx.xowa.files.origs.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.files.bins.*; +import gplx.xowa.wikis.data.tbls.*; import gplx.dbs.*; import gplx.xowa.html.hdumps.*; import gplx.xowa.wikis.*; import gplx.xowa.files.repos.*; import gplx.xowa2.apps.*; import gplx.xowa2.wikis.specials.*; import gplx.xowa2.gui.*; +import gplx.fsdb.*; import gplx.fsdb.meta.*; public class Xowv_wiki implements Xow_wiki, Xow_ttl_parser { - private final Xof_fsdb_mgr__sql fsdb_mgr = new Xof_fsdb_mgr__sql(); + private final Xof_fsdb_mgr__sql fsdb_mgr; private Fsdb_db_mgr db_core_mgr; public Xowv_wiki(Xoav_app app, byte[] domain_bry, Io_url wiki_root_dir) { this.app = app; this.domain_bry = domain_bry; this.domain_str = String_.new_utf8_(domain_bry); @@ -31,13 +32,13 @@ public class Xowv_wiki implements Xow_wiki, Xow_ttl_parser { this.domain_tid = domain_itm.Domain_tid(); this.domain_abrv = Xow_wiki_alias.Build_alias(Xow_domain_.parse(domain_bry)); this.ns_mgr = Xow_ns_mgr_.default_(app.Utl_case_mgr()); - this.data_mgr__core_mgr = new Xowv_core_data_mgr(domain_str, wiki_root_dir); this.html_mgr__hzip_mgr = new Xow_hzip_mgr(app.Usr_dlg(), this); this.html_mgr__hdump_rdr = new Xohd_hdump_rdr(app, this); this.xwiki_mgr = new Xow_xwiki_mgr(); this.special_mgr = new Xosp_special_mgr(this); Io_url wiki_file_dir = domain_tid == Xow_domain_.Tid_int_home ? wiki_root_dir : wiki_root_dir.OwnerDir().OwnerDir().GenSubDir_nest("file", domain_str); this.fsys_mgr = new Xow_fsys_mgr(wiki_root_dir, wiki_file_dir); + this.fsdb_mgr = new Xof_fsdb_mgr__sql(); } public Xoa_app App() {return app;} public byte[] Domain_bry() {return domain_bry;} private final byte[] domain_bry; @@ -47,10 +48,10 @@ public class Xowv_wiki implements Xow_wiki, Xow_ttl_parser { public byte[] Domain_abrv() {return domain_abrv;} private final byte[] domain_abrv; public Xow_ns_mgr Ns_mgr() {return ns_mgr;} private final Xow_ns_mgr ns_mgr; public Xow_fsys_mgr Fsys_mgr() {return fsys_mgr;} private Xow_fsys_mgr fsys_mgr; - public Xow_core_data_mgr Data_mgr__core_mgr() {return data_mgr__core_mgr;} private final Xowv_core_data_mgr data_mgr__core_mgr; + public Xowd_db_mgr Data_mgr__core_mgr() {return data_mgr__core_mgr;} private Xowd_db_mgr data_mgr__core_mgr; public Xow_repo_mgr File_mgr__repo_mgr() {return file_mgr__repo_mgr;} private Xowv_repo_mgr file_mgr__repo_mgr = new Xowv_repo_mgr(); public Xof_fsdb_mode File_mgr__fsdb_mode() {return file_mgr__fsdb_mode;} private final Xof_fsdb_mode file_mgr__fsdb_mode = Xof_fsdb_mode.new_view(); - public Xof_orig_mgr File_mgr__orig_mgr() {return fsdb_mgr.Orig_mgr();} + public Xof_orig_mgr File_mgr__orig_mgr() {return orig_mgr;} private final Xof_orig_mgr orig_mgr = new Xof_orig_mgr(); public Xof_bin_mgr File_mgr__bin_mgr() {return fsdb_mgr.Bin_mgr();} public Fsm_mnt_mgr File_mgr__mnt_mgr() {return fsdb_mgr.Mnt_mgr();} public boolean Html_mgr__hdump_enabled() {return Bool_.Y;} @@ -61,13 +62,24 @@ public class Xowv_wiki implements Xow_wiki, Xow_ttl_parser { public Xosp_special_mgr Special_mgr() {return special_mgr;} private Xosp_special_mgr special_mgr; public Xow_xwiki_mgr Xwiki_mgr() {return xwiki_mgr;} private Xow_xwiki_mgr xwiki_mgr; public Xoav_app Appv() {return app;} private final Xoav_app app; + private boolean init_needed = true; public void Pages_get(Xog_page rv, Gfo_url url, Xoa_ttl ttl) { - if (data_mgr__core_mgr.Init()) { - file_mgr__repo_mgr.Add_repo(app, fsys_mgr.File_dir(), Bry_.new_utf8_("commons.wikimedia.org"), Bry_.new_utf8_("simple.wikipedia.org")); - file_mgr__repo_mgr.Add_repo(app, fsys_mgr.File_dir(), Bry_.new_utf8_("simple.wikipedia.org"), Bry_.new_utf8_("commons.wikimedia.org")); - fsdb_mgr.Init_by_wiki(this); - data_mgr__core_mgr.Tbl__ns().Select_all(0, ns_mgr); - html_mgr__hdump_rdr.Init_by_db(data_mgr__core_mgr); + if (init_needed) { + init_needed = false; + if (!String_.Eq(domain_str, "xowa")) {; // FIXME: ignore "xowa" for now; WHEN:converting xowa to sqlitedb + data_mgr__core_mgr = new Xowd_db_mgr(fsys_mgr.Root_dir(), domain_itm); + Io_url core_url = gplx.xowa.wikis.Xow_fsys_mgr.Find_core_fil(fsys_mgr.Root_dir(), domain_str); + data_mgr__core_mgr.Init_by_load(core_url); + this.db_core_mgr = Fsdb_db_mgr_.new_detect(domain_str, fsys_mgr.Root_dir(), fsys_mgr.File_dir()); + if (db_core_mgr != null) // will be null for xowa db + fsdb_mgr.Mnt_mgr().Ctor_by_load(db_core_mgr); + file_mgr__repo_mgr.Add_repo(app, fsys_mgr.File_dir(), Bry_.new_utf8_("commons.wikimedia.org"), Bry_.new_utf8_("simple.wikipedia.org")); + file_mgr__repo_mgr.Add_repo(app, fsys_mgr.File_dir(), Bry_.new_utf8_("simple.wikipedia.org"), Bry_.new_utf8_("commons.wikimedia.org")); + orig_mgr.Init_by_wiki(file_mgr__fsdb_mode, db_core_mgr.File__orig_tbl_ary(), domain_bry, app.Wmf_mgr().Download_wkr(), file_mgr__repo_mgr, Xof_url_bldr.new_v2_()); + fsdb_mgr.Init_by_wiki(this); + data_mgr__core_mgr.Db__core().Tbl__ns().Select_all(ns_mgr); + html_mgr__hdump_rdr.Init_by_db(data_mgr__core_mgr); + } } if (ttl.Ns().Id_special()) special_mgr.Get_by_ttl(rv, url, ttl); diff --git a/400_xowa/src_040_io/gplx/ios/Io_sort_tst.java b/400_xowa/src_040_io/gplx/ios/Io_sort_tst.java index c1ec45c2a..f0c163c0b 100644 --- a/400_xowa/src_040_io/gplx/ios/Io_sort_tst.java +++ b/400_xowa/src_040_io/gplx/ios/Io_sort_tst.java @@ -50,7 +50,7 @@ class Io_sort_fxt { public String GenRandom(int rows, int pad) { ListAdp list = ListAdp_.new_(); for (int i = 0; i < rows; i++) - list.Add(Int_.Xto_str_pad_bgn(i, pad) + "|"); + list.Add(Int_.Xto_str_pad_bgn_zero(i, pad) + "|"); list.Shuffle(); for (int i = 0; i < rows; i++) { String itm = (String)list.FetchAt(i); @@ -60,7 +60,7 @@ class Io_sort_fxt { } public String GenOrdered(int rows, int pad) { for (int i = 0; i < rows; i++) - sb.Add(Int_.Xto_str_pad_bgn(i, pad) + "|" + "\n"); + sb.Add(Int_.Xto_str_pad_bgn_zero(i, pad) + "|" + "\n"); return sb.Xto_str_and_clear(); } } diff --git a/400_xowa/src_040_io/gplx/ios/Io_url_gen_.java b/400_xowa/src_040_io/gplx/ios/Io_url_gen_.java index 477d7314e..ef7963e86 100644 --- a/400_xowa/src_040_io/gplx/ios/Io_url_gen_.java +++ b/400_xowa/src_040_io/gplx/ios/Io_url_gen_.java @@ -25,11 +25,11 @@ class Io_url_gen_dir implements Io_url_gen { public String Fmt() {return fmt;} public Io_url_gen_dir Fmt_(String v) {fmt = v; return this;} private String fmt = "{0}.csv"; public int Fmt_digits() {return fmt_digits;} public Io_url_gen_dir Fmt_digits_(int v) {fmt_digits = v; return this;} private int fmt_digits = 10; public Io_url Cur_url() {return cur_url;} Io_url cur_url; - public Io_url Nxt_url() {cur_url = dir.GenSubFil(String_.Format(fmt, Int_.Xto_str_pad_bgn(idx++, fmt_digits))); return cur_url;} private int idx = 0; + public Io_url Nxt_url() {cur_url = dir.GenSubFil(String_.Format(fmt, Int_.Xto_str_pad_bgn_zero(idx++, fmt_digits))); return cur_url;} private int idx = 0; public Io_url[] Prv_urls() { Io_url[] rv = new Io_url[idx]; for (int i = 0; i < idx; i++) { - rv[i] = dir.GenSubFil(String_.Format(fmt, Int_.Xto_str_pad_bgn(i, fmt_digits))); + rv[i] = dir.GenSubFil(String_.Format(fmt, Int_.Xto_str_pad_bgn_zero(i, fmt_digits))); } return rv; } diff --git a/400_xowa/src_060_utl/gplx/Gfo_usr_dlg_fmt.java b/400_xowa/src_060_utl/gplx/Gfo_usr_dlg_fmt.java index f6842525a..a5a548e82 100644 --- a/400_xowa/src_060_utl/gplx/Gfo_usr_dlg_fmt.java +++ b/400_xowa/src_060_utl/gplx/Gfo_usr_dlg_fmt.java @@ -21,7 +21,7 @@ public class Gfo_usr_dlg_fmt { if (cur < prog_prv + prog_interval) return usr_dlg.Canceled(); prog_prv = cur; String pct = DecimalAdp_.CalcPctStr(cur + ListAdp_.Base1, end, "00.00"); - usr_dlg.Prog_many(grp_key, msg_key, fmt, Int_.Xto_str_pad_bgn(cur + ListAdp_.Base1, endLen), end, pct); + usr_dlg.Prog_many(grp_key, msg_key, fmt, Int_.Xto_str_pad_bgn_zero(cur + ListAdp_.Base1, endLen), end, pct); return usr_dlg.Canceled(); } String fmt; int end, endLen; public static Gfo_usr_dlg_fmt fmt_(String grp_key, String msg_key, String fmt, int end, float pct) { diff --git a/400_xowa/src_060_utl/gplx/Io_zip_mgr_mok.java b/400_xowa/src_060_utl/gplx/Io_zip_mgr_mok.java index 40a777a60..e20fade9f 100644 --- a/400_xowa/src_060_utl/gplx/Io_zip_mgr_mok.java +++ b/400_xowa/src_060_utl/gplx/Io_zip_mgr_mok.java @@ -32,5 +32,5 @@ public class Io_zip_mgr_mok implements Io_zip_mgr { } public void Unzip_to_dir(Io_url src_fil, Io_url trg_dir) {} private static final byte[] Bry_zipped = Bry_.new_utf8_("zipped:"); - public static final Io_zip_mgr_mok _ = new Io_zip_mgr_mok(); Io_zip_mgr_mok() {} + public static final Io_zip_mgr_mok _ = new Io_zip_mgr_mok(); Io_zip_mgr_mok() {} } diff --git a/400_xowa/src_100_app/gplx/xowa/Xoa_hive_mgr.java b/400_xowa/src_100_app/gplx/xowa/Xoa_hive_mgr.java index 30ca83be1..af1e2c6d5 100644 --- a/400_xowa/src_100_app/gplx/xowa/Xoa_hive_mgr.java +++ b/400_xowa/src_100_app/gplx/xowa/Xoa_hive_mgr.java @@ -33,7 +33,7 @@ public class Xoa_hive_mgr { Io_url file = Xotdb_fsys_mgr.Url_fil(hive_root, fil_idx, fil_ext_bry); tmp_bry = Io_mgr._.LoadFilBry_reuse(file, tmp_bry, bry_len); xdat_rdr.Clear().Parse(tmp_bry, bry_len.Val(), file); - tmp_bfr.Mkr_rls().Clear(); + tmp_bfr.Clear_and_rls(); return xdat_rdr; } } diff --git a/400_xowa/src_100_app/gplx/xowa/Xoa_url_alias_mgr.java b/400_xowa/src_100_app/gplx/xowa/Xoa_url_alias_mgr.java index 277e92283..62e07b3b1 100644 --- a/400_xowa/src_100_app/gplx/xowa/Xoa_url_alias_mgr.java +++ b/400_xowa/src_100_app/gplx/xowa/Xoa_url_alias_mgr.java @@ -24,7 +24,7 @@ along with this program. If not, see . // byte[] fmt = (byte[])hash.Get_by_mid(raw, 0, colon_pos); if (fmt == null) return null; // Bry_bfr tmp_bfr = app.Utl__bfr_mkr().Get_b512(); // fmtr.Fmt_(fmt).Bld_bfr_many(tmp_bfr, Bry_.Mid(raw, colon_pos + Int_.Const_dlm_len, raw.length)); -// return tmp_bfr.Mkr_rls().Xto_bry_and_clear(); +// return tmp_bfr.To_bry_and_rls(); // } // public void Clear() {hash.Clear();} // public void Add_one(byte[] alias, byte[] wiki_key) {hash.Add_bry_obj(alias, wiki_key);} diff --git a/400_xowa/src_120_wiki/gplx/xowa/Xow_ns.java b/400_xowa/src_120_wiki/gplx/xowa/Xow_ns.java index a768c4c6e..2169379bf 100644 --- a/400_xowa/src_120_wiki/gplx/xowa/Xow_ns.java +++ b/400_xowa/src_120_wiki/gplx/xowa/Xow_ns.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa; import gplx.*; +import gplx.xowa.bldrs.cmds.*; public class Xow_ns implements GfoInvkAble { public Xow_ns(int id, byte case_match, byte[] name, boolean is_alias) { this.id = id; this.case_match = case_match; this.is_alias = is_alias; @@ -32,7 +33,7 @@ public class Xow_ns implements GfoInvkAble { this.name_db_w_colon = Bry_.Add(v, Byte_ascii.Colon); this.name_str = String_.new_utf8_(v); } - this.num_str = Int_.Xto_str_pad_bgn(id, 3); + this.num_str = Int_.Xto_str_pad_bgn_zero(id, 3); this.num_bry = Bry_.new_ascii_(num_str); this.name_enc = Xoa_url_encoder._.Encode(name_bry); this.name_txt = Bry_.Replace(name_enc, Byte_ascii.Underline, Byte_ascii.Space); @@ -92,8 +93,7 @@ public class Xow_ns implements GfoInvkAble { return rv; } public boolean Exists() {return exists;} public Xow_ns Exists_(boolean v) {exists = v; return this;} private boolean exists; - public int Bldr_file_idx() {return bldr_file_idx;} public void Bldr_file_idx_(int v) {bldr_file_idx = v;} private int bldr_file_idx = Bldr_file_idx_heap; - public static final int Bldr_file_idx_heap = -1; + public Xob_ns_file_itm Bldr_data() {return bldr_data;} public void Bldr_data_(Xob_ns_file_itm v) {bldr_data = v;} private Xob_ns_file_itm bldr_data; public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_subpages_enabled_)) subpages_enabled = m.ReadYn("v"); else if (ctx.Match(k, Invk_id)) return id; diff --git a/400_xowa/src_120_wiki/gplx/xowa/Xow_wiki.java b/400_xowa/src_120_wiki/gplx/xowa/Xow_wiki.java index 1cf0d51e4..416d5e58d 100644 --- a/400_xowa/src_120_wiki/gplx/xowa/Xow_wiki.java +++ b/400_xowa/src_120_wiki/gplx/xowa/Xow_wiki.java @@ -35,7 +35,7 @@ public interface Xow_wiki extends Xow_ttl_parser { Xof_orig_mgr File_mgr__orig_mgr(); Xof_bin_mgr File_mgr__bin_mgr(); Fsm_mnt_mgr File_mgr__mnt_mgr(); - Xow_core_data_mgr Data_mgr__core_mgr(); + Xowd_db_mgr Data_mgr__core_mgr(); boolean Html_mgr__hdump_enabled(); Xow_hzip_mgr Html_mgr__hzip_mgr(); Xohd_hdump_rdr Html_mgr__hdump_rdr(); diff --git a/400_xowa/src_120_wiki/gplx/xowa/Xowe_wiki.java b/400_xowa/src_120_wiki/gplx/xowa/Xowe_wiki.java index 6ec549a61..4d1984122 100644 --- a/400_xowa/src_120_wiki/gplx/xowa/Xowe_wiki.java +++ b/400_xowa/src_120_wiki/gplx/xowa/Xowe_wiki.java @@ -18,12 +18,13 @@ along with this program. If not, see . package gplx.xowa; import gplx.*; import gplx.core.primitives.*; import gplx.xowa.apps.*; import gplx.xowa.apps.fsys.*; import gplx.xowa.files.exts.*; import gplx.xowa.wikis.*; import gplx.xowa.users.*; import gplx.xowa.html.*; import gplx.xowa.users.history.*; import gplx.xowa.specials.*; import gplx.xowa.xtns.*; import gplx.xowa.dbs.*; import gplx.xowa.wikis.ttls.*; -import gplx.xowa.wikis.data.*; +import gplx.fsdb.*; +import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.files.*; import gplx.xowa.files.repos.*; import gplx.xowa.files.origs.*; import gplx.xowa.files.bins.*; import gplx.fsdb.meta.*; import gplx.xowa.langs.vnts.*; import gplx.xowa.gui.views.*; import gplx.xowa.wikis.xwikis.*; import gplx.xowa.html.hzips.*; import gplx.xowa.html.hdumps.*; import gplx.xowa.setup.maints.*; import gplx.xowa.wikis.caches.*; -import gplx.xowa.bldrs.imports.*; import gplx.xowa.xtns.pfuncs.*; +import gplx.xowa.bldrs.xmls.*; import gplx.xowa.xtns.pfuncs.*; import gplx.xowa.tdbs.*; public class Xowe_wiki implements Xow_wiki, GfoInvkAble { private Xow_html_util util; @@ -87,12 +88,14 @@ public class Xowe_wiki implements Xow_wiki, GfoInvkAble { public Xow_fsys_mgr Fsys_mgr() {return fsys_mgr;} private final Xow_fsys_mgr fsys_mgr; public Xoa_ttl Ttl_parse(byte[] ttl) {return Xoa_ttl.parse_(this, ttl);} public Xoa_ttl Ttl_parse(int ns_id, byte[] ttl) {return Xoa_ttl.parse_(this, ns_id, ttl);} - public Xow_core_data_mgr Data_mgr__core_mgr() {return db_mgr.Tid() == Xodb_mgr_txt.Tid_txt ? null : this.Db_mgr_as_sql().Core_data_mgr();} // TEST: + public Xowd_db_mgr Data_mgr__core_mgr() {return db_mgr.Tid() == Xodb_mgr_txt.Tid_txt ? null : this.Db_mgr_as_sql().Core_data_mgr();} // TEST: public Xow_repo_mgr File_mgr__repo_mgr() {return file_mgr.Repo_mgr();} - public Xof_orig_mgr File_mgr__orig_mgr() {return file_mgr.Fsdb_mgr().Orig_mgr();} + public Xof_orig_mgr File_mgr__orig_mgr() {return file_mgr.Orig_mgr();} public Xof_bin_mgr File_mgr__bin_mgr() {return file_mgr.Fsdb_mgr().Bin_mgr();} public Fsm_mnt_mgr File_mgr__mnt_mgr() {return file_mgr.Fsdb_mgr().Mnt_mgr();} public Xof_fsdb_mode File_mgr__fsdb_mode() {return file_mgr.Fsdb_mode();} + public Fsdb_db_mgr File_mgr__file_db_core() {return file_mgr.Db_core();} + public boolean Html_mgr__hdump_enabled() {return html_mgr__hdump_enabled;} private boolean html_mgr__hdump_enabled = Bool_.N; public Xow_hzip_mgr Html_mgr__hzip_mgr() {return html_mgr.Hzip_mgr();} public Xohd_hdump_rdr Html_mgr__hdump_rdr() {return html_mgr__hdump_rdr;} private final Xohd_hdump_rdr html_mgr__hdump_rdr; @@ -111,6 +114,7 @@ public class Xowe_wiki implements Xow_wiki, GfoInvkAble { public Xow_html_mgr Html_mgr() {return html_mgr;} private Xow_html_mgr html_mgr; public Xow_xtn_mgr Xtn_mgr() {return xtn_mgr;} private Xow_xtn_mgr xtn_mgr; public Xow_cache_mgr Cache_mgr() {return cache_mgr;} private Xow_cache_mgr cache_mgr; + public Xow_page_mgr Page_mgr() {return page_mgr;} private Xow_page_mgr page_mgr = new Xow_page_mgr(); public byte[] Commons_wiki_key() {return commons_wiki_key;} private byte[] commons_wiki_key = Xow_domain_.Domain_bry_commons; public Xob_hive_mgr Hive_mgr() {return hive_mgr;} private Xob_hive_mgr hive_mgr; @@ -124,7 +128,7 @@ public class Xowe_wiki implements Xow_wiki, GfoInvkAble { private void Wdata_wiki_abrv_() { Bry_bfr bfr = app.Utl__bfr_mkr().Get_b128(); Xow_wiki_alias.Build_alias_by_lang_tid(bfr, wdata_wiki_lang, Int_obj_ref.new_(wdata_wiki_tid)); - wdata_wiki_abrv = bfr.Mkr_rls().Xto_bry_and_clear(); + wdata_wiki_abrv = bfr.To_bry_and_rls(); } public boolean Init_needed() {return init_needed;} public Xowe_wiki Init_needed_(boolean v) {init_needed = v; return this;} private boolean init_needed = true; @@ -192,6 +196,17 @@ public class Xowe_wiki implements Xow_wiki, GfoInvkAble { public Xodb_mgr_sql Db_mgr_create_as_sql() {Xodb_mgr_sql rv = new Xodb_mgr_sql(this); db_mgr = rv; return rv;} public Xowe_wiki Init_assert() {if (init_needed) Init_wiki(app.User()); return this;} private boolean init_in_process = false; + public void Init_db_mgr() { + Io_url core_db_url = gplx.xowa.wikis.Xow_fsys_mgr.Find_core_fil(this); + if (core_db_url == null) { + tdb_fsys_mgr.Scan_dirs(); + } + else { + Xodb_mgr_sql db_mgr_sql = this.Db_mgr_create_as_sql(); + db_mgr_sql.Core_data_mgr().Init_by_load(core_db_url); + file_mgr.Init_file_mgr_by_load(this); + } + } private void Init_wiki(Xou_user user) { // NOTE: (a) one-time initialization for all wikis; (b) not called by tests if (init_in_process) { app.Usr_dlg().Log_many("", "", "wiki.init: circular call canceled: ~{0}", domain_str); @@ -203,17 +218,11 @@ public class Xowe_wiki implements Xow_wiki, GfoInvkAble { log_bfr.Add("wiki.init.bgn: " + domain_str); app.Cfg_mgr().Init(this); file_mgr.Cfg_download().Enabled_(app.File_mgr().Wmf_mgr().Enabled()); // default download to app global; can be overriden below - Io_url sqlite_url = Xodb_mgr_sql.Find_core_url(this); app.Gfs_mgr().Run_url_for(this, tdb_fsys_mgr.Cfg_wiki_stats_fil()); app.Gfs_mgr().Run_url_for(this, app.Fsys_mgr().Cfg_wiki_core_dir().GenSubFil(domain_str + ".gfs")); // run cfg for wiki by user ; EX: /xowa/user/anonymous/wiki/en.wikipedia.org/cfg/user_wiki.gfs - if (sqlite_url == null) { - tdb_fsys_mgr.Scan_dirs(); - } - else { - Xodb_mgr_sql db_mgr_sql = this.Db_mgr_create_as_sql(); - db_mgr_sql.Init_load(gplx.dbs.Db_url_.sqlite_(sqlite_url)); - } - if (!Xob_import_marker.Check(this)) {app.Wiki_mgr().Del(domain_bry); init_needed = false; return;} // NOTE: must call after Db_mgr_create_as_sql(); also, must delete wiki from mgr; DATE:2014-08-24 + Init_db_mgr(); + // FIXME: commented out; fires multiple times during import process + if (!app.Bldr().Import_marker().Chk(this)) {app.Wiki_mgr().Del(domain_bry); init_needed = false; return;} // NOTE: must call after Db_mgr_create_as_sql(); also, must delete wiki from mgr; DATE:2014-08-24 db_mgr.Load_mgr().Load_init(this); app.Gfs_mgr().Run_url_for(this, tdb_fsys_mgr.Cfg_wiki_core_fil()); gplx.xowa.utls.upgrades.Xoa_upgrade_mgr.Check(this); @@ -230,13 +239,13 @@ public class Xowe_wiki implements Xow_wiki, GfoInvkAble { Bry_fmtr.Null.Eval_mgr().Enabled_(false); app.Wiki_mgr().Scripts().Exec(this); Bry_fmtr.Null.Eval_mgr().Enabled_(true); - app.Wiki_mgr().Css_installer().Install_assert(this, user.Fsys_mgr().Wiki_html_dir(domain_str)); + app.Css_installer().Install_assert(Bool_.Y, this, user.Fsys_mgr().Wiki_html_dir(domain_str)); if (html_mgr__hdump_enabled) { // if (db_mgr.Tid() == Xodb_mgr_txt.Tid_txt) this.Db_mgr_create_as_sql(); - this.Db_mgr_as_sql().Html_db_enabled_(html_mgr__hdump_enabled); - Xowd_db_init_wkr__html.I.Assert_col__page_html_db_id(Db_mgr_as_sql().Core_data_mgr()); // NOTE: must go above html_mgr.Init_by_wiki b/c Page_load will be done via messages + Xowd_html_tbl.Assert_col__page_html_db_id(Db_mgr_as_sql().Core_data_mgr()); // NOTE: must go above html_mgr.Init_by_wiki b/c Page_load will be done via messages + this.Db_mgr_as_sql().Core_data_mgr().Tbl__page().Hdump_enabled_(html_mgr__hdump_enabled); html_mgr__hdump_rdr.Init_by_db(this.Data_mgr__core_mgr()); - html_mgr__hdump_wtr.Init_by_db((Xowe_core_data_mgr)this.Data_mgr__core_mgr()); + html_mgr__hdump_wtr.Init_by_db(this.Data_mgr__core_mgr()); } html_mgr.Init_by_wiki(this); this.Copy_cfg(app.User().Wiki()); @@ -276,7 +285,6 @@ public class Xowe_wiki implements Xow_wiki, GfoInvkAble { else if (ctx.Match(k, Invk_msgs)) return msg_mgr; else if (ctx.Match(k, Invk_util)) return util; else if (ctx.Match(k, Invk_app)) return app; - else if (ctx.Match(k, Invk_data_storage_format_))db_mgr.Data_storage_format_(m.ReadByte("v")); else if (ctx.Match(k, Invk_db_mgr)) return db_mgr; else if (ctx.Match(k, Invk_db_mgr_to_sql_)) this.Db_mgr_create_as_sql(); else if (ctx.Match(k, Invk_import_mgr)) return import_mgr; @@ -293,10 +301,13 @@ public class Xowe_wiki implements Xow_wiki, GfoInvkAble { , Invk_special = "special" , Invk_props = "props", Invk_parser = "parser" , Invk_msgs = "msgs", Invk_app = "app", Invk_util = "util" - , Invk_xtns = "xtns", Invk_data_storage_format_ = "data_storage_format_", Invk_import_mgr = "import" - , Invk_db_mgr = "db_mgr", Invk_db_mgr_to_sql_ = "db_mgr_to_sql_" + , Invk_xtns = "xtns", Invk_import_mgr = "import" + , Invk_db_mgr_to_sql_ = "db_mgr_to_sql_" , Invk_domain = "domain", Invk_maint = "maint", Invk_hdump_enabled_ = "hdump_enabled_" ; + public static final String // SERIALIZED + Invk_db_mgr = "db_mgr" // SERIALIZED:000.sqlite3|xowa_cfg + ; public static final String Invk_lang_ = "lang_"; private static void File_repos_assert(Xoae_app app, Xowe_wiki wiki) { byte[] wiki_key = wiki.Domain_bry(); diff --git a/400_xowa/src_120_wiki/gplx/xowa/Xowe_wiki_bldr.java b/400_xowa/src_120_wiki/gplx/xowa/Xowe_wiki_bldr.java new file mode 100644 index 000000000..9b4fc700a --- /dev/null +++ b/400_xowa/src_120_wiki/gplx/xowa/Xowe_wiki_bldr.java @@ -0,0 +1,28 @@ +/* +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 . +*/ +package gplx.xowa; import gplx.*; +import gplx.xowa.apis.xowa.bldrs.imports.*; import gplx.xowa.wikis.data.*; import gplx.xowa.bldrs.infos.*; +public class Xowe_wiki_bldr { + public static void Create(Xowe_wiki wiki, long src_fil_len, String src_fil_name) { + wiki.Db_mgr_create_as_sql(); // create db_mgr as sql + Xoapi_import import_api = wiki.Appe().Api_root().Bldr().Wiki().Import(); + Xowd_core_db_props db_mgr_props = import_api.New_props(wiki.Domain_str(), src_fil_len); + Xob_info_session info_session = Xob_info_session.new_(import_api.User_name(), wiki.Domain_str(), src_fil_name); + wiki.Db_mgr_as_sql().Core_data_mgr().Init_by_make(db_mgr_props, info_session); // make core_db + } +} diff --git a/400_xowa/src_121_wiki_data/gplx/xowa/Xob_hive_mgr.java b/400_xowa/src_121_wiki_data/gplx/xowa/Xob_hive_mgr.java index 4644d4975..b0524335c 100644 --- a/400_xowa/src_121_wiki_data/gplx/xowa/Xob_hive_mgr.java +++ b/400_xowa/src_121_wiki_data/gplx/xowa/Xob_hive_mgr.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa; import gplx.*; +import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.specials.*; import gplx.xowa.specials.allPages.*; import gplx.xowa.tdbs.*; public class Xob_hive_mgr { public Xob_hive_mgr(Xowe_wiki wiki) {this.wiki = wiki; this.fsys_mgr = wiki.Tdb_fsys_mgr();} private Xowe_wiki wiki; Xotdb_fsys_mgr fsys_mgr; @@ -25,7 +26,7 @@ public class Xob_hive_mgr { int xdat_idx = Regy__find_file_ns(key, dir_tid, ns.Num_str()); Xob_xdat_file xdat_main = new Xob_xdat_file(); xdat_main = xdat_load_(xdat_main, dir_tid, ns, xdat_idx); - xdat_main.Find(xdat_itm, key, Xodb_page_.Txt_ttl_pos, Byte_ascii.Tab, false); + xdat_main.Find(xdat_itm, key, Xotdb_page_itm_.Txt_ttl_pos, Byte_ascii.Tab, false); int itm_idx = xdat_itm.Itm_idx(); Special_allpages_query_fwd(mgr, dir_tid, ns, include_redirects, count, xdat_idx, itm_idx , xdat_main); Special_allpages_query_bwd(mgr, dir_tid, ns, include_redirects, count, xdat_idx, itm_idx - 1, xdat_main); @@ -41,8 +42,8 @@ public class Xob_hive_mgr { boolean loop = true; int regy_len = regy.Files_ary().length; int rslt_list_len = mgr.Rslt_list_len(); - Xodb_page[] rslt_list_ttls = mgr.Rslt_list_ttls(); - Xodb_page nxt_itm = null; + Xowd_page_itm[] rslt_list_ttls = mgr.Rslt_list_ttls(); + Xowd_page_itm nxt_itm = null; while (loop) { if (fil_idx == regy_len) break; if (xdat_file == null) { @@ -52,7 +53,7 @@ public class Xob_hive_mgr { int rows_len = xdat_file.Count(); for (; row_idx < rows_len; row_idx++) { xdat_file.GetAt(xdat_itm, row_idx); - Xodb_page ttl_itm = Xodb_page_.Txt_ttl_load(Bry_.Mid(xdat_itm.Src(), xdat_itm.Itm_bgn(), xdat_itm.Itm_end())); + Xowd_page_itm ttl_itm = Xotdb_page_itm_.Txt_ttl_load(Bry_.Mid(xdat_itm.Src(), xdat_itm.Itm_bgn(), xdat_itm.Itm_end())); if (!include_redirects && ttl_itm.Redirected()) continue; ++count; nxt_itm = ttl_itm; @@ -76,7 +77,7 @@ public class Xob_hive_mgr { } int count = 0; boolean loop = true; - Xodb_page prv_itm = null; + Xowd_page_itm prv_itm = null; while (loop) { if (fil_idx == -1) break; if (xdat_file == null) { @@ -87,7 +88,7 @@ public class Xob_hive_mgr { row_idx = xdat_file.Count() - 1; for (; row_idx > -1; row_idx--) { xdat_file.GetAt(xdat_itm, row_idx); - Xodb_page ttl_itm = Xodb_page_.Txt_ttl_load(Bry_.Mid(xdat_itm.Src(), xdat_itm.Itm_bgn(), xdat_itm.Itm_end())); + Xowd_page_itm ttl_itm = Xotdb_page_itm_.Txt_ttl_load(Bry_.Mid(xdat_itm.Src(), xdat_itm.Itm_bgn(), xdat_itm.Itm_end())); if (!include_redirects && ttl_itm.Redirected()) continue; // list.Add(ttl_itm); ++count; @@ -112,7 +113,7 @@ public class Xob_hive_mgr { Io_url xdat_url = fsys_mgr.Url_ns_fil(dir_tid, ns.Id(), xdat_idx); byte[] xdat_bry = gplx.ios.Io_stream_rdr_.Load_all(xdat_url); xdat.Parse(xdat_bry, xdat_bry.length, xdat_url); - xdat.Find(xdat_itm, key, Xodb_page_.Txt_ttl_pos, Byte_ascii.Tab, false); + xdat.Find(xdat_itm, key, Xotdb_page_itm_.Txt_ttl_pos, Byte_ascii.Tab, false); Find_nearby_add_fwd(list, dir_tid, ns, include_redirects, count, xdat_idx, xdat_itm.Itm_idx()); } private Xob_xdat_itm xdat_itm = new Xob_xdat_itm(); //Int_2_ref find_nearby_rslt = new Int_2_ref(); // private void Find_nearby_add_bwd(ListAdp list, byte dir_tid, Xow_ns ns, boolean include_redirects, int total, int fil_bgn, int row_bgn) { @@ -133,7 +134,7 @@ public class Xob_hive_mgr { // first = false; // for (; row_idx > -1; row_idx--) { // xdat.GetAt(xdat_itm, row_idx); -// Xodb_page ttl_itm = Xodb_page_.Txt_ttl_load(Bry_.Mid(xdat_itm.Src(), xdat_itm.Itm_bgn(), xdat_itm.Itm_end())); +// Xowd_page_itm ttl_itm = Xotdb_page_itm_.Txt_ttl_load(Bry_.Mid(xdat_itm.Src(), xdat_itm.Itm_bgn(), xdat_itm.Itm_end())); // if (!include_redirects && ttl_itm.Type_redirect()) continue; // list.Add(ttl_itm); // if (++count == total) {loop = false; break;} @@ -157,7 +158,7 @@ public class Xob_hive_mgr { first = false; for (; row_idx < rows_len; row_idx++) { xdat.GetAt(xdat_itm, row_idx); - Xodb_page ttl_itm = Xodb_page_.Txt_ttl_load(Bry_.Mid(xdat_itm.Src(), xdat_itm.Itm_bgn(), xdat_itm.Itm_end())); + Xowd_page_itm ttl_itm = Xotdb_page_itm_.Txt_ttl_load(Bry_.Mid(xdat_itm.Src(), xdat_itm.Itm_bgn(), xdat_itm.Itm_end())); if (!include_redirects && ttl_itm.Redirected()) continue; list.Add(ttl_itm); if (++count == total) {loop = false; break;} diff --git a/400_xowa/src_121_wiki_data/gplx/xowa/Xodb_page.java b/400_xowa/src_121_wiki_data/gplx/xowa/Xodb_page.java deleted file mode 100644 index 9ce22eb28..000000000 --- a/400_xowa/src_121_wiki_data/gplx/xowa/Xodb_page.java +++ /dev/null @@ -1,126 +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 . -*/ -package gplx.xowa; import gplx.*; -import gplx.core.primitives.*; -public class Xodb_page implements Xobl_data_itm { - public Xodb_page() {this.Clear();} - public int Id() {return id;} public Xodb_page Id_(int v) {id = v; id_val = null; return this;} private int id; - public Int_obj_val Id_val() {if (id_val == null) id_val = Int_obj_val.new_(id); return id_val;} private Int_obj_val id_val; - public int Ns_id() {return ns_id;} public Xodb_page Ns_id_(int v) {ns_id = v; return this;} private int ns_id; - public byte[] Ttl_page_db() {return ttl_page_db;} public Xodb_page Ttl_page_db_(byte[] v) {ttl_page_db = v; return this;} private byte[] ttl_page_db; // EX: Category1 - public byte[] Ttl_full_db() {return ttl_full_db;} private byte[] ttl_full_db; // EX: Category:Category1 - public boolean Redirected() {return redirected;} public Xodb_page Redirected_(boolean v) {redirected = v; return this;} private boolean redirected; - public int Wtxt_len() {return wtxt_len;} public Xodb_page Wtxt_len_(int v) {wtxt_len = v; return this;} private int wtxt_len; - public int Wtxt_db_id() {return wtxt_db_id;} public Xodb_page Wtxt_db_id_(int v) {wtxt_db_id = v; return this;} private int wtxt_db_id; - public byte[] Wtxt() {return wtxt;} public Xodb_page Wtxt_(byte[] v) {wtxt = v; if (v != null) wtxt_len = v.length; return this;} private byte[] wtxt; - public int Html_db_id() {return html_db_id;} private int html_db_id; - public int Redirect_id() {return redirect_id;} private int redirect_id; - public DateAdp Modified_on() {return modified_on;} public Xodb_page Modified_on_(DateAdp v) {modified_on = v; return this;} private DateAdp modified_on; - public boolean Exists() {return exists;} public Xodb_page Exists_(boolean v) {exists = v; return this;} private boolean exists; - public Xow_ns Ns() {return ns;} private Xow_ns ns; - public Object Xtn() {return xtn;} public Xodb_page Xtn_(Object v) {this.xtn = v; return this;} private Object xtn; - public int Tdb_row_idx() {return tdb_row_idx;} public void Tdb_row_idx_(int v) {tdb_row_idx = v;} private int tdb_row_idx; - public Xodb_page Init(int id, byte[] ttl_page_db, boolean redirected, int wtxt_len, int wtxt_db_id, int tdb_row_idx) { - this.id = id; this.ttl_page_db = ttl_page_db; this.redirected = redirected; - this.wtxt_len = wtxt_len; this.wtxt_db_id = wtxt_db_id; this.tdb_row_idx = tdb_row_idx; - id_val = null; - return this; - } - public void Init_by_sql(int id, int ns_id, byte[] ttl_page_db, DateAdp modified_on, boolean redirected, int wtxt_len, int wtxt_db_id, int html_db_id, int redirect_id) { - this.id = id; - this.ns_id = ns_id; - this.ttl_page_db = ttl_page_db; - this.modified_on = modified_on; - this.redirected = redirected; - this.wtxt_len = wtxt_len; - this.wtxt_db_id = wtxt_db_id; - this.html_db_id = html_db_id; - this.redirect_id = redirect_id; - } - public void Init_by_tdb(int id, int wtxt_db_id, int tdb_row_idx, boolean redirected, int wtxt_len, int ns_id, byte[] ttl_page_db) { - this.id = id; - this.wtxt_db_id = wtxt_db_id; - this.tdb_row_idx = tdb_row_idx; - this.redirected = redirected; - this.wtxt_len = wtxt_len; - this.ns_id = ns_id; - this.ttl_page_db = ttl_page_db; - } - public Xodb_page Ttl_(Xow_ns ns, byte[] ttl_page_db) { - this.ns = ns; - ns_id = ns.Id(); - this.ttl_page_db = ttl_page_db; - this.ttl_full_db = ns.Gen_ttl(ttl_page_db); - return this; - } - public Xodb_page Ttl_(Xoa_ttl ttl) { - ttl_full_db = ttl.Full_txt(); - ttl_page_db = ttl.Page_db(); - ns = ttl.Ns(); - ns_id = ns.Id(); - return this; - } - public Xodb_page Ttl_(byte[] v, Xow_ns_mgr ns_mgr) { - ttl_full_db = v; - Object o = ns_mgr.Names_get_w_colon(v, 0, v.length); - if (o == null) { - ns = ns_mgr.Ns_main(); - ttl_page_db = v; - } - else { - ns = (Xow_ns)o; - ttl_page_db = Bry_.Mid(v, ns.Name_txt_w_colon().length, v.length); // EX: "Template:A" -> "Template:" + "A" - } - ns_id = ns.Id(); - return this; - } - public void Clear() { - id = Id_null; wtxt_len = 0; // wtxt_len should be 0 b/c wtxt defaults to 0; - wtxt_db_id = tdb_row_idx = 0; // default to 0, b/c some tests do not set and will fail at -1 - ns_id = Int_.MinValue; - ttl_full_db = ttl_page_db = null; wtxt = Bry_.Empty; // default to Ary_empty for entries that have - ns = null; - redirected = exists = false; - modified_on = DateAdp_.MinValue; - id_val = null; - html_db_id = -1; - redirect_id = -1; - } - public void Copy(Xodb_page orig) { - this.id = orig.id; - this.wtxt_len = orig.wtxt_len; - this.wtxt_db_id = orig.wtxt_db_id; - this.tdb_row_idx = orig.tdb_row_idx; - this.ns_id = orig.ns_id; - this.ttl_full_db = orig.ttl_full_db; - this.ttl_page_db = orig.ttl_page_db; - this.wtxt = orig.wtxt; - this.ns = orig.ns; - this.redirected = orig.redirected; - this.exists = orig.exists; - this.modified_on = orig.modified_on; - this.id_val = null; - this.html_db_id = orig.html_db_id; - } - public void Srl_save(Bry_bfr bfr) {Xodb_page_.Txt_id_save(bfr, this);} - public static final int Id_null = -1, Modified_on_null_int = 0; - public static final Xodb_page[] Ary_empty = new Xodb_page[0]; - public static final Xodb_page Null = null; - public static Xodb_page new_tmp() {return new Xodb_page();} - public static Xodb_page new_srch(int id, int wtxt_len) {return new Xodb_page().Id_(id).Wtxt_len_(wtxt_len);} -} diff --git a/400_xowa/src_121_wiki_data/gplx/xowa/Xow_data_mgr.java b/400_xowa/src_121_wiki_data/gplx/xowa/Xow_data_mgr.java index 23f71026b..23cdf2156 100644 --- a/400_xowa/src_121_wiki_data/gplx/xowa/Xow_data_mgr.java +++ b/400_xowa/src_121_wiki_data/gplx/xowa/Xow_data_mgr.java @@ -16,8 +16,9 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa; import gplx.*; -import gplx.lists.*; /*ComparerAble*/ import gplx.xowa.bldrs.imports.ctgs.*; +import gplx.lists.*; /*ComparerAble*/ import gplx.xowa.bldrs.cmds.ctgs.*; import gplx.xowa.dbs.*; import gplx.xowa.wikis.*; import gplx.xowa.langs.msgs.*; +import gplx.xowa.wikis.data.tbls.*; public class Xow_data_mgr implements GfoInvkAble { private Xop_redirect_mgr redirect_mgr; private Xoa_url tmp_url = Xoa_url.blank_(); @@ -52,14 +53,14 @@ public class Xow_data_mgr implements GfoInvkAble { } public Xoae_page Get_page(Xoae_page rv, Xow_ns ns, Xoa_ttl ttl, boolean called_from_tmpl, boolean redirect_force) { int redirects = 0; - Xodb_page db_page = Xodb_page.new_tmp(); + Xowd_page_itm db_page = Xowd_page_itm.new_tmp(); while (true) { boolean exists = wiki.Db_mgr().Load_mgr().Load_by_ttl(db_page, ns, ttl.Page_db()); if (!exists) return rv.Missing_(); if (wiki.Appe().Mode() == Xoa_app_.Mode_gui) // NOTE: must check if gui, else will write during mass build; DATE:2014-05-03 wiki.Appe().Usr_dlg().Prog_many(GRP_KEY, "file_load", "loading page for ~{0}", String_.new_utf8_(ttl.Raw())); wiki.Db_mgr().Load_mgr().Load_page(db_page, ns, !called_from_tmpl); - byte[] bry = db_page.Wtxt(); + byte[] bry = db_page.Text(); rv.Data_raw_(bry).Revision_data().Modified_on_(db_page.Modified_on()).Id_(db_page.Id()).Html_db_id_(db_page.Html_db_id()); if (redirect_force) return rv; Xoa_ttl redirect_ttl = redirect_mgr.Extract_redirect(bry, bry.length); diff --git a/400_xowa/src_121_wiki_data/gplx/xowa/Xow_hive_mgr_fxt.java b/400_xowa/src_121_wiki_data/gplx/xowa/Xow_hive_mgr_fxt.java index 8e81db31f..01aa4f32b 100644 --- a/400_xowa/src_121_wiki_data/gplx/xowa/Xow_hive_mgr_fxt.java +++ b/400_xowa/src_121_wiki_data/gplx/xowa/Xow_hive_mgr_fxt.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa; import gplx.*; -import gplx.xowa.tdbs.*; +import gplx.xowa.tdbs.*; import gplx.xowa.wikis.data.tbls.*; public class Xow_hive_mgr_fxt { public void Clear() { if (hive_mgr == null) { @@ -34,7 +34,7 @@ public class Xow_hive_mgr_fxt { int actl_len = list.Count(); String[] actl = new String[actl_len]; for (int i = 0; i < actl_len; i++) { - Xodb_page itm = (Xodb_page)list.FetchAt(i); + Xowd_page_itm itm = (Xowd_page_itm)list.FetchAt(i); actl[i] = String_.new_ascii_(itm.Ttl_page_db()); } Tfds.Eq_ary_str(expd, actl); @@ -54,7 +54,7 @@ public class Xow_hive_mgr_fxt { byte[] ttl_bry = tmp_bfr.Xto_bry_and_clear(); if (ttl_idx == 0) ttl_0 = ttl_bry; else if (ttl_idx == ttls_per_file - 1) ttl_n = ttl_bry; - Xodb_page_.Txt_ttl_save(xdat_wtr.Bfr(), id++, 0, ttl_idx, ttl_idx % 2 == 1, 1, ttl_bry); + Xotdb_page_itm_.Txt_ttl_save(xdat_wtr.Bfr(), id++, 0, ttl_idx, ttl_idx % 2 == 1, 1, ttl_bry); xdat_wtr.Add_idx(Byte_ascii.Nil); } xdat_wtr.Flush(wiki.Appe().Usr_dlg()); @@ -72,7 +72,7 @@ public class Xow_hive_mgr_fxt { for (int i = 0; i < pages_len; i++) bfr.Add_byte_pipe().Add_base85_len_5(pages[i]); bfr.Add_byte_nl(); - byte[] row = bfr.Mkr_rls().Xto_bry_and_clear(); + byte[] row = bfr.To_bry_and_rls(); hive_mgr.Create(Xotdb_dir_info_.Tid_category, key_bry, row); } public Xow_hive_mgr_fxt Create_id(int id, int fil_idx, int row_idx, boolean type_redirect, int itm_len, int ns_id, String ttl) {Create_id(app, hive_mgr, id, fil_idx, row_idx, type_redirect, itm_len, ns_id, ttl); return this;} diff --git a/400_xowa/src_121_wiki_data/gplx/xowa/Xowd_hive_mgr_tst.java b/400_xowa/src_121_wiki_data/gplx/xowa/Xowd_hive_mgr_tst.java index 432b0905f..b5655f0a5 100644 --- a/400_xowa/src_121_wiki_data/gplx/xowa/Xowd_hive_mgr_tst.java +++ b/400_xowa/src_121_wiki_data/gplx/xowa/Xowd_hive_mgr_tst.java @@ -92,7 +92,7 @@ class Xowd_hive_mgr_fxt { } // public void Get(String ttl_str, boolean exists) { // Xoa_ttl ttl = Xoa_ttl.parse_(wiki, Bry_.new_utf8_(ttl_str)); -// Xodb_page row = mgr.Get(ttl.Ns(), ttl.Full_txt()); +// Xowd_page_itm row = mgr.Get(ttl.Ns(), ttl.Full_txt()); // Tfds.Eq(exists, row != null); // } } diff --git a/400_xowa/src_160_file/gplx/xowa/Xof_file_mgr.java b/400_xowa/src_160_file/gplx/xowa/Xof_file_mgr.java index 03dec1f3c..a6fa1cc00 100644 --- a/400_xowa/src_160_file/gplx/xowa/Xof_file_mgr.java +++ b/400_xowa/src_160_file/gplx/xowa/Xof_file_mgr.java @@ -35,7 +35,7 @@ public class Xof_file_mgr implements GfoInvkAble { } public void Init_by_app(Xoae_app app) { Io_url db_url = app.User().Fsys_mgr().Root_dir().OwnerDir().GenSubFil_ary("xowa.user.", app.User().Key_str(), ".sqlite3"); - Db_conn_bldr_data conn_data = Db_conn_bldr.I.Get_or_new("xowa.user_db", db_url); + Db_conn_bldr_data conn_data = Db_conn_bldr.I.Get_or_new(db_url); boolean schema_is_1 = Bool_.Y; cache_mgr.Init_for_db(conn_data.Conn(), conn_data.Created(), schema_is_1); } diff --git a/400_xowa/src_160_file/gplx/xowa/Xofw_wiki_wkr_base.java b/400_xowa/src_160_file/gplx/xowa/Xofw_wiki_wkr_base.java index 8f1f10c16..0cac8455a 100644 --- a/400_xowa/src_160_file/gplx/xowa/Xofw_wiki_wkr_base.java +++ b/400_xowa/src_160_file/gplx/xowa/Xofw_wiki_wkr_base.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa; import gplx.*; -import gplx.xowa.wikis.*; import gplx.xowa.files.*; import gplx.xowa.files.repos.*; +import gplx.xowa.wikis.*; import gplx.xowa.files.*; import gplx.xowa.files.repos.*; import gplx.xowa.wikis.data.tbls.*; public class Xofw_wiki_wkr_base implements Xofw_wiki_finder { public Xofw_wiki_wkr_base(Xowe_wiki wiki, Xoa_wiki_mgr wiki_mgr) {this.wiki = wiki; this.wiki_mgr = wiki_mgr;} private Xowe_wiki wiki; Xoa_wiki_mgr wiki_mgr; public void Find(ListAdp repo_pairs, Xof_xfer_itm file) { @@ -57,11 +57,11 @@ public class Xofw_wiki_wkr_base implements Xofw_wiki_finder { return true; } return false; - } static final Xodb_page tmp_db_page = Xodb_page.new_tmp(); - byte[] Get_redirect(Xowe_wiki wiki, Xow_ns file_ns, Xodb_page db_page) { + } static final Xowd_page_itm tmp_db_page = Xowd_page_itm.new_tmp(); + byte[] Get_redirect(Xowe_wiki wiki, Xow_ns file_ns, Xowd_page_itm db_page) { if (db_page.Redirected()) { wiki.Db_mgr().Load_mgr().Load_page(db_page, file_ns, false); - byte[] src = db_page.Wtxt(); + byte[] src = db_page.Text(); Xoa_ttl redirect_ttl = wiki.Redirect_mgr().Extract_redirect(src, src.length); return redirect_ttl == Xop_redirect_mgr.Redirect_null_ttl ? Xop_redirect_mgr.Redirect_null_bry : redirect_ttl.Page_db(); } diff --git a/400_xowa/src_162_xfer/gplx/xowa/Xof_xfer_mgr.java b/400_xowa/src_162_xfer/gplx/xowa/Xof_xfer_mgr.java index c07054e9e..134cdc0cd 100644 --- a/400_xowa/src_162_xfer/gplx/xowa/Xof_xfer_mgr.java +++ b/400_xowa/src_162_xfer/gplx/xowa/Xof_xfer_mgr.java @@ -61,7 +61,7 @@ public class Xof_xfer_mgr { // BLOCK: thumb if (lnki_thumbable) { // lnki is thumb with known width >>> try to do thumb if (lnki_w < 1 && lnki_h < 1) { // NOTE: only give default thumb if both w and h are < 1; if h > 0, then skip; EX:Paris;[[File:IMA-Ile-St-Louis.jpg|thumb|x220]] - wiki.File_mgr().Fsdb_mgr().Init_by_wiki(wiki); + wiki.File_mgr().Init_file_mgr_by_load(wiki); lnki_w = Xof_img_size.Upright_calc(wiki.File_mgr().Patch_upright(), lnki_upright, lnki_w, lnki_w, lnki_h, lnki_type); if (lnki_w < 1) lnki_w = wiki.Html_mgr().Img_thumb_width(); // NOTE: used to be src_repo.Thumb_w() diff --git a/400_xowa/src_162_xfer/gplx/xowa/Xof_xfer_queue.java b/400_xowa/src_162_xfer/gplx/xowa/Xof_xfer_queue.java index dc3be7b69..b86a2455d 100644 --- a/400_xowa/src_162_xfer/gplx/xowa/Xof_xfer_queue.java +++ b/400_xowa/src_162_xfer/gplx/xowa/Xof_xfer_queue.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa; import gplx.*; import gplx.core.primitives.*; -import gplx.xowa.files.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.files.bins.*; +import gplx.xowa.files.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.files.bins.*; import gplx.xowa.files.origs.*; import gplx.xowa.files.gui.*; public class Xof_xfer_queue { private final ListAdp xfer_list = ListAdp_.new_(); private final OrderedHash dirty_meta_mgrs = OrderedHash_.new_bry_(); @@ -62,10 +62,10 @@ public class Xof_xfer_queue { this.Clear(); } private void Exec_v2(byte exec_tid, Gfo_usr_dlg wtr, Xowe_wiki wiki, Xoae_page page) { - wiki.File_mgr().Fsdb_mgr().Init_by_wiki(wiki); - wiki.File_mgr().Fsdb_mgr().Fsdb_search_by_list(exec_tid, Xfer_itms_to_fsdb_itms(xfer_list, wiki.File_mgr().Patch_upright()), page, page.Tab().Html_itm()); + wiki.File_mgr().Init_file_mgr_by_load(wiki); + wiki.File_mgr().Fsdb_mgr().Fsdb_search_by_list(exec_tid, Xfer_itms_to_fsdb_itms(wiki, xfer_list, wiki.File_mgr().Patch_upright()), page, page.Tab().Html_itm()); } - private ListAdp Xfer_itms_to_fsdb_itms(ListAdp xfer_list, int upright_patch) { + private ListAdp Xfer_itms_to_fsdb_itms(Xowe_wiki wiki, ListAdp xfer_list, int upright_patch) { ListAdp rv = ListAdp_.new_(); int list_len = xfer_list.Count(); for (int i = 0; i < list_len; i++) { @@ -75,6 +75,11 @@ public class Xof_xfer_queue { fsdb.Lnki_ext_(xfer.Lnki_ext()); if (xfer.Orig_ext() > 0) fsdb.Ctor_by_orig(xfer.Orig_repo_id(), xfer.Orig_repo_name(), xfer.Orig_ttl(), xfer.Orig_ext(), xfer.Orig_w(), xfer.Orig_h(), xfer.Orig_redirect()); + else { // NOTE: orig_ext doesn't exist; try to get again, b/c Xof_file_wkr won't get it; DATE:2015-04-05 + Xof_orig_itm orig = wiki.File_mgr().Orig_mgr().Find_by_ttl_or_null(xfer.Lnki_ttl()); + gplx.xowa.files.repos.Xof_repo_pair repo_pair = wiki.File_mgr__repo_mgr().Repos_get_by_id(orig.Repo()); + fsdb.Ctor_by_orig(orig.Repo(), repo_pair.Trg().Wiki_key(), orig.Page(), orig.Ext(), orig.W(), orig.H(), orig.Redirect()); + } fsdb.Html_uid_(xfer.Html_uid()); fsdb.Html_elem_tid_(xfer.Html_elem_tid()); fsdb.Gallery_mgr_h_(xfer.Gallery_mgr_h()); diff --git a/400_xowa/src_200_bldr/gplx/xowa/Xob_bldr.java b/400_xowa/src_200_bldr/gplx/xowa/Xob_bldr.java index 9a2747cfa..fd020f2c8 100644 --- a/400_xowa/src_200_bldr/gplx/xowa/Xob_bldr.java +++ b/400_xowa/src_200_bldr/gplx/xowa/Xob_bldr.java @@ -16,30 +16,31 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa; import gplx.*; -import gplx.xowa.bldrs.*; import gplx.xowa.apps.*; import gplx.xowa.bldrs.xmls.*; -import gplx.xowa.bldrs.cfgs.*; import gplx.xowa.bldrs.langs.*; +import gplx.xowa.apps.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.xmls.*; import gplx.xowa.bldrs.cfgs.*; import gplx.xowa.bldrs.langs.*; public class Xob_bldr implements GfoInvkAble { - private boolean pause_at_end = false; + private boolean pause_at_end = false; private long prv_prog_time; private Xob_xml_parser dump_parser; public Xob_bldr(Xoae_app app) { this.app = app; - cmd_mgr = new Xob_cmd_mgr(this); - wiki_cfg_bldr = new Xob_wiki_cfg_bldr(this); + this.cmd_mgr = new Xob_cmd_mgr(this); + this.import_marker = new Xob_import_marker(); + this.wiki_cfg_bldr = new Xob_wiki_cfg_bldr(this); } - public Xoae_app App() {return app;} private Xoae_app app; + public Xoae_app App() {return app;} private final Xoae_app app; + public Xob_cmd_mgr Cmd_mgr() {return cmd_mgr;} private final Xob_cmd_mgr cmd_mgr; public Gfo_usr_dlg Usr_dlg() {return app.Usr_dlg();} - public Xob_cmd_mgr Cmd_mgr() {return cmd_mgr;} private Xob_cmd_mgr cmd_mgr; public int Sort_mem_len() {return sort_mem_len;} public Xob_bldr Sort_mem_len_(int v) {sort_mem_len = v; return this;} private int sort_mem_len = 16 * Io_mgr.Len_mb; public int Dump_fil_len() {return dump_fil_len;} public Xob_bldr Dump_fil_len_(int v) {dump_fil_len = v; return this;} private int dump_fil_len = 1 * Io_mgr.Len_mb; public int Make_fil_len() {return make_fil_len;} public Xob_bldr Make_fil_len_(int v) {make_fil_len = v; return this;} private int make_fil_len = 64 * Io_mgr.Len_kb; - public Xob_xml_parser Parser() {if (parser == null) parser = new Xob_xml_parser(); return parser;} private Xob_xml_parser parser; + public Xob_xml_parser Dump_parser() {if (dump_parser == null) this.dump_parser = new Xob_xml_parser(); return dump_parser;} + public Xob_import_marker Import_marker() {return import_marker;} private Xob_import_marker import_marker; public Xob_wiki_cfg_bldr Wiki_cfg_bldr() {return wiki_cfg_bldr;} private Xob_wiki_cfg_bldr wiki_cfg_bldr; - public void StatusMgr_prog_fmt(long cur, long end, int pct_idx, String fmt, Object... ary) { - long now = Env_.TickCount(); if (now - StatusMgr_prog_prv < 100) return; - StatusMgr_prog_prv = now; + public void Pause_at_end_(boolean v) {this.pause_at_end = v;} + public void Print_prog_msg(long cur, long end, int pct_idx, String fmt, Object... ary) { + long now = Env_.TickCount(); if (now - prv_prog_time < 100) return; + this.prv_prog_time = now; if (pct_idx > -1) ary[pct_idx] = DecimalAdp_.CalcPctStr(cur, end, "00.00"); - app.Usr_dlg().Prog_many(GRP_KEY, "prog", fmt, ary); - } long StatusMgr_prog_prv; - public void Pause_at_end_(boolean v) {pause_at_end = v;} + app.Usr_dlg().Prog_many("", "", fmt, ary); + } public void Run() { try { app.Launch(); // HACK: bldr will be called by a gfs file which embeds "bldr.run" inside it; need to call Launch though before Run; DATE:2013-03-23 @@ -47,28 +48,28 @@ public class Xob_bldr implements GfoInvkAble { int cmd_mgr_len = cmd_mgr.Len(); for (int i = 0; i < cmd_mgr_len; i++) { Xob_cmd cmd = cmd_mgr.Get_at(i); - cmd.Cmd_ini(this); + cmd.Cmd_init(this); } - cmd_mgr_len = cmd_mgr.Len(); // NOTE: refresh len b/c other cmds may have other added + cmd_mgr_len = cmd_mgr.Len(); // NOTE: refresh len b/c other cmds may have added new ones in Cmd_init for (int i = 0; i < cmd_mgr_len; i++) { Xob_cmd cmd = cmd_mgr.Get_at(i); - app.Usr_dlg().Note_many(GRP_KEY, "cmd_bgn", "cmd bgn: ~{0}", cmd.Cmd_key()); + app.Usr_dlg().Note_many("", "", "cmd bgn: ~{0}", cmd.Cmd_key()); long time_cur = Env_.TickCount(); cmd.Cmd_bgn(this); cmd.Cmd_run(); cmd.Cmd_end(); Env_.GarbageCollect(); - app.Usr_dlg().Note_many(GRP_KEY, "cmd_end", "cmd end: ~{0} ~{1}", cmd.Cmd_key(), TimeSpanAdp_.from_(time_cur).XtoStrUiAbbrv()); + app.Usr_dlg().Note_many("", "", "cmd end: ~{0} ~{1}", cmd.Cmd_key(), TimeSpanAdp_.from_(time_cur).XtoStrUiAbbrv()); } - for (int i = 0; i < cmd_mgr_len; i++) - cmd_mgr.Get_at(i).Cmd_print(); - app.Usr_dlg().Note_many(GRP_KEY, "bldr_done", "bldr done: ~{0}", TimeSpanAdp_.from_(time_bgn).XtoStrUiAbbrv()); + for (int i = 0; i < cmd_mgr_len; i++) { + Xob_cmd cmd = cmd_mgr.Get_at(i); + cmd.Cmd_term(); + } + app.Usr_dlg().Note_many("", "", "bldr done: ~{0}", TimeSpanAdp_.from_(time_bgn).XtoStrUiAbbrv()); cmd_mgr.Clear(); if (pause_at_end && !Env_.Mode_testing()) {ConsoleAdp._.ReadLine("press enter to continue");} } - catch (Exception e) { - throw Err_.err_(e, "error during build: ~{0}", Err_.Message_gplx(e)); - } + catch (Exception e) {throw Err_.err_(e, "error during build: ~{0}", Err_.Message_gplx(e));} } private void Cancel() { int cmd_mgr_len = cmd_mgr.Len(); @@ -94,7 +95,6 @@ public class Xob_bldr implements GfoInvkAble { , Invk_pause_at_end_ = "pause_at_end_", Invk_sort_mem_len_ = "sort_mem_len_", Invk_dump_fil_len_ = "dump_fil_len_", Invk_make_fil_len_ = "make_fil_len_" , Invk_run = "run", Invk_cancel = "cancel" ; - static final String GRP_KEY = "xowa.bldr"; } /* . make_fil_len: max size of made file; EX: /id/..../0000000001.csv will have max len of 64 KB diff --git a/400_xowa/src_200_bldr/gplx/xowa/Xob_page_cmd.java b/400_xowa/src_200_bldr/gplx/xowa/Xob_page_cmd.java index 686bf04d7..0d9b79c27 100644 --- a/400_xowa/src_200_bldr/gplx/xowa/Xob_page_cmd.java +++ b/400_xowa/src_200_bldr/gplx/xowa/Xob_page_cmd.java @@ -16,9 +16,10 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa; import gplx.*; -interface Xodb_page_cmd { +import gplx.xowa.wikis.data.tbls.*; +interface Xowd_page_cmd { String Cmd_key(); void Cmd_bgn(Xob_bldr bldr); - void Cmd_run(Xodb_page page); + void Cmd_run(Xowd_page_itm page); void Cmd_end(); } diff --git a/400_xowa/src_200_bldr/gplx/xowa/Xob_stat_mgr.java b/400_xowa/src_200_bldr/gplx/xowa/Xob_stat_mgr.java index d288e33d1..1b07566fd 100644 --- a/400_xowa/src_200_bldr/gplx/xowa/Xob_stat_mgr.java +++ b/400_xowa/src_200_bldr/gplx/xowa/Xob_stat_mgr.java @@ -38,7 +38,7 @@ public class Xob_stat_mgr { for (int i = 0; i < regy.Count(); i++) { Xob_stat_type typ = (Xob_stat_type)regy.FetchAt(i); Xob_stat_itm itm = (Xob_stat_itm)typ.GetOrNew(ns); - sb.Add(Int_.Xto_str_pad_bgn(itm.Fils, 5)).Add(" "); + sb.Add(Int_.Xto_str_pad_bgn_zero(itm.Fils, 5)).Add(" "); } sb.Add_str_w_crlf(ns); } diff --git a/400_xowa/src_200_bldr/gplx/xowa/Xob_xdat_file_wtr.java b/400_xowa/src_200_bldr/gplx/xowa/Xob_xdat_file_wtr.java index 13409fe28..0b928c8f3 100644 --- a/400_xowa/src_200_bldr/gplx/xowa/Xob_xdat_file_wtr.java +++ b/400_xowa/src_200_bldr/gplx/xowa/Xob_xdat_file_wtr.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa; import gplx.*; import gplx.ios.*; import gplx.xowa.tdbs.*; public class Xob_xdat_file_wtr { - public static Xob_xdat_file_wtr new_file_(int fil_max, Io_url root_dir) {return new Xob_xdat_file_wtr(fil_max, root_dir, Io_stream_.Tid_file);} + public static Xob_xdat_file_wtr new_file_(int fil_max, Io_url root_dir) {return new Xob_xdat_file_wtr(fil_max, root_dir, Io_stream_.Tid_raw);} public static Xob_xdat_file_wtr new_by_tid_(int fil_max, Io_url root_dir, byte dir_tid, byte tid) {return new Xob_xdat_file_wtr(fil_max, root_dir.GenSubDir(Xotdb_dir_info_.Tid_name(dir_tid) + Xotdb_dir_info.Wtr_dir(tid)), tid);} Xob_xdat_file_wtr(int fil_max, Io_url root_dir, byte wtr_tid) { this.fil_max = fil_max; diff --git a/400_xowa/src_200_bldr/gplx/xowa/Xobd_parser.java b/400_xowa/src_200_bldr/gplx/xowa/Xobd_parser.java index ddc9a3bfb..f02e02201 100644 --- a/400_xowa/src_200_bldr/gplx/xowa/Xobd_parser.java +++ b/400_xowa/src_200_bldr/gplx/xowa/Xobd_parser.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa; import gplx.*; -import gplx.core.btries.*; +import gplx.core.btries.*; import gplx.xowa.wikis.data.tbls.*; public class Xobd_parser implements Xobd_wkr { private Btrie_slim_mgr trie = Btrie_slim_mgr.ci_ascii_(); // NOTE:ci.ascii:MW_const.en; ctg.v1 assumes [[Category: private ListAdp wkr_list = ListAdp_.new_(); @@ -35,8 +35,8 @@ public class Xobd_parser implements Xobd_wkr { } } } - public void Wkr_run(Xodb_page page) { - byte[] src = page.Wtxt(); int src_len = src.length; + public void Wkr_run(Xowd_page_itm page) { + byte[] src = page.Text(); int src_len = src.length; int pos = 0; while (true) { if (pos == src_len) break; diff --git a/400_xowa/src_200_bldr/gplx/xowa/Xobd_parser_wkr.java b/400_xowa/src_200_bldr/gplx/xowa/Xobd_parser_wkr.java index 5f874ca58..ca20461bc 100644 --- a/400_xowa/src_200_bldr/gplx/xowa/Xobd_parser_wkr.java +++ b/400_xowa/src_200_bldr/gplx/xowa/Xobd_parser_wkr.java @@ -16,9 +16,10 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa; import gplx.*; +import gplx.xowa.wikis.data.tbls.*; public interface Xobd_parser_wkr extends GfoInvkAble { OrderedHash Wkr_hooks(); void Wkr_bgn(Xob_bldr bldr); - int Wkr_run(Xodb_page page, byte[] src, int src_len, int bgn, int end); + int Wkr_run(Xowd_page_itm page, byte[] src, int src_len, int bgn, int end); void Wkr_end(); } diff --git a/400_xowa/src_200_bldr/gplx/xowa/Xobd_rdr.java b/400_xowa/src_200_bldr/gplx/xowa/Xobd_rdr.java index 80a4af3b2..75919a2f5 100644 --- a/400_xowa/src_200_bldr/gplx/xowa/Xobd_rdr.java +++ b/400_xowa/src_200_bldr/gplx/xowa/Xobd_rdr.java @@ -16,11 +16,12 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa; import gplx.*; -import gplx.ios.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.xmls.*; +import gplx.ios.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.xmls.*; import gplx.xowa.wikis.data.tbls.*; public class Xobd_rdr implements Xob_cmd { - public Xobd_rdr(Xob_bldr bldr, Xowe_wiki wiki) {this.bldr = bldr; this.wiki = wiki;} private Xob_bldr bldr; Xowe_wiki wiki; + private Xob_bldr bldr; private Xowe_wiki wiki; + public Xobd_rdr(Xob_bldr bldr, Xowe_wiki wiki) {this.bldr = bldr; this.wiki = wiki;} public String Cmd_key() {return KEY;} public static final String KEY = "dump_mgr"; - public void Cmd_ini(Xob_bldr bldr) { + public void Cmd_init(Xob_bldr bldr) { Xobd_wkr[] wkr_ary = (Xobd_wkr[])wkrs.Xto_ary(Xobd_wkr.class); int wkr_ary_len = wkr_ary.length; for (int i = 0; i < wkr_ary_len; i++) wkr_ary[i].Wkr_ini(bldr); @@ -31,8 +32,8 @@ public class Xobd_rdr implements Xob_cmd { Xobd_wkr[] wkr_ary = (Xobd_wkr[])wkrs.Xto_ary(Xobd_wkr.class); int wkr_ary_len = wkr_ary.length; for (int i = 0; i < wkr_ary_len; i++) wkr_ary[i].Wkr_bgn(bldr); - Io_buffer_rdr fil = Io_buffer_rdr.Null; Xodb_page page = new Xodb_page(); Xow_ns_mgr ns_mgr = wiki.Ns_mgr(); - Xob_xml_parser parser = bldr.Parser().Data_bfr_len_(Io_mgr.Len_mb); + Io_buffer_rdr fil = Io_buffer_rdr.Null; Xowd_page_itm page = new Xowd_page_itm(); Xow_ns_mgr ns_mgr = wiki.Ns_mgr(); + Xob_xml_parser parser = bldr.Dump_parser().Data_bfr_len_(Io_mgr.Len_mb); long fil_len = 0; Gfo_usr_dlg usr_dlg = bldr.App().Usr_dlg(); try { @@ -45,7 +46,7 @@ public class Xobd_rdr implements Xob_cmd { while (true) { int cur_pos = parser.Parse_page(page, usr_dlg, fil, fil.Bfr(), prv_pos, ns_mgr); if (cur_pos == Bry_.NotFound) break; if (cur_pos < prv_pos) - bldr.StatusMgr_prog_fmt(fil.Fil_pos(), fil_len, 1, optRdrFillFmt, Int_.Xto_str_pad_bgn((int)(fil.Fil_pos() / Io_mgr.Len_mb), Int_.DigitCount((int)(fil.Fil_len() / Io_mgr.Len_mb))), "", String_.new_utf8_(page.Ttl_full_db())); + bldr.Print_prog_msg(fil.Fil_pos(), fil_len, 1, optRdrFillFmt, Int_.Xto_str_pad_bgn_zero((int)(fil.Fil_pos() / Io_mgr.Len_mb), Int_.DigitCount((int)(fil.Fil_len() / Io_mgr.Len_mb))), "", String_.new_utf8_(page.Ttl_full_db())); prv_pos = cur_pos; try { for (int i = 0; i < wkr_ary_len; i++) @@ -72,7 +73,7 @@ public class Xobd_rdr implements Xob_cmd { for (int i = 0; i < wkr_ary_len; i++) wkr_ary[i].Wkr_end(); } - public void Cmd_print() { + public void Cmd_term() { Xobd_wkr[] wkr_ary = (Xobd_wkr[])wkrs.Xto_ary(Xobd_wkr.class); int wkr_ary_len = wkr_ary.length; for (int i = 0; i < wkr_ary_len; i++) wkr_ary[i].Wkr_print(); diff --git a/400_xowa/src_200_bldr/gplx/xowa/Xobd_wkr.java b/400_xowa/src_200_bldr/gplx/xowa/Xobd_wkr.java index 9be980275..e78e65c8c 100644 --- a/400_xowa/src_200_bldr/gplx/xowa/Xobd_wkr.java +++ b/400_xowa/src_200_bldr/gplx/xowa/Xobd_wkr.java @@ -16,11 +16,12 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa; import gplx.*; +import gplx.xowa.wikis.data.tbls.*; public interface Xobd_wkr extends GfoInvkAble { String Wkr_key(); void Wkr_ini(Xob_bldr bldr); void Wkr_bgn(Xob_bldr bldr); - void Wkr_run(Xodb_page page); + void Wkr_run(Xowd_page_itm page); void Wkr_end(); void Wkr_print(); } diff --git a/400_xowa/src_210_bldr_core/gplx/xowa/Xob_idx_base.java b/400_xowa/src_210_bldr_core/gplx/xowa/Xob_idx_base.java index b3dc2bccb..ad7f90e86 100644 --- a/400_xowa/src_210_bldr_core/gplx/xowa/Xob_idx_base.java +++ b/400_xowa/src_210_bldr_core/gplx/xowa/Xob_idx_base.java @@ -22,7 +22,7 @@ public abstract class Xob_idx_base extends Xob_itm_basic_base implements Xob_cmd public Gfo_fld_wtr Fld_wtr() {return fld_wtr;} Gfo_fld_wtr fld_wtr = Gfo_fld_wtr.xowa_(); public Gfo_fld_rdr Fld_rdr() {return fld_rdr;} Gfo_fld_rdr fld_rdr = Gfo_fld_rdr.xowa_(); public Io_url Temp_dir() {return temp_dir;} Io_url temp_dir; - public void Cmd_ini(Xob_bldr bldr) {} + public void Cmd_init(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) { temp_dir = wiki.Fsys_mgr().Tmp_dir().GenSubDir(this.Cmd_key()); Io_mgr._.DeleteDirDeep(temp_dir); @@ -31,7 +31,7 @@ public abstract class Xob_idx_base extends Xob_itm_basic_base implements Xob_cmd public abstract void Cmd_bgn_hook(); public abstract void Cmd_run(); @gplx.Virtual public void Cmd_end() {} - public void Cmd_print() {} + public void Cmd_term() {} public Io_line_rdr rdr_(Io_url dir) { Io_url[] fils = Io_mgr._.QueryDir_fils(dir); return new Io_line_rdr(bldr.Usr_dlg(), fils).Key_gen_(Io_line_rdr_key_gen_.first_pipe); diff --git a/400_xowa/src_210_bldr_core/gplx/xowa/Xob_sql_dump_base.java b/400_xowa/src_210_bldr_core/gplx/xowa/Xob_sql_dump_base.java index a9b93e01c..27fea9969 100644 --- a/400_xowa/src_210_bldr_core/gplx/xowa/Xob_sql_dump_base.java +++ b/400_xowa/src_210_bldr_core/gplx/xowa/Xob_sql_dump_base.java @@ -18,13 +18,12 @@ along with this program. If not, see . package gplx.xowa; import gplx.*; import gplx.core.flds.*; import gplx.ios.*; import gplx.xowa.bldrs.*; import gplx.xowa.tdbs.*; public abstract class Xob_sql_dump_base extends Xob_itm_dump_base implements Xob_cmd, GfoInvkAble { + private final Sql_file_parser parser = new Sql_file_parser(); private boolean fail = false; public abstract String Cmd_key(); - public Io_url Src_fil() {return src_fil;} Io_url src_fil; - public Io_url_gen Make_url_gen() {return make_url_gen;} Io_url_gen make_url_gen; - private Sql_file_parser parser = new Sql_file_parser(); - private boolean fail = false; + public Io_url Src_fil() {return src_fil;} private Io_url src_fil; + public Io_url_gen Make_url_gen() {return make_url_gen;} private Io_url_gen make_url_gen; public abstract String Sql_file_name(); - public void Cmd_ini(Xob_bldr bldr) {} + public void Cmd_init(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) { this.Init_dump(this.Cmd_key()); make_url_gen = Io_url_gen_.dir_(temp_dir.GenSubDir("make")); @@ -50,7 +49,7 @@ public abstract class Xob_sql_dump_base extends Xob_itm_dump_base implements Xob if (fail) return; Xobdc_merger.Basic(bldr.Usr_dlg(), dump_url_gen, temp_dir.GenSubDir("sort"), sort_mem_len, Io_line_rdr_key_gen_all._, new Io_sort_fil_basic(bldr.Usr_dlg(), make_url_gen, make_fil_len)); } - public void Cmd_print() {} + public void Cmd_term() {} @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_src_fil_)) src_fil = m.ReadIoUrl("v"); else return super.Invk(ctx, ikey, k, m); diff --git a/400_xowa/src_240_install/gplx/threads/Gfo_thread_cmd_unzip.java b/400_xowa/src_240_install/gplx/threads/Gfo_thread_cmd_unzip.java index cd9386d86..b4edc34a9 100644 --- a/400_xowa/src_240_install/gplx/threads/Gfo_thread_cmd_unzip.java +++ b/400_xowa/src_240_install/gplx/threads/Gfo_thread_cmd_unzip.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.threads; import gplx.*; -import gplx.gfui.*; import gplx.xowa.bldrs.files.*; +import gplx.gfui.*; import gplx.xowa.bldrs.cmds.utils.*; public class Gfo_thread_cmd_unzip implements Gfo_thread_cmd { public Gfo_thread_cmd_unzip Init(Gfo_usr_dlg usr_dlg, Gfui_kit kit, ProcessAdp bzip2_process, ProcessAdp zip_process, ProcessAdp gz_process, Io_url src, Io_url trg) { this.src = src; this.trg = trg; this.kit = kit; this.usr_dlg = usr_dlg; diff --git a/400_xowa/src_240_install/gplx/xowa/Xoa_css_extractor.java b/400_xowa/src_240_install/gplx/xowa/Xoa_css_extractor.java index 996bfbe4e..923d2b472 100644 --- a/400_xowa/src_240_install/gplx/xowa/Xoa_css_extractor.java +++ b/400_xowa/src_240_install/gplx/xowa/Xoa_css_extractor.java @@ -16,7 +16,8 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa; import gplx.*; -import gplx.ios.*; import gplx.xowa.wikis.*; import gplx.xowa.html.*; +import gplx.ios.*; import gplx.xowa.html.*; +import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; public class Xoa_css_extractor { public IoEngine_xrg_downloadFil Download_xrg() {return download_xrg;} private IoEngine_xrg_downloadFil download_xrg = Io_mgr._.DownloadFil_args("", Io_url_.Null); public Xoa_css_extractor Wiki_domain_(byte[] v) {wiki_domain = v; return this;} private byte[] wiki_domain; @@ -39,7 +40,7 @@ public class Xoa_css_extractor { failover_dir = app.Fsys_mgr().Bin_any_dir().GenSubDir_nest("html", "xowa", "import"); url_encoder = Xoa_app_.Utl__encoder_mgr().Url(); } - public void Install_assert(Xowe_wiki wiki, Io_url wiki_html_dir) { + public void Install_assert(boolean download_from_css_tbl, Xowe_wiki wiki, Io_url wiki_html_dir) { try { Io_url css_common_url = wiki_html_dir.GenSubFil(Css_common_name); Io_url css_wiki_url = wiki_html_dir.GenSubFil(Css_wiki_name); @@ -48,14 +49,17 @@ public class Xoa_css_extractor { if (wiki.Domain_tid() == Xow_domain_.Tid_int_home || Env_.Mode_testing()) return; // NOTE: do not download if home_wiki; also needed for TEST if (Io_mgr._.ExistsFil(css_wiki_url)) return; // css file exists; nothing to generate wiki.Appe().Usr_dlg().Log_many("", "", "generating css for '~{0}'", wiki.Domain_str()); - this.Install(wiki, wiki_html_dir); + if (download_from_css_tbl) { + if (Install_by_db(wiki, wiki_html_dir)) return; + } + this.Install_by_wmf(wiki, wiki_html_dir); } catch (Exception e) { // if error, failover; paranoia catch for outliers like bad network connectivity fail, or MediaWiki: message not existing; DATE:2013-11-21 wiki.Appe().Usr_dlg().Warn_many("", "", "failed while trying to generate css; failing over; wiki='~{0}' err=~{1}", wiki.Domain_str(), Err_.Message_gplx(e)); Css_common_failover(); // only failover xowa_common.css; xowa_wiki.css comes from MediaWiki:Common.css / Vector.css } } - public void Install(Xowe_wiki wiki, Io_url wiki_html_dir) { + private void Install_by_wmf(Xowe_wiki wiki, Io_url wiki_html_dir) { opt_download_css_common = wiki.Appe().Setup_mgr().Dump_mgr().Css_commons_download(); if (!wiki.Appe().User().Cfg_mgr().Security_mgr().Web_access_enabled()) opt_download_css_common = false; // if !web_access_enabled, don't download this.wiki_domain = wiki.Domain_bry(); @@ -70,6 +74,17 @@ public class Xoa_css_extractor { Css_wiki_setup(); Logo_setup(); } + private boolean Install_by_db(Xowe_wiki wiki, Io_url wiki_html_dir) { + Xowd_db_mgr core_db_mgr = wiki.Data_mgr__core_mgr(); + if ( core_db_mgr == null + || core_db_mgr.Props() == null + || core_db_mgr.Props().Schema_is_1() + || !core_db_mgr.Tbl__cfg().Select_yn_or(Xow_cfg_consts.Grp__wiki_schema, Xow_cfg_consts.Key__schema__tbl_css_core, Bool_.N) + ) return false; + Xowd_db_file core_db = core_db_mgr.Db__core(); + gplx.xowa.html.css.Xowd_css_core_mgr.Get(core_db.Tbl__css_core(), core_db.Tbl__css_file(), wiki_html_dir); + return true; + } public void Css_common_setup() { if (opt_download_css_common) Css_common_download(); diff --git a/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_base.java b/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_base.java index 5788f61aa..f6baf2eb5 100644 --- a/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_base.java +++ b/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_base.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa; import gplx.*; -import gplx.threads.*; import gplx.xowa.wikis.*; +import gplx.threads.*; import gplx.xowa.wikis.*; import gplx.xowa.bldrs.*; abstract class Xoi_cmd_base implements Gfo_thread_cmd { public void Ctor(Xoi_setup_mgr install_mgr, String wiki_key) { this.install_mgr = install_mgr; this.wiki_key = wiki_key; @@ -85,11 +85,11 @@ class Xoi_cmd_category2_build extends Xoi_cmd_base { @Override public String Async_key() {return KEY;} public static final String KEY = "wiki.category2.build"; @Override public void Process_async_init(Xoae_app app, Xowe_wiki wiki, Xob_bldr bldr) { if (app.Setup_mgr().Dump_mgr().Wiki_storage_type_is_sql()) { - wiki.Db_mgr_as_sql().Category_version_update(false); - bldr.Cmd_mgr().Add_many(wiki, "import.sql.category_registry", "import.sql.categorylinks", "import.sql.hiddencat"); + wiki.Db_mgr_as_sql().Category_version_update(false); + bldr.Cmd_mgr().Add_many(wiki, Xob_cmd_keys.Key_text_cat_core, Xob_cmd_keys.Key_text_cat_link, Xob_cmd_keys.Key_text_cat_hidden); } else - bldr.Cmd_mgr().Add_many(wiki, "ctg.hiddencat_sql", "ctg.hiddencat_ttl", "ctg.link_sql", "ctg.link_idx"); + bldr.Cmd_mgr().Add_many(wiki, Xob_cmd_keys.Key_tdb_cat_hidden_sql, Xob_cmd_keys.Key_tdb_cat_hidden_ttl, Xob_cmd_keys.Key_text_cat_link, Xob_cmd_keys.Key_tdb_ctg_link_idx); } @Override public void Process_async_done(Xoae_app app, Xowe_wiki wiki, Xob_bldr bldr) { app.Usr_dlg().Prog_many("", "", "category2 setup done"); @@ -101,7 +101,7 @@ class Xoi_cmd_search2_build extends Xoi_cmd_base { @Override public void Process_async_init(Xoae_app app, Xowe_wiki wiki, Xob_bldr bldr) { if (app.Setup_mgr().Dump_mgr().Wiki_storage_type_is_sql()) { wiki.Db_mgr_as_sql().Category_version_update(false); - bldr.Cmd_mgr().Add_many(wiki, "import.sql.search_title.cmd"); + bldr.Cmd_mgr().Add_many(wiki, Xob_cmd_keys.Key_text_search_cmd); } } @Override public void Process_async_done(Xoae_app app, Xowe_wiki wiki, Xob_bldr bldr) { diff --git a/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki.java b/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki.java index 7e9121e52..3cd3e2320 100644 --- a/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki.java +++ b/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa; import gplx.*; import gplx.gfui.*; -import gplx.threads.*; +import gplx.threads.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.utils.*; class Xoi_cmd_wiki_download extends Gfo_thread_cmd_download implements Gfo_thread_cmd { private Xoi_setup_mgr install_mgr; private String wiki_key, dump_date, dump_type; public Xoi_cmd_wiki_download Ctor_download_(Xoi_setup_mgr install_mgr, String wiki_key, String dump_date, String dump_type) { this.install_mgr = install_mgr; @@ -181,7 +181,7 @@ class Xoi_cmd_wiki_zip implements Gfo_thread_cmd { wiki.Init_assert(); bldr.Cmd_mgr().Clear(); bldr.Pause_at_end_(false); - ((Xobc_deploy_zip)bldr.Cmd_mgr().Add_cmd(wiki, "deploy.zip")).Delete_dirs_page_(delete_dirs_page); + ((Xob_deploy_zip_cmd)bldr.Cmd_mgr().Add_cmd(wiki, Xob_cmd_keys.Key_deploy_zip)).Delete_dirs_page_(delete_dirs_page); bldr.Run(); app.Usr_dlg().Prog_none(GRP_KEY, "clear", ""); app.Usr_dlg().Note_none(GRP_KEY, "clear", ""); diff --git a/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_import.java b/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_import.java index dd0042efd..ffda24dcf 100644 --- a/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_import.java +++ b/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_import.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa; import gplx.*; -import gplx.threads.*; import gplx.xowa.gui.views.*; +import gplx.threads.*; import gplx.xowa.bldrs.*; import gplx.xowa.gui.views.*; import gplx.xowa.bldrs.cmds.utils.*; class Xoi_cmd_wiki_import implements Gfo_thread_cmd { public Xoi_cmd_wiki_import(Xoi_setup_mgr install_mgr, String wiki_key, String wiki_date, String dump_type) {this.install_mgr = install_mgr; this.Owner_(install_mgr); this.wiki_key = wiki_key; this.wiki_date = wiki_date; this.dump_type = dump_type;} private Xoi_setup_mgr install_mgr; String wiki_key, wiki_date, dump_type; public static final String KEY = "wiki.import"; @@ -43,28 +43,29 @@ class Xoi_cmd_wiki_import implements Gfo_thread_cmd { boolean running; public boolean Import_move_bz2_to_done() {return import_move_bz2_to_done;} public Xoi_cmd_wiki_import Import_move_bz2_to_done_(boolean v) {import_move_bz2_to_done = v; return this;} private boolean import_move_bz2_to_done = true; private void Process_txt(Xob_bldr bldr) { - ((gplx.xowa.bldrs.imports.Xobc_core_cleanup)bldr.Cmd_mgr().Add_cmd(wiki, "core.cleanup")).Delete_wiki_(true).Delete_sqlite3_(true); - bldr.Cmd_mgr().Add_cmd(wiki, "core.init"); - bldr.Cmd_mgr().Add_cmd(wiki, "core.make_page"); - bldr.Cmd_mgr().Add_cmd(wiki, "core.make_id"); - bldr.Cmd_mgr().Add_cmd(wiki, "core.make_search_title"); + ((Xob_cleanup_cmd)bldr.Cmd_mgr().Add_cmd(wiki, Xob_cmd_keys.Key_util_cleanup)).Delete_tdb_(true).Delete_sqlite3_(true); + bldr.Cmd_mgr().Add_cmd(wiki, Xob_cmd_keys.Key_tdb_text_init); + bldr.Cmd_mgr().Add_cmd(wiki, Xob_cmd_keys.Key_tdb_make_page); + bldr.Cmd_mgr().Add_cmd(wiki, Xob_cmd_keys.Key_tdb_make_id); + bldr.Cmd_mgr().Add_cmd(wiki, Xob_cmd_keys.Key_tdb_make_search_title); if (wiki.Import_cfg().Category_version() == gplx.xowa.ctgs.Xoa_ctg_mgr.Version_1) - bldr.Cmd_mgr().Add_cmd(wiki, "core.make_category"); - bldr.Cmd_mgr().Add_cmd(wiki, "core.calc_stats"); - bldr.Cmd_mgr().Add_cmd(wiki, "core.term"); + bldr.Cmd_mgr().Add_cmd(wiki, Xob_cmd_keys.Key_tdb_make_category); + bldr.Cmd_mgr().Add_cmd(wiki, Xob_cmd_keys.Key_tdb_calc_stats); + bldr.Cmd_mgr().Add_cmd(wiki, Xob_cmd_keys.Key_tdb_core_term); } private void Process_sql(Xob_bldr bldr) { - ((gplx.xowa.bldrs.imports.Xobc_core_cleanup)bldr.Cmd_mgr().Add_cmd(wiki, "core.cleanup")).Delete_wiki_(true).Delete_sqlite3_(true); - bldr.Cmd_mgr().Add_cmd(wiki, "import.sql.init"); - bldr.Cmd_mgr().Add_cmd(wiki, "import.sql.page"); + ((Xob_cleanup_cmd)bldr.Cmd_mgr().Add_cmd(wiki, Xob_cmd_keys.Key_util_cleanup)).Delete_tdb_(true).Delete_sqlite3_(true); + bldr.Cmd_mgr().Add_cmd(wiki, Xob_cmd_keys.Key_text_init); + bldr.Cmd_mgr().Add_cmd(wiki, Xob_cmd_keys.Key_text_page); + bldr.Cmd_mgr().Add_cmd(wiki, Xob_cmd_keys.Key_text_css); if (wiki.Import_cfg().Category_version() == gplx.xowa.ctgs.Xoa_ctg_mgr.Version_1) { - bldr.Cmd_mgr().Add_cmd(wiki, "import.sql.category_v1"); - bldr.Cmd_mgr().Add_cmd(wiki, "import.sql.category_registry"); - bldr.Cmd_mgr().Add_cmd(wiki, "import.sql.categorylinks"); + bldr.Cmd_mgr().Add_cmd(wiki, Xob_cmd_keys.Key_text_cat_core_v1); + bldr.Cmd_mgr().Add_cmd(wiki, Xob_cmd_keys.Key_text_cat_core); + bldr.Cmd_mgr().Add_cmd(wiki, Xob_cmd_keys.Key_text_cat_link); } if (wiki.Appe().Setup_mgr().Dump_mgr().Search_version() == gplx.xowa.specials.search.Xosrh_core.Version_2) - bldr.Cmd_mgr().Add_cmd(wiki, "import.sql.search_title.wkr"); - bldr.Cmd_mgr().Add_cmd(wiki, "import.sql.term"); + bldr.Cmd_mgr().Add_cmd(wiki, Xob_cmd_keys.Key_text_search_wkr); + bldr.Cmd_mgr().Add_cmd(wiki, Xob_cmd_keys.Key_text_term); } private void Process_async() { Xoae_app app = install_mgr.App(); @@ -80,8 +81,7 @@ class Xoi_cmd_wiki_import implements Gfo_thread_cmd { else Process_txt(bldr); bldr.Run(); - app.Usr_dlg().Prog_none(GRP_KEY, "clear", ""); - app.Usr_dlg().Note_none(GRP_KEY, "clear", ""); + app.Usr_dlg().Prog_none(GRP_KEY, "clear", ""); app.Usr_dlg().Note_none(GRP_KEY, "clear", ""); app.User().Available_from_fsys(); wiki.Init_needed_(true); wiki.Html_mgr().Page_wtr_mgr().Init_(true); diff --git a/400_xowa/src_240_install/gplx/xowa/Xoi_dump_mgr.java b/400_xowa/src_240_install/gplx/xowa/Xoi_dump_mgr.java index 52cce29ca..b5834fa00 100644 --- a/400_xowa/src_240_install/gplx/xowa/Xoi_dump_mgr.java +++ b/400_xowa/src_240_install/gplx/xowa/Xoi_dump_mgr.java @@ -16,14 +16,15 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa; import gplx.*; +import gplx.ios.*; public class Xoi_dump_mgr implements GfoInvkAble { public String[] Server_urls() {return server_urls;} private String[] server_urls = String_.Ary(Xob_dump_file_.Server_wmf, Xob_dump_file_.Server_your_org, Xob_dump_file_.Server_c3sl, Xob_dump_file_.Server_masaryk); public String[] Custom_cmds() {return custom_cmds;} private String[] custom_cmds = String_.Ary(Xoi_cmd_wiki_download.Key_wiki_download, Xoi_cmd_wiki_import.KEY); public byte Data_storage_format() {return data_storage_format;} public Xoi_dump_mgr Data_storage_format_(byte v) {data_storage_format = v; return this;} private byte data_storage_format = gplx.ios.Io_stream_.Tid_gzip; - public long Db_text_max() {return db_text_max;} long db_text_max = (long)3000 * Io_mgr.Len_mb; - public long Db_categorylinks_max() {return db_categorylinks_max;} long db_categorylinks_max = (long)3600 * Io_mgr.Len_mb; - public long Db_wikidata_max() {return db_wikidata_max;} long db_wikidata_max = (long)3600 * Io_mgr.Len_mb; - public byte Wiki_storage_type() {return wiki_storage_type;} private byte wiki_storage_type = Wiki_storage_type_sqlite; + public long Db_text_max() {return db_text_max;} private long db_text_max = (long)3000 * Io_mgr.Len_mb; + public long Db_categorylinks_max() {return db_categorylinks_max;} private long db_categorylinks_max = (long)3600 * Io_mgr.Len_mb; + public long Db_wikidata_max() {return db_wikidata_max;} private long db_wikidata_max = (long)3600 * Io_mgr.Len_mb; + public byte Wiki_storage_type() {return wiki_storage_type;} private byte wiki_storage_type = Wiki_storage_type_sqlite; public boolean Wiki_storage_type_is_sql() {return wiki_storage_type == Wiki_storage_type_sqlite;} public String Db_ns_map() {return db_ns_map;} private String db_ns_map = "Template~Module"; public boolean Css_wiki_update() {return css_wiki_update;} private boolean css_wiki_update = true; @@ -36,8 +37,8 @@ public class Xoi_dump_mgr implements GfoInvkAble { else if (ctx.Match(k, Invk_server_urls_)) server_urls = m.ReadStrAryIgnore("v", ",", "\n"); else if (ctx.Match(k, Invk_custom_cmds)) return String_.Concat_with_str(",", custom_cmds); else if (ctx.Match(k, Invk_custom_cmds_)) custom_cmds = String_.Ary_filter(m.ReadStrAry("v", ","), Xoi_cmd_mgr.Wiki_cmds_valid); - else if (ctx.Match(k, Invk_data_storage_format)) return Wtr_tid_to_str(data_storage_format); - else if (ctx.Match(k, Invk_data_storage_format_)) data_storage_format = Wtr_tid_parse(m.ReadStr("v")); + else if (ctx.Match(k, Invk_data_storage_format)) return Io_stream_.Obsolete_to_str(data_storage_format); + else if (ctx.Match(k, Invk_data_storage_format_)) data_storage_format = Io_stream_.Obsolete_to_tid(m.ReadStr("v")); else if (ctx.Match(k, Invk_data_storage_format_list)) return Options_data_storage_format_list; else if (ctx.Match(k, Invk_db_text_max)) return db_text_max / Io_mgr.Len_mb; else if (ctx.Match(k, Invk_db_text_max_)) db_text_max = m.ReadLong("v") * Io_mgr.Len_mb; @@ -64,7 +65,7 @@ public class Xoi_dump_mgr implements GfoInvkAble { else return GfoInvkAble_.Rv_unhandled; return this; } - static final String Invk_server_urls = "server_urls", Invk_server_urls_ = "server_urls_", Invk_custom_cmds = "custom_cmds", Invk_custom_cmds_ = "custom_cmds_" + private static final String Invk_server_urls = "server_urls", Invk_server_urls_ = "server_urls_", Invk_custom_cmds = "custom_cmds", Invk_custom_cmds_ = "custom_cmds_" , Invk_data_storage_format = "data_storage_format", Invk_data_storage_format_ = "data_storage_format_", Invk_data_storage_format_list = "data_storage_format_list" , Invk_db_text_max = "db_text_max", Invk_db_text_max_ = "db_text_max_", Invk_db_categorylinks_max = "db_categorylinks_max", Invk_db_categorylinks_max_ = "db_categorylinks_max_", Invk_db_wikidata_max = "db_wikidata_max", Invk_db_wikidata_max_ = "db_wikidata_max_" , Invk_db_ns_map = "db_ns_map", Invk_db_ns_map_ = "db_ns_map_" @@ -76,24 +77,8 @@ public class Xoi_dump_mgr implements GfoInvkAble { , Invk_import_bz2_by_stdout = "import_bz2_by_stdout", Invk_import_bz2_by_stdout_ = "import_bz2_by_stdout_" ; private static KeyVal[] Options_data_storage_format_list = KeyVal_.Ary(KeyVal_.new_(".xdat", "text"), KeyVal_.new_(".gz", "gzip"), KeyVal_.new_(".bz2", "bzip2")); // removed .zip; DATE:2014-05-13; updated aliases; DATE:2014-06-20 - public static String Wtr_tid_to_str(byte v) { - switch (v) { - case gplx.ios.Io_stream_.Tid_file : return ".xdat"; - case gplx.ios.Io_stream_.Tid_zip : return ".zip"; - case gplx.ios.Io_stream_.Tid_gzip : return ".gz"; - case gplx.ios.Io_stream_.Tid_bzip2 : return ".bz2"; - default : throw Err_.unhandled(v); - } - } - public static byte Wtr_tid_parse(String v) { - if (String_.Eq(v, ".xdat")) return gplx.ios.Io_stream_.Tid_file; - else if (String_.Eq(v, ".zip")) return gplx.ios.Io_stream_.Tid_zip; - else if (String_.Eq(v, ".gz")) return gplx.ios.Io_stream_.Tid_gzip; - else if (String_.Eq(v, ".bz2")) return gplx.ios.Io_stream_.Tid_bzip2; - else throw Err_.unhandled(v); - } static final byte Wiki_storage_type_xdat = 1, Wiki_storage_type_sqlite = 2; - private static final KeyVal[] Options_storage_type_list = KeyVal_.Ary(KeyVal_.new_("sqlite"), KeyVal_.new_("xdat")); + private static final KeyVal[] Options_storage_type_list = KeyVal_.Ary(KeyVal_.new_("sqlite"), KeyVal_.new_("xdat")); // DEPRECATED: KeyVal_.new_("xdat"); DATE:2015-03-30 public static String Wiki_storage_type_str(byte v) { switch (v) { case Xoi_dump_mgr.Wiki_storage_type_xdat : return "xdat"; diff --git a/400_xowa/src_240_install/gplx/xowa/Xow_page_fetcher.java b/400_xowa/src_240_install/gplx/xowa/Xow_page_fetcher.java index d8bbc486e..d7324fe40 100644 --- a/400_xowa/src_240_install/gplx/xowa/Xow_page_fetcher.java +++ b/400_xowa/src_240_install/gplx/xowa/Xow_page_fetcher.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa; import gplx.*; +import gplx.xowa.wikis.data.tbls.*; public interface Xow_page_fetcher { Xow_page_fetcher Wiki_(Xowe_wiki v); byte[] Fetch(int ns_id, byte[] ttl); @@ -32,12 +33,12 @@ class Xow_page_fetcher_mok implements Xow_page_fetcher { public Xow_page_fetcher Wiki_(Xowe_wiki v) {return this;} public void Clear() {pages.Clear();} private HashAdp pages = HashAdp_.new_(); public void Add(int ns_id, byte[] ttl, byte[] text) { - Xodb_page page = new Xodb_page().Ns_id_(ns_id).Ttl_page_db_(ttl).Wtxt_(text); + Xowd_page_itm page = new Xowd_page_itm().Ns_id_(ns_id).Ttl_page_db_(ttl).Text_(text); pages.Add(Make_key(ns_id, ttl), page); } public byte[] Fetch(int ns_id, byte[] ttl) { - Xodb_page rv = (Xodb_page)pages.Fetch(Make_key(ns_id, ttl)); - return rv == null ? null : rv.Wtxt(); + Xowd_page_itm rv = (Xowd_page_itm)pages.Fetch(Make_key(ns_id, ttl)); + return rv == null ? null : rv.Text(); } String Make_key(int ns_id, byte[] ttl) {return Int_.Xto_str(ns_id) + "|" + String_.new_utf8_(ttl);} } diff --git a/400_xowa/src_300_html/gplx/xowa/Xoae_page.java b/400_xowa/src_300_html/gplx/xowa/Xoae_page.java index 82490e366..47130b869 100644 --- a/400_xowa/src_300_html/gplx/xowa/Xoae_page.java +++ b/400_xowa/src_300_html/gplx/xowa/Xoae_page.java @@ -60,6 +60,7 @@ public class Xoae_page implements Xoa_page { public ListAdp Slink_list() {return slink_list;} private ListAdp slink_list = ListAdp_.new_(); public Wdata_external_lang_links_data Wdata_external_lang_links() {return wdata_external_lang_links;} private Wdata_external_lang_links_data wdata_external_lang_links = new Wdata_external_lang_links_data(); public boolean Pages_recursed() {return pages_recursed;} public void Pages_recursed_(boolean v) {pages_recursed = v; } private boolean pages_recursed; + public int Bldr__ns_ord() {return bldr__ns_ord;} public void Bldr__ns_ord_(int v) {bldr__ns_ord = v;} private int bldr__ns_ord; public Xopg_tmpl_prepend_mgr Tmpl_prepend_mgr() {return tmpl_prepend_mgr;} private Xopg_tmpl_prepend_mgr tmpl_prepend_mgr = new Xopg_tmpl_prepend_mgr(); public void Tmpl_stack_del() {--tmpl_stack_ary_len;} public boolean Tmpl_stack_add(byte[] key) { diff --git a/400_xowa/src_300_html/gplx/xowa/Xoh_file_main.java b/400_xowa/src_300_html/gplx/xowa/Xoh_file_main.java index 3f3cfc005..12d7606c5 100644 --- a/400_xowa/src_300_html/gplx/xowa/Xoh_file_main.java +++ b/400_xowa/src_300_html/gplx/xowa/Xoh_file_main.java @@ -30,7 +30,7 @@ class Xoh_file_main_alts implements Bry_fmtr_arg { if (xfer_itm.Html_w() < size.Val_0()) continue; xfer_itm.Init_by_lnki(orig_itm.Lnki_ttl(), orig_itm.Orig_redirect(), Xop_lnki_type.Id_none, size.Val_0(), size.Val_1(), Xop_lnki_tkn.Upright_null, Xof_lnki_time.Null, Xof_lnki_page.Null); xfer_itm.Calc_by_meta(); - opt.Html_alts().Bld_bfr_many(bfr, xfer_itm.Html_w(), xfer_itm.Html_h(), xfer_itm.Html_view_url(), i == len - 1 ? opt.Html_alt_dlm_last() : opt.Html_alt_dlm_default()); + opt.Html_alts().Bld_bfr_many(bfr, xfer_itm.Html_w(), xfer_itm.Html_h(), xfer_itm.Html_view_url(), i == len - 1 ? opt.Html_alt_dlm_last() : opt.Html_alt_dlm_dflt()); } } } diff --git a/400_xowa/src_300_html/gplx/xowa/Xoh_file_main_wkr.java b/400_xowa/src_300_html/gplx/xowa/Xoh_file_main_wkr.java index 7ab98fa56..229ec0c84 100644 --- a/400_xowa/src_300_html/gplx/xowa/Xoh_file_main_wkr.java +++ b/400_xowa/src_300_html/gplx/xowa/Xoh_file_main_wkr.java @@ -20,25 +20,27 @@ import gplx.core.primitives.*; import gplx.xowa.html.*; import gplx.xowa.html.lnkis.*; import gplx.xowa.files.*; import gplx.xowa.files.repos.*; public class Xoh_file_main_wkr implements Bry_fmtr_arg { - private Xof_xfer_itm xfer_itm; private Xoh_file_main_alts alts = new Xoh_file_main_alts(); private Xoh_file_page opt; - byte[] file_size_bry; Xoa_ttl ttl; Xowe_wiki wiki; - public void Bld_html(Xowe_wiki wiki, Xop_ctx ctx, Bry_bfr bfr, Xoa_ttl ttl, Xoh_file_page opt, Xof_xfer_queue queue) { - this.opt = opt; this.ttl = ttl; this.wiki = wiki; - Int_2_ref size_main = opt.Size_main(); - int main_w = size_main.Val_0(); - int main_h = size_main.Val_1(); + private byte[] file_size_bry; private Xoa_ttl ttl; + private Xof_xfer_itm xfer_itm; private Xoh_file_main_alts alts = new Xoh_file_main_alts(); private Xoh_file_page page_wtr_cfg; + private byte[] play_btn_icon; private Bool_obj_ref queue_add_ref = Bool_obj_ref.n_(); + private int elem_id_val; + public void Bld_html(Xowe_wiki wiki, Xop_ctx ctx, Bry_bfr bfr, Xoa_ttl ttl, Xoh_file_page page_wtr_cfg, Xof_xfer_queue queue) { + this.page_wtr_cfg = page_wtr_cfg; this.ttl = ttl; + Int_2_ref main_size = page_wtr_cfg.Size_main(); + int main_w = main_size.Val_0(); + int main_h = main_size.Val_1(); this.xfer_itm = wiki.Html_mgr().Html_wtr().Lnki_wtr().File_wtr().Lnki_eval(ctx, queue, ttl.Page_txt(), Xop_lnki_type.Id_thumb, main_w, main_h, Xop_lnki_tkn.Upright_null, Xof_lnki_time.Null, Xof_lnki_page.Null, false, queue_add_ref); + Xof_meta_itm meta_itm = wiki.File_mgr().Meta_mgr().Get_itm_or_new(ttl.Page_db(), Xof_xfer_itm_.Md5_(ttl.Page_db())); // NOTE: can't use Md5 of xfer_itm, b/c xfer_itm.Ttl() b/c may be redirected; EX:w:[[Image:Alcott-L.jpg]] - Xof_repo_itm trg_repo = null; - trg_repo = meta_itm.Repo_itm(wiki); + Xof_repo_itm trg_repo = meta_itm.Repo_itm(wiki); if (trg_repo == null) trg_repo = wiki.File_mgr().Repo_mgr().Repos_get_at(0).Trg(); xfer_itm.Set__meta(meta_itm, trg_repo, Xof_repo_itm.Thumb_default_null); xfer_itm.Init_by_orig_old(meta_itm.Orig_w(), meta_itm.Orig_h(), Xof_img_size.Size_null); xfer_itm.Trg_repo_idx_(meta_itm.Vrtl_repo()); - play_btn_icon = wiki.Html_mgr().Img_media_play_btn(); - file_size_bry = Bry_.Empty; - if (xfer_itm.Calc_by_meta(true)) { + this.play_btn_icon = wiki.Html_mgr().Img_media_play_btn(); + this.file_size_bry = Bry_.Empty; + if (xfer_itm.Calc_by_meta(true)) { // file exists long file_size = Io_mgr._.QueryFil(xfer_itm.Trg_file(Xof_repo_itm.Mode_orig, Xof_img_size.Size_null_deprecated)).Size(); file_size_bry = Bry_.new_ascii_(gplx.ios.Io_size_.Xto_str(file_size)); } @@ -46,22 +48,22 @@ public class Xoh_file_main_wkr implements Bry_fmtr_arg { xfer_itm = xfer_itm.Clone(); queue.Add(xfer_itm); } - opt.Html_main().Bld_bfr_many(bfr, this); - } private byte[] play_btn_icon; private Bool_obj_ref queue_add_ref = Bool_obj_ref.n_(); - public void Bld_html(Xowe_wiki wiki, Bry_bfr bfr, Xof_xfer_itm xfer_itm, Xoa_ttl ttl, Xoh_file_page opt, byte[] file_size_bry, byte[] play_btn_icon, int elem_id_val) { + page_wtr_cfg.Html_main().Bld_bfr_many(bfr, this); + } + public void Bld_html(Xowe_wiki wiki, Bry_bfr bfr, Xof_xfer_itm xfer_itm, Xoa_ttl ttl, Xoh_file_page page_wtr_cfg, byte[] file_size_bry, byte[] play_btn_icon, int elem_id_val) { this.xfer_itm = xfer_itm; - this.wiki = wiki; this.ttl = ttl; this.opt = opt; this.file_size_bry = file_size_bry; this.play_btn_icon = play_btn_icon; this.elem_id_val = elem_id_val; - opt.Html_main().Bld_bfr_many(bfr, this); - } private int elem_id_val; + this.ttl = ttl; this.page_wtr_cfg = page_wtr_cfg; this.file_size_bry = file_size_bry; this.play_btn_icon = play_btn_icon; this.elem_id_val = elem_id_val; + page_wtr_cfg.Html_main().Bld_bfr_many(bfr, this); + } public void XferAry(Bry_bfr bfr, int idx) { - alts.Ctor(xfer_itm, opt); + alts.Ctor(xfer_itm, page_wtr_cfg); Xof_ext ext = xfer_itm.Lnki_ext(); if (ext.Id_is_thumbable_img()) - opt.Html_main_img().Bld_bfr_many(bfr, xfer_itm.Orig_w(), xfer_itm.Orig_h(), xfer_itm.Html_orig_url(), file_size_bry, ext.Mime_type(), elem_id_val, xfer_itm.Html_w(), xfer_itm.Html_h(), xfer_itm.Html_view_url(), ttl.Full_txt(), Xoa_app_.Utl__encoder_mgr().Url().Encode(ttl.Page_url()), alts); + page_wtr_cfg.Html_main_img().Bld_bfr_many(bfr, xfer_itm.Orig_w(), xfer_itm.Orig_h(), xfer_itm.Html_orig_url(), file_size_bry, ext.Mime_type(), elem_id_val, xfer_itm.Html_w(), xfer_itm.Html_h(), xfer_itm.Html_view_url(), ttl.Full_txt(), Xoa_app_.Utl__encoder_mgr().Url().Encode(ttl.Page_url()), alts); else if (ext.Id_is_video()) // NOTE: video must precede audio else File:***.ogg will not show thumbs - opt.Html_main_vid().Bld_bfr_many(bfr, elem_id_val, xfer_itm.Html_view_url(), Atr_class_image, ttl.Page_db(), xfer_itm.Html_view_url(), xfer_itm.Html_w(), xfer_itm.Html_h(), Bry_.Empty, xfer_itm.Html_orig_url(), xfer_itm.Html_w(), xfer_itm.Html_w(), play_btn_icon); + page_wtr_cfg.Html_main_vid().Bld_bfr_many(bfr, elem_id_val, xfer_itm.Html_view_url(), Atr_class_image, ttl.Page_db(), xfer_itm.Html_view_url(), xfer_itm.Html_w(), xfer_itm.Html_h(), Bry_.Empty, xfer_itm.Html_orig_url(), xfer_itm.Html_w(), xfer_itm.Html_w(), play_btn_icon); else if (ext.Id_is_audio()) - opt.Html_main_aud().Bld_bfr_many(bfr, xfer_itm.Html_orig_url(), ttl.Page_db(), xfer_itm.Html_w(), xfer_itm.Html_w(), play_btn_icon); + page_wtr_cfg.Html_main_aud().Bld_bfr_many(bfr, xfer_itm.Html_orig_url(), ttl.Page_db(), xfer_itm.Html_w(), xfer_itm.Html_w(), play_btn_icon); } private static final byte[] Atr_class_image = Bry_.new_ascii_("image"); } diff --git a/400_xowa/src_300_html/gplx/xowa/Xoh_file_page.java b/400_xowa/src_300_html/gplx/xowa/Xoh_file_page.java index 20228ad6d..3b968429c 100644 --- a/400_xowa/src_300_html/gplx/xowa/Xoh_file_page.java +++ b/400_xowa/src_300_html/gplx/xowa/Xoh_file_page.java @@ -17,15 +17,101 @@ along with this program. If not, see . */ package gplx.xowa; import gplx.*; public class Xoh_file_page implements GfoInvkAble { - public Int_2_ref Size_main() {return size_main;} Int_2_ref size_main; - public Int_2_ref[] Size_alts() {return size_alts;} Int_2_ref[] size_alts; - public byte[] Html_alt_dlm_default() {return html_alt_dlm_dflt;} private byte[] html_alt_dlm_dflt; - public byte[] Html_alt_dlm_last() {return html_alt_dlm_last;} private byte[] html_alt_dlm_last; - public Bry_fmtr Html_main() {return html_main;} Bry_fmtr html_main = Bry_fmtr.new_("", "media"); - public Bry_fmtr Html_main_img() {return html_main_img;} Bry_fmtr html_main_img = Bry_fmtr.new_("", "orig_width", "orig_height", "orig_href", "orig_file_size", "orig_mime_type", "elem_id", "thumb_width", "thumb_height", "thumb_href", "thumb_ttl", "thumb_name", "section_alts"); - public Bry_fmtr Html_main_aud() {return html_main_aud;} Bry_fmtr html_main_aud = Bry_fmtr.new_("", "lnki_url", "lnki_title", "play_width", "play_max_width", "play_icon"); - public Bry_fmtr Html_main_vid() {return html_main_vid;} Bry_fmtr html_main_vid = Bry_fmtr.new_("", "elem_id", "lnki_href", "lnki_class", "lnki_title", "lnki_src", "lnki_width", "lnki_height", "lnki_alt", "lnki_url", "play_width", "play_max_width", "play_icon"); - public Bry_fmtr Html_alts() {return html_alts;} Bry_fmtr html_alts = Bry_fmtr.new_("", "thumb_width", "thumb_height", "thumb_href", "thumb_dlm"); + public Xoh_file_page() { + html_main.Fmt_(String_.Concat_lines_nl_skip_last + ( "

    " + , "~{media}" + )); + html_main_img.Fmt_(String_.Concat_lines_nl_skip_last + ( "
    " + , " " + , " \"~{thumb_ttl}\"" + , " " + , "
    Size of this preview: " + , " " + , " ~{thumb_width} × ~{thumb_height} pixels" + , " " + , " ." + , " " + , " Other resolutions:" + , "~{section_alts}" + , " " + , "
    " + , "
    " + , "
    " + , " " + , " Full resolution" + , " " + , " ‎" + , " " + , " (~{orig_width} × ~{orig_height} pixels, file size: ~{orig_file_size}, MIME type: ~{orig_mime_type})" + , " " + , "
    " + , "" + )); + html_main_aud.Fmt_(String_.Concat_lines_nl_skip_last + ( "
    " + , "
    " + , " " + , " \"Play" + , " " + , "
    " + , "
    " + , "" + )); + html_main_vid.Fmt_(String_.Concat_lines_nl_skip_last + ( "
    " + , "
    " + , " " + , " \"~{lnki_alt}\"" + , " " + , "
    " + , "
    " + , " " + , " \"Play" + , " " + , "
    " + , "
    " + , "" + )); + html_alts.Fmt_(String_.Concat_lines_nl_skip_last + ( " " + , " ~{thumb_width} × ~{thumb_height}" + , " " + , " ~{thumb_dlm} " + , "" + )); + } + public Int_2_ref Size_main() {return size_main;} private Int_2_ref size_main = new Int_2_ref(800, 600); + public Int_2_ref[] Size_alts() {return size_alts;} private Int_2_ref[] size_alts = new Int_2_ref[] {new Int_2_ref(320, 240), new Int_2_ref(640, 480), new Int_2_ref(800, 600), new Int_2_ref(1024, 768), new Int_2_ref(1280, 1024)}; + public byte[] Html_alt_dlm_dflt() {return html_alt_dlm_dflt;} private byte[] html_alt_dlm_dflt = Bry_.new_ascii_("|"); + public byte[] Html_alt_dlm_last() {return html_alt_dlm_last;} private byte[] html_alt_dlm_last = Bry_.new_ascii_("."); + public Bry_fmtr Html_main() {return html_main;} private final Bry_fmtr html_main = Bry_fmtr.new_("", "media"); + public Bry_fmtr Html_main_img() {return html_main_img;} private final Bry_fmtr html_main_img = Bry_fmtr.new_("", "orig_width", "orig_height", "orig_href", "orig_file_size", "orig_mime_type", "elem_id", "thumb_width", "thumb_height", "thumb_href", "thumb_ttl", "thumb_name", "section_alts"); + public Bry_fmtr Html_main_aud() {return html_main_aud;} private final Bry_fmtr html_main_aud = Bry_fmtr.new_("", "lnki_url", "lnki_title", "play_width", "play_max_width", "play_icon"); + public Bry_fmtr Html_main_vid() {return html_main_vid;} private final Bry_fmtr html_main_vid = Bry_fmtr.new_("", "elem_id", "lnki_href", "lnki_class", "lnki_title", "lnki_src", "lnki_width", "lnki_height", "lnki_alt", "lnki_url", "play_width", "play_max_width", "play_icon"); + public Bry_fmtr Html_alts() {return html_alts;} private final Bry_fmtr html_alts = Bry_fmtr.new_("", "thumb_width", "thumb_height", "thumb_href", "thumb_dlm"); public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_html_main_)) html_main.Fmt_(m.ReadStr("v")); else if (ctx.Match(k, Invk_html_main_img_)) html_main_img.Fmt_(m.ReadStr("v")); @@ -38,97 +124,8 @@ public class Xoh_file_page implements GfoInvkAble { else if (ctx.Match(k, Invk_size_alts_)) size_alts = Int_2_ref.parse_ary_(m.ReadStr("v")); else return GfoInvkAble_.Rv_unhandled; return this; - } private static final String Invk_html_main_ = "html_main_", Invk_html_main_img_ = "html_main_img_", Invk_html_main_aud_ = "html_main_aud_", Invk_html_main_vid_ = "html_main_vid_", Invk_html_alts_ = "html_alts_" - , Invk_size_main_ = "size_main_" , Invk_size_alts_ = "size_alts_", Invk_html_alt_dlm_dflt_ = "html_alt_dlm_dflt_", Invk_html_alt_dlm_last_ = "html_alt_dlm_last_"; - public Xoh_file_page() { - size_main = new Int_2_ref(800, 600); - size_alts = new Int_2_ref[] {new Int_2_ref(320, 240), new Int_2_ref(640, 480), new Int_2_ref(800, 600), new Int_2_ref(1024, 768), new Int_2_ref(1280, 1024)}; - html_alt_dlm_dflt = Bry_.new_ascii_("|"); - html_alt_dlm_last = Bry_.new_ascii_("."); - html_main.Fmt_(String_.Concat_lines_nl_skip_last - ( "" - , "~{media}" - )); - html_main_img.Fmt_(String_.Concat_lines_nl_skip_last - ( "
    " - , " " - , " \"~{thumb_ttl}\"" - , " " - , "
    Size of this preview: " - , " " - , " ~{thumb_width} × ~{thumb_height} pixels" - , " " - , " ." - , " " - , " Other resolutions:" - , "~{section_alts}" - , " " - , "
    " - , "
    " - , "
    " - , " " - , " Full resolution" - , " " - , " ‎" - , " " - , " (~{orig_width} × ~{orig_height} pixels, file size: ~{orig_file_size}, MIME type: ~{orig_mime_type})" - , " " - , "
    " - , "" - )); - html_main_aud.Fmt_(String_.Concat_lines_nl_skip_last - ( "
    " - , "
    " - , " " - , " \"Play" - , " " - , "
    " - , "
    " - , "" - )); - html_main_vid.Fmt_(String_.Concat_lines_nl_skip_last - ( "
    " - , "
    " - , " " - , " \"~{lnki_alt}\"" - , " " - , "
    " - , "
    " - , " " - , " \"Play" - , " " - , "
    " - , "
    " - , "" - )); - html_alts.Fmt_(String_.Concat_lines_nl_skip_last - ( " " - , " ~{thumb_width} × ~{thumb_height}" - , " " - , " ~{thumb_dlm} " - , "" - )); } + private static final String Invk_html_main_ = "html_main_", Invk_html_main_img_ = "html_main_img_", Invk_html_main_aud_ = "html_main_aud_", Invk_html_main_vid_ = "html_main_vid_", Invk_html_alts_ = "html_alts_" + , Invk_size_main_ = "size_main_" , Invk_size_alts_ = "size_alts_", Invk_html_alt_dlm_dflt_ = "html_alt_dlm_dflt_", Invk_html_alt_dlm_last_ = "html_alt_dlm_last_"; } diff --git a/400_xowa/src_310_url/gplx/xowa/Xoa_url_parser.java b/400_xowa/src_310_url/gplx/xowa/Xoa_url_parser.java index 58c479b7f..0c5166650 100644 --- a/400_xowa/src_310_url/gplx/xowa/Xoa_url_parser.java +++ b/400_xowa/src_310_url/gplx/xowa/Xoa_url_parser.java @@ -251,7 +251,7 @@ public class Xoa_url_parser { if (bfr.Len() > 0) bfr.Add_byte(Byte_ascii.Slash); bfr.Add(page); } - return bfr.Mkr_rls().Xto_bry_and_clear(); + return bfr.To_bry_and_rls(); } public static Xoa_url Parse_from_url_bar(Xoae_app app, Xowe_wiki wiki, String s) { byte[] bry = Bry_.new_utf8_(s); diff --git a/400_xowa/src_400_parser/gplx/xowa/Xop_ctx.java b/400_xowa/src_400_parser/gplx/xowa/Xop_ctx.java index 461486af3..b753c6147 100644 --- a/400_xowa/src_400_parser/gplx/xowa/Xop_ctx.java +++ b/400_xowa/src_400_parser/gplx/xowa/Xop_ctx.java @@ -235,17 +235,17 @@ public class Xop_ctx { } } } - public Xop_tkn_itm Stack_pop_til(Xop_root_tkn root, byte[] src, int til_idx, boolean include, int bgn_pos, int cur_pos, int closing_tkn_tid) { - if (stack_len == 0) return null; - int min_idx = include ? til_idx - 1 : til_idx; - if (min_idx < -1) min_idx = -1; + public Xop_tkn_itm Stack_pop_til(Xop_root_tkn root, byte[] src, int til_idx, boolean include, int bgn_pos, int cur_pos, int closing_tkn_tid) { // NOTE: closing_tkn_tid is a book-keeping variable to indicate who started auto-close; only used by xnde.AutoClose + if (stack_len == 0) return null; // nothing to pop; return; + int min_idx = include ? til_idx - 1 : til_idx; // if "include", auto-close tkn at til_idx; if not, auto-close to one before + if (min_idx < -1) min_idx = -1; // bounds-check; make sure til_idx was not -1, resulting in -2; NOTE: does not seem to be needed; DATE:2015-03-31 Xop_tkn_itm rv = null; - for (int i = stack_len - 1; i > min_idx; i--) { + for (int i = stack_len - 1; i > min_idx; i--) { // pop tkns going backwards rv = stack[i]; - Stack_autoClose(root, src, rv, bgn_pos, cur_pos, closing_tkn_tid); + Stack_auto_close(root, src, rv, bgn_pos, cur_pos, closing_tkn_tid); } Stack_pop_idx(til_idx); - return include ? rv : stack[stack_len]; // if include, return poppedTkn; if not, return tkn before poppedTkn + return include ? rv : stack[stack_len]; // if include, return popped_tkn; if not, return tkn before popped_tkn } public Xop_tkn_itm Stack_pop_before(Xop_root_tkn root, byte[] src, int til_idx, boolean include, int bgn_pos, int cur_pos, int closing_tkn_tid) { // used by Xop_tblw_lxr to detect \n| in lnki; seems useful as well if (stack_len == 0) return null; @@ -254,11 +254,11 @@ public class Xop_ctx { Xop_tkn_itm rv = null; for (int i = stack_len - 1; i > min_idx; i--) { rv = stack[i]; - Stack_autoClose(root, src, rv, bgn_pos, cur_pos, closing_tkn_tid); + Stack_auto_close(root, src, rv, bgn_pos, cur_pos, closing_tkn_tid); } return include ? rv : stack[stack_len]; // if include, return poppedTkn; if not, return tkn before poppedTkn } - public void Stack_autoClose(Xop_root_tkn root, byte[] src, Xop_tkn_itm tkn, int bgn_pos, int cur_pos, int closing_tkn_tid) { + public void Stack_auto_close(Xop_root_tkn root, byte[] src, Xop_tkn_itm tkn, int bgn_pos, int cur_pos, int closing_tkn_tid) { int src_len = src.length; switch (tkn.Tkn_tid()) { case Xop_tkn_itm_.Tid_newLine: break; // NOOP: just a marker diff --git a/400_xowa/src_400_parser/gplx/xowa/Xop_parser.java b/400_xowa/src_400_parser/gplx/xowa/Xop_parser.java index 1958f7bde..24b77c135 100644 --- a/400_xowa/src_400_parser/gplx/xowa/Xop_parser.java +++ b/400_xowa/src_400_parser/gplx/xowa/Xop_parser.java @@ -39,7 +39,7 @@ public class Xop_parser { // NOTE: parsers are reused; do not keep any read-writ public byte[] Parse_text_to_html(Xop_ctx ctx, byte[] src) { Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b512(); Parse_text_to_html(bfr, ctx.Cur_page(), false, src); - return bfr.Mkr_rls().Xto_bry_and_clear(); + return bfr.To_bry_and_rls(); } public void Parse_text_to_html(Bry_bfr trg, Xoae_page page, boolean para_enabled, byte[] src) { Xop_ctx ctx = Xop_ctx.new_sub_(wiki, page); diff --git a/400_xowa/src_400_parser/gplx/xowa/Xop_parser_.java b/400_xowa/src_400_parser/gplx/xowa/Xop_parser_.java index 776c3ed55..b68f2b084 100644 --- a/400_xowa/src_400_parser/gplx/xowa/Xop_parser_.java +++ b/400_xowa/src_400_parser/gplx/xowa/Xop_parser_.java @@ -32,6 +32,6 @@ public class Xop_parser_ { parser.Parse_wtxt_to_wdom(root, ctx, ctx.Tkn_mkr(), wtxt, Xop_parser_.Doc_bgn_bos); wiki.Html_mgr().Html_wtr().Write_all(bfr, ctx, wtxt, root); page.Lnki_file_mgr().Clear(); // NOTE: reset lnki_file_mgr else indicator will stop page from loading; DATE:2015-03-08 - return bfr.Mkr_rls().Xto_bry_and_clear(); + return bfr.To_bry_and_rls(); } } diff --git a/400_xowa/src_409_tkn_misc/gplx/xowa/Xop_under_lxr.java b/400_xowa/src_409_tkn_misc/gplx/xowa/Xop_under_lxr.java index 386b7fbd4..a714f15aa 100644 --- a/400_xowa/src_409_tkn_misc/gplx/xowa/Xop_under_lxr.java +++ b/400_xowa/src_409_tkn_misc/gplx/xowa/Xop_under_lxr.java @@ -56,7 +56,7 @@ class Xop_under_lxr implements Xop_lxr { if (kwd_case_match) // cs; add word directly to trie core_trie.Add(kwd_bry, word_lxr); else { // NOTE: next part is imprecise; XOWA parser is cs, but kwd is ci; for now, just add all upper and all lower - Gfo_usr_dlg_._.Warn_many("", "", "under keyword does not start with __; id=~{0} key=~{1} word=~{2}", kwd_id, String_.new_utf8_(kwd_grp.Key()), String_.new_utf8_(kwd_bry)); + Gfo_usr_dlg_.I.Warn_many("", "", "under keyword does not start with __; id=~{0} key=~{1} word=~{2}", kwd_id, String_.new_utf8_(kwd_grp.Key()), String_.new_utf8_(kwd_bry)); core_trie.Add(lang.Case_mgr().Case_build_lower(kwd_bry), word_lxr); core_trie.Add(lang.Case_mgr().Case_build_upper(kwd_bry), word_lxr); } diff --git a/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr.java b/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr.java index 2cd7951d6..27d589124 100644 --- a/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr.java +++ b/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr.java @@ -68,7 +68,7 @@ public class Xop_lnki_wkr implements Xop_ctx_wkr, Xop_arg_wkr { } if (lnki_is_file) { ctx.Cur_page().Lnki_list().Add(lnki); - if (file_wkr != null) file_wkr.Wkr_exec(ctx, src, lnki, gplx.xowa.bldrs.files.Xob_lnki_src_tid.Tid_file); + if (file_wkr != null) file_wkr.Wkr_exec(ctx, src, lnki, gplx.xowa.bldrs.cmds.files.Xob_lnki_src_tid.Tid_file); } Xoa_ttl lnki_ttl = lnki.Ttl(); if ( lnki_ttl.Wik_bgn() != -1 // lnki is xwiki diff --git a/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr__basic_tst.java b/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr__basic_tst.java index fa83e7aae..18b4d21a1 100644 --- a/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr__basic_tst.java +++ b/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr__basic_tst.java @@ -95,12 +95,12 @@ public class Xop_lnki_wkr__basic_tst { @Test public void Size_dangling_xnde() { // PURPOSE: dangling xnde should not eat rest of lnki; PAGE:sr.w:Сићевачка_клисура DATE:2014-07-03 fxt.Init_log_(Xop_xnde_log.Dangling_xnde).Test_parse_page_wiki("[[Image:a.png|c|40px]]" , fxt.tkn_lnki_().Width_(40).Height_(-1)); } - @Test public void Size_ws_para() { // PURPOSE:

    in arg_bldr causes parse to fail; EX: w:Supreme_Court_of_the_United_States; DATE:2014-04-05 + @Test public void Size_ws_para() { // PURPOSE:

    in arg_bldr causes parse to fail; EX: w:Supreme_Court_of_the_United_States; DATE:2014-04-05; updated test; DATE:2015-03-31 fxt.Init_para_y_(); fxt.Test_parse_page_all("[[File:A.png| \n 40px]]" , fxt.tkn_para_bgn_para_(0) , fxt.tkn_lnki_().Width_(40).Height_(-1) - , fxt.tkn_para_end_pre_(22)); // NOTE: this is wrong, but can be ignored b/c is not processed inside lnki + , fxt.tkn_para_end_para_(22)); fxt.Init_para_n_(); } diff --git a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_tag_lang.java b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_tag_lang.java index 6a2f2c9e4..2c12ae10d 100644 --- a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_tag_lang.java +++ b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_tag_lang.java @@ -28,5 +28,5 @@ public class Xop_xnde_tag_lang { public String Name_str() {return name_str;} private String name_str; public byte[] Name_bry() {return name_bry;} private byte[] name_bry; public byte[] XtnEndTag_tmp() {return xtnEndTag_tmp;} private byte[] xtnEndTag_tmp; - public static final Xop_xnde_tag_lang _ = new Xop_xnde_tag_lang(-1, String_.Empty); + public static final Xop_xnde_tag_lang _ = new Xop_xnde_tag_lang(-1, String_.Empty); } diff --git a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr.java b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr.java index 3fbea369b..db35e9738 100644 --- a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr.java +++ b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr.java @@ -466,7 +466,7 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { ctx.Msg_log().Add_itm_none(Xop_xnde_log.Auto_closing_section, src, bgn_nde.Src_bgn(), bgn_nde.Name_end()); } else - ctx.Stack_autoClose(root, src, tkn, bgn_pos, cur_pos, Xop_tkn_itm_.Tid_xnde); + ctx.Stack_auto_close(root, src, tkn, bgn_pos, cur_pos, Xop_tkn_itm_.Tid_xnde); } } } @@ -559,7 +559,7 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { if (tag_id == -1) {ctx.App().Usr_dlg().Warn_many("", "", "parser.xtn: could not extract int: page=~{0}", ctx.Cur_page().Url().Xto_full_str_safe()); return Bry_finder.Not_found;} Bry_bfr tmp = ctx.Wiki().Utl__bfr_mkr().Get_b128(); tmp.Add(Pfunc_tag.Xtag_end_lhs).Add_int_pad_bgn(Byte_ascii.Num_0, 10, tag_id).Add(Pfunc_tag.Xtag_rhs); - byte[] tag_end = tmp.Mkr_rls().Xto_bry_and_clear(); + byte[] tag_end = tmp.To_bry_and_rls(); int rv = Bry_finder.Find_fwd(src, tag_end, open_end + Pfunc_tag.Xtag_rhs.length); if (rv == Bry_finder.Not_found) {ctx.App().Usr_dlg().Warn_many("", "", "parser.xtn: could not find end: page=~{0}", ctx.Cur_page().Url().Xto_full_str_safe()); return Bry_finder.Not_found;} rv = Bry_finder.Find_bwd(src, Byte_ascii.Lt, rv - 1); diff --git a/400_xowa/src_500_tmpl/gplx/xowa/Xot_defn_tmpl.java b/400_xowa/src_500_tmpl/gplx/xowa/Xot_defn_tmpl.java index e3d14f224..79321012a 100644 --- a/400_xowa/src_500_tmpl/gplx/xowa/Xot_defn_tmpl.java +++ b/400_xowa/src_500_tmpl/gplx/xowa/Xot_defn_tmpl.java @@ -51,7 +51,7 @@ public class Xot_defn_tmpl implements Xot_defn { bfr.Add_mid(src, find_bgn_lhs, find_end); pos = find_end + Bry_onlyinclude_end_len; } - return bfr.Mkr_rls().Xto_bry_and_clear(); + return bfr.To_bry_and_rls(); } private static final byte[] Bry_onlyinclude_bgn = Bry_.new_ascii_(""), Bry_onlyinclude_end = Bry_.new_ascii_(""); private static int Bry_onlyinclude_bgn_len = Bry_onlyinclude_bgn.length, Bry_onlyinclude_end_len = Bry_onlyinclude_end.length; diff --git a/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_tkn.java b/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_tkn.java index 4c24578fc..b1c88bc86 100644 --- a/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_tkn.java +++ b/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_tkn.java @@ -18,6 +18,7 @@ along with this program. If not, see . package gplx.xowa; import gplx.*; import gplx.xowa.langs.*; import gplx.xowa.langs.vnts.*; import gplx.xowa.langs.cnvs.*; import gplx.xowa.wikis.caches.*; import gplx.xowa.xtns.scribunto.*; import gplx.xowa.xtns.pfuncs.*; import gplx.xowa.xtns.pfuncs.ttls.*; import gplx.xowa.pages.*; +import gplx.xowa.wikis.data.tbls.*; public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk { public Arg_nde_tkn Name_tkn() {return name_tkn;} public Xot_invk_tkn Name_tkn_(Arg_nde_tkn v) {name_tkn = v; return this;} Arg_nde_tkn name_tkn = Arg_nde_tkn.Null; public byte Defn_tid() {return defn_tid;} private byte defn_tid = Xot_defn_.Tid_null; @@ -192,8 +193,8 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk { } if ( defn.Defn_tid() == Xot_defn_.Tid_null // name is not a known defn && lang.Vnt_mgr().Enabled()) { // lang has vnts - Xodb_page page = lang.Vnt_mgr().Convert_ttl(wiki, wiki.Ns_mgr().Ns_template(), name_ary); - if (page != Xodb_page.Null) { + Xowd_page_itm page = lang.Vnt_mgr().Convert_ttl(wiki, wiki.Ns_mgr().Ns_template(), name_ary); + if (page != Xowd_page_itm.Null) { name_ary = page.Ttl_page_db(); Xoa_ttl ttl = Xoa_ttl.parse_(wiki, Bry_.Add(wiki.Ns_mgr().Ns_template().Name_db_w_colon(), name_ary)); if (ttl == null) { // ttl is not valid; just output orig; REF.MW:Parser.php|braceSubstitution|if ( !$found ) $text = $frame->virtualBracketedImplode( '{{', '|', '}}', $titleWithSpaces, $args ); diff --git a/400_xowa/src_500_tmpl/gplx/xowa/Xot_tmpl_wtr.java b/400_xowa/src_500_tmpl/gplx/xowa/Xot_tmpl_wtr.java index 55f80c5e2..0bb83a19c 100644 --- a/400_xowa/src_500_tmpl/gplx/xowa/Xot_tmpl_wtr.java +++ b/400_xowa/src_500_tmpl/gplx/xowa/Xot_tmpl_wtr.java @@ -23,7 +23,7 @@ public class Xot_tmpl_wtr { rslt_bfr.Reset_if_gt(Io_mgr.Len_mb); Write_tkn(ctx, src, src.length, rslt_bfr, root); ctx.Tmpl_output_(null); - return rslt_bfr.Mkr_rls().Xto_bry_and_clear(); + return rslt_bfr.To_bry_and_rls(); } private void Write_tkn(Xop_ctx ctx, byte[] src, int src_len, Bry_bfr rslt_bfr, Xop_tkn_itm tkn) { switch (tkn.Tkn_tid()) { diff --git a/tst/400_xowa/root/wiki/en.wikipedia.org/a.xml b/tst/400_xowa/root/wiki/en.wikipedia.org/a.xml new file mode 100644 index 000000000..52e0a2001 --- /dev/null +++ b/tst/400_xowa/root/wiki/en.wikipedia.org/a.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tst/400_xowa/root/wiki/en.wikipedia.org/xowa.wiki.image.sqlite3 b/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-text.xowa similarity index 51% rename from tst/400_xowa/root/wiki/en.wikipedia.org/xowa.wiki.image.sqlite3 rename to tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-text.xowa index 4a452cbf5..f5cc044c2 100644 Binary files a/tst/400_xowa/root/wiki/en.wikipedia.org/xowa.wiki.image.sqlite3 and b/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-text.xowa differ diff --git a/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org.000.sqlite3 b/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org.000.sqlite3 deleted file mode 100644 index d94b70397..000000000 Binary files a/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org.000.sqlite3 and /dev/null differ diff --git a/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org.001.sqlite3 b/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org.001.sqlite3 deleted file mode 100644 index 79dd157d4..000000000 Binary files a/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org.001.sqlite3 and /dev/null differ diff --git a/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org.002.sqlite3 b/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org.002.sqlite3 deleted file mode 100644 index 6778de16f..000000000 Binary files a/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org.002.sqlite3 and /dev/null differ diff --git a/tst/400_xowa/root/wiki/en.wikipedia.org/oimg_image.sqlite3 b/tst/400_xowa/root/wiki/en.wikipedia.org/oimg_image.sqlite3 deleted file mode 100644 index 3c4cee356..000000000 Binary files a/tst/400_xowa/root/wiki/en.wikipedia.org/oimg_image.sqlite3 and /dev/null differ diff --git a/tst/400_xowa/root/wiki/en.wikipedia.org/page_props.sql b/tst/400_xowa/root/wiki/en.wikipedia.org/page_props.sql deleted file mode 100644 index 70a64cda7..000000000 --- a/tst/400_xowa/root/wiki/en.wikipedia.org/page_props.sql +++ /dev/null @@ -1 +0,0 @@ -INSERT INTO `page_props` VALUES (1,'hiddencat',''),(2,'pageimage','A.png'),(3,'hiddencat',''); \ No newline at end of file diff --git a/tst/400_xowa/root/wiki/en.wikipedia.org/tmp/oimg.image/dump/0000000000.csv b/tst/400_xowa/root/wiki/en.wikipedia.org/tmp/oimg.image/dump/0000000000.csv deleted file mode 100644 index b28b04f64..000000000 --- a/tst/400_xowa/root/wiki/en.wikipedia.org/tmp/oimg.image/dump/0000000000.csv +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/tst/400_xowa/root/wiki/en.wikipedia.org/tmp/import.sql.category_registry/0000000000.csv b/tst/400_xowa/root/wiki/en.wikipedia.org/tmp/text.cat.core/0000000000.csv similarity index 100% rename from tst/400_xowa/root/wiki/en.wikipedia.org/tmp/import.sql.category_registry/0000000000.csv rename to tst/400_xowa/root/wiki/en.wikipedia.org/tmp/text.cat.core/0000000000.csv diff --git a/tst/400_xowa/root/wiki/en.wikipedia.org/tmp/import.sql.hiddencat/dump/0000000000.csv b/tst/400_xowa/root/wiki/en.wikipedia.org/tmp/text.cat.hidden/dump/0000000000.csv similarity index 100% rename from tst/400_xowa/root/wiki/en.wikipedia.org/tmp/import.sql.hiddencat/dump/0000000000.csv rename to tst/400_xowa/root/wiki/en.wikipedia.org/tmp/text.cat.hidden/dump/0000000000.csv diff --git a/tst/400_xowa/root/wiki/en.wikipedia.org/tmp/import.sql.categorylinks/dump/0000000000.csv b/tst/400_xowa/root/wiki/en.wikipedia.org/tmp/text.cat.link/dump/0000000000.csv similarity index 100% rename from tst/400_xowa/root/wiki/en.wikipedia.org/tmp/import.sql.categorylinks/dump/0000000000.csv rename to tst/400_xowa/root/wiki/en.wikipedia.org/tmp/text.cat.link/dump/0000000000.csv diff --git a/tst/400_xowa/root/wiki/en.wikipedia.org/tmp/import.sql.categorylinks/sort/0000000000.csv b/tst/400_xowa/root/wiki/en.wikipedia.org/tmp/text.cat.link/sort/0000000000.csv similarity index 100% rename from tst/400_xowa/root/wiki/en.wikipedia.org/tmp/import.sql.categorylinks/sort/0000000000.csv rename to tst/400_xowa/root/wiki/en.wikipedia.org/tmp/text.cat.link/sort/0000000000.csv diff --git a/tst/400_xowa/root/wiki/en.wikipedia.org/tmp/wiki.image/dump/0000000000.csv b/tst/400_xowa/root/wiki/en.wikipedia.org/tmp/wiki.image/dump/0000000000.csv deleted file mode 100644 index b28b04f64..000000000 --- a/tst/400_xowa/root/wiki/en.wikipedia.org/tmp/wiki.image/dump/0000000000.csv +++ /dev/null @@ -1,3 +0,0 @@ - - -

    \"" + , " \"" , " b" , " 2004-01-02 00:00:00
    3.000.sqlite33.xowa1 KB2004-01-03 00:00:00