diff --git a/400_xowa/src/gplx/xowa/files/Xof_wkr_mgr.java b/400_xowa/src/gplx/xowa/files/Xof_wkr_mgr.java index 01bfa7174..8d58592a4 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_wkr_mgr.java +++ b/400_xowa/src/gplx/xowa/files/Xof_wkr_mgr.java @@ -17,6 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.fsdb.*; +import gplx.xowa.files.fsdb.fs_roots.*; class Xof_wkr_mgr implements Gfo_invk { private Xow_file_mgr file_mgr; public Xof_wkr_mgr(Xow_file_mgr file_mgr) {this.file_mgr = file_mgr;} @@ -26,12 +27,10 @@ class Xof_wkr_mgr implements Gfo_invk { } private static final String Invk_get = "get"; private Xof_fsdb_mgr Get_or_new(String key) { - Xof_fsdb_mgr rv = null; - if (String_.Eq(key, "fs.dir")) - rv = new gplx.xowa.files.fsdb.fs_roots.Fs_root_fsdb_mgr(file_mgr.Wiki()); + if (String_.Eq(key, "fs.dir")) { + return Fs_root_core.New(file_mgr, file_mgr.Wiki()); + } else throw Err_.new_unhandled(key); - file_mgr.Fsdb_mgr_(rv); - return rv; } } diff --git a/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr.java b/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr.java index ad2dc9abe..40b6f332d 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr.java @@ -16,12 +16,10 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.files.fsdb; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; -import gplx.fsdb.*; import gplx.fsdb.data.*; import gplx.fsdb.meta.*; -import gplx.xowa.files.bins.*; import gplx.xowa.files.origs.*; import gplx.xowa.files.caches.*; import gplx.xowa.guis.cbks.js.*; public interface Xof_fsdb_mgr { - Xof_bin_mgr Bin_mgr(); - Fsm_mnt_mgr Mnt_mgr(); - void Init_by_wiki(Xow_wiki wiki); - void Fsdb_search_by_list(List_adp itms, Xow_wiki wiki, Xoa_page page, Xog_js_wkr js_wkr); - void Rls(); + gplx.xowa.files.bins.Xof_bin_mgr Bin_mgr(); + gplx.fsdb.meta.Fsm_mnt_mgr Mnt_mgr(); + void Init_by_wiki(Xow_wiki wiki); + void Fsdb_search_by_list(List_adp itms, Xow_wiki wiki, Xoa_page page, gplx.xowa.guis.cbks.js.Xog_js_wkr js_wkr); + void Rls(); } diff --git a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_core.java b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_core.java new file mode 100644 index 000000000..a3fac4380 --- /dev/null +++ b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_core.java @@ -0,0 +1,69 @@ +/* +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 . +*/ +package gplx.xowa.files.fsdb.fs_roots; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.xowa.files.fsdb.*; +import gplx.xowa.guis.cbks.js.*; +public class Fs_root_core implements Xof_fsdb_mgr, Gfo_invk { // reads images from file-system dir + private Xowe_wiki wiki; + private final Fs_root_mgr mgr; + public Fs_root_core(Xowe_wiki wiki) { + this.Init_by_wiki(wiki); + this.mgr = new Fs_root_mgr(wiki); + } + public gplx.xowa.files.bins.Xof_bin_mgr Bin_mgr() {throw Err_.new_unimplemented();} + public gplx.fsdb.meta.Fsm_mnt_mgr Mnt_mgr() {return null;} + public void Init_by_wiki(Xow_wiki wiki) { + this.wiki = (Xowe_wiki)wiki; + } + public void Fsdb_search_by_list(List_adp itms, Xow_wiki wiki, Xoa_page page, Xog_js_wkr js_wkr) { + int itms_len = itms.Count(); + + // NOTE: do not cache in /xowa/file b/c files will already exist in /xowa/wiki/wiki_name/file/thumb + gplx.xowa.files.caches.Xou_cache_mgr cache_mgr = wiki.App().User().User_db_mgr().Cache_mgr(); + for (int i = 0; i < itms_len; i++) { + Xof_fsdb_itm itm = (Xof_fsdb_itm)itms.Get_at(i); + if (mgr.Find_file(itm)) { + Js_img_mgr.Update_img(page, js_wkr, itm); + cache_mgr.Update(itm); + } + } + cache_mgr.Db_save(); + } + public void Rls() {} + + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk_root_dir_)) mgr.Root_dir_(To_url(m.ReadBry("v"))); + else if (ctx.Match(k, Invk_orig_dir_)) mgr.Orig_dir_(To_url(m.ReadBry("v"))); + else if (ctx.Match(k, Invk_thumb_dir_)) mgr.Thumb_dir_(To_url(m.ReadBry("v"))); + else return Gfo_invk_.Rv_unhandled; + return this; + } + private static final String Invk_root_dir_ = "root_dir_", Invk_orig_dir_ = "orig_dir_", Invk_thumb_dir_ = "thumb_dir_"; + private Io_url To_url(byte[] v) { + if (gplx.core.envs.Op_sys.Cur().Tid_is_wnt()) + v = Bry_.Replace(v, Byte_ascii.Slash, Byte_ascii.Backslash); + return gplx.core.brys.fmtrs.Bry_fmtr_eval_mgr_.Eval_url(wiki.Appe().Url_cmd_eval(), v); + } + public static Fs_root_core New(Xow_file_mgr file_mgr, Xowe_wiki wiki) { + Fs_root_core rv = new Fs_root_core(wiki); + file_mgr.Fsdb_mgr_(rv); + + file_mgr.Orig_mgr().Wkrs__del(gplx.xowa.files.origs.Xof_orig_wkr_.Tid_wmf_api); + file_mgr.Orig_mgr().Wkrs__set(new Xof_orig_wkr__fs_root(rv.mgr.Wkr())); + return rv; + } +} diff --git a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_fsdb_mgr.java b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_fsdb_mgr.java deleted file mode 100644 index 491b8cfa2..000000000 --- a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_fsdb_mgr.java +++ /dev/null @@ -1,53 +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 . -*/ -package gplx.xowa.files.fsdb.fs_roots; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.xowa.files.fsdb.*; -import gplx.core.ios.*; import gplx.core.brys.fmtrs.*; import gplx.core.envs.*; -import gplx.fsdb.*; import gplx.fsdb.data.*; import gplx.fsdb.meta.*; -import gplx.xowa.guis.cbks.js.*; import gplx.xowa.files.origs.*; import gplx.xowa.files.bins.*; import gplx.xowa.files.caches.*; -public class Fs_root_fsdb_mgr implements Xof_fsdb_mgr, Gfo_invk { // read images from file-system dir - private Xowe_wiki wiki; private Fs_root_wkr_fsdb fsdb_wkr; - public Fs_root_fsdb_mgr(Xowe_wiki wiki) {this.Init_by_wiki(wiki); fsdb_wkr = new Fs_root_wkr_fsdb(wiki);} - public void Init_by_wiki(Xow_wiki wiki) {this.wiki = (Xowe_wiki)wiki;} - public void Fsdb_search_by_list(List_adp itms, Xow_wiki wiki, Xoa_page page, Xog_js_wkr js_wkr) { - int itms_len = itms.Count(); -// Xou_cache_mgr cache_mgr = wiki.App().User().User_db_mgr().Cache_mgr(); // repo_id is 127; DATE:2015-08-23 - for (int i = 0; i < itms_len; i++) { - Xof_fsdb_itm itm = (Xof_fsdb_itm)itms.Get_at(i); - if (fsdb_wkr.Find_file(itm)) { - Js_img_mgr.Update_img(page, js_wkr, itm); -// cache_mgr.Update(itm); - } - } -// cache_mgr.Db_save(); - } - private Io_url Xto_url(byte[] v) { - if (Op_sys.Cur().Tid_is_wnt()) - v = Bry_.Replace(v, Byte_ascii.Slash, Byte_ascii.Backslash); - return Bry_fmtr_eval_mgr_.Eval_url(wiki.Appe().Url_cmd_eval(), v); - } - public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_root_dir_)) fsdb_wkr.Root_dir_(Xto_url(m.ReadBry("v"))); - else if (ctx.Match(k, Invk_orig_dir_)) fsdb_wkr.Orig_dir_(Xto_url(m.ReadBry("v"))); - else if (ctx.Match(k, Invk_thumb_dir_)) fsdb_wkr.Thumb_dir_(Xto_url(m.ReadBry("v"))); - else return Gfo_invk_.Rv_unhandled; - return this; - } private static final String Invk_root_dir_ = "root_dir_", Invk_orig_dir_ = "orig_dir_", Invk_thumb_dir_ = "thumb_dir_"; - public Xof_bin_mgr Bin_mgr() {throw Err_.new_unimplemented();} - public Fsm_mnt_mgr Mnt_mgr() {return null;} - public void Rls() {} -} diff --git a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_wkr_fsdb.java b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_mgr.java similarity index 71% rename from 400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_wkr_fsdb.java rename to 400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_mgr.java index 261a24e8f..a015e7ad6 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_wkr_fsdb.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_mgr.java @@ -18,20 +18,24 @@ along with this program. If not, see . package gplx.xowa.files.fsdb.fs_roots; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.xowa.files.fsdb.*; import gplx.core.primitives.*; import gplx.dbs.*; import gplx.dbs.cfgs.*; import gplx.xowa.files.repos.*; import gplx.fsdb.meta.*; -public class Fs_root_wkr_fsdb { - private Xowe_wiki wiki; +class Fs_root_mgr { + private final Xowe_wiki wiki; + private final Fs_root_wkr wkr = new Fs_root_wkr(); + private final Xof_img_size img_size = new Xof_img_size(); + private final String_obj_ref tmp_resize_result = String_obj_ref.null_(); private Io_url orig_dir, thumb_dir; - private Fs_root_dir orig_dir_mgr = new Fs_root_dir(); - private String_obj_ref tmp_resize_result = String_obj_ref.null_(); - private Xof_img_size img_size = new Xof_img_size(); - public Fs_root_wkr_fsdb(Xowe_wiki wiki) {this.wiki = wiki;} + public Fs_root_mgr(Xowe_wiki wiki) { + this.wiki = wiki; + } + public Fs_root_wkr Wkr() {return wkr;} public boolean Find_file(Xof_fsdb_itm fsdb_itm) { byte[] orig_ttl = fsdb_itm.Orig_ttl(); - Orig_fil_itm orig_itm = orig_dir_mgr.Get_by_ttl(orig_ttl); - if (orig_itm == Orig_fil_itm.Null) return false; - Io_url orig_url = orig_itm.Fil_url(); + Orig_fil_row orig_itm = wkr.Get_by_ttl(orig_ttl); + if (orig_itm == Orig_fil_row.Null) return false; + fsdb_itm.Change_repo(Xof_repo_tid_.Tid__local, wiki.Domain_bry()); + Io_url orig_url = orig_itm.Url(); if (fsdb_itm.File_is_orig()) { - fsdb_itm.Html_size_(orig_itm.Fil_w(), orig_itm.Fil_h()); + fsdb_itm.Html_size_(orig_itm.W(), orig_itm.H()); fsdb_itm.Html_view_url_(orig_url); fsdb_itm.Html_orig_url_(orig_url); return true; @@ -39,9 +43,9 @@ public class Fs_root_wkr_fsdb { else { String thumb_rel = orig_url.GenRelUrl_orEmpty(orig_dir); int upright_patch = wiki.File_mgr().Patch_upright(); - img_size.Html_size_calc(fsdb_itm.Lnki_exec_tid(), fsdb_itm.Lnki_w(), fsdb_itm.Lnki_h(), fsdb_itm.Lnki_type(), upright_patch, fsdb_itm.Lnki_upright(), fsdb_itm.Orig_ext().Id(), orig_itm.Fil_w(), orig_itm.Fil_h(), Xof_img_size.Thumb_width_img); + img_size.Html_size_calc(fsdb_itm.Lnki_exec_tid(), fsdb_itm.Lnki_w(), fsdb_itm.Lnki_h(), fsdb_itm.Lnki_type(), upright_patch, fsdb_itm.Lnki_upright(), fsdb_itm.Orig_ext().Id(), orig_itm.W(), orig_itm.H(), Xof_img_size.Thumb_width_img); int html_w = img_size.Html_w(), html_h = img_size.Html_h(); - String thumb_name = Int_.To_str(html_w) + orig_url.Ext(); + String thumb_name = Int_.To_str(html_w) + "." + String_.new_u8(fsdb_itm.Orig_ext().Ext_view()); Io_url thumb_url = thumb_dir.GenSubFil_ary(thumb_rel + orig_url.Info().DirSpr(), thumb_name); if (!Io_mgr.Instance.ExistsFil(thumb_url)) { if (!wiki.Appe().File_mgr().Img_mgr().Wkr_resize_img().Resize_exec(orig_url, thumb_url, html_w, html_h, fsdb_itm.Orig_ext().Id(), tmp_resize_result)) @@ -64,7 +68,7 @@ public class Fs_root_wkr_fsdb { orig_dir_mgr_init(orig_dir); } private void orig_dir_mgr_init(Io_url orig_dir) { - orig_dir_mgr.Init(orig_dir, new Orig_fil_tbl(), wiki.Appe().Usr_dlg(), wiki.Appe().File_mgr().Img_mgr().Wkr_query_img_size()); + wkr.Init(wiki.Appe().File_mgr().Img_mgr().Wkr_query_img_size(), orig_dir); } public void Thumb_dir_(Io_url v) { thumb_dir = v; diff --git a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_dir.java b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_wkr.java similarity index 53% rename from 400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_dir.java rename to 400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_wkr.java index 1ecf2f316..c040d4e80 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_dir.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_wkr.java @@ -19,77 +19,81 @@ package gplx.xowa.files.fsdb.fs_roots; import gplx.*; import gplx.xowa.*; import import gplx.core.primitives.*; import gplx.dbs.*; import gplx.dbs.cfgs.*; import gplx.gfui.*; import gplx.fsdb.meta.*; import gplx.xowa.files.imgs.*; -class Fs_root_dir { - private Gfo_usr_dlg usr_dlg; private Xof_img_wkr_query_img_size img_size_wkr; - private Io_url url; private boolean recurse = true; +class Fs_root_wkr { + private Xof_img_wkr_query_img_size img_size_wkr; + private Io_url orig_dir; private boolean recurse = true; private Orig_fil_mgr cache = new Orig_fil_mgr(), fs_fil_mgr; - private Db_conn conn; private Db_cfg_tbl cfg_tbl; private Orig_fil_tbl fil_tbl; + private Db_conn conn; private Db_cfg_tbl cfg_tbl; + private Orig_fil_tbl orig_tbl; private int fil_id_next = 0; - public void Init(Io_url url, Orig_fil_tbl fil_tbl, Gfo_usr_dlg usr_dlg, Xof_img_wkr_query_img_size img_size_wkr) { - this.url = url; - this.fil_tbl = fil_tbl; this.usr_dlg = usr_dlg; this.img_size_wkr = img_size_wkr; + public Orig_fil_tbl Orig_tbl() {return orig_tbl;} + public void Init(Xof_img_wkr_query_img_size img_size_wkr, Io_url orig_dir) { + this.img_size_wkr = img_size_wkr; + this.orig_dir = orig_dir; } - public Orig_fil_itm Get_by_ttl(byte[] lnki_ttl) { - Orig_fil_itm rv = (Orig_fil_itm)cache.Get_by_ttl(lnki_ttl); + public Orig_fil_row Get_by_ttl(byte[] lnki_ttl) { + Orig_fil_row rv = (Orig_fil_row)cache.Get_by_ttl(lnki_ttl); if (rv == null) { + // not in mem; get from db rv = Get_from_db(lnki_ttl); + // not in db; get from fsys if (rv == null) { rv = Get_from_fs(lnki_ttl); - if (rv == null) return Orig_fil_itm.Null; + if (rv == null) return Orig_fil_row.Null; } cache.Add(rv); } return rv; } - private Orig_fil_itm Get_from_db(byte[] lnki_ttl) { - if (conn == null) conn = Init_db_fil_mgr(); - Orig_fil_itm rv = fil_tbl.Select_itm(lnki_ttl); - if (rv == null) return Orig_fil_itm.Null; // not in db - return rv; + private Orig_fil_row Get_from_db(byte[] lnki_ttl) { + if (conn == null) conn = Init_orig_db(); + return orig_tbl.Select_itm_or_null(orig_dir, lnki_ttl); } - private Orig_fil_itm Get_from_fs(byte[] lnki_ttl) { + private Orig_fil_row Get_from_fs(byte[] lnki_ttl) { if (fs_fil_mgr == null) fs_fil_mgr = Init_fs_fil_mgr(); - Orig_fil_itm rv = fs_fil_mgr.Get_by_ttl(lnki_ttl); - if (rv == null) return Orig_fil_itm.Null; // not in fs + Orig_fil_row rv = fs_fil_mgr.Get_by_ttl(lnki_ttl); + if (rv == null) return Orig_fil_row.Null; // not in fs SizeAdp img_size = SizeAdp_.Zero; - if (Xof_ext_.Id_is_image(rv.Fil_ext_id())) - img_size = img_size_wkr.Exec(rv.Fil_url()); - rv.Init_by_size(++fil_id_next, img_size.Width(), img_size.Height()); - cfg_tbl.Update_int(Cfg_grp_root_dir, Cfg_key_fil_id_next, fil_id_next); - fil_tbl.Insert(rv); + if (Xof_ext_.Id_is_image(rv.Ext_id())) + img_size = img_size_wkr.Exec(rv.Url()); + rv.Init_by_fs(++fil_id_next, img_size.Width(), img_size.Height()); + cfg_tbl.Update_int(Cfg_grp_root_dir, Cfg_key_fil_id_next, fil_id_next); + String fil_orig_dir = "~{orig_dir}" + rv.Url().OwnerDir().GenRelUrl_orEmpty(orig_dir); // converts "/xowa/wiki/custom_wiki/file/orig/7/70/A.png" -> "~{orig_dir}7/70/" + orig_tbl.Insert(rv, fil_orig_dir); return rv; } private Orig_fil_mgr Init_fs_fil_mgr() { // NOTE: need to read entire dir, b/c ttl may be "A.png", but won't know which subdir Orig_fil_mgr rv = new Orig_fil_mgr(); - Io_url[] fils = Io_mgr.Instance.QueryDir_args(url).Recur_(recurse).ExecAsUrlAry(); + Io_url[] fils = Io_mgr.Instance.QueryDir_args(orig_dir).Recur_(recurse).ExecAsUrlAry(); int fils_len = fils.length; for (int i = 0; i < fils_len; i++) { Io_url fil = fils[i]; - byte[] fil_name_bry = Xto_fil_bry(fil); - Orig_fil_itm fil_itm = rv.Get_by_ttl(fil_name_bry); - if (fil_itm != Orig_fil_itm.Null) { - usr_dlg.Warn_many("", "", "file already exists: cur=~{0} new=~{1}", fil_itm.Fil_url().Raw(), fil.Raw()); + byte[] fil_name_bry = To_fil_bry(fil); + Orig_fil_row fil_itm = rv.Get_by_ttl(fil_name_bry); + if (fil_itm != Orig_fil_row.Null) { + Gfo_usr_dlg_.Instance.Warn_many("", "", "file already exists: cur=~{0} new=~{1}", fil_itm.Url().Raw(), fil.Raw()); continue; } Xof_ext ext = Xof_ext_.new_by_ttl_(fil_name_bry); - fil_itm = new Orig_fil_itm().Init_by_make(fil, fil_name_bry, ext.Id()); + fil_itm = Orig_fil_row.New_by_fs(fil, fil_name_bry, ext.Id()); rv.Add(fil_itm); } return rv; } - private Db_conn Init_db_fil_mgr() { - Io_url db_url = url.GenSubFil("^orig_regy.sqlite3"); + private Db_conn Init_orig_db() { + Io_url orig_db = orig_dir.GenSubFil("^orig_regy.sqlite3"); boolean created = false; boolean schema_is_1 = Bool_.Y; - Db_conn conn = Db_conn_bldr.Instance.Get(db_url); + Db_conn conn = Db_conn_bldr.Instance.Get(orig_db); if (conn == null) { - conn = Db_conn_bldr.Instance.New(db_url); + conn = Db_conn_bldr.Instance.New(orig_db); created = true; } cfg_tbl = new Db_cfg_tbl(conn, schema_is_1 ? "fsdb_cfg" : gplx.xowa.wikis.data.Xowd_cfg_tbl_.Tbl_name); - fil_tbl.Conn_(conn, created, schema_is_1); + orig_tbl = new Orig_fil_tbl(conn, schema_is_1); if (created) { cfg_tbl.Create_tbl(); cfg_tbl.Insert_int(Cfg_grp_root_dir, Cfg_key_fil_id_next, fil_id_next); + orig_tbl.Create_tbl(); } else { fil_id_next = cfg_tbl.Select_int(Cfg_grp_root_dir, Cfg_key_fil_id_next); @@ -98,10 +102,11 @@ class Fs_root_dir { } public void Rls() { cfg_tbl.Rls(); - fil_tbl.Rls(); + orig_tbl.Rls(); } private static final String Cfg_grp_root_dir = "xowa.root_dir", Cfg_key_fil_id_next = "fil_id_next"; - public static byte[] Xto_fil_bry(Io_url url) { + public static final String Url_orig_dir = "~{orig_dir}"; + public static byte[] To_fil_bry(Io_url url) { byte[] rv = Bry_.new_u8(url.NameAndExt()); rv = Bry_.Replace(rv, Byte_ascii.Space, Byte_ascii.Underline); rv = Bry_.Ucase__1st(rv); diff --git a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_dir_tst.java b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_wkr_tst.java similarity index 70% rename from 400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_dir_tst.java rename to 400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_wkr_tst.java index 08eddf57d..2619f6cee 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_dir_tst.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_wkr_tst.java @@ -19,12 +19,12 @@ package gplx.xowa.files.fsdb.fs_roots; import gplx.*; import gplx.xowa.*; import import org.junit.*; import gplx.dbs.*; import gplx.dbs.cfgs.*; import gplx.xowa.files.imgs.*; import gplx.fsdb.meta.*; -public class Fs_root_dir_tst { - @Before public void init() {fxt.Reset();} private Fs_root_dir_fxt fxt = new Fs_root_dir_fxt(); +public class Fs_root_wkr_tst { + @Before public void init() {fxt.Reset();} private Fs_root_wkr_fxt fxt = new Fs_root_wkr_fxt(); @Test public void Basic() { - fxt.Init_fs("mem/dir/A.png", 200, 100); - fxt.Test_get("A.png", fxt.itm_().Url_("mem/dir/A.png").Size_(200, 100)); - fxt.Test_db("A.png", fxt.itm_().Init(1, "mem/dir/A.png", 200, 100)); + fxt.Init_fs("mem/dir/7/70/A.png", 200, 100); + fxt.Test_get("A.png", fxt.itm_().Url_("mem/dir/7/70/A.png").Size_(200, 100)); + fxt.Test_db("A.png", fxt.itm_().Init(1, "mem/dir/7/70/A.png", 200, 100)); } @Test public void Recurse() { fxt.Init_fs("mem/dir/sub1/A1.png", 200, 100); @@ -36,27 +36,25 @@ public class Fs_root_dir_tst { fxt.Test_xto_fil_bry("/dir/a.png" , "A.png"); // title } } -class Fs_root_dir_fxt { - private Fs_root_dir root_dir = new Fs_root_dir(); - private Orig_fil_tbl orig_fil_tbl; +class Fs_root_wkr_fxt { + private Fs_root_wkr root_dir = new Fs_root_wkr(); private Io_url url; public void Reset() { Db_conn_bldr.Instance.Reg_default_mem(); Io_mgr.Instance.InitEngine_mem(); url = Io_url_.mem_dir_("mem/dir/"); - root_dir = new Fs_root_dir(); - orig_fil_tbl = new Orig_fil_tbl(); + root_dir = new Fs_root_wkr(); Xof_img_wkr_query_img_size img_size_wkr = new Xof_img_wkr_query_img_size_test(); - root_dir.Init(url, orig_fil_tbl, Gfo_usr_dlg_.Noop, img_size_wkr); + root_dir.Init(img_size_wkr, url); } public Orig_fil_mok itm_() {return new Orig_fil_mok();} public void Init_fs(String url, int w, int h) {Save_img(url, w, h);} public void Test_get(String name, Orig_fil_mok expd) { - Orig_fil_itm actl = root_dir.Get_by_ttl(Bry_.new_u8(name)); + Orig_fil_row actl = root_dir.Get_by_ttl(Bry_.new_u8(name)); expd.Test(actl); } public void Test_db(String ttl, Orig_fil_mok expd) { - Orig_fil_itm actl = orig_fil_tbl.Select_itm(Bry_.new_u8(ttl)); + Orig_fil_row actl = root_dir.Orig_tbl().Select_itm_or_null(url, Bry_.new_u8(ttl)); expd.Test(actl); } public static void Save_img(String url, int w, int h) { @@ -65,7 +63,7 @@ class Fs_root_dir_fxt { } public void Test_xto_fil_bry(String url_str, String expd) { Io_url url = Io_url_.new_fil_(url_str); - Tfds.Eq(expd, String_.new_u8(Fs_root_dir.Xto_fil_bry(url))); + Tfds.Eq(expd, String_.new_u8(Fs_root_wkr.To_fil_bry(url))); } } class Orig_fil_mok { @@ -83,13 +81,13 @@ class Orig_fil_mok { this.ext_id = Xof_ext_.new_by_ttl_(Bry_.new_u8(name)).Id(); return this; } - public void Test(Orig_fil_itm actl) { + public void Test(Orig_fil_row actl) { if (actl == null) Tfds.Fail("actl itm is null"); - if (w != -1) Tfds.Eq(w, actl.Fil_w()); - if (h != -1) Tfds.Eq(h, actl.Fil_h()); - if (url != null) Tfds.Eq(url, actl.Fil_url().Raw()); - if (uid != -1) Tfds.Eq(uid, actl.Fil_uid()); - if (ext_id != -1) Tfds.Eq(uid, actl.Fil_ext_id()); - if (name != null) Tfds.Eq(name, String_.new_u8(actl.Fil_name())); + if (w != -1) Tfds.Eq(w, actl.W()); + if (h != -1) Tfds.Eq(h, actl.H()); + if (url != null) Tfds.Eq(url, actl.Url().Raw()); + if (uid != -1) Tfds.Eq(uid, actl.Uid()); + if (ext_id != -1) Tfds.Eq(uid, actl.Ext_id()); + if (name != null) Tfds.Eq(name, String_.new_u8(actl.Name())); } } diff --git a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Orig_fil_itm.java b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Orig_fil_itm.java deleted file mode 100644 index 6cfbe5a85..000000000 --- a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Orig_fil_itm.java +++ /dev/null @@ -1,46 +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 . -*/ -package gplx.xowa.files.fsdb.fs_roots; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.xowa.files.fsdb.*; -public class Orig_fil_itm { - public Orig_fil_itm() {} - public Orig_fil_itm(int uid, byte[] name, int ext_id, int w, int h, byte[] dir_url) { - this.fil_uid = uid; this.fil_name = name; this.fil_ext_id = ext_id; this.fil_w = w; this.fil_h = h; this.fil_dir_url = dir_url; - } - public int Fil_uid() {return fil_uid;} private int fil_uid; - public byte[] Fil_name() {return fil_name;} private byte[] fil_name; - public int Fil_ext_id() {return fil_ext_id;} private int fil_ext_id; - public int Fil_w() {return fil_w;} private int fil_w; - public int Fil_h() {return fil_h;} private int fil_h; - public byte[] Fil_dir_url() {return fil_dir_url;} private byte[] fil_dir_url; - public Io_url Fil_url() { - if (fil_url == null) { - byte[] fil_url_bry = Bry_.Add(fil_dir_url, fil_name); - fil_url = Io_url_.new_fil_(String_.new_u8(fil_url_bry)); - } - return fil_url; - } private Io_url fil_url; - public Orig_fil_itm Init_by_make(Io_url url, byte[] name_bry, int ext_id) { - this.fil_url = url; - this.fil_name = name_bry; - this.fil_dir_url = Bry_.new_u8(url.OwnerDir().Raw()); - this.fil_ext_id = ext_id; - return this; - } - public Orig_fil_itm Init_by_size(int uid, int w, int h) {this.fil_uid = uid; this.fil_w = w; this.fil_h = h; return this;} - public static final Orig_fil_itm Null = null; -} diff --git a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Orig_fil_mgr.java b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Orig_fil_mgr.java index ced982efa..8f7a1da66 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Orig_fil_mgr.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Orig_fil_mgr.java @@ -17,8 +17,8 @@ along with this program. If not, see . */ package gplx.xowa.files.fsdb.fs_roots; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.xowa.files.fsdb.*; class Orig_fil_mgr { - private Ordered_hash hash = Ordered_hash_.New_bry(); + private final Ordered_hash hash = Ordered_hash_.New_bry(); public boolean Has(byte[] lnki_ttl) {return hash.Has(lnki_ttl);} - public Orig_fil_itm Get_by_ttl(byte[] lnki_ttl) {return (Orig_fil_itm)hash.Get_by(lnki_ttl);} - public void Add(Orig_fil_itm fil) {hash.Add(fil.Fil_name(), fil);} + public Orig_fil_row Get_by_ttl(byte[] lnki_ttl) {return (Orig_fil_row)hash.Get_by(lnki_ttl);} + public void Add(Orig_fil_row fil) {hash.Add(fil.Name(), fil);} } diff --git a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Orig_fil_row.java b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Orig_fil_row.java new file mode 100644 index 000000000..8b030cc4a --- /dev/null +++ b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Orig_fil_row.java @@ -0,0 +1,47 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.files.fsdb.fs_roots; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.xowa.files.fsdb.*; +class Orig_fil_row { + Orig_fil_row(int uid, byte[] name, int ext_id, int w, int h, Io_url url) { + this.uid = uid; + this.name = name; + this.ext_id = ext_id; + this.w = w; + this.h = h; + this.url = url; + } + public int Uid() {return uid;} private int uid; + public byte[] Name() {return name;} private final byte[] name; + public int Ext_id() {return ext_id;} private final int ext_id; + public int W() {return w;} private int w; + public int H() {return h;} private int h; + public Io_url Url() {return url;} private final Io_url url; + + public Orig_fil_row Init_by_fs(int uid, int w, int h) { + this.uid = uid; this.w = w; this.h = h; + return this; + } + + public static final Orig_fil_row Null = null; + public static Orig_fil_row New_by_db(int uid, byte[] name, int ext_id, int w, int h, Io_url dir) { + return new Orig_fil_row(uid, name, ext_id, w, h, dir.GenSubFil(String_.new_u8(name))); + } + public static Orig_fil_row New_by_fs(Io_url url, byte[] name, int ext_id) { + return new Orig_fil_row(0, name, ext_id, 0, 0, url); + } +} diff --git a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Orig_fil_tbl.java b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Orig_fil_tbl.java index 0295fad90..0678dd135 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Orig_fil_tbl.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Orig_fil_tbl.java @@ -17,65 +17,63 @@ along with this program. If not, see . */ package gplx.xowa.files.fsdb.fs_roots; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.xowa.files.fsdb.*; import gplx.dbs.*; -public class Orig_fil_tbl implements Rls_able { - private String tbl_name = "orig_fil"; private final Dbmeta_fld_list flds = new Dbmeta_fld_list(); +class Orig_fil_tbl implements Rls_able { + private final Db_conn conn; + private final Dbmeta_fld_list flds = new Dbmeta_fld_list(); + private String tbl_name = "orig_fil"; private String fld_uid, fld_name, fld_ext_id, fld_w, fld_h, fld_dir_url; - private Db_conn conn; private Db_stmt stmt_insert, stmt_select; - public void Conn_(Db_conn new_conn, boolean created, boolean schema_is_1) { - this.conn = new_conn; flds.Clear(); - String fld_prefix = ""; - if (schema_is_1) { - fld_prefix = "fil_"; - } + private Db_stmt stmt_insert, stmt_select; + public Orig_fil_tbl(Db_conn conn, boolean schema_is_1) { + this.conn = conn; conn.Rls_reg(this); + String fld_prefix = schema_is_1 ? "fil_" : ""; fld_uid = flds.Add_int(fld_prefix + "uid"); fld_name = flds.Add_str(fld_prefix + "name", 1024); fld_ext_id = flds.Add_int(fld_prefix + "ext_id"); fld_w = flds.Add_int(fld_prefix + "w"); fld_h = flds.Add_int(fld_prefix + "h"); fld_dir_url = flds.Add_str(fld_prefix + "dir_url", 1024); // NOTE: don't put dir in separate table; note that entire root_dir_wkr is not built to scale due to need for recursively loading all files - if (created) { - Dbmeta_tbl_itm meta = Dbmeta_tbl_itm.New(tbl_name, flds - , Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "main", fld_name) - ); - conn.Meta_tbl_create(meta); - } - stmt_insert = stmt_select = null; - conn.Rls_reg(this); + } + public void Create_tbl() { + conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds + , Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "main", fld_name) + )); } public void Rls() { stmt_insert = Db_stmt_.Rls(stmt_insert); stmt_select = Db_stmt_.Rls(stmt_select); } - public Orig_fil_itm Select_itm(byte[] ttl) { + public Orig_fil_row Select_itm_or_null(Io_url dir, byte[] ttl) { if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_name); - Orig_fil_itm rv = Orig_fil_itm.Null; Db_rdr rdr = stmt_select.Clear().Crt_bry_as_str(fld_name, ttl).Exec_select__rls_manual(); - try { - if (rdr.Move_next()) - rv = Load_itm(rdr); - return rv; - } + try {return rdr.Move_next() ? Load_itm(rdr, dir) : Orig_fil_row.Null;} finally {rdr.Rls();} } - private Orig_fil_itm Load_itm(Db_rdr rdr) { - return new Orig_fil_itm + private Orig_fil_row Load_itm(Db_rdr rdr, Io_url orig_root) { + String name = rdr.Read_str(fld_name); + String fil_orig_dir = rdr.Read_str(fld_dir_url); + Io_url dir = String_.Has_at_bgn(fil_orig_dir, Fs_root_wkr.Url_orig_dir) + // swap out orig_dir; EX: "~{orig_dir}7/70/" -> "/xowa/wiki/custom_wiki/file/orig/7/70/" + ? Io_url_.new_dir_(orig_root.Raw() + String_.Mid(fil_orig_dir, String_.Len(Fs_root_wkr.Url_orig_dir))) + // load literally; EX: "/xowa/wiki/custom_wiki/file/orig/7/70/" + : Io_url_.new_dir_(fil_orig_dir); + return Orig_fil_row.New_by_db ( rdr.Read_int(fld_uid) - , rdr.Read_bry_by_str(fld_name) + , Bry_.new_u8(name) , rdr.Read_int(fld_ext_id) , rdr.Read_int(fld_w) , rdr.Read_int(fld_h) - , rdr.Read_bry_by_str(fld_dir_url) + , dir ); } - public void Insert(Orig_fil_itm fil_itm) { + public void Insert(Orig_fil_row row, String dir) { if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds); stmt_insert.Clear() - .Val_int(fld_uid, fil_itm.Fil_uid()) - .Val_bry_as_str(fld_name, fil_itm.Fil_name()) - .Val_int(fld_ext_id, fil_itm.Fil_ext_id()) - .Val_int(fld_w, fil_itm.Fil_w()) - .Val_int(fld_h, fil_itm.Fil_h()) - .Val_bry_as_str(fld_dir_url, fil_itm.Fil_dir_url()) + .Val_int (fld_uid , row.Uid()) + .Val_bry_as_str(fld_name , row.Name()) + .Val_int (fld_ext_id , row.Ext_id()) + .Val_int (fld_w , row.W()) + .Val_int (fld_h , row.H()) + .Val_str (fld_dir_url , dir) .Exec_insert(); } } diff --git a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Xof_orig_wkr__fs_root.java b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Xof_orig_wkr__fs_root.java new file mode 100644 index 000000000..3f9d5282d --- /dev/null +++ b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Xof_orig_wkr__fs_root.java @@ -0,0 +1,43 @@ +/* +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 . +*/ +package gplx.xowa.files.fsdb.fs_roots; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.xowa.files.fsdb.*; +import gplx.dbs.*; +import gplx.xowa.files.origs.*; +class Xof_orig_wkr__fs_root implements Xof_orig_wkr { + private final Fs_root_wkr wkr; + public Xof_orig_wkr__fs_root(Fs_root_wkr wkr) {this.wkr = wkr;} + public byte Tid() {return Xof_orig_wkr_.Tid_fs_root;} + public void Find_by_list(Ordered_hash rv, List_adp itms) {Xof_orig_wkr_.Find_by_list(this, rv, itms);} + public Xof_orig_itm Find_as_itm(byte[] ttl, int list_idx, int list_len) { + Orig_fil_row orig_row = wkr.Get_by_ttl(ttl); + if (orig_row == Orig_fil_row.Null) return Xof_orig_itm.Null; + + Xof_orig_itm rv = new Xof_orig_itm + ( gplx.xowa.files.repos.Xof_repo_tid_.Tid__local + , ttl + , Xof_ext_.new_by_ttl_(ttl).Id() + , orig_row.W() + , orig_row.H() + , null + ); + return rv; + } + public boolean Add_orig(byte repo, byte[] page, int ext_id, int w, int h, byte[] redirect) {return false;} + public void Db_txn_save() {} + public void Db_rls() {} +} diff --git a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_tbl.java b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_tbl.java index 583a6348d..3e319debc 100644 --- a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_tbl.java +++ b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_tbl.java @@ -43,14 +43,9 @@ public class Xof_orig_tbl implements Db_tbl { public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, "main", fld_ttl)));} public void Select_by_list(Ordered_hash rv, List_adp itms) {select_in_wkr.Init(rv, itms).Select_in(Cancelable_.Never, conn, 0, itms.Count());} public Xof_orig_itm Select_itm(byte[] ttl) { - Xof_orig_itm rv = Xof_orig_itm.Null; Db_rdr rdr = conn.Stmt_select(tbl_name, flds, fld_ttl).Clear().Crt_bry_as_str(fld_ttl, ttl).Exec_select__rls_auto(); - try { - if (rdr.Move_next()) - rv = Load_by_rdr(rdr); - } + try {return rdr.Move_next() ? Load_by_rdr(rdr) : Xof_orig_itm.Null;} finally {rdr.Rls();} - return rv; } public boolean Exists__repo_ttl(byte repo, byte[] ttl) { Db_rdr rdr = conn.Stmt_select(tbl_name, flds, fld_repo, fld_ttl).Crt_byte(fld_repo, repo).Crt_bry_as_str(fld_ttl, ttl).Exec_select__rls_auto(); diff --git a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_wkr_.java b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_wkr_.java index 29f4f209f..de35868f2 100644 --- a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_wkr_.java +++ b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_wkr_.java @@ -36,5 +36,6 @@ public class Xof_orig_wkr_ { , Tid_xowa_meta = 3 , Tid_xowa_img_links = 4 , Tid_mock = 5 + , Tid_fs_root = 6 ; }