mirror of
https://github.com/gnosygnu/xowa.git
synced 2026-03-02 03:49:30 +00:00
v2.4.1.1
This commit is contained in:
@@ -1,22 +0,0 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012 gnosygnu@gmail.com
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.dbs; import gplx.*;
|
||||
public interface Db_batch_wkr {
|
||||
void Batch_bgn();
|
||||
void Batch_end();
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012 gnosygnu@gmail.com
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.dbs; import gplx.*;
|
||||
public class Db_batch_wkr__attach implements Db_batch_wkr {
|
||||
private final Db_conn conn;
|
||||
private final ListAdp list = ListAdp_.new_();
|
||||
public Db_batch_wkr__attach Add(String alias, Io_url url) {list.Add(new Db_batch_wkr__attach_itm(alias, url)); return this;}
|
||||
public Db_batch_wkr__attach(Db_conn conn) {this.conn = conn;}
|
||||
public void Batch_bgn() {
|
||||
int len = list.Count();
|
||||
for (int i = 0; i < len; ++i) {
|
||||
Db_batch_wkr__attach_itm itm = (Db_batch_wkr__attach_itm)list.FetchAt(i);
|
||||
conn.Exec_env_db_attach(itm.Alias(), itm.Url());
|
||||
}
|
||||
}
|
||||
public void Batch_end() {
|
||||
int len = list.Count();
|
||||
for (int i = 0; i < len; ++i) {
|
||||
Db_batch_wkr__attach_itm itm = (Db_batch_wkr__attach_itm)list.FetchAt(i);
|
||||
conn.Exec_env_db_detach(itm.Alias());
|
||||
}
|
||||
}
|
||||
}
|
||||
class Db_batch_wkr__attach_itm {
|
||||
public Db_batch_wkr__attach_itm(String alias, Io_url url) {this.alias = alias; this.url = url;}
|
||||
public String Alias() {return alias;} private final String alias;
|
||||
public Io_url Url() {return url;} private final Io_url url;
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012 gnosygnu@gmail.com
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.dbs; import gplx.*;
|
||||
public class Db_batch_wkr__msg implements Db_batch_wkr {
|
||||
private final Gfo_usr_dlg usr_dlg; private final String msg_pre;
|
||||
public Db_batch_wkr__msg(Gfo_usr_dlg usr_dlg, String msg_pre) {this.usr_dlg = usr_dlg; this.msg_pre = msg_pre;}
|
||||
public Gfo_usr_dlg Usr_dlg() {return usr_dlg;}
|
||||
public String Msg() {return msg;} public Db_batch_wkr__msg Msg_(String v) {msg = v; return this;} private String msg;
|
||||
public void Batch_bgn() {usr_dlg.Plog_many("", "", "bgn:" + msg_pre + "." + msg);}
|
||||
public void Batch_end() {usr_dlg.Plog_many("", "", "end:" + msg_pre + "." + msg);}
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012 gnosygnu@gmail.com
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.dbs; import gplx.*;
|
||||
public class Db_batch_wkr__sql implements Db_batch_wkr {
|
||||
private final Db_conn conn; private String sql;
|
||||
public Db_batch_wkr__sql(Db_conn conn, String... lines) {this.conn = conn; this.sql = String_.Concat_lines_nl_skip_last(lines);}
|
||||
public String Sql() {return sql;}
|
||||
public Db_batch_wkr__sql Sql_(String... lines) {sql = String_.Concat_lines_nl_skip_last(lines); return this;}
|
||||
public void Batch_bgn() {
|
||||
conn.Txn_bgn();
|
||||
conn.Exec_sql(sql);
|
||||
conn.Txn_end();
|
||||
}
|
||||
public void Batch_end() {
|
||||
}
|
||||
}
|
||||
@@ -18,18 +18,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
package gplx.dbs; import gplx.*;
|
||||
import gplx.dbs.engines.*; import gplx.dbs.qrys.*;
|
||||
public class Db_conn {
|
||||
private final Db_engine engine;
|
||||
private final ListAdp rls_list = ListAdp_.new_();
|
||||
public Db_conn(Db_engine engine) {
|
||||
this.engine = engine;
|
||||
this.txn_mgr = new Db_txn_mgr(engine);
|
||||
}
|
||||
public Db_url Url() {return engine.Url();}
|
||||
public Db_txn_mgr Txn_mgr() {return txn_mgr;} private final Db_txn_mgr txn_mgr;
|
||||
public void Txn_bgn() {txn_mgr.Txn_bgn();}
|
||||
public void Txn_commit() {txn_mgr.Txn_end(); txn_mgr.Txn_bgn();}
|
||||
public void Txn_end() {txn_mgr.Txn_end();}
|
||||
public Db_stmt Stmt_insert(String tbl, Db_meta_fld_list flds) {return engine.New_stmt_prep(Db_qry_insert.new_(tbl, flds.To_str_ary()));}
|
||||
private final ListAdp rls_list = ListAdp_.new_(); private final Db_engine engine;
|
||||
public Db_conn(Db_engine engine) {this.engine = engine;}
|
||||
public Db_conn_info Conn_info() {return engine.Conn_info();}
|
||||
public void Txn_bgn() {engine.Txn_bgn("");}
|
||||
public void Txn_bgn(String name) {engine.Txn_bgn(name);}
|
||||
public void Txn_end() {engine.Txn_end();}
|
||||
public void Txn_cxl() {engine.Txn_cxl();}
|
||||
public void Txn_sav() {engine.Txn_sav();}
|
||||
public Db_stmt Stmt_insert(String tbl, Db_meta_fld_list flds) {return engine.New_stmt_prep(Db_qry_insert.new_(tbl, flds.To_str_ary_wo_autonum()));}
|
||||
public Db_stmt Stmt_insert(String tbl, String... cols) {return engine.New_stmt_prep(Db_qry_insert.new_(tbl, cols));}
|
||||
public Db_stmt Stmt_update(String tbl, String[] where, String... cols) {return engine.New_stmt_prep(Db_qry_update.new_(tbl, where, cols));}
|
||||
public Db_stmt Stmt_update_exclude(String tbl, Db_meta_fld_list flds, String... where) {return engine.New_stmt_prep(Db_qry_update.new_(tbl, where, flds.To_str_ary_exclude(where)));}
|
||||
@@ -37,46 +34,40 @@ public class Db_conn {
|
||||
public Db_stmt Stmt_select(String tbl, String[] cols, String... where) {return engine.New_stmt_prep(Db_qry__select_in_tbl.new_(tbl, where, cols, null));}
|
||||
public Db_stmt Stmt_select(String tbl, Db_meta_fld_list flds, String... where) {return engine.New_stmt_prep(Db_qry__select_in_tbl.new_(tbl, where, flds.To_str_ary(), null));}
|
||||
public Db_stmt Stmt_select_order(String tbl, Db_meta_fld_list flds, String[] where, String... orderbys) {return engine.New_stmt_prep(Db_qry__select_in_tbl.new_(tbl, where, flds.To_str_ary(), orderbys));}
|
||||
public void Exec_create_tbl_and_idx(Db_meta_tbl meta) {
|
||||
engine.Exec_ddl_create_tbl(meta);
|
||||
engine.Exec_ddl_create_idx(Gfo_usr_dlg_.Null, meta.Idxs());
|
||||
}
|
||||
public void Exec_create_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... idxs) {engine.Exec_ddl_create_idx(usr_dlg, idxs);}
|
||||
public void Exec_env_db_attach(String alias, Io_url db_url) {engine.Exec_env_db_attach(alias, db_url);}
|
||||
public void Exec_env_db_detach(String alias) {engine.Exec_env_db_detach(alias);}
|
||||
public void Exec_ddl_append_fld(String tbl, Db_meta_fld fld) {engine.Exec_ddl_append_fld(tbl, fld);}
|
||||
public Db_stmt Rls_reg(Db_stmt stmt) {rls_list.Add(stmt); return stmt;}
|
||||
public void Conn_term() {
|
||||
public Db_stmt Stmt_select_order(String tbl, String[] flds, String[] where, String... orderbys) {return engine.New_stmt_prep(Db_qry__select_in_tbl.new_(tbl, where, flds, orderbys));}
|
||||
public Db_stmt Stmt_new(Db_qry qry) {return engine.New_stmt_prep(qry);}
|
||||
public void Env_db_attach(String alias, Io_url db_url) {engine.Env_db_attach(alias, db_url);}
|
||||
public void Env_db_detach(String alias) {engine.Env_db_detach(alias);}
|
||||
public void Env_vacuum() {Exec_sql_plog_ntx("vacuuming: url=" + this.Conn_info().Xto_api(), "VACUUM;");}
|
||||
public void Ddl_create_tbl(Db_meta_tbl meta) {engine.Ddl_create_tbl(meta); engine.Ddl_create_idx(Gfo_usr_dlg_.Null, meta.Idxs());}
|
||||
public void Ddl_create_idx(Db_meta_idx... idxs) {engine.Ddl_create_idx(Gfo_usr_dlg_.I, idxs);}
|
||||
public void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... idxs) {engine.Ddl_create_idx(usr_dlg, idxs);}
|
||||
public void Ddl_append_fld(String tbl, Db_meta_fld fld) {engine.Ddl_append_fld(tbl, fld);}
|
||||
public void Ddl_delete_tbl(String tbl) {engine.Ddl_delete_tbl(tbl);}
|
||||
public void Rls_reg(RlsAble rls) {rls_list.Add(rls);}
|
||||
public void Rls_conn() {
|
||||
int len = rls_list.Count();
|
||||
for (int i = 0; i < len; ++i) {
|
||||
RlsAble itm = (RlsAble)rls_list.FetchAt(i);
|
||||
itm.Rls();
|
||||
}
|
||||
engine.Conn_term();
|
||||
// Db_conn_pool.I.Del(this.Url()); // remove from pool, else rls'd instance will be cached and fail upon next use
|
||||
Db_conn_pool.I.Del(engine.Conn_info());
|
||||
}
|
||||
public Db_stmt Stmt_new(Db_qry qry) {return engine.New_stmt_prep(qry);}
|
||||
public int Exec_qry(Db_qry qry) {txn_mgr.Txn_count_(txn_mgr.Txn_count() + 1); return Int_.cast_(engine.Exec_as_obj(qry));}
|
||||
public int Exec_sql(String sql) {return this.Exec_qry(Db_qry_sql.dml_(sql));}
|
||||
public Db_rdr Exec_sql_as_rdr2(String sql) {return this.Stmt_new(Db_qry_sql.dml_(sql)).Exec_select__rls_auto();}
|
||||
public int Exec_sql_plog_ntx(String msg, String sql) {return Exec_sql_plog(Bool_.N, msg, sql);}
|
||||
public int Exec_sql_plog_txn(String msg, String sql) {return Exec_sql_plog(Bool_.Y, msg, sql);}
|
||||
public int Exec_sql_plog(boolean txn, String msg, String sql) {
|
||||
Gfo_usr_dlg_.I.Plog_many("", "", "bgn: " + msg);
|
||||
if (txn) this.Txn_bgn();
|
||||
int rv = Exec_sql(sql);
|
||||
if (txn) this.Txn_end();
|
||||
Gfo_usr_dlg_.I.Plog_many("", "", "end: " + msg);
|
||||
return rv;
|
||||
}
|
||||
public int Exec_qry(Db_qry qry) {return Int_.cast_(engine.Exec_as_obj(qry));}
|
||||
public DataRdr Exec_qry_as_rdr(Db_qry qry) {return DataRdr_.cast_(engine.Exec_as_obj(qry));}
|
||||
public int Exec_sql(String sql) {return this.Exec_qry(Db_qry_sql.dml_(sql));}
|
||||
public DataRdr Exec_sql_as_rdr(String sql) {return this.Exec_qry_as_rdr(Db_qry_sql.rdr_(sql));}
|
||||
public void Exec_sql_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... idxs) {engine.Exec_ddl_create_idx(usr_dlg, idxs);}
|
||||
public void Exec_sql(Db_batch_wkr... wkrs) {
|
||||
int len = wkrs.length;
|
||||
for (int i = 0; i < len; ++i) {
|
||||
Db_batch_wkr wkr = wkrs[i];
|
||||
wkr.Batch_bgn();
|
||||
wkr.Batch_end();
|
||||
}
|
||||
}
|
||||
public void Exec_sql__vacuum(Db_batch_wkr__msg msg) {
|
||||
msg.Msg_("vaccuum");
|
||||
Exec_sql(msg, Batch_sql("VACCUUM;"));
|
||||
}
|
||||
public void Exec_sql__idx(Db_batch_wkr__msg msg, Db_meta_idx... idxs) {
|
||||
engine.Exec_ddl_create_idx(msg.Usr_dlg(), idxs);
|
||||
}
|
||||
public Db_batch_wkr__msg Batch_msg(Gfo_usr_dlg usr_dlg, String msg_pre) {return new Db_batch_wkr__msg(usr_dlg, msg_pre);}
|
||||
public Db_batch_wkr__attach Batch_attach(String alias, Io_url url) {return new Db_batch_wkr__attach(this).Add(alias, url);}
|
||||
public Db_batch_wkr__sql Batch_sql(String... lines) {return new Db_batch_wkr__sql(this, lines);}
|
||||
public int Exec_sql_args(String sql, Object... args) {return this.Exec_qry(Db_qry_sql.dml_(String_.Format(sql, args)));}
|
||||
public DataRdr Exec_sql_as_rdr(String sql) {return this.Exec_qry_as_rdr(Db_qry_sql.rdr_(sql));}
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
package gplx.dbs; import gplx.*;
|
||||
import gplx.dbs.qrys.*;
|
||||
public class Db_conn_ {
|
||||
public static final Db_conn Null = Db_conn_pool.I.Get_or_new(Db_url_.Null);
|
||||
public static final Db_conn Empty = Db_conn_pool.I.Get_or_new(Db_conn_info_.Null);
|
||||
public static int Select_fld0_as_int_or(Db_conn p, String sql, int or) {
|
||||
DataRdr rdr = DataRdr_.Null;
|
||||
try {
|
||||
|
||||
@@ -20,11 +20,12 @@ public class Db_conn_bldr {
|
||||
private Db_conn_bldr_wkr wkr;
|
||||
public void Reg_default_sqlite() {wkr = Db_conn_bldr_wkr__sqlite.I; wkr.Clear_for_tests();}
|
||||
public void Reg_default_mem() {wkr = Db_conn_bldr_wkr__mem.I; wkr.Clear_for_tests();}
|
||||
public Db_conn Get(String type, Object url_obj) {return wkr.Get(type, url_obj);}
|
||||
public Db_conn New(String type, Object url_obj) {return wkr.New(type, url_obj);}
|
||||
public Db_conn_bldr_data Get_or_new(String type, Object url_obj) {
|
||||
boolean exists = wkr.Exists(type, url_obj);
|
||||
Db_conn conn = exists ? Get(type, url_obj) : New(type, url_obj);
|
||||
public boolean Exists(Io_url url) {return wkr.Exists(url);}
|
||||
public Db_conn Get(Io_url url) {return wkr.Get(url);}
|
||||
public Db_conn New(Io_url url) {return wkr.New(url);}
|
||||
public Db_conn_bldr_data Get_or_new(Io_url url) {
|
||||
boolean exists = wkr.Exists(url);
|
||||
Db_conn conn = exists ? Get(url) : New(url);
|
||||
return new Db_conn_bldr_data(conn, exists);
|
||||
}
|
||||
public static final Db_conn_bldr I = new Db_conn_bldr(); Db_conn_bldr() {}
|
||||
|
||||
@@ -19,24 +19,21 @@ package gplx.dbs; import gplx.*;
|
||||
import gplx.dbs.engines.sqlite.*;
|
||||
public interface Db_conn_bldr_wkr {
|
||||
void Clear_for_tests();
|
||||
boolean Exists(String type, Object url_obj);
|
||||
Db_conn Get(String type, Object url_obj);
|
||||
Db_conn New(String type, Object url_obj);
|
||||
boolean Exists(Io_url url);
|
||||
Db_conn Get(Io_url url);
|
||||
Db_conn New(Io_url url);
|
||||
}
|
||||
class Db_conn_bldr_wkr__sqlite implements Db_conn_bldr_wkr {
|
||||
public void Clear_for_tests() {}
|
||||
public boolean Exists(String type, Object url_obj) {
|
||||
Io_url io_url = (Io_url)url_obj; return Io_mgr._.ExistsFil(io_url);
|
||||
}
|
||||
public Db_conn Get(String type, Object url_obj) {
|
||||
Io_url io_url = (Io_url)url_obj; if (!Io_mgr._.ExistsFil(io_url)) return null;
|
||||
Db_url db_url = Db_url_.sqlite_(io_url);
|
||||
public boolean Exists(Io_url url) {return Io_mgr._.ExistsFil(url);}
|
||||
public Db_conn Get(Io_url url) {
|
||||
if (!Io_mgr._.ExistsFil(url)) return null;
|
||||
Db_conn_info db_url = Db_conn_info_.sqlite_(url);
|
||||
return Db_conn_pool.I.Get_or_new(db_url);
|
||||
}
|
||||
public Db_conn New(String type, Object url_obj) {
|
||||
Io_url io_url = (Io_url)url_obj;
|
||||
Io_mgr._.CreateDirIfAbsent(io_url.OwnerDir()); // must assert that dir exists
|
||||
Db_url db_url = Sqlite_url.make_(io_url);
|
||||
public Db_conn New(Io_url url) {
|
||||
Io_mgr._.CreateDirIfAbsent(url.OwnerDir()); // must assert that dir exists
|
||||
Db_conn_info db_url = Sqlite_conn_info.make_(url);
|
||||
Db_conn conn = Db_conn_pool.I.Get_or_new(db_url);
|
||||
Sqlite_engine_.Pragma_page_size(conn, 4096);
|
||||
// conn.Conn_term(); // close conn after PRAGMA adjusted
|
||||
@@ -47,22 +44,19 @@ class Db_conn_bldr_wkr__sqlite implements Db_conn_bldr_wkr {
|
||||
class Db_conn_bldr_wkr__mem implements Db_conn_bldr_wkr {
|
||||
private final HashAdp hash = HashAdp_.new_();
|
||||
public void Clear_for_tests() {hash.Clear(); Db_conn_pool.I.Clear();}
|
||||
public boolean Exists(String type, Object url_obj) {
|
||||
Io_url io_url = (Io_url)url_obj;
|
||||
String io_url_str = io_url.Xto_api();
|
||||
public boolean Exists(Io_url url) {
|
||||
String io_url_str = url.Xto_api();
|
||||
return hash.Has(io_url_str);
|
||||
}
|
||||
public Db_conn Get(String type, Object url_obj) {
|
||||
Io_url io_url = (Io_url)url_obj;
|
||||
String io_url_str = io_url.Xto_api();
|
||||
public Db_conn Get(Io_url url) {
|
||||
String io_url_str = url.Xto_api();
|
||||
if (!hash.Has(io_url_str)) return null;
|
||||
return Db_conn_pool.I.Get_or_new__mem(io_url.Xto_api());
|
||||
return Db_conn_pool.I.Get_or_new__mem(url.Xto_api());
|
||||
}
|
||||
public Db_conn New(String type, Object url_obj) {
|
||||
Io_url io_url = (Io_url)url_obj;
|
||||
String io_url_str = io_url.Xto_api();
|
||||
public Db_conn New(Io_url url) {
|
||||
String io_url_str = url.Xto_api();
|
||||
hash.Add(io_url_str, io_url_str);
|
||||
return Db_conn_pool.I.Get_or_new__mem(io_url.Xto_api());
|
||||
return Db_conn_pool.I.Get_or_new__mem(url.Xto_api());
|
||||
}
|
||||
public static final Db_conn_bldr_wkr__mem I = new Db_conn_bldr_wkr__mem(); Db_conn_bldr_wkr__mem() {}
|
||||
}
|
||||
|
||||
@@ -16,10 +16,10 @@ 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 interface Db_url {
|
||||
public interface Db_conn_info {
|
||||
String Tid();
|
||||
String Database();
|
||||
String Xto_raw();
|
||||
String Xto_api();
|
||||
Db_url New_self(String raw, GfoMsg m);
|
||||
Db_conn_info New_self(String raw, GfoMsg m);
|
||||
}
|
||||
@@ -18,23 +18,23 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
package gplx.dbs; import gplx.*;
|
||||
import gplx.dbs.engines.nulls.*; import gplx.dbs.engines.mems.*; import gplx.dbs.engines.sqlite.*; import gplx.dbs.engines.tdbs.*;
|
||||
import gplx.dbs.engines.mysql.*; import gplx.dbs.engines.postgres.*;
|
||||
public class Db_url_ {
|
||||
public static final Db_url Null = Null_url._;
|
||||
public static final Db_url Test = Mysql_url.new_("127.0.0.1", "unit_tests", "root", "mysql7760");
|
||||
public static Db_url parse_(String raw) {return Db_url_pool._.Parse(raw);}
|
||||
public static Db_url sqlite_(Io_url url) {return Sqlite_url.load_(url);}
|
||||
public static Db_url tdb_(Io_url url) {return Tdb_url.new_(url);}
|
||||
public static Db_url mem_(String db) {return Db_url__mem.new_(db);}
|
||||
public static final String Key_tdb = Tdb_url.Tid_const;
|
||||
public class Db_conn_info_ {
|
||||
public static final Db_conn_info Null = Null_conn_info._;
|
||||
public static final Db_conn_info Test = Mysql_conn_info.new_("127.0.0.1", "unit_tests", "root", "mysql7760");
|
||||
public static Db_conn_info parse_(String raw) {return Db_conn_info_pool._.Parse(raw);}
|
||||
public static Db_conn_info sqlite_(Io_url url) {return Sqlite_conn_info.load_(url);}
|
||||
public static Db_conn_info tdb_(Io_url url) {return Tdb_conn_info.new_(url);}
|
||||
public static Db_conn_info mem_(String db) {return Db_conn_info__mem.new_(db);}
|
||||
public static final String Key_tdb = Tdb_conn_info.Tid_const;
|
||||
}
|
||||
class Db_url_pool {
|
||||
class Db_conn_info_pool {
|
||||
private OrderedHash regy = OrderedHash_.new_();
|
||||
public Db_url_pool() {
|
||||
this.Add(Null_url._).Add(Tdb_url._).Add(Mysql_url._).Add(Postgres_url._).Add(Sqlite_url._);
|
||||
this.Add(Db_url__mem.I);
|
||||
public Db_conn_info_pool() {
|
||||
this.Add(Null_conn_info._).Add(Tdb_conn_info._).Add(Mysql_conn_info._).Add(Postgres_conn_info._).Add(Sqlite_conn_info._);
|
||||
this.Add(Db_conn_info__mem.I);
|
||||
}
|
||||
public Db_url_pool Add(Db_url itm) {regy.AddReplace(itm.Tid(), itm); return this;}
|
||||
public Db_url Parse(String raw) {// assume each pair has format of: name=val;
|
||||
public Db_conn_info_pool Add(Db_conn_info itm) {regy.AddReplace(itm.Tid(), itm); return this;}
|
||||
public Db_conn_info Parse(String raw) {// assume each pair has format of: name=val;
|
||||
try {
|
||||
GfoMsg m = GfoMsg_.new_parse_("db_url");
|
||||
String[] terms = String_.Split(raw, ";");
|
||||
@@ -47,10 +47,10 @@ class Db_url_pool {
|
||||
else
|
||||
m.Add(kv[0], kv[1]);
|
||||
}
|
||||
Db_url prototype = (Db_url)regy.Fetch(url_tid);
|
||||
Db_conn_info prototype = (Db_conn_info)regy.Fetch(url_tid);
|
||||
return prototype.New_self(raw, m);
|
||||
}
|
||||
catch(Exception exc) {throw Err_.parse_type_exc_(exc, Db_url.class, raw);}
|
||||
catch(Exception exc) {throw Err_.parse_type_exc_(exc, Db_conn_info.class, raw);}
|
||||
}
|
||||
public static final Db_url_pool _ = new Db_url_pool();
|
||||
public static final Db_conn_info_pool _ = new Db_conn_info_pool();
|
||||
}
|
||||
@@ -17,13 +17,13 @@ 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_url__base implements Db_url {
|
||||
public abstract class Db_conn_info__base implements Db_conn_info {
|
||||
public abstract String Tid();
|
||||
public String Xto_raw() {return raw;} private String raw = "";
|
||||
public String Xto_api() {return api;} private String api = "";
|
||||
public String Database() {return database;} protected String database = "";
|
||||
public String Server() {return server;} private String server = "";
|
||||
public abstract Db_url New_self(String raw, GfoMsg m);
|
||||
public abstract Db_conn_info New_self(String raw, GfoMsg m);
|
||||
protected void Ctor(String server, String database, String raw, String api) {this.server = server; this.database = database; this.raw = raw; this.api = api;}
|
||||
protected static String BldApi(GfoMsg m, KeyVal... xtnAry) {
|
||||
String_bldr sb = String_bldr_.new_();
|
||||
@@ -17,10 +17,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.dbs; import gplx.*;
|
||||
import org.junit.*;
|
||||
public class Db_url_tst {
|
||||
public class Db_conn_info_tst {
|
||||
@Before public void setup() {
|
||||
regy.Add(Db_url_mock._);
|
||||
} private final Db_url_pool regy = new Db_url_pool();
|
||||
regy.Add(Db_conn_info_mock._);
|
||||
} private final Db_conn_info_pool regy = new Db_conn_info_pool();
|
||||
@Test public void Parse() {
|
||||
tst_Parse("gplx_key=mock;id=1;", kv_("id", "1")); // one; gplx_key removed
|
||||
tst_Parse("gplx_key=mock;id=1;name=me;", kv_("id", "1"), kv_("name", "me")); // many
|
||||
@@ -28,19 +28,19 @@ public class Db_url_tst {
|
||||
}
|
||||
private KeyVal kv_(String key, Object val) {return KeyVal_.new_(key, val);}
|
||||
private void tst_Parse(String raw, KeyVal... expd) {
|
||||
Db_url_mock mock = (Db_url_mock)regy.Parse(raw);
|
||||
Db_conn_info_mock mock = (Db_conn_info_mock)regy.Parse(raw);
|
||||
Tfds.Eq_ary_str(expd, mock.Kvs());
|
||||
}
|
||||
}
|
||||
class Db_url_mock extends Db_url__base {
|
||||
class Db_conn_info_mock extends Db_conn_info__base {
|
||||
public KeyVal[] Kvs() {return kvs;} KeyVal[] kvs;
|
||||
@Override public String Tid() {return Tid_const;} public static final String Tid_const = "mock";
|
||||
@Override public Db_url New_self(String raw, GfoMsg m) {
|
||||
Db_url_mock rv = new Db_url_mock();
|
||||
@Override public Db_conn_info New_self(String raw, GfoMsg m) {
|
||||
Db_conn_info_mock rv = new Db_conn_info_mock();
|
||||
rv.kvs = new KeyVal[m.Args_count()];
|
||||
for (int i = 0; i < m.Args_count(); i++)
|
||||
rv.kvs[i] = m.Args_getAt(i);
|
||||
return rv;
|
||||
}
|
||||
public static final Db_url_mock _ = new Db_url_mock(); Db_url_mock() {}
|
||||
public static final Db_conn_info_mock _ = new Db_conn_info_mock(); Db_conn_info_mock() {}
|
||||
}
|
||||
@@ -21,11 +21,11 @@ import gplx.dbs.engines.sqlite.*; import gplx.dbs.engines.mysql.*; import gplx.d
|
||||
public class Db_conn_pool {
|
||||
private final HashAdp conn_hash = HashAdp_.new_(); private final HashAdp engine_hash = HashAdp_.new_();
|
||||
public void Clear() {conn_hash.Clear();}
|
||||
public void Del(Db_url url) {conn_hash.Del(url.Xto_api());}
|
||||
public Db_conn Get_or_new__mem(String db) {return Get_or_new(Db_url__mem.new_(db));}
|
||||
public Db_conn Get_or_new__sqlite(Io_url url) {return Get_or_new(Db_url_.sqlite_(url));}
|
||||
public Db_conn Get_or_new(String s) {return Get_or_new(Db_url_.parse_(s));}
|
||||
public Db_conn Get_or_new(Db_url url) {
|
||||
public void Del(Db_conn_info url) {conn_hash.Del(url.Xto_api());}
|
||||
public Db_conn Get_or_new__mem(String db) {return Get_or_new(Db_conn_info__mem.new_(db));}
|
||||
public Db_conn Get_or_new__sqlite(Io_url url) {return Get_or_new(Db_conn_info_.sqlite_(url));}
|
||||
public Db_conn Get_or_new(String s) {return Get_or_new(Db_conn_info_.parse_(s));}
|
||||
public Db_conn Get_or_new(Db_conn_info url) {
|
||||
Db_conn rv = (Db_conn)conn_hash.Fetch(url.Xto_api());
|
||||
if (rv == null) {
|
||||
Db_engine prime = (Db_engine)engine_hash.Fetch(url.Tid()); if (prime == null) throw Err_.new_("db engine prototype not found; tid={0}", url.Tid());
|
||||
|
||||
@@ -17,16 +17,16 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.dbs; import gplx.*;
|
||||
public class Db_meta_fld {
|
||||
public Db_meta_fld(String name, int tid, int len, boolean nullable, boolean primary, boolean autoincrement, Object default_value) {
|
||||
public Db_meta_fld(String name, int tid, int len, boolean nullable, boolean primary, boolean autonum, Object default_value) {
|
||||
this.name = name; this.tid = tid; this.len = len;
|
||||
this.nullable = nullable; this.primary = primary; this.autoincrement = autoincrement; this.default_value = default_value;
|
||||
this.nullable = nullable; this.primary = primary; this.autonum = autonum; this.default_value = default_value;
|
||||
}
|
||||
public int Tid() {return tid;} private final int tid;
|
||||
public String Name() {return name;} private final String name;
|
||||
public int Len() {return len;} private final int len;
|
||||
public boolean Nullable() {return nullable;} private final boolean nullable;
|
||||
public boolean Primary() {return primary;} private final boolean primary;
|
||||
public boolean Autoincrement() {return autoincrement;} private final boolean autoincrement;
|
||||
public boolean Autonum() {return autonum;} private final boolean autonum;
|
||||
public Object Default_value() {return default_value;} private final Object default_value;
|
||||
public static final int Tid_bool = 0, Tid_byte = 1, Tid_short = 2, Tid_int = 3, Tid_long = 4, Tid_float = 5, Tid_double = 6, Tid_str = 7, Tid_text = 8, Tid_bry = 9;
|
||||
public static final String Key_null = null;
|
||||
|
||||
@@ -23,6 +23,16 @@ public class Db_meta_fld_list {
|
||||
public Db_meta_fld Get_by(String name) {return (Db_meta_fld)flds.Fetch(name);}
|
||||
public String[] To_str_ary() {if (str_ary == null) str_ary = (String[])keys.Xto_ary(String.class); return str_ary;} private String[] str_ary;
|
||||
public Db_meta_fld[] To_fld_ary() {if (fld_ary == null) fld_ary = (Db_meta_fld[])flds.Xto_ary(Db_meta_fld.class); return fld_ary;} private Db_meta_fld[] fld_ary;
|
||||
public String[] To_str_ary_wo_autonum() {
|
||||
int len = flds.Count();
|
||||
ListAdp rv = ListAdp_.new_();
|
||||
for (int i = 0; i < len; ++i) {
|
||||
Db_meta_fld fld = (Db_meta_fld)flds.FetchAt(i);
|
||||
if (fld.Autonum()) continue;
|
||||
rv.Add(fld.Name());
|
||||
}
|
||||
return (String[])rv.Xto_ary(String.class);
|
||||
}
|
||||
public String[] To_str_ary_exclude(String[] ary) {
|
||||
HashAdp ary_hash = HashAdp_.new_();
|
||||
ListAdp rv = ListAdp_.new_();
|
||||
@@ -46,11 +56,14 @@ public class Db_meta_fld_list {
|
||||
public String Add_int(String name) {return Add(name, Db_meta_fld.Tid_int, Len_null, Bool_.N, Bool_.N, Bool_.N, Db_meta_fld.Default_value_null);}
|
||||
public String Add_int_pkey(String name) {return Add(name, Db_meta_fld.Tid_int, Len_null, Bool_.N, Bool_.Y, Bool_.N, Db_meta_fld.Default_value_null);}
|
||||
public String Add_int_pkey_autonum(String name) {return Add(name, Db_meta_fld.Tid_int, Len_null, Bool_.N, Bool_.Y, Bool_.Y, Db_meta_fld.Default_value_null);}
|
||||
public String Add_int_autonum(String name) {return Add(name, Db_meta_fld.Tid_int, Len_null, Bool_.N, Bool_.Y, Bool_.N, Db_meta_fld.Default_value_null);}
|
||||
public String Add_int_dflt(String name, int dflt) {return Add(name, Db_meta_fld.Tid_int, Len_null, Bool_.N, Bool_.N, Bool_.N, dflt);}
|
||||
public String Add_long(String name) {return Add(name, Db_meta_fld.Tid_long, Len_null, Bool_.N, Bool_.N, Bool_.N, Db_meta_fld.Default_value_null);}
|
||||
public String Add_float(String name) {return Add(name, Db_meta_fld.Tid_float, Len_null, Bool_.N, Bool_.N, Bool_.N, Db_meta_fld.Default_value_null);}
|
||||
public String Add_double(String name) {return Add(name, Db_meta_fld.Tid_double, Len_null, Bool_.N, Bool_.N, Bool_.N, Db_meta_fld.Default_value_null);}
|
||||
public String Add_str(String name, int len) {return Add(name, Db_meta_fld.Tid_str, len, Bool_.N, Bool_.N, Bool_.N, Db_meta_fld.Default_value_null);}
|
||||
public String Add_str_pkey(String name, int len) {return Add(name, Db_meta_fld.Tid_str, len, Bool_.N, Bool_.Y, Bool_.N, Db_meta_fld.Default_value_null);}
|
||||
public String Add_str_null(String name, int len) {return Add(name, Db_meta_fld.Tid_str, len, Bool_.Y, Bool_.N, Bool_.N, Db_meta_fld.Default_value_null);}
|
||||
public String Add_str_dflt(String name, int len, String dflt)
|
||||
{return Add(name, Db_meta_fld.Tid_str, len, Bool_.N, Bool_.N, Bool_.N, dflt);}
|
||||
public String Add_text(String name) {return Add(name, Db_meta_fld.Tid_text, Len_null, Bool_.N, Bool_.N, Bool_.N, Db_meta_fld.Default_value_null);}
|
||||
|
||||
@@ -31,4 +31,5 @@ public class Db_meta_idx {
|
||||
public static Db_meta_idx new_unique_by_tbl_wo_null(String tbl, String name, String... flds) {return new Db_meta_idx(tbl, Bld_idx_name(tbl, name), Bool_.Y, String_.Ary_wo_null(flds));}
|
||||
public static Db_meta_idx new_normal_by_tbl_wo_null(String tbl, String name, String... flds) {return new Db_meta_idx(tbl, Bld_idx_name(tbl, name), Bool_.N, String_.Ary_wo_null(flds));}
|
||||
public static String Bld_idx_name(String tbl, String suffix) {return String_.Concat(tbl, "__", suffix);}
|
||||
public static final Db_meta_idx[] Ary_empty = new Db_meta_idx[0];
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ package gplx.dbs; import gplx.*;
|
||||
import gplx.dbs.sqls.*;
|
||||
public class Db_meta_tbl {
|
||||
public Db_meta_tbl(String name, Db_meta_fld[] flds, Db_meta_idx[] idxs) {
|
||||
if (idxs == null) idxs = Db_meta_idx.Ary_empty; // empty params will pass idxs of null; set to idxs[0] else null ref when calling create_table
|
||||
this.name = name; this.flds = flds; this.idxs = idxs;
|
||||
}
|
||||
public String Name() {return name;} private final String name;
|
||||
|
||||
@@ -17,9 +17,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.dbs; import gplx.*;
|
||||
public class Db_rdr_ {
|
||||
public static final Db_rdr Null = new Db_rdr__null();
|
||||
public static final Db_rdr Empty = new Db_rdr__empty();
|
||||
}
|
||||
class Db_rdr__null implements Db_rdr {
|
||||
class Db_rdr__empty implements Db_rdr {
|
||||
public boolean Move_next() {return false;}
|
||||
public byte[] Read_bry(int i) {return Bry_.Empty;}
|
||||
public byte[] Read_bry(String k) {return Bry_.Empty;}
|
||||
|
||||
@@ -19,7 +19,8 @@ package gplx.dbs; import gplx.*;
|
||||
import java.sql.ResultSet;
|
||||
public class Db_rdr__basic implements Db_rdr {
|
||||
protected ResultSet rdr;
|
||||
public void Ctor(ResultSet rdr, String sql) {this.rdr = rdr; this.sql = sql;}
|
||||
private Db_stmt stmt;
|
||||
public void Ctor(Db_stmt stmt, ResultSet rdr, String sql) {this.stmt = stmt; this.rdr = rdr; this.sql = sql;}
|
||||
public String Sql() {return sql;} private String sql;
|
||||
public boolean Move_next() {
|
||||
try {return rdr.next();}
|
||||
@@ -45,5 +46,9 @@ public class Db_rdr__basic implements Db_rdr {
|
||||
@gplx.Virtual public byte Read_byte(String k) {try {return Byte_.cast_(rdr.getObject(k));} catch (Exception e) {throw Err_.new_("read failed: k={0} type={1} err={2}", k, Byte_.Cls_val_name, Err_.Message_lang(e));}}
|
||||
@gplx.Virtual public boolean Read_bool_by_byte(int i) {try {return rdr.getByte(i + 1) == 1;} catch (Exception e) {throw Err_.new_("read failed: i={0} type={1} err={2}", i, Bool_.Cls_val_name, Err_.Message_lang(e));}}
|
||||
@gplx.Virtual public boolean Read_bool_by_byte(String k) {try {return Byte_.cast_(rdr.getObject(k)) == 1;} catch (Exception e) {throw Err_.new_("read failed: k={0} type={1} err={2}", k, Bool_.Cls_val_name, Err_.Message_lang(e));}}
|
||||
@gplx.Virtual public void Rls() {try {rdr.close();} catch (Exception e) {throw Err_.new_("close failed: err={0}", Err_.Message_lang(e));}}
|
||||
@gplx.Virtual public void Rls() {
|
||||
try {rdr.close();}
|
||||
catch (Exception e) {throw Err_.new_("close failed: err={0}", Err_.Message_lang(e));}
|
||||
if (stmt != null) stmt.Rls();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,7 +53,8 @@ public interface Db_stmt extends RlsAble {
|
||||
int Exec_update();
|
||||
int Exec_delete();
|
||||
DataRdr Exec_select();
|
||||
Db_rdr Exec_select_as_rdr();
|
||||
Db_rdr Exec_select__rls_manual();
|
||||
Db_rdr Exec_select__rls_auto();
|
||||
Object Exec_select_val();
|
||||
void Ctor_stmt(Db_engine engine, Db_qry qry);
|
||||
Db_stmt Clear();
|
||||
|
||||
@@ -38,8 +38,8 @@ public class Db_stmt_bldr {
|
||||
default: throw Err_.unhandled(cmd_mode);
|
||||
}
|
||||
}
|
||||
public void Batch_bgn() {conn.Txn_mgr().Txn_bgn_if_none();}
|
||||
public void Batch_end() {conn.Txn_mgr().Txn_end_all();}
|
||||
public void Batch_bgn() {conn.Txn_bgn(tbl_name);}
|
||||
public void Batch_end() {conn.Txn_end();}
|
||||
public void Rls() {
|
||||
create = Db_stmt_.Rls(create);
|
||||
update = Db_stmt_.Rls(update);
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012 gnosygnu@gmail.com
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.dbs; import gplx.*;
|
||||
import gplx.dbs.engines.*;
|
||||
public class Db_txn_mgr {
|
||||
public Db_txn_mgr(Db_engine engine) {this.engine = engine;} private final Db_engine engine;
|
||||
public int Txn_depth() {return txn_depth;} int txn_depth; // NOTE: only support 1 level for now;
|
||||
public void Txn_bgn_if_none() {if (txn_depth == 0) this.Txn_bgn();}
|
||||
public void Txn_bgn() {
|
||||
engine.Txn_bgn();
|
||||
++txn_depth;
|
||||
}
|
||||
public void Txn_end_all() {this.Txn_end();}
|
||||
public void Txn_end() {
|
||||
if (txn_depth == 0) return;
|
||||
engine.Txn_end();
|
||||
--txn_depth;
|
||||
txn_count = 0;
|
||||
}
|
||||
public void Txn_end_all_bgn_if_none() {
|
||||
this.Txn_end_all();
|
||||
this.Txn_bgn_if_none();
|
||||
}
|
||||
public int Txn_count() {return txn_count;} public void Txn_count_(int v) {txn_count = v;} int txn_count;
|
||||
}
|
||||
@@ -18,20 +18,24 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
package gplx.dbs.engines; import gplx.*; import gplx.dbs.*;
|
||||
public interface Db_engine {
|
||||
String Tid();
|
||||
Db_url Url();
|
||||
Db_engine New_clone(Db_url url);
|
||||
Db_rdr New_rdr_by_obj(Object o, String sql); // Object o:ResultSet if desktop; Cursor if android
|
||||
Db_conn_info Conn_info();
|
||||
Db_engine New_clone(Db_conn_info url);
|
||||
Db_rdr New_rdr__rls_manual (Object rdr_obj, String sql); // Object o:ResultSet if desktop; Cursor if android
|
||||
Db_rdr New_rdr__rls_auto (Db_stmt stmt, Object rdr_obj, String sql); // Object o:ResultSet if desktop; Cursor if android
|
||||
Db_stmt New_stmt_prep(Db_qry qry);
|
||||
Object New_stmt_prep_as_obj(String sql);
|
||||
DataRdr New_rdr(java.sql.ResultSet rdr, String sql);
|
||||
void Txn_bgn();
|
||||
void Txn_bgn(String name);
|
||||
void Txn_end();
|
||||
void Txn_cxl();
|
||||
void Txn_sav();
|
||||
void Conn_open();
|
||||
void Conn_term();
|
||||
Object Exec_as_obj(Db_qry qry);
|
||||
void Exec_ddl_create_tbl(Db_meta_tbl meta);
|
||||
void Exec_ddl_create_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... ary);
|
||||
void Exec_ddl_append_fld(String tbl, Db_meta_fld fld);
|
||||
void Exec_env_db_attach(String alias, Io_url db_url);
|
||||
void Exec_env_db_detach(String alias);
|
||||
void Ddl_create_tbl(Db_meta_tbl meta);
|
||||
void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... ary);
|
||||
void Ddl_append_fld(String tbl, Db_meta_fld fld);
|
||||
void Ddl_delete_tbl(String tbl);
|
||||
void Env_db_attach(String alias, Io_url db_url);
|
||||
void Env_db_detach(String alias);
|
||||
}
|
||||
|
||||
@@ -19,19 +19,18 @@ package gplx.dbs.engines; import gplx.*; import gplx.dbs.*;
|
||||
import java.sql.*;
|
||||
import gplx.dbs.engines.*; import gplx.dbs.qrys.*; import gplx.dbs.sqls.*;
|
||||
public abstract class Db_engine_sql_base implements Db_engine {
|
||||
@gplx.Internal protected void Ctor(Db_url url) {this.url = url;}
|
||||
@gplx.Internal protected void Ctor(Db_conn_info conn_info) {this.conn_info = conn_info;}
|
||||
public abstract String Tid();
|
||||
public Db_url Url() {return url;} protected Db_url url;
|
||||
public abstract Db_engine New_clone(Db_url url);
|
||||
public Db_rdr New_rdr_by_obj(Object rdr, String sql) {
|
||||
Db_rdr__basic rv = (Db_rdr__basic)New_rdr_clone();
|
||||
rv.Ctor((ResultSet)rdr, sql);
|
||||
return rv;
|
||||
}
|
||||
public Db_conn_info Conn_info() {return conn_info;} protected Db_conn_info conn_info;
|
||||
public abstract Db_engine New_clone(Db_conn_info conn_info);
|
||||
public Db_rdr New_rdr__rls_manual(Object rdr_obj, String sql) {return New_rdr(null, rdr_obj, sql);}
|
||||
public Db_rdr New_rdr__rls_auto(Db_stmt stmt, Object rdr_obj, String sql) {return New_rdr(stmt, rdr_obj, sql);}
|
||||
@gplx.Virtual public Db_rdr New_rdr_clone() {return new Db_rdr__basic();}
|
||||
public Db_stmt New_stmt_prep(Db_qry qry) {return new Db_stmt_cmd(this, qry);}
|
||||
public void Txn_bgn() {Exec_as_obj(Db_qry_sql.xtn_("BEGIN TRANSACTION;"));}
|
||||
public void Txn_end() {Exec_as_obj(Db_qry_sql.xtn_("COMMIT TRANSACTION;"));}
|
||||
@gplx.Virtual public void Txn_bgn(String name) {Exec_as_obj(Db_qry_sql.xtn_("BEGIN TRANSACTION;"));}
|
||||
@gplx.Virtual public void Txn_end() {Exec_as_obj(Db_qry_sql.xtn_("COMMIT TRANSACTION;"));}
|
||||
@gplx.Virtual public void Txn_cxl() {Exec_as_obj(Db_qry_sql.xtn_("ROLLBACK TRANSACTION;"));}
|
||||
@gplx.Virtual public void Txn_sav() {this.Txn_end(); this.Txn_bgn("");}
|
||||
public Object Exec_as_obj(Db_qry qry) {
|
||||
if (qry.Tid() == Db_qry_.Tid_flush) return null; // ignore flush (delete-db) statements
|
||||
String sql = this.SqlWtr().Xto_str(qry, false); // DBG: Tfds.Write(sql);
|
||||
@@ -42,7 +41,7 @@ public abstract class Db_engine_sql_base implements Db_engine {
|
||||
Statement cmd = New_stmt_exec(sql);
|
||||
return cmd.executeUpdate(sql);
|
||||
}
|
||||
catch (Exception exc) {throw Err_.err_(exc, "exec nonQuery failed").Add("sql", sql).Add("err", Err_.Message_gplx_brief(exc));}
|
||||
catch (Exception exc) {throw Err_.new_("db.engine:exec failed; url={0} sql={1} err={2}", conn_info.Xto_api(), sql, Err_.Message_gplx_brief(exc));}
|
||||
}
|
||||
private DataRdr Exec_as_rdr(String sql) {
|
||||
try {
|
||||
@@ -51,31 +50,35 @@ public abstract class Db_engine_sql_base implements Db_engine {
|
||||
ResultSet rdr = cmd.getResultSet();
|
||||
return New_rdr(rdr, sql);
|
||||
}
|
||||
catch (Exception exc) {throw Err_.err_(exc, "exec reader failed").Add("sql", sql).Add("err", Err_.Message_gplx_brief(exc));}
|
||||
catch (Exception exc) {throw Err_.new_("db.engine:rdr failed; url={0} sql={1} err={2}", conn_info.Xto_api(), sql, Err_.Message_gplx_brief(exc));}
|
||||
}
|
||||
public void Exec_ddl_create_tbl(Db_meta_tbl meta) {Exec_as_int(meta.To_sql_create());}
|
||||
public void Exec_ddl_create_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... ary) {
|
||||
public void Ddl_create_tbl(Db_meta_tbl tbl) {Exec_as_int(tbl.To_sql_create());}
|
||||
public void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... ary) {
|
||||
int len = ary.length;
|
||||
for (int i = 0; i < len; ++i) {
|
||||
Db_meta_idx idx = ary[i];
|
||||
usr_dlg.Plog_many("", "", "db.idx.create; db=~{0} idx=~{1}", url.Database(), idx.Name());
|
||||
usr_dlg.Plog_many("", "", "creating database index (please wait); db=~{0} idx=~{1}", conn_info.Database(), idx.Name());
|
||||
Exec_as_int(idx.To_sql_create());
|
||||
}
|
||||
}
|
||||
public void Exec_ddl_append_fld(String tbl, Db_meta_fld fld) {
|
||||
Exec_as_int(Db_sqlbldr__sqlite.I.Bld_alter_tbl_add(tbl, fld));
|
||||
}
|
||||
@gplx.Virtual public void Exec_env_db_attach(String alias, Io_url db_url) {}
|
||||
@gplx.Virtual public void Exec_env_db_detach(String alias) {}
|
||||
public void Ddl_append_fld(String tbl, Db_meta_fld fld) {Exec_as_int(Db_sqlbldr__sqlite.I.Bld_alter_tbl_add(tbl, fld));}
|
||||
public void Ddl_delete_tbl(String tbl) {Exec_as_int(Db_sqlbldr__sqlite.I.Bld_drop_tbl(tbl));}
|
||||
@gplx.Virtual public void Env_db_attach(String alias, Io_url db_url) {}
|
||||
@gplx.Virtual public void Env_db_detach(String alias) {}
|
||||
@gplx.Virtual public DataRdr New_rdr(ResultSet rdr, String sql) {return gplx.stores.Db_data_rdr_.new_(rdr, sql);}
|
||||
@gplx.Virtual public Sql_qry_wtr SqlWtr() {return Sql_qry_wtr_.new_ansi();}
|
||||
private Db_rdr New_rdr(Db_stmt stmt, Object rdr, String sql) {
|
||||
Db_rdr__basic rv = (Db_rdr__basic)New_rdr_clone();
|
||||
rv.Ctor(stmt, (ResultSet)rdr, sql);
|
||||
return rv;
|
||||
}
|
||||
@gplx.Internal protected abstract Connection Conn_new();
|
||||
private Connection connection;
|
||||
protected Connection connection;
|
||||
public void Conn_open() {connection = Conn_new();}
|
||||
public void Conn_term() {
|
||||
if (connection == null) return; // connection never opened; just exit
|
||||
try {connection.close();}
|
||||
catch (Exception e) {throw Err_.err_(e, "Conn_term.fail; url={0} err={1}", url.Xto_raw(), Err_.Message_lang(e));}
|
||||
catch (Exception e) {throw Err_.err_(e, "Conn_term.fail; url={0} err={1}", conn_info.Xto_raw(), Err_.Message_lang(e));}
|
||||
connection = null;
|
||||
}
|
||||
public Object New_stmt_prep_as_obj(String sql) {
|
||||
@@ -90,6 +93,6 @@ public abstract class Db_engine_sql_base implements Db_engine {
|
||||
}
|
||||
protected Connection Conn_make_by_url(String url, String uid, String pwd) {
|
||||
try {return DriverManager.getConnection(url, uid, pwd);}
|
||||
catch (SQLException e) {throw Err_.err_(e, "connection open failed").Add("ConnectInfo", Url().Xto_raw());}
|
||||
catch (SQLException e) {throw Err_.err_(e, "connection open failed").Add("ConnectInfo", Conn_info().Xto_raw());}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,18 +16,18 @@ You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.dbs.engines.mems; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*;
|
||||
public class Db_url__mem extends Db_url__base {
|
||||
public class Db_conn_info__mem extends Db_conn_info__base {
|
||||
@Override public String Tid() {return Tid_const;} public static final String Tid_const = "mem";
|
||||
@Override public Db_url New_self(String raw, GfoMsg m) {
|
||||
Db_url__mem rv = new Db_url__mem();
|
||||
@Override public Db_conn_info New_self(String raw, GfoMsg m) {
|
||||
Db_conn_info__mem rv = new Db_conn_info__mem();
|
||||
rv.Ctor("", m.ReadStr("database"), raw, raw);
|
||||
return rv;
|
||||
}
|
||||
public static Db_url new_(String database) {
|
||||
return Db_url_.parse_(Bld_raw
|
||||
public static Db_conn_info new_(String database) {
|
||||
return Db_conn_info_.parse_(Bld_raw
|
||||
( "gplx_key", Tid_const
|
||||
, "database", database
|
||||
));
|
||||
}
|
||||
public static final Db_url__mem I = new Db_url__mem(); Db_url__mem() {}
|
||||
public static final Db_conn_info__mem I = new Db_conn_info__mem(); Db_conn_info__mem() {}
|
||||
}
|
||||
@@ -18,29 +18,33 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
package gplx.dbs.engines.mems; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*;
|
||||
public class Db_engine__mem implements Db_engine {
|
||||
private final HashAdp tbl_hash = HashAdp_.new_();
|
||||
Db_engine__mem(Db_url url) {this.url = url;}
|
||||
public String Tid() {return Db_url__mem.Tid_const;}
|
||||
public Db_url Url() {return url;} private Db_url url;
|
||||
public Db_engine New_clone(Db_url url) {return new Db_engine__mem(url);}
|
||||
Db_engine__mem(Db_conn_info conn_info) {this.conn_info = conn_info;}
|
||||
public String Tid() {return Db_conn_info__mem.Tid_const;}
|
||||
public Db_conn_info Conn_info() {return conn_info;} private Db_conn_info conn_info;
|
||||
public Db_engine New_clone(Db_conn_info conn_info) {return new Db_engine__mem(conn_info);}
|
||||
public Db_stmt New_stmt_prep(Db_qry qry) {return new Db_stmt__mem(this, qry);}
|
||||
public Mem_tbl Tbls_get(String name) {return (Mem_tbl)tbl_hash.Fetch(name);}
|
||||
public void Txn_bgn() {++txn_count;} private int txn_count = 0;
|
||||
public void Txn_end() {--txn_count;}
|
||||
public void Txn_bgn(String name) {++txn_count;} private int txn_count = 0;
|
||||
public void Txn_end() {--txn_count;}
|
||||
public void Txn_cxl() {--txn_count;}
|
||||
public void Txn_sav() {this.Txn_end(); this.Txn_bgn("");}
|
||||
public Object Exec_as_obj(Db_qry qry) {throw Err_.not_implemented_();}
|
||||
public void Conn_open() {}
|
||||
public void Conn_term() {
|
||||
if (txn_count != 0) throw Err_.new_("Conn_term.txns still open; txn_count={0}", txn_count);
|
||||
}
|
||||
public Db_rdr New_rdr_by_obj(Object rdr, String sql) {throw Err_.not_implemented_();}
|
||||
public Db_rdr New_rdr__rls_manual(Object rdr_obj, String sql) {throw Err_.not_implemented_();}
|
||||
public Db_rdr New_rdr__rls_auto(Db_stmt stmt, Object rdr_obj, String sql) {throw Err_.not_implemented_();}
|
||||
public DataRdr New_rdr(java.sql.ResultSet rdr, String sql) {throw Err_.not_implemented_();}
|
||||
public Object New_stmt_prep_as_obj(String sql) {throw Err_.not_implemented_();}
|
||||
public void Exec_ddl_create_tbl(Db_meta_tbl meta) {
|
||||
Mem_tbl mem_tbl = new Mem_tbl();
|
||||
public void Ddl_create_tbl(Db_meta_tbl meta) {
|
||||
Mem_tbl mem_tbl = new Mem_tbl(meta);
|
||||
tbl_hash.AddReplace(meta.Name(), mem_tbl);
|
||||
}
|
||||
public void Exec_ddl_create_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... ary) {} // TODO: implement unique index
|
||||
public void Exec_ddl_append_fld(String tbl, Db_meta_fld fld) {}
|
||||
public void Exec_env_db_attach(String alias, Io_url db_url) {}
|
||||
public void Exec_env_db_detach(String alias) {}
|
||||
public void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... ary) {} // TODO: implement unique index
|
||||
public void Ddl_append_fld(String tbl, Db_meta_fld fld) {}
|
||||
public void Ddl_delete_tbl(String tbl) {}
|
||||
public void Env_db_attach(String alias, Io_url db_url) {}
|
||||
public void Env_db_detach(String alias) {}
|
||||
public static final Db_engine__mem _ = new Db_engine__mem(); Db_engine__mem() {}
|
||||
}
|
||||
|
||||
@@ -18,12 +18,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
package gplx.dbs.engines.mems; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*;
|
||||
public class Db_stmt__mem implements Db_stmt {
|
||||
private static final String Key_na = ""; // key is not_available; only called by procs with signature of Val(<type> v);
|
||||
private final ListAdp val_list = ListAdp_.new_();
|
||||
private final OrderedHash val_list = OrderedHash_.new_();
|
||||
public Db_stmt__mem(Db_engine__mem engine, Db_qry qry) {Ctor_stmt(engine, qry);} private Db_engine__mem engine;
|
||||
public void Ctor_stmt(Db_engine engine, Db_qry qry) {this.engine = (Db_engine__mem)engine; this.qry = qry;}
|
||||
public HashAdp Crts() {return crt_hash;} private final HashAdp crt_hash = HashAdp_.new_();
|
||||
public int Args_len() {return val_list.Count();}
|
||||
public Object Args_get_at(int i) {return val_list.FetchAt(i);}
|
||||
public Object Args_get_at(int i) {return val_list.FetchAt(i);}
|
||||
public Object Args_get_by(String k) {return val_list.Fetch(k);}
|
||||
public Db_qry Qry() {return qry;} private Db_qry qry;
|
||||
public Db_stmt Reset_stmt() {return this;}
|
||||
public Db_stmt Clear() {
|
||||
@@ -117,14 +118,15 @@ public class Db_stmt__mem implements Db_stmt {
|
||||
return tbl.Delete(this);
|
||||
}
|
||||
public DataRdr Exec_select() {throw Err_.not_implemented_();}
|
||||
public Db_rdr Exec_select_as_rdr() {
|
||||
public Db_rdr Exec_select__rls_auto() {return this.Exec_select__rls_manual();}
|
||||
public Db_rdr Exec_select__rls_manual() {
|
||||
Mem_tbl tbl = engine.Tbls_get(qry.Base_table());
|
||||
return tbl.Select(this);
|
||||
}
|
||||
}
|
||||
public Object Exec_select_val() {throw Err_.not_implemented_();}
|
||||
private void Add(String k, boolean where, Object v) {
|
||||
if (k == Db_meta_fld.Key_null) return; // key is explicitly null; ignore; allows version_2+ type definitions
|
||||
val_list.Add(v);
|
||||
if (k == Db_meta_fld.Key_null) return; // key is explicitly null; ignore; allows schema_2+ type definitions
|
||||
val_list.Add_if_new(k, v); // NOTE: only add if new; WHERE with IN will call Add many times; fld_ttl IN ('A.png', 'B.png');
|
||||
if (where) {
|
||||
ListAdp list = (ListAdp)crt_hash.Fetch(k);
|
||||
if (list == null) {
|
||||
|
||||
@@ -16,18 +16,33 @@ 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.engines.mems; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*;
|
||||
import gplx.core.criterias.*; import gplx.dbs.qrys.*;
|
||||
import gplx.core.primitives.*; import gplx.core.criterias.*; import gplx.dbs.qrys.*;
|
||||
public class Mem_tbl {
|
||||
private final ListAdp rows = ListAdp_.new_(); private final ListAdp where_rows = ListAdp_.new_();
|
||||
private final HashAdp autonum_hash = HashAdp_.new_();
|
||||
private final Db_meta_tbl meta;
|
||||
public Mem_tbl(Db_meta_tbl meta) {this.meta = meta;}
|
||||
public int Insert(Db_stmt__mem stmt) {
|
||||
Db_qry_insert qry = (Db_qry_insert)stmt.Qry();
|
||||
String[] cols = qry.Cols_for_insert(); int len = cols.length;
|
||||
Mem_itm itm = new Mem_itm();
|
||||
for (int i = 0; i < len; ++i)
|
||||
itm.Set_by(cols[i], stmt.Args_get_at(i));
|
||||
Db_meta_fld[] flds = meta.Flds();
|
||||
int len = flds.length;
|
||||
for (int i = 0; i < len; ++i) {
|
||||
Db_meta_fld fld = flds[i];
|
||||
String fld_name = fld.Name();
|
||||
Object val = fld.Autonum() ? Autonum_calc(fld_name) : stmt.Args_get_by(fld_name);
|
||||
itm.Set_by(fld_name, val);
|
||||
}
|
||||
rows.Add(itm);
|
||||
return 1;
|
||||
}
|
||||
private int Autonum_calc(String name) {
|
||||
Int_obj_ref autonum_itm = (Int_obj_ref)autonum_hash.Fetch(name);
|
||||
if (autonum_itm == null) {
|
||||
autonum_itm = Int_obj_ref.new_(0);
|
||||
autonum_hash.Add(name, autonum_itm);
|
||||
}
|
||||
return autonum_itm.Val_add();
|
||||
}
|
||||
public int Update(Db_stmt__mem stmt) {
|
||||
Db_qry_update qry = (Db_qry_update)stmt.Qry();
|
||||
qry.Where().Val_from_args(stmt.Crts());
|
||||
|
||||
@@ -16,12 +16,12 @@ 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.engines.mysql; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*;
|
||||
public class Mysql_url extends Db_url__base {
|
||||
public class Mysql_conn_info extends Db_conn_info__base {
|
||||
@Override public String Tid() {return Tid_const;} public static final String Tid_const = "mysql";
|
||||
public String Uid() {return uid;} private String uid;
|
||||
public String Pwd() {return pwd;} private String pwd;
|
||||
public static Db_url new_(String server, String database, String uid, String pwd) {
|
||||
return Db_url_.parse_(Bld_raw
|
||||
public static Db_conn_info new_(String server, String database, String uid, String pwd) {
|
||||
return Db_conn_info_.parse_(Bld_raw
|
||||
( "gplx_key", Tid_const
|
||||
, "server", server
|
||||
, "database", database
|
||||
@@ -30,12 +30,12 @@ public class Mysql_url extends Db_url__base {
|
||||
, "charset", "utf8"
|
||||
));
|
||||
}
|
||||
@Override public Db_url New_self(String raw, GfoMsg m) {
|
||||
Mysql_url rv = new Mysql_url();
|
||||
@Override public Db_conn_info New_self(String raw, GfoMsg m) {
|
||||
Mysql_conn_info rv = new Mysql_conn_info();
|
||||
rv.Ctor(m.ReadStr("server"), m.ReadStr("database"), raw, BldApi(m, KeyVal_.new_("charset", "utf8")));
|
||||
rv.uid = m.ReadStr("uid");
|
||||
rv.pwd = m.ReadStr("pwd");
|
||||
return rv;
|
||||
}
|
||||
public static final Mysql_url _ = new Mysql_url(); Mysql_url() {}
|
||||
public static final Mysql_conn_info _ = new Mysql_conn_info(); Mysql_conn_info() {}
|
||||
}
|
||||
@@ -19,17 +19,17 @@ package gplx.dbs.engines.mysql; import gplx.*; import gplx.dbs.*; import gplx.db
|
||||
import gplx.stores.*; import gplx.dbs.engines.*; import gplx.dbs.sqls.*;
|
||||
import java.sql.*;
|
||||
public class Mysql_engine extends Db_engine_sql_base {
|
||||
@Override public String Tid() {return Mysql_url.Tid_const;}
|
||||
@Override public String Tid() {return Mysql_conn_info.Tid_const;}
|
||||
@Override public Sql_qry_wtr SqlWtr() {return Sql_qry_wtr_.new_escape_backslash();}
|
||||
@Override public Db_engine New_clone(Db_url connectInfo) {
|
||||
@Override public Db_engine New_clone(Db_conn_info connectInfo) {
|
||||
Mysql_engine rv = new Mysql_engine();
|
||||
rv.Ctor(connectInfo);
|
||||
return rv;
|
||||
}
|
||||
@Override public DataRdr New_rdr(ResultSet rdr, String commandText) {return Mysql_rdr.new_(rdr, commandText);}
|
||||
@gplx.Internal @Override protected Connection Conn_new() {
|
||||
Mysql_url url_as_mysql = (Mysql_url)url;
|
||||
return Conn_make_by_url("jdbc:mysql://localhost/" + url_as_mysql.Database() + "?characterEncoding=UTF8", url_as_mysql.Uid(), url_as_mysql.Pwd());
|
||||
Mysql_conn_info conn_info_as_mysql = (Mysql_conn_info)conn_info;
|
||||
return Conn_make_by_url("jdbc:mysql://localhost/" + conn_info_as_mysql.Database() + "?characterEncoding=UTF8", conn_info_as_mysql.Uid(), conn_info_as_mysql.Pwd());
|
||||
}
|
||||
public static final Mysql_engine _ = new Mysql_engine(); Mysql_engine() {}
|
||||
}
|
||||
|
||||
@@ -16,8 +16,8 @@ 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.engines.nulls; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*;
|
||||
public class Null_url extends Db_url__base {
|
||||
public class Null_conn_info extends Db_conn_info__base {
|
||||
@Override public String Tid() {return Tid_const;} public static final String Tid_const = "null_db";
|
||||
@Override public Db_url New_self(String raw, GfoMsg m) {return this;}
|
||||
public static final Null_url _ = new Null_url(); Null_url() {this.Ctor("", "", "gplx_key=null_db", "");}
|
||||
@Override public Db_conn_info New_self(String raw, GfoMsg m) {return this;}
|
||||
public static final Null_conn_info _ = new Null_conn_info(); Null_conn_info() {this.Ctor("", "", "gplx_key=null_db", "");}
|
||||
}
|
||||
@@ -15,24 +15,28 @@ GNU Affero General Public License for more details.
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.dbs.engines.nulls; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*;
|
||||
package gplx.dbs.engines.nulls; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*;
|
||||
public class Null_engine implements Db_engine {
|
||||
public String Tid() {return Null_url.Tid_const;}
|
||||
public Db_url Url() {return Db_url_.Null;}
|
||||
public String Tid() {return Null_conn_info.Tid_const;}
|
||||
public Db_conn_info Conn_info() {return Db_conn_info_.Null;}
|
||||
public void Conn_open() {}
|
||||
public void Conn_term() {}
|
||||
public Db_engine New_clone(Db_url url) {return this;}
|
||||
public Db_rdr New_rdr_by_obj(Object o, String sql) {return Db_rdr_.Null;}
|
||||
public Db_engine New_clone(Db_conn_info url) {return this;}
|
||||
public Db_rdr New_rdr__rls_manual (Object rdr_obj, String sql) {return Db_rdr_.Empty;}
|
||||
public Db_rdr New_rdr__rls_auto (Db_stmt stmt, Object rdr_obj, String sql) {return Db_rdr_.Empty;}
|
||||
public Db_stmt New_stmt_prep(Db_qry qry) {return Db_stmt_.Null;}
|
||||
public Object New_stmt_prep_as_obj(String sql) {throw Err_.not_implemented_();}
|
||||
public DataRdr New_rdr(java.sql.ResultSet rdr, String sql) {return DataRdr_.Null;}
|
||||
public void Txn_bgn() {}
|
||||
public void Txn_end() {}
|
||||
public void Txn_bgn(String name) {}
|
||||
public void Txn_end() {}
|
||||
public void Txn_cxl() {}
|
||||
public void Txn_sav() {}
|
||||
public Object Exec_as_obj(Db_qry cmd) {return cmd.Exec_is_rdr() ? (Object)DataRdr_.Null : -1;}
|
||||
public void Exec_ddl_create_tbl(Db_meta_tbl meta) {}
|
||||
public void Exec_ddl_create_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... ary) {}
|
||||
public void Exec_ddl_append_fld(String tbl, Db_meta_fld fld) {}
|
||||
public void Exec_env_db_attach(String alias, Io_url db_url) {}
|
||||
public void Exec_env_db_detach(String alias) {}
|
||||
public void Ddl_create_tbl(Db_meta_tbl meta) {}
|
||||
public void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... ary) {}
|
||||
public void Ddl_append_fld(String tbl, Db_meta_fld fld) {}
|
||||
public void Ddl_delete_tbl(String tbl) {}
|
||||
public void Env_db_attach(String alias, Io_url db_url) {}
|
||||
public void Env_db_detach(String alias) {}
|
||||
public static final Null_engine _ = new Null_engine(); Null_engine() {}
|
||||
}
|
||||
|
||||
@@ -16,12 +16,12 @@ 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.engines.postgres; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*;
|
||||
public class Postgres_url extends Db_url__base {
|
||||
public class Postgres_conn_info extends Db_conn_info__base {
|
||||
@Override public String Tid() {return Tid_const;} public static final String Tid_const = "postgresql";
|
||||
public String Uid() {return uid;} private String uid;
|
||||
public String Pwd() {return pwd;} private String pwd;
|
||||
public static Db_url new_(String server, String database, String uid, String pwd) {
|
||||
return Db_url_.parse_(Bld_raw
|
||||
public static Db_conn_info new_(String server, String database, String uid, String pwd) {
|
||||
return Db_conn_info_.parse_(Bld_raw
|
||||
( "gplx_key", Tid_const
|
||||
, "server", server
|
||||
, "database", database
|
||||
@@ -31,12 +31,12 @@ public class Postgres_url extends Db_url__base {
|
||||
, "encoding", "unicode" // needed for 1.1 conn; otherwise, ascii
|
||||
));
|
||||
}
|
||||
@Override public Db_url New_self(String raw, GfoMsg m) {
|
||||
Postgres_url rv = new Postgres_url();
|
||||
@Override public Db_conn_info New_self(String raw, GfoMsg m) {
|
||||
Postgres_conn_info rv = new Postgres_conn_info();
|
||||
rv.Ctor(m.ReadStr("server"), m.ReadStr("database"), raw, BldApi(m, KeyVal_.new_("encoding", "unicode")));
|
||||
rv.uid = m.ReadStr("user id");
|
||||
rv.pwd = m.ReadStr("password");
|
||||
return rv;
|
||||
}
|
||||
public static final Postgres_url _ = new Postgres_url(); Postgres_url() {}
|
||||
public static final Postgres_conn_info _ = new Postgres_conn_info(); Postgres_conn_info() {}
|
||||
}
|
||||
@@ -19,17 +19,17 @@ package gplx.dbs.engines.postgres; import gplx.*; import gplx.dbs.*; import gplx
|
||||
import gplx.stores.*; import gplx.dbs.engines.*; import gplx.dbs.sqls.*;
|
||||
import java.sql.*;
|
||||
public class Postgres_engine extends Db_engine_sql_base {
|
||||
@Override public String Tid() {return Postgres_url.Tid_const;}
|
||||
@Override public String Tid() {return Postgres_conn_info.Tid_const;}
|
||||
@Override public Sql_qry_wtr SqlWtr() {return Sql_qry_wtr_.new_escape_backslash();}
|
||||
@Override public Db_engine New_clone(Db_url connectInfo) {
|
||||
@Override public Db_engine New_clone(Db_conn_info connectInfo) {
|
||||
Postgres_engine rv = new Postgres_engine();
|
||||
rv.Ctor(connectInfo);
|
||||
return rv;
|
||||
}
|
||||
@Override public DataRdr New_rdr(ResultSet rdr, String commandText) {return Db_data_rdr_.new_(rdr, commandText);}
|
||||
@gplx.Internal @Override protected Connection Conn_new() {
|
||||
Postgres_url url_as_postgres = (Postgres_url)url;
|
||||
return Conn_make_by_url("jdbc:" + url_as_postgres.Tid() + "://localhost/" + url_as_postgres.Database(), url_as_postgres.Uid(), url_as_postgres.Pwd());
|
||||
Postgres_conn_info conn_info_as_postgres = (Postgres_conn_info)conn_info;
|
||||
return Conn_make_by_url("jdbc:" + conn_info_as_postgres.Tid() + "://localhost/" + conn_info_as_postgres.Database(), conn_info_as_postgres.Uid(), conn_info_as_postgres.Pwd());
|
||||
}
|
||||
public static final Postgres_engine _ = new Postgres_engine(); Postgres_engine() {}
|
||||
}
|
||||
|
||||
@@ -16,32 +16,32 @@ 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.engines.sqlite; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*;
|
||||
public class Sqlite_url extends Db_url__base {
|
||||
public class Sqlite_conn_info extends Db_conn_info__base {
|
||||
@Override public String Tid() {return Tid_const;} public static final String Tid_const = "sqlite";
|
||||
public Io_url Url() {return url;} private Io_url url;
|
||||
@Override public Db_url New_self(String raw, GfoMsg m) {
|
||||
Sqlite_url rv = new Sqlite_url();
|
||||
@Override public Db_conn_info New_self(String raw, GfoMsg m) {
|
||||
Sqlite_conn_info rv = new Sqlite_conn_info();
|
||||
String url = m.ReadStr("data source");
|
||||
rv.url = Io_url_.new_any_(url);
|
||||
rv.Ctor("", url, raw, BldApi(m, KeyVal_.new_("version", "3")));
|
||||
rv.database = rv.url.NameOnly();
|
||||
return rv;
|
||||
}
|
||||
public static Db_url load_(Io_url url) {
|
||||
return Db_url_.parse_(Bld_raw
|
||||
public static Db_conn_info load_(Io_url url) {
|
||||
return Db_conn_info_.parse_(Bld_raw
|
||||
( "gplx_key" , Tid_const
|
||||
, "data source" , url.Xto_api()
|
||||
, "version" , "3"
|
||||
));
|
||||
}
|
||||
public static Db_url make_(Io_url url) {
|
||||
public static Db_conn_info make_(Io_url url) {
|
||||
Io_mgr._.CreateDirIfAbsent(url.OwnerDir());
|
||||
return Db_url_.parse_(Bld_raw
|
||||
return Db_conn_info_.parse_(Bld_raw
|
||||
( "gplx_key" , Tid_const
|
||||
, "data source" , url.Xto_api()
|
||||
, "version" , "3"
|
||||
|
||||
));
|
||||
}
|
||||
public static final Sqlite_url _ = new Sqlite_url(); Sqlite_url() {}
|
||||
public static final Sqlite_conn_info _ = new Sqlite_conn_info(); Sqlite_conn_info() {}
|
||||
}
|
||||
@@ -20,16 +20,24 @@ import java.sql.*;
|
||||
import gplx.stores.*; import gplx.dbs.engines.*; import gplx.dbs.engines.sqlite.*;
|
||||
import gplx.dbs.qrys.*;
|
||||
public class Sqlite_engine extends Db_engine_sql_base {
|
||||
@Override public String Tid() {return Sqlite_url.Tid_const;}
|
||||
@Override public Db_engine New_clone(Db_url connectInfo) {
|
||||
private final Sqlite_txn_mgr txn_mgr;
|
||||
Sqlite_engine() {
|
||||
this.txn_mgr = new Sqlite_txn_mgr(this);
|
||||
}
|
||||
@Override public String Tid() {return Sqlite_conn_info.Tid_const;}
|
||||
@Override public Db_engine New_clone(Db_conn_info connectInfo) {
|
||||
Sqlite_engine rv = new Sqlite_engine();
|
||||
rv.Ctor(connectInfo);
|
||||
return rv;
|
||||
}
|
||||
@Override public DataRdr New_rdr(ResultSet rdr, String commandText) {return Sqlite_rdr.new_(rdr, commandText);}
|
||||
@Override public Db_rdr New_rdr_clone() {return new Db_rdr__sqlite();}
|
||||
@Override public void Exec_env_db_attach(String alias, Io_url db_url) {Exec_as_int(String_.Format("ATTACH '{0}' AS {1};", db_url.Raw(), alias));}
|
||||
@Override public void Exec_env_db_detach(String alias) {Exec_as_int(String_.Format("DETACH {0};", alias));}
|
||||
@Override public void Env_db_attach(String alias, Io_url db_url) {Exec_as_int(String_.Format("ATTACH '{0}' AS {1};", db_url.Raw(), alias));}
|
||||
@Override public void Env_db_detach(String alias) {Exec_as_int(String_.Format("DETACH {0};", alias));}
|
||||
@Override public void Txn_bgn(String name) {txn_mgr.Txn_bgn(name);}
|
||||
@Override public void Txn_end() {txn_mgr.Txn_end();}
|
||||
@Override public void Txn_cxl() {txn_mgr.Txn_cxl();}
|
||||
@Override public void Txn_sav() {txn_mgr.Txn_sav();}
|
||||
static boolean loaded = false;
|
||||
@gplx.Internal @Override protected Connection Conn_new() {
|
||||
if (!loaded) {
|
||||
@@ -39,24 +47,11 @@ public class Sqlite_engine extends Db_engine_sql_base {
|
||||
catch (ClassNotFoundException e) {throw Err_.new_("could not load sqlite jdbc driver");}
|
||||
loaded = true;
|
||||
}
|
||||
Sqlite_url url_as_sqlite = (Sqlite_url)url;
|
||||
return Conn_make_by_url("jdbc:sqlite://" + String_.Replace(url_as_sqlite.Url().Raw(), "\\", "/"), "", "");
|
||||
Sqlite_conn_info conn_info_as_sqlite = (Sqlite_conn_info)conn_info;
|
||||
Connection rv = Conn_make_by_url("jdbc:sqlite://" + String_.Replace(conn_info_as_sqlite.Url().Raw(), "\\", "/"), "", "");
|
||||
return rv;
|
||||
}
|
||||
private boolean pragma_needed = true;
|
||||
@Override public void Txn_bgn() {
|
||||
// Execute(Db_qry_sql.xtn_("PRAGMA ENCODING=\"UTF-8\";"));
|
||||
// Execute(Db_qry_sql.xtn_("PRAGMA journal_mode = OFF;")); // will cause out of memory
|
||||
// Execute(Db_qry_sql.xtn_("PRAGMA journal_mode = MEMORY;"));
|
||||
if (pragma_needed) {
|
||||
Exec_as_obj(Db_qry_sql.xtn_("PRAGMA synchronous = OFF;"));
|
||||
pragma_needed = false;
|
||||
}
|
||||
// Execute(Db_qry_sql.xtn_("PRAGMA temp_store = MEMORY;"));
|
||||
// Execute(Db_qry_sql.xtn_("PRAGMA locking_mode = EXCLUSIVE;"));
|
||||
// Execute(Db_qry_sql.xtn_("PRAGMA cache_size=4000;")); // too many will also cause out of memory
|
||||
Exec_as_obj(Db_qry_sql.xtn_("BEGIN TRANSACTION;"));
|
||||
}
|
||||
public static final Sqlite_engine _ = new Sqlite_engine(); Sqlite_engine() {}
|
||||
public static final Sqlite_engine _ = new Sqlite_engine();
|
||||
}
|
||||
class Db_rdr__sqlite extends Db_rdr__basic { @Override public byte Read_byte(int i) {try {return (byte)rdr.getInt(i + 1);} catch (Exception e) {throw Err_.new_("read failed: i={0} type={1} err={2}", i, Byte_.Cls_val_name, Err_.Message_lang(e));}}
|
||||
@Override public byte Read_byte(String k) {try {return (byte)Int_.cast_(rdr.getObject(k));} catch (Exception e) {throw Err_.new_("read failed: k={0} type={1} err={2}", k, Byte_.Cls_val_name, Err_.Message_lang(e));}}
|
||||
|
||||
@@ -55,7 +55,6 @@ public class Sqlite_engine_ {
|
||||
p.Exec_qry(qry);
|
||||
}
|
||||
public static void Idx_create(Gfo_usr_dlg usr_dlg, Db_conn conn, String tbl, Db_meta_idx[] idx_ary) {
|
||||
conn.Txn_mgr().Txn_end_all(); // commit any pending transactions
|
||||
int len = idx_ary.length;
|
||||
for (int i = 0; i < len; ++i) {
|
||||
Db_meta_idx idx = idx_ary[i];
|
||||
@@ -68,7 +67,6 @@ public class Sqlite_engine_ {
|
||||
public static void Idx_create(Db_conn p, Db_idx_itm... idxs) {Idx_create(Gfo_usr_dlg_.Null, p, "", idxs);}
|
||||
public static void Idx_create(Gfo_usr_dlg usr_dlg, Db_conn p, String file_id, Db_idx_itm... idxs) {
|
||||
int len = idxs.length;
|
||||
p.Txn_mgr().Txn_end_all(); // commit any pending transactions
|
||||
for (int i = 0; i < len; i++) {
|
||||
String index = idxs[i].Xto_sql();
|
||||
usr_dlg.Plog_many("", "", "creating index: ~{0} ~{1}", file_id, index);
|
||||
@@ -79,7 +77,7 @@ public class Sqlite_engine_ {
|
||||
public static Db_conn Conn_load_or_make_(Io_url url, Bool_obj_ref created) {
|
||||
boolean exists = Io_mgr._.ExistsFil(url);
|
||||
created.Val_(!exists);
|
||||
Db_url connect = exists ? Sqlite_url.load_(url) : Sqlite_url.make_(url);
|
||||
Db_conn_info connect = exists ? Sqlite_conn_info.load_(url) : Sqlite_conn_info.make_(url);
|
||||
Db_conn p = Db_conn_pool.I.Get_or_new(connect);
|
||||
if (!exists)
|
||||
Pragma_page_size(p, 4096);
|
||||
|
||||
70
140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_txn_mgr.java
Normal file
70
140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_txn_mgr.java
Normal file
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012 gnosygnu@gmail.com
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.dbs.engines.sqlite; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*;
|
||||
import gplx.dbs.qrys.*;
|
||||
public class Sqlite_txn_mgr {
|
||||
private final ListAdp txn_list = ListAdp_.new_();
|
||||
public Sqlite_txn_mgr(Db_engine engine) {this.engine = engine;} private final Db_engine engine;
|
||||
private boolean pragma_needed = Bool_.Y, txn_started = Bool_.N; // NOTE: txns only support 1 level; SQLite fails when nesting transactions; DATE:2015-03-11
|
||||
public void Txn_bgn(String name) {
|
||||
if (String_.Len_eq_0(name)) name = "unnamed";
|
||||
if (pragma_needed) {
|
||||
pragma_needed = false;
|
||||
engine.Exec_as_obj(Db_qry_sql.xtn_("PRAGMA synchronous = OFF;"));
|
||||
}
|
||||
// Execute(Db_qry_sql.xtn_("PRAGMA ENCODING=\"UTF-8\";"));
|
||||
// Execute(Db_qry_sql.xtn_("PRAGMA journal_mode = OFF;")); // will cause out of memory
|
||||
// Execute(Db_qry_sql.xtn_("PRAGMA journal_mode = MEMORY;"));
|
||||
// Execute(Db_qry_sql.xtn_("PRAGMA temp_store = MEMORY;"));
|
||||
// Execute(Db_qry_sql.xtn_("PRAGMA locking_mode = EXCLUSIVE;"));
|
||||
// Execute(Db_qry_sql.xtn_("PRAGMA cache_size=4000;")); // too many will also cause out of memory
|
||||
if (txn_started) {
|
||||
engine.Exec_as_obj(Db_qry_sql.xtn_(String_.Format("SAVEPOINT {0};", name)));
|
||||
}
|
||||
else {
|
||||
txn_started = true;
|
||||
engine.Exec_as_obj(Db_qry_sql.xtn_("BEGIN TRANSACTION;"));
|
||||
}
|
||||
txn_list.Add(name);
|
||||
}
|
||||
public void Txn_end() {
|
||||
if (txn_list.Count() == 0) {Gfo_usr_dlg_.I.Warn_many("", "", "no txns in stack;"); return;}
|
||||
String txn_last = (String)txn_list.PopLast();
|
||||
if (txn_list.Count() == 0) {// no txns left; commit it
|
||||
engine.Exec_as_obj(Db_qry_sql.xtn_("COMMIT TRANSACTION;"));
|
||||
txn_started = false;
|
||||
}
|
||||
else
|
||||
engine.Exec_as_obj(Db_qry_sql.xtn_(String_.Format("RELEASE SAVEPOINT {0};", txn_last)));
|
||||
}
|
||||
public void Txn_cxl() {
|
||||
if (txn_list.Count() == 0) {Gfo_usr_dlg_.I.Warn_many("", "", "no txns in stack;"); return;}
|
||||
String txn_last = (String)txn_list.PopLast();
|
||||
if (txn_list.Count() == 0) {// no txns left; rollback
|
||||
engine.Exec_as_obj(Db_qry_sql.xtn_("ROLLBACK TRANSACTION;"));
|
||||
txn_started = false;
|
||||
}
|
||||
else
|
||||
engine.Exec_as_obj(Db_qry_sql.xtn_(String_.Format("ROLBACK TRANSACTION TO SAVEPOINT {0};", txn_last)));
|
||||
}
|
||||
public void Txn_sav() {
|
||||
if (txn_list.Count() == 0) {Gfo_usr_dlg_.I.Warn_many("", "", "no txns in stack;"); return;}
|
||||
String name = (String)txn_list.FetchAt(txn_list.Count() - 1);
|
||||
this.Txn_end(); this.Txn_bgn(name);
|
||||
}
|
||||
}
|
||||
@@ -19,14 +19,14 @@ package gplx.dbs.engines.tdbs; import gplx.*; import gplx.dbs.*; import gplx.dbs
|
||||
import org.junit.*;
|
||||
public class TdbConnectInfo_tst {
|
||||
@Test public void Full() {
|
||||
Db_url connectInfo = Db_url_.parse_("gplx_key=tdb;url=C:\\dir\\xmpl.tdb;format=dsv;");
|
||||
Db_conn_info connectInfo = Db_conn_info_.parse_("gplx_key=tdb;url=C:\\dir\\xmpl.tdb;format=dsv;");
|
||||
tst_Parse(connectInfo, Io_url_.new_any_("C:\\dir\\xmpl.tdb"), "dsv");
|
||||
}
|
||||
@Test public void DefaultFormat() {
|
||||
Db_url connectInfo = Db_url_.parse_("gplx_key=tdb;url=C:\\dir\\xmpl.tdb"); // dsv Format inferred
|
||||
Db_conn_info connectInfo = Db_conn_info_.parse_("gplx_key=tdb;url=C:\\dir\\xmpl.tdb"); // dsv Format inferred
|
||||
tst_Parse(connectInfo, Io_url_.new_any_("C:\\dir\\xmpl.tdb"), "dsv");
|
||||
}
|
||||
void tst_Parse(Db_url connectInfo, Io_url url, String format) {
|
||||
Tfds.Eq(((Tdb_url)connectInfo).Url(), url);
|
||||
void tst_Parse(Db_conn_info connectInfo, Io_url url, String format) {
|
||||
Tfds.Eq(((Tdb_conn_info)connectInfo).Url(), url);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,5 +43,5 @@ public class TdbDatabase {
|
||||
}
|
||||
int FileId_next = TdbFile.MainFileId + 1;
|
||||
int TableId_next = 1;
|
||||
// public static Io_url UrlOf(Db_url url) {return Io_url_.new_any_(url.ServerName());}
|
||||
// public static Io_url UrlOf(Db_conn_info url) {return Io_url_.new_any_(url.ServerName());}
|
||||
}
|
||||
|
||||
@@ -18,20 +18,22 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
package gplx.dbs.engines.tdbs; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*;
|
||||
import gplx.dbs.qrys.*; import gplx.dbs.sqls.*;
|
||||
public class TdbEngine implements Db_engine {
|
||||
public String Tid() {return Tdb_url.Tid_const;}
|
||||
public Db_url Url() {return url;} private Db_url url;
|
||||
public String Tid() {return Tdb_conn_info.Tid_const;}
|
||||
public Db_conn_info Conn_info() {return conn_info;} private Db_conn_info conn_info;
|
||||
public TdbDatabase Db() {return db;} TdbDatabase db;
|
||||
public void Conn_open() {
|
||||
Tdb_url tdb_url = (Tdb_url)url;
|
||||
Tdb_conn_info tdb_url = (Tdb_conn_info)conn_info;
|
||||
String url_str = tdb_url.Server();
|
||||
db = loadMgr.LoadTbls(Io_url_.new_any_(url_str));
|
||||
}
|
||||
public void Conn_term() {}
|
||||
public void Txn_bgn() {}
|
||||
public void Txn_end() {}
|
||||
public Db_engine New_clone(Db_url url) {
|
||||
public void Txn_bgn(String name) {}
|
||||
public void Txn_end() {}
|
||||
public void Txn_cxl() {}
|
||||
public void Txn_sav() {}
|
||||
public Db_engine New_clone(Db_conn_info conn_info) {
|
||||
TdbEngine rv = new TdbEngine();
|
||||
rv.CtorTdbEngine(url);
|
||||
rv.CtorTdbEngine(conn_info);
|
||||
rv.Conn_open();
|
||||
return rv;
|
||||
}
|
||||
@@ -41,7 +43,8 @@ public class TdbEngine implements Db_engine {
|
||||
}
|
||||
public Db_stmt New_stmt_prep(Db_qry qry) {return new Db_stmt_sql().Parse(qry, Sql_qry_wtr_.I.Xto_str(qry, true));}
|
||||
public Object New_stmt_prep_as_obj(String sql) {throw Err_.not_implemented_();}
|
||||
public Db_rdr New_rdr_by_obj(Object o, String sql) {return Db_rdr_.Null;}
|
||||
public Db_rdr New_rdr__rls_manual(Object rdr_obj, String sql) {return Db_rdr_.Empty;}
|
||||
public Db_rdr New_rdr__rls_auto(Db_stmt stmt, Object rdr_obj, String sql) {return Db_rdr_.Empty;}
|
||||
public DataRdr New_rdr(java.sql.ResultSet rdr, String sql) {return DataRdr_.Null;}
|
||||
public TdbTable FetchTbl(String name) {
|
||||
TdbTable tbl = db.Tables().FetchOrFail(name);
|
||||
@@ -54,16 +57,17 @@ public class TdbEngine implements Db_engine {
|
||||
public void FlushTbl(TdbTable tbl) {
|
||||
saveMgr.SaveFile(db, tbl.File());
|
||||
}
|
||||
public void Exec_ddl_create_tbl(Db_meta_tbl meta) {throw Err_.not_implemented_();}
|
||||
public void Exec_ddl_create_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... ary) {throw Err_.not_implemented_();}
|
||||
public void Exec_ddl_append_fld(String tbl, Db_meta_fld fld) {throw Err_.not_implemented_();}
|
||||
public void Exec_env_db_attach(String alias, Io_url db_url) {}
|
||||
public void Exec_env_db_detach(String alias) {}
|
||||
public void Ddl_create_tbl(Db_meta_tbl meta) {throw Err_.not_implemented_();}
|
||||
public void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... ary) {throw Err_.not_implemented_();}
|
||||
public void Ddl_append_fld(String tbl, Db_meta_fld fld) {throw Err_.not_implemented_();}
|
||||
public void Ddl_delete_tbl(String tbl) {}
|
||||
public void Env_db_attach(String alias, Io_url db_url) {}
|
||||
public void Env_db_detach(String alias) {}
|
||||
|
||||
HashAdp wkrs = HashAdp_.new_(); TdbDbLoadMgr loadMgr = TdbDbLoadMgr.new_(); TdbDbSaveMgr saveMgr = TdbDbSaveMgr.new_();
|
||||
public static final TdbEngine _ = new TdbEngine();
|
||||
void CtorTdbEngine(Db_url url) {
|
||||
this.url = url;
|
||||
void CtorTdbEngine(Db_conn_info conn_info) {
|
||||
this.conn_info = conn_info;
|
||||
wkrs.Add(Db_qry_.Tid_select, TdbSelectWkr._);
|
||||
wkrs.Add(Db_qry_.Tid_insert, TdbInsertWkr.new_());
|
||||
wkrs.Add(Db_qry_.Tid_update, TdbUpdateWkr.new_());
|
||||
|
||||
@@ -81,7 +81,7 @@ public class TdbFlush_tst {
|
||||
}
|
||||
class TdbEngineFxt {
|
||||
public TdbEngine run_MakeEngine(Io_url url) {
|
||||
Db_url connectInfo = Db_url_.tdb_(url);
|
||||
Db_conn_info connectInfo = Db_conn_info_.tdb_(url);
|
||||
TdbEngine engine = (TdbEngine)TdbEngine._.New_clone(connectInfo);
|
||||
engine.Conn_open();
|
||||
return engine;
|
||||
|
||||
@@ -16,22 +16,22 @@ 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.engines.tdbs; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*;
|
||||
public class Tdb_url extends Db_url__base {
|
||||
public class Tdb_conn_info extends Db_conn_info__base {
|
||||
public Io_url Url() {return url;} Io_url url;
|
||||
@Override public String Tid() {return Tid_const;} public static final String Tid_const = "tdb";
|
||||
public static Db_url new_(Io_url url) {
|
||||
return Db_url_.parse_(Bld_raw
|
||||
public static Db_conn_info new_(Io_url url) {
|
||||
return Db_conn_info_.parse_(Bld_raw
|
||||
( "gplx_key", Tid_const
|
||||
, "url", url.Raw()
|
||||
));
|
||||
} Tdb_url() {}
|
||||
@Override public Db_url New_self(String raw, GfoMsg m) {
|
||||
Tdb_url rv = new Tdb_url();
|
||||
} Tdb_conn_info() {}
|
||||
@Override public Db_conn_info New_self(String raw, GfoMsg m) {
|
||||
Tdb_conn_info rv = new Tdb_conn_info();
|
||||
String urlStr = m.ReadStr("url");
|
||||
Io_url url = Io_url_.new_any_(urlStr);
|
||||
rv.Ctor(urlStr, url.NameOnly(), raw, BldApi(m));
|
||||
rv.url = url;
|
||||
return rv;
|
||||
}
|
||||
public static final Tdb_url _ = new Tdb_url();
|
||||
public static final Tdb_conn_info _ = new Tdb_conn_info();
|
||||
}
|
||||
@@ -114,7 +114,7 @@ public class Db_stmt_cmd implements Db_stmt {
|
||||
catch (Exception e) {
|
||||
this.Rls();
|
||||
Reset_stmt();
|
||||
throw Err_.err_(e, "db_stmt.insert: sql={0} err={1}", sql, Err_.Message_gplx_brief(e));
|
||||
throw Err_.err_(e, "db_stmt.insert: url={0} sql={1} err={2}", engine.Conn_info(), sql, Err_.Message_gplx_brief(e));
|
||||
}
|
||||
}
|
||||
public int Exec_update() {
|
||||
@@ -135,9 +135,12 @@ public class Db_stmt_cmd implements Db_stmt {
|
||||
}
|
||||
public DataRdr Exec_select() {
|
||||
try {DataRdr rv = engine.New_rdr(stmt.executeQuery(), sql); return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql);}
|
||||
}
|
||||
public Db_rdr Exec_select_as_rdr() {
|
||||
try {return engine.New_rdr_by_obj(stmt.executeQuery(), sql);} catch (Exception e) {throw Err_.err_(e, "select failed: sql={0}", sql);}
|
||||
}
|
||||
public Db_rdr Exec_select__rls_auto() {
|
||||
try {return engine.New_rdr__rls_auto(this, stmt.executeQuery(), sql);} catch (Exception e) {throw Err_.err_(e, "select failed: sql={0}", sql);}
|
||||
}
|
||||
public Db_rdr Exec_select__rls_manual() {
|
||||
try {return engine.New_rdr__rls_manual(stmt.executeQuery(), sql);} catch (Exception e) {throw Err_.err_(e, "select failed: sql={0}", sql);}
|
||||
}
|
||||
public Object Exec_select_val() {
|
||||
try {Object rv = Db_qry__select_cmd.Rdr_to_val(engine.New_rdr(stmt.executeQuery(), sql)); return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql);}
|
||||
@@ -153,6 +156,7 @@ public class Db_stmt_cmd implements Db_stmt {
|
||||
try {
|
||||
if (stmt.getConnection().isClosed()) return; // do not close stmt if connection is already closed; throws null error; DATE:2015-02-11
|
||||
stmt.close();
|
||||
stmt = null;
|
||||
}
|
||||
catch (Exception e) {throw Err_.err_(e, "failed to close command: {0}", sql);}
|
||||
}
|
||||
|
||||
@@ -112,7 +112,8 @@ public class Db_stmt_sql implements Db_stmt {// used for formatting SQL statemen
|
||||
public DataRdr Exec_select() {
|
||||
try {DataRdr rv = conn.Exec_qry_as_rdr(Db_qry_sql.rdr_(this.Xto_sql())); return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql_orig);}
|
||||
}
|
||||
public Db_rdr Exec_select_as_rdr() {throw Err_.not_implemented_();}
|
||||
public Db_rdr Exec_select__rls_auto() {return Db_rdr_.Empty;}
|
||||
public Db_rdr Exec_select__rls_manual() {return Db_rdr_.Empty;}
|
||||
public Object Exec_select_val() {
|
||||
try {Object rv = Db_qry__select_cmd.Rdr_to_val(this.Exec_select()); return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql_orig);}
|
||||
}
|
||||
|
||||
@@ -58,6 +58,9 @@ public class Db_sqlbldr__sqlite implements Db_sqlbldr {
|
||||
tmp_bfr.Add_byte_semic();
|
||||
return tmp_bfr.Xto_str_and_clear();
|
||||
}
|
||||
public String Bld_drop_tbl(String tbl) {
|
||||
return String_.Format("DROP TABLE IF EXISTS {0};", tbl);
|
||||
}
|
||||
private void Bld_fld(Bry_bfr tmp_bfr, Db_meta_fld fld) {
|
||||
tmp_bfr.Add_str_ascii(fld.Name()).Add_byte_space();
|
||||
Tid_to_sql(tmp_bfr, fld.Tid(), fld.Len()); tmp_bfr.Add_byte_space();
|
||||
@@ -74,7 +77,7 @@ public class Db_sqlbldr__sqlite implements Db_sqlbldr {
|
||||
tmp_bfr.Add_byte_space();
|
||||
}
|
||||
if (fld.Primary()) tmp_bfr.Add_str_ascii("PRIMARY KEY ");
|
||||
if (fld.Autoincrement()) tmp_bfr.Add_str_ascii("AUTOINCREMENT ");
|
||||
if (fld.Autonum()) tmp_bfr.Add_str_ascii("AUTOINCREMENT ");
|
||||
tmp_bfr.Del_by_1(); // remove trailing space
|
||||
}
|
||||
public static void Tid_to_sql(Bry_bfr tmp_bfr, int tid, int len) {// REF: https://www.sqlite.org/datatype3.html
|
||||
|
||||
@@ -17,21 +17,25 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.dbs.utls; import gplx.*; import gplx.dbs.*;
|
||||
public abstract class Db_in_wkr__base {
|
||||
protected abstract int Interval();
|
||||
protected abstract Db_qry Make_qry (Object db_ctx, int bgn, int end);
|
||||
@gplx.Virtual protected int Interval() {return gplx.dbs.engines.sqlite.Sqlite_engine_.Stmt_arg_max - 10;} // -10 for safety's sake
|
||||
protected abstract Db_qry Make_qry (int bgn, int end);
|
||||
protected abstract void Fill_stmt (Db_stmt stmt, int bgn, int end);
|
||||
protected abstract void Read_data (Cancelable cancelable, Object db_ctx, Db_rdr rdr);
|
||||
public void Select_in(Cancelable cancelable, Object db_ctx, Db_conn conn, int full_bgn, int full_end) {
|
||||
Db_rdr rdr = Db_rdr_.Null; Db_stmt stmt = Db_stmt_.Null;
|
||||
protected abstract void Read_data (Cancelable cancelable, Db_rdr rdr);
|
||||
@gplx.Virtual protected boolean Show_progress() {return false;}
|
||||
public void Select_in(Cancelable cancelable, Db_conn conn, int full_bgn, int full_end) {
|
||||
int part_len = Interval();
|
||||
Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_.I;
|
||||
boolean show_progress = this.Show_progress();
|
||||
for (int part_bgn = full_bgn; part_bgn < full_end; part_bgn += part_len) {
|
||||
int part_end = part_bgn + part_len;
|
||||
if (part_end > full_end) part_end = full_end;
|
||||
Db_stmt stmt = Db_stmt_.Null; Db_rdr rdr = Db_rdr_.Empty;
|
||||
try {
|
||||
stmt = conn.Stmt_new(Make_qry(db_ctx, part_bgn, part_end));
|
||||
if (show_progress) usr_dlg.Prog_many("", "", "reading: count=~{0}", part_end);
|
||||
stmt = conn.Stmt_new(Make_qry(part_bgn, part_end));
|
||||
Fill_stmt(stmt, part_bgn, part_end);
|
||||
rdr = stmt.Exec_select_as_rdr();
|
||||
Read_data(cancelable, db_ctx, rdr);
|
||||
rdr = stmt.Exec_select__rls_manual();
|
||||
Read_data(cancelable, rdr);
|
||||
}
|
||||
finally {rdr.Rls(); stmt.Rls();}
|
||||
}
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012 gnosygnu@gmail.com
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.dbs.utls; import gplx.*; import gplx.dbs.*;
|
||||
import gplx.core.primitives.*;
|
||||
class Db_sys_id_mgr {
|
||||
private Db_sys_regy_mgr db_regy;
|
||||
public Db_sys_id_mgr(Db_sys_regy_mgr db_regy) {this.db_regy = db_regy;}
|
||||
public int Get_next(String key) {return db_regy.Get_val_as_int_or(Grp_key, key, 1);}
|
||||
public void Set_next(String key, int v) {db_regy.Set(Grp_key, key, Int_.Xto_str(v));}
|
||||
private static final String Grp_key = "gplx.next_id";
|
||||
}
|
||||
@@ -1,47 +0,0 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012 gnosygnu@gmail.com
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.dbs.utls; import gplx.*; import gplx.dbs.*;
|
||||
class Db_sys_regy_mgr {
|
||||
private Db_sys_regy_tbl tbl;
|
||||
public Db_sys_regy_mgr(Db_url url, String name, boolean create) {
|
||||
tbl = new Db_sys_regy_tbl(url, name);
|
||||
if (create) tbl.Create_table();
|
||||
}
|
||||
public void Set(String grp, String key, String val) {
|
||||
if (tbl.Select_val_or(grp, key, null) == null)
|
||||
tbl.Insert(grp, key, val);
|
||||
else
|
||||
tbl.Update(grp, key, val);
|
||||
}
|
||||
public void Del(String grp, String key) {
|
||||
tbl.Delete(grp, key);
|
||||
}
|
||||
public String Get_val_as_str_or(String grp, String key, String or) {
|
||||
return tbl.Select_val_or(grp, key, or);
|
||||
}
|
||||
public int Get_val_as_int_or(String grp, String key, int or) {
|
||||
String rv = tbl.Select_val_or(grp, key, null);
|
||||
return rv == null ? or : Int_.parse_or_(rv, or);
|
||||
}
|
||||
}
|
||||
class Db_sys_regy_itm {
|
||||
public Db_sys_regy_itm(String grp, String key, String val) {this.grp = grp; this.key = key; this.val = val;}
|
||||
public String Grp() {return grp;} private final String grp;
|
||||
public String Key() {return key;} private final String key;
|
||||
public String Val() {return val;} private final String val;
|
||||
}
|
||||
@@ -1,54 +0,0 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012 gnosygnu@gmail.com
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.dbs.utls; import gplx.*; import gplx.dbs.*;
|
||||
import org.junit.*;
|
||||
public class Db_sys_regy_mgr_tst {
|
||||
@Before public void init() {fxt.Init();} private Db_sys_regy_mgr_fxt fxt = new Db_sys_regy_mgr_fxt();
|
||||
@Test public void Insert() {
|
||||
fxt .Exec_set("grp", "key", "val_0")
|
||||
.Test_get("grp", "key", "val_0");
|
||||
}
|
||||
@Test public void Update() {
|
||||
fxt .Exec_set("grp", "key", "val_0")
|
||||
.Exec_set("grp", "key", "val_1")
|
||||
.Test_get("grp", "key", "val_1");
|
||||
}
|
||||
@Test public void Delete() {
|
||||
fxt .Exec_set("grp", "key_0", "val_0")
|
||||
.Exec_set("grp", "key_1", "val_1")
|
||||
.Exec_del("grp", "key_1")
|
||||
.Test_get("grp", "key_0", "val_0")
|
||||
.Test_get("grp", "key_1", null)
|
||||
;
|
||||
}
|
||||
}
|
||||
class Db_sys_regy_mgr_fxt {
|
||||
private Db_sys_regy_mgr sys_regy_mgr;
|
||||
public void Init() {
|
||||
if (sys_regy_mgr == null) {
|
||||
Db_conn_pool.I.Get_or_new__mem("test_db");
|
||||
sys_regy_mgr = new Db_sys_regy_mgr(Db_url_.mem_("test_db"), "test_regy", true);
|
||||
}
|
||||
}
|
||||
public Db_sys_regy_mgr_fxt Exec_set(String grp, String key, String val) {sys_regy_mgr.Set(grp, key, val); return this;}
|
||||
public Db_sys_regy_mgr_fxt Exec_del(String grp, String key) {sys_regy_mgr.Del(grp, key); return this;}
|
||||
public Db_sys_regy_mgr_fxt Test_get(String grp, String key, String expd_val) {
|
||||
Tfds.Eq(expd_val, sys_regy_mgr.Get_val_as_str_or(grp, key, null));
|
||||
return this;
|
||||
}
|
||||
}
|
||||
@@ -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.dbs.utls; import gplx.*; import gplx.dbs.*;
|
||||
class Db_sys_regy_tbl {
|
||||
private final String tbl_name;
|
||||
private static final Db_meta_fld_list Flds = Db_meta_fld_list.new_();
|
||||
private static final String
|
||||
Fld_regy_grp = Flds.Add_str("regy_grp", 1024)
|
||||
, Fld_regy_key = Flds.Add_str("regy_key", 1024)
|
||||
, Fld_regy_val = Flds.Add_str("regy_val", 4096)
|
||||
;
|
||||
public static Db_meta_tbl new_meta(String tbl) {
|
||||
return Db_meta_tbl.new_(tbl, Flds.To_fld_ary()
|
||||
, Db_meta_idx.new_unique_by_tbl(tbl, "key", Flds.To_str_ary())
|
||||
);
|
||||
}
|
||||
private Db_meta_tbl meta;
|
||||
private Db_conn conn;
|
||||
public Db_sys_regy_tbl(Db_url url, String tbl_name) {
|
||||
this.tbl_name = tbl_name;
|
||||
this.meta = Db_sys_regy_tbl.new_meta(tbl_name);
|
||||
this.conn = Db_conn_pool.I.Get_or_new(url);
|
||||
}
|
||||
public void Create_table() {conn.Exec_create_tbl_and_idx(meta);}
|
||||
public void Insert(String grp, String key, String val) {
|
||||
Db_stmt stmt = conn.Stmt_insert(tbl_name, Flds.To_str_ary());
|
||||
stmt.Clear().Val_str(grp).Val_str(key).Val_str(val).Exec_insert();
|
||||
}
|
||||
public void Update(String grp, String key, String val) {
|
||||
Db_stmt stmt = conn.Stmt_update(tbl_name, String_.Ary(Fld_regy_grp, Fld_regy_key), Fld_regy_val);
|
||||
stmt.Clear().Val_str(val).Crt_str(Fld_regy_grp, grp).Crt_str(Fld_regy_key, key).Exec_update();
|
||||
}
|
||||
public void Delete(String grp, String key) {
|
||||
Db_stmt stmt = conn.Stmt_delete(tbl_name, Fld_regy_grp, Fld_regy_key);
|
||||
stmt.Clear().Crt_str(Fld_regy_grp, grp).Crt_str(Fld_regy_key, key).Exec_delete();
|
||||
}
|
||||
public String Select_val_or(String grp, String key, String or) {
|
||||
Db_stmt stmt = conn.Stmt_select(tbl_name, Flds.To_str_ary(), Fld_regy_grp, Fld_regy_key);
|
||||
Db_rdr rdr = Db_rdr_.Null;
|
||||
try {
|
||||
rdr = stmt.Clear().Crt_str(Fld_regy_grp, grp).Crt_str(Fld_regy_key, key).Exec_select_as_rdr();
|
||||
return rdr.Move_next() ? rdr.Read_str(Fld_regy_val) : or;
|
||||
} finally {rdr.Rls();}
|
||||
}
|
||||
}
|
||||
@@ -19,7 +19,7 @@ package gplx.dbs.utls; import gplx.*; import gplx.dbs.*;
|
||||
import org.junit.*;
|
||||
public class PoolIds_tst {
|
||||
@Before public void setup() {
|
||||
conn = Db_conn_pool.I.Get_or_new(Db_url_.Test);
|
||||
conn = Db_conn_pool.I.Get_or_new(Db_conn_info_.Test);
|
||||
Db_qry_fxt.DeleteAll(conn, PoolIds.Tbl_Name);
|
||||
mgr = PoolIds._;
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.stores; import gplx.*;
|
||||
import org.junit.*;
|
||||
import gplx.dbs.*; /*Db_url*/
|
||||
import gplx.dbs.*; /*Db_conn_info*/
|
||||
public class DbMaprMgr_tst {
|
||||
@Before public void setup() {
|
||||
mgr = DbMaprMgr.new_().RootIndexFlds_(DbMaprArg.new_("id", "disc_id"))
|
||||
@@ -37,9 +37,9 @@ public class DbMaprMgr_tst {
|
||||
. Flds_add(MockStream.id_idk, "stream_id").Flds_add(MockStream.name_idk, "stream_name")
|
||||
. ConstantFlds_add("stream_type", 1)
|
||||
)));
|
||||
wtr = DbMaprWtr.new_by_url_(Db_url_.Test);
|
||||
wtr = DbMaprWtr.new_by_url_(Db_conn_info_.Test);
|
||||
wtr.EnvVars().Add(DbMaprWtr.Key_Mgr, mgr);
|
||||
conn = Db_conn_pool.I.Get_or_new(Db_url_.Test);
|
||||
conn = Db_conn_pool.I.Get_or_new(Db_conn_info_.Test);
|
||||
Db_qry_fxt.DeleteAll(conn, "mock_discs", "mock_titles", "mock_chapters", "mock_streams");
|
||||
} DbMaprMgr mgr; DbMaprWtr wtr; Db_conn conn; MockDisc disc; MockTitle title; MockChapter chapter; MockStream audio, subtitle; SrlMgr rdr;
|
||||
@Test public void PurgeObjTree() {
|
||||
@@ -133,7 +133,7 @@ public class DbMaprMgr_tst {
|
||||
Tfds.Eq("subtitle1", ((MockStream)t.Subtitles().FetchAt(0)).Name());
|
||||
}
|
||||
DbMaprRdr rdr_() {
|
||||
DbMaprRdr rv = DbMaprRdr.new_(Db_url_.Test, Db_crt_.eq_("disc_id", 1));
|
||||
DbMaprRdr rv = DbMaprRdr.new_(Db_conn_info_.Test, Db_crt_.eq_("disc_id", 1));
|
||||
rv.EnvVars().Add(DbMaprWtr.Key_Mgr, mgr);
|
||||
return rv;
|
||||
}
|
||||
|
||||
@@ -114,7 +114,7 @@ public class DbMaprRdr extends DataRdr_base implements SrlMgr {
|
||||
HashAdp tables = HashAdp_.new_();
|
||||
Db_conn conn; Criteria rootCrt;
|
||||
DbMaprMgr mgr; ListAdp rowStack = ListAdp_.new_();
|
||||
public static DbMaprRdr new_(Db_url dbInfo, Criteria rootCrt) {
|
||||
public static DbMaprRdr new_(Db_conn_info dbInfo, Criteria rootCrt) {
|
||||
DbMaprRdr rv = new DbMaprRdr();
|
||||
rv.conn = Db_conn_pool.I.Get_or_new(dbInfo); rv.rootCrt = rootCrt;
|
||||
return rv;
|
||||
|
||||
@@ -84,7 +84,7 @@ public class DbMaprWtr extends DataWtr_base implements DataWtr {
|
||||
public String XtoStr() {return "";}
|
||||
@Override public SrlMgr SrlMgr_new(Object o) {return new DbMaprWtr();}
|
||||
DbMaprMgr mgr; Db_conn conn; String curTableName; Db_qry_insert insertCmd;
|
||||
public static DbMaprWtr new_by_url_(Db_url url) {
|
||||
public static DbMaprWtr new_by_url_(Db_conn_info url) {
|
||||
DbMaprWtr rv = new DbMaprWtr();
|
||||
rv.conn = Db_conn_pool.I.Get_or_new(url);
|
||||
return rv;
|
||||
|
||||
Reference in New Issue
Block a user