/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012-2017 gnosygnu@gmail.com
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
or alternatively under the terms of the Apache License Version 2.0.
You may use XOWA according to either of these licenses as is most appropriate
for your project on a case-by-case basis.
The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.addons.bldrs.exports.splits; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.exports.*;
import gplx.dbs.*; import gplx.xowa.wikis.data.tbls.*;
import gplx.xowa.addons.bldrs.exports.splits.mgrs.*; import gplx.xowa.addons.bldrs.exports.splits.rslts.*;
class Split_mgr {
public void Exec(Xow_wiki wiki, Split_cfg cfg) {
// init
Split_ns_itm[] ns_itms = cfg.Ns_itms();
Split_wkr[] wkrs = new Split_wkr[]
{ new gplx.xowa.addons.bldrs.exports.splits.srchs.Split_wkr__srch()
, new gplx.xowa.addons.bldrs.exports.splits.htmls.Split_wkr__html()
, new gplx.xowa.addons.bldrs.exports.splits.pages.Split_wkr__page() // NOTE: page needs to follow html b/c of trg_db_id
, new gplx.xowa.addons.bldrs.exports.splits.files.Split_wkr__file()
, new gplx.xowa.addons.bldrs.exports.splits.rndms.Split_wkr__rndm()
};
// init ctx
Io_url split_root = wiki.Fsys_mgr().Root_dir().GenSubDir_nest("tmp", "split");
Io_mgr.Instance.DeleteDirDeep(split_root);
Io_mgr.Instance.CreateDirIfAbsent(split_root);
Db_conn wkr_conn = Db_conn_bldr.Instance.Get_or_autocreate(true, split_root.GenSubFil("xowa.split.sqlite3"));
Split_ctx ctx = new Split_ctx(cfg, wiki, wkrs, ns_itms, wkr_conn);
ctx.Trg_db__make(-1);
new Split_mgr_init().Init(ctx, ctx.Wkr_conn(), wiki.Data__core_mgr().Tbl__page().Conn());
for (Split_wkr wkr : wkrs) {
wkr.Split__init(ctx, wiki, wkr_conn);
wkr.Split__trg__1st__new(ctx, ctx.Trg_conn());
}
ctx.Trg_db__null();
// split by ns
List_adp page_list = List_adp_.New();
Split_page_loader loader = new Split_page_loader(wiki, cfg.Loader_rows());
for (Split_ns_itm ns_itm : ns_itms) {
int ns_id = ns_itm.Ns_id();
loader.Init_ns(ns_id);
ctx.Trg_ns_(ns_id);
while (true) {
ctx.Trg_db__assert(ns_id); // new db will be needed when moving between ns; EX: ns.000 goes into one db; ns.004 goes into another
boolean reading = loader.Load_pages(ctx, page_list, wkrs, ns_id);
Split_pages(ctx, page_list, wkrs, ns_id);
if (!reading) {// no more rows; ns is done; stop loop and go to next ns;
ctx.Trg_db__completed();
break;
}
}
}
// cleanup
loader.Rls();
ctx.Term();
for (Split_wkr wkr : wkrs)
wkr.Split__term(ctx);
}
private void Split_pages(Split_ctx ctx, List_adp page_list, Split_wkr[] wkrs, int ns_id) {
Split_rslt_mgr rslt_mgr = ctx.Rslt_mgr();
int len = page_list.Len();
for (int i = 0; i < len; ++i) {
ctx.Trg_db__assert(ns_id); // new db may be needed; EX: 10,000 will be read, and 1st 100 needs 1 db; next 100 needs another db
Xowd_page_itm page = (Xowd_page_itm)page_list.Get_at(i);
int page_id = page.Id();
for (Split_wkr wkr : wkrs)
wkr.Split__exec(ctx, rslt_mgr, page, page_id);
}
}
}