diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/dbs/Xodb_cat_link_tbl.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/dbs/Xodb_cat_link_tbl.java index 85de9b53f..964c279db 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/dbs/Xodb_cat_link_tbl.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/dbs/Xodb_cat_link_tbl.java @@ -71,10 +71,29 @@ public class Xodb_cat_link_tbl implements Db_tbl { } return (Xodb_cat_link_row[])list.To_ary_and_clear(Xodb_cat_link_row.class); } - public void Delete_by_page_id(int page_id) { + public void Delete_pages(int page_id) { + Gfo_usr_dlg_.Instance.Log_many("", "", "db.cat_link: delete pages started: db=~{0} page_id=~{1}", conn.Conn_info().Raw(), page_id); conn.Stmt_delete(tbl_name, fld__from) .Crt_int(fld__from, page_id) .Exec_delete(); + Gfo_usr_dlg_.Instance.Log_many("", "", "db.cat_link: delete pages done"); + } + public void Delete_cats(int page_id) { + Gfo_usr_dlg_.Instance.Log_many("", "", "db.cat_link: delete cats started: db=~{0} page_id=~{1}", conn.Conn_info().Raw(), page_id); + conn.Stmt_delete(tbl_name, fld__to_id) + .Crt_int(fld__to_id, page_id) + .Exec_delete(); + Gfo_usr_dlg_.Instance.Log_many("", "", "db.cat_link: delete cats done"); + } + public void Update_page_id_for_pages(int old_id, int new_id) { + Gfo_usr_dlg_.Instance.Log_many("", "", "db.cat_link: update cl_from started: db=~{0} old_id=~{1} new_id=~{2}", conn.Conn_info().Raw(), old_id, new_id); + conn.Stmt_update(tbl_name, String_.Ary(fld__from), fld__from).Val_int(fld__from, new_id).Crt_int(fld__from, old_id).Exec_update(); + Gfo_usr_dlg_.Instance.Log_many("", "", "db.cat_link: update cl_from done"); + } + public void Update_page_id_for_cats(int old_id, int new_id) { + Gfo_usr_dlg_.Instance.Log_many("", "", "db.cat_link: update cl_to started: db=~{0} old_id=~{1} new_id=~{2}", conn.Conn_info().Raw(), old_id, new_id); + conn.Stmt_update(tbl_name, String_.Ary(fld__to_id), fld__to_id).Val_int(fld__to_id, new_id).Crt_int(fld__to_id, old_id).Exec_update(); + Gfo_usr_dlg_.Instance.Log_many("", "", "db.cat_link: update cl_to done"); } public void Rls() { stmt_insert = Db_stmt_.Rls(stmt_insert); diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/edits/Xoctg_edit_mgr.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/edits/Xoctg_edit_mgr.java index 2e398dc8e..fe42ebd24 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/edits/Xoctg_edit_mgr.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/edits/Xoctg_edit_mgr.java @@ -18,7 +18,7 @@ along with this program. If not, see . 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.data.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.wikis.domains.*; +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 { @@ -47,7 +47,7 @@ public class Xoctg_edit_mgr { db_mgr.Tbl__page().Select_by_id(tmp_page, page_id); // delete old categories - Delete(wiki, page_id); + Delete(wiki, ns_id, page_id); // get some variables int timestamp = (int)Datetime_now.Get().Timestamp_unix(); @@ -87,12 +87,8 @@ public class Xoctg_edit_mgr { // update page.cat_db_id page_tbl.Update__cat_db_id(page_id, core_db.Id()); } - public static void Delete(Xowe_wiki wiki, int page_id) { - // get page_tbl - Xowd_page_tbl page_tbl = wiki.Data__core_mgr().Db__core().Tbl__page(); - Xowd_page_itm tmp_page = new Xowd_page_itm(); - page_tbl.Select_by_id(tmp_page, page_id); - int ns_id = tmp_page.Ns_id(); + public static void Delete(Xowe_wiki wiki, int ns_id, int page_id) { + 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(wiki.Data__core_mgr()); @@ -114,7 +110,34 @@ public class Xoctg_edit_mgr { } // delete cat_links - cat_link_tbl.Delete_by_page_id(page_id); + 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); + } + } + public static void Update_page_id(Xowe_wiki wiki, int ns_id, int old_id, int new_id) { + boolean ns_id_is_category = ns_id == Xow_ns_.Tid__category; + + // get cat_link_tbls + Xodb_cat_link_tbl[] cat_link_tbls = Xodb_cat_link_tbl.Get_catlink_tbls(wiki.Data__core_mgr()); + + // loop cat_link tbls to find linked categories + for (Xodb_cat_link_tbl cat_link_tbl : cat_link_tbls) { + // 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(wiki.Data__core_mgr()); + cat_core_tbl.Update_page_id(old_id, new_id); } } } diff --git a/400_xowa/src/gplx/xowa/addons/wikis/directorys/specials/items/bldrs/Xopg_db_mgr.java b/400_xowa/src/gplx/xowa/addons/wikis/directorys/specials/items/bldrs/Xopg_db_mgr.java index 9547ffc36..c0c69804f 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/directorys/specials/items/bldrs/Xopg_db_mgr.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/directorys/specials/items/bldrs/Xopg_db_mgr.java @@ -84,7 +84,7 @@ public class Xopg_db_mgr { } // cat_core, cat_link - gplx.xowa.addons.wikis.ctgs.edits.Xoctg_edit_mgr.Delete(wiki, page_id); + gplx.xowa.addons.wikis.ctgs.edits.Xoctg_edit_mgr.Delete(wiki, ns_id, page_id); // search_link Srch_search_addon.Get(wiki).Delete_links(ns_id, page_id); @@ -92,4 +92,35 @@ public class Xopg_db_mgr { // delete from page core_db.Tbl__page().Delete(page_id); } + public static void Update_page_id(Xowe_wiki wiki, int old_id, int new_id) { + // init vars + Xow_db_mgr db_mgr = wiki.Data__core_mgr(); + Xow_db_file core_db = db_mgr.Db__core(); + Xowd_page_itm tmp = new Xowd_page_itm(); + + // get ns_id + core_db.Tbl__page().Select_by_id(tmp, old_id); + int ns_id = tmp.Ns_id(); + + // text_db + Xow_db_file text_db = db_mgr.Dbs__get_by_id_or_null(tmp.Text_db_id()); + if (text_db != null) { + text_db.Tbl__text().Update_page_id(old_id, new_id); + } + + // html_db + Xow_db_file html_db = db_mgr.Dbs__get_by_id_or_null(tmp.Html_db_id()); + if (html_db != null) { + html_db.Tbl__html().Update_page_id(old_id, new_id); + } + + // cat_core, cat_link + gplx.xowa.addons.wikis.ctgs.edits.Xoctg_edit_mgr.Update_page_id(wiki, ns_id, old_id, new_id); + + // search_link + Srch_search_addon.Get(wiki).Update_links(ns_id, old_id, new_id); + + // delete from page + core_db.Tbl__page().Update_page_id(old_id, new_id); + } } diff --git a/400_xowa/src/gplx/xowa/addons/wikis/searchs/Srch_search_addon.java b/400_xowa/src/gplx/xowa/addons/wikis/searchs/Srch_search_addon.java index 56e561a11..9c5aae666 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/searchs/Srch_search_addon.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/searchs/Srch_search_addon.java @@ -41,6 +41,14 @@ public class Srch_search_addon implements Xoax_addon_itm, Srch_search_addon_api } this.Clear_rslts_cache(); } + public void Update_links(int ns_id, int old_id, int new_id) { + int search_link_db_id = db_mgr.Tbl__link__get_idx(ns_id); + Srch_link_tbl search_link_tbl = db_mgr.Tbl__link__get_at(search_link_db_id); + if (search_link_tbl.conn.Meta_tbl_exists("search_link")) { // NOTE: personal_wikis may not have search_link; exit early else delete will fail; DATE:2017-02-15 + search_link_tbl.Update_page_id(old_id, new_id); + } + this.Clear_rslts_cache(); + } public static final int Score_max = 1000000; public static final byte Wildcard__star = Byte_ascii.Star; diff --git a/400_xowa/src/gplx/xowa/addons/wikis/searchs/dbs/Srch_link_tbl.java b/400_xowa/src/gplx/xowa/addons/wikis/searchs/dbs/Srch_link_tbl.java index bda056081..2b22d5ecb 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/searchs/dbs/Srch_link_tbl.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/searchs/dbs/Srch_link_tbl.java @@ -41,11 +41,15 @@ public class Srch_link_tbl { stmt.Val_int(fld_word_id, row.Word_id).Val_int(fld_page_id, row.Page_id).Val_int(fld_link_score, row.Link_score); } public void Delete(int page_id) { - Gfo_usr_dlg_.Instance.Log_many("", "", "db.search_link: delete started: page_id=~{0}", page_id); - Db_stmt stmt = conn.Stmt_delete(tbl_name, fld_page_id); - stmt.Clear().Crt_int(fld_page_id, page_id).Exec_delete(); + Gfo_usr_dlg_.Instance.Log_many("", "", "db.search_link: delete started: db=~{0} page_id=~{1}", conn.Conn_info().Raw(), page_id); + conn.Stmt_delete(tbl_name, fld_page_id).Crt_int(fld_page_id, page_id).Exec_delete(); Gfo_usr_dlg_.Instance.Log_many("", "", "db.search_link: delete done"); } + public void Update_page_id(int old_id, int new_id) { + Gfo_usr_dlg_.Instance.Log_many("", "", "db.search_link: update_page_id started: db=~{0} old_id=~{1} new_id=~{2}", conn.Conn_info().Raw(), old_id, new_id); + conn.Stmt_update(tbl_name, String_.Ary(fld_page_id), fld_page_id).Val_int(fld_page_id, old_id).Crt_int(fld_page_id, new_id).Exec_update(); + Gfo_usr_dlg_.Instance.Log_many("", "", "db.search_link: update done"); + } public static final Srch_link_tbl[] Ary_empty = new Srch_link_tbl[0]; public static final String Fld_link_score = "link_score"; diff --git a/400_xowa/src/gplx/xowa/htmls/core/dbs/Xowd_html_tbl.java b/400_xowa/src/gplx/xowa/htmls/core/dbs/Xowd_html_tbl.java index 1984d8fba..9b4b56721 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/dbs/Xowd_html_tbl.java +++ b/400_xowa/src/gplx/xowa/htmls/core/dbs/Xowd_html_tbl.java @@ -69,10 +69,14 @@ public class Xowd_html_tbl implements Db_tbl { } public void Delete(int page_id) { Gfo_usr_dlg_.Instance.Log_many("", "", "db.html: delete started: db=~{0} page_id=~{1}", conn.Conn_info().Raw(), page_id); - Db_stmt stmt = conn.Stmt_delete(tbl_name, fld_page_id); - stmt.Clear().Crt_int(fld_page_id, page_id).Exec_delete(); + conn.Stmt_delete(tbl_name, fld_page_id).Crt_int(fld_page_id, page_id).Exec_delete(); Gfo_usr_dlg_.Instance.Log_many("", "", "db.html: delete done"); } + public void Update_page_id(int old_id, int new_id) { + Gfo_usr_dlg_.Instance.Log_many("", "", "db.html: update page_id started: db=~{0} old_id=~{1} new_id=~{2}", conn.Conn_info().Raw(), old_id, new_id); + conn.Stmt_update(tbl_name, String_.Ary(fld_page_id), fld_page_id).Val_int(fld_page_id, new_id).Crt_int(fld_page_id, old_id).Exec_update(); + Gfo_usr_dlg_.Instance.Log_many("", "", "db.html: update page_id done"); + } public boolean Select_by_page(Xoh_page hpg) { if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_page_id); Db_rdr rdr = stmt_select.Clear().Crt_int(fld_page_id, hpg.Page_id()).Exec_select__rls_manual(); diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_core_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_core_tbl.java index 47c8a1a21..50e797135 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_core_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_core_tbl.java @@ -52,7 +52,17 @@ 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(int page_id) { + Gfo_usr_dlg_.Instance.Log_many("", "", "db.cat_core: delete started: db=~{0} page_id=~{1}", conn.Conn_info().Raw(), page_id); + conn.Stmt_delete(tbl_name, fld_id).Crt_int(fld_id, page_id).Exec_delete(); + Gfo_usr_dlg_.Instance.Log_many("", "", "db.cat_core: delete done"); + } public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();} + public void Update_page_id(int old_id, int new_id) { + Gfo_usr_dlg_.Instance.Log_many("", "", "db.cat_core: update page_id started: db=~{0} old_id=~{1} new_id=~{2}", conn.Conn_info().Raw(), old_id, new_id); + conn.Stmt_update(tbl_name, String_.Ary(fld_id), fld_id).Val_int(fld_id, new_id).Crt_int(fld_id, old_id).Exec_update(); + Gfo_usr_dlg_.Instance.Log_many("", "", "db.cat_core: update page_id done"); + } public void Update(Xowd_category_itm itm) { conn.Stmt_update_exclude(tbl_name, flds, fld_id).Clear() .Val_int(fld_pages, itm.Count_pages()) diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl.java index 3bfb34863..607406864 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl.java @@ -372,10 +372,14 @@ public class Xowd_page_tbl implements Db_tbl { } public void Delete(int page_id) { Gfo_usr_dlg_.Instance.Log_many("", "", "db.page: delete started: page_id=~{0}", page_id); - Db_stmt stmt = conn.Stmt_delete(tbl_name, fld_id); - stmt.Clear().Crt_int(fld_id, page_id).Exec_delete(); + conn.Stmt_delete(tbl_name, fld_id).Crt_int(fld_id, page_id).Exec_delete(); Gfo_usr_dlg_.Instance.Log_many("", "", "db.page: delete done"); } + public void Update_page_id(int old_id, int new_id) { + Gfo_usr_dlg_.Instance.Log_many("", "", "db.page: update page_id started: old_id=~{0} new_id=~{1}", old_id, new_id); + conn.Stmt_update(tbl_name, String_.Ary(fld_id), fld_id).Val_int(fld_id, new_id).Crt_int(fld_id, old_id).Exec_update(); + Gfo_usr_dlg_.Instance.Log_many("", "", "db.page: update page_id done"); + } public void Create_idx() { conn.Meta_idx_create(Xoa_app_.Usr_dlg() , Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, "title" , fld_title, fld_ns) diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_text_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_text_tbl.java index 51a154d5f..72218cdd1 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_text_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_text_tbl.java @@ -49,6 +49,11 @@ public class Xowd_text_tbl implements Db_tbl { conn.Stmt_delete(tbl_name, fld_page_id).Crt_int(fld_page_id, page_id).Exec_delete(); Gfo_usr_dlg_.Instance.Log_many("", "", "db.text: delete done"); } + public void Update_page_id(int old_id, int new_id) { + Gfo_usr_dlg_.Instance.Log_many("", "", "db.text: update page_id started: db=~{0} old_id=~{1} new_id=~{2}", conn.Conn_info().Raw(), old_id, new_id); + conn.Stmt_update(tbl_name, String_.Ary(fld_page_id), fld_page_id).Val_int(fld_page_id, new_id).Crt_int(fld_page_id, old_id).Exec_update(); + Gfo_usr_dlg_.Instance.Log_many("", "", "db.text: update page_id done"); + } public byte[] Select(int page_id) { synchronized (thread_lock) { // LOCK:stmt-rls; DATE:2016-07-06 if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_page_id);