From 12c78cf89f86f4c3177a9a5d04a4bbb52901759a Mon Sep 17 00:00:00 2001 From: gnosygnu Date: Wed, 15 Feb 2017 11:44:30 -0500 Subject: [PATCH] Personal_wikis: Add page delete; refactor category updates --- .../src/gplx/xowa/addons/Xoax_addon_mgr.java | 2 +- .../wikis/ctgs/dbs/Xodb_cat_link_row.java | 34 ++++++++++ .../wikis/ctgs/dbs/Xodb_cat_link_tbl.java | 48 ++++++++++++++ .../wikis/ctgs/edits/Xoctg_edit_mgr.java | 66 ++++++++++--------- .../specials/items/bldrs/Xopg_db_mgr.java | 46 ++++++++++++- .../wikis/pages/randoms/Rndm_addon.java | 1 + .../wikis/searchs/Srch_search_addon.java | 8 +++ .../wikis/searchs/dbs/Srch_link_tbl.java | 6 ++ .../src/gplx/xowa/guis/bnds/Xog_bnd_win.java | 1 + .../xowa/guis/views/Xog_tab_itm_edit_mgr.java | 18 +++-- .../src/gplx/xowa/guis/views/Xog_win_itm.java | 4 +- .../xowa/htmls/core/dbs/Xowd_html_tbl.java | 9 +-- .../specials/deletes/Xodel_page_special.java | 39 +++++++++++ .../data/site_stats/Xowd_site_stats_tbl.java | 4 +- .../xowa/wikis/data/tbls/Xowd_page_tbl.java | 6 ++ .../wikis/data/tbls/Xowd_site_ns_tbl.java | 2 + .../xowa/wikis/data/tbls/Xowd_text_tbl.java | 5 ++ 17 files changed, 252 insertions(+), 47 deletions(-) create mode 100644 400_xowa/src/gplx/xowa/addons/wikis/ctgs/dbs/Xodb_cat_link_row.java create mode 100644 400_xowa/src/gplx/xowa/specials/deletes/Xodel_page_special.java diff --git a/400_xowa/src/gplx/xowa/addons/Xoax_addon_mgr.java b/400_xowa/src/gplx/xowa/addons/Xoax_addon_mgr.java index c2cc45f58..c6fe4085d 100644 --- a/400_xowa/src/gplx/xowa/addons/Xoax_addon_mgr.java +++ b/400_xowa/src/gplx/xowa/addons/Xoax_addon_mgr.java @@ -69,7 +69,7 @@ public class Xoax_addon_mgr { , new gplx.xowa.addons.bldrs.centrals .Xobc_task_addon() , new gplx.xowa.addons.apps.helps.logs .Xolog_addon() , new gplx.xowa.addons.wikis.pages.syncs .Xosync_addon() - , new gplx.xowa.addons.wikis.directorys .Xowdir_addon() + , new gplx.xowa.addons.wikis.directorys .Xowdir_addon() , new gplx.xowa.addons.apps.cfgs .Xoa_cfg_addon() , new gplx.xowa.addons.apps.updates .Xoa_update_addon() diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/dbs/Xodb_cat_link_row.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/dbs/Xodb_cat_link_row.java new file mode 100644 index 000000000..69fff5f1c --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/dbs/Xodb_cat_link_row.java @@ -0,0 +1,34 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.addons.wikis.ctgs.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; +public class Xodb_cat_link_row { + public Xodb_cat_link_row(int page_id, int cat_id, byte type_id, long timestamp_unix, byte[] sortkey, byte[] sortkey_prefix) { + this.page_id = page_id; + this.cat_id = cat_id; + this.type_id = type_id; + this.timestamp_unix = timestamp_unix; + this.sortkey = sortkey; + this.sortkey_prefix = sortkey_prefix; + } + public int Page_id() {return page_id;} private final int page_id; + public int Cat_id() {return cat_id;} private final int cat_id; + public byte Type_id() {return type_id;} private final byte type_id; + public long Timestamp_unix() {return timestamp_unix;} private final long timestamp_unix; + public byte[] Sortkey() {return sortkey;} private final byte[] sortkey; + public byte[] Sortkey_prefix() {return sortkey_prefix;} private final byte[] sortkey_prefix; +} \ No newline at end of file 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 e8176d984..85de9b53f 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 @@ -17,6 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.addons.wikis.ctgs.dbs; 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.wikis.data.*; import gplx.xowa.addons.wikis.ctgs.htmls.pageboxs.*; public class Xodb_cat_link_tbl implements Db_tbl { private final Dbmeta_fld_list flds = new Dbmeta_fld_list(); @@ -50,6 +51,26 @@ public class Xodb_cat_link_tbl implements Db_tbl { .Val_bry_as_str(fld__sortkey_prefix , sortkey_prefix) .Exec_insert(); } + public Xodb_cat_link_row[] Select_by_page_id(int page_id) { + List_adp list = List_adp_.New(); + Db_rdr rdr = conn.Stmt_select(tbl_name, flds, fld__from).Crt_int(fld__from, page_id).Exec_select__rls_auto(); + try { + while (rdr.Move_next()) { + Xodb_cat_link_row row = new Xodb_cat_link_row + ( rdr.Read_int(fld__from) + , rdr.Read_int(fld__to_id) + , rdr.Read_byte(fld__type_id) + , rdr.Read_long(fld__timestamp_unix) + , rdr.Read_bry(fld__sortkey) + , rdr.Read_bry_by_str(fld__sortkey_prefix) + ); + list.Add(row); + } + } finally { + rdr.Rls(); + } + return (Xodb_cat_link_row[])list.To_ary_and_clear(Xodb_cat_link_row.class); + } public void Delete_by_page_id(int page_id) { conn.Stmt_delete(tbl_name, fld__from) .Crt_int(fld__from, page_id) @@ -59,6 +80,33 @@ public class Xodb_cat_link_tbl implements Db_tbl { stmt_insert = Db_stmt_.Rls(stmt_insert); } public static final String TBL_NAME = "cat_link", FLD__cl_sortkey_prefix = "cl_sortkey_prefix"; + public static Xodb_cat_link_tbl[] Get_catlink_tbls(Xow_db_mgr db_mgr) { + List_adp rv = List_adp_.New(); + + boolean layout_is_lot = db_mgr.Props().Layout_text().Tid_is_lot(); + + // loop all dbs + int len = db_mgr.Dbs__len(); + for (int i = 0; i < len; i++) { + Xow_db_file link_db = db_mgr.Dbs__get_at(i); + switch (link_db.Tid()) { + // if core, add if all or few; skip if lot + case Xow_db_file_.Tid__core: + if (layout_is_lot) + continue; + break; + // if cat_link, add + case Xow_db_file_.Tid__cat_link: + break; + // else, skip + default: + continue; + } + rv.Add(new Xodb_cat_link_tbl(link_db.Conn())); + } + + return (Xodb_cat_link_tbl[])rv.To_ary_and_clear(Xodb_cat_link_tbl.class); + } } /* NOTE_1: categorylinks row size: 34 + 20 + 12 + (cat_sortkey.length * 2) 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 cb3fc15ec..2e398dc8e 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 @@ -22,7 +22,7 @@ import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; import gplx.x 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, byte[] old_text, byte[] new_text) { + public static void Update(Xowe_wiki wiki, byte[] ttl_bry, int page_id, Xoa_ttl[] ctg_ttls) { // only apply to home or other wiki if (!( wiki.Domain_tid() == Xow_domain_tid_.Tid__other || wiki.Domain_tid() == Xow_domain_tid_.Tid__home)) @@ -46,32 +46,8 @@ public class Xoctg_edit_mgr { 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 + // delete old categories + Delete(wiki, page_id); // get some variables int timestamp = (int)Datetime_now.Get().Timestamp_unix(); @@ -79,11 +55,11 @@ public class Xoctg_edit_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(); + int ctg_ttls_len = ctg_ttls.length; cat_link_tbl.Insert_bgn(); - for (int i = 0; i < cat_len; i++) { + for (int i = 0; i < ctg_ttls_len; i++) { // get cat_core itm for sub_cat - Xoa_ttl sub_ttl = wpg.Wtxt().Ctgs__get_at(i); + Xoa_ttl sub_ttl = ctg_ttls[i]; boolean exists = page_tbl.Select_by_ttl(tmp_page, sub_ttl); // create category if it doesn't exist @@ -111,4 +87,34 @@ 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(); + + // get cat_core_tbl + Xowd_cat_core_tbl cat_core_tbl = Xodb_cat_db_.Get_cat_core_or_fail(wiki.Data__core_mgr()); + + // 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) { + 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_by_page_id(page_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 20aeb57f0..9547ffc36 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 @@ -17,9 +17,11 @@ along with this program. If not, see . */ 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.dbs.cfgs.*; -import gplx.xowa.wikis.dbs.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; +import gplx.xowa.wikis.dbs.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.wikis.data.site_stats.*; +import gplx.xowa.wikis.nss.*; import gplx.xowa.addons.wikis.directorys.dbs.*; import gplx.xowa.addons.wikis.directorys.specials.items.bldrs.*; +import gplx.xowa.addons.wikis.searchs.*; import gplx.xowa.addons.wikis.searchs.dbs.*; public class Xopg_db_mgr { 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 @@ -48,4 +50,46 @@ public class Xopg_db_mgr { } return page_id; } + public static void Delete(Xowe_wiki wiki, Xoa_ttl page_ttl) { + // 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 meta + core_db.Tbl__page().Select_by_ttl(tmp, page_ttl); + int page_id = tmp.Id(); + int ns_id = tmp.Ns_id(); + + // adjust site_stats + int page_is_file = ns_id == Xow_ns_.Tid__file ? 1 : 0; + Xowd_site_stats_mgr site_stats_row = new Xowd_site_stats_mgr(wiki); + core_db.Tbl__site_stats().Select(site_stats_row); + core_db.Tbl__site_stats().Update(site_stats_row.Num_articles() - 1, site_stats_row.Num_pages() - 1, site_stats_row.Num_files() - page_is_file); + + // adjust site_ns + int ns_count = core_db.Tbl__ns().Select_ns_count(ns_id); + core_db.Tbl__ns().Update_ns_count(ns_id, ns_count - 1); + + // 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().Delete(page_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().Delete(page_id); + } + + // cat_core, cat_link + gplx.xowa.addons.wikis.ctgs.edits.Xoctg_edit_mgr.Delete(wiki, page_id); + + // search_link + Srch_search_addon.Get(wiki).Delete_links(ns_id, page_id); + + // delete from page + core_db.Tbl__page().Delete(page_id); + } } diff --git a/400_xowa/src/gplx/xowa/addons/wikis/pages/randoms/Rndm_addon.java b/400_xowa/src/gplx/xowa/addons/wikis/pages/randoms/Rndm_addon.java index ce9ea6999..f75355328 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/pages/randoms/Rndm_addon.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/pages/randoms/Rndm_addon.java @@ -32,6 +32,7 @@ public class Rndm_addon implements Xoax_addon_itm, Xoax_addon_itm__bldr, Xoax_ad return new Xow_special_page[] { Rndm_root_special.Prototype , Rndm_page_special.Prototype + , new gplx.xowa.specials.deletes .Xodel_page_special() }; } 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 ff76f4abe..56e561a11 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 @@ -33,6 +33,14 @@ public class Srch_search_addon implements Xoax_addon_itm, Srch_search_addon_api public void Search(Srch_search_qry qry, Srch_rslt_cbk cbk) {search_mgr.Search(qry, cbk);} public void Clear_rslts_cache() {search_mgr.Clear_rslts_cache();} + public void Delete_links(int ns_id, int page_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.Delete(page_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 01a6a73fa..bda056081 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 @@ -40,6 +40,12 @@ public class Srch_link_tbl { public void Fill_for_insert(Db_stmt stmt, Srch_link_row row) { 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 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/guis/bnds/Xog_bnd_win.java b/400_xowa/src/gplx/xowa/guis/bnds/Xog_bnd_win.java index a42743c74..59e39edab 100644 --- a/400_xowa/src/gplx/xowa/guis/bnds/Xog_bnd_win.java +++ b/400_xowa/src/gplx/xowa/guis/bnds/Xog_bnd_win.java @@ -17,6 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.guis.bnds; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*; import gplx.gfui.*; import gplx.gfui.draws.*; import gplx.gfui.ipts.*; import gplx.gfui.kits.core.*; import gplx.gfui.envs.*; import gplx.gfui.controls.windows.*; import gplx.gfui.controls.elems.*; import gplx.gfui.controls.standards.*; +import gplx.gfui.layouts.swts.*; import gplx.xowa.guis.cbks.*; public class Xog_bnd_win implements Gfo_invk { private GfuiWin win; diff --git a/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm_edit_mgr.java b/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm_edit_mgr.java index dc1017de9..48d84f808 100644 --- a/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm_edit_mgr.java +++ b/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm_edit_mgr.java @@ -22,8 +22,9 @@ import gplx.xowa.parsers.*; import gplx.xowa.parsers.tmpls.*; 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 + + // get text and save directly to text_db 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) { @@ -37,17 +38,20 @@ public class Xog_tab_itm_edit_mgr { Invalidate(wiki); page.Db().Text().Text_bry_(new_text); - 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 + // update categories + try { + wiki.Html_mgr().Page_wtr_mgr().Gen(page, Xopg_page_.Tid_read); // NOTE: need to write html to fill Wtxt().Ctgs + gplx.xowa.addons.wikis.ctgs.edits.Xoctg_edit_mgr.Update(wiki, page.Ttl().Page_db(), page_id, page.Wtxt().Ctgs__to_ary()); + } catch (Exception e) { + Gfo_usr_dlg_.Instance.Warn_many("", "", "failed to update categories; err=~{0}", Err_.Message_gplx_log(e)); + } + page.Html_data().Edit_preview_(Bry_.Empty); Xoae_page stack_page = tab.History_mgr().Cur_page(wiki); // NOTE: must be to CurPage() else changes will be lost when going Bwd,Fwd stack_page.Db().Text().Text_bry_(page.Db().Text().Text_bry()); // NOTE: overwrite with "saved" changes diff --git a/400_xowa/src/gplx/xowa/guis/views/Xog_win_itm.java b/400_xowa/src/gplx/xowa/guis/views/Xog_win_itm.java index a180d9e82..741556fb6 100644 --- a/400_xowa/src/gplx/xowa/guis/views/Xog_win_itm.java +++ b/400_xowa/src/gplx/xowa/guis/views/Xog_win_itm.java @@ -216,9 +216,7 @@ public class Xog_win_itm implements Gfo_invk, Gfo_evt_itm { } public void Page__refresh() { Xog_tab_itm tab = tab_mgr.Active_tab(); Xoae_page page = tab.Page(); Xog_html_itm html_itm = tab.Html_itm(); - if (page.Ttl().Ns().Id_is_special()) { - page = page.Wikie().Page_mgr().Load_page(page.Url(), page.Ttl(), tab); // NOTE: must reparse page if (a) Edit -> Read; or (b) "Options" save - } + page = page.Wikie().Page_mgr().Load_page(page.Url(), page.Ttl(), tab); // NOTE: refresh should always reload and regen page; DATE:2017-02-15 page.Html_data().Bmk_pos_(html_itm.Html_box().Html_js_eval_proc_as_str(Xog_js_procs.Win__vpos_get)); html_itm.Show(page); if (page.Url().Anch_str() == null) 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 7c48232bf..1984d8fba 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 @@ -19,7 +19,7 @@ package gplx.xowa.htmls.core.dbs; import gplx.*; import gplx.xowa.*; import gplx import gplx.dbs.*; import gplx.core.brys.*; public class Xowd_html_tbl implements Db_tbl { private final String fld_page_id, fld_head_flag, fld_body_flag, fld_display_ttl, fld_content_sub, fld_sidebar_div, fld_body; - private Db_stmt stmt_select, stmt_insert, stmt_delete, stmt_update; + private Db_stmt stmt_select, stmt_insert, stmt_update; private final Int_flag_bldr body_flag_bldr = Make_body_flag_bldr(); public Xowd_html_tbl(Db_conn conn) { this.conn = conn; @@ -68,8 +68,10 @@ public class Xowd_html_tbl implements Db_tbl { Insert(page_id, head_flag, zip_tid, hzip_tid, display_ttl, content_sub, sidebar_div, body); } public void Delete(int page_id) { - if (stmt_delete == null) stmt_delete = conn.Stmt_delete(tbl_name, fld_page_id); - stmt_delete.Clear().Crt_int(fld_page_id, page_id).Exec_delete(); + 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(); + Gfo_usr_dlg_.Instance.Log_many("", "", "db.html: delete done"); } public boolean Select_by_page(Xoh_page hpg) { if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, flds, fld_page_id); @@ -107,7 +109,6 @@ public class Xowd_html_tbl implements Db_tbl { } public void Rls() { stmt_insert = Db_stmt_.Rls(stmt_insert); - stmt_delete = Db_stmt_.Rls(stmt_delete); stmt_select = Db_stmt_.Rls(stmt_select); stmt_update = Db_stmt_.Rls(stmt_update); } diff --git a/400_xowa/src/gplx/xowa/specials/deletes/Xodel_page_special.java b/400_xowa/src/gplx/xowa/specials/deletes/Xodel_page_special.java new file mode 100644 index 000000000..14d4b2829 --- /dev/null +++ b/400_xowa/src/gplx/xowa/specials/deletes/Xodel_page_special.java @@ -0,0 +1,39 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.specials.deletes; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; +import gplx.xowa.specials.*; import gplx.xowa.wikis.nss.*; +import gplx.core.net.qargs.*; +public class Xodel_page_special implements Xow_special_page { + public void Special__gen(Xow_wiki wikii, Xoa_page pagei, Xoa_url url, Xoa_ttl ttl) { + Xowe_wiki wiki = (Xowe_wiki)wikii; Xoae_page page = (Xoae_page)pagei; + + Gfo_qarg_mgr url_args = new Gfo_qarg_mgr().Init(url.Qargs_ary()); + byte[] page_title_bry = url_args.Read_bry_or_fail("delete"); + Xoa_ttl page_title = wiki.Ttl_parse(page_title_bry); + + gplx.xowa.addons.wikis.directorys.specials.items.bldrs.Xopg_db_mgr.Delete(wiki, page_title); + + wiki.Data_mgr().Redirect(page, wiki.Props().Main_page()); + } + + public static final String SPECIAL_KEY = "XowaPageDelete"; + public static final byte[] Display_ttl = Bry_.new_a7("Delete Page"); + public Xow_special_meta Special__meta() {return new Xow_special_meta(Xow_special_meta_.Src__mw, SPECIAL_KEY);} + public static final Xow_special_page Prototype = new Xodel_page_special(); + public Xow_special_page Special__clone() {return this;} +} diff --git a/400_xowa/src/gplx/xowa/wikis/data/site_stats/Xowd_site_stats_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/site_stats/Xowd_site_stats_tbl.java index fdb21766c..4564c468d 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/site_stats/Xowd_site_stats_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/site_stats/Xowd_site_stats_tbl.java @@ -32,11 +32,13 @@ public class Xowd_site_stats_tbl implements Db_tbl { conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds)); conn.Stmt_insert(tbl_name, flds).Val_int(fld_row_id, Site_stats_row_id).Val_long(fld_good_articles, 0).Val_long(fld_total_pages, 0).Val_int(fld_images, 0).Exec_insert(); } - public void Update(int num_articles, int num_pages, int num_files) { + public void Update(long num_articles, long num_pages, int num_files) { + Gfo_usr_dlg_.Instance.Log_many("", "", "db.site_stats: update started: num_articles=~{0} num_pages=~{1} num_files=~{2}", num_articles, num_pages, num_files); Db_stmt stmt = conn.Stmt_update(tbl_name, String_.Ary(fld_row_id), fld_good_articles, fld_total_pages, fld_images); stmt.Val_long(fld_good_articles, num_articles).Val_long(fld_total_pages, num_pages).Val_int(fld_images, num_files) .Crt_int(fld_row_id, Site_stats_row_id) .Exec_update(); + Gfo_usr_dlg_.Instance.Log_many("", "", "db.site_stats: update done"); } public void Select(Xowd_site_stats_mgr stats) { Db_rdr rdr = conn.Stmt_select(tbl_name, flds, fld_row_id).Crt_int(fld_row_id, Site_stats_row_id).Exec_select__rls_auto(); 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 c91cede8e..ce9613693 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 @@ -365,6 +365,12 @@ public class Xowd_page_tbl implements Db_tbl { .Exec_update() ; } + 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(); + Gfo_usr_dlg_.Instance.Log_many("", "", "db.page: delete 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_site_ns_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_site_ns_tbl.java index 92ad36580..5e1f3e96e 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_site_ns_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_site_ns_tbl.java @@ -76,11 +76,13 @@ public class Xowd_site_ns_tbl implements Db_tbl { } finally {rdr.Rls();} } public void Update_ns_count(int ns_id, int ns_count) { + Gfo_usr_dlg_.Instance.Log_many("", "", "db.site_ns: update started: ns_id=~{0} ns_count=~{1}", ns_id, ns_count); Db_stmt stmt = conn.Stmt_update(tbl_name, String_.Ary(fld_id), fld_count); stmt.Clear() .Val_int(fld_count, ns_count) .Crt_int(fld_id, ns_id) .Exec_update(); + Gfo_usr_dlg_.Instance.Log_many("", "", "db.site_ns: update done"); } public void Rls() {} 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 83578e988..51a154d5f 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 @@ -44,6 +44,11 @@ public class Xowd_text_tbl implements Db_tbl { text = zip_mgr.Zip(zip_tid, text); stmt.Clear().Val_bry(fld_text_data, text).Crt_int(fld_page_id, page_id).Exec_update(); } + public void Delete(int page_id) { + Gfo_usr_dlg_.Instance.Log_many("", "", "db.text: 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.text: delete 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);