1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2024-10-27 20:34:16 +00:00

v2.1.4.1a

This commit is contained in:
gnosygnu 2015-01-25 20:59:15 -05:00
parent efaf9dcd00
commit 5efed51da9
33 changed files with 0 additions and 1868 deletions

View File

@ -1,45 +0,0 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx;
public class Bool_default {
public static final byte Tid_n = 0, Tid_y = 1, Tid_i = 2;
public static final String Str_n = "never", Str_y = "always", Str_i = "default";
public static final byte Chr_n = Byte_ascii.Ltr_n, Chr_y = Byte_ascii.Ltr_y, Chr_i = Byte_ascii.Ltr_i;
public static String Xto_str(byte v) {
switch (v) {
case Tid_n: return Str_n;
case Tid_y: return Str_y;
case Tid_i: return Str_i;
default: throw Err_.unhandled(v);
}
}
public static byte Xto_char_byte(byte v) {
switch (v) {
case Tid_n: return Chr_n;
case Tid_y: return Chr_y;
case Tid_i: return Chr_i;
default: throw Err_.unhandled(v);
}
}
public static byte Xto_tid(String v) {
if (String_.Eq(v, Str_n)) return Tid_n;
else if (String_.Eq(v, Str_y)) return Tid_y;
else if (String_.Eq(v, Str_i)) return Tid_i;
else throw Err_.unhandled(v);
}
}

View File

@ -1,97 +0,0 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.dbs; import gplx.*;
public interface Db_conn_info {
String Key();
String Server();
String Database();
String Str_raw();
String Str_api();
Db_conn_info Make_new(String raw, GfoMsg m);
}
class Db_conn_info__null extends Db_conn_info__base {
@Override public String Key() {return Key_const;} public static final String Key_const = "null_db";
@Override public Db_conn_info Make_new(String raw, GfoMsg m) {return this;}
public static final Db_conn_info__null _ = new Db_conn_info__null(); Db_conn_info__null() {this.Ctor_of_db_connect("", "", "gplx_key=null_db", "");}
}
class Db_conn_info__mysql extends Db_conn_info__base {
@Override public String Key() {return Key_const;} public static final String Key_const = "mysql";
public String Uid() {return uid;} private String uid;
public String Pwd() {return pwd;} private String pwd;
public static Db_conn_info new_(String server, String database, String uid, String pwd) {
return Db_conn_info_.parse_(BldRaw(GfoMsg_.new_cast_("Db_conn_info")
.Add("gplx_key", Key_const)
.Add("server", server)
.Add("database", database)
.Add("uid", uid)
.Add("pwd", pwd)
.Add("charset", "utf8")
));
}
@Override public Db_conn_info Make_new(String raw, GfoMsg m) {
Db_conn_info__mysql rv = new Db_conn_info__mysql();
rv.Ctor_of_db_connect(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 Db_conn_info__mysql _ = new Db_conn_info__mysql(); Db_conn_info__mysql() {}
}
class Db_conn_info__postgres extends Db_conn_info__base {
@Override public String Key() {return Key_const;} public static final String Key_const = "postgresql";
public String Uid() {return uid;} private String uid;
public String Pwd() {return pwd;} private String pwd;
public static Db_conn_info new_(String server, String database, String uid, String pwd) {
return Db_conn_info_.parse_(BldRaw(GfoMsg_.new_cast_("Db_conn_info")
.Add("gplx_key", Key_const)
.Add("server", server)
.Add("database", database)
.Add("port", 5432)
.Add("user id", uid)
.Add("password", pwd)
.Add("encoding", "unicode") // needed for 1.1 provider; otherwise, ascii
));
}
@Override public Db_conn_info Make_new(String raw, GfoMsg m) {
Db_conn_info__postgres rv = new Db_conn_info__postgres();
rv.Ctor_of_db_connect(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 Db_conn_info__postgres _ = new Db_conn_info__postgres(); Db_conn_info__postgres() {}
}
class Db_conn_info__tdb extends Db_conn_info__base {
public Io_url Url() {return url;} Io_url url;
@Override public String Key() {return Key_const;} public static final String Key_const = "tdb";
public static Db_conn_info new_(Io_url url) {
return Db_conn_info_.parse_(BldRaw(GfoMsg_.new_cast_("Db_conn_info")
.Add("gplx_key", Key_const)
.Add("url", url.Raw())
));
} Db_conn_info__tdb() {}
@Override public Db_conn_info Make_new(String raw, GfoMsg m) {
Db_conn_info__tdb rv = new Db_conn_info__tdb();
String urlStr = m.ReadStr("url");
Io_url url = Io_url_.new_any_(urlStr);
rv.Ctor_of_db_connect(urlStr, url.NameOnly(), raw, BldApi(m));
rv.url = url;
return rv;
}
public static final Db_conn_info__tdb _ = new Db_conn_info__tdb();
}

View File

@ -1,52 +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_conn_info_ {
public static final Db_conn_info Null = Db_conn_info__null._;
public static final Db_conn_info Test = Db_conn_info__mysql.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 Db_conn_info__sqlite.load_(url);}
public static Db_conn_info tdb_(Io_url url) {return Db_conn_info__tdb.new_(url);}
public static final String Key_tdb = TdbEngine.KeyDef;
}
class Db_conn_info_pool {
private OrderedHash regy = OrderedHash_.new_();
public Db_conn_info_pool() {
this.Add(Db_conn_info__null._).Add(Db_conn_info__tdb._).Add(Db_conn_info__mysql._).Add(Db_conn_info__postgres._).Add(Db_conn_info__sqlite._);
}
public Db_conn_info_pool Add(Db_conn_info itm) {regy.AddReplace(itm.Key(), itm); return this;}
public Db_conn_info Parse(String raw) {// assume each pair has format of: name=val;
try {
GfoMsg m = GfoMsg_.new_parse_("db_conn_info");
String[] terms = String_.Split(raw, ";");
String conn_info_key = "";
for (String term : terms) {
if (String_.Len(term) == 0) continue;
String[] kv = String_.Split(term, "=");
if (String_.Eq(kv[0], "gplx_key"))
conn_info_key = kv[1]; // NOTE: do not add to GfoMsg; will not be part of ApiStr
else
m.Add(kv[0], kv[1]);
}
Db_conn_info prototype = (Db_conn_info)regy.Fetch(conn_info_key);
return prototype.Make_new(raw, m);
}
catch(Exception exc) {throw Err_.parse_type_exc_(exc, Db_conn_info.class, raw);}
}
public static final Db_conn_info_pool _ = new Db_conn_info_pool();
}

View File

@ -1,50 +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 abstract class Db_conn_info__base implements Db_conn_info {
public abstract String Key();
public String Database() {return database;} public Db_conn_info__base Database_(String v) {database = v; return this;} private String database = "";
public String Server() {return server;} public Db_conn_info__base Server_(String v) {server = v; return this;} private String server = "";
public String Str_raw() {return raw;} public Db_conn_info XtoStr_raw_(String v) {raw = v; return this;} private String raw = "";
public String Str_api() {return api;} public Db_conn_info XtoStr_std_(String v) {api = v; return this;} private String api = "";
public abstract Db_conn_info Make_new(String raw, GfoMsg m);
protected void Ctor_of_db_connect(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_();
HashAdp hash = HashAdp_.new_();
for (int i = 0; i < m.Args_count(); i++) {
KeyVal kv = m.Args_getAt(i);
sb.Add_fmt("{0}={1};", kv.Key(), kv.Val_to_str_or_empty());
hash.AddKeyVal(kv.Key());
}
for (KeyVal xtn : xtnAry) {
if (hash.Has(xtn.Key())) continue;
sb.Add_fmt("{0}={1};", xtn.Key(), xtn.Val_to_str_or_empty());
}
return sb.XtoStr();
}
protected static String BldRaw(GfoMsg m) {
String_bldr sb = String_bldr_.new_();
for (int i = 0; i < m.Args_count(); i++) {
KeyVal itm = m.Args_getAt(i);
sb.Add_fmt("{0}={1};", itm.Key(), itm.Val_to_str_or_empty());
}
return sb.XtoStr();
}
}

View File

@ -1,45 +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_conn_info__sqlite extends Db_conn_info__base {
@Override public String Key() {return Key_const;} public static final String Key_const = "sqlite";
public Io_url Url() {return url;} private Io_url url;
public static Db_conn_info load_(Io_url url) {
return Db_conn_info_.parse_(BldRaw(GfoMsg_.new_cast_("Db_conn_info")
.Add("gplx_key", Key_const)
.Add("data source", url.Xto_api())
.Add("version", 3)
));
}
public static Db_conn_info make_(Io_url url) {
Io_mgr._.CreateDirIfAbsent(url.OwnerDir());
return Db_conn_info_.parse_(BldRaw(GfoMsg_.new_cast_("Db_conn_info")
.Add("gplx_key", Key_const)
.Add("data source", url.Xto_api())
.Add("version", 3)
));
}
@Override public Db_conn_info Make_new(String raw, GfoMsg m) {
Db_conn_info__sqlite rv = new Db_conn_info__sqlite();
String url = m.ReadStr("data source");
rv.url = Io_url_.new_any_(url);
rv.Ctor_of_db_connect("", url, raw, BldApi(m, KeyVal_.new_("version", "3")));
return rv;
}
public static final Db_conn_info__sqlite _ = new Db_conn_info__sqlite(); Db_conn_info__sqlite() {}
}

View File

@ -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; import gplx.*;
import org.junit.*;
public class Db_conn_info_tst {
@Before public void setup() {
regy = new Db_conn_info_pool();
regy.Add(Db_conn_info_mock._);
} Db_conn_info_pool regy;
@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
tst_Parse("gplx_key=mock;id=1;name=me" , kv_("id", "1"), kv_("name", "me")); // no semi-colon at end
}
KeyVal kv_(String key, Object val) {return KeyVal_.new_(key, val);}
void tst_Parse(String raw, KeyVal... expd) {
Db_conn_info_mock mock = (Db_conn_info_mock)regy.Parse(raw);
Tfds.Eq_ary_str(expd, mock.Kvs());
}
}
class Db_conn_info_mock extends Db_conn_info__base {
public KeyVal[] Kvs() {return kvs;} KeyVal[] kvs;
@Override public String Key() {return Key_const;} public static final String Key_const = "mock";
@Override public Db_conn_info Make_new(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_conn_info_mock _ = new Db_conn_info_mock(); Db_conn_info_mock() {}
}

View File

@ -1,37 +0,0 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.dbs; import gplx.*;
public class Db_provider {
public Db_provider(Db_engine engine) {
this.engine = engine;
this.txn_mgr = new Db_txn_mgr_base(engine);
}
public Db_conn_info Conn_info() {return engine.Conn_info();}
public Db_engine Engine() {return engine;} private final Db_engine engine;
public Db_txn_mgr Txn_mgr() {return txn_mgr;} private final Db_txn_mgr txn_mgr;
public Db_stmt Prepare(Db_qry qry) {return engine.New_db_stmt(this, qry);}
public int Exec_qry(Db_qry qry) {txn_mgr.Txn_count_(txn_mgr.Txn_count() + 1); return Int_.cast_(engine.Execute(qry));}
public DataRdr Exec_qry_as_rdr(Db_qry qry) {return DataRdr_.cast_(engine.Execute(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 Conn_term() {
engine.Conn_term();
Db_provider_pool._.Del(this.Conn_info()); // remove from pool, else rls'd instance will be cached and fail upon next use
}
}

View File

@ -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_provider_ {
public static final Db_provider Null = new_and_open_(Db_conn_info_.Null);
public static Db_provider new_and_open_(Db_conn_info conn_info) {
Db_engine prototype = Db_engine_regy._.Get(conn_info.Key());
Db_engine engine = prototype.Make_new(conn_info);
engine.Conn_open(); // auto-open
return new Db_provider(engine);
}
public static int Select_fld0_as_int_or(Db_provider p, String sql, int or) {
DataRdr rdr = DataRdr_.Null;
try {
rdr = p.Exec_qry_as_rdr(Db_qry_sql.rdr_(sql));
int rv = or;
if (rdr.MoveNextPeer()) {
Object rv_obj = rdr.ReadAt(0);
if (rv_obj != null) // Max(fil_id) will be NULL if tbl is empty
rv = Int_.cast_or_(rv_obj, or);
}
return rv;
}
finally {
rdr.Rls();
}
}
}

View File

@ -1,34 +0,0 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.dbs; import gplx.*;
public interface Db_provider_mkr {
Db_provider Load_or_make_(Io_url db_url, Bool_obj_ref created_ref);
}
class Db_provider_mkr_sqlite implements Db_provider_mkr {
public Db_provider Load_or_make_(Io_url db_url, Bool_obj_ref created_ref) {return Sqlite_engine_.Provider_load_or_make_(db_url, created_ref);}
public static final Db_provider_mkr_sqlite _ = new Db_provider_mkr_sqlite(); Db_provider_mkr_sqlite() {}
}
class Db_provider_mkr_mem implements Db_provider_mkr {
private boolean create;
public Db_provider Load_or_make_(Io_url db_url, Bool_obj_ref create_ref) {create_ref.Val_(create); return null;}
public static Db_provider_mkr_mem create_(boolean create) {
Db_provider_mkr_mem rv = new Db_provider_mkr_mem();
rv.create = create;
return rv;
}
}

View File

@ -1,25 +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_provider_mkr_ {
public static final Db_provider_mkr
Sqlite = Db_provider_mkr_sqlite._
, Mem_create_y = Db_provider_mkr_mem.create_(Bool_.Y)
, Mem_create_n = Db_provider_mkr_mem.create_(Bool_.N)
;
}

View File

@ -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.*;
public class Db_provider_pool {
private final OrderedHash hash = OrderedHash_.new_();
public Db_provider Get_or_new(Db_conn_info connectInfo) {return Get_or_new(connectInfo.Str_raw());}
public Db_provider Get_or_new(String raw) {
Db_provider rv = (Db_provider)hash.Fetch(raw);
if (rv == null) {
rv = Db_provider_.new_and_open_(Db_conn_info_.parse_(raw));
hash.Add(raw, rv);
}
return rv;
}
public void Del(Db_conn_info connectInfo) {hash.Del(connectInfo.Str_raw());}
public void Clear() {
int len = hash.Count();
for (int i = 0; i < len; i++) {
Db_provider provider = (Db_provider)hash.FetchAt(0);
provider.Conn_term();
}
hash.Clear();
}
public static final Db_provider_pool _ = new Db_provider_pool(); Db_provider_pool() {}
}

View File

@ -1,30 +0,0 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.dbs; import gplx.*;
public interface Db_rdr {
boolean Move_next();
byte[] Read_bry(int i);
byte[] Read_bry_by_str(int i);
String Read_str(int i);
byte Read_byte(int i);
int Read_int(int i);
long Read_long(int i);
float Read_float(int i);
double Read_double(int i);
void Close();
}

View File

@ -1,33 +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_rdr_ {
public static final Db_rdr Null = new Db_rdr__null();
}
class Db_rdr__null implements Db_rdr {
public boolean Move_next() {return false;}
public byte[] Read_bry(int i) {return Bry_.Empty;}
public byte[] Read_bry_by_str(int i) {return Bry_.Empty;}
public byte Read_byte(int i) {return Byte_.MaxValue_127;}
public String Read_str(int i) {return String_.Empty;}
public int Read_int(int i) {return Int_.MinValue;}
public long Read_long(int i) {return Long_.MinValue;}
public float Read_float(int i) {return Float_.NaN;}
public double Read_double(int i) {return Double_.NaN;}
public void Close() {}
}

View File

@ -1,37 +0,0 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.dbs; import gplx.*;
import java.sql.ResultSet;
class Db_rdr__basic implements Db_rdr {
private final ResultSet rdr;
public Db_rdr__basic(ResultSet rdr, String sql) {this.rdr = rdr; this.sql = sql;}
public String Sql() {return sql;} private final String sql;
public boolean Move_next() {
try {return rdr.next();}
catch (Exception e) {throw Err_.new_fmt_("move_next failed; check column casting error in SQL: err={0} sql={1}", Err_.Message_lang(e), sql);}
}
public byte[] Read_bry(int i) {try {return rdr.getBytes(i + 1);} catch (Exception e) {throw Err_.new_("read failed: i={0} type={1} err={2}", i, Bry_.Cls_name, Err_.Message_lang(e));}}
public byte[] Read_bry_by_str(int i) {try {return Bry_.new_utf8_(rdr.getString(i + 1));} catch (Exception e) {throw Err_.new_("read failed: i={0} type={1} err={2}", i, String_.Cls_name, Err_.Message_lang(e));}}
public String Read_str(int i) {try {return rdr.getString(i + 1);} catch (Exception e) {throw Err_.new_("read failed: i={0} type={1} err={2}", i, String_.Cls_name, Err_.Message_lang(e));}}
public int Read_int(int i) {try {return rdr.getInt(i + 1);} catch (Exception e) {throw Err_.new_("read failed: i={0} type={1} err={2}", i, Int_.Cls_name, Err_.Message_lang(e));}}
public long Read_long(int i) {try {return rdr.getLong(i + 1);} catch (Exception e) {throw Err_.new_("read failed: i={0} type={1} err={2}", i, Long_.Cls_name, Err_.Message_lang(e));}}
public float Read_float(int i) {try {return rdr.getFloat(i + 1);} catch (Exception e) {throw Err_.new_("read failed: i={0} type={1} err={2}", i, Float_.Cls_name, Err_.Message_lang(e));}}
public double Read_double(int i) {try {return rdr.getDouble(i + 1);} catch (Exception e) {throw Err_.new_("read failed: i={0} type={1} err={2}", i, Double_.Cls_name, Err_.Message_lang(e));}}
public byte Read_byte(int i) {try {return rdr.getByte(i + 1);} catch (Exception e) {throw Err_.new_("read failed: i={0} type={1} err={2}", i, Byte_.Cls_name, Err_.Message_lang(e));}}
public void Close() {try {rdr.close();} catch (Exception e) {throw Err_.new_("close failed: err={0}", Err_.Message_lang(e));}}
}

View File

@ -1,32 +0,0 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.dbs; import gplx.*;
import gplx.criterias.*;
interface Sql_cmd_wtr {
String XtoSqlQry(Db_qry qry, boolean prepare);
String XtoSql_insert(Db_qry_insert qry);
String XtoSql_delete(Db_qry_delete qry);
String XtoSql_update(Db_qry_update qry);
String XtoSql_select(Db_qry_select qry);
void BldWhere(String_bldr sb, Criteria crt);
void BldValStr(String_bldr sb, Db_arg prm);
}
class Sql_cmd_wtr_ {
public static final Sql_cmd_wtr Ansi = Sql_cmd_wtr_ansi_.default_();
public static final Sql_cmd_wtr BackslashSensitive = Sql_cmd_wtr_ansi_.backslash_sensitive_();
}

View File

@ -1,288 +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.criterias.*; /*Criteria_bool_base*/
class Sql_cmd_wtr_ansi implements Sql_cmd_wtr {
boolean prepare = false;
public String XtoSqlQry(Db_qry cmd, boolean prepare) {
String key = cmd.KeyOfDb_qry(); this.prepare = prepare;
if (String_.Eq(key, Db_qry_insert.KeyConst)) return XtoSql_insert((Db_qry_insert)cmd);
else if (String_.Eq(key, Db_qry_delete.KeyConst)) return XtoSql_delete((Db_qry_delete)cmd);
else if (String_.Eq(key, Db_qry_update.KeyConst)) return XtoSql_update((Db_qry_update)cmd);
else if (String_.Eq(key, Db_qry_select.KeyConst)) return XtoSql_select((Db_qry_select)cmd);
else if (String_.Eq(key, Db_qry_sql.KeyConst)) return ((Db_qry_sql)cmd).XtoSql();
else throw Err_.unhandled(cmd.KeyOfDb_qry());
}
public String XtoSql_delete(Db_qry_delete cmd) {
String_bldr sb = String_bldr_.new_();
sb.Add_many("DELETE FROM ", cmd.BaseTable());
BldWhere(sb, cmd.Where());
return sb.XtoStr();
}
public String XtoSql_insert(Db_qry_insert cmd) {
String_bldr sb = String_bldr_.new_();
if (cmd.Select() != null) {
sb.Add_many("INSERT INTO ", cmd.BaseTable(), " (");
for (int i = 0; i < cmd.Cols().Count(); i++) {
Sql_select_fld_base fld = cmd.Cols().FetchAt(i);
sb.Add(fld.Alias());
sb.Add(i == cmd.Cols().Count() - 1 ? ") " : ", ");
}
sb.Add(XtoSql_select(cmd.Select()));
return sb.XtoStr();
}
int argCount = cmd.Args().Count();
if (argCount == 0) throw Err_.new_("Db_qry_insert has no columns").Add("baseTable", cmd.BaseTable());
int last = argCount - 1;
sb.Add_many("INSERT INTO ", cmd.BaseTable(), " (");
for (int i = 0; i < argCount; i++) {
KeyVal pair = cmd.Args().FetchAt(i);
this.XtoSqlCol(sb, pair.Key_as_obj());
sb.Add(i == last ? ")" : ", ");
}
sb.Add(" VALUES (");
for (int i = 0; i < argCount; i++) {
KeyVal pair = cmd.Args().FetchAt(i);
Db_arg prm = (Db_arg)pair.Val();
this.BldValStr(sb, prm);
sb.Add(i == last ? ")" : ", ");
}
return sb.XtoStr();
}
public String XtoSql_update(Db_qry_update cmd) {
int argCount = cmd.Args().Count();
if (argCount == 0) throw Err_.new_("Db_qry_update has no columns").Add("baseTable", cmd.BaseTable());
String_bldr sb = String_bldr_.new_();
sb.Add_many("UPDATE ", cmd.BaseTable(), " SET ");
for (int i = 0; i < argCount; i++) {
KeyVal pair = cmd.Args().FetchAt(i);
if (i > 0) sb.Add(", ");
this.XtoSqlCol(sb, pair.Key_as_obj());
sb.Add("=");
this.BldValStr(sb, (Db_arg)pair.Val());
}
BldWhere(sb, cmd.Where());
return sb.XtoStr();
}
public String XtoSql_select(Db_qry_select cmd) {
String_bldr sb = String_bldr_.new_();
sb.Add("SELECT ");
if (cmd.Cols().Distinct()) sb.Add("DISTINCT ");
Sql_select_fld_list flds = cmd.Cols().Flds();
if (flds.Count() == 0) sb.Add("*");
for (int i = 0; i < flds.Count(); i++) {
Sql_select_fld_base fld = (Sql_select_fld_base)flds.FetchAt(i);
if (i > 0) sb.Add(", ");
this.XtoSqlCol(sb, fld.XtoSql());
}
XtoSql_from(sb, cmd.From());
BldWhere(sb, cmd.Where());
XtoSql_group_by(sb, cmd.GroupBy());
XtoSql_order_by(sb, cmd.OrderBy());
XtoSql_limit(sb, cmd.Limit());
return sb.XtoStr();
}
void XtoSql_group_by(String_bldr sb, Sql_group_by groupBy) {
if (groupBy == null) return;
sb.Add(" GROUP BY ");
for (int i = 0; i < groupBy.Flds().Count(); i++) {
String item = (String)groupBy.Flds().FetchAt(i);
if (i > 0) sb.Add(", ");
sb.Add(item);
}
}
void XtoSql_order_by(String_bldr sb, Sql_order_by orderBy) {
if (orderBy == null) return;
sb.Add(" ORDER BY ");
for (int i = 0; i < orderBy.Flds().Count(); i++) {
Sql_order_by_itm item = (Sql_order_by_itm)orderBy.Flds().FetchAt(i);
if (i > 0) sb.Add(", ");
sb.Add(item.XtoSql());
}
}
void XtoSql_limit(String_bldr sb, int limit) {
if (limit == Db_qry_select.Limit_disabled) return;
sb.Add(" LIMIT ").Add(limit);
}
void XtoSql_from(String_bldr sb, Sql_from from) {
for (Object tblObj : from.Tbls()) {
Sql_tbl_src tbl = (Sql_tbl_src)tblObj;
sb.Add_many
( " ", String_.Upper(tbl.JoinType().Name()), " ", tbl.TblName(), String_.FormatOrEmptyStrIfNull(" {0}", tbl.Alias())
);
String tblAliasForJoin = tbl.Alias() == null ? tbl.TblName() : tbl.Alias();
for (int i = 0; i < tbl.JoinLinks().Count(); i++) {
Sql_join_itm joinLink = (Sql_join_itm)tbl.JoinLinks().FetchAt(i);
String conjunction = i == 0 ? " ON " : " AND ";
sb.Add_many
( conjunction, joinLink.SrcTbl(), ".", joinLink.SrcFld(), "=", tblAliasForJoin, ".", joinLink.TrgFldOrSrcFld()
);
}
}
}
public void XtoSqlCol(String_bldr sb, Object obj) {
if (obj == null) throw Err_.null_("ColName");
sb.Add_obj(obj); // FIXME: options for bracketing; ex: [name]
}
public void BldValStr(String_bldr sb, Db_arg prm) {
if (prepare) {
sb.Add("?");
return;
}
Object val = prm.Val();
if (val == null) {
sb.Add("NULL");
return;
}
Class<?> valType = val.getClass();
if (valType == Boolean.class)
sb.Add_obj(Bool_.Xto_int(Bool_.cast_(val))); // NOTE!: save boolean to 0 or 1, b/c (a) db may not support bit datatype (sqllite) and (b) avoid i18n issues with "true"/"false"
else if
( valType == Byte.class || valType == Short.class
|| valType == Integer.class || valType == Long.class
|| valType == Float.class || valType == Double.class
)
sb.Add(Object_.Xto_str_strict_or_null(val));
else if (valType == DateAdp.class)
XtoSqlVal_DateAdp(sb, prm, (DateAdp)val);
else if (valType == DecimalAdp.class) {
DecimalAdp valDecimal = (DecimalAdp)val;
sb.Add(valDecimal.Xto_str());
}
// else if (valType == System.Enum.class)
// sb.Add_any(Enm_.XtoInt(val)); // save enum as 0 or 1, since (a) no db supports enum datatype; (b) names are fungible; (c) int is less space than name
else {
String valString = Object_.Xto_str_strict_or_null(val);
XtoSqlVal_Str(sb, prm, valString);
}
}
@gplx.Virtual public void XtoSqlVal_Str(String_bldr sb, Db_arg prm, String s) {
sb.Add_many("'", String_.Replace(s, "'", "''"), "'"); // stupid escaping of '
}
@gplx.Virtual public void XtoSqlVal_DateAdp(String_bldr sb, Db_arg prm, DateAdp s) {
sb.Add_many("'", s.XtoStr_gplx_long(), "'"); // stupid escaping of '
}
void BldWhere(String_bldr sb, Sql_where where) {
if (where == null || where.Crt() == Db_crt_.Wildcard) return;
sb.Add(" WHERE ");
this.BldWhere(sb, where.Crt());
}
public void BldWhere(String_bldr sb, Criteria crt) {
Criteria_bool_base boolOp = Criteria_bool_base.as_(crt);
if (boolOp != null) {
sb.Add("(");
BldWhere(sb, boolOp.Lhs());
sb.Add_many(" ", boolOp.OpLiteral(), " ");
BldWhere(sb, boolOp.Rhs());
sb.Add(")");
return;
}
if (crt.Crt_tid() == Criteria_.Tid_db_obj_ary) {
Append_db_obj_ary(sb, (Db_obj_ary_crt)crt);
}
else {
Criteria_wrapper leaf = Criteria_wrapper.as_(crt); if (leaf == null) throw Err_.invalid_op_(crt.XtoStr());
sb.Add(leaf.Name_of_GfoFldCrt());
AppendWhereItem(sb, leaf.Crt_of_GfoFldCrt());
}
}
void AppendWhereItem(String_bldr sb, Criteria crt) {
switch (crt.Crt_tid()) {
case Criteria_.Tid_eq: AppendEqual(sb, Criteria_eq.as_(crt)); break;
case Criteria_.Tid_comp: AppendCompare(sb, Criteria_comp.as_(crt)); break;
case Criteria_.Tid_between: AppendBetween(sb, Criteria_between.as_(crt)); break;
case Criteria_.Tid_in: AppendIn(sb, Criteria_in.as_(crt)); break;
case Criteria_.Tid_like: AppendLike(sb, Criteria_like.as_(crt)); break;
case Criteria_.Tid_iomatch: AppendIoMatch(sb, Criteria_ioMatch.as_(crt)); break;
default: throw Err_.unhandled(crt);
}
}
void AppendEqual(String_bldr sb, Criteria_eq crt) {
sb.Add(crt.Negated() ? "!=" : "=");
this.BldValStr(sb, Wrap(crt.Value()));
}
void AppendCompare(String_bldr sb, Criteria_comp crt) {
sb.Add_many(crt.XtoSymbol());
this.BldValStr(sb, Wrap(crt.Value()));
}
void AppendBetween(String_bldr sb, Criteria_between crt) {
sb.Add(crt.Negated() ? " NOT BETWEEN " : " BETWEEN ");
this.BldValStr(sb, Wrap(crt.Lhs()));
sb.Add(" AND ");
this.BldValStr(sb, Wrap(crt.Rhs()));
}
void AppendLike(String_bldr sb, Criteria_like crt) {
sb.Add(crt.Negated() ? " NOT LIKE " : " LIKE ");
this.BldValStr(sb, Wrap(crt.Pattern().Raw()));
sb.Add_fmt(" ESCAPE '{0}'", crt.Pattern().Escape());
}
void AppendIn(String_bldr sb, Criteria_in crt) {
sb.Add(crt.Negated() ? " NOT IN (" : " IN (");
int last = crt.Values().length - 1;
for (int i = 0; i < crt.Values().length; i++) {
Object val = crt.Values()[i];
this.BldValStr(sb, Wrap(val));
sb.Add(i == last ? ")" : ", ");
}
}
void AppendIoMatch(String_bldr sb, Criteria_ioMatch crt) {
sb.Add(crt.Negated() ? " NOT IOMATCH " : " IOMATCH ");
this.BldValStr(sb, Wrap(crt.Pattern().Raw()));
}
public void Append_db_obj_ary(String_bldr sb, Db_obj_ary_crt crt) {
Object[][] ary = crt.Vals();
int ary_len = ary.length;
Db_fld[] flds = crt.Flds();
for (int i = 0; i < ary_len; i++) {
Object[] itm = (Object[])ary[i];
int itm_len = itm.length;
if (i != 0) sb.Add(" OR ");
sb.Add("(");
for (int j = 0; j < itm_len; j++) {
if (j != 0) sb.Add(" AND ");
Db_fld fld = flds[j];
Object val = itm[j];
boolean quote = false;
switch (fld.Type_tid()) {
case ClassAdp_.Tid_str:
case ClassAdp_.Tid_char:
case ClassAdp_.Tid_date:
quote = true;
break;
}
sb.Add(fld.Name());
sb.Add("=");
if (quote) sb.Add("'");
sb.Add(Object_.Xto_str_strict_or_empty(val));
if (quote) sb.Add("'");
}
sb.Add(")");
}
}
Db_arg Wrap(Object val) {return new Db_arg("unknown", val);}
}
class Sql_cmd_wtr_ansi_ {
public static Sql_cmd_wtr default_() {return new Sql_cmd_wtr_ansi();}
public static Sql_cmd_wtr backslash_sensitive_() {return Sql_cmd_wtr_ansi_backslashSensitive.new_();}
}
class Sql_cmd_wtr_ansi_backslashSensitive extends Sql_cmd_wtr_ansi { @Override public void XtoSqlVal_Str(String_bldr sb, Db_arg prm, String s) {
if (String_.Has(s, "\\")) s = String_.Replace(s, "\\", "\\\\");
super.XtoSqlVal_Str(sb, prm, s);
}
public static Sql_cmd_wtr_ansi_backslashSensitive new_() {return new Sql_cmd_wtr_ansi_backslashSensitive();} Sql_cmd_wtr_ansi_backslashSensitive() {}
}

View File

@ -1,67 +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 Sql_join_itm {
public String SrcTbl() {return srcTbl;} public Sql_join_itm SrcTbl_(String v) {srcTbl = v; return this;} private String srcTbl;
public String SrcFld() {return srcFld;} public Sql_join_itm SrcFld_(String v) {srcFld = v; return this;} private String srcFld;
public String TrgFld() {return trgFld;} public Sql_join_itm TrgFld_(String v) {trgFld = v; return this;} private String trgFld;
public String TrgFldOrSrcFld() {return trgFld == null ? srcFld : trgFld;}
public static Sql_join_itm new_(String trgFld, String srcTbl, String srcFld) {
Sql_join_itm rv = new Sql_join_itm();
rv.trgFld = trgFld; rv.srcTbl = srcTbl; rv.srcFld = srcFld;
return rv;
} Sql_join_itm() {}
public static Sql_join_itm same_(String tbl, String fld) {
Sql_join_itm rv = new Sql_join_itm();
rv.trgFld = fld; rv.srcTbl = tbl; rv.srcFld = fld;
return rv;
}
}
class Sql_from {
public ListAdp Tbls() {return tbls;} ListAdp tbls = ListAdp_.new_();
public Sql_tbl_src BaseTable() {return (Sql_tbl_src)tbls.FetchAt(0);}
public static Sql_from new_(Sql_tbl_src baseTable) {
Sql_from rv = new Sql_from();
rv.tbls.Add(baseTable);
return rv;
} Sql_from() {}
}
class Sql_tbl_src {
public Sql_join_itmType JoinType() {return type;} public Sql_tbl_src JoinType_(Sql_join_itmType v) {this.type = v; return this;} Sql_join_itmType type = Sql_join_itmType.Inner;
public ListAdp JoinLinks() {return joinLinks;} ListAdp joinLinks = ListAdp_.new_();
public String TblName() {return tblName;} public Sql_tbl_src TblName_(String s) {tblName = s; return this;} private String tblName;
public String Alias() {return alias;} public Sql_tbl_src Alias_(String s) {alias = s; return this;} private String alias;
public void XtoSql(String_bldr sb) {
sb.Add_many(tblName, alias == null ? "" : " " + alias);
}
public static Sql_tbl_src new_() {return new Sql_tbl_src();} Sql_tbl_src() {}
}
class Sql_join_itmType {
public int Val() {return val;} int val;
public String Name() {return name;} private String name;
Sql_join_itmType(int v, String name) {this.val = v; this.name = name;}
public static final Sql_join_itmType
From = new Sql_join_itmType(0, "FROM")
, Inner = new Sql_join_itmType(1, "INNER JOIN")
, Left = new Sql_join_itmType(2, "LEFT JOIN")
, Right = new Sql_join_itmType(3, "RIGHT JOIN")
, Outer = new Sql_join_itmType(4, "OUTER JOIN")
, Cross = new Sql_join_itmType(5, "CROSS JOIN")
;
}

View File

@ -1,73 +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.lists.*; /*ComparerAble*/
class Sql_order_by {
public ListAdp Flds() {return flds;} ListAdp flds = ListAdp_.new_();
public static Sql_order_by new_(Sql_order_by_itm... ary) {
Sql_order_by rv = new Sql_order_by();
for (Sql_order_by_itm itm : ary)
rv.flds.Add(itm);
return rv;
} Sql_order_by() {}
}
class Sql_group_by {
public ListAdp Flds() {return flds;} ListAdp flds = ListAdp_.new_();
public static Sql_group_by new_(String... ary) {
Sql_group_by rv = new Sql_group_by();
for (String itm : ary)
rv.flds.Add(itm);
return rv;
} Sql_group_by() {}
}
class Sql_order_by_itm {
public String Name() {return name;} private String name;
public boolean Ascending() {return ascending;} private boolean ascending;
public String XtoSql() {
String ascString = ascending ? "" : " DESC";
return name + ascString;
}
public static Sql_order_by_itm new_(String name, boolean ascending) {
Sql_order_by_itm rv = new Sql_order_by_itm();
rv.name = name; rv.ascending = ascending;
return rv;
} Sql_order_by_itm() {}
}
class Sql_order_by_sorter implements ComparerAble {
public int compare(Object lhsObj, Object rhsObj) {
GfoNde lhs = (GfoNde)lhsObj; GfoNde rhs = (GfoNde)rhsObj;
Sql_order_by_itm item = null; Object lhsData = null, rhsData = null;
for (int i = 0; i < items.length; i++) {
item = items[i];
lhsData = lhs.Read(item.Name()); rhsData = rhs.Read(item.Name());
int compare = CompareAble_.Compare_obj(lhsData, rhsData);
if (compare == CompareAble_.Same) continue;
int ascendingVal = item.Ascending() ? 1 : -1;
return compare * ascendingVal;
}
return CompareAble_.Same;
}
Sql_order_by_itm[] items;
public static ComparerAble new_(Sql_order_by_itm[] items) {
Sql_order_by_sorter rv = new Sql_order_by_sorter();
rv.items = items;
return rv;
}
}

View File

@ -1,143 +0,0 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.dbs; import gplx.*;
class Sql_select {
public Sql_select_fld_list Flds() {return flds;} Sql_select_fld_list flds = Sql_select_fld_list.new_();
public boolean Distinct() {return distinct;} public void Distinct_set(boolean v) {distinct = v;} private boolean distinct;
public void Add(String fldName) {flds.Add(Sql_select_fld_fld.new_(Sql_select_fld_base.Tbl_null, fldName, fldName));}
public void Add(String fldName, String alias) {flds.Add(Sql_select_fld_fld.new_(Sql_select_fld_base.Tbl_null, fldName, alias));}
public void Add(Sql_select_fld_base fld) {flds.Add(fld);}
public static final Sql_select All = all_(); static Sql_select all_() {Sql_select rv = new_(); rv.Add(Sql_select_fld_wild._); return rv;}
public static Sql_select new_() {return new Sql_select();} Sql_select() {}
}
class Sql_select_fld_list {
public int Count() {return hash.Count();}
public void Add(Sql_select_fld_base fld) {hash.Add(fld.Alias(), fld);}
public Sql_select_fld_base FetchAt(int i) {return (Sql_select_fld_base)hash.FetchAt(i);}
public Sql_select_fld_base FetchOrNull(String k) {return (Sql_select_fld_base)hash.Fetch(k);}
public GfoFldList XtoGfoFldLst(TdbTable tbl) {
GfoFldList rv = GfoFldList_.new_();
for (int i = 0; i < this.Count(); i++) {
Sql_select_fld_base selectFld = this.FetchAt(i);
GfoFld fld = tbl.Flds().FetchOrNull(selectFld.Fld());
if (fld == null) throw Err_.new_("fld not found in tbl").Add("fldName", selectFld.Fld()).Add("tblName", tbl.Name()).Add("tblFlds", tbl.Flds().XtoStr());
if (rv.Has(selectFld.Alias())) throw Err_.new_("alias is not unique").Add("fldName", selectFld.Fld()).Add("flds", rv.XtoStr());
selectFld.GroupBy_type(fld);
rv.Add(selectFld.Alias(), selectFld.ValType());
}
return rv;
}
public String XtoStr() {
String_bldr sb = String_bldr_.new_();
for (int i = 0; i < this.Count(); i++) {
Sql_select_fld_base fld = this.FetchAt(i);
sb.Add_fmt("{0},{1}|", fld.Fld(), fld.Alias());
}
return sb.XtoStr();
}
OrderedHash hash = OrderedHash_.new_();
public static Sql_select_fld_list new_() {return new Sql_select_fld_list();} Sql_select_fld_list() {}
}
abstract class Sql_select_fld_base {
public String Tbl() {return tbl;} public void Tbl_set(String val) {tbl = val;} private String tbl;
public String Fld() {return fld;} public void Fld_set(String val) {fld = val;} private String fld;
public String Alias() {return alias;} public void Alias_set(String val) {alias = val;} private String alias;
public ClassXtn ValType() {return valType;} public void ValType_set(ClassXtn val) {valType = val;} ClassXtn valType = ObjectClassXtn._;
public abstract Object GroupBy_eval(Object groupByVal, Object curVal, ClassXtn type);
@gplx.Virtual public void GroupBy_type(GfoFld fld) {this.ValType_set(fld.Type());}
@gplx.Virtual public boolean Type_fld() {return true;}
public abstract String XtoSql();
public static final String Tbl_null = null;
@gplx.Internal protected void ctor_(String tbl, String fld, String alias) {
Tbl_set(tbl); Fld_set(fld); Alias_set(alias);
}
}
class Sql_select_fld_wild extends Sql_select_fld_base {
@Override public Object GroupBy_eval(Object groupByVal, Object curVal, ClassXtn type) {throw Err_.new_("group by eval not allowed on *");}
@Override public void GroupBy_type(GfoFld fld) {throw Err_.new_("group by type not allowed on *");}
@Override public String XtoSql() {return "*";}
public static final Sql_select_fld_wild _ = new Sql_select_fld_wild(); Sql_select_fld_wild() {this.ctor_(Tbl_null, "*", "*");}
}
class Sql_select_fld_fld extends Sql_select_fld_base {
@Override public Object GroupBy_eval(Object groupByVal, Object curVal, ClassXtn type) {return curVal;}
@Override public void GroupBy_type(GfoFld fld) {this.ValType_set(fld.Type());}
@Override public String XtoSql() {
String rv = Fld();
if (Tbl() != Tbl_null)
rv = Tbl() + "." + Fld();
if (!String_.Eq(Alias(), Fld()))
rv = rv + " AS " + Alias();
return rv;
}
public static Sql_select_fld_fld new_(String tbl, String fld, String alias) {
Sql_select_fld_fld rv = new Sql_select_fld_fld();
rv.ctor_(tbl, fld, alias);
return rv;
} Sql_select_fld_fld() {}
}
abstract class Sql_select_fld_func_base extends Sql_select_fld_base {
public abstract String XtoSql_functionName();
@Override public boolean Type_fld() {return false;}
@Override public String XtoSql() {
return String_.Format("{0}({1}) AS {2}", XtoSql_functionName(), Fld(), Alias());
}
}
class Sql_select_fld_count extends Sql_select_fld_func_base {
@Override public String XtoSql_functionName() {return "COUNT";}
@Override public void GroupBy_type(GfoFld fld) {this.ValType_set(IntClassXtn._);}
@Override public Object GroupBy_eval(Object groupByVal, Object curVal, ClassXtn type) {
if (groupByVal == null) return 1;
return Int_.cast_(groupByVal) + 1;
}
public static Sql_select_fld_count new_(String tbl, String fld, String alias) {
Sql_select_fld_count rv = new Sql_select_fld_count();
rv.ctor_(tbl, fld, alias);
return rv;
} Sql_select_fld_count() {}
}
class Sql_select_fld_sum extends Sql_select_fld_func_base {
@Override public String XtoSql_functionName() {return "SUM";}
@Override public void GroupBy_type(GfoFld fld) {this.ValType_set(IntClassXtn._);}
@Override public Object GroupBy_eval(Object groupByVal, Object curVal, ClassXtn type) {
if (groupByVal == null) return Int_.cast_(curVal);
return Int_.cast_(groupByVal) + Int_.cast_(curVal);
}
public static Sql_select_fld_sum new_(String tbl, String fld, String alias) {
Sql_select_fld_sum rv = new Sql_select_fld_sum();
rv.ctor_(tbl, fld, alias);
return rv;
} Sql_select_fld_sum() {}
}
class Sql_select_fld_minMax extends Sql_select_fld_func_base {
int compareType = CompareAble_.Less;
@Override public String XtoSql_functionName() {return compareType == CompareAble_.Less ? "MIN" : "MAX";}
@Override public Object GroupBy_eval(Object groupByVal, Object curVal, ClassXtn type) {
if (groupByVal == null) return curVal;
int compareVal = CompareAble_.Compare_obj(curVal, groupByVal);
return compareVal * compareType > 0 ? curVal : groupByVal;
}
public static Sql_select_fld_minMax min_(String tbl, String fld, String alias) {return new_(CompareAble_.Less, tbl, fld, alias);}
public static Sql_select_fld_minMax max_(String tbl, String fld, String alias) {return new_(CompareAble_.More, tbl, fld, alias);}
static Sql_select_fld_minMax new_(int compareType, String tbl, String fld, String alias) {
Sql_select_fld_minMax rv = new Sql_select_fld_minMax();
rv.compareType = compareType;
rv.ctor_(tbl, fld, alias);
return rv;
} Sql_select_fld_minMax() {}
}

View File

@ -1,32 +0,0 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.dbs; import gplx.*;
import gplx.criterias.*;
class Sql_where {
public Criteria Crt() {return crt;} Criteria crt;
public static Sql_where merge_or_new_(Sql_where where, Criteria crt) {
return where == null
? Sql_where.new_(crt)
: Sql_where.new_(Criteria_.And(where.Crt(), crt));
}
public static Sql_where new_(Criteria crt) {
Sql_where rv = new Sql_where();
rv.crt = crt;
return rv;
} Sql_where() {}
}

View File

@ -1,37 +0,0 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.dbs; import gplx.*;
import org.junit.*;
public class AnsiValWtr_tst {
@Test public void BldValStr() {
tst_XtoSqlVal(null, "NULL");
tst_XtoSqlVal(true, "1");
tst_XtoSqlVal(false, "0");
tst_XtoSqlVal(1, "1");
tst_XtoSqlVal(1.1, "1.1");
tst_XtoSqlVal("a", "'a'");
tst_XtoSqlVal("a'b", "'a''b'");
}
void tst_XtoSqlVal(Object val, String expd) {
String_bldr sb = String_bldr_.new_();
Db_arg prm = new Db_arg("not needed", val);
valWtr.BldValStr(sb, prm);
Tfds.Eq(expd, sb.XtoStr());
}
Sql_cmd_wtr valWtr = Sql_cmd_wtr_ansi_.default_();
}

View File

@ -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; import gplx.*;
public class Db_provider_fxt implements RlsAble {
public Db_provider Provider() {return provider;} public Db_provider_fxt Provider_(Db_provider v) {provider = v; return this;} Db_provider provider;
public void DmlAffectedAvailable_(boolean v) {dmlAffectedAvailable = v;} private boolean dmlAffectedAvailable = true;
public void ini_DeleteAll(String tbl) {provider.Exec_qry(Db_qry_.delete_tbl_(tbl));}
public void tst_ExecDml(int expd, Db_qry qry) {
int actl = provider.Exec_qry(qry);
if (dmlAffectedAvailable)
Tfds.Eq(expd, actl, "Exec_qry failed: sql={0}", qry.XtoSql());
}
public void tst_ExecRdrTbl(int expd, String tblName) {tst_ExecRdr(expd, Db_qry_.select_tbl_(tblName));}
public void tst_ExecRdr(int expd, Db_qry qry) {
DataRdr rdr = DataRdr_.Null;
try {
rdr = provider.Exec_qry_as_rdr(qry);
tbl = GfoNde_.rdr_(rdr);
}
catch (Exception e) {Err_.Noop(e); rdr.Rls();}
Tfds.Eq(expd, tbl.Subs().Count(), "Exec_qry_as_rdr failed: sql={0}", qry.XtoSql());
} GfoNde tbl;
public GfoNde tst_RowAry(int index, Object... expdValAry) {
GfoNde record = tbl.Subs().FetchAt_asGfoNde(index);
Object[] actlValAry = new Object[expdValAry.length];
for (int i = 0; i < actlValAry.length; i++)
actlValAry[i] = record.ReadAt(i);
Tfds.Eq_ary(actlValAry, expdValAry);
return record;
}
public void Rls() {provider.Conn_term();}
public static Db_provider Mysql() {return Db_provider_.new_and_open_(Db_conn_info__mysql.new_("127.0.0.1", "unit_tests", "gplx_user", "gplx_password"));}
public static Db_provider Tdb(String fileName) {return Db_provider_.new_and_open_(Db_conn_info_.tdb_(Tfds.RscDir.GenSubDir_nest("140_dbs", "tdbs").GenSubFil(fileName)));}
public static Db_provider Postgres() {return Db_provider_.new_and_open_(Db_conn_info__postgres.new_("127.0.0.1", "unit_tests", "gplx_user", "gplx_password"));}
public static Db_provider Sqlite() {return Db_provider_.new_and_open_(Db_conn_info__sqlite.load_(Tfds.RscDir.GenSubFil_nest("140_dbs", "sqlite", "unit_tests.db")));}
// public static Db_provider Mssql() {return MssqlConnectUrl.WindowsAuth(".", "unit_tests");
public static final boolean SkipPostgres = Tfds.SkipDb || true;
}

View File

@ -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.*;
import org.junit.*;
import gplx.criterias.*;
public class Sql_cmd_wtr_ansi_tst {
Sql_cmd_wtr whereWtr = Sql_cmd_wtr_ansi_.default_();
@Test public void Basic() {
tst_XtoSql_where(Db_crt_.eq_("id", 1), "id=1");
tst_XtoSql_where(Db_crt_.eqn_("id", 1), "id!=1");
tst_XtoSql_where(Db_crt_.mt_("id", 1), "id>1");
tst_XtoSql_where(Db_crt_.mte_("id", 1), "id>=1");
tst_XtoSql_where(Db_crt_.lt_("id", 1), "id<1");
tst_XtoSql_where(Db_crt_.lte_("id", 1), "id<=1");
tst_XtoSql_where(Db_crt_.between_("id", 1, 2), "id BETWEEN 1 AND 2");
tst_XtoSql_where(Db_crt_.in_("id", 1, 2, 3), "id IN (1, 2, 3)");
}
@Test public void AndOr() {
tst_XtoSql_where(Criteria_.And(Db_crt_.eq_("id", 1), Db_crt_.eq_("name", "me")), "(id=1 AND name='me')");
tst_XtoSql_where(Criteria_.Or(Db_crt_.eq_("id", 1), Db_crt_.eq_("name", "me")), "(id=1 OR name='me')");
tst_XtoSql_where(Criteria_.Or(Db_crt_.eq_("id", 1), Criteria_.And(Db_crt_.eq_("name", "me"), Db_crt_.eq_("id", 1))), "(id=1 OR (name='me' AND id=1))");
}
void tst_XtoSql_where(Criteria crt, String expd) {
String_bldr sb = String_bldr_.new_();
whereWtr.BldWhere(sb, crt);
Tfds.Eq(expd, sb.XtoStr());
}
}

View File

@ -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.xowa.files.wiki_orig; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*;
public class Xof_wiki_orig_itm {
public int Id() {return id;} public Xof_wiki_orig_itm Id_(int v) {id = v; return this;} private int id;
public byte[] Ttl() {return ttl;} public Xof_wiki_orig_itm Ttl_(byte[] v) {ttl = v; return this;} private byte[] ttl;
public byte Status() {return status;} public Xof_wiki_orig_itm Status_(byte v) {status = v; return this;} private byte status;
public byte Orig_repo() {return orig_repo;} public Xof_wiki_orig_itm Orig_repo_(byte v) {orig_repo = v; return this;} private byte orig_repo;
public int Orig_w() {return orig_w;} public Xof_wiki_orig_itm Orig_w_(int v) {orig_w = v; return this;} private int orig_w;
public int Orig_h() {return orig_h;} public Xof_wiki_orig_itm Orig_h_(int v) {orig_h = v; return this;} private int orig_h;
public int Orig_ext() {return orig_ext;} public Xof_wiki_orig_itm Orig_ext_(int v) {orig_ext = v; return this;} private int orig_ext;
public byte[] Orig_redirect() {return orig_redirect;} public Xof_wiki_orig_itm Orig_redirect_(byte[] v) {orig_redirect = v; return this;} private byte[] orig_redirect;
public static Xof_wiki_orig_itm load_(DataRdr rdr) {
Xof_wiki_orig_itm rv = new Xof_wiki_orig_itm();
rv.ttl = rdr.ReadBryByStr(Xof_wiki_orig_tbl.Fld_orig_ttl);
rv.status = rdr.ReadByte(Xof_wiki_orig_tbl.Fld_status);
rv.orig_repo = rdr.ReadByte(Xof_wiki_orig_tbl.Fld_orig_repo);
rv.orig_w = rdr.ReadInt(Xof_wiki_orig_tbl.Fld_orig_w);
rv.orig_h = rdr.ReadInt(Xof_wiki_orig_tbl.Fld_orig_h);
rv.orig_ext = rdr.ReadInt(Xof_wiki_orig_tbl.Fld_orig_ext);
rv.orig_redirect = rdr.ReadBryByStr(Xof_wiki_orig_tbl.Fld_orig_redirect);
return rv;
}
public static final Xof_wiki_orig_itm Null = null;
}

View File

@ -1,25 +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.xowa.hdumps; import gplx.*; import gplx.xowa.*;
import gplx.dbs.*;
public class Db_provider_key {
public Db_provider_key(String key, Db_conn_info conn_info, GfoInvkAbleCmd init_cmd) {this.key = key; this.conn_info = conn_info; this.init_cmd = init_cmd;}
public String Key() {return key;} private final String key;
public Db_conn_info Conn_info() {return conn_info;} private Db_conn_info conn_info;
public GfoInvkAbleCmd Init_cmd() {return init_cmd;} private GfoInvkAbleCmd init_cmd;
}

View File

@ -1,70 +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.xowa.hdumps; import gplx.*; import gplx.xowa.*;
import gplx.dbs.*;
public class Db_provider_mkr {
private final HashAdp engine_regy = HashAdp_.new_();
public void Engines_add(Db_engine engine) {engine_regy.AddReplace(engine.Conn_info_tid(), engine);}
public Db_provider Get(Db_provider_key provider_key) {
Db_provider rv = Get_or_new(provider_key);
GfoInvkAbleCmd init_cmd = provider_key.Init_cmd();
if (init_cmd != GfoInvkAbleCmd.Null)
GfoInvkAble_.InvkCmd_val(init_cmd.InvkAble(), init_cmd.Cmd(), rv);
return rv;
}
private Db_provider Get_or_new(Db_provider_key key) {
Db_conn_info conn_info = key.Conn_info();
Db_engine prototype = (Db_engine)engine_regy.Fetch(conn_info.Key());
Db_engine engine = prototype.Make_new(conn_info);
engine.Conn_open(); // auto-open
return new Db_provider(engine);
}
}
class Mem_db_rdr implements Db_rdr {
private int idx = -1, len;
private Mem_db_row[] rows = new Mem_db_row[0];
private Mem_db_rdr(Mem_db_row[] rows) {
this.rows = rows;
this.len = rows.length;
}
public boolean Move_next() {return ++idx < len;}
public byte[] Read_bry(int i) {return (byte[])rows[idx].Get_at(i);}
public byte[] Read_bry_by_str(int i) {return Bry_.new_utf8_((String)rows[idx].Get_at(i));}
public String Read_str(int i) {return (String)rows[idx].Get_at(i);}
public byte Read_byte(int i) {return Byte_.cast_(rows[idx].Get_at(i));}
public int Read_int(int i) {return Int_.cast_(rows[idx].Get_at(i));}
public long Read_long(int i) {return Long_.cast_(rows[idx].Get_at(i));}
public float Read_float(int i) {return Float_.cast_(rows[idx].Get_at(i));}
public double Read_double(int i) {return Double_.cast_(rows[idx].Get_at(i));}
public void Close() {rows = null;}
public static Mem_db_rdr new_by_rows(Mem_db_row[] rows) {return new Mem_db_rdr(rows);}
public static Mem_db_rdr new_by_obj_ary(Object[][] obj_arys) {
int obj_arys_len = obj_arys.length;
Mem_db_row[] rows = new Mem_db_row[obj_arys_len];
for (int i = 0; i < obj_arys_len; ++i) {
Object[] obj_ary = obj_arys[i];
rows[i] = new Mem_db_row(obj_ary);
}
return new Mem_db_rdr(rows);
}
}
class Mem_db_row {
private Object[] vals;
public Mem_db_row(Object[] vals) {this.vals = vals;}
public Object Get_at(int i) {return vals[i];}
}

View File

@ -1,39 +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.xowa.hdumps; import gplx.*; import gplx.xowa.*;
import gplx.xowa.apps.fsys.*; import gplx.xowa.parsers.amps.*; import gplx.xowa.langs.cases.*; import gplx.intl.*;
public class Xoav_app {
public Xoav_app(Gfo_usr_dlg usr_dlg, Io_url root_dir, String plat_name) {
this.usr_dlg = usr_dlg;
this.fsys_mgr = new Xoa_fsys_mgr(root_dir, plat_name);
this.wiki_mgr = new Xoav_wiki_mgr(this, fsys_mgr.Wiki_dir(), utl_case_mgr);
this.db_mgr = new Db_provider_mkr();
this.utl_msg_log = Gfo_msg_log.Test();
db_mgr.Engines_add(gplx.dbs.Sqlite_engine_.New_engine());
}
public Xoa_fsys_mgr Fsys_mgr() {return fsys_mgr;} private Xoa_fsys_mgr fsys_mgr;
public Xoav_wiki_mgr Wiki_mgr() {return wiki_mgr;} private final Xoav_wiki_mgr wiki_mgr;
public Db_provider_mkr Db_mgr() {return db_mgr;} private Db_provider_mkr db_mgr;
public Gfo_usr_dlg Usr_dlg() {return usr_dlg;} private Gfo_usr_dlg usr_dlg;
public Bry_bfr_mkr Utl_bfr_mkr() {return utl_bfr_mkr;} private Bry_bfr_mkr utl_bfr_mkr = new Bry_bfr_mkr();
public Xop_amp_mgr Utl_amp_mgr() {return utl_amp_mgr;} private Xop_amp_mgr utl_amp_mgr = new Xop_amp_mgr();
public Xol_case_mgr Utl_case_mgr() {return utl_case_mgr;} private Xol_case_mgr utl_case_mgr = Xol_case_mgr_.Utf8();
public Url_encoder Utl_encoder_fsys() {return utl_encoder_fsys;} private Url_encoder utl_encoder_fsys = Url_encoder.new_fsys_lnx_();
public Gfo_msg_log Utl_msg_log() {return utl_msg_log;} private Gfo_msg_log utl_msg_log;
}

View File

@ -1,37 +0,0 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.hdumps; import gplx.*; import gplx.xowa.*;
import gplx.xowa.langs.cases.*;
public class Xoav_wiki_mgr {
private final Xoav_app app; private final OrderedHash hash = OrderedHash_.new_bry_();
private Io_url wiki_root_dir;
public Xoav_wiki_mgr(Xoav_app app, Io_url wiki_root_dir, Xol_case_mgr case_mgr) {this.app = app; this.wiki_root_dir = wiki_root_dir;}
public Xowv_wiki Get_by_domain(byte[] domain) {
Xowv_wiki rv = (Xowv_wiki)hash.Fetch(domain);
return rv.Init_assert();
}
public void Load_default() {
Io_url[] wiki_dirs = Io_mgr._.QueryDir_args(wiki_root_dir).DirOnly_().ExecAsUrlAry();
for (Io_url wiki_dir : wiki_dirs) {
String wiki_dir_url = wiki_dir.Raw();
if (String_.HasAtBgn(wiki_dir_url, "#")) continue;
Xowv_wiki wiki = new Xowv_wiki(app, wiki_dir.NameOnly(), wiki_dir);
hash.Add(wiki.Domain_bry(), wiki);
}
}
}

View File

@ -1,52 +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.xowa.hdumps; import gplx.*; import gplx.xowa.*;
import gplx.xowa.hdumps.core.*; import gplx.xowa.gui.history.*;
public abstract class Xogv_tab_base {
private Xog_history_stack history_stack = new Xog_history_stack();
private Xoav_wiki_mgr wiki_mgr;
public void Ctor(Xoav_wiki_mgr wiki_mgr) {this.wiki_mgr = wiki_mgr;}
public Xog_history_itm Cur_itm() {return history_stack.Cur_itm();}
public Hdump_page Go_to(byte[] page) {return Go_to(history_stack.Cur_itm().Wiki(), page, Bry_.Empty, Bry_.Empty, false, "");}
public Hdump_page Go_to(byte[] wiki, byte[] page) {return Go_to(wiki, page, Bry_.Empty, Bry_.Empty, false, "");}
public Hdump_page Go_to(byte[] wiki, byte[] page, byte[] anch, byte[] qarg, boolean redirect_force, String bmk_pos) {
Xog_history_itm old_itm = this.Cur_itm();
Xog_history_itm new_itm = new Xog_history_itm(wiki, page, anch, qarg, redirect_force, bmk_pos);
history_stack.Add(new_itm);
return Fetch_page_and_show(old_itm, new_itm);
}
public Hdump_page Go_bwd() {return Go_by_dir(Bool_.Y);}
public Hdump_page Go_fwd() {return Go_by_dir(Bool_.N);}
private Hdump_page Go_by_dir(boolean bwd) {
Xog_history_itm old_itm = this.Cur_itm();
Xog_history_itm new_itm = bwd ? history_stack.Go_bwd() : history_stack.Go_fwd();
return Fetch_page_and_show(old_itm, new_itm);
}
private Hdump_page Fetch_page_and_show(Xog_history_itm old_itm, Xog_history_itm new_itm) {
Hdump_page new_hpg = Fetch_page(new_itm.Wiki(), new_itm.Page());
Show_page(old_itm, new_itm, new_hpg);
return new_hpg;
}
private Hdump_page Fetch_page(byte[] wiki_domain, byte[] page_ttl) {
Xowv_wiki wiki = wiki_mgr.Get_by_domain(wiki_domain);
Hdump_page rv = new Hdump_page();
wiki.Hdump_mgr().Load(rv, page_ttl);
return rv;
}
protected abstract void Show_page(Xog_history_itm old_itm, Xog_history_itm new_itm, Hdump_page new_hpg);
}

View File

@ -1,55 +0,0 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.hdumps; import gplx.*; import gplx.xowa.*;
import gplx.dbs.*; import gplx.xowa.dbs.*;
public class Xowv_db_mgr implements GfoInvkAble {
private Io_url wiki_root_dir;
public Xowv_db_mgr(String domain_str, Io_url wiki_root_dir) {
this.tbl_mgr = new Xowd_db_tbl_mgr(); this.wiki_root_dir = wiki_root_dir;
this.key__core = Xowv_db_mgr.Db_key__core__default(this, domain_str, wiki_root_dir);
}
public Xowd_db_tbl_mgr Tbl_mgr() {return tbl_mgr;} private Xowd_db_tbl_mgr tbl_mgr;
private Xodb_file[] db_files; private Db_provider_key[] db_keys; private int db_keys_len;
public Db_provider_key Key__core() {return key__core;} private Db_provider_key key__core;
public Db_provider_key Key_by_idx(int idx) {if (!Int_.Between(idx, 0, db_keys_len)) throw Err_.new_("database does not exist: idx={0}", idx); return db_keys[idx];}
private void Core_init(Db_provider provider) {
db_files = tbl_mgr.Tbl__dbs_new().Select_all(provider, wiki_root_dir);
db_keys = Db_keys_make(db_files);
db_keys_len = db_keys.length;
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_core_init)) Core_init((Db_provider)m.ReadObj("v"));
else return GfoInvkAble_.Rv_unhandled;
return this;
} private static final String Invk_core_init = "core_init";
private static Db_provider_key Db_key__core__default(Xowv_db_mgr db_mgr, String domain_str, Io_url wiki_root_dir) {
Io_url core_db_url = wiki_root_dir.GenSubFil_ary(domain_str, ".000.sqlite3");
GfoInvkAbleCmd init_cmd = GfoInvkAbleCmd.new_(db_mgr, Invk_core_init);
return new Db_provider_key(core_db_url.Raw(), Db_conn_info_.sqlite_(core_db_url), init_cmd);
}
private static Db_provider_key[] Db_keys_make(Xodb_file[] ary) {
int len = ary.length;
Db_provider_key[] rv = new Db_provider_key[len];
for (int i = 0; i < len; ++i) {
Xodb_file itm = ary[i];
Io_url itm_url = itm.Url();
rv[i] = new Db_provider_key(itm_url.Raw(), Db_conn_info_.sqlite_(itm_url), GfoInvkAbleCmd.Null);
}
return rv;
}
}

View File

@ -1,45 +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.xowa.hdumps; import gplx.*; import gplx.xowa.*;
import org.junit.*; import gplx.xowa.files.*; import gplx.xowa.dbs.*;
import gplx.xowa.hdumps.core.*; import gplx.xowa.hdumps.dbs.*; import gplx.xowa.hdumps.pages.*; import gplx.xowa.xtns.hieros.*; import gplx.xowa.xtns.gallery.*;
public class Xowv_db_mgr_tst {
@Before public void init() {} private Xowv_db_mgr_fxt fxt = new Xowv_db_mgr_fxt();
@Test public void Basic() {
fxt.Init_rdr(fxt.Make_row(0, "mem/a", 2),fxt.Make_row(0, "mem/a", 2), fxt.Make_row(0, "mem/a", 2));
// fxt.Exec_open_core();
// fxt.Test_dbs(fxt.Make_db(0, "mem/a", 0), fxt.Make_db(1, "mem/2", 2), fxt.Make_db("mem/3, 3"));
}
}
class Xowv_db_mgr_fxt {
// private Xoav_app app; private Xowv_wiki wiki;
public void Init_rdr(Mem_db_row... rows) {
// Mem_db_rdr rdr = Mem_db_rdr.new_by_rows(rows);
// app = new Xoav_app(null, nul, null);
// Mem_db_engine engine = new Mem_db_engine();
// engine.Pending_rdrs_add(rdr);
// app.Db_mgr().Engines_add(engine);
}
public Mem_db_row Make_row(Object... vals) {return new Mem_db_row(vals);}
public void Exec_open_core() {
// app.Db_mgr().Get(wiki.Db_mgr().Key__core());
}
public void Test_dbs(Xodb_file[] expd) {
// Tfds.Eq(expd, wiki.Db_mgr().Files());
}
}

View File

@ -1,55 +0,0 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.hdumps; import gplx.*; import gplx.xowa.*;
import gplx.xowa.wikis.xwikis.*; import gplx.xowa.langs.cases.*; import gplx.xowa.apps.ttls.*; import gplx.xowa.html.hzips.*;
import gplx.xowa.dbs.tbls.*; import gplx.dbs.*;
public class Xowv_wiki implements Xoa_ttl_parser {
private Xoav_app app;
public Xowv_wiki(Xoav_app app, String domain_str, Io_url wiki_root_dir) {
this.app = app;
this.domain_str = domain_str; this.domain_bry = Bry_.new_utf8_(domain_str);
this.ns_mgr = Xow_ns_mgr_.default_(app.Utl_case_mgr()); // new Xow_ns_mgr(app.Utl_case_mgr()); // FIXME
this.db_mgr = new Xowv_db_mgr(domain_str, wiki_root_dir);
this.hdump_mgr = new Xowd_hdump_mgr(app, this);
this.xwiki_mgr = new Xow_xwiki_mgr();
this.hzip_mgr = new Xow_hzip_mgr(app.Usr_dlg(), this);
}
public byte[] Domain_bry() {return domain_bry;} private final byte[] domain_bry;
public String Domain_str() {return domain_str;} private final String domain_str;
public Xow_ns_mgr Ns_mgr() {return ns_mgr;} private final Xow_ns_mgr ns_mgr;
public Xowv_db_mgr Db_mgr() {return db_mgr;} private final Xowv_db_mgr db_mgr;
public Xowd_hdump_mgr Hdump_mgr() {return hdump_mgr;} private final Xowd_hdump_mgr hdump_mgr;
public Xow_hzip_mgr Hzip_mgr() {return hzip_mgr;} private Xow_hzip_mgr hzip_mgr;
public Xow_xwiki_mgr Xwiki_mgr() {return xwiki_mgr;} private Xow_xwiki_mgr xwiki_mgr;
private boolean init_done = false;
public Xowv_wiki Init_assert() {
if (init_done) return this;
init_done = true;
Db_provider core_provider = app.Db_mgr().Get(db_mgr.Key__core());
Xodb_xowa_ns_tbl ns_tbl = db_mgr.Tbl_mgr().Tbl__ns();
ns_tbl.Provider_(core_provider);
ns_tbl.Select_all(ns_mgr);
return this;
}
public Xoa_ttl Ttl_parse(byte[] ttl) {return Xoa_ttl.parse(app.Utl_bfr_mkr(), app.Utl_amp_mgr(), app.Utl_case_mgr(), xwiki_mgr, ns_mgr, app.Utl_msg_log(), ttl, 0, ttl.length);}
public Xoa_ttl Ttl_parse(int ns_id, byte[] ttl) {
Xow_ns ns = ns_mgr.Ids_get_or_null(ns_id);
byte[] raw = Bry_.Add(ns.Name_db_w_colon(), ttl);
return Xoa_ttl.parse(app.Utl_bfr_mkr(), app.Utl_amp_mgr(), app.Utl_case_mgr(), xwiki_mgr, ns_mgr, app.Utl_msg_log(), raw, 0, raw.length);
}
}

View File

@ -1,66 +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.xowa.hdumps.core; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*;
import gplx.xowa.pages.*; import gplx.xowa.pages.skins.*;
public class Hdump_page {
public int Page_id() {return page_id;} private int page_id;
public Xoa_url Page_url() {return page_url;} private Xoa_url page_url;
public Xoa_ttl Page_ttl() {return page_ttl;} private Xoa_ttl page_ttl;
public int Version_id() {return version_id;} public void Version_id_(int v) {version_id = v;} private int version_id;
public int Img_count() {return img_count;} public void Img_count_(int v) {img_count = v;} private int img_count;
public Hdump_module_mgr Module_mgr() {return module_mgr;} private Hdump_module_mgr module_mgr = new Hdump_module_mgr();
public byte[] Page_body() {return page_body;} public void Page_body_(byte[] v) {this.page_body = v;} private byte[] page_body;
public byte[] Display_ttl() {return display_ttl;} public void Display_ttl_(byte[] v) {this.display_ttl = v;} private byte[] display_ttl;
public byte[] Content_sub() {return content_sub;} public void Content_sub_(byte[] v) {this.content_sub = v;} private byte[] content_sub;
public byte[] Sidebar_div() {return sidebar_div;} public void Sidebar_div_(byte[] v) {this.sidebar_div = v;} private byte[] sidebar_div;
public int[] Redlink_uids() {return redlink_uids;} public void Redlink_uids_(int[] v) {redlink_uids = v;} private int[] redlink_uids;
public Hdump_data_img__base[] Img_itms() {return img_itms;} public void Img_itms_(Hdump_data_img__base[] v) {this.img_itms = v;} private Hdump_data_img__base[] img_itms;
public OrderedHash Gly_itms() {return gly_itms;} private OrderedHash gly_itms = OrderedHash_.new_();
public Hdump_page Init(int page_id, Xoa_url page_url, Xoa_ttl page_ttl) {
this.page_id = page_id; this.page_url = page_url; this.page_ttl = page_ttl;
content_sub = sidebar_div = Bry_.Empty;
display_ttl = null;
img_itms = Hdump_data_img__base.Ary_empty;
module_mgr.Clear();
gly_itms.Clear();
return this;
}
public void Init(Bry_bfr tmp_bfr, Xoa_page page) {
page_id = page.Revision_data().Id();
page_body = page.Hdump_data().Body();
Xopg_html_data html_data = page.Html_data();
gplx.xowa.html.modules.Xoh_module_mgr mod_mgr = html_data.Module_mgr();
module_mgr.Init(mod_mgr.Itm_mathjax().Enabled(), mod_mgr.Itm_popups().Bind_hover_area(), mod_mgr.Itm_gallery().Enabled(), mod_mgr.Itm_hiero().Enabled());
display_ttl = html_data.Display_ttl();
content_sub = html_data.Content_sub();
sidebar_div = Save_sidebars(tmp_bfr, page, html_data);
}
private static byte[] Save_sidebars(Bry_bfr tmp_bfr, Xoa_page page, Xopg_html_data html_data) {
Xopg_xtn_skin_mgr mgr = html_data.Xtn_skin_mgr();
int len = mgr.Count();
boolean sidebar_exists = false;
for (int i = 0; i < len; ++i) {
Xopg_xtn_skin_itm itm = mgr.Get_at(i);
if (itm.Tid() == Xopg_xtn_skin_itm_tid.Tid_sidebar) {
sidebar_exists = true;
itm.Write(tmp_bfr, page);
}
}
return sidebar_exists ? tmp_bfr.Xto_bry_and_clear() : null;
}
}