Personal_wikis: Support creation / editing of categories

pull/620/head
gnosygnu 7 years ago
parent 935dda389a
commit dd6b3cabed

@ -177,7 +177,7 @@ public class Xowe_wiki implements Xow_wiki, Gfo_invk, Gfo_evt_itm {
public void Init_by_wiki() {Init_assert();}
public Xowe_wiki Init_assert() {if (init_needed) Init_wiki(app.Usere()); return this;}
public void Init_db_mgr() {
Io_url core_db_url = gplx.xowa.wikis.data.Xow_db_file__core_.Find_core_fil(this);
Io_url core_db_url = gplx.xowa.wikis.data.Xow_db_file__core_.Find_core_fil_or_null(this);
if (core_db_url == null) {
tdb_fsys_mgr.Scan_dirs();
}

@ -23,4 +23,12 @@ public class Xoa_ctg_mgr {
public static final byte Hidden_n = Byte_.Zero, Hidden_y = (byte)1;
public static final String Html__cls__str = "CategoryTreeLabel CategoryTreeLabelNs14 CategoryTreeLabelCategory";
public static final byte[] Html__cls__bry = Bry_.new_a7(Html__cls__str);
public static byte To_tid_by_ns(int ns) {
switch (ns) {
case gplx.xowa.wikis.nss.Xow_ns_.Tid__category: return Tid__subc;
case gplx.xowa.wikis.nss.Xow_ns_.Tid__file : return Tid__file;
default : return Tid__page;
}
}
}

@ -24,13 +24,13 @@ public class Xodb_cat_link_tbl implements Db_tbl {
private Db_stmt stmt_insert;
public Xodb_cat_link_tbl(Db_conn conn) {
this.conn = conn;
this.tbl_name = "cat_link";
this.fld__from = flds.Add_int ("cl_from");
this.fld__to_id = flds.Add_int ("cl_to_id");
this.fld__type_id = flds.Add_byte ("cl_type_id");
this.tbl_name = TBL_NAME;
this.fld__from = flds.Add_int ("cl_from"); // page_id
this.fld__to_id = flds.Add_int ("cl_to_id"); // cat_id
this.fld__type_id = flds.Add_byte ("cl_type_id"); // page,file,subc
this.fld__timestamp_unix = flds.Add_long ("cl_timestamp_unix");
this.fld__sortkey = flds.Add_bry ("cl_sortkey");
this.fld__sortkey_prefix = flds.Add_str ("cl_sortkey_prefix", 255);
this.fld__sortkey = flds.Add_bry ("cl_sortkey"); // uca key
this.fld__sortkey_prefix = flds.Add_str (FLD__cl_sortkey_prefix, 255); // page_title; needed for sorting under letter on catpage
conn.Rls_reg(this);
}
public Db_conn Conn() {return conn;} private final Db_conn conn;
@ -50,9 +50,15 @@ public class Xodb_cat_link_tbl implements Db_tbl {
.Val_bry_as_str(fld__sortkey_prefix , sortkey_prefix)
.Exec_insert();
}
public void Delete_by_page_id(int page_id) {
conn.Stmt_delete(tbl_name, fld__from)
.Crt_int(fld__from, page_id)
.Exec_delete();
}
public void Rls() {
stmt_insert = Db_stmt_.Rls(stmt_insert);
}
public static final String TBL_NAME = "cat_link", FLD__cl_sortkey_prefix = "cl_sortkey_prefix";
}
/*
NOTE_1: categorylinks row size: 34 + 20 + 12 + (cat_sortkey.length * 2)
@ -63,9 +69,9 @@ variable_data length : cat_sortkey.length * 2 sortkey is used for row and cl_mai
Note the following
. ints are 4 bytes
. tinyint is assumed to be 4 bytes (should be 1, but sqlite only has one numeric datatype, so import all 4?)
. tinyint is assumed to be 4 bytes (should be 1, but sqlite only has one numeric datatype, so using all 4?)
. varchar(14) is assumed to be 14 bytes (should be 15? +1 for length of varchar?)
. calculations work out "too well". comparing 4 databases gets +/- .25 bytes per row. however
.. - bytes should not be possible
.. +.25 bytes is too low (18 MB out of 5.5 GB).*; there must be other bytes used for page breaks / fragmentation
.. +.25 bytes is too low (18 MB out of 5.5 GB); there must be other bytes used for page breaks / fragmentation
*/

@ -17,63 +17,98 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.wikis.ctgs.edits; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*;
import gplx.dbs.*;
import gplx.xowa.parsers.*;
import gplx.xowa.addons.wikis.ctgs.dbs.*;
import gplx.xowa.wikis.data.tbls.*;
import gplx.xowa.parsers.*; import gplx.xowa.wikis.pages.*;
import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.wikis.domains.*;
import gplx.xowa.addons.wikis.ctgs.dbs.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.langs.*;
import gplx.xowa.addons.wikis.directorys.specials.items.bldrs.*;
public class Xoctg_edit_mgr {
public void Update(Xowe_wiki wiki, byte[] ttl_bry, int page_id, byte[] old_text, byte[] new_text) {
// // get page
// Xoa_ttl ttl = wiki.Ttl_parse(ttl_bry);
// Xoae_page wpg = Xoae_page.New_edit(wiki, ttl);
// wpg.Db().Page().Id_(page_id);
// wpg.Db().Text().Text_bry_(old_text);
//
// // parse page
// Xop_ctx pctx = wiki.Parser_mgr().Ctx().Clear_all();
// wiki.Parser_mgr().Parse(wpg, true);
//
// // get cat_link_db
// Xoax_ctg_addon cat_addon = Xoax_ctg_addon.Get(wiki);
// Xowd_cat_core_tbl cat_core_tbl = Xodb_cat_db_.Get_cat_core_or_fail(wiki.Data__core_mgr());
//
// // get cat_link_conn
// Xowd_page_itm tmp_page = new Xowd_page_itm();
// wiki.Data__core_mgr().Db__core().Tbl__page().Select_by_id(tmp_page, page_id);
// Db_conn cat_link_conn = wiki.Data__core_mgr().Props().Layout_text().Tid_is_lot()
// ? wiki.Data__core_mgr().Dbs__get_by_id_or_fail(tmp_page.Cat_db_id()).Conn()
// : wiki.Data__core_mgr().Db__core().Conn();
// Xowd_cat_link_tbl cat_link_tbl = new Xowd_cat_link_tbl(cat_link_conn, Bool_.N);
//
// // delete old
// int cat_len = wpg.Wtxt().Ctgs__len();
// for (int i = 0; i < cat_len; i++) {
// Xoa_ttl ctg_ttl = wpg.Wtxt().Ctgs__get_at(i);
// wiki.Data__core_mgr().Db__core().Tbl__page().Select_by_ttl(tmp_page, ctg_ttl);
//// int ctg_id = tmp_page.Cat_db_id();
//// Object data = cat_core_tbl.Select_by_cat_id(ctg_id);
//// data.cat_pages--
//// cat_core_Tbl.Save(data);
// }
//// cat_link_tbl.Delete_by_page_id(page_id);
//
// // insert new
// wpg.Db().Text().Text_bry_(new_text);
// wiki.Parser_mgr().Parse(wpg, true);
//
// cat_len = wpg.Wtxt().Ctgs__len();
// Xodb_wiki_db wiki_db_mgr = Xodb_wiki_db.Make(Xodb_wiki_db_tid.Tid__core, wiki.Data__core_mgr().Db__core().Url());
// for (int i = 0; i < cat_len; i++) {
// Xoa_ttl ctg_ttl = wpg.Wtxt().Ctgs__get_at(i);
// boolean exists = wiki.Data__core_mgr().Db__core().Tbl__page().Select_by_ttl(tmp_page, ctg_ttl);
// int ctg_id = tmp_page.Cat_db_id();
// if (!exists) {
// ctg_id = Xopg_db_mgr.Create(wiki_db_mgr, gplx.xowa.wikis.nss.Xow_ns_.Tid__category, ctg_ttl.Page_db(), Bry_.Empty);
// }
//// Object data = cat_core_tbl.Select_by_cat_id(ctg_id);
//// data.cat_pages++
//// cat_core_Tbl.Save(data);
//// cat_link_tbl.Insert_by_page_id(page_id, ctg_id);
// }
public static void Update(Xowe_wiki wiki, byte[] ttl_bry, int page_id, byte[] old_text, byte[] new_text) {
// only apply to home or other wiki
if (!( wiki.Domain_tid() == Xow_domain_tid_.Tid__other
|| wiki.Domain_tid() == Xow_domain_tid_.Tid__home))
return;
// get page
Xoa_ttl ttl = wiki.Ttl_parse(ttl_bry);
int ns_id = ttl.Ns().Id();
Xoae_page wpg = Xoae_page.New_edit(wiki, ttl);
wpg.Db().Page().Id_(page_id);
// get page_tbl
Xow_db_mgr db_mgr = wiki.Data__core_mgr();
Xowd_page_tbl page_tbl = db_mgr.Db__core().Tbl__page();
// get cat_core_tbl
Xowd_cat_core_tbl cat_core_tbl = Xodb_cat_db_.Get_cat_core_or_fail(db_mgr);
// get cat_link_tbl
Xodb_cat_link_tbl cat_link_tbl = new Xodb_cat_link_tbl(cat_core_tbl.Conn());
Xowd_page_itm tmp_page = new Xowd_page_itm();
db_mgr.Tbl__page().Select_by_id(tmp_page, page_id);
// parse old page
wiki.Parser_mgr().Ctx().Clear_all();
wpg.Db().Text().Text_bry_(old_text);
wiki.Parser_mgr().Parse(wpg, true);
wiki.Html_mgr().Page_wtr_mgr().Gen(wpg, Xopg_page_.Tid_read); // need to write html to fill Wtxt().Ctgs
// cat_core:update; for each category, subtract one from count_page, count_file, or count_subcs
int cat_len = wpg.Wtxt().Ctgs__len();
for (int i = 0; i < cat_len; i++) {
// get cat_core itm for sub_cat
Xoa_ttl sub_ttl = wpg.Wtxt().Ctgs__get_at(i);
page_tbl.Select_by_ttl(tmp_page, sub_ttl);
Xowd_category_itm sub_core_itm = cat_core_tbl.Select(tmp_page.Id());
// subtract one and save it
sub_core_itm.Adjust(ns_id, -1);
cat_core_tbl.Update(sub_core_itm);
}
// cat_link:delete
cat_link_tbl.Delete_by_page_id(page_id);
// parse new page
wiki.Parser_mgr().Ctx().Clear_all();
wpg.Db().Text().Text_bry_(new_text);
wiki.Parser_mgr().Parse(wpg, true);
wiki.Html_mgr().Page_wtr_mgr().Gen(wpg, Xopg_page_.Tid_read); // need to write html to fill Wtxt().Ctgs
// get some variables
int timestamp = (int)Datetime_now.Get().Timestamp_unix();
Xoctg_collation_mgr collation_mgr = wiki.Ctg__catpage_mgr().Collation_mgr();
Xow_db_file core_db = db_mgr.Db__core();
// cat_core:update; for each category, add one to count_page, count_file, or count_subcs
cat_len = wpg.Wtxt().Ctgs__len();
cat_link_tbl.Insert_bgn();
for (int i = 0; i < cat_len; i++) {
// get cat_core itm for sub_cat
Xoa_ttl sub_ttl = wpg.Wtxt().Ctgs__get_at(i);
boolean exists = page_tbl.Select_by_ttl(tmp_page, sub_ttl);
// create category if it doesn't exist
int sub_id = tmp_page.Id();
if (!exists) {
sub_id = Xopg_db_mgr.Create
( core_db.Tbl__page(), core_db.Tbl__text(), core_db.Tbl__ns(), core_db.Tbl__cfg()
, gplx.xowa.wikis.nss.Xow_ns_.Tid__category, sub_ttl.Page_db(), Bry_.Empty, -1);
cat_core_tbl.Insert_bgn();
cat_core_tbl.Insert_cmd_by_batch(sub_id, 0, 0, 0, Bool_.N_byte, -1);
cat_core_tbl.Insert_end();
}
Xowd_category_itm sub_core_itm = cat_core_tbl.Select(sub_id);
// adjust it and save it
sub_core_itm.Adjust(ns_id, 1);
cat_core_tbl.Update(sub_core_itm);
// cat_link:add
cat_link_tbl.Insert_cmd_by_batch(page_id, sub_id, Xoa_ctg_mgr.To_tid_by_ns(ns_id), timestamp, collation_mgr.Get_sortkey(wpg.Ttl().Page_db()), wpg.Ttl().Page_db());
}
cat_link_tbl.Insert_end();
// update page.cat_db_id
page_tbl.Update__cat_db_id(page_id, core_db.Id());
}
}

@ -21,24 +21,27 @@ import gplx.xowa.wikis.dbs.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wi
import gplx.xowa.addons.wikis.directorys.dbs.*;
import gplx.xowa.addons.wikis.directorys.specials.items.bldrs.*;
public class Xopg_db_mgr {
public static int Create(Xodb_wiki_db core_db, int ns_id, byte[] ttl_page_db, byte[] text_raw) {
Db_cfg_tbl cfg_tbl = Db_cfg_tbl.Get_by_key(core_db, Xowd_cfg_tbl_.Tbl_name);
public static int Create
( Xowd_page_tbl page_tbl, Xowd_text_tbl text_tbl, Xowd_site_ns_tbl ns_tbl, Db_cfg_tbl cfg_tbl
, int ns_id, byte[] ttl_page_db, byte[] text_raw, int cat_db_id) {
// get next page_id
int page_id = cfg_tbl.Select_int_or("db", "page.id_next", 1);
cfg_tbl.Upsert_int("db", "page.id_next", page_id + 1);
int page_id = cfg_tbl.Select_int_or("db", "page.id_next", -1);
Xowd_page_tbl page_tbl = Xowd_page_tbl.Get_by_key(core_db);
Xowd_text_tbl text_tbl = Xowd_text_tbl.Get_by_key(core_db);
// zip if needed
byte[] text_zip = text_tbl.Zip(text_raw);
// TODO.XO: should call redirect mgr
boolean redirect = Bool_.N;
// do insert
page_tbl.Insert_bgn();
text_tbl.Insert_bgn();
Xowd_site_ns_tbl ns_tbl = Xowd_site_ns_tbl.Get_by_key(core_db);
int ns_count = ns_tbl.Select_ns_count(ns_id) + 1;
try {
page_tbl.Insert_cmd_by_batch(page_id, ns_id, ttl_page_db, redirect, Datetime_now.Get(), text_raw.length, ns_count, 0, -1);
page_tbl.Insert_cmd_by_batch(page_id, ns_id, ttl_page_db, redirect, Datetime_now.Get(), text_raw.length, ns_count, 0, -1, cat_db_id);
text_tbl.Insert_cmd_by_batch(page_id, text_zip);
Xowd_site_ns_tbl.Get_by_key(core_db).Update_ns_count(ns_id, ns_count);
ns_tbl.Update_ns_count(ns_id, ns_count);
} finally {
page_tbl.Insert_end();
text_tbl.Insert_end();

@ -59,7 +59,13 @@ public class Xow_db_mkr {
// insert data: page
cfg_tbl.Insert_bry(Xow_cfg_consts.Grp__wiki_init, Xow_cfg_consts.Key__init__main_page, mainpage_name);
Xopg_db_mgr.Create(core_db, Xow_ns_.Tid__main, mainpage_name, mainpage_text);
Xopg_db_mgr.Create
( Xowd_page_tbl.Get_by_key(core_db)
, Xowd_text_tbl.Get_by_key(core_db)
, Xowd_site_ns_tbl.Get_by_key(core_db)
, Db_cfg_tbl.Get_by_key(core_db, Xowd_cfg_tbl_.Tbl_name)
, Xow_ns_.Tid__main, mainpage_name, mainpage_text
, -1);
// create tbls: fsdb
core_db.Tbls__add(Bool_.Y

@ -16,9 +16,14 @@ 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.wikis.directorys.specials.items.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.directorys.*; import gplx.xowa.addons.wikis.directorys.specials.*; import gplx.xowa.addons.wikis.directorys.specials.items.*;
import gplx.dbs.*;
import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.addons.wikis.ctgs.dbs.*;
public class Xow_wiki_factory {
public static Xowe_wiki Load_personal(Xoae_app app, byte[] domain, Io_url dir_url) {
// create the rv
// upgrade db
Upgrade_db(domain, dir_url);
// create the wiki
Xowe_wiki rv = new Xowe_wiki
( app
, gplx.xowa.langs.Xol_lang_itm_.Lang_en_make(app.Lang_mgr())
@ -41,7 +46,35 @@ public class Xow_wiki_factory {
// HACK: remove CC copyright message; should change to option
rv.Msg_mgr().Get_or_make(Bry_.new_a7("wikimedia-copyright")).Atrs_set(Bry_.Empty, false, false);
return rv;
}
private static void Upgrade_db(byte[] domain, Io_url dir_url) {
// get conn
Io_url core_db_url = gplx.xowa.wikis.data.Xow_db_file__core_.Find_core_fil_or_null(dir_url, String_.new_u8(domain));
if (core_db_url == null) {
throw Err_.new_wo_type("failed to find core_db for wiki; wiki=~{domain} dir=~{dir_url}", domain, dir_url);
}
Db_conn core_db_conn = Db_conn_bldr.Instance.Get_or_fail(core_db_url);
// cat_link: if cat_link.cl_sortkey_prefix doesn't exist, then cat_link is old format; drop it and add the new one
try {
if (!core_db_conn.Meta_fld_exists(Xodb_cat_link_tbl.TBL_NAME, Xodb_cat_link_tbl.FLD__cl_sortkey_prefix)) {
Gfo_usr_dlg_.Instance.Log_many("", "", "xo.personal:cat_link upgrade; fil=~{0}", core_db_url.Raw());
core_db_conn.Meta_tbl_delete(Xodb_cat_link_tbl.TBL_NAME);
core_db_conn.Meta_tbl_assert(new Xodb_cat_link_tbl(core_db_conn));
}
} catch (Exception e) {
Gfo_usr_dlg_.Instance.Warn_many("", "", "xo.personal:cat_link upgrade failed; err=~{0}", Err_.Message_gplx_log(e));
}
// page.cat_db_id: if page.cat_db_id doesn't exist, then add it
try {
if (!core_db_conn.Meta_fld_exists(Xowd_page_tbl.TBL_NAME, Xowd_page_tbl.FLD__page_cat_db_id)) {
Gfo_usr_dlg_.Instance.Log_many("", "", "xo.personal:page.page_cat_db_id upgrade; fil=~{0}", core_db_url.Raw());
core_db_conn.Meta_fld_append(Xowd_page_tbl.TBL_NAME, Dbmeta_fld_itm.new_int(Xowd_page_tbl.FLD__page_cat_db_id).Default_(-1));
}
} catch (Exception e) {
Gfo_usr_dlg_.Instance.Warn_many("", "", "xo.personal:page.page_cat_db_id upgrade failed; err=~{0}", Err_.Message_gplx_log(e));
}
}
}

@ -46,7 +46,7 @@ public class Db_mgr_fxt {
for (int i = 0; i < len; i++) {
String ttl = ttls[i];
int page_id = page_id_next.Val();
tbl_page.Insert_cmd_by_batch(page_id, ns_id, Bry_.new_u8(ttl), false, modified_on, 0, page_id, 0, 0);
tbl_page.Insert_cmd_by_batch(page_id, ns_id, Bry_.new_u8(ttl), false, modified_on, 0, page_id, 0, 0, -1);
page_id_next.Val_add(1);
}
tbl_page.Insert_end();

@ -45,7 +45,7 @@ public abstract class Xob_dump_mgr_base extends Xob_itm_basic_base implements Xo
ctx = wiki.Parser_mgr().Ctx();
root = ctx.Tkn_mkr().Root(Bry_.Empty);
wiki.Init_assert(); // NOTE: must init wiki for db_mgr_as_sql
wiki.Db_mgr_as_sql().Core_data_mgr().Init_by_load(gplx.xowa.wikis.data.Xow_db_file__core_.Find_core_fil(wiki)); // NOTE: must reinit providers as previous steps may have rls'd (and left member variable conn which is closed)
wiki.Db_mgr_as_sql().Core_data_mgr().Init_by_load(gplx.xowa.wikis.data.Xow_db_file__core_.Find_core_fil_or_null(wiki)); // NOTE: must reinit providers as previous steps may have rls'd (and left member variable conn which is closed)
wiki.File__orig_mgr().Wkrs__del(Xof_orig_wkr_.Tid_wmf_api);
db_fsys_mgr = wiki.Db_mgr_as_sql().Core_data_mgr();
db_ary = Xob_dump_mgr_base_.Init_text_files_ary(db_fsys_mgr);

@ -31,7 +31,7 @@ public class Xob_init_cmd extends Xob_init_base {
}
@Override public void Cmd_run_end(Xowe_wiki wiki) {
if (gplx.xowa.wikis.data.Xow_db_file__core_.Find_core_fil(wiki) != null)
if (gplx.xowa.wikis.data.Xow_db_file__core_.Find_core_fil_or_null(wiki) != null)
throw wiki.Appe().Bldr().Usr_dlg().Fail_many("", "", "directory must not contain any .xowa or .sqlite3 files: dir=~{0}", wiki.Fsys_mgr().Root_dir().Raw());
Xowe_wiki_.Create(wiki, wiki.Import_cfg().Src_rdr_len(), wiki.Import_cfg().Src_fil().NameOnly());
}

@ -23,9 +23,11 @@ public class Xog_tab_itm_edit_mgr {
public static void Save(Xog_tab_itm tab, boolean quick_save) {
if (tab.View_mode() != Xopg_page_.Tid_edit) return; // exit if not edit; handles ctrl+s being pressed in read/html modes
Xoae_page page = tab.Page(); Xowe_wiki wiki = tab.Wiki(); Xog_win_itm win_itm = tab.Tab_mgr().Win();
byte[] old_text = page.Db().Text().Text_bry();
byte[] new_text = Get_new_text(tab, page.Db().Text().Text_bry());
int page_id = page.Db().Page().Id();
if (page.Edit_mode() == Xoa_page_.Edit_mode_create) {
int page_id = wiki.Db_mgr().Save_mgr().Data_create(page.Ttl(), new_text);
page_id = wiki.Db_mgr().Save_mgr().Data_create(page.Ttl(), new_text);
page.Db().Page().Id_(page_id);
page.Edit_mode_update_(); // set to update so that next save does not try to create
}
@ -34,7 +36,15 @@ public class Xog_tab_itm_edit_mgr {
}
Invalidate(wiki);
page.Db().Text().Text_bry_(new_text);
wiki.Parser_mgr().Parse(page, true); // refresh html
try {
gplx.xowa.addons.wikis.ctgs.edits.Xoctg_edit_mgr.Update(wiki, page.Ttl().Page_db(), page_id, old_text, new_text);
} catch (Exception e) {
Gfo_usr_dlg_.Instance.Warn_many("", "", "failed to update categories; err=~{0}", Err_.Message_gplx_log(e));
}
// refresh html
wiki.Parser_mgr().Parse(page, true);
if (wiki.Html__hdump_enabled()) wiki.Html__hdump_mgr().Save_mgr().Save(page); // must go after wiki.Parse
win_itm.Usr_dlg().Prog_one("", "", "saved page ~{0}", String_.new_u8(page.Ttl().Full_txt_raw())); // NOTE: show message after Parse, b/c Parse will flash "Loading page"; DATE:2014-05-17
if (!quick_save) { // full_save; save page and go to read mode

@ -95,7 +95,7 @@ public class Xowv_wiki implements Xow_wiki, Xow_ttl_parser, Gfo_invk {
init_needed = false;
if (String_.Eq(domain_str, "xowa")) return; // HACK: ignore "xowa" for now; WHEN:converting xowa to sqlitedb
data_mgr__core_mgr = new Xow_db_mgr(this, fsys_mgr.Root_dir());
data_mgr__core_mgr.Init_by_load(gplx.xowa.wikis.data.Xow_db_file__core_.Find_core_fil(this));
data_mgr__core_mgr.Init_by_load(gplx.xowa.wikis.data.Xow_db_file__core_.Find_core_fil_or_null(this));
app.Html__css_installer().Install(this, Xowd_css_core_mgr.Key_mobile); // must init after data_mgr
this.db_core_mgr = Fsdb_db_mgr_.new_detect(this, fsys_mgr.Root_dir(), fsys_mgr.File_dir());
if (db_core_mgr == null) // no fsdb; occurs during merge; also, will be null for xowa_db; DATE:2016-05-31

@ -19,9 +19,8 @@ package gplx.xowa.wikis.data; import gplx.*; import gplx.xowa.*; import gplx.xow
import gplx.dbs.*;
import gplx.xowa.wikis.domains.*; import gplx.xowa.bldrs.infos.*;
public class Xow_db_file__core_ {
public static Io_url Find_core_fil(Xow_wiki wiki) {
Io_url wiki_root_dir = wiki.Fsys_mgr().Root_dir();
String domain_str = wiki.Domain_str();
public static Io_url Find_core_fil_or_null(Xow_wiki wiki) {return Find_core_fil_or_null(wiki.Fsys_mgr().Root_dir(), wiki.Domain_str());}
public static Io_url Find_core_fil_or_null(Io_url wiki_root_dir, String domain_str) {
Io_url[] ary = Io_mgr.Instance.QueryDir_fils(wiki_root_dir);
int ary_len = ary.length; if (ary.length == 0) return null;
Io_url rv = Find_core_fil__xowa(ary, ary_len, domain_str);

@ -130,7 +130,7 @@ public class Xow_db_mgr {
this.Init_by_load(db__core.Url());
}
public void Create_page(Xowd_page_tbl core_tbl, Xowd_text_tbl text_tbl, int page_id, int ns_id, byte[] ttl_wo_ns, boolean redirect, DateAdp modified_on, byte[] text_zip_data, int text_raw_len, int random_int, int text_db_id, int html_db_id) {
core_tbl.Insert_cmd_by_batch(page_id, ns_id, ttl_wo_ns, redirect, modified_on, text_raw_len, random_int, text_db_id, html_db_id);
core_tbl.Insert_cmd_by_batch(page_id, ns_id, ttl_wo_ns, redirect, modified_on, text_raw_len, random_int, text_db_id, html_db_id, -1);
text_tbl.Insert_cmd_by_batch(page_id, text_zip_data);
}
private void Dbs__set_by_tid(Xow_db_file db) {

@ -52,11 +52,21 @@ public class Xowd_cat_core_tbl implements Db_tbl {
public void Update_by_batch(int id, byte hidden) {
stmt_update.Clear().Val_byte(fld_hidden, hidden).Crt_int(fld_id, id).Exec_update();
}
public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();;}
public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();}
public void Update(Xowd_category_itm itm) {
conn.Stmt_update_exclude(tbl_name, flds, fld_id).Clear()
.Val_int(fld_pages, itm.Count_pages())
.Val_int(fld_subcats, itm.Count_subcs())
.Val_int(fld_files, itm.Count_files())
.Val_bool_as_byte(fld_hidden, itm.Hidden())
.Val_int(fld_link_db_id, itm.File_idx())
.Crt_int(fld_id, itm.Id())
.Exec_update();
}
public Xowd_category_itm Select(int id) {
if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_id);
Db_rdr rdr = stmt_select.Clear().Crt_int(fld_id, id).Exec_select__rls_manual();
try {return rdr.Move_next() ? new_itm(rdr) : Xowd_category_itm.Null;} finally {rdr.Rls();}
try {return rdr.Move_next() ? Load_itm(rdr) : Xowd_category_itm.Null;} finally {rdr.Rls();}
}
public void Select_by_cat_id_in(Cancelable cancelable, Ordered_hash rv, int bgn, int end) {
in_wkr.Init(rv);
@ -76,7 +86,7 @@ public class Xowd_cat_core_tbl implements Db_tbl {
} finally {rdr.Rls();}
}
}
public Xowd_category_itm new_itm(Db_rdr rdr) {
public Xowd_category_itm Load_itm(Db_rdr rdr) {
return Xowd_category_itm.load_
( rdr.Read_int(fld_id)
, rdr.Read_int(fld_link_db_id)

@ -37,7 +37,7 @@ class Xowd_cat_core_tbl__in_wkr extends Db_in_wkr__base {
@Override protected void Read_data(Cancelable cancelable, Db_rdr rdr) {
while (rdr.Move_next()) {
if (cancelable.Canceled()) return;
Xowd_category_itm ctg_data = tbl.new_itm(rdr);
Xowd_category_itm ctg_data = tbl.Load_itm(rdr);
Xowd_page_itm page = (Xowd_page_itm)hash.Get_by(ctg_data.Id_val());
page.Xtn_(ctg_data);
}

@ -24,8 +24,8 @@ public class Xowd_cat_link_tbl implements Db_tbl {
public Xowd_cat_link_tbl(Db_conn conn, boolean schema_is_1) {
this.conn = conn;
this.tbl_name = schema_is_1 ? "categorylinks" : "cat_link";
fld_from = flds.Add_int ("cl_from");
fld_to_id = flds.Add_int ("cl_to_id");
fld_from = flds.Add_int ("cl_from"); // page_id
fld_to_id = flds.Add_int ("cl_to_id"); // cat_id
fld_type_id = flds.Add_byte ("cl_type_id");
fld_sortkey = flds.Add_str ("cl_sortkey", 230);
fld_timestamp = flds.Add_str ("cl_timestamp", 14);
@ -52,7 +52,6 @@ public class Xowd_cat_link_tbl implements Db_tbl {
.Exec_insert();
}
public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();}
public int Select_by_type(List_adp list, int cat_page_id, byte arg_tid, byte[] arg_sortkey, boolean arg_is_from, int limit) {
String arg_sortkey_str = arg_sortkey == null ? "" : String_.new_u8(arg_sortkey);
gplx.core.criterias.Criteria comp_crt = !arg_is_from

@ -17,6 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*;
import gplx.core.primitives.*; import gplx.xowa.addons.wikis.ctgs.*;
import gplx.xowa.wikis.nss.*;
public class Xowd_category_itm {
public int Id() {return id;} private int id;
public Int_obj_val Id_val() {if (id_val == null) id_val = new Int_obj_val(id); return id_val;} Int_obj_val id_val;
@ -33,7 +34,15 @@ public class Xowd_category_itm {
case Xoa_ctg_mgr.Tid__file: return count_files;
default: throw Err_.new_unhandled(tid);
}
}
}
public void Adjust(int ns, int val) {
switch (ns) {
case Xow_ns_.Tid__category: count_subcs += val; break;
case Xow_ns_.Tid__file : count_files += val; break;
default : count_pages += val; break;
}
}
public static Xowd_category_itm load_(int id, int file_idx, boolean hidden, int count_subcs, int count_files, int count_pages) {
Xowd_category_itm rv = new Xowd_category_itm();
rv.id = id; rv.file_idx = file_idx; rv.hidden = hidden;

@ -77,12 +77,14 @@ public class Xowd_page_tbl implements Db_tbl {
public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds.To_fld_ary()));}
public void Insert(int page_id, int ns_id, byte[] ttl_wo_ns, boolean page_is_redirect, DateAdp modified_on, int page_len, int random_int, int text_db_id, int html_db_id) {
this.Insert_bgn();
this.Insert_cmd_by_batch(page_id, ns_id, ttl_wo_ns, page_is_redirect, modified_on, page_len, random_int, text_db_id, html_db_id);
this.Insert_cmd_by_batch(page_id, ns_id, ttl_wo_ns, page_is_redirect, modified_on, page_len, random_int, text_db_id, html_db_id, -1);
this.Insert_end();
}
public void Insert_bgn() {conn.Txn_bgn("page__insert_bulk"); stmt_insert = conn.Stmt_insert(tbl_name, flds);}
public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);}
public void Insert_cmd_by_batch(int page_id, int ns_id, byte[] ttl_wo_ns, boolean page_is_redirect, DateAdp modified_on, int page_len, int random_int, int text_db_id, int html_db_id) {
public void Insert_cmd_by_batch
(int page_id, int ns_id, byte[] ttl_wo_ns, boolean page_is_redirect, DateAdp modified_on, int page_len, int random_int
, int text_db_id, int html_db_id, int cat_db_id) {
stmt_insert.Clear()
.Val_int(fld_id, page_id)
.Val_int(fld_ns, ns_id)
@ -95,7 +97,7 @@ public class Xowd_page_tbl implements Db_tbl {
.Val_int(fld_html_db_id, html_db_id)
.Val_int(fld_redirect_id, -1)
.Val_int(fld_score, -1)
.Val_int(fld_cat_db_id, -1)
.Val_int(fld_cat_db_id, cat_db_id)
.Exec_insert();
}
public void Insert_by_itm(Db_stmt stmt, Xowd_page_itm itm, int html_db_id) {
@ -336,6 +338,10 @@ public class Xowd_page_tbl implements Db_tbl {
Db_stmt stmt = conn.Stmt_update(tbl_name, String_.Ary(fld_id), fld_html_db_id);
stmt.Val_int(fld_html_db_id, html_db_id).Crt_int(fld_id, page_id).Exec_update();
}
public void Update__cat_db_id(int page_id, int cat_db_id) {
Db_stmt stmt = conn.Stmt_update(tbl_name, String_.Ary(fld_id), fld_cat_db_id);
stmt.Val_int(fld_cat_db_id, cat_db_id).Crt_int(fld_id, page_id).Exec_update();
}
public void Update__ns__ttl(int page_id, int trg_ns, byte[] trg_ttl) {
for (int i = 0; i < 2; ++i) {
try {
@ -377,6 +383,6 @@ public class Xowd_page_tbl implements Db_tbl {
}
}
public static final String Page_touched_fmt = "yyyyMMddHHmmss";
public static final String TBL_NAME = "page";
public static final String TBL_NAME = "page", FLD__page_cat_db_id = "page_cat_db_id";
public static Xowd_page_tbl Get_by_key(Db_tbl_owner owner) {return (Xowd_page_tbl)owner.Tbls__get_by_key(TBL_NAME);}
}

@ -54,7 +54,7 @@ class Pfunc_pagesincategory_tstr {
public void Init_category_counts(String category_title, int pages, int subcs, int files) {
int page_id = 1;
page_tbl.Insert_bgn();
page_tbl.Insert_cmd_by_batch(page_id, Xow_ns_.Tid__category, Bry_.new_u8(category_title), Bool_.N, Datetime_now.Get(), 1, 1, 1, 1);
page_tbl.Insert_cmd_by_batch(page_id, Xow_ns_.Tid__category, Bry_.new_u8(category_title), Bool_.N, Datetime_now.Get(), 1, 1, 1, 1, -1);
page_tbl.Insert_end();
cat_core_tbl.Insert_bgn();
cat_core_tbl.Insert_cmd_by_batch(page_id, pages, subcs, files, Byte_.Zero, 1);

@ -1 +1 @@
v4.1.0.1702
v4.2.0__reupload_upload_db

Loading…
Cancel
Save