1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2026-03-02 03:49:30 +00:00
This commit is contained in:
gnosygnu
2015-01-25 20:56:50 -05:00
parent 1b0042ef8a
commit efaf9dcd00
447 changed files with 10258 additions and 3016 deletions

View File

@@ -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_arg {
@gplx.Internal protected Db_arg(String key, Object val) {this.key = key; this.val = val;}
public String Key() {return key;} private String key;
public Object Val() {return val;} public void Val_(Object v) {this.val = v;} private Object val;
public byte Val_tid() {return val_tid;} public Db_arg Val_tid_(byte v) {val_tid = v; return this;} private byte val_tid = Db_val_type.Tid_null;
}

View File

@@ -17,8 +17,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.dbs; import gplx.*;
public interface Db_qry {
int Tid();
String KeyOfDb_qry();
boolean ExecRdrAble();
String XtoSql();
int Tid();
boolean Exec_is_rdr();
String Base_table();
String Xto_sql();
}

View File

@@ -22,11 +22,11 @@ public class Db_qry_ {
public static Db_qry_select select_val_(String tbl, String col, Criteria crt) {return select_().From_(tbl).Where_(crt).Cols_(col);}
public static Db_qry_select select_tbl_(String tbl) {return select_().From_(tbl);}
public static Db_qry_select select_() {return Db_qry_select.new_();}
public static Db_qry_delete delete_(String tbl, Criteria crt) {return Db_qry_delete.new_().BaseTable_(tbl).Where_(crt);}
public static Db_qry_delete delete_tbl_(String tbl) {return Db_qry_delete.new_().BaseTable_(tbl);}
public static Db_qry_insert insert_(String tbl) {return Db_qry_insert.new_().BaseTable_(tbl);}
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) {
Db_qry_insert cmd = Db_qry_insert.new_().BaseTable_(tbl);
Db_qry_insert cmd = new Db_qry_insert(tbl);
for (KeyVal pair : pairs)
cmd.Arg_obj_(pair.Key(), pair.Val());
return cmd;
@@ -47,14 +47,5 @@ public class Db_qry_ {
}
public static final Object WhereAll = null;
public static Db_qry as_(Object obj) {return obj instanceof Db_qry ? (Db_qry)obj : null;}
public static final int Tid_basic = 0, Tid_select_in_tbl = 1;
}
interface Db_qryWkr {
Object Exec(Db_engine engine, Db_qry cmd);
}
class Db_qryWkr_ {
public static final Db_qryWkr Null = new Db_qryWrk_null();
}
class Db_qryWrk_null implements Db_qryWkr {
public Object Exec(Db_engine engine, Db_qry cmd) {return null;}
public static final int Tid_insert = 0, Tid_delete = 1, Tid_update = 2, Tid_select = 3, Tid_sql = 4, Tid_select_in_tbl = 5, Tid_flush = 6;
}

View File

@@ -20,8 +20,10 @@ public class Db_qry__select_in_tbl implements Db_qry {
public Db_qry__select_in_tbl(String tbl_name, String[] select_flds, String[] where_flds, String group_by_sql, String having_sql, String order_by_sql, String limit_sql) {
this.tbl_name = tbl_name; this.select_flds = select_flds; this.where_flds = where_flds; this.group_by_sql = group_by_sql; this.having_sql = having_sql; this.order_by_sql = order_by_sql; this.limit_sql = limit_sql;
}
public int Tid() {return Db_qry_.Tid_select_in_tbl;}
public String Tbl_name() {return tbl_name;} private final String tbl_name;
public int Tid() {return Db_qry_.Tid_select_in_tbl;}
public boolean Exec_is_rdr() {return true;}
public String Base_table() {return tbl_name;} private final String tbl_name;
public String From() {return tbl_name;}
public String[] Select_flds() {return select_flds;} private final String[] select_flds;
public String[] Where_flds() {return where_flds;} private final String[] where_flds;
public void Where_sql(String_bldr sb) {
@@ -37,9 +39,6 @@ public class Db_qry__select_in_tbl implements Db_qry {
public String Having_sql() {return having_sql;} private final String having_sql;
public String Order_by_sql() {return order_by_sql;} public Db_qry__select_in_tbl Order_by_sql_(String v) {order_by_sql = v; return this;} private String order_by_sql;
public String Limit_sql() {return limit_sql;} private final String limit_sql;
public static Db_qry__select_in_tbl new_(String tbl_name, String[] where_flds, String[] select_flds) {return new Db_qry__select_in_tbl(tbl_name, select_flds, where_flds, null, null, null, null);}
public String KeyOfDb_qry() {return "select_in_tbl";}
public boolean ExecRdrAble() {return true;}
public String XtoSql() {return Xto_sql();}
public String Xto_sql() {
String_bldr sb = String_bldr_.new_();
@@ -57,5 +56,9 @@ public class Db_qry__select_in_tbl implements Db_qry {
if (limit_sql != null) sb.Add(limit_sql);
return sb.XtoStr();
}
public static Db_qry__select_in_tbl new_(String tbl_name, String[] where_flds, String[] select_flds) {
Db_qry__select_in_tbl rv = new Db_qry__select_in_tbl(tbl_name, select_flds, where_flds, null, null, null, null);
return rv;
}
public static final String[] Where_flds__all = null;
}

View File

@@ -18,7 +18,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.dbs; import gplx.*;
public interface Db_qry_arg_owner extends Db_qry {
Db_qry_arg_owner From_(String tbl);
Db_qry_arg_owner Key_arg_(String k, int v);
Db_qry_arg_owner Key_arg_(String k, String v);
Db_qry_arg_owner Arg_(String k, int v);
@@ -32,9 +31,3 @@ public interface Db_qry_arg_owner extends Db_qry {
Db_qry_arg_owner Arg_obj_(String key, Object val);
Db_qry_arg_owner Arg_obj_type_(String key, Object val, byte val_tid);
}
class Db_arg {
public String Key() {return key;} private String key;
public Object Val() {return val;} public Db_arg Val_(Object v) {val = v; return this;} Object val;
public byte Val_tid() {return val_tid;} public Db_arg Val_tid_(byte v) {val_tid = v; return this;} private byte val_tid = Db_val_type.Tid_null;
@gplx.Internal protected Db_arg(String key, Object val) {this.key = key; this.val = val;}
}

View File

@@ -16,24 +16,26 @@ 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.criterias.*;
public class Db_qry_delete implements Db_qry {
public int Tid() {return Db_qry_.Tid_basic;}
public String KeyOfDb_qry() {return KeyConst;} public static final String KeyConst = "DELETE";
public boolean ExecRdrAble() {return false;}
public String XtoSql() {return Sql_cmd_wtr_.Ansi.XtoSqlQry(this, false);}
public int Exec_qry(Db_provider provider) {return provider.Exec_qry(this);}
public Db_qry_delete Where_add_(String key, int val) {
Criteria crt = Db_crt_.eq_(key, val);
where = Sql_where.merge_or_new_(where, crt);
return this;
}
@gplx.Internal protected String BaseTable() {return baseTable;} public Db_qry_delete BaseTable_(String baseTable_) {baseTable = baseTable_; return this;} private String baseTable;
@gplx.Internal protected Sql_where Where() {return where;} public Db_qry_delete Where_(Criteria crt) {where = Sql_where.new_(crt); return this;} Sql_where where;
public static Db_qry_delete new_() {return new Db_qry_delete();} Db_qry_delete() {}
import gplx.criterias.*; import gplx.dbs.sqls.*;
public class Db_qry_delete implements Db_qry {
Db_qry_delete(String base_table, Criteria where) {this.base_table = base_table; this.where = where;}
public int Tid() {return Db_qry_.Tid_delete;}
public boolean Exec_is_rdr() {return false;}
public String Base_table() {return base_table;} private final String base_table;
public String Xto_sql() {return Sql_qry_wtr_.I.Xto_str(this, false);}
public Criteria Where() {return where;} private final Criteria where;
public int Exec_qry(Db_conn conn) {return conn.Exec_qry(this);}
public String[] Where_cols() {return where_cols;} private String[] where_cols;
public static Db_qry_delete new_all_(String tbl) {
Db_qry_delete rv = new Db_qry_delete();
rv.baseTable = tbl;
Db_qry_delete rv = new_(tbl, Criteria_.All);
rv.where_cols = String_.Ary_empty;
return rv;
}
public static Db_qry_delete new_(String tbl, String... where) {
Db_qry_delete rv = Db_qry_delete.new_(tbl, Db_crt_.eq_many_(where));
rv.where_cols = where;
return rv;
}
public static Db_qry_delete new_(String tbl, Criteria where) {return new Db_qry_delete(tbl, where);}
}

View File

@@ -20,11 +20,11 @@ import org.junit.*;
import gplx.criterias.*;
public class Db_qry_dml_tst {
@Test public void Delete_basic() {
tst_XtoSql(Db_qry_delete.new_().BaseTable_("tbl0").Where_(Db_crt_.eq_("fld0", "val0"))
tst_XtoSql(Db_qry_delete.new_("tbl0", Db_crt_.eq_("fld0", "val0"))
, "DELETE FROM tbl0 WHERE fld0='val0'");
}
@Test public void Insert_basic() {
tst_XtoSql(Db_qry_insert.new_().BaseTable_("tbl0").Arg_("id", 0).Arg_("name", "me").Arg_("time", DateAdp_.parse_gplx("2007-12-23"))
tst_XtoSql(new Db_qry_insert("tbl0").Arg_("id", 0).Arg_("name", "me").Arg_("time", DateAdp_.parse_gplx("2007-12-23"))
, "INSERT INTO tbl0 (id, name, time) VALUES (0, 'me', '2007-12-23 00:00:00.000')");
}
@Test public void Update_basic() {
@@ -40,5 +40,5 @@ public class Db_qry_dml_tst {
qry.Where_(Criteria_.And(Db_crt_.eq_("id", 0), Db_crt_.mt_("startTime", DateAdp_.parse_gplx("2005-01-01"))));
tst_XtoSql(qry, "UPDATE tbl0 SET id=1, name='me', startTime='2007-12-23 00:00:00.000' WHERE (id=0 AND startTime>'2005-01-01 00:00:00.000')");
}
void tst_XtoSql(Db_qry qry, String expd) {Tfds.Eq(expd, qry.XtoSql());}
void tst_XtoSql(Db_qry qry, String expd) {Tfds.Eq(expd, qry.Xto_sql());}
}

View File

@@ -16,14 +16,16 @@ 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.*;
public class Db_qry_flush implements Db_qry {
public int Tid() {return Db_qry_.Tid_basic;}
public String KeyOfDb_qry() {return KeyConst;} public static final String KeyConst = "FLUSH";
public boolean ExecRdrAble() {return false;}
public int Exec_qry(Db_provider provider) {return provider.Exec_qry(this);}
public String XtoSql() {return Sql_cmd_wtr_.Ansi.XtoSqlQry(this, false);}
public int Tid() {return Db_qry_.Tid_flush;}
public boolean Exec_is_rdr() {return false;}
public String Base_table() {return tableNames[0];}
public String Xto_sql() {return Sql_qry_wtr_.I.Xto_str(this, false);}
public int Exec_qry(Db_conn conn) {return conn.Exec_qry(this);}
@gplx.Internal protected String[] TableNames() {return tableNames;} private String[] tableNames;
public static Db_qry_flush as_(Object obj) {return obj instanceof Db_qry_flush ? (Db_qry_flush)obj : null;}
public static Db_qry_flush cast_(Object obj) {try {return (Db_qry_flush)obj;} catch(Exception exc) {throw Err_.type_mismatch_exc_(exc, Db_qry_flush.class, obj);}}

View File

@@ -16,13 +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.dbs.sqls.*;
public class Db_qry_insert implements Db_qry_arg_owner {
public int Tid() {return Db_qry_.Tid_basic;}
public String KeyOfDb_qry() {return KeyConst;} public static final String KeyConst = "INSERT";
public boolean ExecRdrAble() {return false;}
public String XtoSql() {return Sql_cmd_wtr_.Ansi.XtoSqlQry(this, false);}
public int Exec_qry(Db_provider provider) {return provider.Exec_qry(this);}
public Db_qry_arg_owner From_(String tbl) {baseTable = tbl; return this;}
public Db_qry_insert(String base_table) {this.base_table = base_table;}
public int Tid() {return Db_qry_.Tid_insert;}
public boolean Exec_is_rdr() {return false;}
public String Base_table() {return base_table;} private String base_table;
public String Xto_sql() {return Sql_qry_wtr_.I.Xto_str(this, false);}
public int Exec_qry(Db_conn conn) {return conn.Exec_qry(this);}
public Db_qry_arg_owner From_(String tbl) {base_table = tbl; return this;}
public Db_qry_arg_owner Arg_(String k, DecimalAdp v) {return Arg_obj_type_(k, v.Xto_decimal(), Db_val_type.Tid_decimal);}
public Db_qry_arg_owner Arg_(String k, DateAdp v) {return Arg_obj_type_(k, v, Db_val_type.Tid_date);}
public Db_qry_arg_owner Arg_byte_(String k, byte v) {return Arg_obj_type_(k, v, Db_val_type.Tid_byte);}
@@ -47,9 +49,18 @@ public class Db_qry_insert implements Db_qry_arg_owner {
cols.Add(Sql_select_fld_fld.new_(Sql_select_fld_base.Tbl_null, fld, fld));
return this;
}
@gplx.Internal protected String BaseTable() {return baseTable;} public Db_qry_insert BaseTable_(String val) {baseTable = val; return this;} private String baseTable;
@gplx.Internal protected KeyValHash Args() {return args;} KeyValHash args = KeyValHash.new_();
@gplx.Internal protected Sql_select_fld_list Cols() {return cols;} Sql_select_fld_list cols;
public KeyValHash Args() {return args;} private final KeyValHash args = KeyValHash.new_();
@gplx.Internal protected Sql_select_fld_list Cols() {return cols;} private Sql_select_fld_list cols;
public String[] Cols_for_insert() {return cols_for_insert;} private String[] cols_for_insert;
public static Db_qry_insert new_() {return new Db_qry_insert();} Db_qry_insert() {}
public static Db_qry_insert new_(String tbl, String... keys) {
Db_qry_insert rv = Db_qry_insert.new_();
rv.base_table = tbl;
rv.cols_for_insert = keys;
int len = keys.length;
for (int i = 0; i < len; ++i)
rv.Arg_obj_(keys[i], null);
return rv;
}
}

View File

@@ -16,18 +16,19 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.dbs; import gplx.*;
import gplx.criterias.*;
import gplx.criterias.*; import gplx.dbs.sqls.*;
public class Db_qry_select implements Db_qry {
public int Tid() {return Db_qry_.Tid_basic;}
public String KeyOfDb_qry() {return KeyConst;} public static final String KeyConst = "SELECT";
public boolean ExecRdrAble() {return true;}
public DataRdr Exec_qry_as_rdr(Db_provider provider) {return provider.Exec_qry_as_rdr(this);}
public GfoNde ExecRdr_nde(Db_provider provider) {
public int Tid() {return Db_qry_.Tid_select;}
public boolean Exec_is_rdr() {return true;}
public String Base_table() {return from.BaseTable().TblName();}
public String Xto_sql() {return Sql_qry_wtr_.I.Xto_str(this, false);}
public DataRdr Exec_qry_as_rdr(Db_conn conn) {return conn.Exec_qry_as_rdr(this);}
public GfoNde ExecRdr_nde(Db_conn conn) {
DataRdr rdr = DataRdr_.Null;
try {return GfoNde_.rdr_(Exec_qry_as_rdr(provider));} finally {rdr.Rls();}
try {return GfoNde_.rdr_(Exec_qry_as_rdr(conn));} finally {rdr.Rls();}
}
public Object ExecRdr_val(Db_provider provider) {
DataRdr rdr = Exec_qry_as_rdr(provider);
public Object ExecRdr_val(Db_conn conn) {
DataRdr rdr = Exec_qry_as_rdr(conn);
try {
Object rv = null;
if (rdr.MoveNextPeer()) {
@@ -46,7 +47,6 @@ public class Db_qry_select implements Db_qry {
} finally {rdr.Rls();}
}
public String XtoSql() {return Sql_cmd_wtr_.Ansi.XtoSqlQry(this, false);}
@gplx.Internal protected Sql_from From() {return from;} Sql_from from;
public Db_qry_select From_(String tblName) {return From_(tblName, null);}

View File

@@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.dbs; import gplx.*;
import org.junit.*;
import org.junit.*; import gplx.dbs.sqls.*;
public class Db_qry_select_tst {
@Before public void setup() {
cmd = Db_qry_select.new_();
@@ -85,5 +85,5 @@ public class Db_qry_select_tst {
// expd = "SELECT fld0, fld1 FROM tbl0 GROUP BY fld0, fld1 HAVING Count(fld0) > 1";
// Tfds.Eq(cmd.XtoStr(), expd);
// }
void tst_XtoStr(Db_qry qry, String expd) {Tfds.Eq(expd, cmd.XtoSql());}
void tst_XtoStr(Db_qry qry, String expd) {Tfds.Eq(expd, cmd.Xto_sql());}
}

View File

@@ -16,12 +16,13 @@ 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.*;
public class Db_qry_sql implements Db_qry {
public int Tid() {return Db_qry_.Tid_basic;}
public String KeyOfDb_qry() {return KeyConst;} public static final String KeyConst = "SQL";
public boolean ExecRdrAble() {return isReader;} private boolean isReader;
public int Exec_qry(Db_provider provider) {return provider.Exec_qry(this);}
public String XtoSql() {return sql;} private String sql;
public int Tid() {return Db_qry_.Tid_sql;}
public boolean Exec_is_rdr() {return isReader;} private boolean isReader;
public String Base_table() {throw Err_.not_implemented_();}
public String Xto_sql() {return sql;} private String sql;
public int Exec_qry(Db_conn conn) {return conn.Exec_qry(this);}
public static Db_qry_sql dml_(String sql) {return sql_(sql);}
public static Db_qry_sql ddl_(String sql) {return sql_(sql);}
public static Db_qry_sql xtn_(String sql) {return sql_(sql);}
@@ -37,4 +38,45 @@ public class Db_qry_sql implements Db_qry {
}
public static Db_qry_sql as_(Object obj) {return obj instanceof Db_qry_sql ? (Db_qry_sql)obj : null;}
public static Db_qry_sql cast_(Object obj) {try {return (Db_qry_sql)obj;} catch(Exception exc) {throw Err_.type_mismatch_exc_(exc, Db_qry_sql.class, obj);}}
public static String Gen_sql(Db_qry qry, Object... args) {
byte[] src = Bry_.new_utf8_(Sql_qry_wtr_.Gen_placeholder_parameters(qry));
int src_len = src.length;
int args_idx = 0, args_len = args.length, pos = 0;
Bry_bfr bfr = Bry_bfr.new_(src_len);
while (pos < src_len) {
int question_pos = Bry_finder.Find_fwd(src, Byte_ascii.Question, pos);
if (question_pos == Bry_.NotFound)
question_pos = src_len;
bfr.Add_mid(src, pos, question_pos);
if (args_idx < args_len)
Gen_sql_arg(bfr, args[args_idx++]);
pos = question_pos + 1;
}
return bfr.Xto_str_and_clear();
}
private static void Gen_sql_arg(Bry_bfr bfr, Object val) {
if (val == null) {bfr.Add(Bry_null); return;}
Class<?> val_type = val.getClass();
if (ClassAdp_.Eq(val_type, Int_.Cls_ref_type))
bfr.Add_int_variable(Int_.cast_(val));
else if (ClassAdp_.Eq(val_type, Bool_.Cls_ref_type))
bfr.Add_int_fixed(1, Bool_.Xto_int(Bool_.cast_(val))); // NOTE: save boolean to 0 or 1, b/c (a) db may not support bit datatype (sqllite) and (b) avoid i18n issues with "true"/"false"
else if (ClassAdp_.Eq(val_type, Double_.Cls_ref_type))
bfr.Add_double(Double_.cast_(val));
else if (ClassAdp_.Eq(val_type, Long_.Cls_ref_type))
bfr.Add_long_variable(Long_.cast_(val));
else if (ClassAdp_.Eq(val_type, Float_.Cls_ref_type))
bfr.Add_float(Float_.cast_(val));
else if (ClassAdp_.Eq(val_type, Byte_.Cls_ref_type))
bfr.Add_byte(Byte_.cast_(val));
else if (ClassAdp_.Eq(val_type, DateAdp_.Cls_ref_type))
bfr.Add_byte_apos().Add_str(DateAdp_.cast_(val).XtoStr_gplx_long()).Add_byte_apos();
else if (ClassAdp_.Eq(val_type, DecimalAdp_.Cls_ref_type))
bfr.Add_str(DecimalAdp_.cast_(val).Xto_str());
else {
byte[] val_bry = Bry_.new_utf8_(Object_.Xto_str_strict_or_null(val));
val_bry = Bry_.Replace(val_bry, Byte_ascii.Apos_bry, Bry_escape_apos);
bfr.Add_byte_apos().Add(val_bry).Add_byte_apos();
}
} private static final byte[] Bry_null = Bry_.new_utf8_("NULL"), Bry_escape_apos = Bry_.new_ascii_("''");
}

View File

@@ -0,0 +1,47 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.dbs; import gplx.*;
import org.junit.*;
public class Db_qry_sql_tst {
@Before public void init() {fxt.Clear();} private Db_qry_sql_fxt fxt = new Db_qry_sql_fxt();
@Test public void Insert() {
fxt.Test_qry
( Db_qry_insert.new_("tbl", "k1", "k2", "k3", "k4", "k5", "k6", "k7", "k8", "k9")
, Object_.Ary(123, Bool_.Y, 1.23d, 123L, 123f, Byte_ascii.Num_1, "123", DateAdp_.parse_iso8561("1981-04-05T14:30:30"), DecimalAdp_.parse_("1.23"))
, "INSERT INTO tbl (k1, k2, k3, k4, k5, k6, k7, k8, k9) VALUES (123, 1, 1.23, 123, 123, 1, '123', '1981-04-05 14:30:30.000', 1.23)"
);
}
@Test public void Update() {
fxt.Test_qry
( Db_qry_update.new_("tbl", String_.Ary("k1", "k2"), "k3", "k4")
, Object_.Ary("v3", "v4", "v1", "v2")
, "UPDATE tbl SET k3='v3', k4='v4' WHERE (k1='v1' AND k2='v2')"
);
}
@Test public void Delete() {
fxt.Test_qry
( Db_qry_delete.new_("tbl", String_.Ary("k1", "k2"))
, Object_.Ary("v1", "v2")
, "DELETE FROM tbl WHERE (k1='v1' AND k2='v2')"
);
}
}
class Db_qry_sql_fxt {
public void Clear() {}
public void Test_qry(Db_qry qry, Object[] vals, String expd) {Tfds.Eq(expd, Db_qry_sql.Gen_sql(qry, vals));}
}

View File

@@ -16,14 +16,13 @@ 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.criterias.*;
import gplx.criterias.*; import gplx.dbs.sqls.*;
public class Db_qry_update implements Db_qry_arg_owner {
public int Tid() {return Db_qry_.Tid_basic;}
public String KeyOfDb_qry() {return KeyConst;} public static final String KeyConst = "UPDATE";
public boolean ExecRdrAble() {return false;}
public int Exec_qry(Db_provider provider) {return provider.Exec_qry(this);}
public String XtoSql() {return Sql_cmd_wtr_.Ansi.XtoSqlQry(this, false);}
public int Tid() {return Db_qry_.Tid_update;}
public boolean Exec_is_rdr() {return false;}
public String Base_table() {return baseTable;}
public String Xto_sql() {return Sql_qry_wtr_.I.Xto_str(this, false);}
public int Exec_qry(Db_conn conn) {return conn.Exec_qry(this);}
public Db_qry_arg_owner From_(String tbl) {baseTable = tbl; return this;}
public Db_qry_arg_owner Arg_(String k, DecimalAdp v) {return Arg_obj_type_(k, v.Xto_decimal(), Db_val_type.Tid_decimal);}
public Db_qry_arg_owner Arg_(String k, DateAdp v) {return Arg_obj_type_(k, v, Db_val_type.Tid_date);}
@@ -46,9 +45,19 @@ public class Db_qry_update implements Db_qry_arg_owner {
where = Sql_where.merge_or_new_(where, crt);
return this;
}
public KeyValHash Args() {return args;} private final KeyValHash args = KeyValHash.new_();
@gplx.Internal protected String BaseTable() {return baseTable;} private String baseTable;
@gplx.Internal protected KeyValHash Args() {return args;} final KeyValHash args = KeyValHash.new_();
@gplx.Internal protected Sql_where Where() {return where;} public Db_qry_update Where_(Criteria crt) {where = Sql_where.new_(crt); return this;} Sql_where where;
@gplx.Internal protected Sql_where Where() {return where;} public Db_qry_update Where_(Criteria crt) {where = Sql_where.new_(crt); return this;} private Sql_where where;
public String[] Cols_where() {return cols_where;} private String[] cols_where;
public String[] Cols_update() {return cols_update;} private String[] cols_update;
public static Db_qry_update new_() {return new Db_qry_update();} Db_qry_update() {}
public static Db_qry_update new_(String tbl, String[] where, String... update) {
Db_qry_update rv = Db_qry_.update_(tbl, Db_crt_.eq_many_(where));
rv.cols_update = update;
rv.cols_where = where;
int len = update.length;
for (int i = 0; i < len; i++)
rv.Arg_obj_(update[i], null);
return rv;
}
}

View File

@@ -17,19 +17,36 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.dbs; import gplx.*;
public interface Db_stmt extends RlsAble {
Db_provider Provider();
Db_stmt Val_bool_(boolean v);
Db_stmt Val_byte_(byte v);
Db_stmt Val_byte_by_bool_(boolean v);
Db_stmt Val_int_(int v);
Db_stmt Val_long_(long v);
Db_stmt Val_float_(float v);
Db_stmt Val_double_(double v);
Db_stmt Val_decimal_(DecimalAdp v);
Db_stmt Val_bry_(byte[] v);
Db_stmt Val_bry_by_str_(String v);
Db_stmt Val_str_by_bry_(byte[] v);
Db_stmt Val_str_(String v);
Db_stmt Crt_bool_as_byte(String k, boolean v);
Db_stmt Val_bool_as_byte(String k, boolean v);
Db_stmt Val_bool_as_byte(boolean v);
Db_stmt Crt_byte(String k, byte v);
Db_stmt Val_byte(String k, byte v);
Db_stmt Val_byte(byte v);
Db_stmt Crt_int(String k, int v);
Db_stmt Val_int(String k, int v);
Db_stmt Val_int(int v);
Db_stmt Crt_long(String k, long v);
Db_stmt Val_long(String k, long v);
Db_stmt Val_long(long v);
Db_stmt Crt_float(String k, float v);
Db_stmt Val_float(String k, float v);
Db_stmt Val_float(float v);
Db_stmt Crt_double(String k, double v);
Db_stmt Val_double(String k, double v);
Db_stmt Val_double(double v);
Db_stmt Crt_decimal(String k, DecimalAdp v);
Db_stmt Val_decimal(String k, DecimalAdp v);
Db_stmt Val_decimal(DecimalAdp v);
Db_stmt Crt_bry(String k, byte[] v);
Db_stmt Val_bry(String k, byte[] v);
Db_stmt Val_bry(byte[] v);
Db_stmt Crt_str(String k, String v);
Db_stmt Val_str(String k, String v);
Db_stmt Val_str(String v);
Db_stmt Crt_bry_as_str(String k, byte[] v);
Db_stmt Val_bry_as_str(String k, byte[] v);
Db_stmt Val_bry_as_str(byte[] v);
Db_stmt Val_rdr_(gplx.ios.Io_stream_rdr rdr, long rdr_len);
boolean Exec_insert();
int Exec_update();
@@ -38,5 +55,5 @@ public interface Db_stmt extends RlsAble {
Db_rdr Exec_select_as_rdr();
Object Exec_select_val();
Db_stmt Clear();
Db_stmt New();
Db_stmt Reset_stmt();
}

View File

@@ -18,39 +18,40 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.dbs; import gplx.*;
public class Db_stmt_ {
public static final Db_stmt Null = new Db_stmt_sql();
public static Db_stmt new_insert_(Db_provider provider, String tbl, String... flds) {
Db_qry_insert qry = Db_qry_insert.new_().BaseTable_(tbl);
int len = flds.length;
for (int i = 0; i < len; i++)
qry.Arg_obj_(flds[i], null);
return provider.Prepare(qry);
public static Db_stmt new_insert_(Db_conn conn, String tbl, String... flds) {
Db_qry qry = Db_qry_insert.new_(tbl, flds);
return conn.New_stmt(qry);
}
public static Db_stmt new_update_(Db_provider provider, String tbl, String[] where, String... flds) {
Db_qry_update qry = Db_qry_.update_(tbl, Db_crt_.eq_many_(where));
int len = flds.length;
for (int i = 0; i < len; i++)
qry.Arg_obj_(flds[i], null);
return provider.Prepare(qry);
public static Db_stmt new_update_(Db_conn conn, String tbl, String[] where, String... flds) {
Db_qry qry = Db_qry_update.new_(tbl, where, flds);
return conn.New_stmt(qry);
}
public static Db_stmt new_delete_(Db_provider provider, String tbl, String... where) {
public static Db_stmt new_delete_(Db_conn conn, String tbl, String... where) {
Db_qry_delete qry = Db_qry_.delete_(tbl, Db_crt_.eq_many_(where));
return provider.Prepare(qry);
return conn.New_stmt(qry);
}
public static Db_stmt new_select_(Db_provider provider, String tbl, String[] where, String... flds) {
public static Db_stmt new_select_(Db_conn conn, String tbl, String[] where, String... flds) {
Db_qry_select qry = Db_qry_.select_cols_(tbl, Db_crt_.eq_many_(where), flds);
return provider.Prepare(qry);
return conn.New_stmt(qry);
}
public static Db_stmt new_select_in_(Db_provider provider, String tbl, String in_fld, Object[] in_vals, String... flds) {
public static Db_stmt new_select_in_(Db_conn conn, String tbl, String in_fld, Object[] in_vals, String... flds) {
Db_qry_select qry = Db_qry_.select_cols_(tbl, Db_crt_.in_(in_fld, in_vals), flds).OrderBy_asc_(in_fld);
return provider.Prepare(qry);
return conn.New_stmt(qry);
}
public static Db_stmt new_select_all_(Db_provider provider, String tbl) {
return provider.Prepare(Db_qry_.select_tbl_(tbl));
public static Db_stmt new_select_all_(Db_conn conn, String tbl) {
return conn.New_stmt(Db_qry_.select_tbl_(tbl));
}
public static Db_stmt new_select_as_rdr(Db_provider provider, Db_qry__select_in_tbl qry) {
return provider.Prepare(qry);
public static Db_stmt new_select_as_rdr(Db_conn conn, Db_qry__select_in_tbl qry) {
return conn.New_stmt(qry);
}
public static Db_stmt new_select_as_rdr(Db_provider provider, String sql) {
return provider.Prepare(Db_qry_sql.rdr_(sql));
public static Db_stmt new_select_as_rdr(Db_conn conn, String sql) {
return conn.New_stmt(Db_qry_sql.rdr_(sql));
}
public static Err err_(Exception e, Db_stmt stmt, String proc) {
throw Err_.err_(e, String_.Format("db stmt failed: proc=~{0} err=~{1}", proc, Err_.Message_gplx_brief(e)));
}
public static Err err_(Exception e, String tbl, String proc) {
throw Err_.err_(e, String_.Format("db call failed: tbl=~{0} proc=~{1} err=~{2}", tbl, proc, Err_.Message_gplx_brief(e)));
}
public static Db_stmt Rls(Db_stmt v) {if (v != null) v.Rls(); return null;}
}

View File

@@ -17,32 +17,32 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.dbs; import gplx.*;
public class Db_stmt_bldr implements RlsAble {
private Db_provider provider;
private Db_conn conn;
private Db_stmt create, update, delete;
private String tbl_name; private String[] flds_keys, flds_vals, flds_all;
public Db_stmt_bldr(String tbl_name, String[] flds_keys, String... flds_vals) {
this.tbl_name = tbl_name; this.flds_keys = flds_keys; this.flds_vals = flds_vals;
flds_all = String_.Ary_add(flds_keys, flds_vals);
}
public Db_stmt_bldr Init(Db_provider v) {
this.provider = v;
provider.Txn_mgr().Txn_bgn_if_none();
public Db_stmt_bldr Init(Db_conn v) {
this.conn = v;
conn.Txn_mgr().Txn_bgn_if_none();
return this;
}
public Db_stmt Get(byte cmd_mode) {
switch (cmd_mode) {
case Db_cmd_mode.Create: if (create == null) create = Db_stmt_.new_insert_(provider, tbl_name, flds_all); return create;
case Db_cmd_mode.Update: if (update == null) update = Db_stmt_.new_update_(provider, tbl_name, flds_keys, flds_vals); return update;
case Db_cmd_mode.Delete: if (delete == null) delete = Db_stmt_.new_delete_(provider, tbl_name, flds_keys); return delete;
case Db_cmd_mode.Create: if (create == null) create = Db_stmt_.new_insert_(conn, tbl_name, flds_all); return create;
case Db_cmd_mode.Update: if (update == null) update = Db_stmt_.new_update_(conn, tbl_name, flds_keys, flds_vals); return update;
case Db_cmd_mode.Delete: if (delete == null) delete = Db_stmt_.new_delete_(conn, tbl_name, flds_keys); return delete;
case Db_cmd_mode.Ignore: return Db_stmt_.Null;
default: throw Err_.unhandled(cmd_mode);
}
}
public void Commit() {
provider.Txn_mgr().Txn_end_all();
conn.Txn_mgr().Txn_end_all();
}
public void Rls() {
provider = null;
conn = null;
create = Rls(create);
update = Rls(update);
delete = Rls(delete);

View File

@@ -17,57 +17,81 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.dbs; import gplx.*;
import java.sql.*;
import gplx.dbs.sqls.*;
class Db_stmt_cmd implements Db_stmt {
private Db_engine engine;
private final Db_engine engine;
private PreparedStatement stmt = null;
private String sql;
private int val_idx = 0;
public Db_stmt_cmd(Db_provider provider, Db_qry qry) {
this.provider = provider; this.engine = provider.Engine();
sql = qry.Tid() == Db_qry_.Tid_select_in_tbl ? ((Db_qry__select_in_tbl)qry).Xto_sql() : Sql_cmd_wtr_.Ansi.XtoSqlQry(qry, true);
New();
private String sql; private int val_idx = 0;
public Db_stmt_cmd(Db_engine engine, Db_qry qry) {
this.engine = engine;
sql = qry.Tid() == Db_qry_.Tid_select_in_tbl ? ((Db_qry__select_in_tbl)qry).Xto_sql() : Sql_qry_wtr_.I.Xto_str(qry, true);
Reset_stmt();
}
public Db_stmt New() {
stmt = (PreparedStatement)engine.New_db_cmd(sql);
public Db_stmt Reset_stmt() {
stmt = (PreparedStatement)engine.New_stmt_prep_as_obj(sql);
return this;
}
public Db_provider Provider() {return provider;} Db_provider provider;
public Db_stmt Val_bool_(boolean v) {
try {stmt.setBoolean(++val_idx, v);} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "int", v);}
return this;
}
public Db_stmt Val_byte_by_bool_(boolean v) {return Val_byte_(v ? Bool_.Y_byte : Bool_.N_byte);}
public Db_stmt Val_byte_(byte v) {
public Db_stmt Crt_bool_as_byte(String k, boolean v) {return Add_byte_by_bool(Bool_.Y, k, v);}
public Db_stmt Val_bool_as_byte(String k, boolean v) {return Add_byte_by_bool(Bool_.N, k, v);}
public Db_stmt Val_bool_as_byte(boolean v) {return Add_byte_by_bool(Bool_.N, null, v);}
private Db_stmt Add_byte_by_bool(boolean where, String k, boolean v) {return Add_byte(where, k, v ? Bool_.Y_byte : Bool_.N_byte);}
public Db_stmt Crt_byte(String k, byte v) {return Add_byte(Bool_.Y, k, v);}
public Db_stmt Val_byte(String k, byte v) {return Add_byte(Bool_.N, k, v);}
public Db_stmt Val_byte(byte v) {return Add_byte(Bool_.N, null, v);}
private Db_stmt Add_byte(boolean where, String k, byte v) {
try {stmt.setByte(++val_idx, v);} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "byte", v);}
return this;
}
public Db_stmt Val_int_(int v) {
public Db_stmt Crt_int(String k, int v) {return Add_int(Bool_.Y, k, v);}
public Db_stmt Val_int(String k, int v) {return Add_int(Bool_.N, k, v);}
public Db_stmt Val_int(int v) {return Add_int(Bool_.N, null, v);}
private Db_stmt Add_int(boolean where, String k, int v) {
try {stmt.setInt(++val_idx, v);} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "int", v);}
return this;
}
public Db_stmt Val_long_(long v) {
public Db_stmt Crt_long(String k, long v) {return Add_long(Bool_.Y, k, v);}
public Db_stmt Val_long(String k, long v) {return Add_long(Bool_.N, k, v);}
public Db_stmt Val_long(long v) {return Add_long(Bool_.N, null, v);}
private Db_stmt Add_long(boolean where, String k, long v) {
try {stmt.setLong(++val_idx, v);} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "long", v);}
return this;
}
public Db_stmt Val_float_(float v) {
public Db_stmt Crt_float(String k, float v) {return Add_float(Bool_.Y, k, v);}
public Db_stmt Val_float(String k, float v) {return Add_float(Bool_.N, k, v);}
public Db_stmt Val_float(float v) {return Add_float(Bool_.N, null, v);}
private Db_stmt Add_float(boolean where, String k, float v) {
try {stmt.setFloat(++val_idx, v);} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "float", v);}
return this;
}
public Db_stmt Val_double_(double v) {
public Db_stmt Crt_double(String k, double v) {return Add_double(Bool_.Y, k, v);}
public Db_stmt Val_double(String k, double v) {return Add_double(Bool_.N, k, v);}
public Db_stmt Val_double(double v) {return Add_double(Bool_.N, null, v);}
private Db_stmt Add_double(boolean where, String k, double v) {
try {stmt.setDouble(++val_idx, v);} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "double", v);}
return this;
}
public Db_stmt Val_decimal_(DecimalAdp v) {
public Db_stmt Crt_decimal(String k, DecimalAdp v) {return Add_decimal(Bool_.Y, k, v);}
public Db_stmt Val_decimal(String k, DecimalAdp v) {return Add_decimal(Bool_.N, k, v);}
public Db_stmt Val_decimal(DecimalAdp v) {return Add_decimal(Bool_.N, null, v);}
private Db_stmt Add_decimal(boolean where, String k, DecimalAdp v) {
try {stmt.setBigDecimal(++val_idx, v.Xto_decimal());} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "decimal", v);}
return this;
}
public Db_stmt Val_bry_by_str_(String v) {return Val_bry_(Bry_.new_utf8_(v));}
public Db_stmt Val_bry_(byte[] v) {
public Db_stmt Crt_bry(String k, byte[] v) {return Add_bry(Bool_.Y, k, v);}
public Db_stmt Val_bry(String k, byte[] v) {return Add_bry(Bool_.N, k, v);}
public Db_stmt Val_bry(byte[] v) {return Add_bry(Bool_.N, null, v);}
private Db_stmt Add_bry(boolean where, String k, byte[] v) {
try {stmt.setBytes(++val_idx, v);} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "byte[]", v.length);}
return this;
}
public Db_stmt Val_str_by_bry_(byte[] v) {return Val_str_(String_.new_utf8_(v));}
public Db_stmt Val_str_(String v) {
public Db_stmt Crt_bry_as_str(String k, byte[] v) {return Add_bry_as_str(Bool_.Y, k, v);}
public Db_stmt Val_bry_as_str(String k, byte[] v) {return Add_bry_as_str(Bool_.N, k, v);}
public Db_stmt Val_bry_as_str(byte[] v) {return Add_bry_as_str(Bool_.N, null, v);}
private Db_stmt Add_bry_as_str(boolean where, String k, byte[] v) {return Add_str(where, k, String_.new_utf8_(v));}
public Db_stmt Crt_str(String k, String v) {return Add_str(Bool_.Y, k, v);}
public Db_stmt Val_str(String k, String v) {return Add_str(Bool_.N, k, v);}
public Db_stmt Val_str(String v) {return Add_str(Bool_.N, null, v);}
private Db_stmt Add_str(boolean where, String k, String v) {
try {stmt.setString(++val_idx, v);} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "String", v);}
return this;
}
@@ -85,13 +109,13 @@ class Db_stmt_cmd implements Db_stmt {
try {int rv = stmt.executeUpdate(); return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql);}
}
public DataRdr Exec_select() {
try {DataRdr rv = engine.NewDataRdr(stmt.executeQuery(), sql); return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql);}
try {DataRdr rv = engine.New_rdr(stmt.executeQuery(), sql); return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql);}
}
public Db_rdr Exec_select_as_rdr() {
try {return engine.New_db_rdr(stmt.executeQuery(), sql);} catch (Exception e) {throw Err_.err_(e, "select failed: sql={0}", sql);}
try {return engine.New_rdr_by_obj(stmt.executeQuery(), sql);} catch (Exception e) {throw Err_.err_(e, "select failed: sql={0}", sql);}
}
public Object Exec_select_val() {
try {Object rv = Db_qry_select.Rdr_to_val(engine.NewDataRdr(stmt.executeQuery(), sql)); return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql);}
try {Object rv = Db_qry_select.Rdr_to_val(engine.New_rdr(stmt.executeQuery(), sql)); return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql);}
}
public Db_stmt Clear() {
val_idx = 0;

View File

@@ -16,48 +16,73 @@ 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.*;
class Db_stmt_sql implements Db_stmt {
public class Db_stmt_sql implements Db_stmt {// used for formatting SQL statements; not used for actual insert into database
private Bry_bfr tmp_bfr = Bry_bfr.new_();
private Bry_fmtr tmp_fmtr = Bry_fmtr.new_();
private int val_idx = 0;
public Db_provider Provider() {return provider;} public void Provider_(Db_provider v) {this.provider = v;} Db_provider provider;
public Db_stmt New() {return this;}
public Db_stmt Val_bool_(boolean v) {
try {Add(++val_idx, v ? "true" : "false");} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "int", v);}
return this;
}
public Db_stmt Val_byte_by_bool_(boolean v) {return Val_byte_(v ? Bool_.Y_byte : Bool_.N_byte);}
public Db_stmt Val_byte_(byte v) {
public Db_conn Conn() {return conn;} public void Conn_(Db_conn v) {this.conn = v;} Db_conn conn;
public Db_stmt Reset_stmt() {return this;}
public Db_stmt Crt_bool_as_byte(String k, boolean v) {return Add_byte_by_bool(Bool_.Y, k, v);}
public Db_stmt Val_bool_as_byte(String k, boolean v) {return Add_byte_by_bool(Bool_.N, k, v);}
public Db_stmt Val_bool_as_byte(boolean v) {return Add_byte_by_bool(Bool_.N, null, v);}
private Db_stmt Add_byte_by_bool(boolean where, String k, boolean v) {return Add_byte(where, k, v ? Bool_.Y_byte : Bool_.N_byte);}
public Db_stmt Crt_byte(String k, byte v) {return Add_byte(Bool_.Y, k, v);}
public Db_stmt Val_byte(String k, byte v) {return Add_byte(Bool_.N, k, v);}
public Db_stmt Val_byte(byte v) {return Add_byte(Bool_.N, null, v);}
private Db_stmt Add_byte(boolean where, String k, byte v) {
try {Add(++val_idx, Byte_.Xto_str(v));} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "byte", v);}
return this;
}
public Db_stmt Val_int_(int v) {
public Db_stmt Crt_int(String k, int v) {return Add_int(Bool_.Y, k, v);}
public Db_stmt Val_int(String k, int v) {return Add_int(Bool_.N, k, v);}
public Db_stmt Val_int(int v) {return Add_int(Bool_.N, null, v);}
private Db_stmt Add_int(boolean where, String k, int v) {
try {Add(++val_idx, Int_.Xto_str(v));} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "int", v);}
return this;
}
public Db_stmt Val_long_(long v) {
public Db_stmt Crt_long(String k, long v) {return Add_long(Bool_.Y, k, v);}
public Db_stmt Val_long(String k, long v) {return Add_long(Bool_.N, k, v);}
public Db_stmt Val_long(long v) {return Add_long(Bool_.N, null, v);}
private Db_stmt Add_long(boolean where, String k, long v) {
try {Add(++val_idx, Long_.Xto_str(v));} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "long", v);}
return this;
}
public Db_stmt Val_float_(float v) {
public Db_stmt Crt_float(String k, float v) {return Add_float(Bool_.Y, k, v);}
public Db_stmt Val_float(String k, float v) {return Add_float(Bool_.N, k, v);}
public Db_stmt Val_float(float v) {return Add_float(Bool_.N, null, v);}
private Db_stmt Add_float(boolean where, String k, float v) {
try {Add(++val_idx, Float_.Xto_str(v));} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "float", v);}
return this;
}
public Db_stmt Val_double_(double v) {
public Db_stmt Crt_double(String k, double v) {return Add_double(Bool_.Y, k, v);}
public Db_stmt Val_double(String k, double v) {return Add_double(Bool_.N, k, v);}
public Db_stmt Val_double(double v) {return Add_double(Bool_.N, null, v);}
private Db_stmt Add_double(boolean where, String k, double v) {
try {Add(++val_idx, Double_.Xto_str(v));} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "double", v);}
return this;
}
public Db_stmt Val_decimal_(DecimalAdp v) {
public Db_stmt Crt_decimal(String k, DecimalAdp v) {return Add_decimal(Bool_.Y, k, v);}
public Db_stmt Val_decimal(String k, DecimalAdp v) {return Add_decimal(Bool_.N, k, v);}
public Db_stmt Val_decimal(DecimalAdp v) {return Add_decimal(Bool_.N, null, v);}
private Db_stmt Add_decimal(boolean where, String k, DecimalAdp v) {
try {Add(++val_idx, v.Xto_str());} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "decimal", v);}
return this;
}
public Db_stmt Val_bry_by_str_(String v) {return Val_bry_(Bry_.new_utf8_(v));}
public Db_stmt Val_bry_(byte[] v) { // HACK: convert to String b/c tdb does not support byte[]
public Db_stmt Crt_bry(String k, byte[] v) {return Add_bry(Bool_.Y, k, v);}
public Db_stmt Val_bry(String k, byte[] v) {return Add_bry(Bool_.N, k, v);}
public Db_stmt Val_bry(byte[] v) {return Add_bry(Bool_.N, null, v);}
private Db_stmt Add_bry(boolean where, String k, byte[] v) {// HACK: convert to String b/c tdb does not support byte[]
try {Add(++val_idx, Val_str_wrap(String_.new_utf8_(v)));} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "byte[]", v.length);}
return this;
}
public Db_stmt Val_str_by_bry_(byte[] v) {return Val_str_(String_.new_utf8_(v));}
public Db_stmt Val_str_(String v) {
public Db_stmt Crt_bry_as_str(String k, byte[] v) {return Add_bry_as_str(Bool_.Y, k, v);}
public Db_stmt Val_bry_as_str(String k, byte[] v) {return Add_bry_as_str(Bool_.N, k, v);}
public Db_stmt Val_bry_as_str(byte[] v) {return Add_bry_as_str(Bool_.N, null, v);}
private Db_stmt Add_bry_as_str(boolean where, String k, byte[] v) {return Add_str(where, k, String_.new_utf8_(v));}
public Db_stmt Crt_str(String k, String v) {return Add_str(Bool_.Y, k, v);}
public Db_stmt Val_str(String k, String v) {return Add_str(Bool_.N, k, v);}
public Db_stmt Val_str(String v) {return Add_str(Bool_.N, null, v);}
private Db_stmt Add_str(boolean where, String k, String v) {
try {Add(++val_idx, Val_str_wrap(v));} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "String", v);}
return this;
}
@@ -69,20 +94,20 @@ class Db_stmt_sql implements Db_stmt {
} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "rdr", v);}
return this;
}
String Val_str_wrap(String v) {
private String Val_str_wrap(String v) {
return "'" + String_.Replace(v, "'", "\\'") + "'";
}
public boolean Exec_insert() {
try {boolean rv = provider.Exec_qry(Db_qry_sql.dml_(this.Xto_sql())) != 0; return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql_orig);}
try {boolean rv = conn.Exec_qry(Db_qry_sql.dml_(this.Xto_sql())) != 0; return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql_orig);}
}
public int Exec_update() {
try {int rv = provider.Exec_qry(Db_qry_sql.dml_(this.Xto_sql())); return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql_orig);}
try {int rv = conn.Exec_qry(Db_qry_sql.dml_(this.Xto_sql())); return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql_orig);}
}
public int Exec_delete() {
try {int rv = provider.Exec_qry(Db_qry_sql.dml_(this.Xto_sql())); return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql_orig);}
try {int rv = conn.Exec_qry(Db_qry_sql.dml_(this.Xto_sql())); return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql_orig);}
}
public DataRdr Exec_select() {
try {DataRdr rv = provider.Exec_qry_as_rdr(Db_qry_sql.rdr_(this.Xto_sql())); return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql_orig);}
try {DataRdr rv = conn.Exec_qry_as_rdr(Db_qry_sql.rdr_(this.Xto_sql())); return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql_orig);}
}
public Db_rdr Exec_select_as_rdr() {throw Err_.not_implemented_();}
public Object Exec_select_val() {
@@ -97,13 +122,17 @@ class Db_stmt_sql implements Db_stmt {
this.Clear();
}
public void Add(String v) {Add(-1, v);}
public void Add(int idx, String v) {args.Add(v);} ListAdp args = ListAdp_.new_();
public void Add(int idx, String v) {args.Add(v);} private ListAdp args = ListAdp_.new_();
public String Xto_sql() {
tmp_fmtr.Bld_bfr_many(tmp_bfr, (Object[])args.Xto_ary_and_clear(Object.class));
return tmp_bfr.Xto_str_and_clear();
}
String sql_orig;
public Db_stmt Parse(String sql_str) {
public int Args_len() {return args.Count();}
public String Args_get_at(int i) {return (String)args.FetchAt(i);}
private String sql_orig;
public Db_qry Qry() {return qry;} private Db_qry qry;
public Db_stmt Parse(Db_qry qry, String sql_str) {
this.qry = qry;
this.sql_orig = sql_str;
int arg_idx = 0;
byte[] src = Bry_.new_utf8_(sql_str);

View File

@@ -21,7 +21,7 @@ public class Db_stmt_sql_tst {
@Before public void init() {}
@Test public void Basic() {
Db_stmt_sql stmt = new Db_stmt_sql();
stmt.Parse("UPDATE tbl_0 SET col_0 = ? WHERE col_1 = ?");
stmt.Parse(null, "UPDATE tbl_0 SET col_0 = ? WHERE col_1 = ?");
stmt.Add("1");
stmt.Add("2");
Tfds.Eq("UPDATE tbl_0 SET col_0 = 1 WHERE col_1 = 2", stmt.Xto_sql());

View File

@@ -26,7 +26,7 @@ public interface Db_txn_mgr {
int Txn_count(); void Txn_count_(int v);
}
class Db_txn_mgr_base implements Db_txn_mgr {
public Db_txn_mgr_base(Db_engine engine) {this.engine = engine;} private Db_engine engine;
public Db_txn_mgr_base(Db_engine engine) {this.engine = engine;} private final Db_engine engine;
public int Txn_depth() {return txn_depth;} int txn_depth; // NOTE: only support 1 level for now;
public void Txn_bgn_if_none() {if (txn_depth == 0) this.Txn_bgn();}
public void Txn_bgn() {