/* 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.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.wikis.pages.*; import gplx.xowa.wikis.nss.*; 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 static void Update(Xowe_wiki wiki, byte[] ttl_bry, int page_id, Xoa_ttl[] ctg_ttls) { // get ttl, page, ns_id 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); // delete old categories Delete(wiki, ns_id, page_id); // insert new categories // get page_tbl Xow_db_mgr db_mgr = wiki.Data__core_mgr(); Xow_db_file core_db = db_mgr.Db__core(); Xowd_page_tbl page_tbl = core_db.Tbl__page(); // get cat_core_tbl Xowd_cat_core_tbl cat_core_tbl = Xodb_cat_db_.Get_cat_core_or_fail(db_mgr); // get last cat_link_tbl; note that // * cat_link tbls are organized by page // * all old cat_links have been deleted // * new catlinks will go into last db Xow_db_file last_cat_link_db = db_mgr.Dbs__get_for_create(Xow_db_file_.Tid__cat_link, ns_id); Xodb_cat_link_tbl last_cat_link_tbl = new Xodb_cat_link_tbl(last_cat_link_db.Conn()); // get last text tbl for new categories; EX: [[Category:New]] will create entry in page_tb with text_db_id set to last_text_db Xow_db_file last_text_db = db_mgr.Dbs__get_for_create(Xow_db_file_.Tid__text, ns_id); Xowd_text_tbl last_text_tbl = new Xowd_text_tbl(last_text_db.Conn(), db_mgr.Props().Schema_is_1(), db_mgr.Props().Zip_tid_text()); // get some variables for creating cat_link rows int timestamp = (int)Datetime_now.Get().Timestamp_unix(); Xoctg_collation_mgr collation_mgr = wiki.Ctg__catpage_mgr().Collation_mgr(); Xowd_page_itm tmp_page = new Xowd_page_itm(); // loop over each category listed on page for (Xoa_ttl ctg_ttl : ctg_ttls) { // get page_tbl data for sub_cat boolean exists = page_tbl.Select_by_ttl(tmp_page, ctg_ttl); int ctg_id = tmp_page.Id(); // create category if it doesn't exist if (!exists) { // create [[Category]] page ctg_id = Xopg_db_mgr.Create ( page_tbl, last_text_tbl, last_text_db.Id(), core_db.Tbl__ns(), core_db.Tbl__cfg() , gplx.xowa.wikis.nss.Xow_ns_.Tid__category, ctg_ttl.Page_db(), Bry_.Empty , last_cat_link_db.Id()); // NOTE: new categories go into last cat_link_db // create cat_core row cat_core_tbl.Insert_bgn(); cat_core_tbl.Insert_cmd_by_batch(ctg_id, 0, 0, 0, Bool_.N_byte, -1); cat_core_tbl.Insert_end(); } // get cat_core_itm Xowd_category_itm cat_core_itm = cat_core_tbl.Select(ctg_id); // adjust it and save it cat_core_itm.Adjust(ns_id, 1); cat_core_tbl.Update(cat_core_itm); // add to cat_link tbl last_cat_link_tbl.Insert_(page_id, ctg_id, Xoa_ctg_mgr.To_tid_by_ns(ns_id), timestamp, collation_mgr.Get_sortkey(wpg.Ttl().Page_db()), wpg.Ttl().Page_db()); } // update page.cat_db_id page_tbl.Update__cat_db_id(page_id, last_cat_link_db.Id()); } public static void Delete(Xowe_wiki wiki, int ns_id, int page_id) { Xow_db_mgr db_mgr = wiki.Data__core_mgr(); boolean ns_id_is_category = ns_id == Xow_ns_.Tid__category; // get cat_core_tbl Xowd_cat_core_tbl cat_core_tbl = Xodb_cat_db_.Get_cat_core_or_fail(db_mgr); // get cat_link_tbls Xow_db_file[] cat_link_dbs = db_mgr.Dbs__get_ary(Xow_db_file_.Tid__cat_link, ns_id); // loop cat_link tbls to find linked categories for (Xow_db_file cat_link_db : cat_link_dbs) { Xodb_cat_link_tbl cat_link_tbl = new Xodb_cat_link_tbl(cat_link_db.Conn()); Xodb_cat_link_row[] cat_link_rows = cat_link_tbl.Select_by_page_id(page_id); // loop linked categories for (Xodb_cat_link_row cat_link_row : cat_link_rows) { // get cat_core_itm Xowd_category_itm sub_core_itm = cat_core_tbl.Select(cat_link_row.Cat_id()); // subtract one and save it sub_core_itm.Adjust(ns_id, -1); cat_core_tbl.Update(sub_core_itm); } // delete cat_links cat_link_tbl.Delete_pages(page_id); if (ns_id_is_category) cat_link_tbl.Delete_cats(page_id); } // delete cat_core if (ns_id_is_category) { cat_core_tbl.Delete(page_id); } // set cat_db_id to -1 db_mgr.Tbl__page().Update__cat_db_id(page_id, -1); } public static void Update_page_id(Xow_db_mgr db_mgr, int ns_id, int old_id, int new_id) { boolean ns_id_is_category = ns_id == Xow_ns_.Tid__category; // get cat_link_tbls Xow_db_file[] cat_link_dbs = db_mgr.Dbs__get_ary(Xow_db_file_.Tid__cat_link, ns_id); // loop cat_link tbls to find linked categories for (Xow_db_file cat_link_db : cat_link_dbs) { Xodb_cat_link_tbl cat_link_tbl = new Xodb_cat_link_tbl(cat_link_db.Conn()); // delete cat_links cat_link_tbl.Update_page_id_for_pages(old_id, new_id); if (ns_id_is_category) cat_link_tbl.Update_page_id_for_cats(old_id, new_id); } // update cat_core if (ns_id_is_category) { Xowd_cat_core_tbl cat_core_tbl = Xodb_cat_db_.Get_cat_core_or_fail(db_mgr); cat_core_tbl.Update_page_id(old_id, new_id); } } }