diff --git a/140_dbs/src/gplx/dbs/stmts/Db_stmt_arg_list.java b/140_dbs/src/gplx/dbs/stmts/Db_stmt_arg_list.java index ba05da61b..3e2a67096 100644 --- a/140_dbs/src/gplx/dbs/stmts/Db_stmt_arg_list.java +++ b/140_dbs/src/gplx/dbs/stmts/Db_stmt_arg_list.java @@ -45,6 +45,7 @@ public class Db_stmt_arg_list { case Dbmeta_fld_tid.Tid__float: stmt.Crt_float (key, Float_.cast(val)); break; case Dbmeta_fld_tid.Tid__double: stmt.Crt_double (key, Double_.cast(val)); break; case Dbmeta_fld_tid.Tid__str: stmt.Crt_str (key, String_.cast(val)); break; + case Dbmeta_fld_tid.Tid__text: stmt.Crt_text (key, String_.cast(val)); break; case Dbmeta_fld_tid.Tid__bry: stmt.Crt_bry (key, Bry_.cast(val)); break; default: throw Err_.new_unhandled_default(tid); } @@ -58,6 +59,7 @@ public class Db_stmt_arg_list { case Dbmeta_fld_tid.Tid__float: stmt.Val_float (key, Float_.cast(val)); break; case Dbmeta_fld_tid.Tid__double: stmt.Val_double (key, Double_.cast(val)); break; case Dbmeta_fld_tid.Tid__str: stmt.Val_str (key, String_.cast(val)); break; + case Dbmeta_fld_tid.Tid__text: stmt.Val_text (key, String_.cast(val)); break; case Dbmeta_fld_tid.Tid__bry: stmt.Val_bry (key, Bry_.cast(val)); break; default: throw Err_.new_unhandled_default(tid); } diff --git a/140_dbs/src/gplx/dbs/utls/Db_tbl__crud_.java b/140_dbs/src/gplx/dbs/utls/Db_tbl__crud_.java index ae7f7831f..cd9830475 100644 --- a/140_dbs/src/gplx/dbs/utls/Db_tbl__crud_.java +++ b/140_dbs/src/gplx/dbs/utls/Db_tbl__crud_.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.dbs.utls; import gplx.*; import gplx.dbs.*; import gplx.dbs.stmts.*; public class Db_tbl__crud_ { - public static void Upsert(Db_conn conn, String tbl_name, Dbmeta_fld_list flds, String[] crt_cols, Object... objs) { + public static boolean Upsert(Db_conn conn, String tbl_name, Dbmeta_fld_list flds, String[] crt_cols, Object... objs) { // init int crt_cols_len = crt_cols.length; String[] val_cols = Find_excepts(flds, crt_cols); @@ -38,6 +38,7 @@ public class Db_tbl__crud_ { Add_arg(update_stmt, flds, val_cols, objs, Bool_.N, crt_cols_len); update_stmt.Exec_update(); update_stmt.Rls(); + return false; } // insert else { @@ -46,6 +47,7 @@ public class Db_tbl__crud_ { Add_arg(insert_stmt, flds, val_cols, objs, Bool_.N, crt_cols_len); insert_stmt.Exec_insert(); insert_stmt.Rls(); + return true; } } private static String[] Find_excepts(Dbmeta_fld_list flds, String[] cols) { diff --git a/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v2_bldr.java b/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v2_bldr.java index 1608b9aa5..2c11dcfa1 100644 --- a/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v2_bldr.java +++ b/400_xowa/src/gplx/fsdb/Fsdb_db_mgr__v2_bldr.java @@ -38,7 +38,7 @@ public class Fsdb_db_mgr__v2_bldr { return new Fsdb_db_mgr__v2(layout, wiki_dir, main_core_file, user_core_file); } private static Fsdb_db_file Load_core_file(Io_url url) {return new Fsdb_db_file(url, Db_conn_bldr.Instance.Get(url));} - private static Fsdb_db_file Make_core_file_main(Xow_wiki wiki, Io_url main_core_url, String main_core_name, Xow_db_layout layout) { + public static Fsdb_db_file Make_core_file_main(Xow_wiki wiki, Io_url main_core_url, String main_core_name, Xow_db_layout layout) { Db_conn conn = layout.Tid_is_all() ? Db_conn_bldr.Instance.Get(main_core_url) : Db_conn_bldr.Instance.New(main_core_url); // if all, use existing (assumes same file name); else, create new conn.Txn_bgn("fsdb__core_file"); Fsdb_db_file rv = Make_core_file(main_core_url, conn, schema_is_1, Fsm_mnt_mgr.Mnt_idx_main); diff --git a/400_xowa/src/gplx/xowa/Xow_wiki_.java b/400_xowa/src/gplx/xowa/Xow_wiki_.java index 66e8e9c43..1ca05227f 100644 --- a/400_xowa/src/gplx/xowa/Xow_wiki_.java +++ b/400_xowa/src/gplx/xowa/Xow_wiki_.java @@ -16,8 +16,21 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa; import gplx.*; -import gplx.xowa.wikis.*; +import gplx.dbs.*; +import gplx.core.ios.streams.*; +import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.nss.*; +import gplx.xowa.bldrs.infos.*; +import gplx.xowa.langs.*; public class Xow_wiki_ { + public static void Create(Xoa_app app, Xow_ns_mgr ns_mgr, String domain, Io_url core_url) { + Xowd_core_db_props props = new Xowd_core_db_props( 1, Xow_db_layout.Itm_all, Xow_db_layout.Itm_all, Xow_db_layout.Itm_all, Io_stream_tid_.Tid__raw, Io_stream_tid_.Tid__raw, Bool_.N, Bool_.N); + Xow_db_file core_db = Xow_db_file__core_.Make_core_db(props, Xob_info_session.new_(app.User().Key(), domain, domain), core_url, domain); + core_db.Tbl__text().Create_tbl(); + core_db.Tbl__site_stats().Update(0, 0, 0); // save page stats + core_db.Tbl__ns().Insert(ns_mgr); // save ns + core_db.Tbl__cfg().Insert_str(Xow_cfg_consts.Grp__wiki_init, Xow_cfg_consts.Key__init__main_page, "Main_Page"); + core_db.Tbl__cfg().Insert_str(Xow_cfg_consts.Grp__wiki_init, Xow_cfg_consts.Key__init__modified_latest, Datetime_now.Get().XtoStr_fmt(DateAdp_.Fmt_iso8561_date_time)); + } public static void Create_sql_backend(Xow_wiki wiki, gplx.xowa.wikis.data.Xowd_core_db_props core_db_props, gplx.xowa.bldrs.infos.Xob_info_session session) { if (wiki.Type_is_edit()) { Xowe_wiki wikie = (Xowe_wiki)wiki; diff --git a/400_xowa/src/gplx/xowa/addons/users/wikis/regys/dbs/Xou_wiki_tbl.java b/400_xowa/src/gplx/xowa/addons/users/wikis/regys/dbs/Xou_wiki_tbl.java index d6033ae18..d3cc33ac6 100644 --- a/400_xowa/src/gplx/xowa/addons/users/wikis/regys/dbs/Xou_wiki_tbl.java +++ b/400_xowa/src/gplx/xowa/addons/users/wikis/regys/dbs/Xou_wiki_tbl.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.addons.users.wikis.regys.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.users.*; import gplx.xowa.addons.users.wikis.*; import gplx.xowa.addons.users.wikis.regys.*; -import gplx.dbs.*; +import gplx.dbs.*; import gplx.dbs.utls.*; public class Xou_wiki_tbl implements Db_tbl { private final Dbmeta_fld_list flds = new Dbmeta_fld_list(); private final String fld__wiki_id, fld__wiki_type, fld__wiki_domain, fld__wiki_name, fld__wiki_data_date, fld__wiki_core_url, fld__wiki_data; @@ -28,8 +28,8 @@ public class Xou_wiki_tbl implements Db_tbl { this.fld__wiki_type = flds.Add_int("wiki_type"); // enum: 0=user; 1=wmf; 2=wikia; this.fld__wiki_domain = flds.Add_str("wiki_domain", 255); // EX: "en.wikipedia.org" this.fld__wiki_name = flds.Add_str("wiki_name", 255); // EX: "English Wikipedia" - this.fld__wiki_data_date = flds.Add_str("wiki_data_date", 16); // EX: "20161001" this.fld__wiki_core_url = flds.Add_str("wiki_core_url", 255); // EX: "/xowa/wiki/en.wikipedia.org/en.wikipedia.org-core.xowa" + this.fld__wiki_data_date = flds.Add_str("wiki_data_date", 16); // EX: "20161001" this.fld__wiki_data = flds.Add_text("wiki_data"); // EX: '{category_level="1",search_level="2", ...}' conn.Rls_reg(this); } @@ -45,17 +45,8 @@ public class Xou_wiki_tbl implements Db_tbl { .Exec_insert() ; } - public void Upsert(int id, String key, String name, String file) { - if (id == -1) { - } - else { - conn.Stmt_update_exclude(tbl_name, flds, fld__wiki_id) - .Val_int(fld__wiki_type, 0).Val_str(fld__wiki_domain, key).Val_str(fld__wiki_name, name) - .Val_str(fld__wiki_data_date, "").Val_str(fld__wiki_core_url, file).Val_str(fld__wiki_data, "") - .Crt_int(fld__wiki_id, id) - .Exec_update() - ; - } + public boolean Upsert(int id, String domain, String name, String file) { + return Db_tbl__crud_.Upsert(conn, tbl_name, flds, String_.Ary(fld__wiki_id), id, 0, domain, name, file, "", ""); } public Xou_wiki_itm[] Select_all() { Db_rdr rdr = conn.Stmt_select(tbl_name, flds).Exec_select__rls_auto(); diff --git a/400_xowa/src/gplx/xowa/addons/users/wikis/regys/specials/itms/Xouw_itm_bridge.java b/400_xowa/src/gplx/xowa/addons/users/wikis/regys/specials/itms/Xouw_itm_bridge.java index 489e53f60..62ebb4828 100644 --- a/400_xowa/src/gplx/xowa/addons/users/wikis/regys/specials/itms/Xouw_itm_bridge.java +++ b/400_xowa/src/gplx/xowa/addons/users/wikis/regys/specials/itms/Xouw_itm_bridge.java @@ -24,15 +24,34 @@ public class Xouw_itm_bridge implements gplx.xowa.htmls.bridges.Bridge_cmd_itm { this.app = app; } public String Exec(Json_nde data) { - Xouw_db_mgr db_mgr = new Xouw_db_mgr(app.User().User_db_mgr().Conn()); byte proc_id = proc_hash.Get_as_byte_or(data.Get_as_bry_or(Msg__proc, null), Byte_ascii.Max_7_bit); Json_nde args = data.Get_kv(Msg__args).Val_as_nde(); switch (proc_id) { - case Proc__save: db_mgr.Tbl__wiki().Upsert(args.Get_as_int("id"), args.Get_as_str("key"), args.Get_as_str("name"), args.Get_as_str("file")); break; + case Proc__save: Save(args); break; default: throw Err_.new_unhandled_default(proc_id); } return ""; } + private void Save(Json_nde args) { + Xouw_db_mgr db_mgr = new Xouw_db_mgr(app.User().User_db_mgr().Conn()); + int id = args.Get_as_int("id"); + if (id == -1) { + id = 2; + } + String domain = args.Get_as_str("key"); + String url = args.Get_as_str("file"); + if (db_mgr.Tbl__wiki().Upsert(id, domain, args.Get_as_str("name"), url)) { + gplx.xowa.wikis.nss.Xow_ns_mgr ns_mgr = gplx.xowa.wikis.nss.Xow_ns_mgr_.default_(gplx.xowa.langs.cases.Xol_case_mgr_.U8()); + Xow_wiki_.Create(app, ns_mgr, domain, Io_url_.new_fil_(url).OwnerDir()); + Xowe_wiki wiki = new Xowe_wiki((Xoae_app)app, app.Lang_mgr().Get_by_or_en(Bry_.Empty), ns_mgr, gplx.xowa.wikis.domains.Xow_domain_itm_.parse(Bry_.new_u8(domain)), Io_url_.new_fil_(url).OwnerDir()); + gplx.fsdb.Fsdb_db_mgr__v2_bldr.Make_core_file_main(wiki, Io_url_.new_fil_(url), domain, gplx.xowa.wikis.data.Xow_db_layout.Itm_all); + wiki.Init_db_mgr(); + wiki.Init_by_wiki__force_and_mark_inited(); + wiki.Data__core_mgr().Dbs__make_by_id(1, gplx.xowa.wikis.data.Xow_db_file_.Tid__core, "", 0, ".xowa"); + wiki.Data__core_mgr().Db__core().Tbl__db().Commit_all(wiki.Data__core_mgr()); + wiki.Db_mgr().Save_mgr().Data_create(Xoa_ttl.Parse(wiki, Bry_.new_a7("Main_Page")), Bry_.new_a7("Main page created")); + } + } private static final byte[] Msg__proc = Bry_.new_a7("proc"), Msg__args = Bry_.new_a7("args"); private static final byte Proc__save = 0; private static final Hash_adp_bry proc_hash = Hash_adp_bry.cs() diff --git a/400_xowa/src/gplx/xowa/addons/users/wikis/regys/specials/itms/Xouw_itm_doc.java b/400_xowa/src/gplx/xowa/addons/users/wikis/regys/specials/itms/Xouw_itm_doc.java index e861b502e..664954fc6 100644 --- a/400_xowa/src/gplx/xowa/addons/users/wikis/regys/specials/itms/Xouw_itm_doc.java +++ b/400_xowa/src/gplx/xowa/addons/users/wikis/regys/specials/itms/Xouw_itm_doc.java @@ -19,9 +19,11 @@ package gplx.xowa.addons.users.wikis.regys.specials.itms; import gplx.*; import import gplx.core.ios.*; import gplx.langs.mustaches.*; class Xouw_itm_doc implements Mustache_doc_itm { + private final boolean mode_is_new; private final int id; private final String domain, name, file; public Xouw_itm_doc(int id, String domain, String name, String file) { + this.mode_is_new = id == -1; this.id = id; this.domain = domain; this.name = name; @@ -36,6 +38,7 @@ class Xouw_itm_doc implements Mustache_doc_itm { return true; } public Mustache_doc_itm[] Mustache__subs(String key) { + if (String_.Eq(key, "mode_is_new")) return Mustache_doc_itm_.Ary__bool(mode_is_new); return Mustache_doc_itm_.Ary__empty; } public static final Xouw_itm_doc[] Ary_empty = new Xouw_itm_doc[0]; diff --git a/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_save_mgr_sql.java b/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_save_mgr_sql.java index 43b113f00..a1e0da703 100644 --- a/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_save_mgr_sql.java +++ b/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_save_mgr_sql.java @@ -43,6 +43,7 @@ public class Xodb_save_mgr_sql implements Xodb_save_mgr { } Xow_db_mgr fsys_mgr = db_mgr.Core_data_mgr(); Xow_db_file page_text_db = fsys_mgr.Db__text(); + if (page_text_db == null) page_text_db = fsys_mgr.Db__core(); // HACK: needed for create new wiki DATE:2016-10-29 Xowd_text_tbl page_text_tbl = page_text_db.Tbl__text(); byte[] text_zip = page_text_tbl.Zip(text_raw); boolean redirect = db_mgr.Wiki().Redirect_mgr().Is_redirect(text_raw, text_raw.length);