mirror of
https://github.com/gnosygnu/xowa.git
synced 2026-03-02 03:49:30 +00:00
'v3.8.5.1'
This commit is contained in:
@@ -32,9 +32,15 @@ public class Imglnk_reg_tbl implements Db_tbl {
|
||||
}
|
||||
public Db_conn Conn() {return conn;}
|
||||
public String Tbl_name() {return tbl_name;}
|
||||
public String Fld__img_src() {return fld__img_src;}
|
||||
public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds));}
|
||||
public void Create_idx__src_ttl() {conn.Meta_idx_create(tbl_name, fld__img_src, fld__img_src, fld__img_repo);}
|
||||
public void Create_idx__trg_ttl() {conn.Meta_idx_create(tbl_name, fld__img_trg, fld__img_trg, fld__img_repo);}
|
||||
public Db_stmt Select_by_ttl_stmt() {
|
||||
if (select_by_ttl_stmt == null)
|
||||
select_by_ttl_stmt = conn.Stmt_select(tbl_name, flds, fld__img_src);
|
||||
return select_by_ttl_stmt;
|
||||
} private Db_stmt select_by_ttl_stmt;
|
||||
public void Insert(Db_conn conn, byte repo_id, Xowe_wiki wiki) {
|
||||
String repo_id_str = Byte_.To_str(repo_id);
|
||||
Db_attach_mgr attach_mgr = new Db_attach_mgr(conn);
|
||||
@@ -53,17 +59,20 @@ public class Imglnk_reg_tbl implements Db_tbl {
|
||||
);
|
||||
attach_mgr.Exec_sql_w_msg("imglnk_reg.insert.redirect: repo=" + repo_id_str, sql);
|
||||
|
||||
attach_mgr.Conn_links_(new Db_attach_itm("page_db", wiki.Data__core_mgr().Db__core().Tbl__page().Conn()));
|
||||
Xob_db_file image_db = Xob_db_file.New__wiki_image(wiki.Fsys_mgr().Root_dir());
|
||||
attach_mgr.Conn_links_(new Db_attach_itm("image_db", image_db.Conn()));
|
||||
sql = String_.Concat_lines_nl_skip_last // ANSI.Y
|
||||
( "INSERT INTO imglnk_reg (img_src, img_trg, img_repo, img_count)"
|
||||
, "SELECT ilt.img_name, ilt.img_name, " + repo_id_str + ", Count(ilt.img_name)"
|
||||
, "FROM imglnk_tmp ilt"
|
||||
, " JOIN <page_db>page p ON p.page_namespace = 6 AND p.page_title = ilt.img_name"
|
||||
, " JOIN <image_db>image i ON i.img_name = ilt.img_name"
|
||||
, " LEFT JOIN imglnk_reg il ON il.img_src = ilt.img_name"
|
||||
, "WHERE il.img_src IS NULL"
|
||||
, "GROUP BY ilt.img_name"
|
||||
);
|
||||
attach_mgr.Exec_sql_w_msg("imglnk_reg.insert.direct: repo=" + repo_id_str, sql);
|
||||
}
|
||||
public void Rls() {}
|
||||
public void Rls() {
|
||||
select_by_ttl_stmt = Db_stmt_.Rls(select_by_ttl_stmt);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,17 +16,61 @@ 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.addons.bldrs.wmdumps.imglinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.wmdumps.*;
|
||||
import gplx.xowa.files.origs.*;
|
||||
import gplx.dbs.*; import gplx.xowa.bldrs.*;
|
||||
import gplx.xowa.files.origs.*; import gplx.xowa.files.repos.*;
|
||||
public class Xof_orig_wkr__img_links implements Xof_orig_wkr {
|
||||
private final Ordered_hash hash = Ordered_hash_.New_bry();
|
||||
private final Hash_adp_bry hash = Hash_adp_bry.cs();
|
||||
private Db_conn imglnk_conn;
|
||||
public Xof_orig_wkr__img_links(Xowe_wiki wiki) {
|
||||
this.wiki = wiki;
|
||||
}
|
||||
public byte Tid() {return Xof_orig_wkr_.Tid_xowa_img_links;}
|
||||
public Xof_orig_itm Find_as_itm(byte[] ttl, int list_idx, int list_len) {return (Xof_orig_itm)hash.Get_by(ttl);}
|
||||
public Xof_orig_itm Find_as_itm(byte[] ttl, int list_idx, int list_len) {
|
||||
Xof_orig_itm rv = (Xof_orig_itm)hash.Get_by(ttl);
|
||||
if (rv == Missing) return Xof_orig_itm.Null;
|
||||
else if (rv == null) rv = Load_from_db(ttl);
|
||||
return rv == Missing ? Xof_orig_itm.Null : rv;
|
||||
}
|
||||
public void Find_by_list(Ordered_hash rv, List_adp itms) {throw Err_.new_unimplemented();}
|
||||
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() {}
|
||||
|
||||
public Xowe_wiki Wiki() {return wiki;} private final Xowe_wiki wiki;
|
||||
public Imglnk_reg_tbl Tbl__imglnk_reg() {
|
||||
if (tbl__imglnk_reg == null)
|
||||
this.tbl__imglnk_reg = new Imglnk_reg_tbl(imglnk_conn);
|
||||
return tbl__imglnk_reg;
|
||||
} private Imglnk_reg_tbl tbl__imglnk_reg;
|
||||
public Db_stmt Stmt__image__select(byte repo, Xowe_wiki wiki) {
|
||||
Db_stmt rv = stmt__image__select[repo];
|
||||
if (rv == null) {
|
||||
rv = Make__stmt__image__select(repo, wiki);
|
||||
stmt__image__select[repo] = rv;
|
||||
}
|
||||
return rv;
|
||||
} private Db_stmt[] stmt__image__select = new Db_stmt[2];
|
||||
private Db_stmt Make__stmt__image__select(byte repo, Xowe_wiki wiki) {
|
||||
Xob_db_file image_db = Xob_db_file.New__wiki_image(wiki.Fsys_mgr().Root_dir());
|
||||
return image_db.Conn().Stmt_select
|
||||
( "image"
|
||||
, String_.Ary("img_media_type", "img_minor_mime", "img_size", "img_width", "img_height", "img_bits", "img_ext_id", "img_timestamp")
|
||||
, String_.Ary("img_name")
|
||||
);
|
||||
}
|
||||
public void Add_by_db(Xof_orig_itm itm) {
|
||||
hash.Add(itm.Ttl(), itm);
|
||||
}
|
||||
private Xof_orig_itm Load_from_db(byte[] ttl) {
|
||||
if (imglnk_conn == null)
|
||||
imglnk_conn = Xob_db_file.New__img_link(wiki).Conn();
|
||||
Xof_orig_itm rv = Xof_orig_wkr__img_links_.Load_itm(this, imglnk_conn, wiki, ttl);
|
||||
if (rv == Xof_orig_itm.Null)
|
||||
rv = Missing;
|
||||
synchronized (hash) { // LOCK:used by multiple threads in xomp
|
||||
hash.Add(ttl, rv);
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
private static final Xof_orig_itm Missing = new Xof_orig_itm(Byte_.Max_value_127, Bry_.Empty, -1, -1, -1, Bry_.Empty);
|
||||
}
|
||||
|
||||
@@ -20,16 +20,46 @@ import gplx.dbs.*;
|
||||
import gplx.xowa.bldrs.*;
|
||||
import gplx.xowa.files.repos.*; import gplx.xowa.files.origs.*;
|
||||
public class Xof_orig_wkr__img_links_ {
|
||||
public static Xof_orig_wkr__img_links Load_all(Xowe_wiki wiki) {
|
||||
Xof_orig_wkr__img_links rv = new Xof_orig_wkr__img_links();
|
||||
|
||||
public static void Load_all(Xof_orig_wkr__img_links wkr) {
|
||||
Xowe_wiki wiki = wkr.Wiki();
|
||||
Db_conn conn = Xob_db_file.New__img_link(wiki).Conn();
|
||||
Load_by_wiki(rv, conn, Xof_repo_itm_.Repo_local , wiki);
|
||||
Load_by_wiki(rv, conn, Xof_repo_itm_.Repo_remote, wiki.Appe().Wiki_mgr().Wiki_commons());
|
||||
|
||||
return rv;
|
||||
Load_all_by_wiki(wkr, conn, Xof_repo_itm_.Repo_local , wiki);
|
||||
Load_all_by_wiki(wkr, conn, Xof_repo_itm_.Repo_remote, wiki.Appe().Wiki_mgr().Wiki_commons());
|
||||
}
|
||||
private static void Load_by_wiki(Xof_orig_wkr__img_links rv, Db_conn conn, byte repo_id, Xowe_wiki wiki) {
|
||||
public static Xof_orig_itm Load_itm(Xof_orig_wkr__img_links wkr, Db_conn conn, Xowe_wiki wiki, byte[] ttl) {
|
||||
Imglnk_reg_tbl imglnk_reg_tbl = wkr.Tbl__imglnk_reg();
|
||||
Db_rdr rdr = imglnk_reg_tbl.Select_by_ttl_stmt().Clear().Crt_bry_as_str("img_src", ttl).Exec_select__rls_manual();
|
||||
byte img_repo = Byte_.Max_value_127;
|
||||
byte[] img_trg = null;
|
||||
try {
|
||||
if (rdr.Move_next()) {
|
||||
img_repo = rdr.Read_byte("img_repo");
|
||||
img_trg = rdr.Read_bry_by_str("img_trg");
|
||||
}
|
||||
else // ttl missing; EX:</*_File:Chehov_v_serpuhove11.JPG; DATE:2016-08-10
|
||||
return Xof_orig_itm.Null;
|
||||
} finally {rdr.Rls();}
|
||||
Xowe_wiki image_wiki = img_repo == Xof_repo_itm_.Repo_local ? wiki : wiki.Appe().Wiki_mgr().Wiki_commons();
|
||||
return Load_itm_by_wiki(wkr, conn, image_wiki, img_repo, ttl, img_trg);
|
||||
}
|
||||
private static Xof_orig_itm Load_itm_by_wiki(Xof_orig_wkr__img_links wkr, Db_conn conn, Xowe_wiki wiki, byte repo_id, byte[] img_src, byte[] img_trg) {
|
||||
Db_stmt stmt = wkr.Stmt__image__select(repo_id, wiki);
|
||||
Db_rdr rdr = stmt.Clear().Crt_bry_as_str("img_name", img_trg).Exec_select__rls_manual();
|
||||
try {
|
||||
return rdr.Move_next()
|
||||
? new Xof_orig_itm
|
||||
( repo_id
|
||||
, img_trg
|
||||
, rdr.Read_int("img_ext_id")
|
||||
, rdr.Read_int("img_width")
|
||||
, rdr.Read_int("img_height")
|
||||
, img_src
|
||||
)
|
||||
: Xof_orig_itm.Null;
|
||||
} finally {rdr.Rls();}
|
||||
}
|
||||
|
||||
private static void Load_all_by_wiki(Xof_orig_wkr__img_links rv, Db_conn conn, byte repo_id, Xowe_wiki wiki) {
|
||||
String sql = String_.Concat_lines_nl_skip_last // ANSI.Y
|
||||
( "SELECT ilr.img_repo, ilr.img_src, i.img_media_type, i.img_minor_mime, i.img_size, i.img_width, i.img_height, i.img_bits, i.img_ext_id, i.img_timestamp, ilr.img_trg AS img_redirect"
|
||||
, "FROM imglnk_reg ilr"
|
||||
|
||||
Reference in New Issue
Block a user