v3.3.4 v3.3.4.1
gnosygnu 8 years ago
parent de67253a9c
commit baaef32df2

@ -1,17 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>100_core</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

@ -20,9 +20,9 @@ import java.lang.*;
import gplx.core.brys.*; import gplx.core.primitives.*; import gplx.core.ios.*;
public class Bry_ {
public static final String Cls_val_name = "byte[]";
public static final byte[] Empty = new byte[0];
public static final byte[][] Ary_empty = new byte[0][];
public static final Class<?> Cls_ref_type = byte[].class;
public static final byte[] Empty = new byte[0];
public static final byte[][] Ary_empty = new byte[0][];
public static final Class<?> Cls_ref_type = byte[].class;
public static byte[] cast(Object val) {return (byte[])val;}
public static byte[] New_by_byte(byte b) {return new byte[] {b};}
public static byte[] New_by_ints(int... ary) {
@ -403,7 +403,7 @@ public class Bry_ {
}
return rv;
}
public static final byte[] Trim_ary_ws = mask_(256, Byte_ascii.Tab, Byte_ascii.Nl, Byte_ascii.Cr, Byte_ascii.Space);
public static final byte[] Trim_ary_ws = mask_(256, Byte_ascii.Tab, Byte_ascii.Nl, Byte_ascii.Cr, Byte_ascii.Space);
public static byte[] Trim(byte[] src) {return Trim(src, 0, src.length, true, true, Trim_ary_ws);}
public static byte[] Trim(byte[] src, int bgn, int end) {return Trim(src, bgn, end, true, true, Trim_ary_ws);}
public static byte[] Trim(byte[] src, int bgn, int end, boolean trim_bgn, boolean trim_end, byte[] trim_ary) {
@ -766,8 +766,8 @@ public class Bry_ {
if (!Bry_.Eq(lhs[i], rhs[i])) return false;
return true;
}
public static final byte Dlm_fld = (byte)'|', Dlm_row = (byte)'\n', Dlm_quote = (byte)'"', Dlm_null = 0, Ascii_zero = 48;
public static final String Fmt_csvDte = "yyyyMMdd HHmmss.fff";
public static final byte Dlm_fld = (byte)'|', Dlm_row = (byte)'\n', Dlm_quote = (byte)'"', Dlm_null = 0, Ascii_zero = 48;
public static final String Fmt_csvDte = "yyyyMMdd HHmmss.fff";
public static DateAdp ReadCsvDte(byte[] ary, Int_obj_ref posRef, byte lkp) {// ASSUME: fmt = yyyyMMdd HHmmss.fff
int y = 0, M = 0, d = 0, H = 0, m = 0, s = 0, f = 0;
int bgn = posRef.Val();
@ -1017,6 +1017,29 @@ public class Bry_ {
}
return dirty ? bfr.To_bry_and_clear() : src;
}
public static byte[] Resolve_escape(Bry_bfr bfr, byte escape, byte[] raw, int bgn, int end) {
int pos = bgn;
boolean dirty = false;
while (pos < end) {
byte b = raw[pos];
if (b == escape) {
if (!dirty) {
dirty = true;
bfr.Add_mid(raw, bgn, pos);
}
++pos;
if (pos < end) { // check for eos; note that this ignores trailing "\"; EX: "a\" -> "a"
bfr.Add_byte(raw[pos]);
++pos;
}
}
else {
if (dirty) bfr.Add_byte(b);
++pos;
}
}
return dirty ? bfr.To_bry_and_clear() : raw;
}
public static void Clear(byte[] bry) {
int len = bry.length;
for (int i = 0; i < len; ++i)

@ -317,6 +317,10 @@ public class Bry_bfr {
Add_str_u8(ary[i]);
return this;
}
public Bry_bfr Add_str_u8_fmt(String fmt, Object... args) {
Add_str_u8(String_.Format(fmt, args));
return this;
}
public Bry_bfr Add_str_a7_null(String s) {return Add_str_a7(s == null ? String_.Null_mark : s);}
public Bry_bfr Add_str_a7_w_nl(String s) {Add_str_a7(s); return Add_byte_nl();}
public Bry_bfr Add_str_a7(String str) {

@ -182,7 +182,7 @@ public class Bry_find_ {
return bgn;
}
public static int Find_bwd__skip(byte[] src, int end, int bgn, byte skip) {
int src_len = src.length; if (end == src_len) return end;
int src_len = src.length; // if (end == src_len) return end;
if (end > src_len || end < 0) return Bry_find_.Not_found;
int pos = end - 1; // start from end - 1; handles situations where len is passed in
for (int i = pos; i >= bgn; --i) {
@ -191,6 +191,17 @@ public class Bry_find_ {
}
return bgn;
}
public static int Find_bwd__skip(byte[] src, int end, int bgn, byte[] skip) {
int src_len = src.length;
if (end > src_len || end < 0) return Bry_find_.Not_found;
int skip_len = skip.length;
int pos = end - skip_len; // start from end - 1; handles situations where len is passed in
for (int i = pos; i >= bgn; --i) {
if (!Bry_.Eq(src, i, i + skip_len, skip))
return i + skip_len;
}
return bgn;
}
public static int Find_bwd_while(byte[] src, int cur, int end, byte while_byte) {
--cur;
while (true) {

@ -15,32 +15,37 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.core.brys.fmtrs; import gplx.*; import gplx.core.*; import gplx.core.brys.*;
package gplx;
import gplx.core.brys.*; import gplx.core.brys.fmts.*;
public class Bry_fmt {
private byte[] src;
private Bry_fmt_itm[] itms; private int itms_len;
private Bfr_fmt_arg[] args = Bfr_fmt_arg.Ary_empty;
private byte[][] keys = Bry_.Ary_empty;
private Object[] vals = null;
private boolean dirty;
public Bry_fmt(byte[] src, byte[][] keys, Bfr_fmt_arg[] args) {
dirty = true;
this.src = src; this.keys = keys; this.args = args;
}
public byte[] Fmt() {return src;}
public Bry_fmt Fmt_(String v) {dirty = true; src = Bry_.new_u8(v); return this;}
public Bry_fmt Args_(Bfr_fmt_arg... v) {dirty = true; args = v; return this;}
public Bry_fmt Keys_(String... v) {return Keys_(Bry_.Ary(v));}
public Bry_fmt Keys_(byte[]... v) {dirty = true; keys = v; return this;}
public String Bld_many_to_str_auto_bfr(Object... vals) {
public Bry_fmt Vals_(Object... v) {vals = v; return this;}
public String Bld_many_to_str_auto_bfr(Object... vals_ary) {
Bry_bfr bfr = Bry_bfr_.Get();
try {return Bld_many_to_str(bfr, vals);}
try {return Bld_many_to_str(bfr, vals_ary);}
finally {bfr.Mkr_rls();}
}
public String Bld_many_to_str(Bry_bfr bfr, Object... vals) {
Bld_many(bfr, vals);
public String Bld_many_to_str(Bry_bfr bfr, Object... vals_ary) {
Bld_many(bfr, vals_ary);
return bfr.To_str_and_clear();
}
public void Bld_many(Bry_bfr bfr, Object... vals) {
public void Bld_many(Bry_bfr bfr, Object... vals_ary) {
if (dirty) Compile();
int vals_len = vals.length;
int vals_len = vals_ary.length;
for (int i = 0; i < itms_len; ++i) {
Bry_fmt_itm itm = itms[i];
switch (itm.Tid) {
@ -49,7 +54,7 @@ public class Bry_fmt {
case Bry_fmt_itm.Tid__key:
int idx = itm.Key_idx;
if (idx > -1 && idx < vals_len)
bfr.Add_obj(vals[idx]);
bfr.Add_obj(vals_ary[idx]);
else
bfr.Add_mid(src, itm.Src_bgn, itm.Src_end);
break;
@ -57,6 +62,7 @@ public class Bry_fmt {
}
}
}
public String To_str() {return Bld_many_to_str_auto_bfr(vals);}
private void Compile() {
dirty = false;
this.itms = Bry_fmt_parser_.Parse(Byte_ascii.Tilde, Byte_ascii.Curly_bgn, Byte_ascii.Curly_end, args, keys, src);
@ -64,18 +70,10 @@ public class Bry_fmt {
}
public static Bry_fmt New(String fmt, String... keys) {return new Bry_fmt(Bry_.new_u8(fmt), Bry_.Ary(keys), Bfr_fmt_arg.Ary_empty);}
public static Bry_fmt New(byte[] fmt, String... keys) {return new Bry_fmt(fmt , Bry_.Ary(keys), Bfr_fmt_arg.Ary_empty);}
}
class Bry_fmt_itm {
public Bry_fmt_itm(int tid, int src_bgn, int src_end) {
this.Tid = tid;
this.Src_bgn = src_bgn;
this.Src_end = src_end;
public static String Make_str(String fmt_str, Object... vals) {return Auto(fmt_str).Vals_(vals).To_str();}
public static Bry_fmt Auto(String fmt_str) {
byte[] fmt_bry = Bry_.new_u8(fmt_str);
byte[][] keys_bry = Bry_fmt_parser_.Parse_keys(fmt_bry);
return new Bry_fmt(fmt_bry, keys_bry, Bfr_fmt_arg.Ary_empty);
}
public int Tid;
public int Src_bgn;
public int Src_end;
public int Key_idx;
public Bfr_arg Arg;
public static final int Tid__txt = 0, Tid__key = 1, Tid__arg = 2;
}

@ -120,7 +120,7 @@ public class Byte_ascii {
, Pipe_bry = new byte[] {Byte_ascii.Pipe}
, Underline_bry = new byte[] {Byte_ascii.Underline}
, Slash_bry = new byte[] {Byte_ascii.Slash}
, Asterisk_bry = new byte[] {Byte_ascii.Star}
, Star_bry = new byte[] {Byte_ascii.Star}
, Dash_bry = new byte[] {Byte_ascii.Dash}
, Cr_lf_bry = new byte[] {Byte_ascii.Cr, Byte_ascii.Nl}
;

@ -19,5 +19,4 @@ package gplx;
public interface Cancelable {
boolean Canceled();
void Cancel();
void Cancel_reset();
}

@ -23,11 +23,9 @@ public class Cancelable_ {
class Cancelable_never implements Cancelable {
public boolean Canceled() {return false;}
public void Cancel() {}
public void Cancel_reset() {}
}
class Cancelable_proxy implements Cancelable {
private boolean canceled = false;
public boolean Canceled() {return canceled;}
public void Cancel() {canceled = true;}
public void Cancel_reset() {canceled = false;}
}

@ -39,7 +39,9 @@ public class Decimal_adp implements CompareAble {
return tmp .stripTrailingZeros() // NOTE: stripTrailingZeros for exp tests; EX: 120.0 -> 120; 0.01200000000000 -> .012
.toPlainString(); // NOTE: toPlainString b/c stripTrailingZeros now converts 120 to 1.2E+2 (and any other value that is a multiple of 10)
}
public String To_str(String fmt) {return new DecimalFormat(fmt).format(under);}
public String To_str(String fmt) {
return new DecimalFormat(fmt).format(under);
}
@Override public String toString() {return under.toString();}
public int To_int() {return (int)under.doubleValue();}
public long To_long() {return (long)under.doubleValue();}

@ -59,6 +59,7 @@ public class Decimal_adp__tst {
fxt.Test_to_str_fmt(1, 2, "0.0", "0.5");
fxt.Test_to_str_fmt(1, 3, "0.0", "0.3");
fxt.Test_to_str_fmt(10000, 7, "0,000.000", "1,428.571");
fxt.Test_to_str_fmt(1, 2, "00.00", "00.50");
}
@Test public void Round() {
fxt.Test_round("123.456", 3, "123.456");

@ -27,17 +27,17 @@ public class GfoEvMgr_ {
}
}
public static void Pub(GfoEvMgrOwner pub, String pubEvt) {pub.EvMgr().Pub(GfsCtx.new_(), pubEvt, GfoMsg_.new_cast_(pubEvt));}
public static void PubObj(GfoEvMgrOwner pub, String pubEvt, String key, Object v) {pub.EvMgr().Pub(GfsCtx.new_(), pubEvt, msg_(pubEvt, KeyVal_.new_(key, v)));}
public static void PubVal(GfoEvMgrOwner pub, String pubEvt, Object v) {pub.EvMgr().Pub(GfsCtx.new_(), pubEvt, msg_(pubEvt, KeyVal_.new_("v", v)));}
public static void PubVals(GfoEvMgrOwner pub, String pubEvt, KeyVal... ary) {pub.EvMgr().Pub(GfsCtx.new_(), pubEvt, msg_(pubEvt, ary));}
public static void PubObj(GfoEvMgrOwner pub, String pubEvt, String key, Object v) {pub.EvMgr().Pub(GfsCtx.new_(), pubEvt, msg_(pubEvt, Keyval_.new_(key, v)));}
public static void PubVal(GfoEvMgrOwner pub, String pubEvt, Object v) {pub.EvMgr().Pub(GfsCtx.new_(), pubEvt, msg_(pubEvt, Keyval_.new_("v", v)));}
public static void PubVals(GfoEvMgrOwner pub, String pubEvt, Keyval... ary) {pub.EvMgr().Pub(GfsCtx.new_(), pubEvt, msg_(pubEvt, ary));}
public static void PubMsg(GfoEvMgrOwner pub, GfsCtx ctx, String pubEvt, GfoMsg m) {pub.EvMgr().Pub(ctx, pubEvt, m);}
public static void Lnk(GfoEvMgrOwner pub, GfoEvMgrOwner sub) {sub.EvMgr().Lnk(pub);}
public static void RlsPub(GfoEvMgrOwner pub) {pub.EvMgr().RlsPub(pub);}
public static void RlsSub(GfoEvMgrOwner sub) {sub.EvMgr().RlsSub(sub);}
static GfoMsg msg_(String evt, KeyVal... kvAry) {
static GfoMsg msg_(String evt, Keyval... kvAry) {
GfoMsg m = GfoMsg_.new_cast_(evt);
for (int i = 0; i < kvAry.length; i++) {
KeyVal kv = kvAry[i];
Keyval kv = kvAry[i];
m.Add(kv.Key(), kv.Val());
}
return m;

@ -34,7 +34,7 @@ public class GfoInvkXtoStr {
invk.Invk(ctx, 0, k, m);
GfoMsg rv = GfoMsg_.new_cast_(k);
for (int i = 0; i < m.Args_count(); i++) {
KeyVal kv = m.Args_getAt(i);
Keyval kv = m.Args_getAt(i);
rv.Add(kv.Key(), ary[i]);
}
GfoMsg root = GfoMsg_.new_cast_(invkKey);

@ -25,7 +25,7 @@ public interface GfoMsg {
GfoMsg Parse_(boolean v);
int Args_count();
KeyVal Args_getAt(int i);
Keyval Args_getAt(int i);
GfoMsg Args_ovr(String k, Object v);
void Args_reset();
GfoMsg Add(String k, Object v);

@ -28,7 +28,7 @@ public class GfoMsg_ {
return rv;
}
public static GfoMsg root_(String... ary) {return root_leafArgs_(ary);}
public static GfoMsg root_leafArgs_(String[] ary, KeyVal... kvAry) {
public static GfoMsg root_leafArgs_(String[] ary, Keyval... kvAry) {
int len = Array_.Len(ary); if (len == 0) throw Err_.new_invalid_arg("== 0", "@len", len);
GfoMsg root = new GfoMsg_base().ctor_(ary[0], false);
GfoMsg owner = root;
@ -39,7 +39,7 @@ public class GfoMsg_ {
owner = cur;
}
for (int i = 0; i < kvAry.length; i++) {
KeyVal kv = kvAry[i];
Keyval kv = kvAry[i];
owner.Add(kv.Key(), kv.Val());
}
return root;
@ -78,14 +78,14 @@ public class GfoMsg_ {
class GfoMsg_wtr extends GfoMsg_base {
@Override protected Object ReadOr(String k, Object defaultOr) {
if (args == null) args = List_adp_.new_();
args.Add(KeyVal_.new_(k, null));
args.Add(Keyval_.new_(k, null));
return defaultOr;
}
}
class GfoMsg_rdr extends GfoMsg_base {
@Override protected Object ReadOr(String k, Object defaultOr) {
if (args == null) args = List_adp_.new_();
args.Add(KeyVal_.new_(k, defaultOr));
args.Add(Keyval_.new_(k, defaultOr));
return defaultOr;
}
}
@ -113,23 +113,23 @@ class GfoMsg_base implements GfoMsg {
sub.Args_reset();
}
}
public KeyVal Args_getAt(int i) {return args == null ? null : (KeyVal)args.Get_at(i);}
public Keyval Args_getAt(int i) {return args == null ? null : (Keyval)args.Get_at(i);}
public GfoMsg Args_ovr(String k, Object v) {
if (args == null) args = List_adp_.new_();
for (int i = 0; i < args.Count(); i++) {
KeyVal kv = (KeyVal)args.Get_at(i);
Keyval kv = (Keyval)args.Get_at(i);
if (String_.Eq(k, kv.Key())) {
kv.Val_(v);
return this;
}
}
args.Add(KeyVal_.new_(k, v));
args.Add(Keyval_.new_(k, v));
return this;
}
public GfoMsg Parse_(boolean v) {parse = v; return this;}
public GfoMsg Add(String k, Object v) {
if (args == null) args = List_adp_.new_();
args.Add(KeyVal_.new_(k, v));
args.Add(Keyval_.new_(k, v));
return this;
}
public boolean ReadBool(String k) {Object rv = ReadOr(k,false); if (rv == Nil) ThrowNotFound(k); return parse ? Yn.parse_or((String)rv, false) : Bool_.cast(rv);}
@ -177,13 +177,13 @@ class GfoMsg_base implements GfoMsg {
if (args == null) return Nil; // WORKAROUND.gfui: args null for DataBndr_whenEvt_execCmd
if (!String_.Eq(k, "")) {
for (int i = 0; i < args.Count(); i++) {
KeyVal kv = (KeyVal)args.Get_at(i);
Keyval kv = (Keyval)args.Get_at(i);
if (String_.Eq(k, kv.Key())) return kv.Val();
}
}
if (counter >= args.Count()) return Nil;
for (int i = 0; i < args.Count(); i++) {
KeyVal kv = (KeyVal)args.Get_at(i);
Keyval kv = (Keyval)args.Get_at(i);
if (String_.Eq(kv.Key(), "") && i >= counter) {
counter++;
return kv.Val();
@ -196,7 +196,7 @@ class GfoMsg_base implements GfoMsg {
if (this.Args_count() == 0) return "<<EMPTY>>";
String_bldr sb = String_bldr_.new_();
for (int i = 0; i < this.Args_count(); i++) {
KeyVal rv = (KeyVal)this.Args_getAt(i);
Keyval rv = (Keyval)this.Args_getAt(i);
sb.Add_fmt("{0};", rv.Key());
}
return sb.To_str();
@ -231,7 +231,7 @@ class GfoMsg_base implements GfoMsg {
sb.Add(":");
boolean first = true;
for (int i = 0; i < m.Args_count(); i++) {
KeyVal kv = m.Args_getAt(i);
Keyval kv = m.Args_getAt(i);
if (kv.Val() == null) continue;
if (!first) sb.Add(" ");
sb.Add(kv.Key());

@ -22,7 +22,7 @@ public class GfoMsg_tst {
GfsCore.Instance.AddObj(new Mok(), "Mok");
}
@Test public void Write1() {
GfoMsg m = GfoMsg_.root_leafArgs_(String_.Ary("a", "b"), KeyVal_.new_("int0", 1));
GfoMsg m = GfoMsg_.root_leafArgs_(String_.Ary("a", "b"), Keyval_.new_("int0", 1));
tst_Msg(m, "a.b:int0='1';");
}
@Test public void Write() {

@ -53,7 +53,7 @@ public class Gfo_usr_dlg_ {
}
class Gfo_usr_dlg_noop implements Gfo_usr_dlg {
public boolean Canceled() {return false;} public void Canceled_y_() {} public void Canceled_n_() {}
public void Cancel() {} public void Cancel_reset() {}
public void Cancel() {}
public void Clear() {}
public Gfo_usr_dlg__log Log_wkr() {return Gfo_usr_dlg__log_.Noop;} public void Log_wkr_(Gfo_usr_dlg__log v) {}
public Gfo_usr_dlg__gui Gui_wkr() {return Gfo_usr_dlg__gui_.Noop;} public void Gui_wkr_(Gfo_usr_dlg__gui v) {}

@ -21,6 +21,8 @@ public class Gfo_usr_dlg__gui_ {
public static final Gfo_usr_dlg__gui Noop = new Gfo_usr_dlg__gui_noop();
public static final Gfo_usr_dlg__gui Console = new Gfo_usr_dlg__gui_console();
public static final Gfo_usr_dlg__gui Test = new Gfo_usr_dlg__gui_test();
public static final Gfo_usr_dlg__gui Mem = new Gfo_usr_dlg__gui_mem_string();
public static String Mem_file() {return ((Gfo_usr_dlg__gui_mem_string)Mem).file;}
}
class Gfo_usr_dlg__gui_noop implements Gfo_usr_dlg__gui {
public void Clear() {}
@ -39,3 +41,12 @@ class Gfo_usr_dlg__gui_console implements Gfo_usr_dlg__gui {
public void Write_warn(String text) {console.Write_str_w_nl(text);}
public void Write_stop(String text) {console.Write_str_w_nl(text);}
}
class Gfo_usr_dlg__gui_mem_string implements Gfo_usr_dlg__gui {
public String file = "";
public void Clear() {file = "";}
public String_ring Prog_msgs() {return ring;} private final String_ring ring = new String_ring().Max_(0);
public void Write_prog(String text) {file += text + "\n";}
public void Write_note(String text) {file += text + "\n";}
public void Write_warn(String text) {file += text + "\n";}
public void Write_stop(String text) {file += text + "\n";}
}

@ -18,13 +18,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx;
import gplx.core.brys.fmtrs.*;
public class Gfo_usr_dlg_base implements Gfo_usr_dlg {
private final Bry_bfr tmp_bfr = Bry_bfr.reset_(255);
private final Bry_fmtr tmp_fmtr = Bry_fmtr.tmp_().Fail_when_invalid_escapes_(false); // do not fail b/c msgs may contain excerpt of random text; EX:[[User:A|~A~]] DATE:2014-11-28
private final Bry_bfr tmp_bfr = Bry_bfr.reset_(255);
private final Bry_fmtr tmp_fmtr = Bry_fmtr.tmp_().Fail_when_invalid_escapes_(false); // do not fail b/c msgs may contain excerpt of random text; EX:[[User:A|~A~]] DATE:2014-11-28
public Gfo_usr_dlg_base(Gfo_usr_dlg__log log_wkr, Gfo_usr_dlg__gui gui_wkr) {this.log_wkr = log_wkr; this.gui_wkr = gui_wkr;}
public Gfo_usr_dlg__log Log_wkr() {return log_wkr;} public void Log_wkr_(Gfo_usr_dlg__log v) {log_wkr = v;} private Gfo_usr_dlg__log log_wkr;
public Gfo_usr_dlg__gui Gui_wkr() {return gui_wkr;} public void Gui_wkr_(Gfo_usr_dlg__gui v) {gui_wkr = v;} private Gfo_usr_dlg__gui gui_wkr;
public boolean Canceled() {return canceled;} public void Canceled_y_() {canceled = true;} public void Canceled_n_() {canceled = false;} private boolean canceled;
public void Cancel() {canceled = true;} public void Cancel_reset() {canceled = false;}
public void Cancel() {canceled = true;}
public String Log_many(String grp_key, String msg_key, String fmt, Object... args) {String rv = Bld_msg_many(grp_key, msg_key, fmt, args ); log_wkr.Log_to_session(rv); return rv;}
public String Warn_many(String grp_key, String msg_key, String fmt, Object... args) {String rv = Bld_msg_many(grp_key, msg_key, fmt, args ); log_wkr.Log_to_err(rv); gui_wkr.Write_warn(rv); return rv;}
public String Prog_many(String grp_key, String msg_key, String fmt, Object... args) {String rv = Bld_msg_many(grp_key, msg_key, fmt, args ); gui_wkr.Write_prog(rv); return rv;}
@ -45,12 +45,16 @@ public class Gfo_usr_dlg_base implements Gfo_usr_dlg {
return rv;
}
private String Bld_msg_many(String grp_key, String msg_key, String fmt, Object[] args) {
tmp_fmtr.Fmt_(fmt).Bld_bfr_many(tmp_bfr, args);
return tmp_bfr.To_str_and_clear();
synchronized (tmp_fmtr) {
tmp_fmtr.Fmt_(fmt).Bld_bfr_many(tmp_bfr, args);
return tmp_bfr.To_str_and_clear();
}
}
private String Bld_msg_one(String grp_key, String msg_key, String fmt, Object val) {
tmp_fmtr.Fmt_(fmt).Bld_bfr_one(tmp_bfr, val);
return tmp_bfr.To_str_and_clear();
synchronized (tmp_fmtr) {
tmp_fmtr.Fmt_(fmt).Bld_bfr_one(tmp_bfr, val);
return tmp_bfr.To_str_and_clear();
}
}
private String Bld_msg_none(String grp_key, String msg_key, String fmt) {return fmt;}
}

@ -37,6 +37,7 @@ public class Hash_adp_bry extends gplx.core.lists.Hash_adp_base implements Hash_
Object o = Get_by_mid(key, bgn, end);
return (o == null) ? or : ((Int_obj_val)o).Val();
}
public byte Get_as_byte_or(byte[] key, byte or) {return Get_as_byte_or(key, 0, key.length, or);}
public byte Get_as_byte_or(byte[] key, int bgn, int end, byte or) {
Object o = Get_by_mid(key, bgn, end);
return o == null ? or : ((Byte_obj_val)o).Val();

@ -178,6 +178,7 @@ public class Int_ implements GfoInvkAble {
}
return rv;
}
public static int Subtract_long(long lhs, long rhs) {return (int)(lhs - rhs);}
public static int To_int_hex(byte b) {
switch (b) {
case Byte_ascii.Num_0: case Byte_ascii.Num_1: case Byte_ascii.Num_2: case Byte_ascii.Num_3: case Byte_ascii.Num_4:
@ -252,9 +253,10 @@ public class Int_ implements GfoInvkAble {
}
public static byte[] To_bry(int v) {return Bry_.new_a7(To_str(v));}
public static final int
Min_value = Integer.MIN_VALUE
, Max_value = Integer.MAX_VALUE
, Neg1 = -1
, Neg1_count = -1
Min_value = Integer.MIN_VALUE
, Max_value = Integer.MAX_VALUE
, Max_value__31 = 2147483647
, Neg1 = -1
, Neg1_count = -1
;
}

@ -16,17 +16,17 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx;
public class KeyVal implements To_str_able {
@gplx.Internal protected KeyVal(int key_tid, Object key, Object val) {this.key_tid = key_tid; this.key = key; this.val = val;}
public String Key() {return Object_.Xto_str_strict_or_null(key);}
public int Key_tid() {return key_tid;} private int key_tid;
public Object Key_as_obj() {return key;} private Object key;
public Object Val() {return val;} private Object val;
public String Val_to_str_or_empty() {return Object_.Xto_str_strict_or_empty(val);}
public String Val_to_str_or_null() {return Object_.Xto_str_strict_or_null(val);}
public byte[] Val_to_bry() {return Bry_.new_u8(Object_.Xto_str_strict_or_null(val));}
public KeyVal Key_(Object v) {this.key = v; return this;}
public KeyVal Val_(Object v) {this.val = v; return this;}
public class Keyval implements To_str_able {
@gplx.Internal protected Keyval(int key_tid, Object key, Object val) {this.key_tid = key_tid; this.key = key; this.val = val;}
public String Key() {return Object_.Xto_str_strict_or_null(key);}
public Object Key_as_obj() {return key;} private Object key;
public int Key_tid() {return key_tid;} private int key_tid;
public Object Val() {return val;} private Object val;
public String Val_to_str_or_empty() {return Object_.Xto_str_strict_or_empty(val);}
public String Val_to_str_or_null() {return Object_.Xto_str_strict_or_null(val);}
public byte[] Val_to_bry() {return Bry_.new_u8(Object_.Xto_str_strict_or_null(val));}
public Keyval Key_(Object v) {this.key = v; return this;}
public Keyval Val_(Object v) {this.val = v; return this;}
public String To_str() {return Key() + "=" + Object_.Xto_str_strict_or_null_mark(val);}
@Override public String toString() {return To_str();}
public String To_str() {return Key() + "=" + Object_.Xto_str_strict_or_null_mark(val);}
}

@ -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 <http://www.gnu.org/licenses/>.
*/
package gplx;
public class KeyValHash {
private Ordered_hash hash = Ordered_hash_.New();
public int Count() {return hash.Count();}
public KeyValHash Clear() {hash.Clear(); return this;}
public boolean Has(String key) {return hash.Has(key);}
public KeyVal Get_at(int i) {return (KeyVal)hash.Get_at(i);}
public Object FetchValOr(String key, Object or) {KeyVal rv = FetchOrNull(key); return rv == null ? or : rv.Val();}
public Object FetchValOrNull(String key) {return FetchValOr(key, null);}
public Object FetchValOrFail(String key) {return KeyVal_.as_(hash.Get_by_or_fail(key)).Val();}
public KeyValHash Add(KeyVal kv) {hash.Add(kv.Key(), kv); return this;}
public KeyValHash Add(String key, Object val) {hash.Add(key, KeyVal_.new_(key, val)); return this;}
public KeyValHash Add_if_dupe_use_nth(String key, Object val) {hash.Add_if_dupe_use_nth(key, KeyVal_.new_(key, val)); return this;}
public void Del(String key) {hash.Del(key);}
public KeyVal[] Xto_bry() {
KeyVal[] rv = new KeyVal[this.Count()];
for (int i = 0; i < rv.length; i++)
rv[i] = this.Get_at(i);
return rv;
}
public static KeyValHash new_() {return new KeyValHash();} protected KeyValHash() {}
public static KeyValHash new_by_ary(KeyVal[] ary) {
int ary_len = ary.length;
KeyValHash rv = new KeyValHash();
for (int i = 0; i < ary_len; i++)
rv.Add(ary[i]);
return rv;
}
public KeyVal FetchOrNull(String key) {return KeyVal_.as_(hash.Get_by(key));}
public static KeyValHash strAry_(String[] ary) {// needed for consoleLine
int aryLen = Array_.Len(ary); if (aryLen % 2 != 0) throw Err_.new_wo_type("array length must be divisible by 2", "aryLen", aryLen, "ary", String_.Concat_lines_crlf(ary));
KeyValHash rv = new KeyValHash();
String key = null;
for (int i = 0; i < aryLen; i++) {
if (i % 2 == 0)
key = ary[i];
else
rv.Add(key, ary[i]);
}
return rv;
}
public static final KeyValHash Empty = new KeyValHash();
}

@ -1,36 +0,0 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx;
import gplx.core.strings.*;
public class KeyValList {//20101217
public int Count() {return list.Count();} List_adp list = List_adp_.new_();
public void Clear() {list.Clear();}
public KeyVal GetAt(int i) {return (KeyVal)list.Get_at(i);}
public KeyValList Add(String key, Object val) {list.Add(KeyVal_.new_(key, val)); return this;}
public KeyVal[] Xto_bry() {return (KeyVal[])list.To_ary(KeyVal.class);}
public String To_str() {
String_bldr sb = String_bldr_.new_();
for (int i = 0; i < list.Count(); i++) {
KeyVal kv = (KeyVal)list.Get_at(i);
sb.Add_spr_unless_first(kv.Key(), " ", i);
sb.Add("=").Add(kv.Val_to_str_or_empty());
}
return sb.To_str();
}
public static KeyValList args_(String key, Object val) {return new KeyValList().Add(key, val);}
}

@ -17,17 +17,17 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx;
import gplx.core.strings.*;
public class KeyVal_ {
public static final KeyVal[] Ary_empty = new KeyVal[0];
public static KeyVal[] Ary(KeyVal... ary) {return ary;}
public static KeyVal[] Ary_cast_(Object o) {
try {return (KeyVal[])o;}
catch (Exception e) {throw Err_.new_cast(e, KeyVal.class, o);}
public class Keyval_ {
public static final Keyval[] Ary_empty = new Keyval[0];
public static Keyval[] Ary(Keyval... ary) {return ary;}
public static Keyval[] Ary_cast_(Object o) {
try {return (Keyval[])o;}
catch (Exception e) {throw Err_.new_cast(e, Keyval.class, o);}
}
public static KeyVal[] Ary_insert(KeyVal[] orig, boolean insert_at_end, KeyVal... vals) {
public static Keyval[] Ary_insert(Keyval[] orig, boolean insert_at_end, Keyval... vals) {
int orig_len = orig.length, vals_len = vals.length;
int rv_len = orig_len + vals_len;
KeyVal[] rv = new KeyVal[rv_len];
Keyval[] rv = new Keyval[rv_len];
int vals_bgn = 0 , vals_end = vals_len;
int orig_bgn = vals_len , orig_end = rv_len;
if (insert_at_end) {
@ -40,38 +40,38 @@ public class KeyVal_ {
rv[i] = vals[i - vals_bgn];
return rv;
}
public static String Ary_to_str(KeyVal... ary) {
public static String Ary_to_str(Keyval... ary) {
String_bldr sb = String_bldr_.new_();
int len = ary.length;
for (int i = 0; i < len; i++) {
KeyVal itm = ary[i];
Keyval itm = ary[i];
sb.Add(itm.Key()).Add("=");
Object itm_val = itm.Val();
if (Type_adp_.Eq_typeSafe(itm_val, KeyVal[].class))
sb.Add(Ary_to_str((KeyVal[])itm_val));
if (Type_adp_.Eq_typeSafe(itm_val, Keyval[].class))
sb.Add(Ary_to_str((Keyval[])itm_val));
else
sb.Add(Object_.Xto_str_strict_or_null_mark(itm_val));
sb.Add_char_nl();
}
return sb.To_str();
}
public static Object Ary_get_by_key_or_null(KeyVal[] ary, String key) {
public static Object Ary_get_by_key_or_null(Keyval[] ary, String key) {
int len = ary.length;
for (int i = 0; i < len; i++) {
KeyVal kv = ary[i];
Keyval kv = ary[i];
if (String_.Eq(kv.Key(), key)) return kv.Val();
}
return null;
}
public static String Ary__to_str__nest(KeyVal... ary) {
public static String Ary__to_str__nest(Keyval... ary) {
Bry_bfr bfr = Bry_bfr.new_();
Ary__to_str__nest(bfr, 0, ary);
return bfr.To_str_and_clear();
}
private static void Ary__to_str__nest(Bry_bfr bfr, int indent, KeyVal[] ary) {
private static void Ary__to_str__nest(Bry_bfr bfr, int indent, Keyval[] ary) {
int len = ary.length;
for (int i = 0; i < len; ++i) {
KeyVal itm = ary[i];
Keyval itm = ary[i];
if (indent > 0)
bfr.Add_byte_repeat(Byte_ascii.Space, indent * 2); // add indent : " "
bfr.Add_str_u8(Object_.Xto_str_strict_or_empty(itm.Key())).Add_byte_eq();// add key + eq : "key="
@ -80,9 +80,9 @@ public class KeyVal_ {
bfr.Add_str_a7(String_.Null_mark);
else {
Class<?> val_type = Type_adp_.ClassOf_obj(val);
if (Type_adp_.Eq(val_type, KeyVal[].class)) { // val is KeyVal[]; recurse
if (Type_adp_.Eq(val_type, Keyval[].class)) { // val is Keyval[]; recurse
bfr.Add_byte_nl(); // add nl : "\n"
Ary__to_str__nest(bfr, indent + 1, (KeyVal[])val);
Ary__to_str__nest(bfr, indent + 1, (Keyval[])val);
continue; // don't add \n below
}
else if (Type_adp_.Eq(val_type, Bool_.Cls_ref_type)) { // val is boolean
@ -95,9 +95,9 @@ public class KeyVal_ {
bfr.Add_byte_nl();
}
}
public static KeyVal as_(Object obj) {return obj instanceof KeyVal ? (KeyVal)obj : null;}
public static KeyVal new_(String key) {return new KeyVal(Type_adp_.Tid__str, key, key);}
public static KeyVal new_(String key, Object val) {return new KeyVal(Type_adp_.Tid__str, key, val);}
public static KeyVal int_(int key, Object val) {return new KeyVal(Type_adp_.Tid__int, key, val);}
public static KeyVal obj_(Object key, Object val) {return new KeyVal(Type_adp_.Tid__obj, key, val);}
public static Keyval as_(Object obj) {return obj instanceof Keyval ? (Keyval)obj : null;}
public static Keyval new_(String key) {return new Keyval(Type_adp_.Tid__str, key, key);}
public static Keyval new_(String key, Object val) {return new Keyval(Type_adp_.Tid__str, key, val);}
public static Keyval int_(int key, Object val) {return new Keyval(Type_adp_.Tid__int, key, val);}
public static Keyval obj_(Object key, Object val) {return new Keyval(Type_adp_.Tid__obj, key, val);}
}

@ -0,0 +1,41 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx;
public class Keyval_hash {
private final Ordered_hash hash = Ordered_hash_.New();
public int Count() {return hash.Count();}
public Keyval_hash Clear() {hash.Clear(); return this;}
public boolean Has(String key) {return hash.Has(key);}
public Keyval Get_at(int i) {return (Keyval)hash.Get_at(i);}
public Object Get_val_or(String key, Object or) {Keyval rv = Get_kvp_or_null(key); return rv == null ? or : rv.Val();}
public Object Get_val_or_null(String key) {return Get_val_or(key, null);}
public Object Get_val_or_fail(String key) {return Keyval_.as_(hash.Get_by_or_fail(key)).Val();}
public String Get_val_as_str_or_fail(String key) {return (String)Get_val_or_fail(key);}
public Keyval Get_kvp_or_null(String key) {return Keyval_.as_(hash.Get_by(key));}
public Keyval_hash Add(Keyval kv) {hash.Add(kv.Key(), kv); return this;}
public Keyval_hash Add(String key, Object val) {hash.Add(key, Keyval_.new_(key, val)); return this;}
public Keyval_hash Add_if_dupe_use_nth(String key, Object val) {hash.Add_if_dupe_use_nth(key, Keyval_.new_(key, val)); return this;}
public void Del(String key) {hash.Del(key);}
public Keyval[] To_ary() {
int len = this.Count();
Keyval[] rv = new Keyval[len];
for (int i = 0; i < len; ++i)
rv[i] = this.Get_at(i);
return rv;
}
}

@ -0,0 +1,36 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx;
public class Keyval_list {
public int Count() {return list.Count();} private final List_adp list = List_adp_.new_();
public void Clear() {list.Clear();}
public Keyval Get_at(int i) {return (Keyval)list.Get_at(i);}
public Keyval_list Add(String key, Object val) {list.Add(Keyval_.new_(key, val)); return this;}
public Keyval[] To_ary() {return (Keyval[])list.To_ary(Keyval.class);}
public String To_str() {
Bry_bfr bfr = Bry_bfr.new_();
int len = list.Count();
for (int i = 0; i < len; ++i) {
Keyval kv = (Keyval)list.Get_at(i);
if (i == 0) bfr.Add_byte_space();
bfr.Add_str_u8(kv.Key()).Add_byte_eq().Add_str_u8(kv.Val_to_str_or_empty());
}
return bfr.To_str_and_clear();
}
public static Keyval_list New_with_one(String key, Object val) {return new Keyval_list().Add(key, val);}
}

@ -17,9 +17,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx;
import gplx.core.lists.*; /*EnumerAble,ComparerAble*/
public interface List_adp extends EnumerAble {
public interface List_adp extends EnumerAble, List_adp__getable {
int Count();
Object Get_at(int i);
Object Get_at_last();
void Add(Object o);
void Add_at(int i, Object o);
@ -49,6 +48,7 @@ class List_adp_obj extends List_adp_base implements List_adp {
}
class List_adp_noop implements List_adp {
public int Count() {return 0;}
public int Len() {return 0;}
public Object Get_at(int i) {return null;}
public Object Get_at_last() {return null;}
public Object PopLast() {return null;}

@ -29,6 +29,7 @@ public abstract class List_adp_base implements List_adp, GfoInvkAble {
return new Iterator_objAry(list, count);
}
public void Add_many(Object... ary) {for (Object o : ary) Add_base(o);}
public int Len() {return count;}
public int Count() {return count;}
public int Idx_last() {return count - 1;}
protected Object Get_at_base(int index) {if (index >= count || index < 0) throw Err_.new_missing_idx(index, count);

@ -17,12 +17,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx;
public class Math_ {
public static double Pow(double val, double exponent) {return java.lang.Math.pow(val, exponent);}
public static double Pi = java.lang.Math.PI;
public static double E = java.lang.Math.E;
public static double Ceil(double v) {return java.lang.Math.ceil(v);}
public static double Floor(double v) {return java.lang.Math.floor(v);}
public static double Round(double v, int places) {
public static double Pow(double val, double exponent) {return java.lang.Math.pow(val, exponent);}
public static double Pi = java.lang.Math.PI;
public static double E = java.lang.Math.E;
public static int Ceil_as_int(double v) {return (int)Ceil(v);}
public static double Ceil(double v) {return java.lang.Math.ceil(v);}
public static double Floor(double v) {return java.lang.Math.floor(v);}
public static double Round(double v, int places) {
return java.math.BigDecimal.valueOf(v).setScale(places, java.math.BigDecimal.ROUND_HALF_UP).doubleValue();
}
public static int Trunc(double v) {return (int)v;}

@ -32,6 +32,13 @@ public class Object_ {
rv[i] = rhs[i - lhs_len];
return rv;
}
public static String[] Ary__to_str_ary(Object[]... ary) {
int len = ary.length;
String[] rv = new String[len];
for (int i = 0; i < len; ++i)
rv[i] = String_.Concat_with_obj("|", (Object[])ary[i]);
return rv;
}
public static boolean Eq(Object lhs, Object rhs) {
if (lhs == null && rhs == null) return true;
else if (lhs == null || rhs == null) return false;

@ -17,8 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx;
import gplx.core.lists.*; /*EnumerAble,ComparerAble*/
public interface Ordered_hash extends Hash_adp {
Object Get_at(int i);
public interface Ordered_hash extends Hash_adp, List_adp__getable {
void Add_at(int i, Object o);
int Idx_of(Object item);
void Sort();

@ -19,6 +19,7 @@ package gplx;
import gplx.core.strings.*; import gplx.core.envs.*;
import gplx.core.lists.*; /*EnumerAble,ComparerAble*/
public class Ordered_hash_base extends Hash_adp_base implements Ordered_hash, GfoInvkAble {
private final List_adp ordered = List_adp_.new_();
@Override protected void Add_base(Object key, Object val) {
super.Add_base(key, val);
ordered.Add(val);
@ -88,7 +89,7 @@ public class Ordered_hash_base extends Hash_adp_base implements Ordered_hash, Gf
else return GfoInvkAble_.Rv_unhandled;
return this;
} static final String Invk_SetKeyOnly = "SetKeyOnly", Invk_Print = "Print";
final List_adp ordered = List_adp_.new_();
public int Len() {return ordered.Count();}
@Override public int Count() {return ordered.Count();}
public Ordered_hash_base() {}
}

@ -22,11 +22,11 @@ public class UsrMsg {
public String Hdr() {return hdr;} public UsrMsg Hdr_(String val) {hdr = val; return this;} private String hdr;
public Ordered_hash Args() {return args;} Ordered_hash args = Ordered_hash_.New();
public UsrMsg Add(String k, Object v) {
args.Add(k, KeyVal_.new_(k, v));
args.Add(k, Keyval_.new_(k, v));
return this;
}
public UsrMsg Add_if_dupe_use_nth(String k, Object v) {
args.Add_if_dupe_use_nth(k, KeyVal_.new_(k, v));
args.Add_if_dupe_use_nth(k, Keyval_.new_(k, v));
return this;
}
public String XtoStrSingleLine() {return To_str(" ");}
@ -35,7 +35,7 @@ public class UsrMsg {
if (hdr == null) {
GfoMsg m = GfoMsg_.new_cast_(cmd);
for (int i = 0; i < args.Count(); i++) {
KeyVal kv = (KeyVal)args.Get_at(i);
Keyval kv = (Keyval)args.Get_at(i);
m.Add(kv.Key(), kv.Val());
}
return Object_.Xto_str_strict_or_null_mark(invk.Invk(GfsCtx.Instance, 0, cmd, m));
@ -43,7 +43,7 @@ public class UsrMsg {
String_bldr sb = String_bldr_.new_();
sb.Add(hdr).Add(spr);
for (int i = 0; i < args.Count(); i++) {
KeyVal kv = (KeyVal)args.Get_at(i);
Keyval kv = (Keyval)args.Get_at(i);
sb.Add_spr_unless_first("", " ", i);
sb.Add_fmt("{0}={1}", kv.Key(), kv.Val(), spr);
}

@ -22,6 +22,7 @@ public class Bry_rdr {
public byte[] Src() {return src;} protected byte[] src;
public int Src_end() {return src_end;} protected int src_end;
public int Pos() {return pos;} protected int pos;
public boolean Pos_is_eos() {return pos == src_end;}
public Bry_rdr Dflt_dlm_(byte b) {this.dflt_dlm = b; return this;} private byte dflt_dlm;
public Bry_rdr Fail_throws_err_(boolean v) {err_wkr.Fail_throws_err_(v); return this;}
public Bry_rdr Init_by_src(byte[] src) {err_wkr.Init_by_page("", src); this.pos = 0; this.src = src; this.src_end = src.length; return this;}
@ -68,7 +69,7 @@ public class Bry_rdr {
}
return rv;
}
public double Read_double_to() {return Read_double_to(dflt_dlm);}
public double Read_double_to() {return Read_double_to(dflt_dlm);}
public double Read_double_to(byte to_char) {
byte[] bry = Read_bry_to(to_char);
return Double_.parse(String_.new_a7(bry));

@ -15,7 +15,7 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.core.brys.fmtrs; import gplx.*; import gplx.core.*; import gplx.core.brys.*;
package gplx.core.brys.fmts; import gplx.*; import gplx.core.*; import gplx.core.brys.*;
public class Bfr_fmt_arg {
public Bfr_fmt_arg(byte[] key, Bfr_arg arg) {this.Key = key; this.Arg = arg;}
public byte[] Key;

@ -15,11 +15,18 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.dbs.sqls.itms; import gplx.*; import gplx.dbs.*; import gplx.dbs.sqls.*;
public class Sql_select_itm {
public boolean Distinct = false;
public final Sql_select_fld_list Flds = new Sql_select_fld_list();
package gplx.core.brys.fmts; import gplx.*; import gplx.core.*; import gplx.core.brys.*;
public class Bry_fmt_itm {
public Bry_fmt_itm(int tid, int src_bgn, int src_end) {
this.Tid = tid;
this.Src_bgn = src_bgn;
this.Src_end = src_end;
}
public int Tid;
public int Src_bgn;
public int Src_end;
public int Key_idx;
public Bfr_arg Arg;
public static final Sql_select_itm All = all_();
private static Sql_select_itm all_() {Sql_select_itm rv = new Sql_select_itm(); rv.Flds.Add(Sql_select_fld_wild.Instance); return rv;}
public static final int Tid__txt = 0, Tid__key = 1, Tid__arg = 2;
}

@ -15,8 +15,8 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.core.brys.fmtrs; import gplx.*; import gplx.core.*; import gplx.core.brys.*;
class Bry_fmt_parser_ {
package gplx.core.brys.fmts; import gplx.*; import gplx.core.*; import gplx.core.brys.*;
public class Bry_fmt_parser_ {
public static Bry_fmt_itm[] Parse(byte escape, byte grp_bgn, byte grp_end, Bfr_fmt_arg[] args, byte[][] keys, byte[] src) {
int src_len = src.length;
int pos = 0;
@ -69,9 +69,25 @@ class Bry_fmt_parser_ {
len = keys.length;
for (int i = 0; i < len; ++i) {
byte[] key = keys[i];
Bry_fmt_itm key_itm = (Bry_fmt_itm)keys_hash.Get_by(key); if (key_itm == null) throw Err_.new_("bry_fmtr", "could not find key", "key", key);
Bry_fmt_itm key_itm = (Bry_fmt_itm)keys_hash.Get_by(key); if (key_itm == null) continue; // NOTE: ignore missing keys; EX: fmt=a~{b}c keys=b,d; do not fail b/c ~{d} is not in fmt; allows redefining from tests
key_itm.Key_idx = i;
}
return rv;
}
public static byte[][] Parse_keys(byte[] src) {
Ordered_hash list = Ordered_hash_.New_bry();
int src_len = src.length;
int pos = -1;
while (pos < src_len) {
int lhs_pos = Bry_find_.Move_fwd(src, Bry_arg_lhs, pos + 1, src_len);
if (lhs_pos == Bry_find_.Not_found) break; // no more "~{"
int rhs_pos = Bry_find_.Find_fwd(src, Byte_ascii.Curly_end, lhs_pos, src_len);
if (rhs_pos == Bry_find_.Not_found) throw Err_.new_("bry_fmt", "unable to find closing }", "src", src);
if (rhs_pos - lhs_pos == 0) throw Err_.new_("bry_fmt", "{} will result in empty key", "src", src);
byte[] key = Bry_.Mid(src, lhs_pos, rhs_pos);
if (!list.Has(key)) list.Add(key, key);
pos = rhs_pos + 1;
}
return (byte[][])list.To_ary(byte[].class);
} private static final byte[] Bry_arg_lhs = Bry_.new_a7("~{");
}

@ -15,7 +15,7 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.core.brys.fmtrs; import gplx.*; import gplx.core.*; import gplx.core.brys.*;
package gplx.core.brys.fmts; import gplx.*; import gplx.core.*; import gplx.core.brys.*;
import org.junit.*;
public class Bry_fmt_tst {
private final Bry_fmt_fxt fxt = new Bry_fmt_fxt();

@ -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 <http://www.gnu.org/licenses/>.
*/
package gplx.core.brys.fmts; import gplx.*; import gplx.core.*; import gplx.core.brys.*;
import org.junit.*;
public class Bry_keys_parser_tst {
private final Bry_keys_parser_fxt fxt = new Bry_keys_parser_fxt();
@Test public void None() {fxt.Test("a");}
@Test public void One() {fxt.Test("~{a}" , "a");}
@Test public void Many() {fxt.Test("~{a}b~{c}d~{e}" , "a", "c", "e");}
@Test public void Dupe() {fxt.Test("~{a}b~{a}" , "a");}
}
class Bry_keys_parser_fxt {
public void Test(String fmt, String... expd) {
Tfds.Eq_ary(expd, String_.Ary(Bry_fmt_parser_.Parse_keys(Bry_.new_u8(fmt))));
}
}

@ -41,6 +41,10 @@ public class Btrie_slim_mgr implements Btrie_mgr {
cur = nxt;
}
}
public byte Match_byte_or(byte b, byte[] src, int bgn, int end, byte or) {
Object rv_obj = Match_bgn_w_byte(b, src, bgn, end);
return rv_obj == null ? or : ((Byte_obj_val)rv_obj).Val();
}
public byte Match_byte_or(byte[] src, int bgn, int end, byte or) {
Object rv_obj = Match_bgn(src, bgn, end);
return rv_obj == null ? or : ((Byte_obj_val)rv_obj).Val();

@ -20,8 +20,8 @@ public class Criteria_between implements Criteria {
public Criteria_between(boolean neg, Comparable lo, Comparable hi) {this.neg = neg; this.lo = lo; this.hi = hi;}
public byte Tid() {return Criteria_.Tid_between;}
public boolean Neg() {return neg;} private final boolean neg;
public Comparable Lo() {return lo;} private Comparable lo;
public Comparable Hi() {return hi;} private Comparable hi;
public Comparable Lo() {return lo;} private Comparable lo; public void Lo_(Comparable v) {this.lo = v;}
public Comparable Hi() {return hi;} private Comparable hi; public void Hi_(Comparable v) {this.hi = v;}
public void Val_from_args(Hash_adp args) {throw Err_.new_unimplemented();}
public void Val_as_obj_(Object v) {
Object[] ary = (Object[])v;

@ -30,7 +30,7 @@ public abstract class Criteria_bool_base implements Criteria {
}
class Criteria_and extends Criteria_bool_base {
public Criteria_and(Criteria lhs, Criteria rhs) {this.Ctor("AND", lhs, rhs);}
@Override public byte Tid() {return Criteria_.Tid_not;}
@Override public byte Tid() {return Criteria_.Tid_and;}
@Override public boolean Matches(Object curVal) {return this.Lhs().Matches(curVal) && this.Rhs().Matches(curVal);}
}
class Criteria_or extends Criteria_bool_base {
@ -46,12 +46,3 @@ class Criteria_const implements Criteria {
public void Val_as_obj_(Object v) {throw Err_.new_unimplemented();}
public String To_str() {return String_.Concat(" IS ", Bool_.To_str_lower(val));}
}
class Criteria_not implements Criteria {
private final Criteria criteria;
public Criteria_not(Criteria v) {this.criteria = v;}
public byte Tid() {return Criteria_.Tid_not;}
public boolean Matches(Object obj) {return !criteria.Matches(obj);}
public void Val_from_args(Hash_adp args) {criteria.Val_from_args(args);}
public void Val_as_obj_(Object v) {criteria.Val_as_obj_(v);}
public String To_str() {return String_.Concat_any(" NOT ", criteria.To_str());}
}

@ -22,6 +22,7 @@ public class Criteria_fld implements Criteria {
public String Pre() {return pre;} private final String pre;
public String Key() {return key;} private final String key;
public Criteria Crt() {return crt;} private final Criteria crt;
public String Pre_w_key() {return pre == Pre_null ? key : String_.Concat(pre, ".", key);}
public void Val_as_obj_(Object v) {throw Err_.new_unimplemented();}
public void Val_from_args(Hash_adp args) {
List_adp list = (List_adp)args.Get_by(key); if (list == null) throw Err_.new_wo_type("criteria.fld key not found", "key", key);
@ -31,7 +32,7 @@ public class Criteria_fld implements Criteria {
public boolean Matches(Object invkObj) {
GfoInvkAble invk = (GfoInvkAble)invkObj;
if (key == Criteria_fld.Key_null) return crt.Matches(invkObj);
Object comp = GfoInvkAble_.InvkCmd(invk, key);
Object comp = GfoInvkAble_.InvkCmd(invk, this.Pre_w_key());
return crt.Matches(comp);
}
public String To_str() {return String_.Concat(key, " ", crt.To_str());}
@ -64,7 +65,7 @@ public class Criteria_fld implements Criteria {
case Criteria_.Tid_wrapper: // not recursive
case Criteria_.Tid_db_obj_ary: // unsupported
case Criteria_.Tid_custom:
default: throw Err_.new_unhandled(tid);
default: throw Err_.new_unhandled(tid);
}
}
}

@ -20,7 +20,7 @@ import gplx.core.texts.*;
public class Criteria_ioMatch implements Criteria { // EX: url IOMATCH '*.xml|*.txt'
public Criteria_ioMatch(boolean match, RegxPatn_cls_ioMatch pattern) {this.match = match; this.pattern = pattern;}
public byte Tid() {return Criteria_.Tid_iomatch;}
public boolean Neg() {return !match;} private final boolean match;
public boolean Neg() {return !match;} private final boolean match;
public void Val_from_args(Hash_adp args) {throw Err_.new_unimplemented();}
public void Val_as_obj_(Object v) {this.pattern = (RegxPatn_cls_ioMatch)v;}
public RegxPatn_cls_ioMatch Pattern() {return pattern;} private RegxPatn_cls_ioMatch pattern;

@ -23,7 +23,7 @@ public class Criteria_like implements Criteria {
public boolean Neg() {return neg;} private final boolean neg;
public RegxPatn_cls_like Pattern() {return pattern;} private RegxPatn_cls_like pattern;
public void Val_from_args(Hash_adp args) {throw Err_.new_unimplemented();}
public void Val_as_obj_(Object v) {this.pattern = (RegxPatn_cls_like)v;}
public void Val_as_obj_(Object v) {this.pattern = RegxPatn_cls_like_.parse((String)v, RegxPatn_cls_like.EscapeDefault);}
public boolean Matches(Object compObj) {
String comp = String_.as_(compObj); if (comp == null) throw Err_.new_type_mismatch(String.class, compObj);
boolean rv = pattern.Matches(comp);

@ -15,23 +15,13 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.specials.search.crts; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.search.*;
class Srch_crt_tkn {
public final byte tid;
public final byte[] val;
public Srch_crt_tkn(byte tid, byte[] val) {this.tid = tid; this.val = val;}
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
;
package gplx.core.criterias; import gplx.*; import gplx.core.*;
public class Criteria_not implements Criteria {
public Criteria_not(Criteria v) {this.criteria = v;}
public byte Tid() {return Criteria_.Tid_not;}
public boolean Matches(Object obj) {return !criteria.Matches(obj);}
public void Val_from_args(Hash_adp args) {criteria.Val_from_args(args);}
public void Val_as_obj_(Object v) {criteria.Val_as_obj_(v);}
public String To_str() {return String_.Concat_any(" NOT ", criteria.To_str());}
public Criteria Crt() {return criteria;} private final Criteria criteria;
}

@ -56,7 +56,7 @@ public class Env_ {
public static long System_memory_max() {return Runtime.getRuntime().maxMemory();}
public static long System_memory_total() {return Runtime.getRuntime().totalMemory();}
public static long System_memory_free() {return Runtime.getRuntime().freeMemory();}
public static final String LocalHost = "127.0.0.1";
public static final String LocalHost = "127.0.0.1";
public static String NewLine_lang() {return mode_testing ? "\n" : "\n";}
public static String GenHdr(boolean forSourceCode, String programName, String hdr_bgn, String hdr_end) {
String newLine = Op_sys.Lnx.Nl_str();
@ -68,7 +68,7 @@ public class Env_ {
( codeBgn
, codeHdr
, hdr_bgn
, "Copyright (c) 2012 gnosygnu@gmail.com", newLine
, "Copyright (c) 2012-2016 gnosygnu@gmail.com", newLine
, newLine
, "This program is free software: you can redistribute it and/or modify", lineEnd
, "it under the terms of the GNU Affero General Public License as", lineEnd

@ -43,7 +43,7 @@ public class Op_sys {
public static final char Dir_spr_char_lnx = '\n';
public static final Op_sys Lnx = new_unx_flavor_(Tid_lnx, "linux", Bitness_32);
public static final Op_sys Osx = new_unx_flavor_(Tid_osx, "macosx", Bitness_32);
public static final Op_sys Drd = new_unx_flavor_(Tid_drd, "windows", Bitness_32);
public static final Op_sys Drd = new_unx_flavor_(Tid_drd, "android", 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_();
public static String Fsys_path_to_lnx(String v) {
@ -54,6 +54,15 @@ public class Op_sys {
}
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);}
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);}
public static void Cur_(int tid) {
switch (tid) {
case Tid_wnt: cur_op_sys = Wnt; break;
case Tid_lnx: cur_op_sys = Lnx; break;
case Tid_osx: cur_op_sys = Osx; break;
case Tid_drd: cur_op_sys = Drd; break;
default: throw Err_.new_unhandled_default(tid);
}
}
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_() {

@ -36,7 +36,7 @@ public class SrlAble_ {
sb.Add(owner.Key()).Add(":");
for (int i = 0; i < owner.Args_count(); i++) {
if (i != 0) sb.Add(" ");
KeyVal kv = owner.Args_getAt(i);
Keyval kv = owner.Args_getAt(i);
sb.Add(kv.Key()).Add("=").Add("'").Add(Object_.Xto_str_strict_or_null_mark(kv.Val())).Add("'");
}
int subsCount = owner.Subs_count();

@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.core.js; import gplx.*; import gplx.core.*;
public class Js_wtr {
private final Bry_bfr bfr = Bry_bfr.reset_(255);
private final Bry_bfr bfr = Bry_bfr.reset_(32);
private int arg_idx = 0, ary_idx = 0;
public byte Quote_char() {return quote_char;} public Js_wtr Quote_char_(byte v) {quote_char = v; return this;} private byte quote_char = Byte_ascii.Quote;
public void Clear() {bfr.Clear();}

@ -16,5 +16,5 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.core.lists; import gplx.*; import gplx.core.*;
public interface ComparerAble extends java.util.Comparator {} //_20110320
public interface ComparerAble extends java.util.Comparator {}
// public int compare(Object lhsObj, Object rhsObj) {}

@ -20,14 +20,6 @@ public abstract class Hash_adp_base implements Hash_adp {
public boolean Has(Object key) {return Has_base(key);}
public Object Get_by(Object key) {return Fetch_base(key);}
public Object Get_by_or_fail(Object key) {return Get_by_or_fail_base(key);}
// public Object Get_by_or_new(Object key, NewAble proto) {
// Object rv = Fetch_base(key);
// if (rv == null) {
// rv = proto.NewByKey(key);
// Add_base(key, rv);
// }
// return rv;
// }
public void Add(Object key, Object val) {Add_base(key, val);}
public void Add_as_key_and_val(Object val) {Add_base(val, val);}
public void Add_if_dupe_use_nth(Object key, Object val) {

@ -15,7 +15,8 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.specials.search; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*;
public interface Srch_rslt_lnr {
void Notify_rslt_found(Srch_rslt_itm rslt);
package gplx.core.lists; import gplx.*; import gplx.core.*;
public interface List_adp__getable {
int Len();
Object Get_at(int i);
}

@ -26,7 +26,7 @@ public interface DataRdr extends SrlMgr, Rls_able {
int FieldCount();
String KeyAt(int i);
Object ReadAt(int i);
KeyVal KeyValAt(int i);
Keyval KeyValAt(int i);
Object Read(String key);
String ReadStr(String key); String ReadStrOr(String key, String or);

@ -37,7 +37,7 @@ class DataRdr_null implements DataRdr {
public int FieldCount() {return 0;}
public String KeyAt(int i) {return To_str();}
public Object ReadAt(int i) {return null;}
public KeyVal KeyValAt(int i) {return KeyVal_.new_(this.KeyAt(i), this.ReadAt(i));}
public Keyval KeyValAt(int i) {return Keyval_.new_(this.KeyAt(i), this.ReadAt(i));}
public Object Read(String name) {return null;}
public String ReadStr(String key) {return String_.Empty;} public String ReadStrOr(String key, String or) {return or;}
public byte[] ReadBryByStr(String key) {return Bry_.Empty;} public byte[] ReadBryByStrOr(String key, byte[] or) {return or;}

@ -27,7 +27,7 @@ public abstract class DataRdr_base implements SrlMgr {
public abstract int FieldCount();
public abstract String KeyAt(int i);
public abstract Object ReadAt(int i);
@gplx.Virtual public KeyVal KeyValAt(int idx) {return KeyVal_.new_(this.KeyAt(idx), ReadAt(idx));}
@gplx.Virtual public Keyval KeyValAt(int idx) {return Keyval_.new_(this.KeyAt(idx), ReadAt(idx));}
public String ReadStr(String key) {
Object val = Read(key);
try {return (String)val;}
@ -192,7 +192,7 @@ public abstract class DataRdr_base implements SrlMgr {
public void XtoStr_gfml(String_bldr sb) {
sb.Add(this.NameOfNode()).Add(":");
for (int i = 0; i < this.FieldCount(); i++) {
KeyVal kv = this.KeyValAt(i);
Keyval kv = this.KeyValAt(i);
if (i != 0) sb.Add(" ");
sb.Add_fmt("{0}='{1}'", kv.Key(), String_.Replace(kv.Val_to_str_or_empty(), "'", "\""));
}

@ -18,12 +18,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.core.stores; import gplx.*; import gplx.core.*;
import gplx.core.gfo_ndes.*; import gplx.core.type_xtns.*;
public class GfoNdeRdr_ {
public static GfoNdeRdr kvs_(KeyValList kvList) {
public static GfoNdeRdr kvs_(Keyval_list kvList) {
GfoFldList flds = GfoFldList_.new_();
int pairsLen = kvList.Count();
Object[] vals = new Object[pairsLen];
for (int i = 0; i < pairsLen; i++) {
KeyVal pair = kvList.GetAt(i);
Keyval pair = kvList.Get_at(i);
flds.Add(pair.Key(), StringClassXtn.Instance);
vals[i] = pair.Val_to_str_or_empty();
}

@ -27,12 +27,12 @@ public class Gfs_Date_tst {
fx.tst_MsgStr(fx.msg_(String_.Ary("Date_", "Now")), DateAdp_.parse_gplx("2001-01-01 00:00:00.000"));
}
@Test public void Add_day() {
fx.tst_MsgStr(fx.msg_(String_.Ary("Date_", "Now", "Add_day"), KeyVal_.new_("days", 1)), DateAdp_.parse_gplx("2001-01-02 00:00:00.000"));
fx.tst_MsgStr(fx.msg_(String_.Ary("Date_", "Now", "Add_day"), Keyval_.new_("days", 1)), DateAdp_.parse_gplx("2001-01-02 00:00:00.000"));
}
}
class GfsCoreFxt {
public GfsCore Core() {return core;} GfsCore core = GfsCore.new_();
public GfoMsg msg_(String[] ary, KeyVal... kvAry) {return GfoMsg_.root_leafArgs_(ary, kvAry);}
public GfoMsg msg_(String[] ary, Keyval... kvAry) {return GfoMsg_.root_leafArgs_(ary, kvAry);}
public void AddObj(GfoInvkAble invk, String s) {core.AddObj(invk, s);}
public void tst_MsgStr(GfoMsg msg, Object expd) {
GfsCtx ctx = GfsCtx.new_();

@ -57,14 +57,14 @@ public class Xpath_ {
}
}
public static final String InnetTextKey = "&innerText";
public static KeyValHash ExtractKeyVals(String xml, Int_obj_ref posRef, String nodeName) {
public static Keyval_hash ExtractKeyVals(String xml, Int_obj_ref posRef, String nodeName) {
int pos = posRef.Val();
Err xmlErr = Err_.new_wo_type("error parsing xml", "xml", xml, "pos", pos);
String headBgnFind = "<" + nodeName + " "; int headBgnFindLen = String_.Len(headBgnFind);
int headBgn = String_.FindFwd(xml, headBgnFind, pos); if (headBgn == String_.Find_none) return null;
int headEnd = String_.FindFwd(xml, ">", headBgn + headBgnFindLen); if (headEnd == String_.Find_none) throw xmlErr;
String atrXml = String_.Mid(xml, headBgn, headEnd);
KeyValHash rv = ExtractNodeVals(atrXml, xmlErr);
Keyval_hash rv = ExtractNodeVals(atrXml, xmlErr);
boolean noInnerText = String_.CharAt(xml, headEnd - 1) == '/'; // if />, then no inner text
if (!noInnerText) {
int tail = String_.FindFwd(xml, "</" + nodeName + ">", headBgn); if (tail == String_.Find_none) throw Err_.new_wo_type("could not find tailPos", "headBgn", headBgn);
@ -74,8 +74,8 @@ public class Xpath_ {
posRef.Val_(headEnd);
return rv;
}
static KeyValHash ExtractNodeVals(String xml, Err xmlErr) {
KeyValHash rv = KeyValHash.new_();
static Keyval_hash ExtractNodeVals(String xml, Err xmlErr) {
Keyval_hash rv = new Keyval_hash();
int pos = 0;
while (true) {
int eqPos = String_.FindFwd(xml, "=", pos); if (eqPos == String_.Find_none) break;

@ -1,17 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>110_gfml</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

@ -52,7 +52,7 @@ class GfmlLxr_singleton implements GfmlLxr, GfoEvObj {
String oldRaw = singletonTkn.Raw();
singletonTkn = val;
hooks = String_.Ary(val.Raw());
GfoEvMgr_.PubVals(this, GfmlLxr_.CmdTknChanged_evt, KeyVal_.new_("old", oldRaw), KeyVal_.new_("new", val.Raw()), KeyVal_.new_("lxr", this));
GfoEvMgr_.PubVals(this, GfmlLxr_.CmdTknChanged_evt, Keyval_.new_("old", oldRaw), Keyval_.new_("new", val.Raw()), Keyval_.new_("lxr", this));
}
public String[] Hooks() {return hooks;} private String[] hooks;
public GfmlTkn MakeTkn(CharStream stream, int hookLength) {

@ -60,14 +60,14 @@ class GfmlParse_fxt {
UsrMsg_mok actlUmm = UsrMsg_mok.new_(actlUm);
tstr.Eq_str(expdUm.Main(), actlUmm.Main(), "main");
for (int j = 0; j < expdUm.Args().Count(); j++) {
KeyVal expdKv = (KeyVal)expdUm.Args().Get_at(j);
KeyVal actlKv = (KeyVal)actlUmm.Args().Get_by(expdKv.Key());
Keyval expdKv = (Keyval)expdUm.Args().Get_at(j);
Keyval actlKv = (Keyval)actlUmm.Args().Get_by(expdKv.Key());
Object actlVal = actlKv == null ? String_.Null_mark : actlKv.Val();
tstr.Eq_str(expdKv.Val(), actlVal, expdKv.Key());
}
for (int j = 0; j < expdUm.Required().Count(); j++) {
String expdKv = (String)expdUm.Required().Get_at(j);
KeyVal actlKv = (KeyVal)actlUmm.Args().Get_by(expdKv);
Keyval actlKv = (Keyval)actlUmm.Args().Get_by(expdKv);
Object actlVal = actlKv == null ? String_.Null_mark : actlKv.Val();
Object actlValV = actlKv == null ? "<<REQD>>" : actlKv.Val();
tstr.Eq_str(actlValV, actlVal, expdKv);

@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.gfml; import gplx.*;
class UsrMsg_mok {
public String Main() {return main;} public UsrMsg_mok Main_(String v) {main = v; return this;} private String main;
public UsrMsg_mok Add_(String k, Object o) {hash.Add(k, KeyVal_.new_(k, o)); return this;}
public UsrMsg_mok Add_(String k, Object o) {hash.Add(k, Keyval_.new_(k, o)); return this;}
public UsrMsg_mok Require_(String k) {required.Add(k, k); return this;}
public Ordered_hash Args() {return hash;} Ordered_hash hash = Ordered_hash_.New();
public Ordered_hash Required() {return required;} Ordered_hash required = Ordered_hash_.New();
@ -27,7 +27,7 @@ class UsrMsg_mok {
if (um != null) {
rv.main = um.Hdr();
for (int i = 0; i < um.Args().Count(); i++) {
KeyVal kv = (KeyVal)um.Args().Get_at(i);
Keyval kv = (Keyval)um.Args().Get_at(i);
rv.Add_(kv.Key(), kv.Val());
}
}

@ -58,7 +58,7 @@ public class z801_useCase_DataRdr_tst {
subRdr = rdr.Subs_byName_moveFirst("point");
fx_rdr.tst_Atrs(subRdr, kv_("x", "1"), kv_("y", "2"));
}
KeyVal kv_(String key, Object val) {return KeyVal_.new_(key, val);}
Keyval kv_(String key, Object val) {return Keyval_.new_(key, val);}
DataRdr_Fxt fx_rdr = DataRdr_Fxt.Instance;
DataRdr rdr, subRdr;
}
@ -71,8 +71,8 @@ class DataRdr_Fxt {
}
return rv;
}
@gplx.Internal protected void tst_Atrs(DataRdr rdr, KeyVal... expdAry) {
KeyVal[] actlAry = new KeyVal[rdr.FieldCount()];
@gplx.Internal protected void tst_Atrs(DataRdr rdr, Keyval... expdAry) {
Keyval[] actlAry = new Keyval[rdr.FieldCount()];
for (int i = 0; i < actlAry.length; i++)
actlAry[i] = rdr.KeyValAt(i);
Tfds.Eq_ary_str(expdAry, actlAry);

@ -9,6 +9,6 @@
<classpathentry kind="lib" path="lib/mysql-connector-java-5.1.12-bin.jar"/>
<classpathentry kind="lib" path="lib/postgresql-8.4-701.jdbc4.jar"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="lib" path="lib/sqlite-jdbc-3.7.15-M1.jar"/>
<classpathentry kind="lib" path="lib/sqlite-jdbc-3.8.11.2.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>

@ -1,17 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>140_dbs</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.core.srls; import gplx.*; import gplx.core.*;
import gplx.dbs.metas.*;
import gplx.dbs.*; import gplx.dbs.metas.*;
public class Dbmeta_dat_mgr {
private final Ordered_hash hash = Ordered_hash_.New();
public Dbmeta_dat_mgr Clear() {hash.Clear(); return this;}

@ -29,7 +29,7 @@ public class DbMaprItm {
contextFlds.Add(arg.ObjProp(), arg);
return this;
}
public DbMaprItm ConstantFlds_add(String dbFld, Object dbVal) {constantFlds.Add(dbFld, KeyVal_.new_(dbFld, dbVal)); return this;}
public DbMaprItm ConstantFlds_add(String dbFld, Object dbVal) {constantFlds.Add(dbFld, Keyval_.new_(dbFld, dbVal)); return this;}
public DbMaprItm Subs_add(DbMaprItm... ary) {
for (DbMaprItm itm : ary)
subs.Add(itm);

@ -44,16 +44,16 @@ public class DbMaprMgr_tst {
} DbMaprMgr mgr; DbMaprWtr wtr; Db_conn conn; MockDisc disc; MockTitle title; MockChapter chapter; MockStream audio, subtitle; SrlMgr rdr;
@Test public void PurgeObjTree() {
disc = MockDisc.new_().Id_(1);
Db_qry_fxt.Insert_kvo(conn, "mock_discs", KeyValList.args_("disc_id", 1));
Db_qry_fxt.Insert_kvo(conn, "mock_discs", Keyval_list.New_with_one("disc_id", 1));
DbMaprWtrUtl.PurgeObjTree(disc, mgr, conn);
Tfds.Eq(0, Db_qry_fxt.SelectAll_count(conn, "mock_discs"));
}
@Test public void PurgeObjTree_deep() {
disc = MockDisc.new_().Id_(1);
Db_qry_fxt.Insert_kvo(conn, "mock_discs", KeyValList.args_("disc_id", 1));
Db_qry_fxt.Insert_kvo(conn, "mock_titles", KeyValList.args_("disc_id", 1).Add("title_id", 1));
Db_qry_fxt.Insert_kvo(conn, "mock_chapters", KeyValList.args_("disc_id", 1).Add("title_id", 2).Add("chapter_id", 3));
Db_qry_fxt.Insert_kvo(conn, "mock_chapters", KeyValList.args_("disc_id", 2).Add("title_id", 2).Add("chapter_id", 3));
Db_qry_fxt.Insert_kvo(conn, "mock_discs", Keyval_list.New_with_one("disc_id", 1));
Db_qry_fxt.Insert_kvo(conn, "mock_titles", Keyval_list.New_with_one("disc_id", 1).Add("title_id", 1));
Db_qry_fxt.Insert_kvo(conn, "mock_chapters", Keyval_list.New_with_one("disc_id", 1).Add("title_id", 2).Add("chapter_id", 3));
Db_qry_fxt.Insert_kvo(conn, "mock_chapters", Keyval_list.New_with_one("disc_id", 2).Add("title_id", 2).Add("chapter_id", 3));
DbMaprWtrUtl.PurgeObjTree(disc, mgr, conn);
Tfds.Eq(0, Db_qry_fxt.SelectAll_count(conn, "mock_discs"));
@ -92,7 +92,7 @@ public class DbMaprMgr_tst {
}
@Test public void Load_root() {
rdr = rdr_();
Db_qry_fxt.Insert_kvo(conn, "mock_discs", KeyValList.args_("disc_id", 1).Add("disc_name", "name"));
Db_qry_fxt.Insert_kvo(conn, "mock_discs", Keyval_list.New_with_one("disc_id", 1).Add("disc_name", "name"));
disc = (MockDisc)rdr.StoreRoot(MockDisc.Instance, null);
Tfds.Eq(1, disc.Id());
@ -101,9 +101,9 @@ public class DbMaprMgr_tst {
}
@Test public void Load_subs() {
rdr = rdr_();
Db_qry_fxt.Insert_kvo(conn, "mock_discs", KeyValList.args_("disc_id", 1).Add("disc_name", "name"));
Db_qry_fxt.Insert_kvo(conn, "mock_titles", KeyValList.args_("disc_id", 1).Add("title_id", 1).Add("title_name", "title1"));
Db_qry_fxt.Insert_kvo(conn, "mock_titles", KeyValList.args_("disc_id", 1).Add("title_id", 2).Add("title_name", "title2"));
Db_qry_fxt.Insert_kvo(conn, "mock_discs", Keyval_list.New_with_one("disc_id", 1).Add("disc_name", "name"));
Db_qry_fxt.Insert_kvo(conn, "mock_titles", Keyval_list.New_with_one("disc_id", 1).Add("title_id", 1).Add("title_name", "title1"));
Db_qry_fxt.Insert_kvo(conn, "mock_titles", Keyval_list.New_with_one("disc_id", 1).Add("title_id", 2).Add("title_name", "title2"));
disc = (MockDisc)rdr.StoreRoot(MockDisc.Instance, null);
Tfds.Eq(1, disc.Id());
@ -114,11 +114,11 @@ public class DbMaprMgr_tst {
}
@Test public void Load_deep() {
rdr = rdr_();
Db_qry_fxt.Insert_kvo(conn, "mock_discs", KeyValList.args_("disc_id", 1).Add("disc_name", "name"));
Db_qry_fxt.Insert_kvo(conn, "mock_titles", KeyValList.args_("disc_id", 1).Add("title_id", 1).Add("title_name", "title1"));
Db_qry_fxt.Insert_kvo(conn, "mock_chapters", KeyValList.args_("disc_id", 1).Add("title_id", 1).Add("chapter_id", 3).Add("chapter_name", "chapter1"));
Db_qry_fxt.Insert_kvo(conn, "mock_streams", KeyValList.args_("disc_id", 1).Add("title_id", 1).Add("stream_id", 4).Add("stream_type", 0).Add("stream_name", "audio1"));
Db_qry_fxt.Insert_kvo(conn, "mock_streams", KeyValList.args_("disc_id", 1).Add("title_id", 1).Add("stream_id", 5).Add("stream_type", 1).Add("stream_name", "subtitle1"));
Db_qry_fxt.Insert_kvo(conn, "mock_discs", Keyval_list.New_with_one("disc_id", 1).Add("disc_name", "name"));
Db_qry_fxt.Insert_kvo(conn, "mock_titles", Keyval_list.New_with_one("disc_id", 1).Add("title_id", 1).Add("title_name", "title1"));
Db_qry_fxt.Insert_kvo(conn, "mock_chapters", Keyval_list.New_with_one("disc_id", 1).Add("title_id", 1).Add("chapter_id", 3).Add("chapter_name", "chapter1"));
Db_qry_fxt.Insert_kvo(conn, "mock_streams", Keyval_list.New_with_one("disc_id", 1).Add("title_id", 1).Add("stream_id", 4).Add("stream_type", 0).Add("stream_name", "audio1"));
Db_qry_fxt.Insert_kvo(conn, "mock_streams", Keyval_list.New_with_one("disc_id", 1).Add("title_id", 1).Add("stream_id", 5).Add("stream_type", 1).Add("stream_name", "subtitle1"));
disc = (MockDisc)rdr.StoreRoot(MockDisc.Instance, null);
Tfds.Eq(1, disc.Id());

@ -50,7 +50,7 @@ public class DbMaprRdr extends DataRdr_base implements SrlMgr {
Criteria rv = null, cur = null;
List_adp list = GetIdxFlds(mgr, mapr);
for (Object kvObj : list) {
KeyVal kv = (KeyVal)kvObj;
Keyval kv = (Keyval)kvObj;
cur = Db_crt_.New_eq(kv.Key(), kv.Val());
rv = (rv == null) ? cur : Criteria_.And(rv, cur);
}
@ -65,11 +65,11 @@ public class DbMaprRdr extends DataRdr_base implements SrlMgr {
for (Object argObj : mapr.ContextFlds()) {
DbMaprArg arg = (DbMaprArg)argObj;
Object propVal = GfoInvkAble_.InvkCmd((GfoInvkAble)gobj, arg.ObjProp());
rv.Add(KeyVal_.new_(arg.DbFld(), propVal));
rv.Add(Keyval_.new_(arg.DbFld(), propVal));
}
}
for (Object argObj : curMapr.ConstantFlds()) {
KeyVal arg = (KeyVal)argObj;
Keyval arg = (Keyval)argObj;
rv.Add(arg);
}
return rv;
@ -109,7 +109,7 @@ public class DbMaprRdr extends DataRdr_base implements SrlMgr {
@Override public int FieldCount() {throw Err_.new_unimplemented();}
@Override public String KeyAt(int i) {throw Err_.new_unimplemented();}
@Override public Object ReadAt(int i) {throw Err_.new_unimplemented();}
@Override public KeyVal KeyValAt(int i) {throw Err_.new_unimplemented();}
@Override public Keyval KeyValAt(int i) {throw Err_.new_unimplemented();}
@Override public SrlMgr SrlMgr_new(Object o) {return new DbMaprRdr();}
Hash_adp tables = Hash_adp_.new_();
Db_conn conn; Criteria rootCrt;

@ -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 <http://www.gnu.org/licenses/>.
*/
package gplx.dbs; import gplx.*;
public class Db_attach_itm {
public Db_attach_itm(String key, Io_url url) {
this.Key = key; this.Url = url;
}
public Db_attach_itm(String key, Db_conn conn) {
this.Key = key; this.Url = gplx.dbs.engines.sqlite.Sqlite_conn_info.To_url(conn);
}
public final String Key;
public final Io_url Url;
}

@ -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 <http://www.gnu.org/licenses/>.
*/
package gplx.dbs; import gplx.*;
import gplx.dbs.sqls.*; import gplx.dbs.sqls.itms.*;
public class Db_attach_mgr {
private final Ordered_hash hash = Ordered_hash_.New();
public final List_adp attached_dbs_list = List_adp_.new_();
public String Attached_sql() {return attached_sql;} private String attached_sql; // TEST
private Db_conn main_conn; private Io_url main_conn_url;
public Db_attach_mgr() {}
public Db_attach_mgr(Db_conn main_conn, Db_attach_itm... itms_ary) {
this.Main_conn_(main_conn);
this.Init(itms_ary);
}
public Db_attach_mgr Init(Db_attach_itm... itms_ary) {
hash.Clear();
int itms_len = itms_ary.length;
for (int i = 0; i < itms_len; ++i) {
Db_attach_itm itm = itms_ary[i];
hash.Add(itm.Key, itm);
}
return this;
}
public Db_attach_mgr Main_conn_(Db_conn conn) {
this.main_conn = conn; this.main_conn_url = Db_conn_info_.To_url(conn.Conn_info());
return this;
}
public void Attach() {
int len = attached_dbs_list.Len();
for (int i = 0; i < len; ++i) {
Db_attach_itm itm = (Db_attach_itm)attached_dbs_list.Get_at(i);
main_conn.Env_db_attach(itm.Key, itm.Url);
}
}
public void Detach() {
int len = attached_dbs_list.Len();
for (int i = 0; i < len; ++i) {
Db_attach_itm itm = (Db_attach_itm)attached_dbs_list.Get_at(i);
main_conn.Env_db_detach(itm.Key);
}
attached_dbs_list.Clear(); // clear list so multiple detachs don't fail
}
public String List__to_str() {
String rv = "";
int len = attached_dbs_list.Len();
for (int i = 0; i < len; ++i) {
Db_attach_itm itm = (Db_attach_itm)attached_dbs_list.Get_at(i);
rv += itm.Key + ";";
}
return rv;
}
public String Resolve_sql(String sql) {
attached_dbs_list.Clear();
int hash_len = hash.Count();
for (int i = 0; i < hash_len; ++i) {
Db_attach_itm attach_itm = (Db_attach_itm)hash.Get_at(i);
String tkn = "<" + attach_itm.Key + ">";
if (String_.Has(sql, tkn)) {
Io_url attach_url = attach_itm.Url;
String repl = "";
if (!attach_url.Eq(main_conn_url)) {
repl = attach_itm.Key + ".";
attached_dbs_list.Add(attach_itm);
}
sql = String_.Replace(sql, tkn, repl);
}
}
attached_sql = sql;
return sql;
}
public Db_stmt Make_stmt_and_attach(Db_qry qry, gplx.dbs.sqls.itms.Sql_from_clause from_itm) {
attached_dbs_list.Clear();
Sql_qry_wtr sql_wtr = main_conn.Engine().Sql_wtr();
List_adp from_tbls = from_itm.Tbls;
int from_tbls_len = from_tbls.Count();
for (int i = 0; i < from_tbls_len; ++i) {
Sql_tbl_itm from_tbl = (Sql_tbl_itm)from_tbls.Get_at(i);
String from_tbl_db = from_tbl.Db;
if (String_.Eq(Sql_tbl_itm.Db__null, from_tbl_db)) continue; // tbl does not have db defined; only "tbl" not "db.tbl"; skip
Db_attach_itm attach_itm = (Db_attach_itm)hash.Get_by(from_tbl_db); if (attach_itm == null) throw Err_.new_("dbs", "qry defines an unknown database for attach_wkr", "from_tbl_db", from_tbl_db, "sql", qry.To_sql__exec(sql_wtr));
if (attach_itm.Url.Eq(main_conn_url)) // attach_db same as conn; blank db, so "tbl", not "db.tbl"
from_tbl.Db_enabled = false;
else
attached_dbs_list.Add(attach_itm);
}
attached_sql = sql_wtr.To_sql_str(qry, true);
this.Attach();
for (int i = 0; i < from_tbls_len; ++i) { // reverse blanking from above
Sql_tbl_itm from_tbl = (Sql_tbl_itm)from_tbls.Get_at(i);
from_tbl.Db_enabled = true;
}
return main_conn.Stmt_sql(attached_sql);
}
public Db_attach_mgr Exec_sql_w_msg(String msg, String sql, Object... args) {
Gfo_usr_dlg_.Instance.Plog_many("", "", msg);
Exec_sql(sql, args);
return this;
}
public void Exec_sql(String sql, Object... args) {
String attach_sql = String_.Format(Resolve_sql(sql), args);
this.Attach();
try {main_conn.Exec_sql(attach_sql);}
finally {this.Detach();}
}
}

@ -0,0 +1,65 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.dbs; import gplx.*;
import org.junit.*; import gplx.dbs.qrys.*;
public class Db_attach_mgr__tst {
private final Db_attach_mgr__fxt fxt = new Db_attach_mgr__fxt();
@Test public void Basic() {
Db_qry__select_cmd qry = Db_qry_.select_()
.Cols_w_tbl_("t1", "fld_1")
.Cols_w_tbl_("t2", "fld_2")
.Cols_w_tbl_("t3", "fld_3")
.From_("db_1", "tbl_1", "t1")
.Join_("db_2", "tbl_2", "t2", Db_qry_.New_join__same("t1", "fld_2"))
.Join_("db_3", "tbl_3", "t3", Db_qry_.New_join__same("t1", "fld_3"))
.Join_( "tbl_4", "t4", Db_qry_.New_join__same("t1", "fld_4"))
;
fxt.Init("db_2", fxt.Make__itm("db_1"), fxt.Make__itm("db_2"), fxt.Make__itm("db_3"));
fxt.Test__make_stmt_and_attach(qry
, "SELECT t1.fld_1, t2.fld_2, t3.fld_3 "
+ "FROM db_1.tbl_1 t1 "
+ "INNER JOIN tbl_2 t2 ON t1.fld_2 = t2.fld_2 " // NOTE: curr is db_2 so do not prefix tbl_2 with db_2; fails if "db_2.tbl_2"
+ "INNER JOIN db_3.tbl_3 t3 ON t1.fld_3 = t3.fld_3 "
+ "INNER JOIN tbl_4 t4 ON t1.fld_4 = t4.fld_4"
, String_.Ary("db_1", "db_3") // NOTE: no "db_2"
);
}
}
class Db_attach_mgr__fxt {
private Db_attach_mgr mgr;
public Db_attach_itm Make__itm(String key) {return new Db_attach_itm(key, Io_url_.mem_fil_("mem/" + key));}
public Db_conn Make__conn(String key) {return Db_conn_pool.Instance.Get_or_new__mem(key);}
public void Init(String conn_key, Db_attach_itm... ary) {
Db_conn conn = Make__conn(conn_key);
mgr = new Db_attach_mgr(conn, ary);
}
public void Test__make_stmt_and_attach(Db_qry__select_cmd qry, String expd_sql, String[] expd_dbs) {
mgr.Make_stmt_and_attach(qry, qry.From());
Tfds.Eq_str(expd_sql, mgr.Attached_sql());
Tfds.Eq_ary_str(expd_dbs, To_key_ary(mgr.attached_dbs_list));
}
private static String[] To_key_ary(List_adp attach_dbs_list) {
int rv_len = attach_dbs_list.Count();
String[] rv = new String[rv_len];
for (int i = 0; i < rv_len; ++i) {
Db_attach_itm itm = (Db_attach_itm)attach_dbs_list.Get_at(i);
rv[i] = itm.Key;
}
return rv;
}
}

@ -16,46 +16,71 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.dbs; import gplx.*;
import gplx.core.brys.fmtrs.*;
import gplx.core.stores.*; import gplx.dbs.metas.*; import gplx.dbs.engines.*; import gplx.dbs.qrys.*; import gplx.dbs.sys.*;
public class Db_conn {
private final List_adp rls_list = List_adp_.new_(); private final Db_engine engine;
private final Db_engine engine; private final List_adp rls_list = List_adp_.new_();
private final Bry_fmt exec_sql_fmt = Bry_fmt.New(""); private final Bry_bfr exec_sql_bfr = Bry_bfr.new_();
public Db_conn(Db_engine engine) {
this.engine = engine;
sys_mgr = new Db_sys_mgr(this);
}
public Db_engine Engine() {return engine;}
public Db_conn_info Conn_info() {return engine.Conn_info();}
public boolean Eq(Db_conn comp) {return String_.Eq(engine.Conn_info().Xto_api(), comp.Conn_info().Xto_api());}
public Db_sys_mgr Sys_mgr() {return sys_mgr;} private final Db_sys_mgr sys_mgr;
public boolean Eq(Db_conn comp) {return String_.Eq(engine.Conn_info().Db_api(), comp.Conn_info().Db_api());}
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, Dbmeta_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, Dbmeta_fld_list flds, String... where) {return engine.New_stmt_prep(Db_qry_update.New(tbl, where, flds.To_str_ary_exclude(where)));}
public Db_stmt Stmt_delete(String tbl, String... where) {return engine.New_stmt_prep(Db_qry_delete.new_(tbl, where));}
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, Dbmeta_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_max(String tbl, String col, String... where) {
Db_qry__select_in_tbl qry = new Db_qry__select_in_tbl(tbl, String_.Ary(String_.Format("Max({0}) AS {0}", col)), where, null, null, null, null);
return engine.New_stmt_prep(qry);
}
public void Env_db_attach(String alias, Db_conn conn) {engine.Env_db_attach(alias, conn);}
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().Db_api(), "VACUUM;");}
public boolean Meta_tbl_exists(String tbl) {return engine.Meta_tbl_exists(tbl);}
public void Meta_tbl_create(Dbmeta_tbl_itm meta) {engine.Ddl_create_tbl(meta); engine.Ddl_create_idx(Gfo_usr_dlg_.Noop, meta.Idxs().To_ary());}
public void Meta_tbl_drop(String tbl) {engine.Ddl_delete_tbl(tbl);}
public void Meta_idx_create(Dbmeta_idx_itm... idxs) {engine.Ddl_create_idx(Gfo_usr_dlg_.Instance, idxs);}
public void Meta_idx_create(Gfo_usr_dlg usr_dlg, Dbmeta_idx_itm... idxs) {engine.Ddl_create_idx(usr_dlg, idxs);}
public boolean Meta_fld_exists(String tbl, String fld) {return engine.Meta_fld_exists(tbl, fld);}
public void Meta_fld_append(String tbl, Dbmeta_fld_itm fld) {engine.Ddl_append_fld(tbl, fld);}
public void Meta_fld_assert(String tbl, String fld, Dbmeta_fld_tid tid, Object dflt) {if (!Meta_fld_exists(tbl, fld)) this.Meta_fld_append(tbl, new Dbmeta_fld_itm(fld, tid).Default_(dflt));}
public Dbmeta_tbl_mgr Meta_load_all() {return engine.Meta_tbl_load_all();}
public Db_stmt Stmt_insert(String tbl, Dbmeta_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, Dbmeta_fld_list flds, String... where) {return engine.New_stmt_prep(Db_qry_update.New(tbl, where, flds.To_str_ary_exclude(where)));}
public Db_stmt Stmt_delete(String tbl, String... where) {return engine.New_stmt_prep(Db_qry_delete.new_(tbl, where));}
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, Dbmeta_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, Dbmeta_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 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 Db_sys_mgr Sys_mgr() {return sys_mgr;} private final Db_sys_mgr sys_mgr;
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(Dbmeta_tbl_itm meta) {engine.Ddl_create_tbl(meta); engine.Ddl_create_idx(Gfo_usr_dlg_.Noop, meta.Idxs().To_ary());}
public void Ddl_create_idx(Dbmeta_idx_itm... idxs) {engine.Ddl_create_idx(Gfo_usr_dlg_.Instance, idxs);}
public void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Dbmeta_idx_itm... idxs) {engine.Ddl_create_idx(usr_dlg, idxs);}
public void Ddl_append_fld(String tbl, Dbmeta_fld_itm fld) {engine.Ddl_append_fld(tbl, fld);}
public void Ddl_delete_tbl(String tbl) {engine.Ddl_delete_tbl(tbl);}
public boolean Meta_tbl_exists(String tbl) {return engine.Meta_tbl_exists(tbl);}
public boolean Meta_fld_exists(String tbl, String fld) {return engine.Meta_fld_exists(tbl, fld);}
public Dbmeta_tbl_mgr Meta_tbl_load_all() {return engine.Meta_tbl_load_all();}
public Db_stmt Stmt_sql(String sql) {return engine.New_stmt_prep(Db_qry_sql.sql_(sql));}
public int Exec_qry(Db_qry qry) {return Int_.cast(engine.Exec_as_obj(qry));}
public int Exec_sql(String sql) {return this.Exec_qry(Db_qry_sql.dml_(sql));}
public int Exec_sql(String msg, String sql) {Gfo_usr_dlg_.Instance.Plog_many("", "", msg); return this.Exec_sql(sql);}
public Db_rdr Exec_rdr(String sql) {return this.Stmt_sql(sql).Exec_select__rls_auto();}
public void Exec_delete_all(String tbl) {Stmt_delete(tbl).Exec_delete();}
public int Exec_sql_args(String sql, Object... args) {return this.Exec_qry(Db_qry_sql.dml_(String_.Format(sql, args)));}
public int Exec_sql_fmt_by_keys(String sql, String[] keys, Object... args) {return Exec_sql(exec_sql_fmt.Fmt_(sql).Keys_(Bry_.Ary(keys)).Bld_many_to_str(exec_sql_bfr, args));}
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_.Instance.Plog_many("", "", msg);
if (txn) this.Txn_bgn(msg);
int rv = Exec_sql(sql);
if (txn) this.Txn_end();
Gfo_usr_dlg_.Instance.Plog_many("", "", "done:" + msg);
return rv;
}
public int Exec_select_as_int (String sql, int or) {Object rv = Exec_select_as_obj(sql); return rv == null ? or : Int_.cast(rv);}
public double Exec_select_as_double (String sql, double or) {Object rv = Exec_select_as_obj(sql); return rv == null ? or : Double_.cast(rv);}
private Object Exec_select_as_obj(String sql) {
Db_rdr rdr = Exec_rdr(sql);
try {return rdr.Move_next() ? rdr.Read_at(0) : null;}
finally {rdr.Rls();}
}
public void Rls_reg(Rls_able rls) {rls_list.Add(rls);}
public void Rls_conn() {
int len = rls_list.Count();
@ -66,21 +91,12 @@ public class Db_conn {
engine.Conn_term();
Db_conn_pool.Instance.Del(engine.Conn_info());
}
public void Exec_delete_all(String tbl) {Stmt_delete(tbl).Exec_delete();}
public int Exec_sql(String sql) {return this.Exec_qry(Db_qry_sql.dml_(sql));}
public Db_rdr Exec_sql_as_rdr_v2(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_.Instance.Plog_many("", "", msg);
if (txn) this.Txn_bgn(msg);
int rv = Exec_sql(sql);
if (txn) this.Txn_end();
Gfo_usr_dlg_.Instance.Plog_many("", "", "done:" + msg);
return rv;
public Db_stmt Stmt_select_max(String tbl, String col, String... where) {
Db_qry__select_in_tbl qry = new Db_qry__select_in_tbl(tbl, String_.Ary(String_.Format("Max({0}) AS {0}", col)), where, null, null, null, null);
return engine.New_stmt_prep(qry);
}
public int Exec_qry(Db_qry qry) {return Int_.cast(engine.Exec_as_obj(qry));}
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_old_rdr(String sql) {return DataRdr_.cast(engine.Exec_as_obj(Db_qry_sql.rdr_(sql)));}
public DataRdr Exec_qry_as_old_rdr(Db_qry qry) {return DataRdr_.cast(engine.Exec_as_obj(qry));}
}

@ -16,24 +16,6 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.dbs; import gplx.*;
import gplx.core.stores.*;
import gplx.dbs.qrys.*;
public class Db_conn_ {
public static final Db_conn Noop = Db_conn_pool.Instance.Get_or_new(Db_conn_info_.Null);
public static int Select_fld0_as_int_or(Db_conn conn, String sql, int or) {
DataRdr rdr = DataRdr_.Null;
try {
rdr = conn.Exec_qry_as_old_rdr(Db_qry_sql.rdr_(sql));
int rv = or;
if (rdr.MoveNextPeer()) {
Object rv_obj = rdr.ReadAt(0);
if (rv_obj != null) // Max(fil_id) will be NULL if tbl is empty
rv = Int_.cast_or(rv_obj, or);
}
return rv;
}
finally {
rdr.Rls();
}
}
}

@ -17,9 +17,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.dbs; import gplx.*;
public interface Db_conn_info {
String Tid();
String Database();
String Xto_raw();
String Xto_api();
Db_conn_info New_self(String raw, GfoMsg m);
String Key(); // EX: "sqlite"
String Raw(); // EX: "gplx_key=sqlite;data source=/db.sqlite3;version=3"
String Db_api(); // EX: "data source=/db.sqlite3;version=3"
String Database(); // EX: /db.sqlite3 -> "db" ; xowa -> "xowa"
Db_conn_info New_self(String raw, Keyval_hash hash);
}

@ -24,19 +24,24 @@ public class Db_conn_info_ {
public static Db_conn_info parse(String raw) {return Db_conn_info_pool.Instance.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 Db_conn_info mem_(String db) {return Mem_conn_info.new_(db);}
public static final String Key_tdb = Tdb_conn_info.Tid_const;
public static Io_url To_url(Db_conn_info cs) {
if (String_.Eq(cs.Key(), Sqlite_conn_info.Key_const)) return ((Sqlite_conn_info)cs).Url();
else if (String_.Eq(cs.Key(), Mem_conn_info.Instance.Key())) return Io_url_.mem_fil_("mem/" + ((Mem_conn_info)cs).Database());
else throw Err_.new_unhandled_default(cs.Key());
}
}
class Db_conn_info_pool {
private Ordered_hash regy = Ordered_hash_.New();
private final Ordered_hash regy = Ordered_hash_.New();
public Db_conn_info_pool() {
this.Add(Noop_conn_info.Instance).Add(Tdb_conn_info.Instance).Add(Mysql_conn_info.Instance).Add(Postgres_conn_info.Instance).Add(Sqlite_conn_info.Instance);
this.Add(Db_conn_info__mem.Instance);
this.Add(Mem_conn_info.Instance);
}
public Db_conn_info_pool Add(Db_conn_info itm) {regy.Add_if_dupe_use_nth(itm.Tid(), itm); return this;}
public Db_conn_info_pool Add(Db_conn_info itm) {regy.Add_if_dupe_use_nth(itm.Key(), 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");
Keyval_hash hash = new Keyval_hash();
String[] terms = String_.Split(raw, ";");
String url_tid = "";
for (String term : terms) {
@ -45,15 +50,15 @@ class Db_conn_info_pool {
if (String_.Eq(kv[0], "gplx_key"))
url_tid = kv[1]; // NOTE: do not add to GfoMsg; will not be part of ApiStr
else
m.Add(kv[0], kv[1]);
hash.Add(kv[0], kv[1]);
}
Db_conn_info prototype = (Db_conn_info)regy.Get_by(url_tid);
return prototype.New_self(raw, m);
return prototype.New_self(raw, hash);
}
catch(Exception exc) {throw Err_.new_parse_exc(exc, Db_conn_info.class, raw);}
}
public Db_conn_info Parse_or_sqlite_or_fail(String raw) {// assume each pair has format of: name=val;
GfoMsg msg = GfoMsg_.new_parse_("db_url");
Keyval_hash hash = new Keyval_hash();
String[] kvps = String_.Split(raw, ";");
String cs_tid = null;
int kvps_len = kvps.length;
@ -65,19 +70,19 @@ class Db_conn_info_pool {
if (String_.Eq(key, "gplx_key"))
cs_tid = val; // NOTE: do not add to GfoMsg; will not be part of ApiStr
else
msg.Add(key, val);
hash.Add(key, val);
}
if (cs_tid == null) { // gplx_key not found; try url as sqlite; EX: "/db.sqlite"
Io_url sqlite_url = null;
try {sqlite_url = Io_url_.new_any_(raw);}
catch (Exception exc) {throw Err_.new_exc(exc, "dbs", "invalid connection String", "raw", raw);}
msg.Clear();
cs_tid = Sqlite_conn_info.Tid_const;
msg.Add(Sqlite_conn_info.Cs__data_source, sqlite_url.Raw());
msg.Add(Sqlite_conn_info.Cs__version , Sqlite_conn_info.Cs__version__3);
hash.Clear();
cs_tid = Sqlite_conn_info.Key_const;
hash.Add(Sqlite_conn_info.Cs__data_source, sqlite_url.Raw());
hash.Add(Sqlite_conn_info.Cs__version , Sqlite_conn_info.Cs__version__3);
}
Db_conn_info prototype = (Db_conn_info)regy.Get_by(cs_tid);
return prototype.New_self(raw, msg);
return prototype.New_self(raw, hash);
}
public static final Db_conn_info_pool Instance = new Db_conn_info_pool();
}

@ -16,30 +16,15 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.dbs; import gplx.*;
import gplx.core.strings.*;
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_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_();
Hash_adp hash = Hash_adp_.new_();
for (int i = 0; i < m.Args_count(); i++) {
KeyVal kv = m.Args_getAt(i);
sb.Add_fmt("{0}={1};", kv.Key(), kv.Val_to_str_or_empty());
hash.Add_as_key_and_val(kv.Key());
}
for (KeyVal xtn : xtnAry) {
if (hash.Has(xtn.Key())) continue;
sb.Add_fmt("{0}={1};", xtn.Key(), xtn.Val_to_str_or_empty());
}
return sb.To_str();
}
protected static String Bld_raw(String... ary) {
public Db_conn_info__base(String raw, String db_api, String database) {this.raw = raw; this.db_api = db_api; this.database = database;}
public abstract String Key();
public String Raw() {return raw;} private final String raw;
public String Db_api() {return db_api;} private final String db_api;
public String Database() {return database;} protected final String database;
public abstract Db_conn_info New_self(String raw, Keyval_hash hash);
protected static String Bld_raw(String... ary) {// "a", "b" -> "a=b;"
Bry_bfr bfr = Bry_bfr.reset_(255);
int len = ary.length;
for (int i = 0; i < len; ++i) {
@ -47,6 +32,19 @@ public abstract class Db_conn_info__base implements Db_conn_info {
bfr.Add_str_u8(itm);
bfr.Add_byte(i % 2 == 0 ? Byte_ascii.Eq : Byte_ascii.Semic);
}
return bfr.To_str();
return bfr.To_str_and_clear();
}
protected static String Bld_api(Keyval_hash hash, Keyval... xtn_ary) {
Bry_bfr bfr = Bry_bfr.new_();
int len = hash.Count();
for (int i = 0; i < len; ++i) {
Keyval kv = hash.Get_at(i);
bfr.Add_str_u8_fmt("{0}={1};", kv.Key(), kv.Val_to_str_or_empty());
}
for (Keyval xtn : xtn_ary) {
if (hash.Has(xtn.Key())) continue;
bfr.Add_str_u8_fmt("{0}={1};", xtn.Key(), xtn.Val_to_str_or_empty());
}
return bfr.To_str_and_clear();
}
}

@ -26,21 +26,23 @@ public class Db_conn_info_tst {
tst_Parse("gplx_key=mock;id=1;name=me;", kv_("id", "1"), kv_("name", "me")); // many
tst_Parse("gplx_key=mock;id=1;name=me" , kv_("id", "1"), kv_("name", "me")); // no semi-colon at end
}
private KeyVal kv_(String key, Object val) {return KeyVal_.new_(key, val);}
private void tst_Parse(String raw, KeyVal... expd) {
private Keyval kv_(String key, Object val) {return Keyval_.new_(key, val);}
private void tst_Parse(String raw, Keyval... expd) {
Db_conn_info_mock mock = (Db_conn_info_mock)regy.Parse(raw);
Tfds.Eq_ary_str(expd, mock.Kvs());
}
}
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_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);
public Db_conn_info_mock(String raw, String db_api, String database) {super(raw, db_api, database);}
public Keyval[] Kvs() {return kvs;} Keyval[] kvs;
@Override public String Key() {return Tid_const;} public static final String Tid_const = "mock";
@Override public Db_conn_info New_self(String raw, Keyval_hash hash) {
Db_conn_info_mock rv = new Db_conn_info_mock("", "", "");
int len = hash.Count();
rv.kvs = new Keyval[len];
for (int i = 0; i < len; ++i)
rv.kvs[i] = hash.Get_at(i);
return rv;
}
public static final Db_conn_info_mock Instance = new Db_conn_info_mock(); Db_conn_info_mock() {}
public static final Db_conn_info_mock Instance = new Db_conn_info_mock("", "", "");
}

@ -21,17 +21,17 @@ import gplx.dbs.engines.sqlite.*; import gplx.dbs.engines.mysql.*; import gplx.d
public class Db_conn_pool {
private final Hash_adp conn_hash = Hash_adp_.new_(); private final Hash_adp engine_hash = Hash_adp_.new_();
public void Clear() {conn_hash.Clear();}
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 void Del(Db_conn_info url) {conn_hash.Del(url.Db_api());}
public Db_conn Get_or_new__mem(String db) {return Get_or_new(Mem_conn_info.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.Get_by(url.Xto_api());
Db_conn rv = (Db_conn)conn_hash.Get_by(url.Db_api());
if (rv == null) {
Db_engine prime = (Db_engine)engine_hash.Get_by(url.Tid()); if (prime == null) Err_.new_wo_type("db engine prototype not found", "tid", url.Tid());
Db_engine prime = (Db_engine)engine_hash.Get_by(url.Key()); if (prime == null) Err_.new_wo_type("db engine prototype not found", "key", url.Key());
Db_engine clone = prime.New_clone(url);
rv = new Db_conn(clone);
conn_hash.Add(url.Xto_api(), rv);
conn_hash.Add(url.Db_api(), rv);
}
return rv;
}
@ -41,6 +41,6 @@ public class Db_conn_pool {
}
public static final Db_conn_pool Instance = new Db_conn_pool(); Db_conn_pool() {this.Init();}
private void Init() {
this.Engines__add(Noop_engine.Instance, TdbEngine.Instance, Mysql_engine.Instance, Postgres_engine.Instance, Sqlite_engine.Instance, Db_engine__mem.Instance);
this.Engines__add(Noop_engine.Instance, TdbEngine.Instance, Mysql_engine.Instance, Postgres_engine.Instance, Sqlite_engine.Instance, Mem_engine.Instance);
}
}

@ -22,11 +22,8 @@ public class Db_conn_utl {
Db_conn_bldr.Instance.Reg_default_mem();
return Db_conn_bldr.Instance.Get_or_new(Io_url_.mem_fil_("mem/" + url_rel)).Conn();
}
public static void Tbl__delete(Db_conn conn, String tbl) {
conn.Ddl_delete_tbl(tbl);
}
public static void Tbl__new(Db_conn conn, String tbl, Dbmeta_fld_itm[] flds, Object[]... rows) {
conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl, flds));
conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl, flds));
int rows_len = rows.length;
Db_stmt stmt = conn.Stmt_insert(tbl, Dbmeta_fld_itm.To_str_ary(flds));
for (int i = 0; i < rows_len; ++i) {
@ -51,4 +48,30 @@ public class Db_conn_utl {
stmt.Exec_insert();
}
}
public static void Insert(Db_conn conn, String tbl_name, String[] flds, Object[]... rows) {
Db_stmt stmt = Db_stmt_.new_insert_(conn, tbl_name, flds);
int flds_len = flds.length;
int rows_len = rows.length;
for (int i = 0; i < rows_len; ++i) {
Object[] row = rows[i];
stmt.Clear();
for (int j = 0; j < flds_len; ++j)
Db_stmt_.Val_by_obj(stmt, flds[j], row[j]);
stmt.Exec_insert();
}
}
public static Object[][] Select(Db_conn conn, Db_qry qry) {
List_adp rv = List_adp_.new_();
Db_rdr rdr = conn.Stmt_new(qry).Exec_select__rls_auto();
try {
while (rdr.Move_next()) {
int fld_len = rdr.Fld_len();
Object[] row = new Object[fld_len];
for (int i = 0; i < fld_len; ++i)
row[i] = rdr.Read_at(i);
rv.Add(row);
}
} finally {rdr.Rls();}
return (Object[][])rv.To_ary_and_clear(Object[].class);
}
}

@ -19,6 +19,7 @@ package gplx.dbs; import gplx.*;
import gplx.core.criterias.*;
public class Db_crt_ {
public static final Criteria Wildcard = Criteria_.All;
public static Criteria New_and (Criteria lhs, Criteria rhs) {return Criteria_.And(lhs, rhs);}
public static Criteria_fld New_eq (String key, Object val) {return Criteria_fld.new_(key, Criteria_.eq_(val));}
public static Criteria_fld New_eq (String pre, String key, Object val) {return Criteria_fld.new_(pre, key, Criteria_.eq_(val));}
public static Criteria_fld New_eq_not (String key, Object val) {return Criteria_fld.new_(key, Criteria_.eqn_(val));}
@ -51,10 +52,10 @@ public class Db_crt_ {
}
return rv;
}
public static Criteria eq_many_(KeyVal... array) {
public static Criteria eq_many_(Keyval... array) {
Criteria rv = null;
for (int i = 0; i < array.length; i++) {
KeyVal pair = array[i];
Keyval pair = array[i];
Criteria crt = Db_crt_.New_eq(pair.Key(), pair.Val());
rv = (i == 0)? crt : Criteria_.And(rv, crt);
}

@ -0,0 +1,24 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.dbs; import gplx.*;
public class Db_null implements gplx.core.brys.Bfr_arg {
public void Bfr_arg__add(Bry_bfr bfr) {bfr.Add_str_a7(Null_str);}
@Override public String toString() {return Null_str;}
public static final String Null_str = "NULL";
public static final Db_null Instance = new Db_null(); Db_null() {}
}

@ -20,21 +20,21 @@ import gplx.core.criterias.*; import gplx.dbs.qrys.*; import gplx.dbs.sqls.*; im
public class Db_qry_ {
public static Db_qry__select_cmd select_cols_(String tbl, Criteria crt, String... cols){return select_().From_(tbl).Where_(crt).Cols_(cols);}
public static Db_qry__select_cmd select_val_(String tbl, String col, Criteria crt) {return select_().From_(tbl).Where_(crt).Cols_(col);}
public static Db_qry__select_cmd select_tbl_(String tbl) {return select_().From_(tbl);}
public static Db_qry__select_cmd select_tbl_(String tbl) {return select_().From_(tbl).Cols_all_();}
public static Db_qry__select_cmd select_() {return new Db_qry__select_cmd();}
public static Db_qry__select_cmd select_(String tbl, String... cols) {return new Db_qry__select_cmd().From_(tbl).Cols_(cols);}
public static Db_qry_delete delete_(String tbl, Criteria crt) {return Db_qry_delete.new_(tbl, crt);}
public static Db_qry_delete delete_tbl_(String tbl) {return Db_qry_delete.new_(tbl);}
public static Db_qry_insert insert_(String tbl) {return new Db_qry_insert(tbl);}
public static Db_qry_insert insert_common_(String tbl, KeyVal... pairs) {
public static Db_qry_insert insert_common_(String tbl, Keyval... pairs) {
Db_qry_insert cmd = new Db_qry_insert(tbl);
for (KeyVal pair : pairs)
for (Keyval pair : pairs)
cmd.Val_obj(pair.Key(), pair.Val());
return cmd;
}
public static Sql_join_itm New_join__join(String trg_fld, String src_tbl, String src_fld) {return new Sql_join_itm(trg_fld, src_tbl, src_fld);}
public static Sql_join_itm New_join__same(String tbl, String fld) {return new Sql_join_itm(fld, tbl, fld);}
public static Sql_join_fld New_join__join(String trg_fld, String src_tbl, String src_fld) {return new Sql_join_fld(trg_fld, src_tbl, src_fld);}
public static Sql_join_fld New_join__same(String tbl, String fld) {return new Sql_join_fld(fld, tbl, fld);}
public static Db_qry_update update_(String tbl, Criteria crt) {
Db_qry_update update = new Db_qry_update();
@ -42,10 +42,10 @@ public class Db_qry_ {
update.Where_(crt);
return update;
}
public static Db_qry_update update_common_(String tbl, Criteria crt, KeyVal... pairs) {
public static Db_qry_update update_common_(String tbl, Criteria crt, Keyval... pairs) {
Db_qry_update cmd = new Db_qry_update();
cmd.From_(tbl); cmd.Where_(crt);
for (KeyVal pair : pairs)
for (Keyval pair : pairs)
cmd.Val_obj(pair.Key(), pair.Val());
return cmd;
}

@ -18,10 +18,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.dbs; import gplx.*;
import gplx.dbs.qrys.*; import gplx.core.gfo_ndes.*;
public class Db_qry_fxt {
public static void Insert_kvo(Db_conn conn, String tblName, KeyValList kvList) {
public static void Insert_kvo(Db_conn conn, String tblName, Keyval_list kvList) {
Db_qry_insert qry = Db_qry_.insert_(tblName);
for (int i = 0; i < kvList.Count(); i++) {
KeyVal kv = kvList.GetAt(i);
Keyval kv = kvList.Get_at(i);
qry.Val_obj(kv.Key(), kv.Val());
}
qry.Exec_qry(conn);
@ -52,4 +52,16 @@ public class Db_qry_fxt {
}
}
}
public static String Db__print_tbl_as_str(Bry_bfr bfr, Db_conn conn, String tbl, String... cols) {
int cols_len = cols.length;
Db_rdr rdr = conn.Stmt_select(tbl, cols).Exec_select__rls_auto();
while (rdr.Move_next()) {
for (int i = 0; i < cols_len; ++i) {
bfr.Add_obj(rdr.Read_at(i));
bfr.Add_byte(i == cols_len - 1 ? Byte_ascii.Nl : Byte_ascii.Pipe);
}
}
rdr.Rls();
return bfr.To_str_and_clear();
}
}

@ -29,6 +29,7 @@ public interface Db_rdr {
double Read_double(String k);
DateAdp Read_date_by_str(String k);
boolean Read_bool_by_byte(String k);
int Fld_len();
Object Read_obj(String k);
Object Read_at(int i);
void Rls();

@ -32,6 +32,7 @@ class Db_rdr__empty implements Db_rdr {
public float Read_float(String k) {return Float_.NaN;}
public double Read_double(String k) {return Double_.NaN;}
public boolean Read_bool_by_byte(String k) {return false;}
public int Fld_len() {return 0;}
public Object Read_obj(String k) {return null;}
public Object Read_at(int i) {return null;}
public void Rls() {}

@ -37,8 +37,9 @@ public class Db_rdr__basic implements Db_rdr {
@gplx.Virtual public double Read_double(String k) {try {return Double_.cast(rdr.getObject(k));} catch (Exception e) {throw Err_.new_exc(e, "db", "read failed", "key", k, "type", Double_.Cls_val_name);}}
@gplx.Virtual public byte Read_byte(String k) {try {return Byte_.cast(rdr.getObject(k));} catch (Exception e) {throw Err_.new_exc(e, "db", "read failed", "key", k, "type", Byte_.Cls_val_name);}}
@gplx.Virtual public boolean Read_bool_by_byte(String k) {try {return Byte_.cast(rdr.getObject(k)) == 1;} catch (Exception e) {throw Err_.new_exc(e, "db", "read failed", "key", k, "type", Bool_.Cls_val_name);}}
@gplx.Virtual public int Fld_len() {try {return rdr.getMetaData().getColumnCount();} catch (Exception e) {throw Err_.new_exc(e, "db", "field count failed", "sql", sql);}}
@gplx.Virtual public Object Read_obj(String k) {try {return rdr.getObject(k);} catch (Exception e) {throw Err_.new_exc(e, "db", "read failed", "key", k, "type", Object_.Cls_val_name);}}
@gplx.Virtual public Object Read_at(int i) {try {return rdr.getObject(i);} catch (Exception e) {throw Err_.new_exc(e, "db", "read failed", "idx", i, "type", Object_.Cls_val_name);}}
@gplx.Virtual public Object Read_at(int i) {try {return rdr.getObject(i + 1);} catch (Exception e) {throw Err_.new_exc(e, "db", "read failed", "idx", i, "type", Object_.Cls_val_name);}}
@gplx.Virtual public void Rls() {
try {rdr.close();}
catch (Exception e) {throw Err_.new_exc(e, "db", "close failed");}

@ -55,4 +55,18 @@ public class Db_stmt_ {
throw Err_.new_exc(e, "core", "db call failed", "tbl", tbl, "proc", proc);
}
public static Db_stmt Rls(Db_stmt v) {if (v != null) v.Rls(); return null;}
public static void Val_by_obj(Db_stmt stmt, String key, Object val) {
int tid = Type_adp_.To_tid_obj(val);
switch (tid) {
case Type_adp_.Tid__bool: stmt.Val_bool_as_byte (key, Bool_.cast(val)); break;
case Type_adp_.Tid__byte: stmt.Val_byte (key, Byte_.cast(val)); break;
case Type_adp_.Tid__int: stmt.Val_int (key, Int_.cast(val)); break;
case Type_adp_.Tid__long: stmt.Val_long (key, Long_.cast(val)); break;
case Type_adp_.Tid__float: stmt.Val_float (key, Float_.cast(val)); break;
case Type_adp_.Tid__double: stmt.Val_double (key, Double_.cast(val)); break;
case Type_adp_.Tid__str: stmt.Val_str (key, String_.cast(val)); break;
case Type_adp_.Tid__bry: stmt.Val_bry (key, Bry_.cast(val)); break;
default: throw Err_.new_unhandled_default(tid);
}
}
}

@ -61,4 +61,21 @@ public class Dbmeta_fld_itm {
rv[i] = ary[i].name;
return rv;
}
public static String Make_or_null(Db_conn conn, Dbmeta_fld_list flds, String tbl_name, int fld_type, Object fld_dflt, String fld_name) {
boolean tbl_exists = conn.Meta_tbl_exists(tbl_name);
boolean fld_exists = true;
if (tbl_exists) {
fld_exists = conn.Meta_fld_exists(tbl_name, fld_name);
if (!fld_exists) return Dbmeta_fld_itm.Key_null;
}
Dbmeta_fld_itm fld = null;
switch (fld_type) {
case Dbmeta_fld_tid.Tid__int: fld = Dbmeta_fld_itm.new_int(fld_name); break;
}
if (fld_dflt != null) fld.Default_(fld_dflt);
flds.Add(fld);
return fld.name;
}
public static String To_double_str_by_int(int v) {return Int_.To_str(v) + ".0";}
}

@ -20,9 +20,10 @@ public class Dbmeta_fld_list {
private final Ordered_hash flds = Ordered_hash_.New();
private final List_adp keys = List_adp_.new_();
public void Clear() {flds.Clear(); keys.Clear(); str_ary = null; fld_ary = null;}
public int Len() {return flds.Len();}
public Dbmeta_fld_itm Get_by(String name) {return (Dbmeta_fld_itm)flds.Get_by(name);}
public Dbmeta_fld_itm Get_at(int idx) {return (Dbmeta_fld_itm)flds.Get_at(idx);}
public String[] To_str_ary() {if (str_ary == null) str_ary = (String[])keys.To_ary(String.class); return str_ary;} private String[] str_ary;
public String[] To_str_ary() {if (str_ary == null) str_ary = (String[])keys.To_ary(String.class); return str_ary;} private String[] str_ary;
public Dbmeta_fld_itm[] To_fld_ary() {if (fld_ary == null) fld_ary = (Dbmeta_fld_itm[])flds.To_ary(Dbmeta_fld_itm.class); return fld_ary;} private Dbmeta_fld_itm[] fld_ary;
public String[] To_str_ary_wo_autonum() {
int len = flds.Count();
@ -72,6 +73,7 @@ public class Dbmeta_fld_list {
public String Add_str_dflt(String name, int len, String dflt)
{return Add(Dbmeta_fld_itm.new_str(name, len).Default_(dflt));}
public String Add(Dbmeta_fld_itm fld) {
fld_ary = null; str_ary = null;
String name = fld.Name();
flds.Add(name, fld);
keys.Add(name);

@ -15,8 +15,8 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.dbs.metas; import gplx.*; import gplx.dbs.*;
import gplx.dbs.engines.sqlite.*;
package gplx.dbs; import gplx.*;
import gplx.dbs.engines.sqlite.*; // for Tid_sqlite; note that Tid_sqlite is not used, and only exists for doc purposes
public class Dbmeta_fld_tid {
public Dbmeta_fld_tid(int tid_ansi, int tid_sqlite, byte[] name, int len_1, int len_2) {
this.tid_ansi = tid_ansi; this.tid_sqlite = tid_sqlite; this.name = name; this.len_1 = len_1; this.len_2 = len_2;

@ -72,8 +72,8 @@ class Gfdb_diff_bldr_fxt {
}
public void Clear() {
ctx.Clear();
Db_conn_utl.Tbl__delete(old_conn, "tbl");
Db_conn_utl.Tbl__delete(new_conn, "tbl");
old_conn.Meta_tbl_drop("tbl");
new_conn.Meta_tbl_drop("tbl");
}
public void Init__tbl__old(Object[]... rows) {Db_conn_utl.Tbl__new(old_conn, "tbl", flds_ary, rows);}
public void Init__tbl__cur(Object[]... rows) {Db_conn_utl.Tbl__new(new_conn, "tbl", flds_ary, rows);}

@ -31,7 +31,7 @@ public class Gfdb_diff_wkr__db implements Gfdb_diff_wkr {
this.uid = 0; this.prog_count = 0;
String dif_tbl = tbl.Name; Dbmeta_fld_itm[] dif_flds = Gfdb_diff_wkr__db_.New_dif_flds(tbl.Flds);
if (!dif_conn.Meta_tbl_exists(dif_tbl)) dif_conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(dif_tbl, dif_flds));
if (!dif_conn.Meta_tbl_exists(dif_tbl)) dif_conn.Meta_tbl_create(Dbmeta_tbl_itm.New(dif_tbl, dif_flds));
this.stmt = dif_conn.Stmt_insert(dif_tbl, Gfdb_diff_wkr__db_.To_str_ary(dif_flds));
dif_conn.Txn_bgn("dif_db_tbl_" + dif_tbl);
cmd_create = true;

@ -45,7 +45,7 @@ class Gfdb_diff_cmd__idx__create implements Gfo_srl_itm {
rdr.Itm_end();
}
public void Exec(Db_conn conn) {
conn.Ddl_create_idx(cur);
conn.Meta_idx_create(cur);
}
}
class Gfdb_diff_cmd__idx__fld implements Gfo_srl_itm {

@ -26,7 +26,7 @@ public class Gdif_cmd_tbl implements Rls_able {
fld_grp_id = flds.Add_int("grp_id"); fld_cmd_id = flds.Add_int("cmd_id"); fld_tid = flds.Add_int("tid"); fld_data = flds.Add_text("data");
conn.Rls_reg(this);
}
public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "main", fld_grp_id, fld_cmd_id)));}
public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "main", fld_grp_id, fld_cmd_id)));}
public Gdif_cmd_itm Insert(int grp_id, int cmd_id, int tid, String data) {
if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
stmt_insert.Clear()

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

Loading…
Cancel
Save