mirror of https://github.com/gnosygnu/xowa
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
3.9 KiB
83 lines
3.9 KiB
/*
|
|
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.qrys; import gplx.*; import gplx.dbs.*;
|
|
import gplx.dbs.sqls.*;
|
|
public class Db_qry_sql implements Db_qry {
|
|
public int Tid() {return Db_qry_.Tid_sql;}
|
|
public boolean Exec_is_rdr() {return isReader;} private boolean isReader;
|
|
public String Base_table() {throw Err_.new_unimplemented();}
|
|
public String To_sql__exec(Sql_qry_wtr wtr) {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);}
|
|
static Db_qry_sql sql_(String sql) {
|
|
Db_qry_sql rv = new Db_qry_sql();
|
|
rv.sql = sql; rv.isReader = false;
|
|
return rv;
|
|
}
|
|
public static Db_qry_sql rdr_(String sql) {
|
|
Db_qry_sql rv = new Db_qry_sql();
|
|
rv.sql = sql; rv.isReader = true;
|
|
return rv;
|
|
}
|
|
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_.new_type_mismatch_w_exc(exc, Db_qry_sql.class, obj);}}
|
|
public static String Gen_sql(Db_qry qry, Object... args) {
|
|
byte[] src = Bry_.new_u8(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_find_.Find_fwd(src, Byte_ascii.Question, pos);
|
|
if (question_pos == Bry_find_.Not_found)
|
|
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.To_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 (Type_adp_.Eq(val_type, Int_.Cls_ref_type))
|
|
bfr.Add_int_variable(Int_.cast(val));
|
|
else if (Type_adp_.Eq(val_type, Bool_.Cls_ref_type))
|
|
bfr.Add_int_fixed(1, Bool_.To_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 (Type_adp_.Eq(val_type, Double_.Cls_ref_type))
|
|
bfr.Add_double(Double_.cast(val));
|
|
else if (Type_adp_.Eq(val_type, Long_.Cls_ref_type))
|
|
bfr.Add_long_variable(Long_.cast(val));
|
|
else if (Type_adp_.Eq(val_type, Float_.Cls_ref_type))
|
|
bfr.Add_float(Float_.cast(val));
|
|
else if (Type_adp_.Eq(val_type, Byte_.Cls_ref_type))
|
|
bfr.Add_byte(Byte_.cast(val));
|
|
else if (Type_adp_.Eq(val_type, DateAdp_.Cls_ref_type))
|
|
bfr.Add_byte_apos().Add_str_a7(DateAdp_.cast(val).XtoStr_gplx_long()).Add_byte_apos();
|
|
else if (Type_adp_.Eq(val_type, Decimal_adp_.Cls_ref_type))
|
|
bfr.Add_str_a7(Decimal_adp_.cast(val).To_str());
|
|
else {
|
|
byte[] val_bry = Bry_.new_u8(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_u8("NULL"), Bry_escape_apos = Bry_.new_a7("''");
|
|
}
|