mirror of
https://github.com/gnosygnu/xowa.git
synced 2026-03-02 03:49:30 +00:00
Wiki: Support renamed folders (fix)
This commit is contained in:
@@ -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.fsdb.data; import gplx.*; import gplx.fsdb.*;
|
||||
public class Fsd_bin_itm {
|
||||
public Fsd_bin_itm(int bin_owner_id, byte bin_owner_tid, int bin_part_id, String bin_data_url, byte[] bin_data) {
|
||||
this.bin_owner_id = bin_owner_id;
|
||||
this.bin_owner_tid = bin_owner_tid;
|
||||
this.bin_part_id = bin_part_id;
|
||||
this.bin_data_url = bin_data_url;
|
||||
this.bin_data = bin_data;
|
||||
}
|
||||
public int Bin_owner_id() {return bin_owner_id;} private final int bin_owner_id;
|
||||
public byte Bin_owner_tid() {return bin_owner_tid;} private final byte bin_owner_tid;
|
||||
public int Bin_part_id() {return bin_part_id;} private final int bin_part_id;
|
||||
public String Bin_data_url() {return bin_data_url;} private final String bin_data_url;
|
||||
public byte[] Bin_data() {return bin_data;} private final byte[] bin_data;
|
||||
|
||||
public static final int Db_row_size_fixed = (3 * 4); // bin_owner_id, bin_part_id, bin_owner_tid (assume byte saved as int in SQLITE)
|
||||
}
|
||||
@@ -1,122 +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.fsdb.data; import gplx.*; import gplx.fsdb.*;
|
||||
import gplx.core.primitives.*; import gplx.core.envs.*;
|
||||
import gplx.dbs.*; import gplx.core.ios.*; import gplx.core.ios.streams.*;
|
||||
import gplx.dbs.engines.sqlite.*;
|
||||
public class Fsd_bin_tbl implements Rls_able {
|
||||
public final String fld__owner_id, fld__owner_tid, fld__part_id, fld__data_url, fld__data;
|
||||
private Db_conn conn; private Db_stmt stmt_insert, stmt_select, stmt_select_itm; private Bry_bfr tmp_bfr;
|
||||
private final Bool_obj_ref saved_in_parts = Bool_obj_ref.n_();
|
||||
public Fsd_bin_tbl(Db_conn conn, boolean schema_is_1) {
|
||||
this.conn = conn;
|
||||
fld__owner_id = flds.Add_int_pkey ("bin_owner_id");
|
||||
fld__owner_tid = flds.Add_byte ("bin_owner_tid");
|
||||
fld__part_id = flds.Add_int ("bin_part_id");
|
||||
fld__data_url = flds.Add_str ("bin_data_url", 255);
|
||||
fld__data = flds.Add_bry ("bin_data"); // mediumblob
|
||||
conn.Rls_reg(this);
|
||||
}
|
||||
public String Tbl_name() {return tbl_name;} private final String tbl_name = "fsdb_bin";
|
||||
public Dbmeta_fld_list Flds() {return flds;} private final Dbmeta_fld_list flds = new Dbmeta_fld_list();
|
||||
public void Rls() {
|
||||
stmt_insert = Db_stmt_.Rls(stmt_insert);
|
||||
stmt_select = Db_stmt_.Rls(stmt_select);
|
||||
stmt_select_itm = Db_stmt_.Rls(stmt_select_itm);
|
||||
}
|
||||
public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds));}
|
||||
public void Insert_bgn() {conn.Txn_bgn("fsdb_bin__insert"); stmt_insert = conn.Stmt_insert(tbl_name, flds);}
|
||||
public void Insert_commit() {conn.Txn_sav();}
|
||||
public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);}
|
||||
public void Insert_rdr(int id, byte tid, long bin_len, Io_stream_rdr bin_rdr) {
|
||||
if (stmt_insert == null) {
|
||||
stmt_insert = conn.Stmt_insert(tbl_name, flds);
|
||||
tmp_bfr = Bry_bfr_.Reset(Io_mgr.Len_kb);
|
||||
}
|
||||
byte[] bin_ary = Io_stream_rdr_.Load_all_as_bry(tmp_bfr, bin_rdr);
|
||||
stmt_insert.Clear()
|
||||
.Val_int(fld__owner_id, id)
|
||||
.Val_byte(fld__owner_tid, tid)
|
||||
.Val_int(fld__part_id, Part_id_null)
|
||||
.Val_str(fld__data_url, Data_url_null)
|
||||
.Val_bry(fld__data, bin_ary)
|
||||
.Exec_insert();
|
||||
}
|
||||
public void Update(Db_stmt stmt, int id, byte[] data) {
|
||||
stmt.Clear().Val_bry(fld__data, data).Crt_int(fld__owner_id, id).Exec_update();
|
||||
}
|
||||
public Io_stream_rdr Select_as_rdr(int owner_id) {
|
||||
byte[] rv = Select(owner_id, null);
|
||||
return rv == null
|
||||
? Io_stream_rdr_.Noop
|
||||
: Io_stream_rdr_.New__mem(rv);
|
||||
}
|
||||
public boolean Select_to_url(int owner_id, Io_url url) {
|
||||
saved_in_parts.Val_n();
|
||||
byte[] rv = Select(owner_id, url);
|
||||
if (rv == null) return false;
|
||||
if (saved_in_parts.Val_y()) return true;
|
||||
Io_mgr.Instance.SaveFilBry(url, rv);
|
||||
return true;
|
||||
}
|
||||
private byte[] Select(int owner_id, Io_url url) {
|
||||
if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, String_.Ary(fld__data), fld__owner_id);
|
||||
Db_rdr rdr = stmt_select.Clear().Crt_int(fld__owner_id, owner_id).Exec_select__rls_manual();
|
||||
try {
|
||||
if (rdr.Move_next()) {
|
||||
byte[] rv = null;
|
||||
try {rv = rdr.Read_bry(fld__data);}
|
||||
catch (Exception e) {
|
||||
if ( Op_sys.Cur().Tid_is_drd() // drd error when selecting large blobs (> 4 MB?)
|
||||
&& url != null // called by Select_to_url
|
||||
&& String_.Has(Err_.Message_lang(e), "get field slot from row") // get field slot from row 0 col 0 failed
|
||||
) {
|
||||
rdr.Save_bry_in_parts(url, tbl_name, fld__data, fld__owner_id, owner_id);
|
||||
saved_in_parts.Val_y_();
|
||||
}
|
||||
}
|
||||
return rv == null ? Bry_.Empty : rv; // NOTE: bug in v0.10.1 where .ogg would save as null; return Bry_.Empty instead, else java.io.ByteArrayInputStream would fail on null
|
||||
}
|
||||
else
|
||||
return null;
|
||||
}
|
||||
finally {rdr.Rls();}
|
||||
}
|
||||
public Fsd_bin_itm Select_as_itm(int owner_id) {
|
||||
if (stmt_select_itm == null) stmt_select_itm = conn.Stmt_select(tbl_name, flds, fld__owner_id);
|
||||
Db_rdr rdr = stmt_select_itm.Clear().Crt_int(fld__owner_id, owner_id).Exec_select__rls_manual();
|
||||
try {
|
||||
if (rdr.Move_next()) {
|
||||
return new Fsd_bin_itm
|
||||
( rdr.Read_int(fld__owner_id)
|
||||
, rdr.Read_byte(fld__owner_tid)
|
||||
, rdr.Read_int(fld__part_id)
|
||||
, rdr.Read_str(fld__data_url)
|
||||
, rdr.Read_bry(fld__data)
|
||||
);
|
||||
}
|
||||
else
|
||||
return null;
|
||||
}
|
||||
finally {rdr.Rls();}
|
||||
}
|
||||
public static final byte Owner_tid_fil = 1, Owner_tid_thm = 2;
|
||||
public static final int Bin_db_id_null = -1, Size_null = -1;
|
||||
private static final int Part_id_null = -1;
|
||||
private static final String Data_url_null = "";
|
||||
}
|
||||
@@ -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.fsdb.data; import gplx.*; import gplx.fsdb.*;
|
||||
public class Fsd_dir_itm {
|
||||
public Fsd_dir_itm(int dir_id, int owner, byte[] name) {
|
||||
this.dir_id = dir_id;
|
||||
this.owner = owner;
|
||||
this.name = name;
|
||||
}
|
||||
public int Dir_id() {return dir_id;} private final int dir_id;
|
||||
public int Owner() {return owner;} private final int owner;
|
||||
public byte[] Name() {return name;} private final byte[] name;
|
||||
|
||||
public static final int Owner_root = 0;
|
||||
public static final Fsd_dir_itm Null = null;
|
||||
}
|
||||
@@ -1,69 +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.fsdb.data; import gplx.*; import gplx.fsdb.*;
|
||||
import gplx.dbs.*;
|
||||
public class Fsd_dir_tbl implements Db_tbl {
|
||||
private final Dbmeta_fld_list flds = new Dbmeta_fld_list();
|
||||
private final String fld_id, fld_owner_id, fld_name;
|
||||
private final Db_conn conn; private Db_stmt stmt_select_by_name;
|
||||
public Fsd_dir_tbl(Db_conn conn, boolean schema_is_1) {
|
||||
this.conn = conn;
|
||||
this.fld_id = flds.Add_int_pkey ("dir_id");
|
||||
this.fld_owner_id = flds.Add_int ("dir_owner_id");
|
||||
this.fld_name = flds.Add_str ("dir_name", 255);
|
||||
conn.Rls_reg(this);
|
||||
}
|
||||
public String Tbl_name() {return tbl_name;} private final String tbl_name = "fsdb_dir";
|
||||
public void Create_tbl() {
|
||||
conn.Meta_tbl_create
|
||||
( Dbmeta_tbl_itm.New(tbl_name, flds
|
||||
, Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, "name", fld_name, fld_owner_id, fld_id)));
|
||||
}
|
||||
public void Insert(int id, byte[] name, int owner_id) {
|
||||
Db_stmt stmt_insert = conn.Stmt_insert(tbl_name, flds);
|
||||
stmt_insert.Clear()
|
||||
.Val_int(fld_id, id)
|
||||
.Val_int(fld_owner_id, owner_id)
|
||||
.Val_bry_as_str(fld_name, name)
|
||||
.Exec_insert();
|
||||
stmt_insert.Rls();
|
||||
}
|
||||
public void Update(int id, byte[] name, int owner_id) {
|
||||
Db_stmt stmt_update = conn.Stmt_update_exclude(tbl_name, flds, fld_id);
|
||||
stmt_update.Clear()
|
||||
.Val_int(fld_owner_id, owner_id)
|
||||
.Val_bry_as_str(fld_name, name)
|
||||
.Crt_int(fld_id, id)
|
||||
.Exec_update();
|
||||
stmt_update.Rls();
|
||||
}
|
||||
public Fsd_dir_itm Select_or_null(byte[] name) {
|
||||
if (stmt_select_by_name == null) stmt_select_by_name = conn.Stmt_select(tbl_name, flds, fld_name);
|
||||
Db_rdr rdr = stmt_select_by_name.Clear().Crt_bry_as_str(fld_name, name).Exec_select__rls_manual();
|
||||
try {
|
||||
return rdr.Move_next()
|
||||
? new Fsd_dir_itm(rdr.Read_int(fld_id), rdr.Read_int(fld_owner_id), name)
|
||||
: Fsd_dir_itm.Null
|
||||
;
|
||||
}
|
||||
finally {rdr.Rls();}
|
||||
}
|
||||
public void Rls() {
|
||||
stmt_select_by_name = Db_stmt_.Rls(stmt_select_by_name);
|
||||
}
|
||||
}
|
||||
@@ -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.fsdb.data; import gplx.*; import gplx.fsdb.*;
|
||||
public class Fsd_fil_itm {
|
||||
public Fsd_fil_itm (int mnt_id, int dir_id, int fil_id, int xtn_id, int ext_id, byte[] name, long size, String modified_on, String hash_md5, int bin_db_id) {
|
||||
this.mnt_id = mnt_id; this.dir_id = dir_id; this.fil_id = fil_id; this.xtn_id = xtn_id; this.ext_id = ext_id;
|
||||
this.name = name; this.size = size; this.modified_on = modified_on; this.hash_md5 = hash_md5; this.bin_db_id = bin_db_id;
|
||||
}
|
||||
public int Mnt_id() {return mnt_id;} private final int mnt_id;
|
||||
public int Dir_id() {return dir_id;} private final int dir_id;
|
||||
public int Fil_id() {return fil_id;} private final int fil_id;
|
||||
public int Xtn_id() {return xtn_id;} private final int xtn_id;
|
||||
public int Ext_id() {return ext_id;} private final int ext_id;
|
||||
public byte[] Name() {return name;} private final byte[] name;
|
||||
public long Size() {return size;} private final long size;
|
||||
public String Modified_on() {return modified_on;} private final String modified_on;
|
||||
public String Hash_md5() {return hash_md5;} private final String hash_md5;
|
||||
public int Bin_db_id() {return bin_db_id;} private final int bin_db_id;
|
||||
|
||||
public int Db_row_size() {return Db_row_size_fixed + name.length;}
|
||||
private static final int Db_row_size_fixed =
|
||||
(7 * 4) // 6 int fields + 1 byte field
|
||||
+ 8 // 1 long field
|
||||
+ 32 // hash_md5
|
||||
+ 14 // modified_on
|
||||
;
|
||||
|
||||
public static final Fsd_fil_itm Null = null;
|
||||
public static byte[] Gen_cache_key(Bry_bfr bfr, int dir_id, byte[] name) {
|
||||
return bfr.Add_int_variable(dir_id).Add_byte_pipe().Add(name).To_bry_and_clear();
|
||||
}
|
||||
}
|
||||
@@ -1,120 +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.fsdb.data; import gplx.*; import gplx.fsdb.*;
|
||||
import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.dbs.engines.sqlite.*;
|
||||
public class Fsd_fil_tbl implements Db_tbl {
|
||||
public final Dbmeta_fld_list flds = new Dbmeta_fld_list();
|
||||
public final String fld_id, fld_owner_id, fld_name, fld_xtn_id, fld_ext_id, fld_size, fld_modified, fld_hash, fld_bin_db_id;
|
||||
private final String idx_owner;
|
||||
public final Db_conn conn; private Db_stmt stmt_insert, stmt_update, stmt_select_by_name; private int mnt_id;
|
||||
public Fsd_fil_tbl(Db_conn conn, boolean schema_is_1, int mnt_id) {
|
||||
this.conn = conn; this.mnt_id = mnt_id;
|
||||
this.fld_id = flds.Add_int_pkey ("fil_id");
|
||||
this.fld_owner_id = flds.Add_int ("fil_owner_id");
|
||||
this.fld_xtn_id = flds.Add_int ("fil_xtn_id");
|
||||
this.fld_ext_id = flds.Add_int ("fil_ext_id");
|
||||
this.fld_bin_db_id = flds.Add_int ("fil_bin_db_id"); // group ints at beginning of table
|
||||
this.fld_name = flds.Add_str ("fil_name", 255);
|
||||
this.fld_size = flds.Add_long ("fil_size");
|
||||
this.fld_modified = flds.Add_str ("fil_modified", 14); // stored as yyyyMMddHHmmss
|
||||
this.fld_hash = flds.Add_str ("fil_hash", 40);
|
||||
this.idx_owner = Dbmeta_idx_itm.Bld_idx_name(tbl_name, "owner");
|
||||
conn.Rls_reg(this);
|
||||
}
|
||||
public String Tbl_name() {return tbl_name;} private final String tbl_name = "fsdb_fil";
|
||||
public void Rls() {
|
||||
stmt_insert = Db_stmt_.Rls(stmt_insert);
|
||||
stmt_update = Db_stmt_.Rls(stmt_update);
|
||||
stmt_select_by_name = Db_stmt_.Rls(stmt_select_by_name);
|
||||
}
|
||||
public void Create_tbl() {
|
||||
conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds
|
||||
, Dbmeta_idx_itm.new_unique_by_name(tbl_name, idx_owner, fld_owner_id, fld_name, fld_id)
|
||||
));
|
||||
}
|
||||
public void Insert(int id, int owner_id, byte[] name, int xtn_id, int ext_id, long size, int bin_db_id) {
|
||||
if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
|
||||
Insert(stmt_insert, id, owner_id, name, xtn_id, ext_id, size, bin_db_id, String_.Empty, String_.Empty);
|
||||
}
|
||||
public void Insert(Db_stmt stmt, int id, int owner_id, byte[] name, int xtn_id, int ext_id, long size, int bin_db_id, String modified_on, String hash_md5) {
|
||||
stmt.Clear()
|
||||
.Val_int(fld_id, id)
|
||||
.Val_int(fld_owner_id, owner_id)
|
||||
.Val_int(fld_xtn_id, xtn_id)
|
||||
.Val_int(fld_ext_id, ext_id)
|
||||
.Val_int(fld_bin_db_id, bin_db_id)
|
||||
.Val_bry_as_str(fld_name, name)
|
||||
.Val_long(fld_size, size)
|
||||
.Val_str(fld_modified, modified_on)
|
||||
.Val_str(fld_hash, hash_md5)
|
||||
.Exec_insert();
|
||||
}
|
||||
public void Update(int id, int owner_id, byte[] name, int xtn_id, int ext_id, long size, int bin_db_id) {
|
||||
if (stmt_update == null) stmt_update = conn.Stmt_update_exclude(tbl_name, flds, fld_id);
|
||||
stmt_update.Clear()
|
||||
.Val_int(fld_owner_id, owner_id)
|
||||
.Val_int(fld_xtn_id, xtn_id)
|
||||
.Val_int(fld_ext_id, ext_id)
|
||||
.Val_int(fld_bin_db_id, bin_db_id)
|
||||
.Val_bry_as_str(fld_name, name)
|
||||
.Val_long(fld_size, size)
|
||||
.Val_str(fld_modified, String_.Empty)
|
||||
.Val_str(fld_hash, String_.Empty)
|
||||
.Crt_int(fld_id, id)
|
||||
.Exec_update();
|
||||
}
|
||||
public Fsd_fil_itm Select_or_null(int dir_id, byte[] fil_name) {
|
||||
if (stmt_select_by_name == null) {
|
||||
Db_qry__select_cmd qry = new Db_qry__select_cmd().From_(tbl_name).Cols_(flds.To_str_ary()).Where_(Db_crt_.eq_many_(fld_owner_id, fld_name)).Indexed_by_(idx_owner);
|
||||
stmt_select_by_name = conn.Stmt_new(qry);
|
||||
}
|
||||
Db_rdr rdr = stmt_select_by_name.Clear()
|
||||
.Crt_int(fld_owner_id, dir_id)
|
||||
.Crt_bry_as_str(fld_name, fil_name)
|
||||
.Exec_select__rls_manual();
|
||||
try {
|
||||
return rdr.Move_next() ? New_by_rdr(mnt_id, rdr) : Fsd_fil_itm.Null;
|
||||
}
|
||||
finally {rdr.Rls();}
|
||||
}
|
||||
public void Select_all(Bry_bfr key_bfr, gplx.core.caches.Gfo_cache_mgr_bry cache) {
|
||||
Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Dbmeta_fld_itm.Str_ary_empty).Exec_select__rls_auto();
|
||||
try {
|
||||
while (rdr.Move_next()) {
|
||||
Fsd_fil_itm fil = New_by_rdr(mnt_id, rdr);
|
||||
byte[] cache_key = Fsd_fil_itm.Gen_cache_key(key_bfr, fil.Dir_id(), fil.Name());
|
||||
cache.Add(cache_key, fil);
|
||||
}
|
||||
}
|
||||
finally {rdr.Rls();}
|
||||
}
|
||||
public Fsd_fil_itm New_by_rdr(int mnt_id, Db_rdr rdr) {
|
||||
return new Fsd_fil_itm
|
||||
( mnt_id
|
||||
, rdr.Read_int(fld_owner_id)
|
||||
, rdr.Read_int(fld_id)
|
||||
, rdr.Read_int(fld_xtn_id)
|
||||
, rdr.Read_int(fld_ext_id)
|
||||
, rdr.Read_bry_by_str(fld_name)
|
||||
, rdr.Read_long(fld_size)
|
||||
, rdr.Read_str(fld_modified)
|
||||
, rdr.Read_str(fld_hash)
|
||||
, rdr.Read_int(fld_bin_db_id)
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,27 +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.fsdb.data; import gplx.*; import gplx.fsdb.*;
|
||||
public class Fsd_img_itm {
|
||||
public Fsd_img_itm(int mnt_id, int dir_id, int fil_id, int bin_db_id) {
|
||||
this.mnt_id = mnt_id; this.dir_id = dir_id; this.fil_id = fil_id; this.bin_db_id = bin_db_id;
|
||||
}
|
||||
public int Mnt_id() {return mnt_id;} private final int mnt_id;
|
||||
public int Dir_id() {return dir_id;} private final int dir_id;
|
||||
public int Fil_id() {return fil_id;} private final int fil_id;
|
||||
public int Bin_db_id() {return bin_db_id;} private final int bin_db_id;
|
||||
}
|
||||
@@ -1,68 +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.fsdb.data; import gplx.*; import gplx.fsdb.*;
|
||||
public class Fsd_thm_itm {
|
||||
public void Ctor(int mnt_id, int dir_id, int fil_id, int thm_id, int bin_db_id, int w, int h, double time, int page, long size, String modified, String hash) {
|
||||
this.mnt_id = mnt_id; this.dir_id = dir_id; this.fil_id = fil_id; this.thm_id = thm_id; this.bin_db_id = bin_db_id;
|
||||
this.w = w; this.h = h; this.time = time; this.page = page;
|
||||
this.size = size; this.modified = modified; this.hash = hash;
|
||||
}
|
||||
public int Mnt_id() {return mnt_id;} private int mnt_id;
|
||||
public int Dir_id() {return dir_id;} private int dir_id;
|
||||
public int Fil_id() {return fil_id;} private int fil_id;
|
||||
public int Thm_id() {return thm_id;} private int thm_id;
|
||||
public int Bin_db_id() {return bin_db_id;} private int bin_db_id;
|
||||
public int W() {return w;} private int w;
|
||||
public int H() {return h;} private int h;
|
||||
public double Time() {return time;} private double time;
|
||||
public int Page() {return page;} private int page;
|
||||
public long Size() {return size;} private long size;
|
||||
public String Modified() {return modified;} private String modified;
|
||||
public String Hash() {return hash;} private String hash;
|
||||
public int Req_w() {return req_w;} private int req_w;
|
||||
public double Req_time() {return req_time;} private double req_time;
|
||||
public int Req_page() {return req_page;} private int req_page;
|
||||
public void Init_by_req(int w, double time, int page) {this.w = w; this.time = time; this.page = page;}
|
||||
public void Init_by_match(Fsd_thm_itm comp) {
|
||||
this.req_w = w; this.req_time = time; this.req_page = page;
|
||||
this.mnt_id = comp.mnt_id; this.dir_id = comp.dir_id; this.fil_id = comp.fil_id; this.thm_id = comp.thm_id; this.bin_db_id = comp.bin_db_id;
|
||||
this.w = comp.w; this.h = comp.h; this.time = comp.time; this.page = comp.page;
|
||||
this.size = comp.size; this.modified = comp.modified; this.hash = comp.hash;
|
||||
}
|
||||
public int Db_row_size() {return Db_row_size_fixed;}
|
||||
private static final int Db_row_size_fixed =
|
||||
(7 * 4) // 7 ints
|
||||
+ (2 * 8) // 1 long; 1 double
|
||||
+ 32 // hash_md5
|
||||
+ 14 // modified_on
|
||||
;
|
||||
|
||||
public static final Fsd_thm_itm Null = null;
|
||||
public static final Fsd_thm_itm[] Ary_empty = new Fsd_thm_itm[0];
|
||||
public static Fsd_thm_itm new_() {return new Fsd_thm_itm();} Fsd_thm_itm() {}
|
||||
}
|
||||
class Fsdb_thm_itm_sorter implements gplx.core.lists.ComparerAble {
|
||||
public int compare(Object lhsObj, Object rhsObj) {
|
||||
Fsd_thm_itm lhs = (Fsd_thm_itm)lhsObj;
|
||||
Fsd_thm_itm rhs = (Fsd_thm_itm)rhsObj;
|
||||
int comp = Int_.Compare (lhs.W() , rhs.W()); if (comp != CompareAble_.Same) return -comp; // sort by decreasing width
|
||||
comp = Double_.Compare (lhs.Time() , rhs.Time()); if (comp != CompareAble_.Same) return comp; // sort by increasing time
|
||||
return Int_.Compare (lhs.Page() , rhs.Page()); // sort by increasing page
|
||||
}
|
||||
public static final Fsdb_thm_itm_sorter Instance = new Fsdb_thm_itm_sorter(); Fsdb_thm_itm_sorter() {}
|
||||
}
|
||||
@@ -1,159 +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.fsdb.data; import gplx.*; import gplx.fsdb.*;
|
||||
import gplx.dbs.*; import gplx.fsdb.meta.*; import gplx.xowa.files.*;
|
||||
public class Fsd_thm_tbl implements Db_tbl {
|
||||
public final Dbmeta_fld_list flds = new Dbmeta_fld_list();
|
||||
public final String fld_id, fld_owner_id, fld_w, fld_h, fld_time, fld_page, fld_bin_db_id, fld_size, fld_modified, fld_hash;
|
||||
public final Db_conn conn; private Db_stmt stmt_insert, stmt_select_by_fil_exact, stmt_select_by_fil_near; private int mnt_id; private boolean schema_thm_page;
|
||||
public Fsd_thm_tbl(Db_conn conn, boolean schema_is_1, int mnt_id, boolean schema_thm_page) {
|
||||
this.conn = conn; this.mnt_id = mnt_id; this.schema_thm_page = schema_thm_page;
|
||||
this.tbl_name = schema_is_1 ? "fsdb_xtn_thm" : "fsdb_thm";
|
||||
this.fld_id = flds.Add_int_pkey ("thm_id");
|
||||
this.fld_owner_id = flds.Add_int ("thm_owner_id");
|
||||
this.fld_w = flds.Add_int ("thm_w");
|
||||
this.fld_h = flds.Add_int ("thm_h");
|
||||
if (schema_thm_page) {
|
||||
this.fld_time = flds.Add_double ("thm_time");
|
||||
this.fld_page = flds.Add_int ("thm_page");
|
||||
}
|
||||
else {
|
||||
this.fld_time = flds.Add_int ("thm_thumbtime");
|
||||
this.fld_page = Dbmeta_fld_itm.Key_null;
|
||||
}
|
||||
this.fld_bin_db_id = flds.Add_int ("thm_bin_db_id");
|
||||
this.fld_size = flds.Add_long ("thm_size");
|
||||
this.fld_modified = flds.Add_str ("thm_modified", 14); // stored as yyyyMMddHHmmss
|
||||
this.fld_hash = flds.Add_str ("thm_hash", 40);
|
||||
conn.Rls_reg(this);
|
||||
}
|
||||
public String Tbl_name() {return tbl_name;} private final String tbl_name;
|
||||
public void Create_tbl() {
|
||||
conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds
|
||||
, Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "owner", fld_owner_id, fld_id, fld_w, fld_time, fld_page)
|
||||
));
|
||||
}
|
||||
public void Insert(int id, int thm_owner_id, int width, int height, double thumbtime, int page, int bin_db_id, long size) {
|
||||
if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
|
||||
this.Insert(stmt_insert, id, thm_owner_id, width, height, thumbtime, page, bin_db_id, size, Modified_null_str, Hash_null);
|
||||
}
|
||||
public void Insert(Db_stmt stmt, int id, int thm_owner_id, int width, int height, double thumbtime, int page, int bin_db_id, long size, String modified, String hash_md5) {
|
||||
stmt.Clear()
|
||||
.Val_int(fld_id, id)
|
||||
.Val_int(fld_owner_id, thm_owner_id)
|
||||
.Val_int(fld_w, width)
|
||||
.Val_int(fld_h, height);
|
||||
if (schema_thm_page) {
|
||||
stmt.Val_double (fld_time, Xof_lnki_time.Db_save_double(thumbtime));
|
||||
stmt.Val_int (fld_page, Xof_lnki_page.Db_save_int(page));
|
||||
}
|
||||
else
|
||||
stmt.Val_int (fld_time, Xof_lnki_time.Db_save_int(thumbtime));
|
||||
stmt
|
||||
.Val_int(fld_bin_db_id, bin_db_id)
|
||||
.Val_long(fld_size, size)
|
||||
.Val_str(fld_modified, modified)
|
||||
.Val_str(fld_hash, hash_md5)
|
||||
.Exec_insert();
|
||||
}
|
||||
public boolean Select_itm_by_w_exact(int dir_id, int fil_id, Fsd_thm_itm thm) {
|
||||
if (stmt_select_by_fil_exact == null) stmt_select_by_fil_exact = conn.Stmt_select(tbl_name, flds, String_.Ary_wo_null(fld_owner_id, fld_w, fld_time, fld_page));
|
||||
stmt_select_by_fil_exact.Clear().Crt_int(fld_owner_id, fil_id).Crt_int(fld_w, thm.W());
|
||||
if (schema_thm_page) {
|
||||
stmt_select_by_fil_exact.Crt_double (fld_time, Xof_lnki_time.Db_save_double(thm.Time()));
|
||||
stmt_select_by_fil_exact.Crt_int (fld_page, Xof_lnki_page.Db_save_int(thm.Page()));
|
||||
}
|
||||
else {
|
||||
stmt_select_by_fil_exact.Crt_int (fld_time, Xof_lnki_time.Db_save_int(thm.Time()));
|
||||
}
|
||||
Db_rdr rdr = stmt_select_by_fil_exact.Exec_select__rls_manual();
|
||||
try {
|
||||
return rdr.Move_next()
|
||||
? Ctor_by_load(thm, rdr, dir_id)
|
||||
: false;
|
||||
}
|
||||
finally {rdr.Rls();}
|
||||
}
|
||||
public boolean Select_itm_by_w_near(int dir_id, int fil_id, Fsd_thm_itm thm) {
|
||||
if (stmt_select_by_fil_near == null) stmt_select_by_fil_near = conn.Stmt_select(tbl_name, flds, fld_owner_id);
|
||||
List_adp list = List_adp_.New();
|
||||
Db_rdr rdr = stmt_select_by_fil_near.Clear().Crt_int(fld_owner_id, fil_id).Exec_select__rls_manual();
|
||||
try {
|
||||
while (rdr.Move_next()) {
|
||||
Fsd_thm_itm itm = Fsd_thm_itm.new_();
|
||||
Ctor_by_load(itm, rdr, dir_id);
|
||||
list.Add(itm);
|
||||
}
|
||||
return Match_nearest(list, thm, schema_thm_page);
|
||||
}
|
||||
finally {rdr.Rls();}
|
||||
}
|
||||
public boolean Ctor_by_load(Fsd_thm_itm itm, Db_rdr rdr, int dir_id) {
|
||||
int thm_id = rdr.Read_int(fld_id);
|
||||
int fil_id = rdr.Read_int(fld_owner_id);
|
||||
int w = rdr.Read_int(fld_w);
|
||||
int h = rdr.Read_int(fld_h);
|
||||
long size = rdr.Read_long(fld_size);
|
||||
String modified = rdr.Read_str(fld_modified);
|
||||
String hash = rdr.Read_str(fld_hash);
|
||||
int bin_db_id = rdr.Read_int(fld_bin_db_id);
|
||||
double time = 0;
|
||||
int page = 0;
|
||||
if (schema_thm_page) {
|
||||
time = Xof_lnki_time.Db_load_double(rdr, fld_time);
|
||||
page = Xof_lnki_page.Db_load_int(rdr, fld_page);
|
||||
}
|
||||
else {
|
||||
time = Xof_lnki_time.Db_load_int(rdr, fld_time);
|
||||
page = Xof_lnki_page.Null;
|
||||
}
|
||||
itm.Ctor(mnt_id, dir_id, fil_id, thm_id, bin_db_id, w, h, time, page, size, modified, hash);
|
||||
return true;
|
||||
}
|
||||
public static final DateAdp Modified_null = null;
|
||||
public static final String Hash_null = "", Modified_null_str = "";
|
||||
public static boolean Match_nearest(List_adp list, Fsd_thm_itm thm, boolean schema_thm_page) {
|
||||
int len = list.Count(); if (len == 0) return Bool_.N;
|
||||
list.Sort_by(Fsdb_thm_itm_sorter.Instance);
|
||||
int thm_w = thm.W(), thm_page = thm.Page(); double thm_time = thm.Time();
|
||||
Fsd_thm_itm max = null;
|
||||
for (int i = 0; i < len; ++i) {
|
||||
Fsd_thm_itm comp = (Fsd_thm_itm)list.Get_at(i);
|
||||
int comp_w = comp.W();
|
||||
int comp_page = schema_thm_page ? comp.Page() : thm_page;
|
||||
if ( thm_w == comp_w
|
||||
&& thm_time == comp.Time()
|
||||
&& thm_page == comp_page
|
||||
) { // exact match
|
||||
thm.Init_by_match(comp);
|
||||
return Bool_.Y;
|
||||
}
|
||||
if (comp_w > thm_w) max = comp;
|
||||
else if (max == null) max = comp;
|
||||
else break;
|
||||
}
|
||||
if (max == null) return Bool_.N;
|
||||
thm.Init_by_match(max);
|
||||
return Bool_.Y;
|
||||
}
|
||||
public void Rls() {
|
||||
stmt_insert = Db_stmt_.Rls(stmt_insert);
|
||||
stmt_select_by_fil_exact = Db_stmt_.Rls(stmt_select_by_fil_exact);
|
||||
stmt_select_by_fil_near = Db_stmt_.Rls(stmt_select_by_fil_near);
|
||||
}
|
||||
}
|
||||
@@ -1,58 +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.fsdb.data; import gplx.*; import gplx.fsdb.*;
|
||||
import org.junit.*;
|
||||
public class Fsd_thm_tbl_tst {
|
||||
@Before public void init() {fxt.Clear();} private Fsd_thm_tbl_fxt fxt = new Fsd_thm_tbl_fxt();
|
||||
@Test public void Basic() {
|
||||
fxt.Init_list(fxt.Make(100), fxt.Make(200), fxt.Make(400));
|
||||
fxt.Test_match_nearest_itm(fxt.Make(400), fxt.Make(400));
|
||||
fxt.Test_match_nearest_itm(fxt.Make(200), fxt.Make(200));
|
||||
fxt.Test_match_nearest_itm(fxt.Make(100), fxt.Make(100));
|
||||
fxt.Test_match_nearest_itm(fxt.Make(350), fxt.Make(400));
|
||||
fxt.Test_match_nearest_itm(fxt.Make(150), fxt.Make(200));
|
||||
fxt.Test_match_nearest_itm(fxt.Make(999), fxt.Make(400));
|
||||
}
|
||||
@Test public void Empty() {
|
||||
fxt.Init_list(); // no items
|
||||
fxt.Test_match_nearest_itm(fxt.Make(100), Fsd_thm_itm.Null);
|
||||
}
|
||||
}
|
||||
class Fsd_thm_tbl_fxt {
|
||||
private final List_adp list = List_adp_.New();
|
||||
public void Clear() {list.Clear();}
|
||||
public Fsd_thm_itm Make(int w) {
|
||||
double time = gplx.xowa.files.Xof_lnki_time.Null;
|
||||
int page = gplx.xowa.files.Xof_lnki_page.Null;
|
||||
Fsd_thm_itm rv = Fsd_thm_itm.new_();
|
||||
rv.Init_by_req(w, time, page);
|
||||
return rv;
|
||||
}
|
||||
public void Init_list(Fsd_thm_itm... ary) {list.Add_many((Object[])ary);}
|
||||
public void Test_match_nearest_itm(Fsd_thm_itm req, Fsd_thm_itm expd) {
|
||||
Fsd_thm_tbl.Match_nearest(list, req, Bool_.Y);
|
||||
if (expd == Fsd_thm_itm.Null) {
|
||||
Tfds.Eq(req.Req_w(), 0);
|
||||
}
|
||||
else {
|
||||
Tfds.Eq(expd.W(), req.W());
|
||||
Tfds.Eq(expd.Time(), req.Time());
|
||||
Tfds.Eq(expd.Page(), req.Page());
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user