From 235228976ecea6999a8985deae5e13d451e5921f Mon Sep 17 00:00:00 2001 From: gnosygnu Date: Sun, 17 Jan 2016 23:18:07 -0500 Subject: [PATCH] v3.1.3.1 --- 100_core/src/gplx/Bry_.java | 8 +- 100_core/src/gplx/Io_url.java | 11 +- 100_core/src/gplx/Object_.java | 1 + 100_core/src/gplx/String_.java | 7 + .../src/gplx/core/brys/Bry_err_wkr.java | 6 + .../src/gplx/core/brys/Bry_rdr.java | 66 +++- .../src/gplx/core/brys/Bry_rdr_tst.java | 0 .../src/gplx/core/encoders/Gfo_hzip_int_.java | 6 +- .../srls/Dbmeta_dat_itm.java} | 11 +- .../srls/Dbmeta_dat_mgr.java} | 16 +- .../srls/Gfo_srl_ctx.java} | 11 +- .../srls/Gfo_srl_itm.java} | 11 +- .../src/gplx/core/srls/Gfo_srl_mgr_rdr.java | 26 ++ .../src/gplx/core/srls/Gfo_srl_mgr_wtr.java | 27 ++ 140_dbs/src/gplx/dbs/Db_conn.java | 20 +- 140_dbs/src/gplx/dbs/Db_conn_bldr.java | 6 + 140_dbs/src/gplx/dbs/Db_conn_utl.java | 54 ++++ 140_dbs/src/gplx/dbs/Db_crt_.java | 2 +- 140_dbs/src/gplx/dbs/Db_meta_fld.java | 47 --- 140_dbs/src/gplx/dbs/Db_meta_idx.java | 35 -- 140_dbs/src/gplx/dbs/Db_meta_tbl.java | 43 --- 140_dbs/src/gplx/dbs/Db_sql_select.java | 2 +- 140_dbs/src/gplx/dbs/Db_stmt.java | 4 +- 140_dbs/src/gplx/dbs/Db_stmt_bldr.java | 2 +- 140_dbs/src/gplx/dbs/Dbmeta_fld_itm.java | 64 ++++ ...eta_fld_list.java => Dbmeta_fld_list.java} | 50 +-- 140_dbs/src/gplx/dbs/Dbmeta_idx_itm.java | 53 +++ 140_dbs/src/gplx/dbs/Dbmeta_tbl_itm.java | 43 +++ 140_dbs/src/gplx/dbs/diffs/Gfdb_diff_cmd.java | 58 ++++ .../src/gplx/dbs/diffs/Gfdb_diff_db.java | 0 .../src/gplx/dbs/diffs/Gfdb_diff_db_.java | 0 140_dbs/src/gplx/dbs/diffs/Gfdb_diff_tbl.java | 86 +++++ .../src/gplx/dbs/diffs/Gfdb_diff_tbl_mgr.java | 35 ++ 140_dbs/src/gplx/dbs/diffs/Gfdb_rdr_utl_.java | 59 ++++ .../gplx/dbs/diffs/builds/Gfdb_diff_bldr.java | 11 +- .../dbs/diffs/builds/Gfdb_diff_bldr_tst.java | 105 ++++++ .../diffs/builds/Gfdb_diff_rdr_comparer.java | 66 ++++ .../gplx/dbs/diffs/builds/Gfdb_diff_wkr.java | 6 +- .../dbs/diffs/builds/Gfdb_diff_wkr__db.java | 52 +-- .../gplx/dbs/diffs/cmds/Gfdb_diff_cmd.java | 305 ++++++++++++++++++ .../cmds/Gfdb_diff_cmd__idx__create.java | 119 +++++++ .../cmds}/Gfdb_diff_cmd_sql_bldr_tst.java | 2 +- 140_dbs/src/gplx/dbs/engines/Db_engine.java | 9 +- .../gplx/dbs/engines/Db_engine_sql_base.java | 33 +- .../gplx/dbs/engines/mems/Db_engine__mem.java | 13 +- .../gplx/dbs/engines/mems/Db_stmt__mem.java | 2 +- .../src/gplx/dbs/engines/mems/Mem_tbl.java | 11 +- .../gplx/dbs/engines/mysql/Mysql_engine.java | 3 +- .../gplx/dbs/engines/nulls/Noop_engine.java | 9 +- .../dbs/engines/postgres/Postgres_engine.java | 3 +- .../dbs/engines/sqlite/Sqlite_engine.java | 6 +- .../dbs/engines/sqlite/Sqlite_engine_.java | 4 +- .../dbs/engines/sqlite/Sqlite_schema_mgr.java | 29 +- .../gplx/dbs/engines/sqlite/Sqlite_tid.java | 21 ++ .../src/gplx/dbs/engines/tdbs/TdbEngine.java | 19 +- .../src/gplx/dbs/metas/Dbmeta_fld_mgr.java | 28 ++ .../src/gplx/dbs/metas/Dbmeta_fld_tid.java | 70 ++++ .../src/gplx/dbs/metas/Dbmeta_idx_fld.java | 39 +++ .../src/gplx/dbs/metas/Dbmeta_idx_mgr.java | 28 ++ ...{Meta_itm_tid.java => Dbmeta_itm_tid.java} | 2 +- ...{Meta_tbl_mgr.java => Dbmeta_tbl_mgr.java} | 13 +- 140_dbs/src/gplx/dbs/metas/Meta_fld_itm.java | 31 -- 140_dbs/src/gplx/dbs/metas/Meta_type_itm.java | 28 -- .../metas/parsers/Dbmeta_fld_wkr__base.java | 119 +++++++ .../dbs/metas/parsers/Dbmeta_parser__fld.java | 112 +++++++ .../metas/parsers/Dbmeta_parser__fld_tst.java | 71 ++++ .../dbs/metas/parsers/Dbmeta_parser__idx.java | 59 ++++ .../metas/parsers/Dbmeta_parser__idx_tst.java | 37 +++ .../dbs/metas/parsers/Dbmeta_parser__tbl.java | 51 +++ ...l_tst.java => Dbmeta_parser__tbl_tst.java} | 27 +- .../dbs/metas/parsers/Meta_fld_wkr__base.java | 117 ------- .../dbs/metas/parsers/Meta_parser__fld.java | 118 ------- .../metas/parsers/Meta_parser__fld_tst.java | 71 ---- .../dbs/metas/parsers/Meta_parser__tbl.java | 57 ---- .../gplx/dbs/metas/parsers/Sql_bry_rdr.java | 17 +- .../dbs/metas/parsers/Sql_bry_rdr_tst.java | 4 +- 140_dbs/src/gplx/dbs/qrys/Db_qry_insert.java | 2 +- 140_dbs/src/gplx/dbs/qrys/Db_qry_update.java | 2 +- 140_dbs/src/gplx/dbs/qrys/Db_stmt_cmd.java | 16 +- 140_dbs/src/gplx/dbs/qrys/Db_stmt_sql.java | 2 +- .../src/gplx/dbs/sqls/Db_sqlbldr__sqlite.java | 59 ++-- 140_dbs/src/gplx/dbs/sqls/Db_sqlbldr_tst.java | 14 +- 400_xowa/src/gplx/dbs/Db_diff_bldr.java | 18 +- 400_xowa/src/gplx/dbs/cfgs/Db_cfg_tbl.java | 6 +- .../src/gplx/dbs/diffs/Gfdb_diff_tbl.java | 34 -- .../src/gplx/dbs/diffs/Gfdb_rdr_utl_.java | 56 ---- .../dbs/diffs/builds/Gfdb_diff_bldr_tst.java | 123 ------- .../diffs/builds/Gfdb_diff_rdr_comparer.java | 66 ---- .../gplx/dbs/diffs/merges/Gfdb_diff_cmd.java | 123 ------- .../src/gplx/dbs/metas/Schema_db_mgr.java | 2 +- .../gplx/dbs/metas/Schema_loader_mgr_.java | 11 +- .../metas/updates/Schema_update_mgr_tst.java | 4 +- 400_xowa/src/gplx/fsdb/data/Fsd_bin_tbl.java | 4 +- 400_xowa/src/gplx/fsdb/data/Fsd_dir_tbl.java | 6 +- 400_xowa/src/gplx/fsdb/data/Fsd_fil_tbl.java | 10 +- 400_xowa/src/gplx/fsdb/data/Fsd_thm_tbl.java | 8 +- 400_xowa/src/gplx/fsdb/meta/Fsm_atr_tbl.java | 6 +- 400_xowa/src/gplx/fsdb/meta/Fsm_bin_tbl.java | 10 +- 400_xowa/src/gplx/fsdb/meta/Fsm_mnt_tbl.java | 6 +- .../src/gplx/langs/htmls/docs/Gfh_tag.java | 4 + .../gplx/langs/htmls/docs/Gfh_tag_rdr.java | 6 +- .../htmls/encoders/Gfo_url_encoder_.java | 3 +- .../langs/htmls/styles/Gfh_style_parser_.java | 31 +- .../htmls/styles/Gfh_style_parser__tst.java | 6 + .../langs/htmls/styles/Gfh_style_wkr.java | 2 +- .../htmls/styles/Gfh_style_wkr__ary.java | 2 +- .../styles/Gfh_style_wkr__val_as_int.java | 2 +- .../langs/mustaches/Mustache_dom_itm.java | 71 ++++ 400_xowa/src/gplx/xowa/Xoa_app.java | 2 +- 400_xowa/src/gplx/xowa/Xoa_app_.java | 2 +- 400_xowa/src/gplx/xowa/Xoa_app_fxt.java | 2 +- 400_xowa/src/gplx/xowa/Xoa_ttl.java | 10 +- 400_xowa/src/gplx/xowa/Xoae_app.java | 2 +- 400_xowa/src/gplx/xowa/Xowe_wiki.java | 2 +- 400_xowa/src/gplx/xowa/apps/Xoav_app.java | 4 +- .../src/gplx/xowa/apps/Xoav_wiki_mgr.java | 46 +-- .../src/gplx/xowa/apps/cfgs/Xoa_cfg_mgr.java | 4 +- .../gplx/xowa/apps/cfgs/Xoa_cfg_mgr_tst.java | 2 +- .../apps/servers/http/Http_server_mgr.java | 2 +- .../apps/servers/http/Http_server_wkr_.java | 2 +- .../servers/http/Http_server_wkr__tst.java | 2 +- .../gplx/xowa/apps/urls/Xoa_url_parser.java | 6 +- .../xowa/apps/urls/Xoa_url_parser_fxt.java | 2 +- .../src/gplx/xowa/bldrs/Xob_cmd_base.java | 27 ++ .../src/gplx/xowa/bldrs/Xob_cmd_keys.java | 1 + 400_xowa/src/gplx/xowa/bldrs/Xob_cmd_mgr.java | 3 +- .../bldrs/cmds/diffs/Bfr_arg__dump_dir.java | 40 +++ .../bldrs/cmds/diffs/Xob_diff_build_wkr.java | 65 ++-- .../bldrs/cmds/diffs/Xob_diff_manifest.java | 49 +++ .../cmds/files/Xob_diff_regy_exec_cmd.java | 2 +- .../cmds/files/Xob_diff_regy_make_cmd.java | 4 +- .../bldrs/cmds/files/Xob_lnki_temp_tbl.java | 4 +- .../bldrs/cmds/files/Xob_lnki_temp_wkr.java | 2 +- .../bldrs/cmds/files/Xob_orig_regy_cmd.java | 2 +- .../bldrs/cmds/files/Xob_page_regy_cmd.java | 2 +- .../bldrs/cmds/texts/sqls/Xob_page_cmd.java | 3 +- .../cmds/texts/sqls/Xob_page_delete_cmd.java | 85 +++++ .../bldrs/cmds/texts/sqls/Xob_term_cmd.java | 2 + .../bldrs/cmds/wikis/Xob_page_dump_tbl.java | 6 +- .../filters/dansguardians/Dg_log_mgr.java | 24 +- .../xowa/bldrs/installs/Xoi_cmd_base.java | 4 +- .../xowa/bldrs/installs/Xoi_cmd_dumpfile.java | 2 +- .../gplx/xowa/bldrs/installs/Xoi_cmd_mgr.java | 2 +- .../bldrs/installs/Xoi_cmd_wiki_download.java | 2 +- .../bldrs/installs/Xoi_cmd_wiki_import.java | 2 +- .../bldrs/installs/Xoi_cmd_wiki_unzip.java | 2 +- .../xowa/bldrs/installs/Xoi_cmd_wiki_zip.java | 2 +- .../bldrs/setups/maints/Xoa_maint_mgr.java | 2 +- .../setups/maints/Xoa_maint_wikis_mgr.java | 4 +- .../src/gplx/xowa/bldrs/wms/Xoa_wmf_mgr.java | 2 +- .../xowa/bldrs/wms/sites/Site_core_tbl.java | 4 +- .../bldrs/wms/sites/Site_extension_tbl.java | 6 +- .../wms/sites/Site_interwikimap_tbl.java | 6 +- .../xowa/bldrs/wms/sites/Site_kv_tbl.java | 6 +- .../bldrs/wms/sites/Site_language_tbl.java | 6 +- .../bldrs/wms/sites/Site_library_tbl.java | 6 +- .../bldrs/wms/sites/Site_magicword_tbl.java | 6 +- .../bldrs/wms/sites/Site_namespace_tbl.java | 6 +- .../wms/sites/Site_namespacealias_tbl.java | 6 +- .../bldrs/wms/sites/Site_showhook_tbl.java | 6 +- .../xowa/bldrs/wms/sites/Site_skin_tbl.java | 6 +- .../wms/sites/Site_specialpagealias_tbl.java | 6 +- .../bldrs/wms/sites/Site_statistic_tbl.java | 6 +- .../xowa/bldrs/wms/sites/Site_val_tbl.java | 6 +- 400_xowa/src/gplx/xowa/drds/Xod_app.java | 25 +- 400_xowa/src/gplx/xowa/drds/Xod_app_tst.java | 4 +- .../src/gplx/xowa/files/Xoa_file_mgr.java | 32 +- .../src/gplx/xowa/files/Xof_file_itm.java | 3 +- .../src/gplx/xowa/files/Xof_file_wkr.java | 13 +- .../src/gplx/xowa/files/Xof_fsdb_itm.java | 7 +- .../src/gplx/xowa/files/Xof_xfer_itm.java | 5 +- .../src/gplx/xowa/files/Xow_file_mgr.java | 2 +- .../gplx/xowa/files/caches/Xofc_dir_tbl.java | 8 +- .../gplx/xowa/files/caches/Xofc_fil_mgr.java | 2 +- .../gplx/xowa/files/caches/Xofc_fil_tbl.java | 10 +- .../xowa/files/caches/Xou_cache_finder.java | 23 ++ .../xowa/files/caches/Xou_cache_finder_.java | 79 +++++ .../gplx/xowa/files/caches/Xou_cache_mgr.java | 2 +- .../gplx/xowa/files/caches/Xou_cache_tbl.java | 14 +- .../files/commons/Xof_commons_image_tbl.java | 8 +- .../files/fsdb/fs_roots/Orig_fil_tbl.java | 6 +- .../gplx/xowa/files/origs/Xof_orig_tbl.java | 8 +- .../xowa/files/repos/Xofw_wiki_wkr_base.java | 6 +- .../gplx/xowa/files/repos/Xowe_repo_mgr.java | 14 +- .../gplx/xowa/files/xfers/Xof_xfer_mgr.java | 4 +- .../gplx/xowa/files/xfers/Xof_xfer_queue.java | 4 +- .../gplx/xowa/guis/Xogv_page_load_wkr.java | 2 +- .../src/gplx/xowa/guis/Xogv_tab_base.java | 2 +- .../xowa/guis/views/Xog_launcher_tabs.java | 2 +- .../src/gplx/xowa/guis/views/Xog_tab_itm.java | 2 +- .../src/gplx/xowa/guis/views/Xog_win_itm.java | 2 +- .../xowa/htmls/core/Xow_hdump_mgr__load.java | 58 ++-- .../xowa/htmls/core/bldrs/Xob_hdump_bldr.java | 1 + .../htmls/core/bldrs/Xob_link_dump_tbl.java | 10 +- .../xowa/htmls/core/dbs/Xoh_page_tbl.java | 4 +- .../xowa/htmls/core/dbs/Xoh_redlink_tbl.java | 4 +- .../htmls/core/hzips/Xoh_hzip_int__tst.java | 6 +- .../xowa/htmls/core/hzips/Xoh_stat_tbl.java | 4 +- .../core/makes/Xoh_make_mgr__file__tst.java | 91 ------ .../xowa/htmls/core/wkrs/Xoh_hdoc_ctx.java | 8 +- .../xowa/htmls/core/wkrs/Xoh_hzip_fxt.java | 6 + .../core/wkrs/bfr_args/Bfr_arg__hatr_id.java | 6 +- .../core/wkrs/glys/Xoh_gly_grp_data.java | 39 ++- .../htmls/core/wkrs/glys/Xoh_gly_grp_wtr.java | 27 +- .../wkrs/glys/Xoh_gly_html__dump__tst.java | 8 +- .../htmls/core/wkrs/glys/Xoh_gly_hzip.java | 44 +-- .../core/wkrs/glys/Xoh_gly_hzip_tst.java | 225 +++++++++++-- .../core/wkrs/glys/Xoh_gly_itm_data.java | 16 +- .../htmls/core/wkrs/glys/Xoh_gly_itm_wtr.java | 12 +- .../htmls/core/wkrs/hdrs/Xoh_hdr_data.java | 2 +- .../core/wkrs/hdrs/Xoh_hdr_make_tst.java | 15 +- .../htmls/core/wkrs/hdrs/Xoh_hdr_wtr.java | 4 +- .../core/wkrs/imgs/Xoh_img_bare_data.java | 24 +- .../core/wkrs/imgs/Xoh_img_bare_hzip.java | 31 +- .../core/wkrs/imgs/Xoh_img_bare_wtr.java | 18 +- .../htmls/core/wkrs/imgs/Xoh_img_data.java | 62 +++- .../wkrs/imgs/Xoh_img_html__dump__tst.java | 12 +- .../htmls/core/wkrs/imgs/Xoh_img_hzip.java | 134 ++++---- .../wkrs/imgs/Xoh_img_hzip__dump__tst.java | 110 +++++-- .../wkrs/imgs/Xoh_img_hzip__view__tst.java | 4 +- .../wkrs/imgs/Xoh_img_make__dump__tst.java | 8 +- .../htmls/core/wkrs/imgs/Xoh_img_wtr.java | 65 ++-- .../wkrs/imgs/atrs/Xoh_img_xoimg_data.java | 22 +- .../wkrs/imgs/atrs/Xoh_img_xoimg_hzip.java | 10 +- .../htmls/core/wkrs/lnkis/Xoh_lnki_data.java | 23 +- .../htmls/core/wkrs/lnkis/Xoh_lnki_dict_.java | 2 +- .../wkrs/lnkis/Xoh_lnki_html__hdump__tst.java | 3 + .../htmls/core/wkrs/lnkis/Xoh_lnki_hzip.java | 64 ++-- .../wkrs/lnkis/Xoh_lnki_hzip__ns__tst.java | 13 +- .../wkrs/lnkis/Xoh_lnki_hzip__same__tst.java | 4 +- .../wkrs/lnkis/Xoh_lnki_hzip__site__tst.java | 4 +- .../core/wkrs/lnkis/anchs/Xoh_anch_cls_.java | 44 +++ .../wkrs/lnkis/anchs/Xoh_anch_href_data.java | 6 +- .../lnkis/htmls/Xoh_file_html_fmtr__base.java | 32 +- .../htmls/Xoh_file_html_fmtr__hdump.java | 60 ++-- .../core/wkrs/lnkis/htmls/Xoh_file_mgr.java | 4 +- .../lnkis/htmls/Xoh_file_wtr__audio__tst.java | 100 ++++++ .../wkrs/lnkis/htmls/Xoh_file_wtr__basic.java | 2 +- ...tst.java => Xoh_file_wtr__image__tst.java} | 33 +- ...tst.java => Xoh_file_wtr__media__tst.java} | 5 +- .../lnkis/htmls/Xoh_file_wtr__video__tst.java | 104 ++++++ .../htmls/Xoh_file_wtr_audio_video_tst.java | 222 ------------- .../htmls/core/wkrs/tags/Xoh_tag_parser.java | 4 +- .../htmls/core/wkrs/thms/Xoh_thm_data.java | 16 +- .../core/wkrs/thms/Xoh_thm_html_tst.java | 22 +- .../htmls/core/wkrs/thms/Xoh_thm_hzip.java | 46 +-- .../core/wkrs/thms/Xoh_thm_hzip_tst.java | 174 ++++++++-- .../htmls/core/wkrs/thms/Xoh_thm_wtr.java | 55 ++-- .../wkrs/thms/divs/Xoh_thm_caption_data.java | 77 +++-- .../core/wkrs/xndes/styles/Hz_atr_itm.java | 10 +- .../xowa/htmls/hrefs/Xoh_href_parser.java | 2 +- .../xowa/htmls/hrefs/Xoh_href_wtr_tst.java | 2 +- .../gplx/xowa/htmls/js/Xoh_js_cleaner.java | 2 +- .../htmls/modules/popups/Xow_popup_mgr.java | 4 +- .../htmls/ns_files/Xoh_file_page_wtr.java | 12 +- .../ns_files/Xoh_ns_file_page_mgr_tst.java | 12 +- .../xowa/htmls/sections/Xoh_section_mgr.java | 5 +- .../xowa/parsers/lnkis/Xop_link_parser.java | 13 +- .../parsers/lnkis/Xop_lnki_wkr__link_tst.java | 2 +- .../gplx/xowa/parsers/vnts/Vnt_log_tbl.java | 4 +- .../gplx/xowa/specials/search/Xows_core.java | 2 +- .../xowa/specials/xowa/diags/Db_rdr_utl.java | 2 +- .../xowa/diags/Xows_cmd__file_check.java | 2 +- .../xowa/diags/Xows_cmd__fs_check.java | 2 +- .../xowa/diags/Xows_cmd__sql_dump.java | 2 +- .../file_browsers/Xosp_fbrow_cmd__base.java | 50 ++- .../file_browsers/Xosp_fbrow_special_tst.java | 134 ++++---- 400_xowa/src/gplx/xowa/users/Xouv_user.java | 2 +- .../xowa/users/bmks/Xoud_bmk_dir_tbl.java | 4 +- .../xowa/users/bmks/Xoud_bmk_itm_tbl.java | 4 +- .../gplx/xowa/users/data/Xoud_site_tbl.java | 4 +- .../gplx/xowa/users/data/Xoud_user_tbl.java | 8 +- .../xowa/users/history/Xoud_history_tbl.java | 4 +- .../src/gplx/xowa/wikis/Xoa_wiki_mgr.java | 13 +- .../src/gplx/xowa/wikis/Xoae_wiki_mgr.java | 77 ++--- .../gplx/xowa/wikis/ctgs/Xoctg_fmtr_all.java | 4 +- .../xowa/wikis/ctgs/Xoctg_html_mgr_tst.java | 8 + .../gplx/xowa/wikis/data/Xow_data_mgr.java | 2 +- .../wikis/data/tbls/Xowd_cat_core_tbl.java | 6 +- .../data/tbls/Xowd_cat_core_tbl__in_wkr.java | 4 +- .../wikis/data/tbls/Xowd_cat_link_tbl.java | 10 +- .../wikis/data/tbls/Xowd_css_core_tbl.java | 4 +- .../wikis/data/tbls/Xowd_css_file_tbl.java | 4 +- .../xowa/wikis/data/tbls/Xowd_page_tbl.java | 16 +- .../wikis/data/tbls/Xowd_pagelinks_tbl.java | 8 +- .../data/tbls/Xowd_pagelinks_temp_tbl.java | 6 +- .../wikis/data/tbls/Xowd_search_link_tbl.java | 12 +- .../wikis/data/tbls/Xowd_search_temp_tbl.java | 6 +- .../wikis/data/tbls/Xowd_search_word_tbl.java | 12 +- .../wikis/data/tbls/Xowd_site_ns_tbl.java | 4 +- .../wikis/data/tbls/Xowd_site_stats_tbl.java | 4 +- .../xowa/wikis/data/tbls/Xowd_text_tbl.java | 4 +- .../wikis/data/tbls/Xowd_wbase_pid_tbl.java | 6 +- .../wikis/data/tbls/Xowd_wbase_qid_tbl.java | 6 +- .../wikis/data/tbls/Xowd_xowa_db_tbl.java | 6 +- .../xowa/wikis/dbs/Xodb_save_mgr_sql.java | 2 +- .../src/gplx/xowa/wikis/nss/Xow_ns_mgr.java | 1 + .../gplx/xowa/xtns/cldrs/Cldr_lang_tbl.java | 4 +- .../xowa/xtns/gallery/Gallery_html_wtr.java | 2 +- .../xowa/xtns/gallery/Gallery_mgr_base.java | 11 +- .../gallery/Gallery_mgr_base_basic_tst.java | 12 +- .../gplx/xowa/xtns/imaps/Imap_html_fmtrs.java | 3 +- .../xowa/xtns/imaps/Imap_img_fmtr_arg.java | 44 +-- .../src/gplx/xowa/xtns/imaps/Imap_map.java | 8 +- .../gplx/xowa/xtns/imaps/Imap_xtn_mgr.java | 12 +- .../xtns/pfuncs/ifs/Pfunc_ifexist_tst.java | 4 +- .../xowa/xtns/pfuncs/langs/Pfunc_int_tst.java | 2 +- .../xowa/xtns/pfuncs/ttls/Pfunc_filepath.java | 2 +- .../scribunto/libs/Scrib_lib_title_tst.java | 4 +- .../gplx/xowa/xtns/wdatas/Wdata_wiki_mgr.java | 2 +- .../specials/Wdata_itemByTitle_page.java | 2 +- .../en.wikipedia.org-file-user.xowa | Bin 57344 -> 57344 bytes .../en.wikipedia.org-file.xowa | Bin 57344 -> 57344 bytes .../en.wikipedia.org-text.xowa | Bin 36864 -> 36864 bytes 314 files changed, 4458 insertions(+), 2694 deletions(-) rename {400_xowa => 100_core}/src/gplx/core/brys/Bry_err_wkr.java (92%) rename {400_xowa => 100_core}/src/gplx/core/brys/Bry_rdr.java (63%) rename {400_xowa => 100_core}/src/gplx/core/brys/Bry_rdr_tst.java (100%) rename 400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_int_.java => 100_core/src/gplx/core/encoders/Gfo_hzip_int_.java (90%) rename 140_dbs/src/gplx/{dbs/metas/Meta_idx_itm.java => core/srls/Dbmeta_dat_itm.java} (70%) rename 140_dbs/src/gplx/{dbs/metas/Meta_fld_mgr.java => core/srls/Dbmeta_dat_mgr.java} (64%) rename 140_dbs/src/gplx/{dbs/metas/Meta_idx_mgr.java => core/srls/Gfo_srl_ctx.java} (67%) rename 140_dbs/src/gplx/{dbs/metas/Meta_tbl_itm.java => core/srls/Gfo_srl_itm.java} (64%) create mode 100644 140_dbs/src/gplx/core/srls/Gfo_srl_mgr_rdr.java create mode 100644 140_dbs/src/gplx/core/srls/Gfo_srl_mgr_wtr.java create mode 100644 140_dbs/src/gplx/dbs/Db_conn_utl.java delete mode 100644 140_dbs/src/gplx/dbs/Db_meta_fld.java delete mode 100644 140_dbs/src/gplx/dbs/Db_meta_idx.java delete mode 100644 140_dbs/src/gplx/dbs/Db_meta_tbl.java create mode 100644 140_dbs/src/gplx/dbs/Dbmeta_fld_itm.java rename 140_dbs/src/gplx/dbs/{Db_meta_fld_list.java => Dbmeta_fld_list.java} (52%) create mode 100644 140_dbs/src/gplx/dbs/Dbmeta_idx_itm.java create mode 100644 140_dbs/src/gplx/dbs/Dbmeta_tbl_itm.java create mode 100644 140_dbs/src/gplx/dbs/diffs/Gfdb_diff_cmd.java rename {400_xowa => 140_dbs}/src/gplx/dbs/diffs/Gfdb_diff_db.java (100%) rename {400_xowa => 140_dbs}/src/gplx/dbs/diffs/Gfdb_diff_db_.java (100%) create mode 100644 140_dbs/src/gplx/dbs/diffs/Gfdb_diff_tbl.java create mode 100644 140_dbs/src/gplx/dbs/diffs/Gfdb_diff_tbl_mgr.java create mode 100644 140_dbs/src/gplx/dbs/diffs/Gfdb_rdr_utl_.java rename {400_xowa => 140_dbs}/src/gplx/dbs/diffs/builds/Gfdb_diff_bldr.java (74%) create mode 100644 140_dbs/src/gplx/dbs/diffs/builds/Gfdb_diff_bldr_tst.java create mode 100644 140_dbs/src/gplx/dbs/diffs/builds/Gfdb_diff_rdr_comparer.java rename {400_xowa => 140_dbs}/src/gplx/dbs/diffs/builds/Gfdb_diff_wkr.java (86%) rename {400_xowa => 140_dbs}/src/gplx/dbs/diffs/builds/Gfdb_diff_wkr__db.java (53%) create mode 100644 140_dbs/src/gplx/dbs/diffs/cmds/Gfdb_diff_cmd.java create mode 100644 140_dbs/src/gplx/dbs/diffs/cmds/Gfdb_diff_cmd__idx__create.java rename {400_xowa/src/gplx/dbs/diffs/merges => 140_dbs/src/gplx/dbs/diffs/cmds}/Gfdb_diff_cmd_sql_bldr_tst.java (95%) create mode 100644 140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_tid.java create mode 100644 140_dbs/src/gplx/dbs/metas/Dbmeta_fld_mgr.java create mode 100644 140_dbs/src/gplx/dbs/metas/Dbmeta_fld_tid.java create mode 100644 140_dbs/src/gplx/dbs/metas/Dbmeta_idx_fld.java create mode 100644 140_dbs/src/gplx/dbs/metas/Dbmeta_idx_mgr.java rename 140_dbs/src/gplx/dbs/metas/{Meta_itm_tid.java => Dbmeta_itm_tid.java} (96%) rename 140_dbs/src/gplx/dbs/metas/{Meta_tbl_mgr.java => Dbmeta_tbl_mgr.java} (65%) delete mode 100644 140_dbs/src/gplx/dbs/metas/Meta_fld_itm.java delete mode 100644 140_dbs/src/gplx/dbs/metas/Meta_type_itm.java create mode 100644 140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_fld_wkr__base.java create mode 100644 140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_parser__fld.java create mode 100644 140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_parser__fld_tst.java create mode 100644 140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_parser__idx.java create mode 100644 140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_parser__idx_tst.java create mode 100644 140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_parser__tbl.java rename 140_dbs/src/gplx/dbs/metas/parsers/{Meta_parser__tbl_tst.java => Dbmeta_parser__tbl_tst.java} (69%) delete mode 100644 140_dbs/src/gplx/dbs/metas/parsers/Meta_fld_wkr__base.java delete mode 100644 140_dbs/src/gplx/dbs/metas/parsers/Meta_parser__fld.java delete mode 100644 140_dbs/src/gplx/dbs/metas/parsers/Meta_parser__fld_tst.java delete mode 100644 140_dbs/src/gplx/dbs/metas/parsers/Meta_parser__tbl.java delete mode 100644 400_xowa/src/gplx/dbs/diffs/Gfdb_diff_tbl.java delete mode 100644 400_xowa/src/gplx/dbs/diffs/Gfdb_rdr_utl_.java delete mode 100644 400_xowa/src/gplx/dbs/diffs/builds/Gfdb_diff_bldr_tst.java delete mode 100644 400_xowa/src/gplx/dbs/diffs/builds/Gfdb_diff_rdr_comparer.java delete mode 100644 400_xowa/src/gplx/dbs/diffs/merges/Gfdb_diff_cmd.java create mode 100644 400_xowa/src/gplx/langs/mustaches/Mustache_dom_itm.java create mode 100644 400_xowa/src/gplx/xowa/bldrs/Xob_cmd_base.java create mode 100644 400_xowa/src/gplx/xowa/bldrs/cmds/diffs/Bfr_arg__dump_dir.java create mode 100644 400_xowa/src/gplx/xowa/bldrs/cmds/diffs/Xob_diff_manifest.java create mode 100644 400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_delete_cmd.java create mode 100644 400_xowa/src/gplx/xowa/files/caches/Xou_cache_finder.java create mode 100644 400_xowa/src/gplx/xowa/files/caches/Xou_cache_finder_.java delete mode 100644 400_xowa/src/gplx/xowa/htmls/core/makes/Xoh_make_mgr__file__tst.java create mode 100644 400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/anchs/Xoh_anch_cls_.java create mode 100644 400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__audio__tst.java rename 400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/{Xoh_file_wtr_basic_tst.java => Xoh_file_wtr__image__tst.java} (90%) rename 400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/{Xoh_file_wtr_media_tst.java => Xoh_file_wtr__media__tst.java} (94%) create mode 100644 400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__video__tst.java delete mode 100644 400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr_audio_video_tst.java diff --git a/100_core/src/gplx/Bry_.java b/100_core/src/gplx/Bry_.java index 701009a46..0ca394c86 100644 --- a/100_core/src/gplx/Bry_.java +++ b/100_core/src/gplx/Bry_.java @@ -23,6 +23,7 @@ public class Bry_ { public static final byte[] Empty = new byte[0]; public static final byte[][] Ary_empty = new byte[0][]; public static final Class Cls_ref_type = byte[].class; + public static byte[] cast(Object val) {return (byte[])val;} public static byte[] New_by_byte(byte b) {return new byte[] {b};} public static byte[] New_by_ints(int... ary) { int len = ary.length; @@ -833,13 +834,16 @@ public class Bry_ { if (src[i] == find) src[i] = replace; } } - public static byte[] Replace(byte[] src, byte find, byte replace) { + public static byte[] Replace(byte[] src, byte find, byte replace) {return Replace(src, 0, src.length, find, replace);} + public static byte[] Replace(byte[] src, int bgn, int end, byte find, byte replace) { int src_len = src.length; byte[] rv = new byte[src_len]; - for (int i = 0; i < src_len; i++) { + for (int i = bgn; i < end; ++i) { byte b = src[i]; rv[i] = b == find ? replace : b; } + for (int i = end; i < src_len; ++i) + rv[i] = src[i]; return rv; } public static byte[] Replace_safe(Bry_bfr bfr, byte[] src, byte[] find, byte[] repl) { diff --git a/100_core/src/gplx/Io_url.java b/100_core/src/gplx/Io_url.java index 595db7c0a..20656f8dd 100644 --- a/100_core/src/gplx/Io_url.java +++ b/100_core/src/gplx/Io_url.java @@ -21,16 +21,9 @@ public class Io_url implements CompareAble, ParseAble, GfoInvkAble { //_20101005 public IoUrlInfo Info() {return info;} IoUrlInfo info; public String Raw() {return raw;} final String raw; public byte[] RawBry() {return Bry_.new_u8(raw);} -// public byte[] Http_file_bry() { -// try {return Bry_.new_u8(String_.Concat(http_file_str, java.net.URLEncoder.encode(raw, "UTF-8")));} -// catch (Exception e) {throw Err_.err_(e, "Http_file_bry");} -// } - public String To_http_file_str() {return Http_file_str + Http_file_str_encoder.Encode_str(raw);} - public byte[] To_http_file_bry() { - return Bry_.Add(Http_file_bry, Http_file_str_encoder.Encode_bry(raw)); - } + public String To_http_file_str() {return String_.Len_eq_0(raw) ? String_.Empty : String_.Concat (Http_file_str, Http_file_str_encoder.Encode_str(raw));} + public byte[] To_http_file_bry() {return String_.Len_eq_0(raw) ? Bry_.Empty : Bry_.Add (Http_file_bry, Http_file_str_encoder.Encode_bry(raw));} public static Url_encoder_interface Http_file_str_encoder = Url_encoder_interface_same.Instance; - public static final String Http_file_str = "file:///"; public static final int Http_file_len = String_.Len(Http_file_str); public static final byte[] Http_file_bry = Bry_.new_a7(Http_file_str); diff --git a/100_core/src/gplx/Object_.java b/100_core/src/gplx/Object_.java index 8b5f9468e..955172876 100644 --- a/100_core/src/gplx/Object_.java +++ b/100_core/src/gplx/Object_.java @@ -37,6 +37,7 @@ public class Object_ { else if (lhs == null || rhs == null) return false; else return lhs.equals(rhs); } + public static String Xto_str_or(Object v, String or) {return v == null ? or : ToString_lang(v);} public static String Xto_str_strict_or_null(Object v) {return v == null ? null : ToString_lang(v);} public static String Xto_str_strict_or_null_mark(Object v) {return v == null ? String_.Null_mark : ToString_lang(v);} public static String Xto_str_strict_or_empty(Object v) {return v == null ? String_.Empty : ToString_lang(v);} diff --git a/100_core/src/gplx/String_.java b/100_core/src/gplx/String_.java index d9f3498b1..a8c927171 100644 --- a/100_core/src/gplx/String_.java +++ b/100_core/src/gplx/String_.java @@ -534,6 +534,13 @@ public class String_ implements GfoInvkAble { } return trg_ary; } + public static boolean Ary_eq(String[] lhs, String[] rhs) { + int lhs_len = lhs.length, rhs_len = rhs.length; + if (lhs_len != rhs_len) return false; + for (int i = 0; i < lhs_len; ++i) + if (!String_.Eq(lhs[i], rhs[i])) return false; + return true; + } public static String To_str__as_kv_ary(String... ary) { int len = ary.length; Bry_bfr bfr = Bry_bfr.new_(); diff --git a/400_xowa/src/gplx/core/brys/Bry_err_wkr.java b/100_core/src/gplx/core/brys/Bry_err_wkr.java similarity index 92% rename from 400_xowa/src/gplx/core/brys/Bry_err_wkr.java rename to 100_core/src/gplx/core/brys/Bry_err_wkr.java index 19dc85ade..abdeb566a 100644 --- a/400_xowa/src/gplx/core/brys/Bry_err_wkr.java +++ b/100_core/src/gplx/core/brys/Bry_err_wkr.java @@ -24,6 +24,12 @@ public class Bry_err_wkr { public void Fail_throws_err_(boolean v) {this.fail_throws_err = v;} private boolean fail_throws_err = true; public void Init_by_page(String page, byte[] src) {this.page = page; this.src = src;} public void Init_by_sect(String sect, int sect_bgn) {this.sect = sect; this.sect_bgn = sect_bgn;} + public void Warn(String msg, Object... args) { + boolean old = fail_throws_err; + fail_throws_err = false; + this.Fail(msg, args); + fail_throws_err = old; + } public int Fail(String msg, Object... args) {return Fail(msg, sect_bgn, sect_bgn + 255, args);} private int Fail(String msg, int excerpt_bgn, int excerpt_end, Object[] args) { String err_msg = Make_msg(msg, excerpt_bgn, excerpt_end, args); diff --git a/400_xowa/src/gplx/core/brys/Bry_rdr.java b/100_core/src/gplx/core/brys/Bry_rdr.java similarity index 63% rename from 400_xowa/src/gplx/core/brys/Bry_rdr.java rename to 100_core/src/gplx/core/brys/Bry_rdr.java index fd6323b40..306ded6e9 100644 --- a/400_xowa/src/gplx/core/brys/Bry_rdr.java +++ b/100_core/src/gplx/core/brys/Bry_rdr.java @@ -16,14 +16,15 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.core.brys; import gplx.*; import gplx.core.*; -import gplx.core.errs.*; +import gplx.core.errs.*; import gplx.core.btries.*; public class Bry_rdr { private final gplx.core.primitives.Int_obj_ref pos_ref = gplx.core.primitives.Int_obj_ref.neg1_(); - public byte[] Src() {return src;} private byte[] src; - public int Src_end() {return src_end;} private int src_end; - public int Pos() {return pos;} private int pos; + public byte[] Src() {return src;} protected byte[] src; + public int Src_end() {return src_end;} protected int src_end; + public int Pos() {return pos;} protected int pos; public Bry_rdr Dflt_dlm_(byte b) {this.dflt_dlm = b; return this;} private byte dflt_dlm; public Bry_rdr Fail_throws_err_(boolean v) {err_wkr.Fail_throws_err_(v); return this;} + public Bry_rdr Init_by_src(byte[] src) {err_wkr.Init_by_page("", src); this.pos = 0; this.src = src; this.src_end = src.length; return this;} public Bry_rdr Init_by_page(byte[] page, byte[] src, int src_len) {err_wkr.Init_by_page(String_.new_u8(page), src); this.pos = 0; this.src = src; this.src_end = src_len; return this;} public Bry_rdr Init_by_sect(String sect, int sect_bgn, int pos) {err_wkr.Init_by_sect(sect, sect_bgn); this.pos = pos; return this;} public Bry_rdr Init_by_wkr (Bry_err_wkr wkr, String sect, int pos, int src_end) { @@ -72,7 +73,8 @@ public class Bry_rdr { byte[] bry = Read_bry_to(to_char); return Double_.parse(String_.new_a7(bry)); } - public int Read_int_to() {return Read_int_to(dflt_dlm);} + public int Read_int_to() {return Read_int_to(dflt_dlm);} + public int Read_int_to_non_num() {return Read_int_to(Byte_ascii.Null);} public int Read_int_to(byte to_char) { int bgn = pos; int rv = 0; @@ -110,7 +112,7 @@ public class Bry_rdr { return rv * negative; } public int Read_hzip_int(int reqd) { - int rv = gplx.xowa.htmls.core.hzips.Xoh_hzip_int_.Decode(reqd, src, src_end, pos, pos_ref); + int rv = gplx.core.encoders.Gfo_hzip_int_.Decode(reqd, src, src_end, pos, pos_ref); pos = pos_ref.Val(); return rv; } @@ -142,17 +144,61 @@ public class Bry_rdr { pos = find_end; return pos; } - public byte Chk(gplx.core.btries.Btrie_slim_mgr trie) {return Chk(trie, pos, src_end);} - public byte Chk_or(gplx.core.btries.Btrie_slim_mgr trie, byte or) {return Chk_or(trie, pos, src_end, or);} - public byte Chk(gplx.core.btries.Btrie_slim_mgr trie, int itm_bgn, int itm_end) { + public byte Chk(Btrie_slim_mgr trie) {return Chk(trie, pos, src_end);} + public void Chk_trie_val(Btrie_slim_mgr trie, byte val) { + byte rv = Chk_or(trie, Byte_.Max_value_127); + if (rv == Byte_.Max_value_127) err_wkr.Fail("failed trie check", "mid", String_.new_u8(Bry_.Mid_by_len_safe(src, pos, 16))); + } + public Object Chk_trie_as_obj(Btrie_slim_mgr trie) { + Object rv = trie.Match_bgn(src, pos, src_end); if (rv == null) err_wkr.Fail("failed trie check", "mid", String_.new_u8(Bry_.Mid_by_len_safe(src, pos, 16))); + return rv; + } + public byte Chk_or(Btrie_slim_mgr trie, byte or) {return Chk_or(trie, pos, src_end, or);} + public byte Chk(Btrie_slim_mgr trie, int itm_bgn, int itm_end) { byte rv = Chk_or(trie, itm_bgn, itm_end, Byte_.Max_value_127); if (rv == Byte_.Max_value_127) {err_wkr.Fail("failed trie check", "mid", String_.new_u8(Bry_.Mid_by_len_safe(src, pos, 16))); return Byte_.Max_value_127;} return rv; } - public byte Chk_or(gplx.core.btries.Btrie_slim_mgr trie, int itm_bgn, int itm_end, byte or) { + public byte Chk_or(Btrie_slim_mgr trie, int itm_bgn, int itm_end, byte or) { Object rv_obj = trie.Match_bgn(src, itm_bgn, itm_end); if (rv_obj == null) return or; pos = trie.Match_pos(); return ((gplx.core.primitives.Byte_obj_val)rv_obj).Val(); } + @gplx.Virtual public Bry_rdr Skip_ws() { + while (pos < src_end) { + switch (src[pos]) { + case Byte_ascii.Tab: case Byte_ascii.Nl: case Byte_ascii.Cr: case Byte_ascii.Space: + ++pos; + break; + default: + return this; + } + } + return this; + } + public Bry_rdr Skip_alpha_num_under() { + while (pos < src_end) { + switch (src[pos]) { + case Byte_ascii.Num_0: case Byte_ascii.Num_1: case Byte_ascii.Num_2: case Byte_ascii.Num_3: case Byte_ascii.Num_4: + case Byte_ascii.Num_5: case Byte_ascii.Num_6: case Byte_ascii.Num_7: case Byte_ascii.Num_8: case Byte_ascii.Num_9: + case Byte_ascii.Ltr_A: case Byte_ascii.Ltr_B: case Byte_ascii.Ltr_C: case Byte_ascii.Ltr_D: case Byte_ascii.Ltr_E: + case Byte_ascii.Ltr_F: case Byte_ascii.Ltr_G: case Byte_ascii.Ltr_H: case Byte_ascii.Ltr_I: case Byte_ascii.Ltr_J: + case Byte_ascii.Ltr_K: case Byte_ascii.Ltr_L: case Byte_ascii.Ltr_M: case Byte_ascii.Ltr_N: case Byte_ascii.Ltr_O: + case Byte_ascii.Ltr_P: case Byte_ascii.Ltr_Q: case Byte_ascii.Ltr_R: case Byte_ascii.Ltr_S: case Byte_ascii.Ltr_T: + case Byte_ascii.Ltr_U: case Byte_ascii.Ltr_V: case Byte_ascii.Ltr_W: case Byte_ascii.Ltr_X: case Byte_ascii.Ltr_Y: case Byte_ascii.Ltr_Z: + case Byte_ascii.Ltr_a: case Byte_ascii.Ltr_b: case Byte_ascii.Ltr_c: case Byte_ascii.Ltr_d: case Byte_ascii.Ltr_e: + case Byte_ascii.Ltr_f: case Byte_ascii.Ltr_g: case Byte_ascii.Ltr_h: case Byte_ascii.Ltr_i: case Byte_ascii.Ltr_j: + case Byte_ascii.Ltr_k: case Byte_ascii.Ltr_l: case Byte_ascii.Ltr_m: case Byte_ascii.Ltr_n: case Byte_ascii.Ltr_o: + case Byte_ascii.Ltr_p: case Byte_ascii.Ltr_q: case Byte_ascii.Ltr_r: case Byte_ascii.Ltr_s: case Byte_ascii.Ltr_t: + case Byte_ascii.Ltr_u: case Byte_ascii.Ltr_v: case Byte_ascii.Ltr_w: case Byte_ascii.Ltr_x: case Byte_ascii.Ltr_y: case Byte_ascii.Ltr_z: + case Byte_ascii.Underline: + ++pos; + break; + default: + return this; + } + } + return this; + } } diff --git a/400_xowa/src/gplx/core/brys/Bry_rdr_tst.java b/100_core/src/gplx/core/brys/Bry_rdr_tst.java similarity index 100% rename from 400_xowa/src/gplx/core/brys/Bry_rdr_tst.java rename to 100_core/src/gplx/core/brys/Bry_rdr_tst.java diff --git a/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_int_.java b/100_core/src/gplx/core/encoders/Gfo_hzip_int_.java similarity index 90% rename from 400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_int_.java rename to 100_core/src/gplx/core/encoders/Gfo_hzip_int_.java index be595a86c..c1c8e7278 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_int_.java +++ b/100_core/src/gplx/core/encoders/Gfo_hzip_int_.java @@ -15,9 +15,9 @@ 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.htmls.core.hzips; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; -import gplx.core.primitives.*; import gplx.core.encoders.*; -public class Xoh_hzip_int_ { +package gplx.core.encoders; import gplx.*; import gplx.core.*; +import gplx.core.primitives.*; +public class Gfo_hzip_int_ { public static final int Neg_1_adj = 1; public static void Encode(int reqd, Bry_bfr bfr, int val) { int bfr_len = bfr.Len(); diff --git a/140_dbs/src/gplx/dbs/metas/Meta_idx_itm.java b/140_dbs/src/gplx/core/srls/Dbmeta_dat_itm.java similarity index 70% rename from 140_dbs/src/gplx/dbs/metas/Meta_idx_itm.java rename to 140_dbs/src/gplx/core/srls/Dbmeta_dat_itm.java index ec355ff8b..b9f01ee8c 100644 --- a/140_dbs/src/gplx/dbs/metas/Meta_idx_itm.java +++ b/140_dbs/src/gplx/core/srls/Dbmeta_dat_itm.java @@ -15,9 +15,10 @@ 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.dbs.metas; import gplx.*; import gplx.dbs.*; -public class Meta_idx_itm { - public Meta_idx_itm(String name, String sql) {this.name = name; this.sql = sql;} - public String Name() {return name;} private final String name; - public String Sql() {return sql;} private final String sql; +package gplx.core.srls; import gplx.*; import gplx.core.*; +public class Dbmeta_dat_itm { + public Dbmeta_dat_itm(int tid, String key, Object val) {this.Tid = tid; this.Key = key; this.Val = val;} + public int Tid; + public String Key; + public Object Val; } diff --git a/140_dbs/src/gplx/dbs/metas/Meta_fld_mgr.java b/140_dbs/src/gplx/core/srls/Dbmeta_dat_mgr.java similarity index 64% rename from 140_dbs/src/gplx/dbs/metas/Meta_fld_mgr.java rename to 140_dbs/src/gplx/core/srls/Dbmeta_dat_mgr.java index 7ab44b5fd..0aa172d01 100644 --- a/140_dbs/src/gplx/dbs/metas/Meta_fld_mgr.java +++ b/140_dbs/src/gplx/core/srls/Dbmeta_dat_mgr.java @@ -15,12 +15,16 @@ 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.dbs.metas; import gplx.*; import gplx.dbs.*; -public class Meta_fld_mgr { +package gplx.core.srls; import gplx.*; import gplx.core.*; +import gplx.dbs.metas.*; +public class Dbmeta_dat_mgr { private final Ordered_hash hash = Ordered_hash_.New(); + public Dbmeta_dat_mgr Clear() {hash.Clear(); return this;} public int Len() {return hash.Count();} - public void Add(Meta_fld_itm itm) {hash.Add(itm.Name(), itm);} - public boolean Has(String name) {return hash.Has(name);} - public Meta_fld_itm Get_by(String name) {return (Meta_fld_itm)hash.Get_by(name);} - public Meta_fld_itm Get_at(int i) {return (Meta_fld_itm)hash.Get_at(i);} + public Dbmeta_dat_itm Get_at(int idx) {return (Dbmeta_dat_itm)hash.Get_at(idx);} + public Dbmeta_dat_mgr Add_int(String key, int val) { + Dbmeta_dat_itm itm = new Dbmeta_dat_itm(Dbmeta_fld_tid.Tid__int, key, val); + hash.Add(key, itm); + return this; + } } diff --git a/140_dbs/src/gplx/dbs/metas/Meta_idx_mgr.java b/140_dbs/src/gplx/core/srls/Gfo_srl_ctx.java similarity index 67% rename from 140_dbs/src/gplx/dbs/metas/Meta_idx_mgr.java rename to 140_dbs/src/gplx/core/srls/Gfo_srl_ctx.java index c37906b05..6e7dfae9c 100644 --- a/140_dbs/src/gplx/dbs/metas/Meta_idx_mgr.java +++ b/140_dbs/src/gplx/core/srls/Gfo_srl_ctx.java @@ -15,10 +15,9 @@ 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.dbs.metas; import gplx.*; import gplx.dbs.*; -public class Meta_idx_mgr { - private final Ordered_hash hash = Ordered_hash_.New(); - public void Add(Meta_idx_itm itm) {hash.Add(itm.Name(), itm);} - public boolean Has(String name) {return hash.Has(name);} - public Meta_idx_itm Get(String name) {return (Meta_idx_itm)hash.Get_by(name);} +package gplx.core.srls; import gplx.*; import gplx.core.*; +public interface Gfo_srl_ctx { + Gfo_srl_mgr_wtr Wtr_bgn(String key); + Gfo_srl_mgr_rdr Rdr_bgn(String key); + Dbmeta_dat_mgr Rdr_subs(String key); } diff --git a/140_dbs/src/gplx/dbs/metas/Meta_tbl_itm.java b/140_dbs/src/gplx/core/srls/Gfo_srl_itm.java similarity index 64% rename from 140_dbs/src/gplx/dbs/metas/Meta_tbl_itm.java rename to 140_dbs/src/gplx/core/srls/Gfo_srl_itm.java index 6e67605a2..6276a52bb 100644 --- a/140_dbs/src/gplx/dbs/metas/Meta_tbl_itm.java +++ b/140_dbs/src/gplx/core/srls/Gfo_srl_itm.java @@ -15,10 +15,9 @@ 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.dbs.metas; import gplx.*; import gplx.dbs.*; -public class Meta_tbl_itm { - public Meta_tbl_itm(String name, String sql) {this.name = name; this.sql = sql;} - public Meta_fld_mgr Flds() {return flds;} private final Meta_fld_mgr flds = new Meta_fld_mgr(); - public String Name() {return name;} private final String name; - public String Sql() {return sql;} private final String sql; +package gplx.core.srls; import gplx.*; import gplx.core.*; +public interface Gfo_srl_itm { + Gfo_srl_itm Make_new(Gfo_srl_ctx ctx); + void Load(Gfo_srl_ctx ctx, Gfo_srl_itm owner, Gfo_srl_mgr_rdr rdr); + void Save(Gfo_srl_ctx ctx, Gfo_srl_itm owner, Gfo_srl_mgr_wtr wtr); } diff --git a/140_dbs/src/gplx/core/srls/Gfo_srl_mgr_rdr.java b/140_dbs/src/gplx/core/srls/Gfo_srl_mgr_rdr.java new file mode 100644 index 000000000..ef0c48a1a --- /dev/null +++ b/140_dbs/src/gplx/core/srls/Gfo_srl_mgr_rdr.java @@ -0,0 +1,26 @@ +/* +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.core.srls; import gplx.*; import gplx.core.*; +public interface Gfo_srl_mgr_rdr { + void Itm_bgn(String key); + void Itm_end(); + boolean Get_bool (String key); + int Get_int (String key); + String Get_str (String key); + Object Get_subs (Gfo_srl_ctx ctx, Gfo_srl_itm owner, Gfo_srl_itm proto, Dbmeta_dat_mgr crt_mgr); +} diff --git a/140_dbs/src/gplx/core/srls/Gfo_srl_mgr_wtr.java b/140_dbs/src/gplx/core/srls/Gfo_srl_mgr_wtr.java new file mode 100644 index 000000000..e76ac8c25 --- /dev/null +++ b/140_dbs/src/gplx/core/srls/Gfo_srl_mgr_wtr.java @@ -0,0 +1,27 @@ +/* +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.core.srls; import gplx.*; import gplx.core.*; +public interface Gfo_srl_mgr_wtr { + int Uid_next__as_int(); + void Itm_bgn(String key); + void Itm_end(); + void Set_bool (String key, boolean val); + void Set_int (String key, int val); + void Set_str (String key, String val); + Object Set_subs (Gfo_srl_ctx ctx, Gfo_srl_itm owner, Gfo_srl_itm proto, Object subs, Dbmeta_dat_mgr crt_mgr); +} diff --git a/140_dbs/src/gplx/dbs/Db_conn.java b/140_dbs/src/gplx/dbs/Db_conn.java index ba5bdd64a..fc1c69e8c 100644 --- a/140_dbs/src/gplx/dbs/Db_conn.java +++ b/140_dbs/src/gplx/dbs/Db_conn.java @@ -16,41 +16,41 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.dbs; import gplx.*; -import gplx.dbs.engines.*; import gplx.dbs.qrys.*; import gplx.core.stores.*; +import gplx.core.stores.*; import gplx.dbs.metas.*; import gplx.dbs.engines.*; import gplx.dbs.qrys.*; public class Db_conn { private final List_adp rls_list = List_adp_.new_(); private final Db_engine engine; public Db_conn(Db_engine engine) {this.engine = engine;} public Db_conn_info Conn_info() {return engine.Conn_info();} public boolean Eq(Db_conn comp) {return String_.Eq(engine.Conn_info().Xto_api(), comp.Conn_info().Xto_api());} -// public void Txn_bgn() {engine.Txn_bgn("");} public void Txn_bgn(String name) {engine.Txn_bgn(name);} public void Txn_end() {engine.Txn_end();} public void Txn_cxl() {engine.Txn_cxl();} public void Txn_sav() {engine.Txn_sav();} - public Db_stmt Stmt_insert(String tbl, Db_meta_fld_list flds) {return engine.New_stmt_prep(Db_qry_insert.new_(tbl, flds.To_str_ary_wo_autonum()));} + public Db_stmt Stmt_insert(String tbl, Dbmeta_fld_list flds) {return engine.New_stmt_prep(Db_qry_insert.new_(tbl, flds.To_str_ary_wo_autonum()));} public Db_stmt Stmt_insert(String tbl, String... cols) {return engine.New_stmt_prep(Db_qry_insert.new_(tbl, cols));} public Db_stmt Stmt_update(String tbl, String[] where, String... cols) {return engine.New_stmt_prep(Db_qry_update.new_(tbl, where, cols));} - public Db_stmt Stmt_update_exclude(String tbl, Db_meta_fld_list flds, String... where) {return engine.New_stmt_prep(Db_qry_update.new_(tbl, where, flds.To_str_ary_exclude(where)));} + public Db_stmt Stmt_update_exclude(String tbl, Dbmeta_fld_list flds, String... where) {return engine.New_stmt_prep(Db_qry_update.new_(tbl, where, flds.To_str_ary_exclude(where)));} public Db_stmt Stmt_delete(String tbl, String... where) {return engine.New_stmt_prep(Db_qry_delete.new_(tbl, where));} public Db_stmt Stmt_select(String tbl, String[] cols, String... where) {return engine.New_stmt_prep(Db_qry__select_in_tbl.new_(tbl, where, cols, null));} - public Db_stmt Stmt_select(String tbl, Db_meta_fld_list flds, String... where) {return engine.New_stmt_prep(Db_qry__select_in_tbl.new_(tbl, where, flds.To_str_ary(), null));} + public Db_stmt Stmt_select(String tbl, Dbmeta_fld_list flds, String... where) {return engine.New_stmt_prep(Db_qry__select_in_tbl.new_(tbl, where, flds.To_str_ary(), null));} public Db_stmt Stmt_select_max(String tbl, String col, String... where) { Db_qry__select_in_tbl qry = new Db_qry__select_in_tbl(tbl, String_.Ary(String_.Format("Max({0}) AS {0}", col)), where, null, null, null, null); return engine.New_stmt_prep(qry); } - public Db_stmt Stmt_select_order(String tbl, Db_meta_fld_list flds, String[] where, String... orderbys) {return engine.New_stmt_prep(Db_qry__select_in_tbl.new_(tbl, where, flds.To_str_ary(), orderbys));} + public Db_stmt Stmt_select_order(String tbl, Dbmeta_fld_list flds, String[] where, String... orderbys) {return engine.New_stmt_prep(Db_qry__select_in_tbl.new_(tbl, where, flds.To_str_ary(), orderbys));} public Db_stmt Stmt_select_order(String tbl, String[] flds, String[] where, String... orderbys) {return engine.New_stmt_prep(Db_qry__select_in_tbl.new_(tbl, where, flds, orderbys));} public Db_stmt Stmt_new(Db_qry qry) {return engine.New_stmt_prep(qry);} public void Env_db_attach(String alias, Io_url db_url) {engine.Env_db_attach(alias, db_url);} public void Env_db_detach(String alias) {engine.Env_db_detach(alias);} public void Env_vacuum() {Exec_sql_plog_ntx("vacuuming: url=" + this.Conn_info().Xto_api(), "VACUUM;");} - public void Ddl_create_tbl(Db_meta_tbl meta) {engine.Ddl_create_tbl(meta); engine.Ddl_create_idx(Gfo_usr_dlg_.Noop, meta.Idxs());} - public void Ddl_create_idx(Db_meta_idx... idxs) {engine.Ddl_create_idx(Gfo_usr_dlg_.Instance, idxs);} - public void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... idxs) {engine.Ddl_create_idx(usr_dlg, idxs);} - public void Ddl_append_fld(String tbl, Db_meta_fld fld) {engine.Ddl_append_fld(tbl, fld);} + public void Ddl_create_tbl(Dbmeta_tbl_itm meta) {engine.Ddl_create_tbl(meta); engine.Ddl_create_idx(Gfo_usr_dlg_.Noop, meta.Idxs().To_ary());} + public void Ddl_create_idx(Dbmeta_idx_itm... idxs) {engine.Ddl_create_idx(Gfo_usr_dlg_.Instance, idxs);} + public void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Dbmeta_idx_itm... idxs) {engine.Ddl_create_idx(usr_dlg, idxs);} + public void Ddl_append_fld(String tbl, Dbmeta_fld_itm fld) {engine.Ddl_append_fld(tbl, fld);} public void Ddl_delete_tbl(String tbl) {engine.Ddl_delete_tbl(tbl);} public boolean Meta_tbl_exists(String tbl) {return engine.Meta_tbl_exists(tbl);} public boolean Meta_fld_exists(String tbl, String fld) {return engine.Meta_fld_exists(tbl, fld);} + public Dbmeta_tbl_mgr Meta_tbl_load_all() {return engine.Meta_tbl_load_all();} public void Rls_reg(Rls_able rls) {rls_list.Add(rls);} public void Rls_conn() { int len = rls_list.Count(); diff --git a/140_dbs/src/gplx/dbs/Db_conn_bldr.java b/140_dbs/src/gplx/dbs/Db_conn_bldr.java index d5af39084..de6f927c1 100644 --- a/140_dbs/src/gplx/dbs/Db_conn_bldr.java +++ b/140_dbs/src/gplx/dbs/Db_conn_bldr.java @@ -32,5 +32,11 @@ public class Db_conn_bldr { Db_conn rv = wkr.Get(url); return rv == null ? Db_conn_.Noop : rv; } + public Db_conn Get_or_autocreate(boolean autocreate, Io_url url) { + boolean exists = wkr.Exists(url); + if (exists) return Get(url); + if (autocreate) return New(url); + else throw Err_.new_("dbs", "db does not exist", "url", url.Raw()); + } public static final Db_conn_bldr Instance = new Db_conn_bldr(); Db_conn_bldr() {} } diff --git a/140_dbs/src/gplx/dbs/Db_conn_utl.java b/140_dbs/src/gplx/dbs/Db_conn_utl.java new file mode 100644 index 000000000..5a25b5272 --- /dev/null +++ b/140_dbs/src/gplx/dbs/Db_conn_utl.java @@ -0,0 +1,54 @@ +/* +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.dbs; import gplx.*; +import gplx.dbs.metas.*; +public class Db_conn_utl { + public static Db_conn Conn__new(String url_rel) { + Db_conn_bldr.Instance.Reg_default_mem(); + return Db_conn_bldr.Instance.Get_or_new(Io_url_.mem_fil_("mem/" + url_rel)).Conn(); + } + public static void Tbl__delete(Db_conn conn, String tbl) { + conn.Ddl_delete_tbl(tbl); + } + public static void Tbl__new(Db_conn conn, String tbl, Dbmeta_fld_itm[] flds, Object[]... rows) { + conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl, flds)); + int rows_len = rows.length; + Db_stmt stmt = conn.Stmt_insert(tbl, Dbmeta_fld_itm.To_str_ary(flds)); + for (int i = 0; i < rows_len; ++i) { + Object[] row = rows[i]; + int dat_len = row.length; + stmt.Clear(); + for (int j = 0; j < dat_len; ++j) { + Dbmeta_fld_itm fld = flds[j]; + String fld_name = fld.Name(); + Object val = row[j]; + switch (fld.Type().Tid_ansi()) { + case Dbmeta_fld_tid.Tid__bool: stmt.Val_bool_as_byte (fld_name, Bool_.cast(val)); break; + case Dbmeta_fld_tid.Tid__byte: stmt.Val_byte (fld_name, Byte_.cast(val)); break; + case Dbmeta_fld_tid.Tid__int: stmt.Val_int (fld_name, Int_.cast(val)); break; + case Dbmeta_fld_tid.Tid__long: stmt.Val_long (fld_name, Long_.cast(val)); break; + case Dbmeta_fld_tid.Tid__float: stmt.Val_float (fld_name, Float_.cast(val)); break; + case Dbmeta_fld_tid.Tid__double: stmt.Val_double (fld_name, Double_.cast(val)); break; + case Dbmeta_fld_tid.Tid__str: stmt.Val_str (fld_name, String_.cast(val)); break; + case Dbmeta_fld_tid.Tid__bry: stmt.Val_bry (fld_name, Bry_.cast(val)); break; + } + } + stmt.Exec_insert(); + } + } +} diff --git a/140_dbs/src/gplx/dbs/Db_crt_.java b/140_dbs/src/gplx/dbs/Db_crt_.java index df0947118..eb9d1fc36 100644 --- a/140_dbs/src/gplx/dbs/Db_crt_.java +++ b/140_dbs/src/gplx/dbs/Db_crt_.java @@ -44,7 +44,7 @@ public class Db_crt_ { int len = ary.length; int crt_idx = 0; for (int i = 0; i < len; i++) { - String itm = ary[i]; if (itm == Db_meta_fld.Key_null) continue; + String itm = ary[i]; if (itm == Dbmeta_fld_itm.Key_null) continue; Criteria crt = Db_crt_.eq_(itm, null); rv = (crt_idx == 0) ? crt : Criteria_.And(rv, crt); ++crt_idx; diff --git a/140_dbs/src/gplx/dbs/Db_meta_fld.java b/140_dbs/src/gplx/dbs/Db_meta_fld.java deleted file mode 100644 index d8342d5b8..000000000 --- a/140_dbs/src/gplx/dbs/Db_meta_fld.java +++ /dev/null @@ -1,47 +0,0 @@ -/* -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.dbs; import gplx.*; -public class Db_meta_fld { - public Db_meta_fld(String name, int tid, int len) { - this.name = name; this.tid = tid; this.len = len; - this.nullable = false; this.primary = false; this.autonum = false; this.default_val = Default_value_null; - } - public int Tid() {return tid;} private final int tid; - public String Name() {return name;} private final String name; - public int Len() {return len;} private final int len; - public boolean Nullable() {return nullable;} public Db_meta_fld Nullable_y_() {nullable = true; return this;} private boolean nullable; - public boolean Primary() {return primary;} public Db_meta_fld Primary_y_() {primary = true; return this;} private boolean primary; - public boolean Autonum() {return autonum;} public Db_meta_fld Autonum_y_() {autonum = true; return this;} private boolean autonum; - public Object Default() {return default_val;} public Db_meta_fld Default_(Object v) {default_val = v; return this;} private Object default_val; - - public static final int Tid_bool = 0, Tid_byte = 1, Tid_short = 2, Tid_int = 3, Tid_long = 4, Tid_float = 5, Tid_double = 6, Tid_str = 7, Tid_text = 8, Tid_bry = 9, Tid_decimal = 10, Tid_date = 11; - public static final String Key_null = null; - public static final int Len_null = -1; - public static final Object Default_value_null = null; - public static final String[] Ary_empty = String_.Ary_empty; - public static Db_meta_fld new_bool(String name) {return new Db_meta_fld(name, Tid_bool , Len_null);} - public static Db_meta_fld new_byte(String name) {return new Db_meta_fld(name, Tid_byte , Len_null);} - public static Db_meta_fld new_short(String name) {return new Db_meta_fld(name, Tid_short , Len_null);} - public static Db_meta_fld new_int(String name) {return new Db_meta_fld(name, Tid_int , Len_null);} - public static Db_meta_fld new_long(String name) {return new Db_meta_fld(name, Tid_long , Len_null);} - public static Db_meta_fld new_float(String name) {return new Db_meta_fld(name, Tid_float , Len_null);} - public static Db_meta_fld new_double(String name) {return new Db_meta_fld(name, Tid_double, Len_null);} - public static Db_meta_fld new_text(String name) {return new Db_meta_fld(name, Tid_text , Len_null);} - public static Db_meta_fld new_bry(String name) {return new Db_meta_fld(name, Tid_bry , Len_null);} - public static Db_meta_fld new_str(String name, int len) {return new Db_meta_fld(name, Tid_str , len);} -} diff --git a/140_dbs/src/gplx/dbs/Db_meta_idx.java b/140_dbs/src/gplx/dbs/Db_meta_idx.java deleted file mode 100644 index b71caeb19..000000000 --- a/140_dbs/src/gplx/dbs/Db_meta_idx.java +++ /dev/null @@ -1,35 +0,0 @@ -/* -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.dbs; import gplx.*; -import gplx.dbs.sqls.*; -public class Db_meta_idx { - Db_meta_idx(String tbl, String name, boolean unique, String[] flds) {this.tbl = tbl; this.name = name; this.unique = unique; this.flds = flds;} - public String Tbl() {return tbl;} private final String tbl; - public String Name() {return name;} private final String name; - public boolean Unique() {return unique;} private final boolean unique; - public String[] Flds() {return flds;} private final String[] flds; - public String To_sql_create() {return Db_sqlbldr__sqlite.Instance.Bld_create_idx(this);} - public static Db_meta_idx new_unique_by_name(String tbl, String idx_name, String... flds) {return new Db_meta_idx(tbl, idx_name, Bool_.Y, flds);} - public static Db_meta_idx new_normal_by_name(String tbl, String idx_name, String... flds) {return new Db_meta_idx(tbl, idx_name, Bool_.N, flds);} - public static Db_meta_idx new_unique_by_tbl(String tbl, String name, String... flds) {return new Db_meta_idx(tbl, Bld_idx_name(tbl, name), Bool_.Y, flds);} - public static Db_meta_idx new_normal_by_tbl(String tbl, String name, String... flds) {return new Db_meta_idx(tbl, Bld_idx_name(tbl, name), Bool_.N, flds);} - public static Db_meta_idx new_unique_by_tbl_wo_null(String tbl, String name, String... flds) {return new Db_meta_idx(tbl, Bld_idx_name(tbl, name), Bool_.Y, String_.Ary_wo_null(flds));} - public static Db_meta_idx new_normal_by_tbl_wo_null(String tbl, String name, String... flds) {return new Db_meta_idx(tbl, Bld_idx_name(tbl, name), Bool_.N, String_.Ary_wo_null(flds));} - public static String Bld_idx_name(String tbl, String suffix) {return String_.Concat(tbl, "__", suffix);} - public static final Db_meta_idx[] Ary_empty = new Db_meta_idx[0]; -} diff --git a/140_dbs/src/gplx/dbs/Db_meta_tbl.java b/140_dbs/src/gplx/dbs/Db_meta_tbl.java deleted file mode 100644 index a32bd1bdb..000000000 --- a/140_dbs/src/gplx/dbs/Db_meta_tbl.java +++ /dev/null @@ -1,43 +0,0 @@ -/* -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.dbs; import gplx.*; -import gplx.dbs.sqls.*; -public class Db_meta_tbl { - public Db_meta_tbl(String name, Db_meta_fld[] flds, Db_meta_idx[] idxs) { - if (idxs == null) idxs = Db_meta_idx.Ary_empty; // empty params will pass idxs of null; set to idxs[0] else null ref when calling create_table - this.name = name; this.flds = flds; this.idxs = idxs; - } - public String Name() {return name;} private final String name; - public Db_meta_fld[] Flds() {return flds;} private final Db_meta_fld[] flds; - public boolean Flds_has(String fld) { - if (flds_hash == null) { - flds_hash = Ordered_hash_.New(); - int len = flds.length; - for (int i = 0; i < len; ++i) { - Db_meta_fld fld_itm = flds[i]; - flds_hash.Add(fld_itm.Name(), fld_itm); - } - } - return flds_hash.Has(fld); - } private Ordered_hash flds_hash; - public Db_meta_idx[] Idxs() {return idxs;} private final Db_meta_idx[] idxs; - public String To_sql_create() {return Db_sqlbldr__sqlite.Instance.Bld_create_tbl(this);} - public static Db_meta_tbl new_(String name, Db_meta_fld_list flds, Db_meta_idx... idxs) {return new Db_meta_tbl(name, flds.To_fld_ary(), idxs);} - public static Db_meta_tbl new_(String name, Db_meta_fld[] flds, Db_meta_idx... idxs) {return new Db_meta_tbl(name, flds, idxs);} - public static Db_meta_tbl new_(String name, Db_meta_fld... flds) {return new Db_meta_tbl(name, flds, null);} -} diff --git a/140_dbs/src/gplx/dbs/Db_sql_select.java b/140_dbs/src/gplx/dbs/Db_sql_select.java index d1a86b27e..905b14b7d 100644 --- a/140_dbs/src/gplx/dbs/Db_sql_select.java +++ b/140_dbs/src/gplx/dbs/Db_sql_select.java @@ -57,7 +57,7 @@ class Db_sql_col_bldr { int ord = -1; for (int i = 0; i < ary.length; ++i) { String fld_key = ary[i]; - if (fld_key == Db_meta_fld.Key_null) continue; + if (fld_key == Dbmeta_fld_itm.Key_null) continue; Db_sql_col__name fld = new Db_sql_col__name(++ord, fld_key); tmp_list.Add(fld); } diff --git a/140_dbs/src/gplx/dbs/Db_stmt.java b/140_dbs/src/gplx/dbs/Db_stmt.java index 496c12dfc..54caf5794 100644 --- a/140_dbs/src/gplx/dbs/Db_stmt.java +++ b/140_dbs/src/gplx/dbs/Db_stmt.java @@ -54,8 +54,8 @@ public interface Db_stmt extends Rls_able { int Exec_update(); int Exec_delete(); DataRdr Exec_select(); - Db_rdr Exec_select__rls_manual(); - Db_rdr Exec_select__rls_auto(); + Db_rdr Exec_select__rls_auto(); // stmt is automatically released + Db_rdr Exec_select__rls_manual(); // stmt must be released manually; for "batch" insert Object Exec_select_val(); void Ctor_stmt(Db_engine engine, Db_qry qry); Db_stmt Clear(); diff --git a/140_dbs/src/gplx/dbs/Db_stmt_bldr.java b/140_dbs/src/gplx/dbs/Db_stmt_bldr.java index 00001141d..1d75492c7 100644 --- a/140_dbs/src/gplx/dbs/Db_stmt_bldr.java +++ b/140_dbs/src/gplx/dbs/Db_stmt_bldr.java @@ -19,7 +19,7 @@ package gplx.dbs; import gplx.*; public class Db_stmt_bldr { private Db_conn conn; private Db_stmt create, update, delete; private String tbl_name; private String[] flds_keys, flds_vals, flds_all; - public void Conn_(Db_conn v, String tbl_name, Db_meta_fld_list flds, String... flds_keys) { + public void Conn_(Db_conn v, String tbl_name, Dbmeta_fld_list flds, String... flds_keys) { Conn_(v, tbl_name, flds.To_str_ary(), flds.To_str_ary_exclude(flds_keys), flds_keys); } public void Conn_(Db_conn v, String tbl_name, String[] flds_vals, String... flds_keys) { diff --git a/140_dbs/src/gplx/dbs/Dbmeta_fld_itm.java b/140_dbs/src/gplx/dbs/Dbmeta_fld_itm.java new file mode 100644 index 000000000..c47f6397d --- /dev/null +++ b/140_dbs/src/gplx/dbs/Dbmeta_fld_itm.java @@ -0,0 +1,64 @@ +/* +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.dbs; import gplx.*; +import gplx.dbs.metas.*; +public class Dbmeta_fld_itm { + public Dbmeta_fld_itm(String name, Dbmeta_fld_tid type) { + this.name = name; this.type = type; + this.primary = false; this.autonum = false; this.default_val = Default_value_null; + } + public String Name() {return name;} private final String name; + public Dbmeta_fld_tid Type() {return type;} private final Dbmeta_fld_tid type; + public int Nullable_tid() {return nullable_tid;} public Dbmeta_fld_itm Nullable_tid_(int v) {nullable_tid = v; return this;} private int nullable_tid; + public Dbmeta_fld_itm Nullable_y_() {return Nullable_tid_(Nullable_null);} + public boolean Primary() {return primary;} public Dbmeta_fld_itm Primary_y_() {primary = true; return this;} private boolean primary; + public boolean Autonum() {return autonum;} public Dbmeta_fld_itm Autonum_y_() {autonum = true; return this;} private boolean autonum; + public Object Default() {return default_val;} public Dbmeta_fld_itm Default_(Object v) {default_val = v; return this;} private Object default_val; + public boolean Eq(Dbmeta_fld_itm comp) { + return String_.Eq(name, comp.name) + && type.Eq(comp.type) + && nullable_tid == comp.nullable_tid + && primary == comp.primary + && autonum == comp.autonum + && Object_.Eq(default_val, comp.default_val); + } + + public static final int Nullable_unknown = 0, Nullable_null = 1, Nullable_not_null = 2; + public static final Object Default_value_null = null; + public static final String Key_null = null; + public static final String[] Str_ary_empty = String_.Ary_empty; + public static final Dbmeta_fld_itm[] Ary_empty = new Dbmeta_fld_itm[0]; + + public static Dbmeta_fld_itm new_bool(String name) {return new Dbmeta_fld_itm(name, Dbmeta_fld_tid.Itm__bool);} + public static Dbmeta_fld_itm new_byte(String name) {return new Dbmeta_fld_itm(name, Dbmeta_fld_tid.Itm__byte);} + public static Dbmeta_fld_itm new_short(String name) {return new Dbmeta_fld_itm(name, Dbmeta_fld_tid.Itm__short);} + public static Dbmeta_fld_itm new_int(String name) {return new Dbmeta_fld_itm(name, Dbmeta_fld_tid.Itm__int);} + public static Dbmeta_fld_itm new_long(String name) {return new Dbmeta_fld_itm(name, Dbmeta_fld_tid.Itm__long);} + public static Dbmeta_fld_itm new_float(String name) {return new Dbmeta_fld_itm(name, Dbmeta_fld_tid.Itm__float);} + public static Dbmeta_fld_itm new_double(String name) {return new Dbmeta_fld_itm(name, Dbmeta_fld_tid.Itm__double);} + public static Dbmeta_fld_itm new_text(String name) {return new Dbmeta_fld_itm(name, Dbmeta_fld_tid.Itm__text);} + public static Dbmeta_fld_itm new_bry(String name) {return new Dbmeta_fld_itm(name, Dbmeta_fld_tid.Itm__bry);} + public static Dbmeta_fld_itm new_str(String name, int len) {return new Dbmeta_fld_itm(name, Dbmeta_fld_tid.Itm__str(len));} + public static String[] To_str_ary(Dbmeta_fld_itm[] ary) { + int len = ary.length; + String[] rv = new String[len]; + for (int i = 0; i < len; ++i) + rv[i] = ary[i].name; + return rv; + } +} diff --git a/140_dbs/src/gplx/dbs/Db_meta_fld_list.java b/140_dbs/src/gplx/dbs/Dbmeta_fld_list.java similarity index 52% rename from 140_dbs/src/gplx/dbs/Db_meta_fld_list.java rename to 140_dbs/src/gplx/dbs/Dbmeta_fld_list.java index ea5a81b30..4437edbbd 100644 --- a/140_dbs/src/gplx/dbs/Db_meta_fld_list.java +++ b/140_dbs/src/gplx/dbs/Dbmeta_fld_list.java @@ -16,19 +16,19 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.dbs; import gplx.*; -public class Db_meta_fld_list { +public class Dbmeta_fld_list { private final Ordered_hash flds = Ordered_hash_.New(); private final List_adp keys = List_adp_.new_(); public void Clear() {flds.Clear(); keys.Clear(); str_ary = null; fld_ary = null;} - public Db_meta_fld Get_by(String name) {return (Db_meta_fld)flds.Get_by(name);} - public Db_meta_fld Get_at(int idx) {return (Db_meta_fld)flds.Get_at(idx);} + public Dbmeta_fld_itm Get_by(String name) {return (Dbmeta_fld_itm)flds.Get_by(name);} + public Dbmeta_fld_itm Get_at(int idx) {return (Dbmeta_fld_itm)flds.Get_at(idx);} public String[] To_str_ary() {if (str_ary == null) str_ary = (String[])keys.To_ary(String.class); return str_ary;} private String[] str_ary; - public Db_meta_fld[] To_fld_ary() {if (fld_ary == null) fld_ary = (Db_meta_fld[])flds.To_ary(Db_meta_fld.class); return fld_ary;} private Db_meta_fld[] fld_ary; + public Dbmeta_fld_itm[] To_fld_ary() {if (fld_ary == null) fld_ary = (Dbmeta_fld_itm[])flds.To_ary(Dbmeta_fld_itm.class); return fld_ary;} private Dbmeta_fld_itm[] fld_ary; public String[] To_str_ary_wo_autonum() { int len = flds.Count(); List_adp rv = List_adp_.new_(); for (int i = 0; i < len; ++i) { - Db_meta_fld fld = (Db_meta_fld)flds.Get_at(i); + Dbmeta_fld_itm fld = (Dbmeta_fld_itm)flds.Get_at(i); if (fld.Autonum()) continue; rv.Add(fld.Name()); } @@ -44,7 +44,7 @@ public class Db_meta_fld_list { } int fld_len = flds.Count(); for (int i = 0; i < fld_len; ++i) { - Db_meta_fld fld = (Db_meta_fld)flds.Get_at(i); + Dbmeta_fld_itm fld = (Dbmeta_fld_itm)flds.Get_at(i); String fld_key = fld.Name(); if (ary_hash.Has(fld_key)) continue; rv.Add(fld_key); @@ -52,29 +52,29 @@ public class Db_meta_fld_list { return rv.To_str_ary(); } public boolean Has(String key) {return flds.Has(key);} - public String Add_bool(String name) {return Add(Db_meta_fld.new_bool(name));} - public String Add_byte(String name) {return Add(Db_meta_fld.new_byte(name));} - public String Add_short(String name) {return Add(Db_meta_fld.new_short(name));} - public String Add_int(String name) {return Add(Db_meta_fld.new_int(name));} - public String Add_int_pkey(String name) {return Add(Db_meta_fld.new_int(name).Primary_y_());} - public String Add_int_pkey_autonum(String name) {return Add(Db_meta_fld.new_int(name).Primary_y_().Autonum_y_());} - public String Add_int_autonum(String name) {return Add(Db_meta_fld.new_int(name).Autonum_y_());} - public String Add_int_dflt(String name, int dflt) {return Add(Db_meta_fld.new_int(name).Default_(dflt));} - public String Add_long(String name) {return Add(Db_meta_fld.new_long(name));} - public String Add_float(String name) {return Add(Db_meta_fld.new_float(name));} - public String Add_double(String name) {return Add(Db_meta_fld.new_double(name));} - public String Add_text(String name) {return Add(Db_meta_fld.new_text(name));} - public String Add_bry(String name) {return Add(Db_meta_fld.new_bry(name));} - public String Add_str(String name, int len) {return Add(Db_meta_fld.new_str(name, len));} - public String Add_str_pkey(String name, int len) {return Add(Db_meta_fld.new_str(name, len).Primary_y_());} - public String Add_str_null(String name, int len) {return Add(Db_meta_fld.new_str(name, len).Nullable_y_());} + public String Add_bool(String name) {return Add(Dbmeta_fld_itm.new_bool(name));} + public String Add_byte(String name) {return Add(Dbmeta_fld_itm.new_byte(name));} + public String Add_short(String name) {return Add(Dbmeta_fld_itm.new_short(name));} + public String Add_int(String name) {return Add(Dbmeta_fld_itm.new_int(name));} + public String Add_int_pkey(String name) {return Add(Dbmeta_fld_itm.new_int(name).Primary_y_());} + public String Add_int_pkey_autonum(String name) {return Add(Dbmeta_fld_itm.new_int(name).Primary_y_().Autonum_y_());} + public String Add_int_autonum(String name) {return Add(Dbmeta_fld_itm.new_int(name).Autonum_y_());} + public String Add_int_dflt(String name, int dflt) {return Add(Dbmeta_fld_itm.new_int(name).Default_(dflt));} + public String Add_long(String name) {return Add(Dbmeta_fld_itm.new_long(name));} + public String Add_float(String name) {return Add(Dbmeta_fld_itm.new_float(name));} + public String Add_double(String name) {return Add(Dbmeta_fld_itm.new_double(name));} + public String Add_text(String name) {return Add(Dbmeta_fld_itm.new_text(name));} + public String Add_bry(String name) {return Add(Dbmeta_fld_itm.new_bry(name));} + public String Add_str(String name, int len) {return Add(Dbmeta_fld_itm.new_str(name, len));} + public String Add_str_pkey(String name, int len) {return Add(Dbmeta_fld_itm.new_str(name, len).Primary_y_());} + public String Add_str_null(String name, int len) {return Add(Dbmeta_fld_itm.new_str(name, len).Nullable_y_());} public String Add_str_dflt(String name, int len, String dflt) - {return Add(Db_meta_fld.new_str(name, len).Default_(dflt));} - public String Add(Db_meta_fld fld) { + {return Add(Dbmeta_fld_itm.new_str(name, len).Default_(dflt));} + public String Add(Dbmeta_fld_itm fld) { String name = fld.Name(); flds.Add(name, fld); keys.Add(name); return name; } - public static Db_meta_fld_list new_() {return new Db_meta_fld_list();} + public static Dbmeta_fld_list new_() {return new Dbmeta_fld_list();} } diff --git a/140_dbs/src/gplx/dbs/Dbmeta_idx_itm.java b/140_dbs/src/gplx/dbs/Dbmeta_idx_itm.java new file mode 100644 index 000000000..221cae4d2 --- /dev/null +++ b/140_dbs/src/gplx/dbs/Dbmeta_idx_itm.java @@ -0,0 +1,53 @@ +/* +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.dbs; import gplx.*; +import gplx.dbs.sqls.*; import gplx.dbs.metas.*; +public class Dbmeta_idx_itm { + public Dbmeta_idx_itm(boolean unique, String tbl, String name, Dbmeta_idx_fld[] flds) { + this.tbl = tbl; this.name = name; this.unique = unique; this.Flds = flds; + } + public String Tbl() {return tbl;} private final String tbl; + public String Name() {return name;} private final String name; + public boolean Unique() {return unique;} private final boolean unique; + public final Dbmeta_idx_fld[] Flds; + public String To_sql_create() {return Db_sqlbldr__sqlite.Instance.Bld_create_idx(this);} + public boolean Eq(Dbmeta_idx_itm comp) { + return String_.Eq(name, comp.name) + && unique == comp.unique + && tbl == comp.tbl + && Dbmeta_idx_fld.Ary_eq(Flds, comp.Flds); + } + public static Dbmeta_idx_itm new_unique_by_name (String tbl, String name, String... flds) {return new Dbmeta_idx_itm(Bool_.Y, tbl, name, To_fld_ary(flds));} + public static Dbmeta_idx_itm new_normal_by_name (String tbl, String name, String... flds) {return new Dbmeta_idx_itm(Bool_.N, tbl, name, To_fld_ary(flds));} + public static Dbmeta_idx_itm new_unique_by_tbl (String tbl, String name, String... flds) {return new Dbmeta_idx_itm(Bool_.Y, tbl, Bld_idx_name(tbl, name), To_fld_ary(flds));} + public static Dbmeta_idx_itm new_normal_by_tbl (String tbl, String name, String... flds) {return new Dbmeta_idx_itm(Bool_.N, tbl, Bld_idx_name(tbl, name), To_fld_ary(flds));} + public static Dbmeta_idx_itm new_unique_by_tbl_wo_null (String tbl, String name, String... flds) {return new Dbmeta_idx_itm(Bool_.Y, tbl, Bld_idx_name(tbl, name), To_fld_ary(flds));} + public static Dbmeta_idx_itm new_normal_by_tbl_wo_null (String tbl, String name, String... flds) {return new Dbmeta_idx_itm(Bool_.N, tbl, Bld_idx_name(tbl, name), To_fld_ary(flds));} + public static String Bld_idx_name(String tbl, String suffix) {return String_.Concat(tbl, "__", suffix);} + public static final Dbmeta_idx_itm[] Ary_empty = new Dbmeta_idx_itm[0]; + public static Dbmeta_idx_fld[] To_fld_ary(String[] ary) { + int len = ary.length; + Dbmeta_idx_fld[] rv = new Dbmeta_idx_fld[len]; + int order = -1; + for (int i = 0; i < len; ++i) { + String itm = ary[i]; if (itm == null) continue; + rv[i] = new Dbmeta_idx_fld(++order, itm, Dbmeta_idx_fld.Sort_tid__none); + } + return rv; + } +} diff --git a/140_dbs/src/gplx/dbs/Dbmeta_tbl_itm.java b/140_dbs/src/gplx/dbs/Dbmeta_tbl_itm.java new file mode 100644 index 000000000..7c45bbbb5 --- /dev/null +++ b/140_dbs/src/gplx/dbs/Dbmeta_tbl_itm.java @@ -0,0 +1,43 @@ +/* +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.dbs; import gplx.*; +import gplx.dbs.metas.*; import gplx.dbs.sqls.*; +public class Dbmeta_tbl_itm { + public String Name() {return name;} private String name; + public Dbmeta_idx_mgr Idxs() {return idxs;} private final Dbmeta_idx_mgr idxs = new Dbmeta_idx_mgr(); + public Dbmeta_fld_mgr Flds() {return flds;} private final Dbmeta_fld_mgr flds = new Dbmeta_fld_mgr(); + public String To_sql_create() {return Db_sqlbldr__sqlite.Instance.Bld_create_tbl(this);} + + public static Dbmeta_tbl_itm New(String name, Dbmeta_fld_list flds, Dbmeta_idx_itm... idxs) {return New(name, flds.To_fld_ary(), idxs);} + public static Dbmeta_tbl_itm New(String name, Dbmeta_fld_itm... flds) {return New(name, flds, Dbmeta_idx_itm.Ary_empty);} + public static Dbmeta_tbl_itm New(String name, Dbmeta_fld_itm[] flds, Dbmeta_idx_itm... idxs) { + Dbmeta_tbl_itm rv = new Dbmeta_tbl_itm(); + rv.name = name; + if (flds != null) { + int flds_len = flds.length; + for (int i = 0; i < flds_len; ++i) + rv.flds.Add(flds[i]); + } + if (idxs != null) { + int idxs_len = idxs.length; + for (int i = 0; i < idxs_len; ++i) + rv.idxs.Add(idxs[i]); + } + return rv; + } +} diff --git a/140_dbs/src/gplx/dbs/diffs/Gfdb_diff_cmd.java b/140_dbs/src/gplx/dbs/diffs/Gfdb_diff_cmd.java new file mode 100644 index 000000000..4bb1318a2 --- /dev/null +++ b/140_dbs/src/gplx/dbs/diffs/Gfdb_diff_cmd.java @@ -0,0 +1,58 @@ +/* +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.dbs.diffs; import gplx.*; import gplx.dbs.*; +import gplx.dbs.metas.*; import gplx.dbs.diffs.builds.*; +class Gfdb_diff_cmd { + private final Gfdb_diff_wkr__db diff_bldr_wkr = new Gfdb_diff_wkr__db(); + private final Gfdb_diff_bldr diff_bldr = new Gfdb_diff_bldr(); + public Gfdb_diff_cmd() { + diff_bldr.Init(diff_bldr_wkr); + } + public Gfdb_diff_job New_job(Gfdb_diff_db db, String guid, String name, String made_by, String desc) { + return new Gfdb_diff_job(db); + } + public void Bld(Gfdb_diff_job job, Gfdb_diff_tbl_mgr lhs_mgr, Gfdb_diff_tbl_mgr rhs_mgr) { + diff_bldr_wkr.Init_conn(job.Db(), 1000); + int rhs_len = rhs_mgr.Len(); + for (int i = 0; i < rhs_len; ++i) { + Gfdb_diff_tbl rhs_tbl = rhs_mgr.Get_at(i); + Gfdb_diff_tbl lhs_tbl = lhs_mgr.Get_by(rhs_tbl.Name); + if (lhs_tbl == null) { + // Add_cmd_tbl_create(); + // Add_cmd_tbl_insert_all()); + } + else { + // Compare_flds(); + // Compare_idxs(); + // diff_bldr.Compare(lhs_tbl, rhs_tbl); + } + } + int lhs_len = lhs_mgr.Len(); + for (int i = 0; i < lhs_len; ++i) { + Gfdb_diff_tbl lhs_tbl = lhs_mgr.Get_at(i); + if (lhs_tbl == null) { + // Add_cmd_dat_delete_all()); + // Add_cmd_tbl_delete(); + } + } + } +} +class Gfdb_diff_job { + public Gfdb_diff_job(Gfdb_diff_db db) {this.db = db;} + public Gfdb_diff_db Db() {return db;} private Gfdb_diff_db db; +} diff --git a/400_xowa/src/gplx/dbs/diffs/Gfdb_diff_db.java b/140_dbs/src/gplx/dbs/diffs/Gfdb_diff_db.java similarity index 100% rename from 400_xowa/src/gplx/dbs/diffs/Gfdb_diff_db.java rename to 140_dbs/src/gplx/dbs/diffs/Gfdb_diff_db.java diff --git a/400_xowa/src/gplx/dbs/diffs/Gfdb_diff_db_.java b/140_dbs/src/gplx/dbs/diffs/Gfdb_diff_db_.java similarity index 100% rename from 400_xowa/src/gplx/dbs/diffs/Gfdb_diff_db_.java rename to 140_dbs/src/gplx/dbs/diffs/Gfdb_diff_db_.java diff --git a/140_dbs/src/gplx/dbs/diffs/Gfdb_diff_tbl.java b/140_dbs/src/gplx/dbs/diffs/Gfdb_diff_tbl.java new file mode 100644 index 000000000..4dcd066a7 --- /dev/null +++ b/140_dbs/src/gplx/dbs/diffs/Gfdb_diff_tbl.java @@ -0,0 +1,86 @@ +/* +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.dbs.diffs; import gplx.*; import gplx.dbs.*; +import gplx.dbs.metas.*; +public class Gfdb_diff_tbl { + public Gfdb_diff_tbl(String name, Dbmeta_fld_itm[] flds, Dbmeta_fld_itm[] keys, Dbmeta_fld_itm[] vals) { + this.Name = name; this.Flds = flds; this.Keys = keys; this.Vals = vals; + } + public final String Name; + public final Dbmeta_fld_itm[] Flds; + public final Dbmeta_fld_itm[] Keys; + public final Dbmeta_fld_itm[] Vals; + public Db_rdr Make_rdr(Db_conn conn) { + Db_stmt stmt = conn.Stmt_select(Name, Dbmeta_fld_itm.To_str_ary(Flds)); + return stmt.Exec_select__rls_auto(); + } + + public static Gfdb_diff_tbl New(Dbmeta_tbl_itm tbl) { + Dbmeta_fld_mgr flds = tbl.Flds(); + Dbmeta_fld_mgr keys = Calc_keys(tbl); + Dbmeta_fld_mgr vals = Calc_vals(tbl.Flds(), keys); + return new Gfdb_diff_tbl(tbl.Name(), flds.To_ary(), keys.To_ary(), vals.To_ary()); + } + public static Dbmeta_fld_mgr Calc_keys(Dbmeta_tbl_itm tbl) { + Dbmeta_fld_mgr rv = new Dbmeta_fld_mgr(); + // try to find primary + Dbmeta_fld_mgr flds = tbl.Flds(); + int flds_len = flds.Len(); + for (int i = 0; i < flds_len; ++i) { + Dbmeta_fld_itm fld = flds.Get_at(i); + if (fld.Primary()) { + rv.Add(fld); + return rv; + } + } + // try to find shortest unique index + Dbmeta_idx_itm unique_idx = null; int unique_idx_len = Int_.Max_value; + Dbmeta_idx_mgr idxs = tbl.Idxs(); + int idxs_len = idxs.Len(); + for (int i = 0; i < idxs_len; ++i) { + Dbmeta_idx_itm idx = idxs.Get_at(i); + if (idx.Unique() && idx.Flds.length < unique_idx_len) { // get first shortest unique index; note that "<" is "get first" whereas "<=" is "get last" + unique_idx = idx; + unique_idx_len = idx.Flds.length; + break; + } + } + if (unique_idx != null) { + Dbmeta_idx_fld[] idx_flds = unique_idx.Flds; + int idx_flds_len = idx_flds.length; + for (int i = 0; i < idx_flds_len; ++i) + rv.Add(flds.Get_by(idx_flds[i].Name)); + return rv; + } + // just add all + for (int i = 0; i < flds_len; ++i) { + Dbmeta_fld_itm fld = flds.Get_at(i); + rv.Add(fld); + } + return rv; + } + private static Dbmeta_fld_mgr Calc_vals(Dbmeta_fld_mgr flds, Dbmeta_fld_mgr keys) { + Dbmeta_fld_mgr rv = new Dbmeta_fld_mgr(); + int flds_len = flds.Len(); + for (int i = 0; i < flds_len; ++i) { + Dbmeta_fld_itm fld = flds.Get_at(i); + if (!keys.Has(fld.Name())) rv.Add(fld); + } + return rv; + } +} diff --git a/140_dbs/src/gplx/dbs/diffs/Gfdb_diff_tbl_mgr.java b/140_dbs/src/gplx/dbs/diffs/Gfdb_diff_tbl_mgr.java new file mode 100644 index 000000000..470ee7dd7 --- /dev/null +++ b/140_dbs/src/gplx/dbs/diffs/Gfdb_diff_tbl_mgr.java @@ -0,0 +1,35 @@ +/* +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.dbs.diffs; import gplx.*; import gplx.dbs.*; +class Gfdb_diff_tbl_mgr { + private final Ordered_hash hash = Ordered_hash_.New(); + public int Len() {return hash.Count();} + public Gfdb_diff_tbl Get_at(int idx) {return (Gfdb_diff_tbl)hash.Get_at(idx);} + public Gfdb_diff_tbl Get_by(String key) {return (Gfdb_diff_tbl)hash.Get_by(key);} +} +class Gfdb_diff_tbl_mgr__sqlite { + public void Fill(Gfdb_diff_tbl_mgr tbl_mgr, Db_conn conn) { + // String schema_str = ""; // conn.Get_schema(); + } + public void Fill(Gfdb_diff_tbl_mgr tbl_mgr, String schema_str) { + /* + Db_conn conn = null; + conn.Meta_get_tbls(Gfdb_diff_tbl_mgr tbl_mgr, ""); + */ + } +} diff --git a/140_dbs/src/gplx/dbs/diffs/Gfdb_rdr_utl_.java b/140_dbs/src/gplx/dbs/diffs/Gfdb_rdr_utl_.java new file mode 100644 index 000000000..17f8d5bc0 --- /dev/null +++ b/140_dbs/src/gplx/dbs/diffs/Gfdb_rdr_utl_.java @@ -0,0 +1,59 @@ +/* +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.dbs.diffs; import gplx.*; import gplx.dbs.*; +import gplx.dbs.metas.*; +public class Gfdb_rdr_utl_ { + public static int Compare(Dbmeta_fld_itm[] flds, int len, Db_rdr lhs_rdr, Db_rdr rhs_rdr) { + int comp = CompareAble_.Same; + for (int i = 0; i < len; ++i) { + Dbmeta_fld_itm fld = flds[i]; + String fld_name = fld.Name(); + int tid = fld.Type().Tid_ansi(); + switch (tid) { + case Dbmeta_fld_tid.Tid__bool: comp = Bool_.Compare (lhs_rdr.Read_bool_by_byte(fld_name), rhs_rdr.Read_bool_by_byte(fld_name)); break; + case Dbmeta_fld_tid.Tid__int: comp = Int_.Compare (lhs_rdr.Read_int(fld_name) , rhs_rdr.Read_int(fld_name)); break; + case Dbmeta_fld_tid.Tid__long: comp = Long_.Compare (lhs_rdr.Read_long(fld_name) , rhs_rdr.Read_long(fld_name)); break; + case Dbmeta_fld_tid.Tid__float: comp = Float_.Compare (lhs_rdr.Read_float(fld_name) , rhs_rdr.Read_float(fld_name)); break; + case Dbmeta_fld_tid.Tid__double: comp = Double_.Compare (lhs_rdr.Read_double(fld_name) , rhs_rdr.Read_double(fld_name)); break; + case Dbmeta_fld_tid.Tid__str: comp = String_.Compare (lhs_rdr.Read_str(fld_name) , rhs_rdr.Read_str(fld_name)); break; + case Dbmeta_fld_tid.Tid__bry: comp = Bry_.Compare (lhs_rdr.Read_bry(fld_name) , rhs_rdr.Read_bry(fld_name)); break; + default: throw Err_.new_unhandled(tid); + } + if (comp != CompareAble_.Same) return comp; + } + return CompareAble_.Same; + } + public static void Stmt_args(Db_stmt stmt, Dbmeta_fld_itm[] flds, int len, Db_rdr rdr) { + for (int i = 0; i < len; ++i) { + Dbmeta_fld_itm fld = flds[i]; + String fld_name = fld.Name(); + int tid = fld.Type().Tid_ansi(); + switch (tid) { + case Dbmeta_fld_tid.Tid__bool: stmt.Val_bool_as_byte (fld_name, rdr.Read_bool_by_byte(fld_name)); break; + case Dbmeta_fld_tid.Tid__byte: stmt.Val_byte (fld_name, rdr.Read_byte(fld_name)); break; + case Dbmeta_fld_tid.Tid__int: stmt.Val_int (fld_name, rdr.Read_int(fld_name)); break; + case Dbmeta_fld_tid.Tid__long: stmt.Val_long (fld_name, rdr.Read_long(fld_name)); break; + case Dbmeta_fld_tid.Tid__float: stmt.Val_float (fld_name, rdr.Read_float(fld_name)); break; + case Dbmeta_fld_tid.Tid__double: stmt.Val_double (fld_name, rdr.Read_double(fld_name)); break; + case Dbmeta_fld_tid.Tid__str: stmt.Val_str (fld_name, rdr.Read_str(fld_name)); break; + case Dbmeta_fld_tid.Tid__bry: stmt.Val_bry (fld_name, rdr.Read_bry(fld_name)); break; + default: throw Err_.new_unhandled(tid); + } + } + } +} diff --git a/400_xowa/src/gplx/dbs/diffs/builds/Gfdb_diff_bldr.java b/140_dbs/src/gplx/dbs/diffs/builds/Gfdb_diff_bldr.java similarity index 74% rename from 400_xowa/src/gplx/dbs/diffs/builds/Gfdb_diff_bldr.java rename to 140_dbs/src/gplx/dbs/diffs/builds/Gfdb_diff_bldr.java index 6c049773a..3bfd67df9 100644 --- a/400_xowa/src/gplx/dbs/diffs/builds/Gfdb_diff_bldr.java +++ b/140_dbs/src/gplx/dbs/diffs/builds/Gfdb_diff_bldr.java @@ -21,16 +21,17 @@ public class Gfdb_diff_bldr { private Gfdb_diff_rdr_comparer rdr_comparer = new Gfdb_diff_rdr_comparer(); private Gfdb_diff_wkr diff_wkr; public void Init(Gfdb_diff_wkr diff_wkr) {this.diff_wkr = diff_wkr;} - public void Compare(Gfdb_diff_tbl lhs_tbl, Gfdb_diff_tbl rhs_tbl) { - rdr_comparer.Init(lhs_tbl, rhs_tbl); - diff_wkr.Init_tbls(lhs_tbl, rhs_tbl); + public void Compare(Gfdb_diff_tbl tbl, Db_conn old_conn, Db_conn new_conn) { + Db_rdr old_rdr = tbl.Make_rdr(old_conn), new_rdr = tbl.Make_rdr(new_conn); + rdr_comparer.Init_rdrs(tbl, old_rdr, new_rdr); + diff_wkr.Init_rdrs(tbl, old_rdr, new_rdr); boolean loop = true; while (loop) { int rslt = rdr_comparer.Compare(); switch (rslt) { case Gfdb_diff_rdr_comparer.Rslt__same: diff_wkr.Handle_same(); break; - case Gfdb_diff_rdr_comparer.Rslt__lhs_missing: diff_wkr.Handle_lhs_missing(); break; - case Gfdb_diff_rdr_comparer.Rslt__rhs_missing: diff_wkr.Handle_rhs_missing(); break; + case Gfdb_diff_rdr_comparer.Rslt__old_missing: diff_wkr.Handle_old_missing(); break; + case Gfdb_diff_rdr_comparer.Rslt__new_missing: diff_wkr.Handle_new_missing(); break; case Gfdb_diff_rdr_comparer.Rslt__done: loop = false; break; } } diff --git a/140_dbs/src/gplx/dbs/diffs/builds/Gfdb_diff_bldr_tst.java b/140_dbs/src/gplx/dbs/diffs/builds/Gfdb_diff_bldr_tst.java new file mode 100644 index 000000000..b85b2047a --- /dev/null +++ b/140_dbs/src/gplx/dbs/diffs/builds/Gfdb_diff_bldr_tst.java @@ -0,0 +1,105 @@ +/* +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.dbs.diffs.builds; import gplx.*; import gplx.dbs.*; import gplx.dbs.diffs.*; +import org.junit.*; +import gplx.dbs.*; import gplx.dbs.metas.*; import gplx.dbs.engines.mems.*; +public class Gfdb_diff_bldr_tst { + private final Gfdb_diff_bldr_fxt fxt = new Gfdb_diff_bldr_fxt(); + @Before public void init() {fxt.Clear();} + @Test public void Same() { + fxt.Init__tbl__old(Object_.Ary(1, "A") , Object_.Ary(2, "B")); + fxt.Init__tbl__cur(Object_.Ary(1, "A") , Object_.Ary(2, "B")); + fxt.Test__bld(); + } + @Test public void Update() { + fxt.Init__tbl__old(Object_.Ary(1, "A") , Object_.Ary(2, "B")); + fxt.Init__tbl__cur(Object_.Ary(1, "A1") , Object_.Ary(2, "B1")); + fxt.Test__bld("U|1|A1", "U|2|B1"); + } + @Test public void Insert() { + fxt.Init__tbl__old(Object_.Ary(1, "A")); + fxt.Init__tbl__cur(Object_.Ary(1, "A") , Object_.Ary(2, "B")); + fxt.Test__bld("I|2|B"); + } + @Test public void Delete() { + fxt.Init__tbl__old(Object_.Ary(1, "A") , Object_.Ary(2, "B")); + fxt.Init__tbl__cur(Object_.Ary(1, "A")); + fxt.Test__bld("D|2"); + } + @Test public void Basic() { + fxt.Init__tbl__old + ( Object_.Ary(1, "A") + , Object_.Ary(2, "B") + , Object_.Ary(3, "C") + ); + fxt.Init__tbl__cur + ( Object_.Ary(1, "A") + , Object_.Ary(2, "B1") + , Object_.Ary(4, "D") + ); + fxt.Test__bld("U|2|B1", "D|3", "I|4|D"); + } +} +class Gfdb_diff_bldr_fxt { + private final Gfdb_diff_bldr bldr = new Gfdb_diff_bldr(); + private final Db_conn old_conn, new_conn; + private final Gfdb_diff_tbl tbl; + private final Gfdb_diff_wkr__test wkr = new Gfdb_diff_wkr__test(); + private final Dbmeta_fld_itm[] flds_ary; + private final String tbl_name = "tbl"; + public Gfdb_diff_bldr_fxt() { + old_conn = Db_conn_utl.Conn__new("old_db"); + new_conn = Db_conn_utl.Conn__new("new_db"); + this.flds_ary = new Dbmeta_fld_itm[] {Dbmeta_fld_itm.new_int("id").Primary_y_(), Dbmeta_fld_itm.new_str("val", 255)}; + tbl = Gfdb_diff_tbl.New(Dbmeta_tbl_itm.New(tbl_name, flds_ary)); + bldr.Init(wkr); + } + public void Clear() { + Db_conn_utl.Tbl__delete(old_conn, "tbl"); + Db_conn_utl.Tbl__delete(new_conn, "tbl"); + } + public void Init__tbl__old(Object[]... rows) {Db_conn_utl.Tbl__new(old_conn, "tbl", flds_ary, rows);} + public void Init__tbl__cur(Object[]... rows) {Db_conn_utl.Tbl__new(new_conn, "tbl", flds_ary, rows);} + public void Test__bld(String... expd) { + bldr.Compare(tbl, old_conn, new_conn); + Tfds.Eq_ary_str(expd, wkr.To_str_ary()); + } +} +class Gfdb_diff_wkr__test implements Gfdb_diff_wkr { + private final List_adp list = List_adp_.new_(); + private final Bry_bfr bfr = Bry_bfr.new_(); + private Db_rdr old_rdr, new_rdr; + public void Init_rdrs(Gfdb_diff_tbl tbl, Db_rdr old_rdr, Db_rdr new_rdr) { + this.old_rdr = old_rdr; this.new_rdr = new_rdr; + } + public void Term_tbls() {} + public void Handle_same() { + String old_val = old_rdr.Read_str("val"); + String new_val = new_rdr.Read_str("val"); + if (!String_.Eq(old_val, new_val)) + list.Add(bfr.Add_str_a7("U").Add_byte_pipe().Add_obj(old_rdr.Read_obj("id")).Add_byte_pipe().Add_str_a7(new_val).To_str_and_clear()); + } + public void Handle_old_missing() { + String new_val = new_rdr.Read_str("val"); + list.Add(bfr.Add_str_a7("I").Add_byte_pipe().Add_obj(new_rdr.Read_obj("id")).Add_byte_pipe().Add_str_a7(new_val).To_str_and_clear()); + } + public void Handle_new_missing() { + list.Add(bfr.Add_str_a7("D").Add_byte_pipe().Add_obj(old_rdr.Read_obj("id")).To_str_and_clear()); + } + public String[] To_str_ary() {return list.To_str_ary_and_clear();} +} diff --git a/140_dbs/src/gplx/dbs/diffs/builds/Gfdb_diff_rdr_comparer.java b/140_dbs/src/gplx/dbs/diffs/builds/Gfdb_diff_rdr_comparer.java new file mode 100644 index 000000000..6d4573074 --- /dev/null +++ b/140_dbs/src/gplx/dbs/diffs/builds/Gfdb_diff_rdr_comparer.java @@ -0,0 +1,66 @@ +/* +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.dbs.diffs.builds; import gplx.*; import gplx.dbs.*; import gplx.dbs.diffs.*; +class Gfdb_diff_rdr_comparer { + private Db_rdr old_rdr, new_rdr; + private boolean old_rdr_move, new_rdr_move; + private boolean old_rdr_done, new_rdr_done; + private Dbmeta_fld_itm[] key_flds; private int key_flds_len; + public void Init_rdrs(Gfdb_diff_tbl tbl, Db_rdr old_rdr, Db_rdr new_rdr) { + this.old_rdr = old_rdr; this.new_rdr = new_rdr; + this.old_rdr_move = new_rdr_move = Bool_.Y; + this.old_rdr_done = new_rdr_done = Bool_.N; + this.key_flds = tbl.Keys; key_flds_len = key_flds.length; + } + public int Compare() { + if (old_rdr_move) { + old_rdr_move = old_rdr.Move_next(); + if (!old_rdr_move) old_rdr_done = true; + } + if (new_rdr_move) { + new_rdr_move = new_rdr.Move_next(); + if (!new_rdr_move) new_rdr_done = true; + } + if (old_rdr_done && new_rdr_done) return Gfdb_diff_rdr_comparer.Rslt__done; + else if (old_rdr_done) {new_rdr_move = true; return Gfdb_diff_rdr_comparer.Rslt__old_missing;} + else if (new_rdr_done) {old_rdr_move = true; return Gfdb_diff_rdr_comparer.Rslt__new_missing;} + else { + int comp = Gfdb_rdr_utl_.Compare(key_flds, key_flds_len, old_rdr, new_rdr); + switch (comp) { + case CompareAble_.Same: // old == cur; move both + old_rdr_move = new_rdr_move = true; + return Gfdb_diff_rdr_comparer.Rslt__same; + case CompareAble_.Less: // old < cur; EX: old == 2; cur == 3 + old_rdr_move = true; + new_rdr_move = false; + return Gfdb_diff_rdr_comparer.Rslt__new_missing; + case CompareAble_.More: // old > cur; EX: old == 4; cur == 3 + old_rdr_move = false; + new_rdr_move = true; + return Gfdb_diff_rdr_comparer.Rslt__old_missing; + default: throw Err_.new_unhandled(comp); + } + } + } + public static final int + Rslt__same = 0 + , Rslt__old_missing = 1 + , Rslt__new_missing = 2 + , Rslt__done = 3 + ; +} diff --git a/400_xowa/src/gplx/dbs/diffs/builds/Gfdb_diff_wkr.java b/140_dbs/src/gplx/dbs/diffs/builds/Gfdb_diff_wkr.java similarity index 86% rename from 400_xowa/src/gplx/dbs/diffs/builds/Gfdb_diff_wkr.java rename to 140_dbs/src/gplx/dbs/diffs/builds/Gfdb_diff_wkr.java index 0010e0e2b..48b425007 100644 --- a/400_xowa/src/gplx/dbs/diffs/builds/Gfdb_diff_wkr.java +++ b/140_dbs/src/gplx/dbs/diffs/builds/Gfdb_diff_wkr.java @@ -17,9 +17,9 @@ along with this program. If not, see . */ package gplx.dbs.diffs.builds; import gplx.*; import gplx.dbs.*; import gplx.dbs.diffs.*; public interface Gfdb_diff_wkr { - void Init_tbls(Gfdb_diff_tbl lhs, Gfdb_diff_tbl rhs); + void Init_rdrs(Gfdb_diff_tbl tbl, Db_rdr old_rdr, Db_rdr new_rdr); void Term_tbls(); void Handle_same(); - void Handle_lhs_missing(); - void Handle_rhs_missing(); + void Handle_old_missing(); + void Handle_new_missing(); } diff --git a/400_xowa/src/gplx/dbs/diffs/builds/Gfdb_diff_wkr__db.java b/140_dbs/src/gplx/dbs/diffs/builds/Gfdb_diff_wkr__db.java similarity index 53% rename from 400_xowa/src/gplx/dbs/diffs/builds/Gfdb_diff_wkr__db.java rename to 140_dbs/src/gplx/dbs/diffs/builds/Gfdb_diff_wkr__db.java index e7bec3350..7cfdee1d3 100644 --- a/400_xowa/src/gplx/dbs/diffs/builds/Gfdb_diff_wkr__db.java +++ b/140_dbs/src/gplx/dbs/diffs/builds/Gfdb_diff_wkr__db.java @@ -16,19 +16,21 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.dbs.diffs.builds; import gplx.*; import gplx.dbs.*; import gplx.dbs.diffs.*; -class Gfdb_diff_wkr__db implements Gfdb_diff_wkr { - private Gfdb_diff_tbl lhs_tbl, rhs_tbl; - private Db_meta_fld[] val_flds; private int val_flds_len; +import gplx.dbs.metas.*; +public class Gfdb_diff_wkr__db implements Gfdb_diff_wkr { + private Dbmeta_fld_itm[] val_flds; private int val_flds_len; + private Gfdb_diff_tbl tbl; private Db_conn diff_conn; private Db_stmt stmt; + private Db_rdr old_rdr, new_rdr; private int uid__upsert, uid__delete; private int prog_interval, prog_count; public void Init_conn(Gfdb_diff_db diff_db, int prog_interval) {this.diff_conn = diff_db.Conn(); this.prog_interval = prog_interval;} - public void Init_tbls(Gfdb_diff_tbl lhs_tbl, Gfdb_diff_tbl rhs_tbl) { - this.lhs_tbl = lhs_tbl; this.rhs_tbl = rhs_tbl; - this.val_flds = lhs_tbl.Vals(); val_flds_len = val_flds.length; + public void Init_rdrs(Gfdb_diff_tbl tbl, Db_rdr old_rdr, Db_rdr new_rdr) { + this.tbl = tbl; this.old_rdr = old_rdr; this.new_rdr = new_rdr; + this.val_flds = tbl.Vals; val_flds_len = val_flds.length; this.uid__upsert = 0; uid__delete = 0; this.prog_count = 0; - String tbl_name = rhs_tbl.Name(); - Db_meta_fld[] diff_flds = Gfdb_diff_wkr__db_.New_diff_flds(rhs_tbl.Flds()); - if (!diff_conn.Meta_tbl_exists(tbl_name)) diff_conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, diff_flds)); + String tbl_name = tbl.Name; + Dbmeta_fld_itm[] diff_flds = Gfdb_diff_wkr__db_.New_diff_flds(tbl.Flds); + if (!diff_conn.Meta_tbl_exists(tbl_name)) diff_conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, diff_flds)); this.stmt = diff_conn.Stmt_insert(tbl_name, Gfdb_diff_wkr__db_.To_str_ary(diff_flds)); diff_conn.Txn_bgn("diff_db"); } @@ -36,12 +38,12 @@ class Gfdb_diff_wkr__db implements Gfdb_diff_wkr { diff_conn.Txn_end(); } public void Handle_same() { - if (Gfdb_rdr_utl_.Compare(val_flds, val_flds_len, lhs_tbl.Rdr(), rhs_tbl.Rdr()) != CompareAble_.Same) - Insert(Gfdb_diff_db_.Tid__update, uid__upsert++, rhs_tbl.Flds(), rhs_tbl.Rdr()); + if (Gfdb_rdr_utl_.Compare(val_flds, val_flds_len, old_rdr, new_rdr) != CompareAble_.Same) + Insert(Gfdb_diff_db_.Tid__update, uid__upsert++, tbl.Flds, new_rdr); } - public void Handle_lhs_missing() {Insert(Gfdb_diff_db_.Tid__insert, uid__upsert++, rhs_tbl.Flds(), rhs_tbl.Rdr());} - public void Handle_rhs_missing() {Insert(Gfdb_diff_db_.Tid__delete, uid__delete++, lhs_tbl.Keys(), lhs_tbl.Rdr());} - private void Insert(byte diff_type, int uid, Db_meta_fld[] flds, Db_rdr rdr) { + public void Handle_old_missing() {Insert(Gfdb_diff_db_.Tid__insert, uid__upsert++, tbl.Flds, new_rdr);} + public void Handle_new_missing() {Insert(Gfdb_diff_db_.Tid__delete, uid__delete++, tbl.Keys, old_rdr);} + private void Insert(byte diff_type, int uid, Dbmeta_fld_itm[] flds, Db_rdr rdr) { stmt.Val_int (Gfdb_diff_db_.Fld__diff_site , -1) .Val_int (Gfdb_diff_db_.Fld__diff_time , -1) .Val_int (Gfdb_diff_db_.Fld__diff_db_trg , -1) @@ -55,24 +57,24 @@ class Gfdb_diff_wkr__db implements Gfdb_diff_wkr { } } class Gfdb_diff_wkr__db_ { - public static Db_meta_fld[] New_diff_flds(Db_meta_fld[] all_flds) { + public static Dbmeta_fld_itm[] New_diff_flds(Dbmeta_fld_itm[] all_flds) { int len = all_flds.length; int system_flds = 6; - Db_meta_fld[] rv = new Db_meta_fld[len + system_flds]; - rv[0] = Db_meta_fld.new_int (Gfdb_diff_db_.Fld__diff_site); - rv[1] = Db_meta_fld.new_int (Gfdb_diff_db_.Fld__diff_time); - rv[2] = Db_meta_fld.new_int (Gfdb_diff_db_.Fld__diff_db_trg); - rv[3] = Db_meta_fld.new_int (Gfdb_diff_db_.Fld__diff_db_src); - rv[4] = Db_meta_fld.new_byte(Gfdb_diff_db_.Fld__diff_type); - rv[5] = Db_meta_fld.new_int (Gfdb_diff_db_.Fld__diff_uid); + Dbmeta_fld_itm[] rv = new Dbmeta_fld_itm[len + system_flds]; + rv[0] = Dbmeta_fld_itm.new_int (Gfdb_diff_db_.Fld__diff_site); + rv[1] = Dbmeta_fld_itm.new_int (Gfdb_diff_db_.Fld__diff_time); + rv[2] = Dbmeta_fld_itm.new_int (Gfdb_diff_db_.Fld__diff_db_trg); + rv[3] = Dbmeta_fld_itm.new_int (Gfdb_diff_db_.Fld__diff_db_src); + rv[4] = Dbmeta_fld_itm.new_byte(Gfdb_diff_db_.Fld__diff_type); + rv[5] = Dbmeta_fld_itm.new_int (Gfdb_diff_db_.Fld__diff_uid); for (int i = 0; i < len; ++i) { - Db_meta_fld orig_fld = all_flds[i]; - Db_meta_fld diff_fld = new Db_meta_fld(orig_fld.Name(), orig_fld.Tid(), orig_fld.Len()).Nullable_y_(); // keep same name and type, but make nullable + Dbmeta_fld_itm orig_fld = all_flds[i]; + Dbmeta_fld_itm diff_fld = new Dbmeta_fld_itm(orig_fld.Name(), orig_fld.Type()).Nullable_y_(); // keep same name and type, but make nullable all_flds[i + system_flds] = diff_fld; } return rv; } - public static String[] To_str_ary(Db_meta_fld[] ary) { + public static String[] To_str_ary(Dbmeta_fld_itm[] ary) { int len = ary.length; String[] rv = new String[len]; for (int i = 0; i < len; ++i) diff --git a/140_dbs/src/gplx/dbs/diffs/cmds/Gfdb_diff_cmd.java b/140_dbs/src/gplx/dbs/diffs/cmds/Gfdb_diff_cmd.java new file mode 100644 index 000000000..afe0065a6 --- /dev/null +++ b/140_dbs/src/gplx/dbs/diffs/cmds/Gfdb_diff_cmd.java @@ -0,0 +1,305 @@ +/* +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.dbs.diffs.cmds; import gplx.*; import gplx.dbs.*; import gplx.dbs.diffs.*; +import gplx.core.srls.*; import gplx.core.brys.fmtrs.*; +import gplx.dbs.metas.*; +interface Gfdb_diff_cmd { + void Merge_undo(); + void Merge_exec(); +} +class Gfdb_diff_ctx implements Gfo_srl_ctx { + public Gfo_srl_mgr_wtr Wtr_bgn(String key) {return null;} + public Gfo_srl_mgr_rdr Rdr_bgn(String key) {return null;} + public Dbmeta_dat_mgr Rdr_subs(String key) {return null;} + public Dbmeta_tbl_itm Tbls__get(String key) {return null;} +} +class Gfo_srl_mgr_rdr__defn { + public String Tbl = null; + public String[] Select_crt_cols = null; + public String[] Delete_crt_cols = null; +} +class Gfo_srl_mgr_rdr__db { + public Object Get_subs (Gfo_srl_ctx ctx, Gfo_srl_itm owner, Gfo_srl_itm proto, String defn_key, Dbmeta_dat_mgr crt_mgr) { + List_adp list = List_adp_.new_(); + + Gfo_srl_mgr_rdr__defn defn = new Gfo_srl_mgr_rdr__defn(); // Get(key) + Db_conn conn = Db_conn_.Noop; + Db_stmt select = conn.Stmt_select(defn.Tbl, Dbmeta_fld_itm.Str_ary_empty, defn.Select_crt_cols); + int crt_len = crt_mgr.Len(); + for (int i = 0; i < crt_len; ++i) { + Dbmeta_dat_itm crt = crt_mgr.Get_at(i); + switch (crt.Tid) { + case Dbmeta_fld_tid.Tid__int: select.Crt_int(crt.Key, Int_.cast(crt.Val)); break; + } + } + Db_rdr rdr = select.Exec_select__rls_manual(); + while (rdr.Move_next()) { + Gfo_srl_itm sub = proto.Make_new(ctx); + list.Add(sub); + sub.Load(ctx, owner, null); + } + rdr.Rls(); + + return list.To_ary_and_clear(proto.getClass()); + } + public void Set_subs (Gfo_srl_ctx ctx, Gfo_srl_itm owner, Gfo_srl_itm proto, Gfo_srl_itm[] subs_ary, String defn_key, Dbmeta_dat_mgr crt_mgr) { + Gfo_srl_mgr_rdr__defn defn = new Gfo_srl_mgr_rdr__defn(); // Get(key) + Db_conn conn = Db_conn_.Noop; + Db_stmt delete = conn.Stmt_delete(defn.Tbl, defn.Delete_crt_cols); + int crt_len = crt_mgr.Len(); + for (int i = 0; i < crt_len; ++i) { + Dbmeta_dat_itm crt = crt_mgr.Get_at(i); + switch (crt.Tid) { + case Dbmeta_fld_tid.Tid__int: delete.Crt_int(crt.Key, Int_.cast(crt.Val)); break; + } + } + delete.Exec_delete(); + + int subs_len = subs_ary.length; + for (int i = 0; i < subs_len; ++i) { + Gfo_srl_itm itm = subs_ary[i]; + itm.Save(ctx, owner, null); + } + } +} +class Gfdb_diff_cmd__idx__delete { + public Gfdb_diff_cmd__idx__delete(Dbmeta_idx_itm old) {this.Old = old;} + public final Dbmeta_idx_itm Old; +} +class Gfdb_diff_cmd__idx__modify { + public Gfdb_diff_cmd__idx__modify(Dbmeta_idx_itm old, Dbmeta_idx_itm cur) {this.Old = old; this.Cur = cur;} + public final Dbmeta_idx_itm Old; + public final Dbmeta_idx_itm Cur; +} +class Gfdb_diff_txn { + public int Id = 0; +} +class Gfdb_diff_cmd__fld__create { + public Gfdb_diff_cmd__fld__create(Dbmeta_fld_itm cur) {this.cur = cur;} + private Dbmeta_fld_itm cur; + public void Save(Gfo_srl_ctx ctx, Gfo_srl_itm owner) { + Gfo_srl_mgr_wtr wtr = ctx.Wtr_bgn("cmd.fld"); + wtr.Set_int ("txn_id" , ((Gfdb_diff_txn)owner).Id); + wtr.Set_str ("name" , cur.Name()); + wtr.Set_int ("type_tid" , cur.Type().Tid_ansi()); + wtr.Set_int ("type_len_1" , cur.Type().Len_1()); + wtr.Set_int ("type_len_2" , cur.Type().Len_2()); + wtr.Set_bool ("primary" , cur.Primary()); + wtr.Set_int ("nullable" , cur.Nullable_tid()); + wtr.Set_str ("dflt" , Object_.Xto_str_or(cur.Default(), null)); + wtr.Itm_end(); + } + public void Load(Gfo_srl_ctx ctx, Gfo_srl_itm owner) { + Gfo_srl_mgr_rdr rdr = ctx.Rdr_bgn("cmd.fld"); + String name = rdr.Get_str("name"); + int type_tid = rdr.Get_int("type_tid"); + int type_len_1 = rdr.Get_int("type_len_1"); + // int type_len_2 = rdr.Get_int("type_len_2"); + boolean primary = rdr.Get_bool("primary"); + int nullable_tid = rdr.Get_int("nullable"); + String dflt_str = rdr.Get_str("dflt"); + cur = new Dbmeta_fld_itm(name, Dbmeta_fld_tid.New(type_tid, type_len_1)); + cur.Nullable_tid_(nullable_tid); + if (primary) cur.Primary_y_(); + if (dflt_str != null) cur.Default_(dflt_str); + rdr.Itm_end(); +// Gfdb_diff_cmd__idx__create idx = ((Gfdb_diff_cmd__idx__create)owner); +// Dbmeta_tbl_itm tbl = ((Gfdb_diff_ctx)ctx).Tbls__get(idx.cur.Tbl()); +// Dbmeta_fld_tid tid = tbl.Flds().Get_by(name).Type(); + } +} +class Gfdb_diff_cmd__fld__delete { + public Gfdb_diff_cmd__fld__delete(Dbmeta_fld_itm old) {this.Old = old;} + public final Dbmeta_fld_itm Old; +} +class Gfdb_diff_cmd__fld__modify { + public Gfdb_diff_cmd__fld__modify(Dbmeta_fld_itm old, Dbmeta_fld_itm cur) {this.Old = old; this.Cur = cur;} + public final Dbmeta_fld_itm Old; + public final Dbmeta_fld_itm Cur; +} +class Gfdb_diff_cmd__tbl__create { + public Gfdb_diff_cmd__tbl__create(Dbmeta_tbl_itm cur) {this.Cur = cur;} + public final Dbmeta_tbl_itm Cur; +} +class Gfdb_diff_cmd__tbl__delete { + public Gfdb_diff_cmd__tbl__delete(Dbmeta_tbl_itm old) {this.Old = old;} + public final Dbmeta_tbl_itm Old; +} +class Gfdb_diff_cmd_bldr { + public void Chk_tbls(List_adp rv, Dbmeta_tbl_mgr old_tbls, Dbmeta_tbl_mgr cur_tbls) { + int cur_tbls_len = cur_tbls.Len(); + for (int i = 0; i < cur_tbls_len; ++i) { + Dbmeta_tbl_itm cur_tbl = cur_tbls.Get_at(i); + Dbmeta_tbl_itm old_tbl = old_tbls.Get_by(cur_tbl.Name()); + if (old_tbl == null) + rv.Add(new Gfdb_diff_cmd__tbl__create(cur_tbl)); + else { + Chk_idxs(rv, old_tbl, cur_tbl); + Chk_flds(rv, old_tbl, cur_tbl); + // Chk_data? + } + } + int old_tbls_len = old_tbls.Len(); + for (int i = 0; i < old_tbls_len; ++i) { + Dbmeta_tbl_itm old_tbl = old_tbls.Get_at(i); + Dbmeta_tbl_itm cur_tbl = cur_tbls.Get_by(old_tbl.Name()); + if (cur_tbl == null) + rv.Add(new Gfdb_diff_cmd__tbl__delete(old_tbl)); + } + } + public void Chk_idxs(List_adp rv, Dbmeta_tbl_itm old_tbl, Dbmeta_tbl_itm cur_tbl) { + Dbmeta_idx_mgr old_idxs = old_tbl.Idxs(), cur_idxs = cur_tbl.Idxs(); + int cur_idxs_len = cur_idxs.Len(); + for (int i = 0; i < cur_idxs_len; ++i) { + Dbmeta_idx_itm cur_idx = cur_idxs.Get_at(i); + Dbmeta_idx_itm old_idx = old_idxs.Get_by(cur_idx.Name()); + if (old_idx == null) + rv.Add(new Gfdb_diff_cmd__idx__create(cur_idx)); + else + if (!cur_idx.Eq(old_idx)) + rv.Add(new Gfdb_diff_cmd__idx__modify(old_idx, cur_idx)); + } + int old_idxs_len = old_idxs.Len(); + for (int i = 0; i < old_idxs_len; ++i) { + Dbmeta_idx_itm old_idx = old_idxs.Get_at(i); + Dbmeta_idx_itm cur_idx = cur_idxs.Get_by(old_idx.Name()); + if (cur_idx == null) + rv.Add(new Gfdb_diff_cmd__idx__delete(old_idx)); + } + } + public void Chk_flds(List_adp rv, Dbmeta_tbl_itm old_tbl, Dbmeta_tbl_itm cur_tbl) { + Dbmeta_fld_mgr old_flds = old_tbl.Flds(), cur_flds = cur_tbl.Flds(); + int cur_flds_len = cur_flds.Len(); + for (int i = 0; i < cur_flds_len; ++i) { + Dbmeta_fld_itm cur_fld = cur_flds.Get_at(i); + Dbmeta_fld_itm old_fld = old_flds.Get_by(cur_fld.Name()); + if (old_fld == null) + rv.Add(new Gfdb_diff_cmd__fld__create(cur_fld)); + else + if (!cur_fld.Eq(old_fld)) + rv.Add(new Gfdb_diff_cmd__fld__modify(old_fld, cur_fld)); + } + int old_flds_len = old_flds.Len(); + for (int i = 0; i < old_flds_len; ++i) { + Dbmeta_fld_itm old_fld = old_flds.Get_at(i); + Dbmeta_fld_itm cur_fld = cur_flds.Get_by(old_fld.Name()); + if (cur_fld == null) + rv.Add(new Gfdb_diff_cmd__fld__delete(old_fld)); + } + } +} +class Gfdb_diff_cmd__insert { +// else if I +// // txn_bgn +// // audit +// INSERT INTO db_temp.page (diff_type, diff, *) +// SELECT 'D', d.page_id, * +// FROM db_diff.page d +// JOIN db_main.page m ON d.page_id = m.page_id +// WHERE d.diff_type = 0 +// AND d.diff_idx BETWEEN lo and hi +// +// // update +// INSERT INTO db_main.page +// SELECT d.page_title +// FROM db_diff.page d +// JOIN db_main.page m +// // txn_end + private Db_conn conn; + private String exec_sql; + public void Init(Db_conn main_conn, Db_conn diff_conn, Db_conn temp_conn, Gfdb_diff_tbl tbl) { + this.conn = temp_conn; + this.exec_sql = ""; +// this.exec_sql = String_.Format(String_.Concat_lines_nl_skip_last +// ( "INSERT INTO db_curr.{tbl}" +// ), Gfdb_diff_cmd_ctx.Alias__curr); + } + public void Merge_exec() { + conn.Exec_sql(exec_sql); + } +} +class Gfdb_diff_cmd_sql_bldr { + private final Bry_fmtr fmtr = Bry_fmtr.new_(); + private final Bry_bfr tmp_bfr = Bry_bfr.new_(); + public void Bld_insert(Bry_bfr bfr, String tbl_name, String[] keys, String[] vals, int rng_bgn, int rng_end) { + fmtr.Fmt_(Insert__fmt).Keys_(Insert__keys); + fmtr.Bld_bfr_many(bfr, tbl_name, Bld_flds(tmp_bfr, ", ", "d.", keys, vals), Bld_join(keys), rng_bgn, rng_end); + } + public void Bld_update(Bry_bfr bfr, String tbl_name, String[] keys, String[] vals, int rng_bgn, int rng_end) { + fmtr.Fmt_(Update__fmt).Keys_(Update__keys); + fmtr.Bld_bfr_many(bfr, tbl_name, Bld_flds(tmp_bfr, ", ", "d.", keys, vals), Bld_join(keys), rng_bgn, rng_end); + } + public void Bld_delete(Bry_bfr bfr, String tbl_name, String[] keys, int rng_bgn, int rng_end) { + fmtr.Fmt_(Delete__fmt).Keys_(Delete__keys); + fmtr.Bld_bfr_many(bfr, tbl_name, Bld_flds(tmp_bfr, " || '|' || ", "", keys, String_.Ary_empty), Bld_flds(tmp_bfr, " || '|' || ", "k.", keys, String_.Ary_empty), Bld_join(keys), rng_bgn, rng_end); + } + private static String Bld_flds(Bry_bfr tmp_bfr, String dlm, String alias, String[] keys, String[] vals) { + int keys_len = keys.length; + for (int i = 0; i < keys_len; ++i) { + String key = keys[i]; + if (i != 0) tmp_bfr.Add_str_a7(dlm); + tmp_bfr.Add_str_a7(alias).Add_str_a7(key); + } + int flds_len = vals.length; + for (int i = 0; i < flds_len; ++i) { + String val = vals[i]; + tmp_bfr.Add_str_a7(dlm); + tmp_bfr.Add_str_a7(alias).Add_str_a7(val); + } + return tmp_bfr.To_str_and_clear(); + } + private String Bld_join(String[] keys) { + int len = keys.length; + for (int i = 0; i < len; ++i) { + String key = keys[i]; + tmp_bfr.Add_str_a7(i == 0 ? " ON " : " AND "); + tmp_bfr.Add_str_a7("k.").Add_str_a7(key).Add_str_a7(" = "); + tmp_bfr.Add_str_a7("d.").Add_str_a7(key); + } + return tmp_bfr.To_str_and_clear(); + } + private static final String[] Insert__keys = String_.Ary("tbl", "flds", "join", "rng_bgn", "rng_end"); + private static final String Insert__fmt = String_.Concat_lines_nl_skip_last + ( "INSERT INTO db_curr.~{tbl}" + , "SELECT ~{flds}" + , "FROM db_temp.~{tbl}_pkey k" + , " JOIN db_diff.~{tbl} d~{join}" + , "WHERE k.diff_type = 1" + , "AND k.diff_uid BETWEEN ~{rng_bgn} AND ~{rng_end};" + ); + private static final String[] Update__keys = String_.Ary("tbl", "flds", "join", "rng_bgn", "rng_end"); + private static final String Update__fmt = String_.Concat_lines_nl_skip_last + ( "REPLACE INTO db_curr.~{tbl}" + , "SELECT ~{flds}" + , "FROM db_temp.~{tbl}_pkey k" + , " JOIN db_diff.~{tbl} d~{join}" + , "WHERE k.diff_type = 2" + , "AND k.diff_uid BETWEEN ~{rng_bgn} AND ~{rng_end};" + ); + private static final String[] Delete__keys = String_.Ary("tbl", "pkey_where", "pkey_select", "join", "rng_bgn", "rng_end"); + private static final String Delete__fmt = String_.Concat_lines_nl_skip_last + ( "DELETE db_curr.~{tbl}" + , "WHERE ~{pkey_where} IN" + , "( SELECT ~{pkey_select}" + , " FROM db_temp.~{tbl}_pkey k" + , " JOIN db_diff.~{tbl} d~{join}" + , " WHERE k.diff_type = 0" + , " AND k.diff_uid BETWEEN ~{rng_bgn} AND ~{rng_end}" + , ");" + ); +} diff --git a/140_dbs/src/gplx/dbs/diffs/cmds/Gfdb_diff_cmd__idx__create.java b/140_dbs/src/gplx/dbs/diffs/cmds/Gfdb_diff_cmd__idx__create.java new file mode 100644 index 000000000..f4b795536 --- /dev/null +++ b/140_dbs/src/gplx/dbs/diffs/cmds/Gfdb_diff_cmd__idx__create.java @@ -0,0 +1,119 @@ +/* +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.dbs.diffs.cmds; import gplx.*; import gplx.dbs.*; import gplx.dbs.diffs.*; +import gplx.core.srls.*; import gplx.dbs.metas.*; + +class Gfdb_diff_cmd__idx__create implements Gfo_srl_itm { + public Gfdb_diff_cmd__idx__create(Dbmeta_idx_itm cur) {this.cur = cur;} + public Dbmeta_idx_itm cur; + private Gfdb_diff_cmd__idx__fld[] flds = new Gfdb_diff_cmd__idx__fld[0]; + public Gfo_srl_itm Make_new(Gfo_srl_ctx ctx) {return new Gfdb_diff_cmd__idx__create();} Gfdb_diff_cmd__idx__create() {} + private int idx_uid; + // *_sdif_ddl_idx : txn_uid,idx_uid,idx_tbl,idx_name,idx_unique + public void Save(Gfo_srl_ctx ctx, Gfo_srl_itm owner, Gfo_srl_mgr_wtr wtr) { + wtr.Itm_bgn("idx"); + wtr.Set_int ("idx_uid" , idx_uid); + wtr.Set_str ("idx_tbl" , cur.Tbl()); + wtr.Set_str ("idx_name" , cur.Name()); + wtr.Set_bool ("idx_unique" , cur.Unique()); + wtr.Set_subs (ctx, this, Gfdb_diff_cmd__idx__fld.Instance, flds, ctx.Rdr_subs("idx_fld").Add_int("idx_uid", idx_uid)); + wtr.Itm_end(); + } + public void Load(Gfo_srl_ctx ctx, Gfo_srl_itm owner, Gfo_srl_mgr_rdr rdr) { + rdr.Itm_bgn("idx"); + this.idx_uid = rdr.Get_int ("idx_uid"); + String tbl = rdr.Get_str ("idx_tbl"); + String name = rdr.Get_str ("idx_name"); + boolean unique = rdr.Get_bool ("idx_unique"); + this.flds = (Gfdb_diff_cmd__idx__fld[])rdr.Get_subs(ctx, this, Gfdb_diff_cmd__idx__fld.Instance, ctx.Rdr_subs("idx_fld").Add_int("idx_uid", idx_uid)); + cur = new Dbmeta_idx_itm(unique, tbl, name, Dbmeta_idx_fld.Ary_empty); + rdr.Itm_end(); + } + public void Exec(Db_conn conn) { + conn.Ddl_create_idx(cur); + } +} +class Gfdb_diff_cmd__idx__fld implements Gfo_srl_itm { + public Gfdb_diff_cmd__idx__fld(Dbmeta_idx_fld cur) {this.cur = cur;} + private Dbmeta_idx_fld cur; + public Gfo_srl_itm Make_new(Gfo_srl_ctx ctx) {return new Gfdb_diff_cmd__idx__fld();} Gfdb_diff_cmd__idx__fld() {} + // *_sdif_ddl_idx_fld : idx_uid,fld_order,fld_name,fld_asc + public void Save(Gfo_srl_ctx ctx, Gfo_srl_itm owner, Gfo_srl_mgr_wtr wtr) { + wtr.Itm_bgn("idx_fld"); + wtr.Set_int ("fld_order" , cur.Order); + wtr.Set_str ("fld_name" , cur.Name); + wtr.Set_int ("fld_asc" , cur.Sort_tid); + wtr.Itm_end(); + } + public void Load(Gfo_srl_ctx ctx, Gfo_srl_itm owner, Gfo_srl_mgr_rdr rdr) { + rdr.Itm_bgn("idx_fld"); + int order = rdr.Get_int ("fld_order"); + String name = rdr.Get_str ("fld_name"); + int sort_tid = rdr.Get_int ("fld_sort"); + cur = new Dbmeta_idx_fld(order, name, sort_tid); + rdr.Itm_end(); + } + + public static final Gfdb_diff_cmd__idx__fld Instance = new Gfdb_diff_cmd__idx__fld(); +} +// class Gfdb_diff_cmd__tbl__fld : Gfo_srl_itm { +// public Gfdb_diff_cmd__tbl__fld(Dbmeta_fld_itm cur) {this.cur = cur;} +// private Dbmeta_fld_itm cur; +// public String Name; +// public int Type_tid; +// public int Len1; +// public int Len2; +// public int Nullable; +// public boolean Primary; +// public boolean Autonum; +// +// public Gfo_srl_itm Make_new(Gfo_srl_ctx ctx) {return new Gfdb_diff_cmd__tbl__fld();} Gfdb_diff_cmd__tbl__fld() {} +// // *_sdif_ddl_tbl_fld : tbl_uid,fld_idx,fld_name,fld_type,fld_len1, fld_len2, fld_nullable, fld_primary, fld_autonumber +// public void Save(Gfo_srl_ctx ctx, Gfo_srl_itm owner, Gfo_srl_mgr_wtr wtr) { +// wtr.Itm_bgn("tbl_fld"); +// wtr.Set_str ("fld_name" , cur.Name()); +// wtr.Set_int ("fld_type" , cur.Type().Tid_ansi()); +// wtr.Set_int ("fld_len1" , cur.Type().Len_1()); +// wtr.Set_int ("fld_len2" , cur.Type().Len_2()); +// wtr.Set_int ("fld_nullable" , cur.Nullable_tid()); +// wtr.Set_bool ("fld_primary" , cur.Primary()); +// wtr.Set_bool ("fld_autonum" , cur.Autonum()); +// wtr.Set_str ("fld_dflt" , Object_.Xto_str_or(cur.Default(), null)); +//// wtr.Set_int ("fld_asc" , cur.Sort_tid); +// wtr.Itm_end(); +// } +// public void Load(Gfo_srl_ctx ctx, Gfo_srl_itm owner, Gfo_srl_mgr_rdr rdr) { +// rdr.Itm_bgn("tbl_fld"); +// String name = rdr.Get_str("name"); +// int type_tid = rdr.Get_int("type_tid"); +// int type_len_1 = rdr.Get_int("type_len_1"); +// boolean primary = rdr.Get_bool("primary"); +// int nullable_tid = rdr.Get_int("nullable"); +// String dflt_str = rdr.Get_str("dflt"); +// cur = new Dbmeta_fld_itm(name, Dbmeta_fld_tid.New(type_tid, type_len_1)); +// cur.Nullable_tid_(nullable_tid); +// if (primary) cur.Primary_y_(); +// if (dflt_str != null) cur.Default_(dflt_str); +// rdr.Itm_end(); +//// Gfdb_diff_cmd__idx__create idx = ((Gfdb_diff_cmd__idx__create)owner); +//// Dbmeta_tbl_itm tbl = ((Gfdb_diff_ctx)ctx).Tbls__get(idx.cur.Tbl()); +//// Dbmeta_fld_tid tid = tbl.Flds().Get_by(name).Type(); +// } +// +// public static final Gfdb_diff_cmd__tbl__fld Instance = new Gfdb_diff_cmd__tbl__fld(); +// } diff --git a/400_xowa/src/gplx/dbs/diffs/merges/Gfdb_diff_cmd_sql_bldr_tst.java b/140_dbs/src/gplx/dbs/diffs/cmds/Gfdb_diff_cmd_sql_bldr_tst.java similarity index 95% rename from 400_xowa/src/gplx/dbs/diffs/merges/Gfdb_diff_cmd_sql_bldr_tst.java rename to 140_dbs/src/gplx/dbs/diffs/cmds/Gfdb_diff_cmd_sql_bldr_tst.java index 642b62d88..8447fa442 100644 --- a/400_xowa/src/gplx/dbs/diffs/merges/Gfdb_diff_cmd_sql_bldr_tst.java +++ b/140_dbs/src/gplx/dbs/diffs/cmds/Gfdb_diff_cmd_sql_bldr_tst.java @@ -15,7 +15,7 @@ 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.dbs.diffs.merges; import gplx.*; import gplx.dbs.*; import gplx.dbs.diffs.*; +package gplx.dbs.diffs.cmds; import gplx.*; import gplx.dbs.*; import gplx.dbs.diffs.*; import org.junit.*; import gplx.dbs.*; import gplx.dbs.engines.mems.*; public class Gfdb_diff_cmd_sql_bldr_tst { diff --git a/140_dbs/src/gplx/dbs/engines/Db_engine.java b/140_dbs/src/gplx/dbs/engines/Db_engine.java index e4cd0ce6c..4d3151daf 100644 --- a/140_dbs/src/gplx/dbs/engines/Db_engine.java +++ b/140_dbs/src/gplx/dbs/engines/Db_engine.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.dbs.engines; import gplx.*; import gplx.dbs.*; -import gplx.core.stores.*; +import gplx.core.stores.*; import gplx.dbs.metas.*; public interface Db_engine { String Tid(); Db_conn_info Conn_info(); @@ -33,12 +33,13 @@ public interface Db_engine { void Conn_open(); void Conn_term(); Object Exec_as_obj(Db_qry qry); - void Ddl_create_tbl(Db_meta_tbl meta); - void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... ary); - void Ddl_append_fld(String tbl, Db_meta_fld fld); + void Ddl_create_tbl(Dbmeta_tbl_itm meta); + void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Dbmeta_idx_itm... ary); + void Ddl_append_fld(String tbl, Dbmeta_fld_itm fld); void Ddl_delete_tbl(String tbl); void Env_db_attach(String alias, Io_url db_url); void Env_db_detach(String alias); boolean Meta_tbl_exists(String tbl); boolean Meta_fld_exists(String tbl, String fld); + Dbmeta_tbl_mgr Meta_tbl_load_all(); } diff --git a/140_dbs/src/gplx/dbs/engines/Db_engine_sql_base.java b/140_dbs/src/gplx/dbs/engines/Db_engine_sql_base.java index 2ec9e145c..1313adc4e 100644 --- a/140_dbs/src/gplx/dbs/engines/Db_engine_sql_base.java +++ b/140_dbs/src/gplx/dbs/engines/Db_engine_sql_base.java @@ -18,16 +18,16 @@ along with this program. If not, see . package gplx.dbs.engines; import gplx.*; import gplx.dbs.*; import java.sql.*; import gplx.core.stores.*; -import gplx.dbs.engines.*; import gplx.dbs.qrys.*; import gplx.dbs.sqls.*; +import gplx.dbs.engines.*; import gplx.dbs.qrys.*; import gplx.dbs.sqls.*; import gplx.dbs.metas.*; public abstract class Db_engine_sql_base implements Db_engine { @gplx.Internal protected void Ctor(Db_conn_info conn_info) {this.conn_info = conn_info;} - public abstract String Tid(); - public Db_conn_info Conn_info() {return conn_info;} protected Db_conn_info conn_info; - public abstract Db_engine New_clone(Db_conn_info conn_info); - public Db_rdr New_rdr__rls_manual(Object rdr_obj, String sql) {return New_rdr(null, rdr_obj, sql);} - public Db_rdr New_rdr__rls_auto(Db_stmt stmt, Object rdr_obj, String sql) {return New_rdr(stmt, rdr_obj, sql);} - @gplx.Virtual public Db_rdr New_rdr_clone() {return new Db_rdr__basic();} - public Db_stmt New_stmt_prep(Db_qry qry) {return new Db_stmt_cmd(this, qry);} + public abstract String Tid(); + public Db_conn_info Conn_info() {return conn_info;} protected Db_conn_info conn_info; + public abstract Db_engine New_clone(Db_conn_info conn_info); + public Db_rdr New_rdr__rls_manual(Object rdr_obj, String sql) {return New_rdr(null, rdr_obj, sql);} + public Db_rdr New_rdr__rls_auto(Db_stmt stmt, Object rdr_obj, String sql) {return New_rdr(stmt, rdr_obj, sql);} + @gplx.Virtual public Db_rdr New_rdr_clone() {return new Db_rdr__basic();} + public Db_stmt New_stmt_prep(Db_qry qry) {return new Db_stmt_cmd(this, qry);} @gplx.Virtual public void Txn_bgn(String name) {Exec_as_obj(Db_qry_sql.xtn_("BEGIN TRANSACTION;"));} @gplx.Virtual public String Txn_end() {Exec_as_obj(Db_qry_sql.xtn_("COMMIT TRANSACTION;")); return "";} @gplx.Virtual public void Txn_cxl() {Exec_as_obj(Db_qry_sql.xtn_("ROLLBACK TRANSACTION;"));} @@ -56,16 +56,16 @@ public abstract class Db_engine_sql_base implements Db_engine { } catch (Exception e) {throw Err_.new_exc(e, "db", "db.engine:rdr failed", "url", conn_info.Xto_api(), "sql", sql);} } - public void Ddl_create_tbl(Db_meta_tbl tbl) {Exec_as_int(tbl.To_sql_create());} - public void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... ary) { + public void Ddl_create_tbl(Dbmeta_tbl_itm tbl) {Exec_as_int(tbl.To_sql_create());} + public void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Dbmeta_idx_itm... ary) { int len = ary.length; for (int i = 0; i < len; ++i) { - Db_meta_idx idx = ary[i]; + Dbmeta_idx_itm idx = ary[i]; usr_dlg.Plog_many("", "", "creating database index (please wait); db=~{0} idx=~{1}", conn_info.Database(), idx.Name()); Exec_as_int(idx.To_sql_create()); } } - public void Ddl_append_fld(String tbl, Db_meta_fld fld) { + public void Ddl_append_fld(String tbl, Dbmeta_fld_itm fld) { Gfo_usr_dlg_.Instance.Plog_many("", "", "adding column to table: db=~{0} tbl=~{1} fld=~{2}", conn_info.Database(), tbl, fld.Name()); try { Exec_as_int(Db_sqlbldr__sqlite.Instance.Bld_alter_tbl_add(tbl, fld)); @@ -75,12 +75,13 @@ public abstract class Db_engine_sql_base implements Db_engine { Gfo_usr_dlg_.Instance.Warn_many("", "", "column not added to table: db=~{0} tbl=~{1} fld=~{2} err=~{3}", conn_info.Database(), tbl, fld.Name(), Err_.Message_gplx_full(e)); } } - public void Ddl_delete_tbl(String tbl) {Exec_as_int(Db_sqlbldr__sqlite.Instance.Bld_drop_tbl(tbl));} - @gplx.Virtual public void Env_db_attach(String alias, Io_url db_url) {} - @gplx.Virtual public void Env_db_detach(String alias) {} + public void Ddl_delete_tbl(String tbl) {Exec_as_int(Db_sqlbldr__sqlite.Instance.Bld_drop_tbl(tbl));} + @gplx.Virtual public void Env_db_attach(String alias, Io_url db_url) {} + @gplx.Virtual public void Env_db_detach(String alias) {} @gplx.Virtual public boolean Meta_tbl_exists(String tbl) {return false;} @gplx.Virtual public boolean Meta_fld_exists(String tbl, String fld) {return false;} - @gplx.Virtual public DataRdr New_rdr(ResultSet rdr, String sql) {return gplx.core.stores.Db_data_rdr_.new_(rdr, sql);} + public abstract Dbmeta_tbl_mgr Meta_tbl_load_all(); + @gplx.Virtual public DataRdr New_rdr(ResultSet rdr, String sql) {return gplx.core.stores.Db_data_rdr_.new_(rdr, sql);} @gplx.Virtual public Sql_qry_wtr SqlWtr() {return Sql_qry_wtr_.new_ansi();} private Db_rdr New_rdr(Db_stmt stmt, Object rdr, String sql) { Db_rdr__basic rv = (Db_rdr__basic)New_rdr_clone(); diff --git a/140_dbs/src/gplx/dbs/engines/mems/Db_engine__mem.java b/140_dbs/src/gplx/dbs/engines/mems/Db_engine__mem.java index d00a57096..974aacf20 100644 --- a/140_dbs/src/gplx/dbs/engines/mems/Db_engine__mem.java +++ b/140_dbs/src/gplx/dbs/engines/mems/Db_engine__mem.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.dbs.engines.mems; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; -import gplx.core.stores.*; +import gplx.core.stores.*; import gplx.dbs.metas.*; public class Db_engine__mem implements Db_engine { private final Hash_adp tbl_hash = Hash_adp_.new_(); Db_engine__mem(Db_conn_info conn_info) {this.conn_info = conn_info;} @@ -38,20 +38,21 @@ public class Db_engine__mem implements Db_engine { public Db_rdr New_rdr__rls_auto(Db_stmt stmt, Object rdr_obj, String sql) {throw Err_.new_unimplemented();} public DataRdr New_rdr(java.sql.ResultSet rdr, String sql) {throw Err_.new_unimplemented();} public Object New_stmt_prep_as_obj(String sql) {throw Err_.new_unimplemented();} - public void Ddl_create_tbl(Db_meta_tbl meta) { + public void Ddl_create_tbl(Dbmeta_tbl_itm meta) { Mem_tbl mem_tbl = new Mem_tbl(meta); tbl_hash.Add_if_dupe_use_nth(meta.Name(), mem_tbl); + meta_tbl_mgr.Add(meta); } - public void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... ary) {} // TODO: implement unique index - public void Ddl_append_fld(String tbl, Db_meta_fld fld) {} + public void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Dbmeta_idx_itm... ary) {} // TODO: implement unique index + public void Ddl_append_fld(String tbl, Dbmeta_fld_itm fld) {} public void Ddl_delete_tbl(String tbl) {} public void Env_db_attach(String alias, Io_url db_url) {} public void Env_db_detach(String alias) {} public boolean Meta_tbl_exists(String tbl) {return tbl_hash.Has(tbl);} public boolean Meta_fld_exists(String tbl, String fld) { Mem_tbl mem_tbl = (Mem_tbl)tbl_hash.Get_by(tbl); if (mem_tbl == null) return false; - return mem_tbl.Meta().Flds_has(fld); + return mem_tbl.Meta().Flds().Has(fld); } -// public boolean Meta_fld_exists(String name) {return tbl_hash.Has(name);} + public Dbmeta_tbl_mgr Meta_tbl_load_all() {return meta_tbl_mgr;} private final Dbmeta_tbl_mgr meta_tbl_mgr = new Dbmeta_tbl_mgr(); public static final Db_engine__mem Instance = new Db_engine__mem(); Db_engine__mem() {} } diff --git a/140_dbs/src/gplx/dbs/engines/mems/Db_stmt__mem.java b/140_dbs/src/gplx/dbs/engines/mems/Db_stmt__mem.java index a077ce4a3..4a370e8b3 100644 --- a/140_dbs/src/gplx/dbs/engines/mems/Db_stmt__mem.java +++ b/140_dbs/src/gplx/dbs/engines/mems/Db_stmt__mem.java @@ -128,7 +128,7 @@ public class Db_stmt__mem implements Db_stmt { } public Object Exec_select_val() {throw Err_.new_unimplemented();} private void Add(String k, boolean where, Object v) { - if (k == Db_meta_fld.Key_null) return; // key is explicitly null; ignore; allows schema_2+ type definitions + if (k == Dbmeta_fld_itm.Key_null) return; // key is explicitly null; ignore; allows schema_2+ type definitions val_list.Add_if_dupe_use_1st(k, v); // NOTE: only add if new; WHERE with IN will call Add many times; fld_ttl IN ('A.png', 'B.png'); if (where) { List_adp list = (List_adp)crt_hash.Get_by(k); diff --git a/140_dbs/src/gplx/dbs/engines/mems/Mem_tbl.java b/140_dbs/src/gplx/dbs/engines/mems/Mem_tbl.java index 283b0d9b6..4a25b6072 100644 --- a/140_dbs/src/gplx/dbs/engines/mems/Mem_tbl.java +++ b/140_dbs/src/gplx/dbs/engines/mems/Mem_tbl.java @@ -17,17 +17,18 @@ along with this program. If not, see . */ package gplx.dbs.engines.mems; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; import gplx.core.primitives.*; import gplx.core.criterias.*; import gplx.dbs.qrys.*; +import gplx.dbs.metas.*; public class Mem_tbl { private final List_adp rows = List_adp_.new_(); private final List_adp where_rows = List_adp_.new_(); private final Hash_adp autonum_hash = Hash_adp_.new_(); - public Mem_tbl(Db_meta_tbl meta) {this.meta = meta;} - public Db_meta_tbl Meta() {return meta;} private final Db_meta_tbl meta; + public Mem_tbl(Dbmeta_tbl_itm meta) {this.meta = meta;} + public Dbmeta_tbl_itm Meta() {return meta;} private final Dbmeta_tbl_itm meta; public int Insert(Db_stmt__mem stmt) { Mem_row itm = new Mem_row(); - Db_meta_fld[] flds = meta.Flds(); - int len = flds.length; + Dbmeta_fld_mgr flds = meta.Flds(); + int len = flds.Len(); for (int i = 0; i < len; ++i) { - Db_meta_fld fld = flds[i]; + Dbmeta_fld_itm fld = flds.Get_at(i); String fld_name = fld.Name(); Object val = fld.Autonum() ? Autonum_calc(fld_name) : stmt.Args_get_by(fld_name); itm.Set_by(fld_name, val); diff --git a/140_dbs/src/gplx/dbs/engines/mysql/Mysql_engine.java b/140_dbs/src/gplx/dbs/engines/mysql/Mysql_engine.java index d299d4bb4..8aecfce92 100644 --- a/140_dbs/src/gplx/dbs/engines/mysql/Mysql_engine.java +++ b/140_dbs/src/gplx/dbs/engines/mysql/Mysql_engine.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.dbs.engines.mysql; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; -import gplx.core.stores.*; import gplx.dbs.engines.*; import gplx.dbs.sqls.*; +import gplx.core.stores.*; import gplx.dbs.engines.*; import gplx.dbs.sqls.*; import gplx.dbs.metas.*; import java.sql.*; public class Mysql_engine extends Db_engine_sql_base { @Override public String Tid() {return Mysql_conn_info.Tid_const;} @@ -27,6 +27,7 @@ public class Mysql_engine extends Db_engine_sql_base { return rv; } @Override public DataRdr New_rdr(ResultSet rdr, String commandText) {return Mysql_rdr.new_(rdr, commandText);} + @Override public Dbmeta_tbl_mgr Meta_tbl_load_all() {throw Err_.new_unimplemented();} @gplx.Internal @Override protected Connection Conn_new() { Mysql_conn_info conn_info_as_mysql = (Mysql_conn_info)conn_info; return Conn_make_by_url("jdbc:mysql://localhost/" + conn_info_as_mysql.Database() + "?characterEncoding=UTF8", conn_info_as_mysql.Uid(), conn_info_as_mysql.Pwd()); diff --git a/140_dbs/src/gplx/dbs/engines/nulls/Noop_engine.java b/140_dbs/src/gplx/dbs/engines/nulls/Noop_engine.java index ecd2fe93b..d88ca085b 100644 --- a/140_dbs/src/gplx/dbs/engines/nulls/Noop_engine.java +++ b/140_dbs/src/gplx/dbs/engines/nulls/Noop_engine.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.dbs.engines.nulls; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; - import gplx.core.stores.*; +import gplx.core.stores.*; import gplx.dbs.metas.*; public class Noop_engine implements Db_engine { public String Tid() {return Noop_conn_info.Tid_const;} public Db_conn_info Conn_info() {return Db_conn_info_.Null;} @@ -33,13 +33,14 @@ public class Noop_engine implements Db_engine { public void Txn_cxl() {} public void Txn_sav() {} public Object Exec_as_obj(Db_qry cmd) {return cmd.Exec_is_rdr() ? (Object)DataRdr_.Null : -1;} - public void Ddl_create_tbl(Db_meta_tbl meta) {} - public void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... ary) {} - public void Ddl_append_fld(String tbl, Db_meta_fld fld) {} + public void Ddl_create_tbl(Dbmeta_tbl_itm meta) {} + public void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Dbmeta_idx_itm... ary) {} + public void Ddl_append_fld(String tbl, Dbmeta_fld_itm fld) {} public void Ddl_delete_tbl(String tbl) {} public void Env_db_attach(String alias, Io_url db_url) {} public void Env_db_detach(String alias) {} public boolean Meta_tbl_exists(String tbl) {return false;} public boolean Meta_fld_exists(String tbl, String fld) {return false;} + public Dbmeta_tbl_mgr Meta_tbl_load_all() {return meta_tbl_mgr;} private final Dbmeta_tbl_mgr meta_tbl_mgr = new Dbmeta_tbl_mgr(); public static final Noop_engine Instance = new Noop_engine(); Noop_engine() {} } diff --git a/140_dbs/src/gplx/dbs/engines/postgres/Postgres_engine.java b/140_dbs/src/gplx/dbs/engines/postgres/Postgres_engine.java index e47e7a67f..8e706990a 100644 --- a/140_dbs/src/gplx/dbs/engines/postgres/Postgres_engine.java +++ b/140_dbs/src/gplx/dbs/engines/postgres/Postgres_engine.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.dbs.engines.postgres; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; -import gplx.core.stores.*; import gplx.dbs.engines.*; import gplx.dbs.sqls.*; +import gplx.core.stores.*; import gplx.dbs.engines.*; import gplx.dbs.sqls.*; import gplx.dbs.metas.*; import java.sql.*; public class Postgres_engine extends Db_engine_sql_base { @Override public String Tid() {return Postgres_conn_info.Tid_const;} @@ -27,6 +27,7 @@ public class Postgres_engine extends Db_engine_sql_base { return rv; } @Override public DataRdr New_rdr(ResultSet rdr, String commandText) {return Db_data_rdr_.new_(rdr, commandText);} + @Override public Dbmeta_tbl_mgr Meta_tbl_load_all() {throw Err_.new_unimplemented();} @gplx.Internal @Override protected Connection Conn_new() { Postgres_conn_info conn_info_as_postgres = (Postgres_conn_info)conn_info; return Conn_make_by_url("jdbc:" + conn_info_as_postgres.Tid() + "://localhost/" + conn_info_as_postgres.Database(), conn_info_as_postgres.Uid(), conn_info_as_postgres.Pwd()); diff --git a/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_engine.java b/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_engine.java index 5cc7b009f..e4cf8ebb0 100644 --- a/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_engine.java +++ b/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_engine.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.dbs.engines.sqlite; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; import java.sql.*; -import gplx.core.stores.*; import gplx.dbs.engines.*; import gplx.dbs.engines.sqlite.*; +import gplx.core.stores.*; import gplx.dbs.engines.*; import gplx.dbs.engines.sqlite.*; import gplx.dbs.metas.*; import gplx.dbs.qrys.*; public class Sqlite_engine extends Db_engine_sql_base { private final Sqlite_txn_mgr txn_mgr; private final Sqlite_schema_mgr schema_mgr; @@ -41,7 +41,9 @@ public class Sqlite_engine extends Db_engine_sql_base { @Override public void Txn_sav() {txn_mgr.Txn_sav();} @Override public boolean Meta_tbl_exists(String tbl) {return schema_mgr.Tbl_exists(tbl);} @Override public boolean Meta_fld_exists(String tbl, String fld) {return schema_mgr.Fld_exists(tbl, fld);} - static boolean loaded = false; + @Override public Dbmeta_tbl_mgr Meta_tbl_load_all() {return schema_mgr.Tbl_load_all();} + private static boolean loaded = false; + protected void Meta_tbl_gather_hook() {throw Err_.new_unimplemented();} @gplx.Internal @Override protected Connection Conn_new() { if (!loaded) { try { diff --git a/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_engine_.java b/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_engine_.java index c919a663f..04f909af7 100644 --- a/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_engine_.java +++ b/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_engine_.java @@ -54,10 +54,10 @@ public class Sqlite_engine_ { Db_qry qry = Db_qry_sql.ddl_("PRAGMA page_size = " + Int_.To_str(val) + ";"); p.Exec_qry(qry); } - public static void Idx_create(Gfo_usr_dlg usr_dlg, Db_conn conn, String tbl, Db_meta_idx[] idx_ary) { + public static void Idx_create(Gfo_usr_dlg usr_dlg, Db_conn conn, String tbl, Dbmeta_idx_itm[] idx_ary) { int len = idx_ary.length; for (int i = 0; i < len; ++i) { - Db_meta_idx idx = idx_ary[i]; + Dbmeta_idx_itm idx = idx_ary[i]; String idx_sql = idx.To_sql_create(); usr_dlg.Plog_many("", "", "creating index: ~{0} ~{1}", tbl, idx_sql); conn.Exec_qry(Db_qry_sql.ddl_(idx.To_sql_create())); diff --git a/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_schema_mgr.java b/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_schema_mgr.java index 4525f9b4e..b8109516d 100644 --- a/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_schema_mgr.java +++ b/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_schema_mgr.java @@ -20,22 +20,28 @@ import gplx.dbs.qrys.*; import gplx.dbs.metas.*; import gplx.dbs.metas.parsers.*; public class Sqlite_schema_mgr { private final Db_engine engine; private boolean init = true; + private final Dbmeta_idx_mgr idx_mgr = new Dbmeta_idx_mgr(); + private final Dbmeta_tbl_mgr tbl_mgr = new Dbmeta_tbl_mgr(); public Sqlite_schema_mgr(Db_engine engine) {this.engine = engine;} - public Meta_tbl_mgr Tbl_mgr() {return tbl_mgr;} private final Meta_tbl_mgr tbl_mgr = new Meta_tbl_mgr(); - public Meta_idx_mgr Idx_mgr() {return idx_mgr;} private final Meta_idx_mgr idx_mgr = new Meta_idx_mgr(); public boolean Tbl_exists(String name) { if (init) Init(engine); return tbl_mgr.Has(name); } public boolean Fld_exists(String tbl, String fld) { if (init) Init(engine); - Meta_tbl_itm tbl_itm = tbl_mgr.Get_by(tbl); - return (tbl_itm == null) ? false : tbl_itm.Flds().Has(fld); + Dbmeta_tbl_itm tbl_itm = tbl_mgr.Get_by(tbl); + return tbl_itm == null ? false : tbl_itm.Flds().Has(fld); + } + public Dbmeta_tbl_mgr Tbl_load_all() { + Init(engine); + return tbl_mgr; } private void Init(Db_engine engine) { init = false; Gfo_usr_dlg_.Instance.Log_many("", "", "db.schema.load.bgn: conn=~{0}", engine.Conn_info().Xto_api()); - Meta_parser__tbl tbl_parser = new Meta_parser__tbl(); + tbl_mgr.Clear(); idx_mgr.Clear(); + Dbmeta_parser__tbl tbl_parser = new Dbmeta_parser__tbl(); + Dbmeta_parser__idx idx_parser = new Dbmeta_parser__idx(); Db_qry__select_in_tbl qry = Db_qry__select_in_tbl.new_("sqlite_master", String_.Ary_empty, String_.Ary("type", "name", "sql"), Db_qry__select_in_tbl.Order_by_null); Db_rdr rdr = engine.New_stmt_prep(qry).Exec_select__rls_auto(); try { @@ -43,17 +49,14 @@ public class Sqlite_schema_mgr { String type_str = rdr.Read_str("type"); String name = rdr.Read_str("name"); String sql = rdr.Read_str("sql"); - int type_int = Meta_itm_tid.Xto_int(type_str); + int type_int = Dbmeta_itm_tid.Xto_int(type_str); switch (type_int) { - case Meta_itm_tid.Tid_table: + case Dbmeta_itm_tid.Tid_table: if (String_.Eq(name, "sqlite_sequence")) continue; // ignore b/c of non-orthodox syntax; EX: "CREATE TABLE sqlite_sequence(name, seq)"; - // Meta_tbl_itm tbl_itm = new Meta_tbl_itm(tbl_name, tbl_sql); - Meta_tbl_itm tbl_itm = tbl_parser.Parse(Bry_.new_u8(sql)); - tbl_mgr.Add(tbl_itm); + tbl_mgr.Add(tbl_parser.Parse(Bry_.new_u8(sql))); break; - case Meta_itm_tid.Tid_index: - Meta_idx_itm idx_itm = new Meta_idx_itm(name, sql); - idx_mgr.Add(idx_itm); + case Dbmeta_itm_tid.Tid_index: + idx_mgr.Add(idx_parser.Parse(Bry_.new_u8(sql))); break; default: Gfo_usr_dlg_.Instance.Log_many("", "", "db.schema.unknown type: conn=~{0} type=~{1} name=~{2} sql=~{3}", engine.Conn_info().Xto_api(), type_str, name, sql); diff --git a/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_tid.java b/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_tid.java new file mode 100644 index 000000000..c119e54a0 --- /dev/null +++ b/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_tid.java @@ -0,0 +1,21 @@ +/* +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.dbs.engines.sqlite; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; +public class Sqlite_tid { + public static final int Tid_int = 1, Tid_text = 2, Tid_none = 3, Tid_real = 4, Tid_numeric = 5; +} diff --git a/140_dbs/src/gplx/dbs/engines/tdbs/TdbEngine.java b/140_dbs/src/gplx/dbs/engines/tdbs/TdbEngine.java index 541ce91e0..bcde62667 100644 --- a/140_dbs/src/gplx/dbs/engines/tdbs/TdbEngine.java +++ b/140_dbs/src/gplx/dbs/engines/tdbs/TdbEngine.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.dbs.engines.tdbs; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; -import gplx.core.stores.*; +import gplx.core.stores.*; import gplx.dbs.metas.*; import gplx.dbs.qrys.*; import gplx.dbs.sqls.*; public class TdbEngine implements Db_engine { public String Tid() {return Tdb_conn_info.Tid_const;} @@ -58,14 +58,15 @@ public class TdbEngine implements Db_engine { public void FlushTbl(TdbTable tbl) { saveMgr.SaveFile(db, tbl.File()); } - public void Ddl_create_tbl(Db_meta_tbl meta) {throw Err_.new_unimplemented();} - public void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... ary) {throw Err_.new_unimplemented();} - public void Ddl_append_fld(String tbl, Db_meta_fld fld) {throw Err_.new_unimplemented();} - public void Ddl_delete_tbl(String tbl) {} - public void Env_db_attach(String alias, Io_url db_url) {} - public void Env_db_detach(String alias) {} - public boolean Meta_tbl_exists(String name) {return false;} - public boolean Meta_fld_exists(String tbl, String fld) {return false;} + public void Ddl_create_tbl(Dbmeta_tbl_itm meta) {throw Err_.new_unimplemented();} + public void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Dbmeta_idx_itm... ary) {throw Err_.new_unimplemented();} + public void Ddl_append_fld(String tbl, Dbmeta_fld_itm fld) {throw Err_.new_unimplemented();} + public void Ddl_delete_tbl(String tbl) {} + public void Env_db_attach(String alias, Io_url db_url) {} + public void Env_db_detach(String alias) {} + public boolean Meta_tbl_exists(String name) {return false;} + public boolean Meta_fld_exists(String tbl, String fld) {return false;} + public Dbmeta_tbl_mgr Meta_tbl_load_all() {return meta_tbl_mgr;} private final Dbmeta_tbl_mgr meta_tbl_mgr = new Dbmeta_tbl_mgr(); Hash_adp wkrs = Hash_adp_.new_(); TdbDbLoadMgr loadMgr = TdbDbLoadMgr.new_(); TdbDbSaveMgr saveMgr = TdbDbSaveMgr.new_(); public static final TdbEngine Instance = new TdbEngine(); diff --git a/140_dbs/src/gplx/dbs/metas/Dbmeta_fld_mgr.java b/140_dbs/src/gplx/dbs/metas/Dbmeta_fld_mgr.java new file mode 100644 index 000000000..fddec7b4f --- /dev/null +++ b/140_dbs/src/gplx/dbs/metas/Dbmeta_fld_mgr.java @@ -0,0 +1,28 @@ +/* +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.dbs.metas; import gplx.*; import gplx.dbs.*; +public class Dbmeta_fld_mgr { + private final Ordered_hash hash = Ordered_hash_.New(); + public int Len() {return hash.Count();} + public void Clear() {hash.Clear();} + public void Add(Dbmeta_fld_itm itm) {hash.Add(itm.Name(), itm);} + public boolean Has(String name) {return hash.Has(name);} + public Dbmeta_fld_itm Get_at(int idx) {return (Dbmeta_fld_itm)hash.Get_at(idx);} + public Dbmeta_fld_itm Get_by(String name) {return (Dbmeta_fld_itm)hash.Get_by(name);} + public Dbmeta_fld_itm[] To_ary() {return hash.Count() == 0 ? Dbmeta_fld_itm.Ary_empty : (Dbmeta_fld_itm[])hash.To_ary(Dbmeta_fld_itm.class);} +} diff --git a/140_dbs/src/gplx/dbs/metas/Dbmeta_fld_tid.java b/140_dbs/src/gplx/dbs/metas/Dbmeta_fld_tid.java new file mode 100644 index 000000000..86796d484 --- /dev/null +++ b/140_dbs/src/gplx/dbs/metas/Dbmeta_fld_tid.java @@ -0,0 +1,70 @@ +/* +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.dbs.metas; import gplx.*; import gplx.dbs.*; +import gplx.dbs.engines.sqlite.*; +public class Dbmeta_fld_tid { + public Dbmeta_fld_tid(int tid_ansi, int tid_sqlite, byte[] name, int len_1, int len_2) { + this.tid_ansi = tid_ansi; this.tid_sqlite = tid_sqlite; this.name = name; this.len_1 = len_1; this.len_2 = len_2; + } + public int Tid_ansi() {return tid_ansi;} private final int tid_ansi; + public int Tid_sqlite() {return tid_sqlite;} private final int tid_sqlite; + public byte[] Name() {return name;} private final byte[] name; + public int Len_1() {return len_1;} private final int len_1; + public int Len_2() {return len_2;} private final int len_2; + public boolean Eq(Dbmeta_fld_tid comp) { + return tid_ansi == comp.tid_ansi + && tid_sqlite == comp.tid_sqlite + && Bry_.Eq(name, comp.name) + && len_1 == comp.len_1 + && len_2 == comp.len_2; + } + + public static final int Tid__bool = 0, Tid__byte = 1, Tid__short = 2, Tid__int = 3, Tid__long = 4, Tid__float = 5, Tid__double = 6, Tid__str = 7, Tid__text = 8, Tid__bry = 9, Tid__decimal = 10, Tid__date = 11; + public static final Dbmeta_fld_tid + Itm__byte = new Dbmeta_fld_tid(Dbmeta_fld_tid.Tid__byte , Sqlite_tid.Tid_int , Bry_.new_a7("tinyint") , -1, -1) + , Itm__short = new Dbmeta_fld_tid(Dbmeta_fld_tid.Tid__short , Sqlite_tid.Tid_int , Bry_.new_a7("smallint") , -1, -1) + , Itm__int = new Dbmeta_fld_tid(Dbmeta_fld_tid.Tid__int , Sqlite_tid.Tid_int , Bry_.new_a7("integer") , -1, -1) + , Itm__long = new Dbmeta_fld_tid(Dbmeta_fld_tid.Tid__long , Sqlite_tid.Tid_int , Bry_.new_a7("bigint") , -1, -1) + , Itm__text = new Dbmeta_fld_tid(Dbmeta_fld_tid.Tid__text , Sqlite_tid.Tid_text , Bry_.new_a7("text") , -1, -1) + , Itm__bry = new Dbmeta_fld_tid(Dbmeta_fld_tid.Tid__bry , Sqlite_tid.Tid_none , Bry_.new_a7("blob") , -1, -1) + , Itm__float = new Dbmeta_fld_tid(Dbmeta_fld_tid.Tid__float , Sqlite_tid.Tid_real , Bry_.new_a7("float") , -1, -1) + , Itm__double = new Dbmeta_fld_tid(Dbmeta_fld_tid.Tid__double , Sqlite_tid.Tid_real , Bry_.new_a7("double") , -1, -1) + , Itm__numeric = new Dbmeta_fld_tid(Dbmeta_fld_tid.Tid__decimal , Sqlite_tid.Tid_numeric , Bry_.new_a7("numeric") , -1, -1) + , Itm__bool = new Dbmeta_fld_tid(Dbmeta_fld_tid.Tid__bool , Sqlite_tid.Tid_numeric , Bry_.new_a7("bit") , -1, -1) // "bit" is not SQLITE + , Itm__date = new Dbmeta_fld_tid(Dbmeta_fld_tid.Tid__date , Sqlite_tid.Tid_numeric , Bry_.new_a7("date") , -1, -1) + ; + public static Dbmeta_fld_tid Itm__str (int len) {return new Dbmeta_fld_tid(Dbmeta_fld_tid.Tid__str , Sqlite_tid.Tid_text , Bry_.new_a7("varchar") , len, -1);} + public static Dbmeta_fld_tid Itm__decimal (int len_1, int len_2) {return new Dbmeta_fld_tid(Dbmeta_fld_tid.Tid__decimal , Sqlite_tid.Tid_numeric , Bry_.new_a7("decimal") , len_1, len_2);} + public static Dbmeta_fld_tid New(int tid, int len1) { + switch (tid) { + case Dbmeta_fld_tid.Tid__bool: return Itm__bool; + case Dbmeta_fld_tid.Tid__byte: return Itm__byte; + case Dbmeta_fld_tid.Tid__short: return Itm__short; + case Dbmeta_fld_tid.Tid__int: return Itm__int; + case Dbmeta_fld_tid.Tid__long: return Itm__long; + case Dbmeta_fld_tid.Tid__float: return Itm__float; + case Dbmeta_fld_tid.Tid__double: return Itm__double; + case Dbmeta_fld_tid.Tid__str: return Itm__str(len1); + case Dbmeta_fld_tid.Tid__text: return Itm__text; + case Dbmeta_fld_tid.Tid__bry: return Itm__bry; + case Dbmeta_fld_tid.Tid__date: return Itm__date; + case Dbmeta_fld_tid.Tid__decimal: // return Itm__decimal(len1); + default: throw Err_.new_unhandled(tid); + } + } +} diff --git a/140_dbs/src/gplx/dbs/metas/Dbmeta_idx_fld.java b/140_dbs/src/gplx/dbs/metas/Dbmeta_idx_fld.java new file mode 100644 index 000000000..d6db205f4 --- /dev/null +++ b/140_dbs/src/gplx/dbs/metas/Dbmeta_idx_fld.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.dbs.metas; import gplx.*; import gplx.dbs.*; +public class Dbmeta_idx_fld { + public Dbmeta_idx_fld(int order, String name, int sort_tid) {this.Name = name; this.Order = order; this.Sort_tid = sort_tid;} + public int Order; + public String Name; + public int Sort_tid; + public boolean Eq(Dbmeta_idx_fld comp) { + return String_.Eq(Name, comp.Name) + && Order == comp.Order + && Sort_tid == comp.Sort_tid; + } + + public static final Dbmeta_idx_fld[] Ary_empty = new Dbmeta_idx_fld[0]; + public static final int Sort_tid__none = 0, Sort_tid__asc = 1, Sort_tid__desc = 2; + public static boolean Ary_eq(Dbmeta_idx_fld[] lhs_ary, Dbmeta_idx_fld[] rhs_ary) { + int lhs_len = lhs_ary.length, rhs_len = rhs_ary.length; + if (lhs_len != rhs_len) return false; + for (int i = 0; i < lhs_len; ++i) + if (!lhs_ary[i].Eq(rhs_ary[i])) return false; + return true; + } +} diff --git a/140_dbs/src/gplx/dbs/metas/Dbmeta_idx_mgr.java b/140_dbs/src/gplx/dbs/metas/Dbmeta_idx_mgr.java new file mode 100644 index 000000000..9392a27e7 --- /dev/null +++ b/140_dbs/src/gplx/dbs/metas/Dbmeta_idx_mgr.java @@ -0,0 +1,28 @@ +/* +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.dbs.metas; import gplx.*; import gplx.dbs.*; +public class Dbmeta_idx_mgr { + private final Ordered_hash hash = Ordered_hash_.New(); + public int Len() {return hash.Count();} + public boolean Has(String name) {return hash.Has(name);} + public Dbmeta_idx_itm Get_at(int idx) {return (Dbmeta_idx_itm)hash.Get_at(idx);} + public Dbmeta_idx_itm Get_by(String name) {return (Dbmeta_idx_itm)hash.Get_by(name);} + public void Add(Dbmeta_idx_itm itm) {hash.Add(itm.Name(), itm);} + public void Clear() {hash.Clear();} + public Dbmeta_idx_itm[] To_ary() {return (Dbmeta_idx_itm[])hash.To_ary(Dbmeta_idx_itm.class);} +} diff --git a/140_dbs/src/gplx/dbs/metas/Meta_itm_tid.java b/140_dbs/src/gplx/dbs/metas/Dbmeta_itm_tid.java similarity index 96% rename from 140_dbs/src/gplx/dbs/metas/Meta_itm_tid.java rename to 140_dbs/src/gplx/dbs/metas/Dbmeta_itm_tid.java index bb290c3e9..4ed43a470 100644 --- a/140_dbs/src/gplx/dbs/metas/Meta_itm_tid.java +++ b/140_dbs/src/gplx/dbs/metas/Dbmeta_itm_tid.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.dbs.metas; import gplx.*; import gplx.dbs.*; -public class Meta_itm_tid { +public class Dbmeta_itm_tid { public static final int Tid_unknown = 0, Tid_table = 1, Tid_index = 2; public static final String Key_table = "table", Key_index = "index"; public static int Xto_int(String s) { diff --git a/140_dbs/src/gplx/dbs/metas/Meta_tbl_mgr.java b/140_dbs/src/gplx/dbs/metas/Dbmeta_tbl_mgr.java similarity index 65% rename from 140_dbs/src/gplx/dbs/metas/Meta_tbl_mgr.java rename to 140_dbs/src/gplx/dbs/metas/Dbmeta_tbl_mgr.java index b9ab47c06..afb8b9be4 100644 --- a/140_dbs/src/gplx/dbs/metas/Meta_tbl_mgr.java +++ b/140_dbs/src/gplx/dbs/metas/Dbmeta_tbl_mgr.java @@ -16,11 +16,12 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.dbs.metas; import gplx.*; import gplx.dbs.*; -public class Meta_tbl_mgr { +public class Dbmeta_tbl_mgr { private final Ordered_hash hash = Ordered_hash_.New(); - public int Len() {return hash.Count();} - public void Add(Meta_tbl_itm itm) {hash.Add(itm.Name(), itm);} - public boolean Has(String name) {return hash.Has(name);} - public Meta_tbl_itm Get_at(int i) {return (Meta_tbl_itm)hash.Get_at(i);} - public Meta_tbl_itm Get_by(String name) {return (Meta_tbl_itm)hash.Get_by(name);} + public int Len() {return hash.Count();} + public boolean Has(String name) {return hash.Has(name);} + public Dbmeta_tbl_itm Get_at(int i) {return (Dbmeta_tbl_itm)hash.Get_at(i);} + public Dbmeta_tbl_itm Get_by(String name) {return (Dbmeta_tbl_itm)hash.Get_by(name);} + public void Add(Dbmeta_tbl_itm itm) {hash.Add_if_dupe_use_nth(itm.Name(), itm);} + public void Clear() {hash.Clear();} } diff --git a/140_dbs/src/gplx/dbs/metas/Meta_fld_itm.java b/140_dbs/src/gplx/dbs/metas/Meta_fld_itm.java deleted file mode 100644 index e50b74101..000000000 --- a/140_dbs/src/gplx/dbs/metas/Meta_fld_itm.java +++ /dev/null @@ -1,31 +0,0 @@ -/* -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.dbs.metas; import gplx.*; import gplx.dbs.*; -public class Meta_fld_itm { - public Meta_fld_itm(String name, Meta_type_itm type) { - this.name = name; this.type = type; - } - public String Name() {return name;} private final String name; - public Meta_type_itm Type() {return type;} private final Meta_type_itm type; - public int Nullable_tid() {return nullable_tid;} public void Nullable_tid_(int v) {nullable_tid = v;} private int nullable_tid; - public boolean Autonumber() {return autonumber;} public void Autonumber_y_() {autonumber = true;} private boolean autonumber; - public boolean Primary_key() {return primary_key;} public void Primary_key_y_() {primary_key = true;} private boolean primary_key; - public Object Default_val() {return default_val;} private Object default_val; - public void Default_val_(Object v) {this.default_val = v;} - public static final int Nullable_unknown = 0, Nullable_null = 1, Nullable_not_null = 2; -} diff --git a/140_dbs/src/gplx/dbs/metas/Meta_type_itm.java b/140_dbs/src/gplx/dbs/metas/Meta_type_itm.java deleted file mode 100644 index a99753d76..000000000 --- a/140_dbs/src/gplx/dbs/metas/Meta_type_itm.java +++ /dev/null @@ -1,28 +0,0 @@ -/* -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.dbs.metas; import gplx.*; import gplx.dbs.*; -public class Meta_type_itm { - public Meta_type_itm(int tid_ansi, int tid_sqlite, byte[] name, int len_1, int len_2) { - this.tid_ansi = tid_ansi; this.tid_sqlite = tid_sqlite; this.name = name; this.len_1 = len_1; this.len_2 = len_2; - } - public int Tid_ansi() {return tid_ansi;} private final int tid_ansi; - public int Tid_sqlite() {return tid_sqlite;} private final int tid_sqlite; - public byte[] Name() {return name;} private final byte[] name; - public int Len_1() {return len_1;} private final int len_1; - public int Len_2() {return len_2;} private final int len_2; -} diff --git a/140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_fld_wkr__base.java b/140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_fld_wkr__base.java new file mode 100644 index 000000000..6f3d224b9 --- /dev/null +++ b/140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_fld_wkr__base.java @@ -0,0 +1,119 @@ +/* +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.dbs.metas.parsers; import gplx.*; import gplx.dbs.*; import gplx.dbs.metas.*; +import gplx.core.brys.*; import gplx.core.btries.*; +abstract class Dbmeta_fld_wkr__base { + private byte[] hook; + private final Btrie_slim_mgr words_trie = Btrie_slim_mgr.ci_a7(); + private int words_len; + @gplx.Virtual public int Tid() {return Tid_other;} + public void Ctor(byte[] hook, byte[]... words_ary) { + this.hook = hook; + this.words_len = words_ary.length; + for (byte i = 0; i < words_len; ++i) + words_trie.Add_bry_byte(words_ary[i], i); + } + public void Reg(Btrie_slim_mgr trie) { + trie.Add_obj(hook, this); + } + @gplx.Virtual public void Match(Bry_rdr rdr, Dbmeta_fld_itm fld) { + int words_len = words_trie.Count(); + for (int i = 0; i < words_len; ++i) { + rdr.Skip_ws(); + rdr.Chk(words_trie); + } + When_match(fld); + } + protected abstract void When_match(Dbmeta_fld_itm fld); + public static final int Tid_end_comma = 1, Tid_end_paren = 2, Tid_other = 3; +} +class Dbmeta_fld_wkr__end_comma extends Dbmeta_fld_wkr__base { + public Dbmeta_fld_wkr__end_comma() {this.Ctor(Hook);} + @Override public int Tid() {return Tid_end_comma;} + @Override protected void When_match(Dbmeta_fld_itm fld) {} + private static final byte[] Hook = Bry_.new_a7(","); + public static final Dbmeta_fld_wkr__end_comma Instance = new Dbmeta_fld_wkr__end_comma(); +} +class Dbmeta_fld_wkr__end_paren extends Dbmeta_fld_wkr__base { + public Dbmeta_fld_wkr__end_paren() {this.Ctor(Hook);} + @Override public int Tid() {return Tid_end_paren;} + @Override protected void When_match(Dbmeta_fld_itm fld) {} + private static final byte[] Hook = Bry_.new_a7(")"); + public static final Dbmeta_fld_wkr__end_paren Instance = new Dbmeta_fld_wkr__end_paren(); +} +class Dbmeta_fld_wkr__nullable_null extends Dbmeta_fld_wkr__base { + public Dbmeta_fld_wkr__nullable_null() {this.Ctor(Hook);} + @Override protected void When_match(Dbmeta_fld_itm fld) { + fld.Nullable_tid_(Dbmeta_fld_itm.Nullable_null); + } + private static final byte[] Hook = Bry_.new_a7("null"); + public static final Dbmeta_fld_wkr__nullable_null Instance = new Dbmeta_fld_wkr__nullable_null(); +} +class Dbmeta_fld_wkr__nullable_not extends Dbmeta_fld_wkr__base { + public Dbmeta_fld_wkr__nullable_not() {this.Ctor(Hook, Bry_null);} + @Override protected void When_match(Dbmeta_fld_itm fld) { + fld.Nullable_tid_(Dbmeta_fld_itm.Nullable_not_null); + } + private static final byte[] Hook = Bry_.new_a7("not"), Bry_null = Bry_.new_a7("null"); + public static final Dbmeta_fld_wkr__nullable_not Instance = new Dbmeta_fld_wkr__nullable_not(); +} +class Dbmeta_fld_wkr__primary_key extends Dbmeta_fld_wkr__base { + public Dbmeta_fld_wkr__primary_key() {this.Ctor(Hook, Bry_key);} + @Override protected void When_match(Dbmeta_fld_itm fld) { + fld.Primary_y_(); + } + private static final byte[] Hook = Bry_.new_a7("primary"), Bry_key = Bry_.new_a7("key"); + public static final Dbmeta_fld_wkr__primary_key Instance = new Dbmeta_fld_wkr__primary_key(); +} +class Dbmeta_fld_wkr__autonumber extends Dbmeta_fld_wkr__base { + public Dbmeta_fld_wkr__autonumber() {this.Ctor(Hook);} + @Override protected void When_match(Dbmeta_fld_itm fld) { + fld.Autonum_y_(); + } + private static final byte[] Hook = Bry_.new_a7("autoincrement"); + public static final Dbmeta_fld_wkr__autonumber Instance = new Dbmeta_fld_wkr__autonumber(); +} +class Dbmeta_fld_wkr__default extends Dbmeta_fld_wkr__base { + public Dbmeta_fld_wkr__default() {this.Ctor(Hook);} + @Override public void Match(Bry_rdr rdr, Dbmeta_fld_itm fld) { + Object default_val = null; + rdr.Skip_ws(); + byte[] src = rdr.Src(); + byte b = src[rdr.Pos()]; + switch (b) { + case Byte_ascii.Quote: + case Byte_ascii.Apos: + int bgn_pos = rdr.Pos() + 1; + int end_pos = Bry_find_.Find_fwd(src, b, bgn_pos); if (end_pos == Bry_find_.Not_found) rdr.Err_wkr().Fail("unclosed quote"); + default_val = Bry_.Mid(src, bgn_pos, end_pos); + rdr.Move_to(end_pos + 1); + break; + case Byte_ascii.Dash: + case Byte_ascii.Num_0: case Byte_ascii.Num_1: case Byte_ascii.Num_2: case Byte_ascii.Num_3: case Byte_ascii.Num_4: + case Byte_ascii.Num_5: case Byte_ascii.Num_6: case Byte_ascii.Num_7: case Byte_ascii.Num_8: case Byte_ascii.Num_9: + default_val = rdr.Read_int_to_non_num(); + break; + default: + rdr.Err_wkr().Fail("invalid field_default"); break; + } + fld.Default_(default_val); + } + @Override protected void When_match(Dbmeta_fld_itm fld) {} + private static final byte[] Hook = Bry_.new_a7("default"); + public static final Dbmeta_fld_wkr__default Instance = new Dbmeta_fld_wkr__default(); +} diff --git a/140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_parser__fld.java b/140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_parser__fld.java new file mode 100644 index 000000000..55e587117 --- /dev/null +++ b/140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_parser__fld.java @@ -0,0 +1,112 @@ +/* +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.dbs.metas.parsers; import gplx.*; import gplx.dbs.*; import gplx.dbs.metas.*; +import gplx.core.brys.*; import gplx.core.btries.*; +import gplx.dbs.engines.sqlite.*; +public class Dbmeta_parser__fld { + public Dbmeta_fld_itm Parse_fld(Sql_bry_rdr rdr) { // starts after "(" or ","; EX: "(fld1 int", ", fld2 int"; ends at ")" + byte[] name = rdr.Read_sql_identifier(); + Dbmeta_fld_tid type = this.Parse_type(rdr); + Dbmeta_fld_itm fld = new Dbmeta_fld_itm(String_.new_u8(name), type); + byte[] src = rdr.Src(); int src_len = rdr.Src_end(); + while (true) { + rdr.Skip_ws(); + if (rdr.Pos() == src_len) return fld; // eos + switch (src[rdr.Pos()]) { + case Byte_ascii.Comma: return fld; + case Byte_ascii.Paren_end: return fld; + } + Dbmeta_fld_wkr__base type_wkr = (Dbmeta_fld_wkr__base)rdr.Chk_trie_as_obj(fld_trie); + switch (type_wkr.Tid()) { + case Dbmeta_fld_wkr__base.Tid_end_comma: + case Dbmeta_fld_wkr__base.Tid_end_paren: return fld; + default: + rdr.Move_to(fld_trie.Match_pos()); + type_wkr.Match(rdr, fld); + break; + } + } + } + @gplx.Internal protected Dbmeta_fld_tid Parse_type(Bry_rdr rdr) { + rdr.Skip_ws(); + Dbmeta_parser__fld_itm type_itm = (Dbmeta_parser__fld_itm)rdr.Chk_trie_as_obj(type_trie); + rdr.Move_by(type_itm.Word().length); + int paren_itms_count = type_itm.Paren_itms_count(); + int len_1 = Int_.Min_value, len_2 = Int_.Min_value; + if (paren_itms_count > 0) { + rdr.Skip_ws().Chk(Byte_ascii.Paren_bgn); + len_1 = rdr.Skip_ws().Read_int_to_non_num(); if (len_1 == Int_.Min_value) rdr.Err_wkr().Fail("invalid fld len_1"); + if (paren_itms_count == 2) { + rdr.Skip_ws().Chk(Byte_ascii.Comma); + len_2 = rdr.Skip_ws().Read_int_to_non_num(); if (len_2 == Int_.Min_value) rdr.Err_wkr().Fail("invalid fld len_2"); + } + rdr.Skip_ws().Chk(Byte_ascii.Paren_end); + } + return new Dbmeta_fld_tid(type_itm.Tid_ansi(), type_itm.Tid_sqlite(), type_itm.Word(), len_1, len_2); + } + private static final Btrie_slim_mgr fld_trie = fld_trie_init + ( Dbmeta_fld_wkr__nullable_null.Instance + , Dbmeta_fld_wkr__nullable_not.Instance + , Dbmeta_fld_wkr__autonumber.Instance + , Dbmeta_fld_wkr__primary_key.Instance + , Dbmeta_fld_wkr__default.Instance + ); + private static Btrie_slim_mgr fld_trie_init(Dbmeta_fld_wkr__base... wkrs) { + Btrie_slim_mgr rv = Btrie_slim_mgr.ci_a7(); + for (Dbmeta_fld_wkr__base wkr : wkrs) + wkr.Reg(rv); + return rv; + } + private static final Btrie_slim_mgr type_trie = type_trie_init(); + private static Btrie_slim_mgr type_trie_init() { + Btrie_slim_mgr rv = Btrie_slim_mgr.ci_a7(); + Dbmeta_parser__fld_itm.reg_many(rv, Dbmeta_fld_tid.Tid__byte , Sqlite_tid.Tid_int , 0, "tinyint", "int2"); + Dbmeta_parser__fld_itm.reg_many(rv, Dbmeta_fld_tid.Tid__short , Sqlite_tid.Tid_int , 0, "smallint"); + Dbmeta_parser__fld_itm.reg_many(rv, Dbmeta_fld_tid.Tid__int , Sqlite_tid.Tid_int , 0, "int", "integer", "mediumint"); + Dbmeta_parser__fld_itm.reg_many(rv, Dbmeta_fld_tid.Tid__long , Sqlite_tid.Tid_int , 0, "bigint", "int8"); // "UNSIGNED BIG INT" + Dbmeta_parser__fld_itm.reg_many(rv, Dbmeta_fld_tid.Tid__str , Sqlite_tid.Tid_text , 1, "character", "varchar", "nchar"); // "varying character", "native character" + Dbmeta_parser__fld_itm.reg_many(rv, Dbmeta_fld_tid.Tid__text , Sqlite_tid.Tid_text , 0, "text", "clob"); + Dbmeta_parser__fld_itm.reg_many(rv, Dbmeta_fld_tid.Tid__bry , Sqlite_tid.Tid_none , 0, "blob"); + Dbmeta_parser__fld_itm.reg_many(rv, Dbmeta_fld_tid.Tid__float , Sqlite_tid.Tid_real , 0, "float"); + Dbmeta_parser__fld_itm.reg_many(rv, Dbmeta_fld_tid.Tid__double , Sqlite_tid.Tid_real , 0, "real", "double"); // "double precision" + Dbmeta_parser__fld_itm.reg_many(rv, Dbmeta_fld_tid.Tid__decimal , Sqlite_tid.Tid_numeric , 0, "numeric"); + Dbmeta_parser__fld_itm.reg_many(rv, Dbmeta_fld_tid.Tid__decimal , Sqlite_tid.Tid_numeric , 2, "decimal"); + Dbmeta_parser__fld_itm.reg_many(rv, Dbmeta_fld_tid.Tid__decimal , Sqlite_tid.Tid_numeric , 2, "decimal"); + Dbmeta_parser__fld_itm.reg_many(rv, Dbmeta_fld_tid.Tid__bool , Sqlite_tid.Tid_numeric , 0, "boolean", "bit"); // "bit" is not SQLITE + Dbmeta_parser__fld_itm.reg_many(rv, Dbmeta_fld_tid.Tid__date , Sqlite_tid.Tid_numeric , 0, "date", "datetime"); + return rv; + } +} +class Dbmeta_parser__fld_itm { + public Dbmeta_parser__fld_itm(int tid_ansi, int tid_sqlite, byte[] word, int paren_itms_count) { + this.tid_ansi = tid_ansi; this.tid_sqlite = tid_sqlite; + this.word = word; this.paren_itms_count = paren_itms_count; + } + public int Tid_ansi() {return tid_ansi;} private final int tid_ansi; + public int Tid_sqlite() {return tid_sqlite;} private final int tid_sqlite; + public byte[] Word() {return word;} private final byte[] word; + public int Paren_itms_count() {return paren_itms_count;} private final int paren_itms_count; + public static void reg_many(Btrie_slim_mgr trie, int tid_ansi, int tid_sqlite, int paren_itms_count, String... names_str) { + int len = names_str.length; + for (int i = 0; i < len; ++i) { + byte[] name_bry = Bry_.new_a7(names_str[i]); + Dbmeta_parser__fld_itm itm = new Dbmeta_parser__fld_itm(tid_ansi, tid_sqlite, name_bry, paren_itms_count); + trie.Add_obj(name_bry, itm); + } + } +} diff --git a/140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_parser__fld_tst.java b/140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_parser__fld_tst.java new file mode 100644 index 000000000..1027dffa2 --- /dev/null +++ b/140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_parser__fld_tst.java @@ -0,0 +1,71 @@ +/* +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.dbs.metas.parsers; import gplx.*; import gplx.dbs.*; import gplx.dbs.metas.*; +import org.junit.*; +public class Dbmeta_parser__fld_tst { + @Before public void init() {fxt.Clear();} private Dbmeta_parser__fld_fxt fxt = new Dbmeta_parser__fld_fxt(); + @Test public void Parse_type() { + fxt.Test_parse_type("int" , fxt.Make_type(Dbmeta_fld_tid.Tid__int)); + fxt.Test_parse_type("varchar(255)" , fxt.Make_type(Dbmeta_fld_tid.Tid__str, 255)); + fxt.Test_parse_type("decimal(12,10)" , fxt.Make_type(Dbmeta_fld_tid.Tid__decimal, 12, 10)); + fxt.Test_parse_type(" int" , fxt.Make_type(Dbmeta_fld_tid.Tid__int)); + fxt.Test_parse_type(" decimal ( 12 , 10 )" , fxt.Make_type(Dbmeta_fld_tid.Tid__decimal, 12, 10)); + } + @Test public void Parse_fld() { + fxt.Test_parse_fld("name_1 int" , fxt.Make_fld("name_1", Dbmeta_fld_tid.Tid__int, Dbmeta_fld_itm.Nullable_unknown)); + fxt.Test_parse_fld("name_1 int null" , fxt.Make_fld("name_1", Dbmeta_fld_tid.Tid__int, Dbmeta_fld_itm.Nullable_null)); + fxt.Test_parse_fld("name_1 int not null" , fxt.Make_fld("name_1", Dbmeta_fld_tid.Tid__int, Dbmeta_fld_itm.Nullable_not_null)); + fxt.Test_parse_fld("name_1 int not null autoincrement" , fxt.Make_fld("name_1", Dbmeta_fld_tid.Tid__int, Dbmeta_fld_itm.Nullable_not_null, Bool_.N, Bool_.Y)); + fxt.Test_parse_fld("name_1 int not null primary key" , fxt.Make_fld("name_1", Dbmeta_fld_tid.Tid__int, Dbmeta_fld_itm.Nullable_not_null, Bool_.Y, Bool_.N)); + fxt.Test_parse_fld("name_1 int not null default -1" , fxt.Make_fld("name_1", Dbmeta_fld_tid.Tid__int, Dbmeta_fld_itm.Nullable_not_null, Bool_.Y, Bool_.N, -1)); + fxt.Test_parse_fld("name_1 int not null default 'abc'" , fxt.Make_fld("name_1", Dbmeta_fld_tid.Tid__int, Dbmeta_fld_itm.Nullable_not_null, Bool_.Y, Bool_.N, "abc")); + } +} +class Dbmeta_parser__fld_fxt { + private final Dbmeta_parser__fld fld_parser = new Dbmeta_parser__fld(); + private final Sql_bry_rdr rdr = new Sql_bry_rdr(); + public void Clear() {} + public Dbmeta_fld_tid Make_type(int tid_ansi) {return new Dbmeta_fld_tid(tid_ansi, -1, null, Int_.Min_value, Int_.Min_value);} + public Dbmeta_fld_tid Make_type(int tid_ansi, int len_1) {return new Dbmeta_fld_tid(tid_ansi, -1, null, len_1, Int_.Min_value);} + public Dbmeta_fld_tid Make_type(int tid_ansi, int len_1, int len_2) {return new Dbmeta_fld_tid(tid_ansi, -1, null, len_1, len_2);} + public Dbmeta_fld_itm Make_fld(String name, int tid_ansi, int nullable) {return Make_fld(name, tid_ansi, nullable, false, false, null);} + public Dbmeta_fld_itm Make_fld(String name, int tid_ansi, int nullable, boolean autonumber, boolean primary_key) {return Make_fld(name, tid_ansi, nullable, false, false, null);} + public Dbmeta_fld_itm Make_fld(String name, int tid_ansi, int nullable, boolean autonumber, boolean primary_key, Object default_val) { + Dbmeta_fld_itm rv = new Dbmeta_fld_itm(name, Make_type(tid_ansi)); + rv.Nullable_tid_(nullable); + if (autonumber) rv.Autonum_y_(); + if (primary_key) rv.Primary_y_(); + rv.Default_(default_val); + return rv; + } + public void Test_parse_type(String src, Dbmeta_fld_tid expd_type) { + rdr.Init_by_src(Bry_.new_u8(src)); + Dbmeta_fld_tid actl_type = fld_parser.Parse_type(rdr); + Tfds.Eq(expd_type.Tid_ansi() , actl_type.Tid_ansi()); + Tfds.Eq(expd_type.Len_1() , actl_type.Len_1()); + Tfds.Eq(expd_type.Len_2() , actl_type.Len_2()); + } + public void Test_parse_fld(String src, Dbmeta_fld_itm expd_fld) { + rdr.Init_by_src(Bry_.new_u8(src)); + Dbmeta_fld_itm actl_fld = fld_parser.Parse_fld(rdr); + Tfds.Eq(expd_fld.Name() , actl_fld.Name()); + Tfds.Eq(expd_fld.Type().Tid_ansi() , actl_fld.Type().Tid_ansi()); + Tfds.Eq(expd_fld.Nullable_tid() , actl_fld.Nullable_tid()); + Tfds.Eq(Object_.Xto_str_strict_or_empty(expd_fld.Default()), Object_.Xto_str_strict_or_empty(actl_fld.Default())); + } +} diff --git a/140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_parser__idx.java b/140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_parser__idx.java new file mode 100644 index 000000000..cb7af43b3 --- /dev/null +++ b/140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_parser__idx.java @@ -0,0 +1,59 @@ +/* +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.dbs.metas.parsers; import gplx.*; import gplx.dbs.*; import gplx.dbs.metas.*; +import gplx.core.brys.*; import gplx.core.btries.*; +public class Dbmeta_parser__idx { + private final Sql_bry_rdr rdr = new Sql_bry_rdr(); + private final List_adp tmp_list = List_adp_.new_(); + public Dbmeta_idx_itm Parse(byte[] src) { + rdr.Init_by_page(Bry_.Empty, src, src.length); + rdr.Skip_ws().Chk_trie_val(trie, Tid__create); + boolean unique = false; + byte tid = rdr.Skip_ws().Chk_or(trie, Byte_.Max_value_127); + switch (tid) { + case Tid__index: break; + case Tid__unique: rdr.Skip_ws().Chk_trie_val(trie, Tid__index); unique = true; break; + default: throw Err_.new_("db", "index parse failed; 'CREATE' should be followed by 'INDEX' or 'UNIQUE'", "src", src); + } + byte[] idx_name = rdr.Read_sql_identifier(); + rdr.Skip_ws().Chk_trie_val(trie, Tid__on); + byte[] tbl_name = rdr.Read_sql_identifier(); + rdr.Skip_ws().Chk(Byte_ascii.Paren_bgn); + int order = -1; + while (true) { + byte[] fld_bry = rdr.Read_sql_identifier(); if (fld_bry == null) throw Err_.new_("db", "index parse failed; index field is not an identifier", "src", src); + // TODO: check for ASC / DESC + Dbmeta_idx_fld fld_itm = new Dbmeta_idx_fld(++order, String_.new_u8(fld_bry), Dbmeta_idx_fld.Sort_tid__none); + tmp_list.Add(fld_itm); + byte sym = rdr.Skip_ws().Read_byte(); + if (sym == Byte_ascii.Paren_end) break; + } + return new Dbmeta_idx_itm(unique, String_.new_u8(tbl_name), String_.new_u8(idx_name), (Dbmeta_idx_fld[])tmp_list.To_ary_and_clear(Dbmeta_idx_fld.class)); + } + private static final byte Tid__create = 0, Tid__unique = 1, Tid__index = 2, Tid__on = 3; + private static final byte[] + Bry__create = Bry_.new_a7("create") + , Bry__unique = Bry_.new_a7("unique") + , Bry__index = Bry_.new_a7("index") + , Bry__on = Bry_.new_a7("on"); + private static final Btrie_slim_mgr trie = Btrie_slim_mgr.ci_a7() + .Add_bry_byte(Bry__create , Tid__create) + .Add_bry_byte(Bry__unique , Tid__unique) + .Add_bry_byte(Bry__index , Tid__index) + .Add_bry_byte(Bry__on , Tid__on); +} diff --git a/140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_parser__idx_tst.java b/140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_parser__idx_tst.java new file mode 100644 index 000000000..14dd1b1fa --- /dev/null +++ b/140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_parser__idx_tst.java @@ -0,0 +1,37 @@ +/* +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.dbs.metas.parsers; import gplx.*; import gplx.dbs.*; import gplx.dbs.metas.*; +import org.junit.*; +public class Dbmeta_parser__idx_tst { + @Before public void init() {fxt.Clear();} private final Dbmeta_parser__idx_fxt fxt = new Dbmeta_parser__idx_fxt(); + @Test public void Unique() {fxt.Test_parse("CREATE UNIQUE INDEX idx_1 ON tbl_1 (fld_1, fld_2, fld_3)" , fxt.Make_idx(Bool_.Y, "idx_1", "tbl_1", "fld_1", "fld_2", "fld_3"));} + @Test public void Normal() {fxt.Test_parse("CREATE INDEX idx_1 ON tbl_1 (fld_1, fld_2, fld_3)" , fxt.Make_idx(Bool_.N, "idx_1", "tbl_1", "fld_1", "fld_2", "fld_3"));} + @Test public void Fld_1() {fxt.Test_parse("CREATE INDEX idx_1 ON tbl_1 (fld_1)" , fxt.Make_idx(Bool_.N, "idx_1", "tbl_1", "fld_1"));} +} +class Dbmeta_parser__idx_fxt { + private final Dbmeta_parser__idx parser = new Dbmeta_parser__idx(); + public void Clear() {} + public Dbmeta_idx_itm Make_idx(boolean unique, String idx_name, String tbl_name, String... fld_names) {return new Dbmeta_idx_itm(unique, tbl_name, idx_name, Dbmeta_idx_itm.To_fld_ary(fld_names));} + public void Test_parse(String src, Dbmeta_idx_itm expd) { + Dbmeta_idx_itm actl = parser.Parse(Bry_.new_u8(src)); + Tfds.Eq_bool(expd.Unique(), actl.Unique()); + Tfds.Eq_str(expd.Name(), actl.Name()); + Tfds.Eq_str(expd.Tbl(), actl.Tbl()); + Tfds.Eq_bool(Bool_.Y, Dbmeta_idx_fld.Ary_eq(expd.Flds, actl.Flds)); + } +} diff --git a/140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_parser__tbl.java b/140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_parser__tbl.java new file mode 100644 index 000000000..46b8bac68 --- /dev/null +++ b/140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_parser__tbl.java @@ -0,0 +1,51 @@ +/* +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.dbs.metas.parsers; import gplx.*; import gplx.dbs.*; import gplx.dbs.metas.*; +import gplx.core.brys.*; import gplx.core.btries.*; +public class Dbmeta_parser__tbl { + private final Sql_bry_rdr rdr = new Sql_bry_rdr(); + private final Dbmeta_parser__fld fld_parser = new Dbmeta_parser__fld(); + public Dbmeta_tbl_itm Parse(byte[] src) { + rdr.Init_by_page(Bry_.Empty, src, src.length); + rdr.Skip_ws().Chk_trie_val(trie, Tid__create); + rdr.Skip_ws().Chk_trie_val(trie, Tid__table); + byte[] tbl_name = rdr.Read_sql_identifier(); + rdr.Skip_ws().Chk(Byte_ascii.Paren_bgn); + Dbmeta_tbl_itm rv = Dbmeta_tbl_itm.New(String_.new_u8(tbl_name)); + boolean loop = true; + while (loop) { + Dbmeta_fld_itm fld = fld_parser.Parse_fld(rdr); if (fld == null) rdr.Err_wkr().Fail("unknown field", "src", src); + rv.Flds().Add(fld); + int pos = rdr.Pos(); + byte b = pos == rdr.Src_end() ? Byte_ascii.Null : src[pos]; + switch (b) { + case Byte_ascii.Comma: rdr.Move_by_one(); break; + case Byte_ascii.Paren_end: rdr.Move_by_one(); loop = false; break; + default: rdr.Err_wkr().Fail("premature end of flds"); break; + } + } + return rv; + } + private static final byte Tid__create = 0, Tid__table = 1; + private static final byte[] + Bry__create = Bry_.new_a7("create") + , Bry__table = Bry_.new_a7("table"); + private static final Btrie_slim_mgr trie = Btrie_slim_mgr.ci_a7() + .Add_bry_byte(Bry__create , Tid__create) + .Add_bry_byte(Bry__table , Tid__table); +} diff --git a/140_dbs/src/gplx/dbs/metas/parsers/Meta_parser__tbl_tst.java b/140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_parser__tbl_tst.java similarity index 69% rename from 140_dbs/src/gplx/dbs/metas/parsers/Meta_parser__tbl_tst.java rename to 140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_parser__tbl_tst.java index 864086c24..56d1af1ee 100644 --- a/140_dbs/src/gplx/dbs/metas/parsers/Meta_parser__tbl_tst.java +++ b/140_dbs/src/gplx/dbs/metas/parsers/Dbmeta_parser__tbl_tst.java @@ -16,9 +16,9 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.dbs.metas.parsers; import gplx.*; import gplx.dbs.*; import gplx.dbs.metas.*; -import org.junit.*; -public class Meta_parser__tbl_tst { - @Before public void init() {fxt.Clear();} private Meta_parser__tbl_fxt fxt = new Meta_parser__tbl_fxt(); +import org.junit.*; import gplx.dbs.engines.sqlite.*; +public class Dbmeta_parser__tbl_tst { + @Before public void init() {fxt.Clear();} private Dbmeta_parser__tbl_fxt fxt = new Dbmeta_parser__tbl_fxt(); @Test public void Test_parse() { fxt.Test_parse("CREATE TABLE tbl_1 (fld_1 int, fld_2 int)", fxt.Make_tbl("tbl_1", "fld_1", "fld_2")); } @@ -39,23 +39,22 @@ public class Meta_parser__tbl_tst { ), fxt.Make_tbl("page", "page_id", "page_namespace", "page_title", "page_is_redirect", "page_touched", "page_len", "page_random_int", "page_text_db_id", "page_html_db_id", "page_redirect_id")); } } -class Meta_parser__tbl_fxt { - private final Meta_parser__tbl tbl_parser = new Meta_parser__tbl(); +class Dbmeta_parser__tbl_fxt { + private final Dbmeta_parser__tbl tbl_parser = new Dbmeta_parser__tbl(); public void Clear() {} - public Meta_tbl_itm Make_tbl(String tbl_name, String... fld_names) { - Meta_tbl_itm rv = new Meta_tbl_itm(tbl_name, "NONE"); + public Dbmeta_tbl_itm Make_tbl(String tbl_name, String... fld_names) { int len = fld_names.length; - for (int i = 0; i < len; ++i) { - rv.Flds().Add(new Meta_fld_itm(fld_names[i], new Meta_type_itm(Db_meta_fld.Tid_int, Sqlite_tid.Tid_int, Bry_.new_a7("int"), Int_.Min_value, Int_.Min_value))); - } - return rv; + Dbmeta_fld_itm[] flds = new Dbmeta_fld_itm[len]; + for (int i = 0; i < len; ++i) + flds[i] = new Dbmeta_fld_itm(fld_names[i], new Dbmeta_fld_tid(Dbmeta_fld_tid.Tid__int, Sqlite_tid.Tid_int, Bry_.new_a7("int"), Int_.Min_value, Int_.Min_value)); + return Dbmeta_tbl_itm.New(tbl_name, flds); } - public void Test_parse(String src, Meta_tbl_itm expd_tbl) { - Meta_tbl_itm actl_tbl = tbl_parser.Parse(Bry_.new_u8(src)); + public void Test_parse(String src, Dbmeta_tbl_itm expd_tbl) { + Dbmeta_tbl_itm actl_tbl = tbl_parser.Parse(Bry_.new_u8(src)); Tfds.Eq(expd_tbl.Name(), actl_tbl.Name()); Tfds.Eq_ary_str(To_str_ary(expd_tbl.Flds()), To_str_ary(actl_tbl.Flds())); } - private static String[] To_str_ary(Meta_fld_mgr fld_mgr) { + private static String[] To_str_ary(Dbmeta_fld_mgr fld_mgr) { int len = fld_mgr.Len(); String[] rv = new String[len]; for (int i = 0; i < len; ++i) { diff --git a/140_dbs/src/gplx/dbs/metas/parsers/Meta_fld_wkr__base.java b/140_dbs/src/gplx/dbs/metas/parsers/Meta_fld_wkr__base.java deleted file mode 100644 index d5ab429cc..000000000 --- a/140_dbs/src/gplx/dbs/metas/parsers/Meta_fld_wkr__base.java +++ /dev/null @@ -1,117 +0,0 @@ -/* -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.dbs.metas.parsers; import gplx.*; import gplx.dbs.*; import gplx.dbs.metas.*; -import gplx.core.brys.*; import gplx.core.btries.*; -abstract class Meta_fld_wkr__base { - private byte[] hook; - private byte[][] words_ary; private int words_len; - @gplx.Virtual public int Tid() {return Tid_other;} - public void Ctor(byte[] hook, byte[]... words_ary) { - this.hook = hook; - this.words_ary = words_ary; - this.words_len = words_ary.length; - } - public void Reg(Btrie_slim_mgr trie) { - trie.Add_obj(hook, this); - } - @gplx.Virtual public void Match(Bry_rdr_old rdr, Meta_fld_itm fld) { - for (int i = 0; i < words_len; ++i) { - rdr.Skip_ws(); - byte[] word = words_ary[i]; - rdr.Chk_bry_or_fail(word); - } - When_match(fld); - } - protected abstract void When_match(Meta_fld_itm fld); - public static final int Tid_end_comma = 1, Tid_end_paren = 2, Tid_other = 3; -} -class Meta_fld_wkr__end_comma extends Meta_fld_wkr__base { - public Meta_fld_wkr__end_comma() {this.Ctor(Hook);} - @Override public int Tid() {return Tid_end_comma;} - @Override protected void When_match(Meta_fld_itm fld) {} - private static final byte[] Hook = Bry_.new_a7(","); - public static final Meta_fld_wkr__end_comma Instance = new Meta_fld_wkr__end_comma(); -} -class Meta_fld_wkr__end_paren extends Meta_fld_wkr__base { - public Meta_fld_wkr__end_paren() {this.Ctor(Hook);} - @Override public int Tid() {return Tid_end_paren;} - @Override protected void When_match(Meta_fld_itm fld) {} - private static final byte[] Hook = Bry_.new_a7(")"); - public static final Meta_fld_wkr__end_paren Instance = new Meta_fld_wkr__end_paren(); -} -class Meta_fld_wkr__nullable_null extends Meta_fld_wkr__base { - public Meta_fld_wkr__nullable_null() {this.Ctor(Hook);} - @Override protected void When_match(Meta_fld_itm fld) { - fld.Nullable_tid_(Meta_fld_itm.Nullable_null); - } - private static final byte[] Hook = Bry_.new_a7("null"); - public static final Meta_fld_wkr__nullable_null Instance = new Meta_fld_wkr__nullable_null(); -} -class Meta_fld_wkr__nullable_not extends Meta_fld_wkr__base { - public Meta_fld_wkr__nullable_not() {this.Ctor(Hook, Bry_null);} - @Override protected void When_match(Meta_fld_itm fld) { - fld.Nullable_tid_(Meta_fld_itm.Nullable_not_null); - } - private static final byte[] Hook = Bry_.new_a7("not"), Bry_null = Bry_.new_a7("null"); - public static final Meta_fld_wkr__nullable_not Instance = new Meta_fld_wkr__nullable_not(); -} -class Meta_fld_wkr__primary_key extends Meta_fld_wkr__base { - public Meta_fld_wkr__primary_key() {this.Ctor(Hook, Bry_key);} - @Override protected void When_match(Meta_fld_itm fld) { - fld.Primary_key_y_(); - } - private static final byte[] Hook = Bry_.new_a7("primary"), Bry_key = Bry_.new_a7("key"); - public static final Meta_fld_wkr__primary_key Instance = new Meta_fld_wkr__primary_key(); -} -class Meta_fld_wkr__autonumber extends Meta_fld_wkr__base { - public Meta_fld_wkr__autonumber() {this.Ctor(Hook);} - @Override protected void When_match(Meta_fld_itm fld) { - fld.Autonumber_y_(); - } - private static final byte[] Hook = Bry_.new_a7("autoincrement"); - public static final Meta_fld_wkr__autonumber Instance = new Meta_fld_wkr__autonumber(); -} -class Meta_fld_wkr__default extends Meta_fld_wkr__base { - public Meta_fld_wkr__default() {this.Ctor(Hook);} - @Override public void Match(Bry_rdr_old rdr, Meta_fld_itm fld) { - Object default_val = null; - rdr.Skip_ws(); - byte[] src = rdr.Src(); - byte b = src[rdr.Pos()]; - switch (b) { - case Byte_ascii.Quote: - case Byte_ascii.Apos: - int bgn_pos = rdr.Pos() + 1; - int end_pos = Bry_find_.Find_fwd(src, b, bgn_pos); if (end_pos == Bry_find_.Not_found) throw Err_.new_wo_type("unclosed quote", "snip", rdr.Mid_by_len_safe(40)); - default_val = Bry_.Mid(src, bgn_pos, end_pos); - rdr.Pos_(end_pos + 1); - break; - case Byte_ascii.Dash: - case Byte_ascii.Num_0: case Byte_ascii.Num_1: case Byte_ascii.Num_2: case Byte_ascii.Num_3: case Byte_ascii.Num_4: - case Byte_ascii.Num_5: case Byte_ascii.Num_6: case Byte_ascii.Num_7: case Byte_ascii.Num_8: case Byte_ascii.Num_9: - default_val = rdr.Read_int_to_non_num(); - break; - default: - throw Err_.new_wo_type("invalid field_default", "snip", rdr.Mid_by_len_safe(40)); - } - fld.Default_val_(default_val); - } - @Override protected void When_match(Meta_fld_itm fld) {} - private static final byte[] Hook = Bry_.new_a7("default"); - public static final Meta_fld_wkr__default Instance = new Meta_fld_wkr__default(); -} diff --git a/140_dbs/src/gplx/dbs/metas/parsers/Meta_parser__fld.java b/140_dbs/src/gplx/dbs/metas/parsers/Meta_parser__fld.java deleted file mode 100644 index bb3323fc7..000000000 --- a/140_dbs/src/gplx/dbs/metas/parsers/Meta_parser__fld.java +++ /dev/null @@ -1,118 +0,0 @@ -/* -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.dbs.metas.parsers; import gplx.*; import gplx.dbs.*; import gplx.dbs.metas.*; -import gplx.core.brys.*; import gplx.core.btries.*; -public class Meta_parser__fld { - public Meta_type_itm Parse_type(Bry_rdr_old rdr) { - rdr.Skip_ws(); - Object type_obj = type_trie.Match_bgn(rdr.Src(), rdr.Pos(), rdr.Src_len()); - if (type_obj == null) throw Err_.new_wo_type("invalid fld type", "snip", rdr.Mid_by_len_safe(40)); - Meta_parser__fld_itm type_itm = (Meta_parser__fld_itm)type_obj; - rdr.Pos_add(type_itm.Word().length); - int paren_itms_count = type_itm.Paren_itms_count(); - int len_1 = Int_.Min_value, len_2 = Int_.Min_value; - if (paren_itms_count > 0) { - rdr.Skip_ws().Chk_byte_or_fail(Byte_ascii.Paren_bgn); - len_1 = rdr.Skip_ws().Read_int_to_non_num(); if (len_1 == Int_.Min_value) throw Err_.new_wo_type("invalid fld len_1", "snip", rdr.Mid_by_len_safe(40)); - if (paren_itms_count == 2) { - rdr.Skip_ws().Chk_byte_or_fail(Byte_ascii.Comma); - len_2 = rdr.Skip_ws().Read_int_to_non_num(); if (len_2 == Int_.Min_value) throw Err_.new_wo_type("invalid fld len_2", "snip", rdr.Mid_by_len_safe(40)); - } - rdr.Skip_ws().Chk_byte_or_fail(Byte_ascii.Paren_end); - } - return new Meta_type_itm(type_itm.Tid_ansi(), type_itm.Tid_sqlite(), type_itm.Word(), len_1, len_2); - } - public Meta_fld_itm Parse_fld(Sql_bry_rdr rdr) { // starts after "(" or ","; EX: "(fld1 int", ", fld2 int"; ends at ")" - byte[] name = rdr.Read_sql_identifier(); - Meta_type_itm type = this.Parse_type(rdr); - Meta_fld_itm fld = new Meta_fld_itm(String_.new_u8(name), type); - byte[] src = rdr.Src(); int src_len = rdr.Src_len(); - while (true) { - rdr.Skip_ws(); - if (rdr.Pos() == src_len) return fld; // eos - switch (src[rdr.Pos()]) { - case Byte_ascii.Comma: return fld; - case Byte_ascii.Paren_end: return fld; - } - Object type_obj = fld_trie.Match_bgn(src, rdr.Pos(), src_len); if (type_obj == null) throw Err_.new_wo_type("invalid", "snip", rdr.Mid_by_len_safe(40)); - Meta_fld_wkr__base type_wkr = (Meta_fld_wkr__base)type_obj; - switch (type_wkr.Tid()) { - case Meta_fld_wkr__base.Tid_end_comma: - case Meta_fld_wkr__base.Tid_end_paren: return fld; - default: - rdr.Pos_(fld_trie.Match_pos()); - type_wkr.Match(rdr, fld); - break; - } - } -// return fld; // NOTE: will happen for tests; EX: "fld_1 int" vs "fld_1 int," - } - private static final Btrie_slim_mgr fld_trie = fld_trie_init - ( Meta_fld_wkr__nullable_null.Instance - , Meta_fld_wkr__nullable_not.Instance - , Meta_fld_wkr__autonumber.Instance - , Meta_fld_wkr__primary_key.Instance - , Meta_fld_wkr__default.Instance - ); - private static Btrie_slim_mgr fld_trie_init(Meta_fld_wkr__base... wkrs) { - Btrie_slim_mgr rv = Btrie_slim_mgr.ci_a7(); - for (Meta_fld_wkr__base wkr : wkrs) - wkr.Reg(rv); - return rv; - } - private static final Btrie_slim_mgr type_trie = type_trie_init(); - private static Btrie_slim_mgr type_trie_init() { - Btrie_slim_mgr rv = Btrie_slim_mgr.ci_a7(); - Meta_parser__fld_itm.reg_many(rv, Db_meta_fld.Tid_byte , Sqlite_tid.Tid_int , 0, "tinyint", "int2"); - Meta_parser__fld_itm.reg_many(rv, Db_meta_fld.Tid_short , Sqlite_tid.Tid_int , 0, "smallint"); - Meta_parser__fld_itm.reg_many(rv, Db_meta_fld.Tid_int , Sqlite_tid.Tid_int , 0, "int", "integer", "mediumint"); - Meta_parser__fld_itm.reg_many(rv, Db_meta_fld.Tid_long , Sqlite_tid.Tid_int , 0, "bigint", "int8"); // "UNSIGNED BIG INT" - Meta_parser__fld_itm.reg_many(rv, Db_meta_fld.Tid_str , Sqlite_tid.Tid_text , 1, "character", "varchar", "nchar"); // "varying character", "native character" - Meta_parser__fld_itm.reg_many(rv, Db_meta_fld.Tid_text , Sqlite_tid.Tid_text , 0, "text", "clob"); - Meta_parser__fld_itm.reg_many(rv, Db_meta_fld.Tid_bry , Sqlite_tid.Tid_none , 0, "blob"); - Meta_parser__fld_itm.reg_many(rv, Db_meta_fld.Tid_float , Sqlite_tid.Tid_real , 0, "float"); - Meta_parser__fld_itm.reg_many(rv, Db_meta_fld.Tid_double , Sqlite_tid.Tid_real , 0, "real", "double"); // "double precision" - Meta_parser__fld_itm.reg_many(rv, Db_meta_fld.Tid_decimal , Sqlite_tid.Tid_numeric , 0, "numeric"); - Meta_parser__fld_itm.reg_many(rv, Db_meta_fld.Tid_decimal , Sqlite_tid.Tid_numeric , 2, "decimal"); - Meta_parser__fld_itm.reg_many(rv, Db_meta_fld.Tid_decimal , Sqlite_tid.Tid_numeric , 2, "decimal"); - Meta_parser__fld_itm.reg_many(rv, Db_meta_fld.Tid_bool , Sqlite_tid.Tid_numeric , 0, "boolean", "bit"); // "bit" is not SQLITE - Meta_parser__fld_itm.reg_many(rv, Db_meta_fld.Tid_date , Sqlite_tid.Tid_numeric , 0, "date", "datetime"); - return rv; - } -} -class Meta_parser__fld_itm { - public Meta_parser__fld_itm(int tid_ansi, int tid_sqlite, byte[] word, int paren_itms_count) { - this.tid_ansi = tid_ansi; this.tid_sqlite = tid_sqlite; - this.word = word; this.paren_itms_count = paren_itms_count; - } - public int Tid_ansi() {return tid_ansi;} private final int tid_ansi; - public int Tid_sqlite() {return tid_sqlite;} private final int tid_sqlite; - public byte[] Word() {return word;} private final byte[] word; - public int Paren_itms_count() {return paren_itms_count;} private final int paren_itms_count; - public static void reg_many(Btrie_slim_mgr trie, int tid_ansi, int tid_sqlite, int paren_itms_count, String... names_str) { - int len = names_str.length; - for (int i = 0; i < len; ++i) { - byte[] name_bry = Bry_.new_a7(names_str[i]); - Meta_parser__fld_itm itm = new Meta_parser__fld_itm(tid_ansi, tid_sqlite, name_bry, paren_itms_count); - trie.Add_obj(name_bry, itm); - } - } -} -class Sqlite_tid { - public static final int Tid_int = 1, Tid_text = 2, Tid_none = 3, Tid_real = 4, Tid_numeric = 5; -} diff --git a/140_dbs/src/gplx/dbs/metas/parsers/Meta_parser__fld_tst.java b/140_dbs/src/gplx/dbs/metas/parsers/Meta_parser__fld_tst.java deleted file mode 100644 index 1a69eb161..000000000 --- a/140_dbs/src/gplx/dbs/metas/parsers/Meta_parser__fld_tst.java +++ /dev/null @@ -1,71 +0,0 @@ -/* -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.dbs.metas.parsers; import gplx.*; import gplx.dbs.*; import gplx.dbs.metas.*; -import org.junit.*; -public class Meta_parser__fld_tst { - @Before public void init() {fxt.Clear();} private Meta_parser__fld_fxt fxt = new Meta_parser__fld_fxt(); - @Test public void Parse_type() { - fxt.Test_parse_type("int" , fxt.Make_type(Db_meta_fld.Tid_int)); - fxt.Test_parse_type("varchar(255)" , fxt.Make_type(Db_meta_fld.Tid_str, 255)); - fxt.Test_parse_type("decimal(12,10)" , fxt.Make_type(Db_meta_fld.Tid_decimal, 12, 10)); - fxt.Test_parse_type(" int" , fxt.Make_type(Db_meta_fld.Tid_int)); - fxt.Test_parse_type(" decimal ( 12 , 10 )" , fxt.Make_type(Db_meta_fld.Tid_decimal, 12, 10)); - } - @Test public void Parse_fld() { - fxt.Test_parse_fld("name_1 int" , fxt.Make_fld("name_1", Db_meta_fld.Tid_int, Meta_fld_itm.Nullable_unknown)); - fxt.Test_parse_fld("name_1 int null" , fxt.Make_fld("name_1", Db_meta_fld.Tid_int, Meta_fld_itm.Nullable_null)); - fxt.Test_parse_fld("name_1 int not null" , fxt.Make_fld("name_1", Db_meta_fld.Tid_int, Meta_fld_itm.Nullable_not_null)); - fxt.Test_parse_fld("name_1 int not null autoincrement" , fxt.Make_fld("name_1", Db_meta_fld.Tid_int, Meta_fld_itm.Nullable_not_null, Bool_.N, Bool_.Y)); - fxt.Test_parse_fld("name_1 int not null primary key" , fxt.Make_fld("name_1", Db_meta_fld.Tid_int, Meta_fld_itm.Nullable_not_null, Bool_.Y, Bool_.N)); - fxt.Test_parse_fld("name_1 int not null default -1" , fxt.Make_fld("name_1", Db_meta_fld.Tid_int, Meta_fld_itm.Nullable_not_null, Bool_.Y, Bool_.N, -1)); - fxt.Test_parse_fld("name_1 int not null default 'abc'" , fxt.Make_fld("name_1", Db_meta_fld.Tid_int, Meta_fld_itm.Nullable_not_null, Bool_.Y, Bool_.N, "abc")); - } -} -class Meta_parser__fld_fxt { - private final Meta_parser__fld fld_parser = new Meta_parser__fld(); - private final Sql_bry_rdr rdr = new Sql_bry_rdr(); - public void Clear() {} - public Meta_type_itm Make_type(int tid_ansi) {return new Meta_type_itm(tid_ansi, -1, null, Int_.Min_value, Int_.Min_value);} - public Meta_type_itm Make_type(int tid_ansi, int len_1) {return new Meta_type_itm(tid_ansi, -1, null, len_1, Int_.Min_value);} - public Meta_type_itm Make_type(int tid_ansi, int len_1, int len_2) {return new Meta_type_itm(tid_ansi, -1, null, len_1, len_2);} - public Meta_fld_itm Make_fld(String name, int tid_ansi, int nullable) {return Make_fld(name, tid_ansi, nullable, false, false, null);} - public Meta_fld_itm Make_fld(String name, int tid_ansi, int nullable, boolean autonumber, boolean primary_key) {return Make_fld(name, tid_ansi, nullable, false, false, null);} - public Meta_fld_itm Make_fld(String name, int tid_ansi, int nullable, boolean autonumber, boolean primary_key, Object default_val) { - Meta_fld_itm rv = new Meta_fld_itm(name, Make_type(tid_ansi)); - rv.Nullable_tid_(nullable); - if (autonumber) rv.Autonumber_y_(); - if (primary_key) rv.Primary_key_y_(); - rv.Default_val_(default_val); - return rv; - } - public void Test_parse_type(String src, Meta_type_itm expd_type) { - rdr.Init(Bry_.new_u8(src)); - Meta_type_itm actl_type = fld_parser.Parse_type(rdr); - Tfds.Eq(expd_type.Tid_ansi() , actl_type.Tid_ansi()); - Tfds.Eq(expd_type.Len_1() , actl_type.Len_1()); - Tfds.Eq(expd_type.Len_2() , actl_type.Len_2()); - } - public void Test_parse_fld(String src, Meta_fld_itm expd_fld) { - rdr.Init(Bry_.new_u8(src)); - Meta_fld_itm actl_fld = fld_parser.Parse_fld(rdr); - Tfds.Eq(expd_fld.Name() , actl_fld.Name()); - Tfds.Eq(expd_fld.Type().Tid_ansi() , actl_fld.Type().Tid_ansi()); - Tfds.Eq(expd_fld.Nullable_tid() , actl_fld.Nullable_tid()); - Tfds.Eq(Object_.Xto_str_strict_or_empty(expd_fld.Default_val()), Object_.Xto_str_strict_or_empty(actl_fld.Default_val())); - } -} diff --git a/140_dbs/src/gplx/dbs/metas/parsers/Meta_parser__tbl.java b/140_dbs/src/gplx/dbs/metas/parsers/Meta_parser__tbl.java deleted file mode 100644 index 1f2e68d4d..000000000 --- a/140_dbs/src/gplx/dbs/metas/parsers/Meta_parser__tbl.java +++ /dev/null @@ -1,57 +0,0 @@ -/* -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.dbs.metas.parsers; import gplx.*; import gplx.dbs.*; import gplx.dbs.metas.*; -import gplx.core.brys.*; import gplx.core.btries.*; -public class Meta_parser__tbl { - private final Sql_bry_rdr rdr = new Sql_bry_rdr(); - private final Meta_parser__fld fld_parser = new Meta_parser__fld(); - private Meta_tbl_itm tbl; - public Meta_tbl_itm Parse(byte[] src) { - src = Bry_.Lcase__all(src); - rdr.Init(src); - tbl = null; - Parse_hdr(); - Parse_flds(); - return tbl; - } - private void Parse_hdr() { - rdr.Skip_ws().Chk_bry_or_fail(Tkn_create); - rdr.Skip_ws().Chk_bry_or_fail(Tkn_table); - byte[] tbl_name = rdr.Read_sql_identifier(); - this.tbl = new Meta_tbl_itm(String_.new_u8(tbl_name), String_.new_u8(rdr.Src())); - rdr.Skip_ws().Chk_byte_or_fail(Byte_ascii.Paren_bgn); - } - private void Parse_flds() { - byte[] src = rdr.Src(); - while (true) { - Meta_fld_itm fld = fld_parser.Parse_fld(rdr); if (fld == null) throw Err_.new_wo_type("unknown field", "src", rdr.Src()); - tbl.Flds().Add(fld); - int pos = rdr.Pos(); - byte b = pos == rdr.Src_len() ? Byte_ascii.Null : src[pos]; - switch (b) { - case Byte_ascii.Comma: rdr.Pos_add_one(); break; - case Byte_ascii.Paren_end: rdr.Pos_add_one(); return; - default: throw Err_.new_wo_type("premature end of flds", "src", rdr.Mid_by_len_safe(40)); - } - } - } - private static final byte[] - Tkn_create = Bry_.new_a7("create") - , Tkn_table = Bry_.new_a7("table") - ; -} diff --git a/140_dbs/src/gplx/dbs/metas/parsers/Sql_bry_rdr.java b/140_dbs/src/gplx/dbs/metas/parsers/Sql_bry_rdr.java index 497968a01..f1a9db62a 100644 --- a/140_dbs/src/gplx/dbs/metas/parsers/Sql_bry_rdr.java +++ b/140_dbs/src/gplx/dbs/metas/parsers/Sql_bry_rdr.java @@ -17,14 +17,13 @@ along with this program. If not, see . */ package gplx.dbs.metas.parsers; import gplx.*; import gplx.dbs.*; import gplx.dbs.metas.*; import gplx.core.brys.*; -public class Sql_bry_rdr extends Bry_rdr_old { public byte[] Read_sql_identifier() { +public class Sql_bry_rdr extends Bry_rdr { public byte[] Read_sql_identifier() { this.Skip_ws(); int bgn = pos, end = -1; - if (pos == src_len) return null; + if (pos == src_end) return null; if (src[pos] == Byte_ascii.Brack_bgn) { // EX: [name with space] bgn = ++pos; // set bgn after [ - end = this.Find_fwd(Byte_ascii.Brack_end); - pos = end + 1; // set pos after ] + end = this.Find_fwd_lr(Byte_ascii.Brack_end); } else { this.Skip_alpha_num_under(); // ASSUME: identifier is ASCII and alpha / num / underscore @@ -33,8 +32,8 @@ public class Sql_bry_rdr extends Bry_rdr_old { public byte[] Read_sql_identifie } return Bry_.Mid(src, bgn, end); } - @Override public Bry_rdr_old Skip_ws() { - byte b_0 = pos < src_len ? src[pos] : Byte_ascii.Null; + @Override public Bry_rdr Skip_ws() { + byte b_0 = pos < src_end ? src[pos] : Byte_ascii.Null; byte bgn_1 = Byte_ascii.Null; byte[] end_bry = null; switch (b_0) { @@ -46,12 +45,12 @@ public class Sql_bry_rdr extends Bry_rdr_old { public byte[] Read_sql_identifie default: return this; } - byte b_1 = pos + 1 < src_len ? src[pos + 1] : Byte_ascii.Null; + byte b_1 = pos + 1 < src_end ? src[pos + 1] : Byte_ascii.Null; if (b_1 != bgn_1) return this; - int end_pos = Bry_find_.Find_fwd(src, end_bry, pos + 2, src_len); + int end_pos = Bry_find_.Find_fwd(src, end_bry, pos + 2, src_end); if (end_pos == Bry_find_.Not_found) return this; pos = end_pos + end_bry.length; - return this.Skip_ws(); + return super.Skip_ws(); } private static final byte[] Comm_end_line = Byte_ascii.Nl_bry, Comm_end_multi = Bry_.new_a7("*/"); } diff --git a/140_dbs/src/gplx/dbs/metas/parsers/Sql_bry_rdr_tst.java b/140_dbs/src/gplx/dbs/metas/parsers/Sql_bry_rdr_tst.java index 3d6c41d36..9fe74724e 100644 --- a/140_dbs/src/gplx/dbs/metas/parsers/Sql_bry_rdr_tst.java +++ b/140_dbs/src/gplx/dbs/metas/parsers/Sql_bry_rdr_tst.java @@ -41,12 +41,12 @@ class Sql_bry_rdr_fxt { private final Sql_bry_rdr rdr = new Sql_bry_rdr(); public void Clear() {} public void Test_skip_ws(String src, int expd_pos) { - rdr.Init(Bry_.new_u8(src)); + rdr.Init_by_src(Bry_.new_u8(src)); rdr.Skip_ws(); Tfds.Eq(expd_pos, rdr.Pos()); } public void Test_read_sql_identifier(String src, String expd) { - rdr.Init(Bry_.new_u8(src)); + rdr.Init_by_src(Bry_.new_u8(src)); Tfds.Eq(expd, String_.new_u8(rdr.Read_sql_identifier())); } } diff --git a/140_dbs/src/gplx/dbs/qrys/Db_qry_insert.java b/140_dbs/src/gplx/dbs/qrys/Db_qry_insert.java index c1534075d..36006507c 100644 --- a/140_dbs/src/gplx/dbs/qrys/Db_qry_insert.java +++ b/140_dbs/src/gplx/dbs/qrys/Db_qry_insert.java @@ -37,7 +37,7 @@ public class Db_qry_insert implements Db_qry_arg_owner { public Db_qry_arg_owner Arg_(String k, byte[] v) {return Arg_obj_type_(k, String_.new_u8(v), Db_val_type.Tid_varchar);} public Db_qry_arg_owner Arg_obj_(String k, Object v) {return Arg_obj_type_(k, v, Db_val_type.Tid_null);} public Db_qry_arg_owner Arg_obj_type_(String key, Object val, byte val_tid) { - if (key == Db_meta_fld.Key_null) return this; + if (key == Dbmeta_fld_itm.Key_null) return this; Db_arg arg = new Db_arg(key, val).Val_tid_(val_tid); args.Add(arg.Key(), arg); return this; diff --git a/140_dbs/src/gplx/dbs/qrys/Db_qry_update.java b/140_dbs/src/gplx/dbs/qrys/Db_qry_update.java index ceeaa6b78..8aedb1ed1 100644 --- a/140_dbs/src/gplx/dbs/qrys/Db_qry_update.java +++ b/140_dbs/src/gplx/dbs/qrys/Db_qry_update.java @@ -37,7 +37,7 @@ public class Db_qry_update implements Db_qry_arg_owner { public Db_qry_arg_owner Arg_(String k, byte[] v) {return Arg_obj_type_(k, String_.new_u8(v), Db_val_type.Tid_varchar);} public Db_qry_arg_owner Arg_obj_(String k, Object v) {return Arg_obj_type_(k, v, Db_val_type.Tid_null);} public Db_qry_arg_owner Arg_obj_type_(String key, Object val, byte val_tid) { - if (key == Db_meta_fld.Key_null) return this; + if (key == Dbmeta_fld_itm.Key_null) return this; Db_arg arg = new Db_arg(key, val).Val_tid_(val_tid); args.Add(arg.Key(), arg); return this; diff --git a/140_dbs/src/gplx/dbs/qrys/Db_stmt_cmd.java b/140_dbs/src/gplx/dbs/qrys/Db_stmt_cmd.java index 1d138a988..1e1fc3482 100644 --- a/140_dbs/src/gplx/dbs/qrys/Db_stmt_cmd.java +++ b/140_dbs/src/gplx/dbs/qrys/Db_stmt_cmd.java @@ -41,7 +41,7 @@ public class Db_stmt_cmd implements Db_stmt { public Db_stmt Val_byte(String k, byte v) {return Add_byte(Bool_.N, k, v);} public Db_stmt Val_byte(byte v) {return Add_byte(Bool_.N, Key_na, v);} private Db_stmt Add_byte(boolean where, String k, byte v) { - if (k == Db_meta_fld.Key_null) return this; // key is explicitly null; ignore; allows version_2+ type definitions + if (k == Dbmeta_fld_itm.Key_null) return this; // key is explicitly null; ignore; allows version_2+ type definitions try {stmt.setByte(++val_idx, v);} catch (Exception e) {this.Rls(); throw Err_.new_exc(e, "db", "failed to add value", "type", "byte", "val", v, "sql", sql);} return this; } @@ -50,7 +50,7 @@ public class Db_stmt_cmd implements Db_stmt { public Db_stmt Val_int(String k, int v) {return Add_int(Bool_.N, k, v);} public Db_stmt Val_int(int v) {return Add_int(Bool_.N, Key_na, v);} private Db_stmt Add_int(boolean where, String k, int v) { - if (k == Db_meta_fld.Key_null) return this; // key is explicitly null; ignore; allows version_2+ type definitions + if (k == Dbmeta_fld_itm.Key_null) return this; // key is explicitly null; ignore; allows version_2+ type definitions try {stmt.setInt(++val_idx, v);} catch (Exception e) {this.Rls(); throw Err_.new_exc(e, "db", "failed to add value", "type", "int", "val", v, "sql", sql);} return this; } @@ -58,7 +58,7 @@ public class Db_stmt_cmd implements Db_stmt { public Db_stmt Val_long(String k, long v) {return Add_long(Bool_.N, k, v);} public Db_stmt Val_long(long v) {return Add_long(Bool_.N, Key_na, v);} private Db_stmt Add_long(boolean where, String k, long v) { - if (k == Db_meta_fld.Key_null) return this; // key is explicitly null; ignore; allows version_2+ type definitions + if (k == Dbmeta_fld_itm.Key_null) return this; // key is explicitly null; ignore; allows version_2+ type definitions try {stmt.setLong(++val_idx, v);} catch (Exception e) {this.Rls(); throw Err_.new_exc(e, "db", "failed to add value", "type", "long", "val", v, "sql", sql);} return this; } @@ -66,7 +66,7 @@ public class Db_stmt_cmd implements Db_stmt { public Db_stmt Val_float(String k, float v) {return Add_float(Bool_.N, k, v);} public Db_stmt Val_float(float v) {return Add_float(Bool_.N, Key_na, v);} private Db_stmt Add_float(boolean where, String k, float v) { - if (k == Db_meta_fld.Key_null) return this; // key is explicitly null; ignore; allows version_2+ type definitions + if (k == Dbmeta_fld_itm.Key_null) return this; // key is explicitly null; ignore; allows version_2+ type definitions try {stmt.setFloat(++val_idx, v);} catch (Exception e) {this.Rls(); throw Err_.new_exc(e, "db", "failed to add value", "type", "float", "val", v, "sql", sql);} return this; } @@ -74,7 +74,7 @@ public class Db_stmt_cmd implements Db_stmt { public Db_stmt Val_double(String k, double v) {return Add_double(Bool_.N, k, v);} public Db_stmt Val_double(double v) {return Add_double(Bool_.N, Key_na, v);} private Db_stmt Add_double(boolean where, String k, double v) { - if (k == Db_meta_fld.Key_null) return this; // key is explicitly null; ignore; allows version_2+ type definitions + if (k == Dbmeta_fld_itm.Key_null) return this; // key is explicitly null; ignore; allows version_2+ type definitions try {stmt.setDouble(++val_idx, v);} catch (Exception e) {this.Rls(); throw Err_.new_exc(e, "db", "failed to add value", "type", "double", "val", v, "sql", sql);} return this; } @@ -82,7 +82,7 @@ public class Db_stmt_cmd implements Db_stmt { public Db_stmt Val_decimal(String k, Decimal_adp v) {return Add_decimal(Bool_.N, k, v);} public Db_stmt Val_decimal(Decimal_adp v) {return Add_decimal(Bool_.N, Key_na, v);} private Db_stmt Add_decimal(boolean where, String k, Decimal_adp v) { - if (k == Db_meta_fld.Key_null) return this; // key is explicitly null; ignore; allows version_2+ type definitions + if (k == Dbmeta_fld_itm.Key_null) return this; // key is explicitly null; ignore; allows version_2+ type definitions try {stmt.setBigDecimal(++val_idx, v.Under_as_native());} catch (Exception e) {this.Rls(); throw Err_.new_exc(e, "db", "failed to add value", "type", "decimal", "val", v, "sql", sql);} return this; } @@ -90,7 +90,7 @@ public class Db_stmt_cmd implements Db_stmt { public Db_stmt Val_bry(String k, byte[] v) {return Add_bry(Bool_.N, k, v);} public Db_stmt Val_bry(byte[] v) {return Add_bry(Bool_.N, Key_na, v);} private Db_stmt Add_bry(boolean where, String k, byte[] v) { - if (k == Db_meta_fld.Key_null) return this; // key is explicitly null; ignore; allows version_2+ type definitions + if (k == Dbmeta_fld_itm.Key_null) return this; // key is explicitly null; ignore; allows version_2+ type definitions try {stmt.setBytes(++val_idx, v);} catch (Exception e) {this.Rls(); throw Err_.new_exc(e, "db", "failed to add value", "type", "byte[]", v.length, sql);} return this; } @@ -102,7 +102,7 @@ public class Db_stmt_cmd implements Db_stmt { public Db_stmt Val_str(String k, String v) {return Add_str(Bool_.N, k, v);} public Db_stmt Val_str(String v) {return Add_str(Bool_.N, Key_na, v);} private Db_stmt Add_str(boolean where, String k, String v) { - if (k == Db_meta_fld.Key_null) return this; // key is explicitly null; ignore; allows version_2+ type definitions + if (k == Dbmeta_fld_itm.Key_null) return this; // key is explicitly null; ignore; allows version_2+ type definitions try {stmt.setString(++val_idx, v);} catch (Exception e) {this.Rls(); throw Err_.new_exc(e, "db", "failed to add value", "type", "String", "val", v, "sql", sql);} return this; } diff --git a/140_dbs/src/gplx/dbs/qrys/Db_stmt_sql.java b/140_dbs/src/gplx/dbs/qrys/Db_stmt_sql.java index 840836803..3c6b55ecd 100644 --- a/140_dbs/src/gplx/dbs/qrys/Db_stmt_sql.java +++ b/140_dbs/src/gplx/dbs/qrys/Db_stmt_sql.java @@ -125,7 +125,7 @@ public class Db_stmt_sql implements Db_stmt {// used for formatting SQL statemen } public void Rls() {this.Clear();} public void Add(String k, String v) { - if (k == Db_meta_fld.Key_null) return; // key is explicitly null; ignore; allows version_2+ type definitions + if (k == Dbmeta_fld_itm.Key_null) return; // key is explicitly null; ignore; allows version_2+ type definitions args.Add(v); } public String Xto_sql() { diff --git a/140_dbs/src/gplx/dbs/sqls/Db_sqlbldr__sqlite.java b/140_dbs/src/gplx/dbs/sqls/Db_sqlbldr__sqlite.java index da02041ef..db5bb192d 100644 --- a/140_dbs/src/gplx/dbs/sqls/Db_sqlbldr__sqlite.java +++ b/140_dbs/src/gplx/dbs/sqls/Db_sqlbldr__sqlite.java @@ -16,11 +16,12 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.dbs.sqls; import gplx.*; import gplx.dbs.*; +import gplx.dbs.metas.*; interface Db_sqlbldr {} public class Db_sqlbldr__sqlite implements Db_sqlbldr { private Bry_bfr tmp_bfr = Bry_bfr.reset_(1024); public Db_sqlbldr__sqlite Bfr_(Bry_bfr bfr) {this.tmp_bfr = bfr; return this;} - public String Bld_create_idx(Db_meta_idx idx) { + public String Bld_create_idx(Dbmeta_idx_itm idx) { tmp_bfr.Add_str_a7("CREATE "); if (idx.Unique()) tmp_bfr.Add_str_a7("UNIQUE "); @@ -30,22 +31,22 @@ public class Db_sqlbldr__sqlite implements Db_sqlbldr { tmp_bfr.Add_str_a7(" ON "); tmp_bfr.Add_str_a7(idx.Tbl()); tmp_bfr.Add_str_a7(" ("); - String[] flds = idx.Flds(); + Dbmeta_idx_fld[] flds = idx.Flds; int flds_len = flds.length; for (int i = 0; i < flds_len; ++i) { - String fld = flds[i]; + Dbmeta_idx_fld fld = flds[i]; if (i != 0) tmp_bfr.Add_str_a7(", "); - tmp_bfr.Add_str_a7(fld); + tmp_bfr.Add_str_a7(fld.Name); } tmp_bfr.Add_str_a7(");"); return tmp_bfr.To_str_and_clear(); } - public String Bld_create_tbl(Db_meta_tbl tbl) { + public String Bld_create_tbl(Dbmeta_tbl_itm tbl) { tmp_bfr.Add_str_a7("CREATE TABLE IF NOT EXISTS ").Add_str_a7(tbl.Name()).Add_byte_nl(); - Db_meta_fld[] flds = tbl.Flds(); - int flds_len = flds.length; - for (int i = 0; i < flds_len; ++i) { - Db_meta_fld fld = flds[i]; + Dbmeta_fld_mgr flds = tbl.Flds(); + int len = flds.Len(); + for (int i = 0; i < len; ++i) { + Dbmeta_fld_itm fld = flds.Get_at(i); tmp_bfr.Add_byte(i == 0 ? Byte_ascii.Paren_bgn : Byte_ascii.Comma).Add_byte_space(); Bld_fld(tmp_bfr, fld); tmp_bfr.Add_byte_nl(); @@ -53,7 +54,7 @@ public class Db_sqlbldr__sqlite implements Db_sqlbldr { tmp_bfr.Add_str_a7(");"); return tmp_bfr.To_str_and_clear(); } - public String Bld_alter_tbl_add(String tbl, Db_meta_fld fld) { + public String Bld_alter_tbl_add(String tbl, Dbmeta_fld_itm fld) { tmp_bfr.Add_str_a7("ALTER TABLE ").Add_str_a7(tbl).Add_str_a7(" ADD "); Bld_fld(tmp_bfr, fld); tmp_bfr.Add_byte_semic(); @@ -62,15 +63,19 @@ public class Db_sqlbldr__sqlite implements Db_sqlbldr { public String Bld_drop_tbl(String tbl) { return String_.Format("DROP TABLE IF EXISTS {0};", tbl); } - private void Bld_fld(Bry_bfr tmp_bfr, Db_meta_fld fld) { + private void Bld_fld(Bry_bfr tmp_bfr, Dbmeta_fld_itm fld) { tmp_bfr.Add_str_a7(fld.Name()).Add_byte_space(); - Tid_to_sql(tmp_bfr, fld.Tid(), fld.Len()); tmp_bfr.Add_byte_space(); - tmp_bfr.Add_str_a7(fld.Nullable() ? "NULL " : "NOT NULL "); - if (fld.Default() != Db_meta_fld.Default_value_null) { + Tid_to_sql(tmp_bfr, fld.Type().Tid_ansi(), fld.Type().Len_1()); tmp_bfr.Add_byte_space(); + switch (fld.Nullable_tid()) { + case Dbmeta_fld_itm.Nullable_unknown: + case Dbmeta_fld_itm.Nullable_not_null: tmp_bfr.Add_str_a7("NOT NULL "); break; + case Dbmeta_fld_itm.Nullable_null: tmp_bfr.Add_str_a7("NULL "); break; + } + if (fld.Default() != Dbmeta_fld_itm.Default_value_null) { tmp_bfr.Add_str_a7("DEFAULT "); boolean quote = Bool_.N; - switch (fld.Tid()) { - case Db_meta_fld.Tid_str: case Db_meta_fld.Tid_text: quote = Bool_.Y; break; + switch (fld.Type().Tid_ansi()) { + case Dbmeta_fld_tid.Tid__str: case Dbmeta_fld_tid.Tid__text: quote = Bool_.Y; break; } if (quote) tmp_bfr.Add_byte_apos(); tmp_bfr.Add_str_u8(Object_.Xto_str_strict_or_null(fld.Default())); @@ -83,17 +88,17 @@ public class Db_sqlbldr__sqlite implements Db_sqlbldr { } public static void Tid_to_sql(Bry_bfr tmp_bfr, int tid, int len) {// REF: https://www.sqlite.org/datatype3.html switch (tid) { - case Db_meta_fld.Tid_bool: tmp_bfr.Add_str_a7("boolean"); break; - case Db_meta_fld.Tid_byte: tmp_bfr.Add_str_a7("tinyint"); break; - case Db_meta_fld.Tid_short: tmp_bfr.Add_str_a7("smallint"); break; - case Db_meta_fld.Tid_int: tmp_bfr.Add_str_a7("integer"); break; // NOTE: must be integer, not int, else "int PRIMARY KEY AUTONUMBER" will fail; DATE:2015-02-12 - case Db_meta_fld.Tid_long: tmp_bfr.Add_str_a7("bigint"); break; - case Db_meta_fld.Tid_float: tmp_bfr.Add_str_a7("float"); break; - case Db_meta_fld.Tid_double: tmp_bfr.Add_str_a7("double"); break; - case Db_meta_fld.Tid_str: tmp_bfr.Add_str_a7("varchar(").Add_int_variable(len).Add_byte(Byte_ascii.Paren_end); break; - case Db_meta_fld.Tid_text: tmp_bfr.Add_str_a7("text"); break; - case Db_meta_fld.Tid_bry: tmp_bfr.Add_str_a7("blob"); break; - default: throw Err_.new_unhandled(tid); + case Dbmeta_fld_tid.Tid__bool: tmp_bfr.Add_str_a7("boolean"); break; + case Dbmeta_fld_tid.Tid__byte: tmp_bfr.Add_str_a7("tinyint"); break; + case Dbmeta_fld_tid.Tid__short: tmp_bfr.Add_str_a7("smallint"); break; + case Dbmeta_fld_tid.Tid__int: tmp_bfr.Add_str_a7("integer"); break; // NOTE: must be integer, not int, else "int PRIMARY KEY AUTONUMBER" will fail; DATE:2015-02-12 + case Dbmeta_fld_tid.Tid__long: tmp_bfr.Add_str_a7("bigint"); break; + case Dbmeta_fld_tid.Tid__float: tmp_bfr.Add_str_a7("float"); break; + case Dbmeta_fld_tid.Tid__double: tmp_bfr.Add_str_a7("double"); break; + case Dbmeta_fld_tid.Tid__str: tmp_bfr.Add_str_a7("varchar(").Add_int_variable(len).Add_byte(Byte_ascii.Paren_end); break; + case Dbmeta_fld_tid.Tid__text: tmp_bfr.Add_str_a7("text"); break; + case Dbmeta_fld_tid.Tid__bry: tmp_bfr.Add_str_a7("blob"); break; + default: throw Err_.new_unhandled(tid); } } public static final Db_sqlbldr__sqlite Instance = new Db_sqlbldr__sqlite(); diff --git a/140_dbs/src/gplx/dbs/sqls/Db_sqlbldr_tst.java b/140_dbs/src/gplx/dbs/sqls/Db_sqlbldr_tst.java index ee66f1321..f997be91b 100644 --- a/140_dbs/src/gplx/dbs/sqls/Db_sqlbldr_tst.java +++ b/140_dbs/src/gplx/dbs/sqls/Db_sqlbldr_tst.java @@ -20,12 +20,12 @@ import org.junit.*; public class Db_sqlbldr_tst { @Before public void setup() {} private final Db_sqlbldr_fxt fxt = new Db_sqlbldr_fxt(); @Test public void Idx_unique() { - fxt.Test_create_idx(Db_meta_idx.new_unique_by_tbl("tbl_name", "idx_name", "fld_1", "fld_2") + fxt.Test_create_idx(Dbmeta_idx_itm.new_unique_by_tbl("tbl_name", "idx_name", "fld_1", "fld_2") , "CREATE UNIQUE INDEX IF NOT EXISTS tbl_name__idx_name ON tbl_name (fld_1, fld_2);" ); } @Test public void Tbl_basic() { - Db_meta_fld_list flds = Db_meta_fld_list.new_(); + Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); flds.Add_int_pkey("fld_int_pkey"); flds.Add_bool("fld_bool"); flds.Add_short("fld_short"); @@ -36,7 +36,7 @@ public class Db_sqlbldr_tst { flds.Add_str("fld_str", 123); flds.Add_text("fld_text"); flds.Add_bry("fld_bry"); - fxt.Test_create_tbl(Db_meta_tbl.new_("tbl_name", flds.To_fld_ary()) + fxt.Test_create_tbl(Dbmeta_tbl_itm.New("tbl_name", flds.To_fld_ary()) , String_.Concat_lines_nl_skip_last ( "CREATE TABLE IF NOT EXISTS tbl_name" , "( fld_int_pkey integer NOT NULL PRIMARY KEY" @@ -53,7 +53,7 @@ public class Db_sqlbldr_tst { )); } @Test public void Tbl_alter_tbl_add() { - Db_meta_fld_list flds = Db_meta_fld_list.new_(); + Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); flds.Add_int_dflt("fld_int", -1); flds.Add_str_dflt("fld_str", 255, "a"); fxt.Test_alter_tbl_add("tbl_name", flds.Get_by("fld_int"), "ALTER TABLE tbl_name ADD fld_int integer NOT NULL DEFAULT -1;"); @@ -62,7 +62,7 @@ public class Db_sqlbldr_tst { } class Db_sqlbldr_fxt { private Db_sqlbldr__sqlite sqlbldr = Db_sqlbldr__sqlite.Instance; - public void Test_create_idx(Db_meta_idx idx, String expd) {Tfds.Eq(expd, sqlbldr.Bld_create_idx(idx));} - public void Test_create_tbl(Db_meta_tbl tbl, String expd) {Tfds.Eq_str_lines(expd, sqlbldr.Bld_create_tbl(tbl));} - public void Test_alter_tbl_add(String tbl, Db_meta_fld fld, String expd) {Tfds.Eq_str_lines(expd, sqlbldr.Bld_alter_tbl_add(tbl, fld));} + public void Test_create_idx(Dbmeta_idx_itm idx, String expd) {Tfds.Eq(expd, sqlbldr.Bld_create_idx(idx));} + public void Test_create_tbl(Dbmeta_tbl_itm tbl, String expd) {Tfds.Eq_str_lines(expd, sqlbldr.Bld_create_tbl(tbl));} + public void Test_alter_tbl_add(String tbl, Dbmeta_fld_itm fld, String expd) {Tfds.Eq_str_lines(expd, sqlbldr.Bld_alter_tbl_add(tbl, fld));} } diff --git a/400_xowa/src/gplx/dbs/Db_diff_bldr.java b/400_xowa/src/gplx/dbs/Db_diff_bldr.java index ab6de8ed5..bb7a93c07 100644 --- a/400_xowa/src/gplx/dbs/Db_diff_bldr.java +++ b/400_xowa/src/gplx/dbs/Db_diff_bldr.java @@ -26,29 +26,29 @@ class Db_diff_bldr { // Io_url trg_url = Io_url_.new_fil_(trg_str); // Db_conn src_conn = Db_conn_bldr.Instance.Get_or_new(src_url).Conn(); // Db_conn trg_conn = Db_conn_bldr.Instance.Get_or_new(trg_url).Conn(); - Meta_tbl_mgr src_tbls = new Meta_tbl_mgr(); - Meta_tbl_mgr trg_tbls = new Meta_tbl_mgr(); + Dbmeta_tbl_mgr src_tbls = new Dbmeta_tbl_mgr(); + Dbmeta_tbl_mgr trg_tbls = new Dbmeta_tbl_mgr(); return Compare_tbls(src_tbls, trg_tbls); } - public String Compare_tbls(Meta_tbl_mgr src_tbls, Meta_tbl_mgr trg_tbls) { + public String Compare_tbls(Dbmeta_tbl_mgr src_tbls, Dbmeta_tbl_mgr trg_tbls) { int src_len = src_tbls.Len(); for (int i = 0; i < src_len; ++i) { - Meta_tbl_itm src_tbl = src_tbls.Get_at(i); - Meta_tbl_itm trg_tbl = trg_tbls.Get_by(src_tbl.Name()); + Dbmeta_tbl_itm src_tbl = src_tbls.Get_at(i); + Dbmeta_tbl_itm trg_tbl = trg_tbls.Get_by(src_tbl.Name()); if (trg_tbl == null) Tbl_delete(src_tbl); } int trg_len = trg_tbls.Len(); for (int i = 0; i < trg_len; ++i) { - Meta_tbl_itm trg_tbl = src_tbls.Get_at(i); - Meta_tbl_itm src_tbl = trg_tbls.Get_by(trg_tbl.Name()); + Dbmeta_tbl_itm trg_tbl = src_tbls.Get_at(i); + Dbmeta_tbl_itm src_tbl = trg_tbls.Get_by(trg_tbl.Name()); if (src_tbl == null) Tbl_create(trg_tbl); } return bfr.To_str_and_clear(); } - private void Tbl_delete(Meta_tbl_itm tbl) { + private void Tbl_delete(Dbmeta_tbl_itm tbl) { bfr.Add_str_a7("DROP TABLE ").Add_str_u8(tbl.Name()).Add_byte_nl(); } - private void Tbl_create(Meta_tbl_itm tbl) { + private void Tbl_create(Dbmeta_tbl_itm tbl) { // sql_bldr.Bld_create_tbl(tbl); } } diff --git a/400_xowa/src/gplx/dbs/cfgs/Db_cfg_tbl.java b/400_xowa/src/gplx/dbs/cfgs/Db_cfg_tbl.java index 96f8d2a5d..d65ab9e63 100644 --- a/400_xowa/src/gplx/dbs/cfgs/Db_cfg_tbl.java +++ b/400_xowa/src/gplx/dbs/cfgs/Db_cfg_tbl.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.dbs.cfgs; import gplx.*; import gplx.dbs.*; import gplx.core.primitives.*; public class Db_cfg_tbl implements Rls_able { - private final String tbl_name; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private final String tbl_name; private final Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); private final String fld_grp, fld_key, fld_val; private Db_stmt stmt_insert, stmt_update, stmt_select; public Db_conn Conn() {return conn;} private final Db_conn conn; @@ -34,10 +34,10 @@ public class Db_cfg_tbl implements Rls_able { stmt_update = Db_stmt_.Rls(stmt_update); stmt_select = Db_stmt_.Rls(stmt_select); } - public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_tbl(tbl_name, "main", fld_grp, fld_key, fld_val)));} + public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "main", fld_grp, fld_key, fld_val)));} public void Delete_val(String grp, String key) {conn.Stmt_delete(tbl_name, fld_grp, fld_key).Crt_str(fld_grp, grp).Crt_str(fld_key, key).Exec_delete();} public void Delete_grp(String grp) {conn.Stmt_delete(tbl_name, fld_grp).Crt_str(fld_grp, grp).Exec_delete();} - public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();} + public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();} public void Insert_yn (String grp, String key, boolean val) {Insert_str(grp, key, val ? "y" : "n");} public void Insert_byte (String grp, String key, byte val) {Insert_str(grp, key, Byte_.To_str(val));} public void Insert_int (String grp, String key, int val) {Insert_str(grp, key, Int_.To_str(val));} diff --git a/400_xowa/src/gplx/dbs/diffs/Gfdb_diff_tbl.java b/400_xowa/src/gplx/dbs/diffs/Gfdb_diff_tbl.java deleted file mode 100644 index cb3543a92..000000000 --- a/400_xowa/src/gplx/dbs/diffs/Gfdb_diff_tbl.java +++ /dev/null @@ -1,34 +0,0 @@ -/* -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.dbs.diffs; import gplx.*; import gplx.dbs.*; -public class Gfdb_diff_tbl { - public Gfdb_diff_tbl(String name, Db_meta_fld[] keys, Db_meta_fld[] vals, Db_rdr rdr) { - this.name = name; this.keys = keys; this.vals = vals; this.rdr = rdr; - int keys_len = keys.length; int vals_len = vals.length; - this.flds = new Db_meta_fld[keys_len + vals_len]; - for (int i = 0; i < keys_len; ++i) - flds[i] = keys[i]; - for (int i = 0; i < vals_len; ++i) - flds[i + keys_len] = vals[i]; - } - public String Name() {return name;} private final String name; - public Db_meta_fld[] Flds() {return flds;} private final Db_meta_fld[] flds; - public Db_meta_fld[] Keys() {return keys;} private final Db_meta_fld[] keys; - public Db_meta_fld[] Vals() {return vals;} private final Db_meta_fld[] vals; - public Db_rdr Rdr() {return rdr;} private final Db_rdr rdr; -} diff --git a/400_xowa/src/gplx/dbs/diffs/Gfdb_rdr_utl_.java b/400_xowa/src/gplx/dbs/diffs/Gfdb_rdr_utl_.java deleted file mode 100644 index 896a2e05b..000000000 --- a/400_xowa/src/gplx/dbs/diffs/Gfdb_rdr_utl_.java +++ /dev/null @@ -1,56 +0,0 @@ -/* -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.dbs.diffs; import gplx.*; import gplx.dbs.*; -public class Gfdb_rdr_utl_ { - public static int Compare(Db_meta_fld[] flds, int len, Db_rdr lhs_rdr, Db_rdr rhs_rdr) { - int comp = CompareAble_.Same; - for (int i = 0; i < len; ++i) { - Db_meta_fld fld = flds[i]; - String fld_name = fld.Name(); - switch (fld.Tid()) { - case Db_meta_fld.Tid_bool: comp = Bool_.Compare (lhs_rdr.Read_bool_by_byte(fld_name), rhs_rdr.Read_bool_by_byte(fld_name)); break; - case Db_meta_fld.Tid_int: comp = Int_.Compare (lhs_rdr.Read_int(fld_name) , rhs_rdr.Read_int(fld_name)); break; - case Db_meta_fld.Tid_long: comp = Long_.Compare (lhs_rdr.Read_long(fld_name) , rhs_rdr.Read_long(fld_name)); break; - case Db_meta_fld.Tid_float: comp = Float_.Compare (lhs_rdr.Read_float(fld_name) , rhs_rdr.Read_float(fld_name)); break; - case Db_meta_fld.Tid_double: comp = Double_.Compare (lhs_rdr.Read_double(fld_name) , rhs_rdr.Read_double(fld_name)); break; - case Db_meta_fld.Tid_str: comp = String_.Compare (lhs_rdr.Read_str(fld_name) , rhs_rdr.Read_str(fld_name)); break; - case Db_meta_fld.Tid_bry: comp = Bry_.Compare (lhs_rdr.Read_bry(fld_name) , rhs_rdr.Read_bry(fld_name)); break; - default: throw Err_.new_unhandled(fld.Tid()); - } - if (comp != CompareAble_.Same) return comp; - } - return CompareAble_.Same; - } - public static void Stmt_args(Db_stmt stmt, Db_meta_fld[] flds, int len, Db_rdr rdr) { - for (int i = 0; i < len; ++i) { - Db_meta_fld fld = flds[i]; - String fld_name = fld.Name(); - switch (fld.Tid()) { - case Db_meta_fld.Tid_bool: stmt.Val_bool_as_byte (fld_name, rdr.Read_bool_by_byte(fld_name)); break; - case Db_meta_fld.Tid_byte: stmt.Val_byte (fld_name, rdr.Read_byte(fld_name)); break; - case Db_meta_fld.Tid_int: stmt.Val_int (fld_name, rdr.Read_int(fld_name)); break; - case Db_meta_fld.Tid_long: stmt.Val_long (fld_name, rdr.Read_long(fld_name)); break; - case Db_meta_fld.Tid_float: stmt.Val_float (fld_name, rdr.Read_float(fld_name)); break; - case Db_meta_fld.Tid_double: stmt.Val_double (fld_name, rdr.Read_double(fld_name)); break; - case Db_meta_fld.Tid_str: stmt.Val_str (fld_name, rdr.Read_str(fld_name)); break; - case Db_meta_fld.Tid_bry: stmt.Val_bry (fld_name, rdr.Read_bry(fld_name)); break; - default: throw Err_.new_unhandled(fld.Tid()); - } - } - } -} diff --git a/400_xowa/src/gplx/dbs/diffs/builds/Gfdb_diff_bldr_tst.java b/400_xowa/src/gplx/dbs/diffs/builds/Gfdb_diff_bldr_tst.java deleted file mode 100644 index db9d5cde9..000000000 --- a/400_xowa/src/gplx/dbs/diffs/builds/Gfdb_diff_bldr_tst.java +++ /dev/null @@ -1,123 +0,0 @@ -/* -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.dbs.diffs.builds; import gplx.*; import gplx.dbs.*; import gplx.dbs.diffs.*; -import org.junit.*; -import gplx.dbs.*; import gplx.dbs.engines.mems.*; -public class Gfdb_diff_bldr_tst { - private final Gfdb_diff_bldr_fxt fxt = new Gfdb_diff_bldr_fxt(); - @Test public void Same() { - fxt.Init__tbl__lhs(Object_.Ary(1, "A") , Object_.Ary(2, "B")); - fxt.Init__tbl__rhs(Object_.Ary(1, "A") , Object_.Ary(2, "B")); - fxt.Test__bld(); - } - @Test public void Update() { - fxt.Init__tbl__lhs(Object_.Ary(1, "A") , Object_.Ary(2, "B")); - fxt.Init__tbl__rhs(Object_.Ary(1, "A1") , Object_.Ary(2, "B1")); - fxt.Test__bld("U|1|A1", "U|2|B1"); - } - @Test public void Insert() { - fxt.Init__tbl__lhs(Object_.Ary(1, "A")); - fxt.Init__tbl__rhs(Object_.Ary(1, "A") , Object_.Ary(2, "B")); - fxt.Test__bld("I|2|B"); - } - @Test public void Delete() { - fxt.Init__tbl__lhs(Object_.Ary(1, "A") , Object_.Ary(2, "B")); - fxt.Init__tbl__rhs(Object_.Ary(1, "A")); - fxt.Test__bld("D|2"); - } - @Test public void Basic() { - fxt.Init__tbl__lhs - ( Object_.Ary(1, "A") - , Object_.Ary(2, "B") - , Object_.Ary(3, "C") - ); - fxt.Init__tbl__rhs - ( Object_.Ary(1, "A") - , Object_.Ary(2, "B1") - , Object_.Ary(4, "D") - ); - fxt.Test__bld("U|2|B1", "D|3", "I|4|D"); - } -} -class Gfdb_diff_bldr_fxt { - private final Gfdb_diff_bldr bldr = new Gfdb_diff_bldr(); - private final Gfdb_diff_wkr__test wkr = new Gfdb_diff_wkr__test(); - private final Db_meta_fld[] key_flds, val_flds; - private Gfdb_diff_tbl lhs_tbl, rhs_tbl; - public Gfdb_diff_bldr_fxt() { - Db_meta_fld_list fld_list = new Db_meta_fld_list(); - fld_list.Add_int("id"); - key_flds = fld_list.To_fld_ary(); - fld_list.Clear(); - fld_list.Add_str("val", 255); - val_flds = fld_list.To_fld_ary(); - bldr.Init(wkr); - } - public void Init__tbl__lhs(Object[]... rows) {this.lhs_tbl = Make__tbl(key_flds, val_flds, rows);} - public void Init__tbl__rhs(Object[]... rows) {this.rhs_tbl = Make__tbl(key_flds, val_flds, rows);} - public void Test__bld(String... expd) { - bldr.Compare(lhs_tbl, rhs_tbl); - Tfds.Eq_ary_str(expd, wkr.To_str_ary()); - } - private static Gfdb_diff_tbl Make__tbl(Db_meta_fld[] keys, Db_meta_fld[] vals, Object[][] rows) { - int keys_len = keys.length; int vals_len = vals.length; - int cols_len = keys_len + vals_len; - String[] cols = new String[cols_len]; - for (int i = 0; i < keys_len; ++i) - cols[i] = keys[i].Name(); - for (int i = 0; i < vals_len; ++i) - cols[i + keys_len] = vals[i].Name(); - - int rows_len = rows.length; - Mem_row[] mem_rows = new Mem_row[rows_len]; - for (int i = 0; i < rows_len; ++i) { - Object[] row = rows[i]; - Mem_row mem_row = new Mem_row(); - mem_rows[i] = mem_row; - for (int j = 0; j < cols_len; ++j) { - Object cell = row[j]; - mem_row.Add(cols[j], cell); - } - } - Db_rdr rdr = new Db_rdr__mem(cols, mem_rows); - return new Gfdb_diff_tbl("tbl1", keys, vals, rdr); - } -} -class Gfdb_diff_wkr__test implements Gfdb_diff_wkr { - private final List_adp list = List_adp_.new_(); - private final Bry_bfr bfr = Bry_bfr.new_(); - private Db_rdr lhs_rdr, rhs_rdr; - public void Init_tbls(Gfdb_diff_tbl lhs_tbl, Gfdb_diff_tbl rhs_tbl) { - this.lhs_rdr = lhs_tbl.Rdr(); this.rhs_rdr = rhs_tbl.Rdr(); - } - public void Term_tbls() {} - public void Handle_same() { - String lhs_val = lhs_rdr.Read_str("val"); - String rhs_val = rhs_rdr.Read_str("val"); - if (!String_.Eq(lhs_val, rhs_val)) - list.Add(bfr.Add_str_a7("U").Add_byte_pipe().Add_obj(lhs_rdr.Read_obj("id")).Add_byte_pipe().Add_str_a7(rhs_val).To_str_and_clear()); - } - public void Handle_lhs_missing() { - String rhs_val = rhs_rdr.Read_str("val"); - list.Add(bfr.Add_str_a7("I").Add_byte_pipe().Add_obj(rhs_rdr.Read_obj("id")).Add_byte_pipe().Add_str_a7(rhs_val).To_str_and_clear()); - } - public void Handle_rhs_missing() { - list.Add(bfr.Add_str_a7("D").Add_byte_pipe().Add_obj(lhs_rdr.Read_obj("id")).To_str_and_clear()); - } - public String[] To_str_ary() {return list.To_str_ary_and_clear();} -} diff --git a/400_xowa/src/gplx/dbs/diffs/builds/Gfdb_diff_rdr_comparer.java b/400_xowa/src/gplx/dbs/diffs/builds/Gfdb_diff_rdr_comparer.java deleted file mode 100644 index 92bc99de4..000000000 --- a/400_xowa/src/gplx/dbs/diffs/builds/Gfdb_diff_rdr_comparer.java +++ /dev/null @@ -1,66 +0,0 @@ -/* -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.dbs.diffs.builds; import gplx.*; import gplx.dbs.*; import gplx.dbs.diffs.*; -class Gfdb_diff_rdr_comparer { - private Db_rdr lhs_rdr, rhs_rdr; - private boolean lhs_rdr_move, rhs_rdr_move; - private boolean lhs_rdr_done, rhs_rdr_done; - private Db_meta_fld[] key_flds; private int key_flds_len; - public void Init(Gfdb_diff_tbl lhs_tbl, Gfdb_diff_tbl rhs_tbl) { - this.lhs_rdr = lhs_tbl.Rdr(); this.rhs_rdr = rhs_tbl.Rdr(); - this.lhs_rdr_move = rhs_rdr_move = Bool_.Y; - this.lhs_rdr_done = rhs_rdr_done = Bool_.N; - this.key_flds = rhs_tbl.Keys(); key_flds_len = key_flds.length; - } - public int Compare() { - if (lhs_rdr_move) { - lhs_rdr_move = lhs_rdr.Move_next(); - if (!lhs_rdr_move) lhs_rdr_done = true; - } - if (rhs_rdr_move) { - rhs_rdr_move = rhs_rdr.Move_next(); - if (!rhs_rdr_move) rhs_rdr_done = true; - } - if (lhs_rdr_done && rhs_rdr_done) return Gfdb_diff_rdr_comparer.Rslt__done; - else if (lhs_rdr_done) {rhs_rdr_move = true; return Gfdb_diff_rdr_comparer.Rslt__lhs_missing;} - else if (rhs_rdr_done) {lhs_rdr_move = true; return Gfdb_diff_rdr_comparer.Rslt__rhs_missing;} - else { - int comp = Gfdb_rdr_utl_.Compare(key_flds, key_flds_len, lhs_rdr, rhs_rdr); - switch (comp) { - case CompareAble_.Same: // lhs == rhs; move both - lhs_rdr_move = rhs_rdr_move = true; - return Gfdb_diff_rdr_comparer.Rslt__same; - case CompareAble_.Less: // lhs < rhs; EX: lhs == 2; rhs == 3 - lhs_rdr_move = true; - rhs_rdr_move = false; - return Gfdb_diff_rdr_comparer.Rslt__rhs_missing; - case CompareAble_.More: // lhs > rhs; EX: lhs == 4; rhs == 3 - lhs_rdr_move = false; - rhs_rdr_move = true; - return Gfdb_diff_rdr_comparer.Rslt__lhs_missing; - default: throw Err_.new_unhandled(comp); - } - } - } - public static final int - Rslt__same = 0 - , Rslt__lhs_missing = 1 - , Rslt__rhs_missing = 2 - , Rslt__done = 3 - ; -} diff --git a/400_xowa/src/gplx/dbs/diffs/merges/Gfdb_diff_cmd.java b/400_xowa/src/gplx/dbs/diffs/merges/Gfdb_diff_cmd.java deleted file mode 100644 index e58d8f3f4..000000000 --- a/400_xowa/src/gplx/dbs/diffs/merges/Gfdb_diff_cmd.java +++ /dev/null @@ -1,123 +0,0 @@ -/* -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.dbs.diffs.merges; import gplx.*; import gplx.dbs.*; import gplx.dbs.diffs.*; -import gplx.core.brys.fmtrs.*; -interface Gfdb_diff_cmd { - void Merge_undo(); - void Merge_exec(); -} -class Gfdb_diff_cmd__insert { -// else if I -// // txn_bgn -// // audit -// INSERT INTO db_temp.page (diff_type, diff, *) -// SELECT 'D', d.page_id, * -// FROM db_diff.page d -// JOIN db_main.page m ON d.page_id = m.page_id -// WHERE d.diff_type = 0 -// AND d.diff_idx BETWEEN lo and hi -// -// // update -// INSERT INTO db_main.page -// SELECT d.page_title -// FROM db_diff.page d -// JOIN db_main.page m -// // txn_end - private Db_conn conn; - private String exec_sql; - public void Init(Db_conn main_conn, Db_conn diff_conn, Db_conn temp_conn, Gfdb_diff_tbl tbl) { - this.conn = temp_conn; - this.exec_sql = ""; -// this.exec_sql = String_.Format(String_.Concat_lines_nl_skip_last -// ( "INSERT INTO db_curr.{tbl}" -// ), Gfdb_diff_cmd_ctx.Alias__curr); - } - public void Merge_exec() { - conn.Exec_sql(exec_sql); - } -} -class Gfdb_diff_cmd_sql_bldr { - private final Bry_fmtr fmtr = Bry_fmtr.new_(); - private final Bry_bfr tmp_bfr = Bry_bfr.new_(); - public void Bld_insert(Bry_bfr bfr, String tbl_name, String[] keys, String[] vals, int rng_bgn, int rng_end) { - fmtr.Fmt_(Insert__fmt).Keys_(Insert__keys); - fmtr.Bld_bfr_many(bfr, tbl_name, Bld_flds(tmp_bfr, ", ", "d.", keys, vals), Bld_join(keys), rng_bgn, rng_end); - } - public void Bld_update(Bry_bfr bfr, String tbl_name, String[] keys, String[] vals, int rng_bgn, int rng_end) { - fmtr.Fmt_(Update__fmt).Keys_(Update__keys); - fmtr.Bld_bfr_many(bfr, tbl_name, Bld_flds(tmp_bfr, ", ", "d.", keys, vals), Bld_join(keys), rng_bgn, rng_end); - } - public void Bld_delete(Bry_bfr bfr, String tbl_name, String[] keys, int rng_bgn, int rng_end) { - fmtr.Fmt_(Delete__fmt).Keys_(Delete__keys); - fmtr.Bld_bfr_many(bfr, tbl_name, Bld_flds(tmp_bfr, " || '|' || ", "", keys, String_.Ary_empty), Bld_flds(tmp_bfr, " || '|' || ", "k.", keys, String_.Ary_empty), Bld_join(keys), rng_bgn, rng_end); - } - private static String Bld_flds(Bry_bfr tmp_bfr, String dlm, String alias, String[] keys, String[] vals) { - int keys_len = keys.length; - for (int i = 0; i < keys_len; ++i) { - String key = keys[i]; - if (i != 0) tmp_bfr.Add_str_a7(dlm); - tmp_bfr.Add_str_a7(alias).Add_str_a7(key); - } - int flds_len = vals.length; - for (int i = 0; i < flds_len; ++i) { - String val = vals[i]; - tmp_bfr.Add_str_a7(dlm); - tmp_bfr.Add_str_a7(alias).Add_str_a7(val); - } - return tmp_bfr.To_str_and_clear(); - } - private String Bld_join(String[] keys) { - int len = keys.length; - for (int i = 0; i < len; ++i) { - String key = keys[i]; - tmp_bfr.Add_str_a7(i == 0 ? " ON " : " AND "); - tmp_bfr.Add_str_a7("k.").Add_str_a7(key).Add_str_a7(" = "); - tmp_bfr.Add_str_a7("d.").Add_str_a7(key); - } - return tmp_bfr.To_str_and_clear(); - } - private static final String[] Insert__keys = String_.Ary("tbl", "flds", "join", "rng_bgn", "rng_end"); - private static final String Insert__fmt = String_.Concat_lines_nl_skip_last - ( "INSERT INTO db_curr.~{tbl}" - , "SELECT ~{flds}" - , "FROM db_temp.~{tbl}_pkey k" - , " JOIN db_diff.~{tbl} d~{join}" - , "WHERE k.diff_type = 1" - , "AND k.diff_uid BETWEEN ~{rng_bgn} AND ~{rng_end};" - ); - private static final String[] Update__keys = String_.Ary("tbl", "flds", "join", "rng_bgn", "rng_end"); - private static final String Update__fmt = String_.Concat_lines_nl_skip_last - ( "REPLACE INTO db_curr.~{tbl}" - , "SELECT ~{flds}" - , "FROM db_temp.~{tbl}_pkey k" - , " JOIN db_diff.~{tbl} d~{join}" - , "WHERE k.diff_type = 2" - , "AND k.diff_uid BETWEEN ~{rng_bgn} AND ~{rng_end};" - ); - private static final String[] Delete__keys = String_.Ary("tbl", "pkey_where", "pkey_select", "join", "rng_bgn", "rng_end"); - private static final String Delete__fmt = String_.Concat_lines_nl_skip_last - ( "DELETE db_curr.~{tbl}" - , "WHERE ~{pkey_where} IN" - , "( SELECT ~{pkey_select}" - , " FROM db_temp.~{tbl}_pkey k" - , " JOIN db_diff.~{tbl} d~{join}" - , " WHERE k.diff_type = 0" - , " AND k.diff_uid BETWEEN ~{rng_bgn} AND ~{rng_end}" - , ");" - ); -} diff --git a/400_xowa/src/gplx/dbs/metas/Schema_db_mgr.java b/400_xowa/src/gplx/dbs/metas/Schema_db_mgr.java index e89867805..0ba27b676 100644 --- a/400_xowa/src/gplx/dbs/metas/Schema_db_mgr.java +++ b/400_xowa/src/gplx/dbs/metas/Schema_db_mgr.java @@ -20,7 +20,7 @@ import gplx.dbs.metas.updates.*; public class Schema_db_mgr { public Schema_loader_mgr Loader() {return loader;} public void Loader_(Schema_loader_mgr v) {loader = v;} private Schema_loader_mgr loader; public Schema_update_mgr Updater() {return updater;} private final Schema_update_mgr updater = new Schema_update_mgr(); - public Meta_tbl_mgr Tbl_mgr() {return tbl_mgr;} private final Meta_tbl_mgr tbl_mgr = new Meta_tbl_mgr(); + public Dbmeta_tbl_mgr Tbl_mgr() {return tbl_mgr;} private final Dbmeta_tbl_mgr tbl_mgr = new Dbmeta_tbl_mgr(); public void Init(Db_conn conn) { loader.Load(this, conn); updater.Update(this, conn); diff --git a/400_xowa/src/gplx/dbs/metas/Schema_loader_mgr_.java b/400_xowa/src/gplx/dbs/metas/Schema_loader_mgr_.java index bdc6015dd..21802bdb7 100644 --- a/400_xowa/src/gplx/dbs/metas/Schema_loader_mgr_.java +++ b/400_xowa/src/gplx/dbs/metas/Schema_loader_mgr_.java @@ -27,21 +27,20 @@ class Schema_loader_mgr__null implements Schema_loader_mgr { class Schema_loader_mgr__sqlite implements Schema_loader_mgr { public void Load(Schema_db_mgr db_mgr, Db_conn conn) { Gfo_usr_dlg_.Instance.Log_many("", "", "db.schema.load.bgn: conn=~{0}", conn.Conn_info().Xto_api()); - Meta_tbl_mgr tbl_mgr = db_mgr.Tbl_mgr(); + Dbmeta_tbl_mgr tbl_mgr = db_mgr.Tbl_mgr(); Db_qry__select_in_tbl qry = Db_qry__select_in_tbl.new_("sqlite_master", String_.Ary_empty, String_.Ary("type", "name", "sql"), Db_qry__select_in_tbl.Order_by_null); Db_rdr rdr = conn.Stmt_new(qry).Exec_select__rls_auto(); try { while (rdr.Move_next()) { String type_str = rdr.Read_str("type"); String name = rdr.Read_str("name"); - String sql = rdr.Read_str("sql"); - int type_int = Meta_itm_tid.Xto_int(type_str); + int type_int = Dbmeta_itm_tid.Xto_int(type_str); switch (type_int) { - case Meta_itm_tid.Tid_table: - Meta_tbl_itm tbl_itm = new Meta_tbl_itm(name, sql); + case Dbmeta_itm_tid.Tid_table: + Dbmeta_tbl_itm tbl_itm = Dbmeta_tbl_itm.New(name); tbl_mgr.Add(tbl_itm); break; - case Meta_itm_tid.Tid_index: break; // noop for now + case Dbmeta_itm_tid.Tid_index: break; // noop for now default: throw Err_.new_unhandled(type_str); } } diff --git a/400_xowa/src/gplx/dbs/metas/updates/Schema_update_mgr_tst.java b/400_xowa/src/gplx/dbs/metas/updates/Schema_update_mgr_tst.java index ce699a577..cabddd6f2 100644 --- a/400_xowa/src/gplx/dbs/metas/updates/Schema_update_mgr_tst.java +++ b/400_xowa/src/gplx/dbs/metas/updates/Schema_update_mgr_tst.java @@ -23,7 +23,7 @@ public class Schema_update_mgr_tst { fxt.Test_exec_y(new Schema_update_cmd__mock()); } @Test public void Delete() { - fxt.Init_itm(Meta_itm_tid.Tid_table, Schema_update_cmd__mock.Tbl_name); + fxt.Init_itm(Dbmeta_itm_tid.Tid_table, Schema_update_cmd__mock.Tbl_name); fxt.Test_exec_n(new Schema_update_cmd__mock()); } } @@ -34,7 +34,7 @@ class Schema_update_mgr_fxt { db_mgr = new Schema_db_mgr(); } public void Init_itm(int tid, String name) { - db_mgr.Tbl_mgr().Add(new Meta_tbl_itm(name, "sql")); + db_mgr.Tbl_mgr().Add(Dbmeta_tbl_itm.New(name)); } public void Test_exec_y(Schema_update_cmd cmd) {Test_exec(cmd, Bool_.Y);} public void Test_exec_n(Schema_update_cmd cmd) {Test_exec(cmd, Bool_.N);} diff --git a/400_xowa/src/gplx/fsdb/data/Fsd_bin_tbl.java b/400_xowa/src/gplx/fsdb/data/Fsd_bin_tbl.java index 407852290..21223f446 100644 --- a/400_xowa/src/gplx/fsdb/data/Fsd_bin_tbl.java +++ b/400_xowa/src/gplx/fsdb/data/Fsd_bin_tbl.java @@ -20,7 +20,7 @@ import gplx.core.primitives.*; import gplx.core.envs.*; import gplx.dbs.*; import gplx.core.ios.*; import gplx.dbs.engines.sqlite.*; public class Fsd_bin_tbl implements Rls_able { - private final String tbl_name = "fsdb_bin"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private final String tbl_name = "fsdb_bin"; private final Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); private final String fld_owner_id, fld_owner_tid, fld_part_id, fld_data_url, fld_data; private Db_conn conn; private Db_stmt stmt_insert, stmt_select; private Bry_bfr tmp_bfr; private final Bool_obj_ref saved_in_parts = Bool_obj_ref.n_(); @@ -37,7 +37,7 @@ public class Fsd_bin_tbl implements Rls_able { stmt_insert = Db_stmt_.Rls(stmt_insert); stmt_select = Db_stmt_.Rls(stmt_select); } - public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds));} + public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds));} public void Insert_bgn() {conn.Txn_bgn("fsdb_bin__insert"); stmt_insert = conn.Stmt_insert(tbl_name, flds);} public void Insert_commit() {conn.Txn_sav();} public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} diff --git a/400_xowa/src/gplx/fsdb/data/Fsd_dir_tbl.java b/400_xowa/src/gplx/fsdb/data/Fsd_dir_tbl.java index fa093eaa0..32e95494d 100644 --- a/400_xowa/src/gplx/fsdb/data/Fsd_dir_tbl.java +++ b/400_xowa/src/gplx/fsdb/data/Fsd_dir_tbl.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.fsdb.data; import gplx.*; import gplx.fsdb.*; import gplx.dbs.*; public class Fsd_dir_tbl implements Rls_able { - private final String tbl_name = "fsdb_dir"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private final String tbl_name = "fsdb_dir"; private final Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); private final String fld_id, fld_owner_id, fld_name; private final Db_conn conn; private Db_stmt stmt_insert, stmt_update, stmt_select_by_name; public Fsd_dir_tbl(Db_conn conn, boolean schema_is_1) { @@ -35,8 +35,8 @@ public class Fsd_dir_tbl implements Rls_able { } public void Create_tbl() { conn.Ddl_create_tbl - ( Db_meta_tbl.new_(tbl_name, flds - , Db_meta_idx.new_normal_by_tbl(tbl_name, "name", fld_name, fld_owner_id, fld_id))); + ( Dbmeta_tbl_itm.New(tbl_name, flds + , Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, "name", fld_name, fld_owner_id, fld_id))); } public void Insert(int id, byte[] name, int owner_id) { if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds); diff --git a/400_xowa/src/gplx/fsdb/data/Fsd_fil_tbl.java b/400_xowa/src/gplx/fsdb/data/Fsd_fil_tbl.java index bd2f3b8f1..f474f7e23 100644 --- a/400_xowa/src/gplx/fsdb/data/Fsd_fil_tbl.java +++ b/400_xowa/src/gplx/fsdb/data/Fsd_fil_tbl.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.fsdb.data; import gplx.*; import gplx.fsdb.*; import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.dbs.engines.sqlite.*; public class Fsd_fil_tbl implements Rls_able { - private final String tbl_name = "fsdb_fil"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private final String tbl_name = "fsdb_fil"; private final Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); private final String fld_id, fld_owner_id, fld_name, fld_xtn_id, fld_ext_id, fld_size, fld_modified, fld_hash, fld_bin_db_id; private final String idx_owner; private Db_conn conn; private Db_stmt stmt_insert, stmt_update, stmt_select_by_name; private int mnt_id; @@ -33,7 +33,7 @@ public class Fsd_fil_tbl implements Rls_able { this.fld_size = flds.Add_long ("fil_size"); this.fld_modified = flds.Add_str ("fil_modified", 14); // stored as yyyyMMddHHmmss this.fld_hash = flds.Add_str ("fil_hash", 40); - this.idx_owner = Db_meta_idx.Bld_idx_name(tbl_name, "owner"); + this.idx_owner = Dbmeta_idx_itm.Bld_idx_name(tbl_name, "owner"); conn.Rls_reg(this); } public void Rls() { @@ -42,8 +42,8 @@ public class Fsd_fil_tbl implements Rls_able { stmt_select_by_name = Db_stmt_.Rls(stmt_select_by_name); } public void Create_tbl() { - conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds - , Db_meta_idx.new_unique_by_name(tbl_name, idx_owner, fld_owner_id, fld_name, fld_id) + conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds + , Dbmeta_idx_itm.new_unique_by_name(tbl_name, idx_owner, fld_owner_id, fld_name, fld_id) )); } public void Insert(int id, int owner_id, byte[] name, int xtn_id, int ext_id, long size, int bin_db_id) { @@ -89,7 +89,7 @@ public class Fsd_fil_tbl implements Rls_able { finally {rdr.Rls();} } public void Select_all(Bry_bfr key_bfr, gplx.core.caches.Gfo_cache_mgr_bry cache) { - Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empty).Exec_select__rls_auto(); + Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Dbmeta_fld_itm.Str_ary_empty).Exec_select__rls_auto(); try { while (rdr.Move_next()) { Fsd_fil_itm fil = new_(mnt_id, rdr); diff --git a/400_xowa/src/gplx/fsdb/data/Fsd_thm_tbl.java b/400_xowa/src/gplx/fsdb/data/Fsd_thm_tbl.java index bf07463f7..738e85124 100644 --- a/400_xowa/src/gplx/fsdb/data/Fsd_thm_tbl.java +++ b/400_xowa/src/gplx/fsdb/data/Fsd_thm_tbl.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.fsdb.data; import gplx.*; import gplx.fsdb.*; import gplx.dbs.*; import gplx.fsdb.meta.*; import gplx.xowa.files.*; public class Fsd_thm_tbl implements Rls_able { - private final String tbl_name; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private final String tbl_name; private final Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); private final String fld_id, fld_owner_id, fld_w, fld_h, fld_time, fld_page, fld_bin_db_id, fld_size, fld_modified, fld_hash; private final Db_conn conn; private Db_stmt stmt_insert, stmt_select_by_fil_exact, stmt_select_by_fil_near; private int mnt_id; private boolean schema_thm_page; public Fsd_thm_tbl(Db_conn conn, boolean schema_is_1, int mnt_id, boolean schema_thm_page) { @@ -34,7 +34,7 @@ public class Fsd_thm_tbl implements Rls_able { } else { this.fld_time = flds.Add_int ("thm_thumbtime"); - this.fld_page = Db_meta_fld.Key_null; + this.fld_page = Dbmeta_fld_itm.Key_null; } this.fld_bin_db_id = flds.Add_int ("thm_bin_db_id"); this.fld_size = flds.Add_long ("thm_size"); @@ -48,8 +48,8 @@ public class Fsd_thm_tbl implements Rls_able { stmt_select_by_fil_near = Db_stmt_.Rls(stmt_select_by_fil_near); } public void Create_tbl() { - conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds - , Db_meta_idx.new_unique_by_tbl(tbl_name, "owner", fld_owner_id, fld_id, fld_w, fld_time, fld_page) + conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds + , Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "owner", fld_owner_id, fld_id, fld_w, fld_time, fld_page) )); } public void Insert(int id, int thm_owner_id, int width, int height, double thumbtime, int page, int bin_db_id, long size) { diff --git a/400_xowa/src/gplx/fsdb/meta/Fsm_atr_tbl.java b/400_xowa/src/gplx/fsdb/meta/Fsm_atr_tbl.java index 2ce02a81c..a8a22fe6d 100644 --- a/400_xowa/src/gplx/fsdb/meta/Fsm_atr_tbl.java +++ b/400_xowa/src/gplx/fsdb/meta/Fsm_atr_tbl.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.fsdb.meta; import gplx.*; import gplx.fsdb.*; import gplx.dbs.*; import gplx.dbs.qrys.*; public class Fsm_atr_tbl { - private final String tbl_name; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private final String tbl_name; private final Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); private final String fld_uid, fld_url; private final Db_conn conn; public Fsm_atr_tbl(Db_conn conn, boolean schema_is_1) { @@ -29,9 +29,9 @@ public class Fsm_atr_tbl { this.fld_uid = flds.Add_int_pkey (fld_prefix + "uid"); this.fld_url = flds.Add_str (fld_prefix + "url", 255); } - public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds));} + public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds));} public Fsm_atr_fil Select_1st_or_fail(Fsm_mnt_itm mnt_itm, Fsdb_db_mgr core_mgr, int mnt_id, boolean schema_thm_page) { - Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empty).Exec_select__rls_auto(); + Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Dbmeta_fld_itm.Str_ary_empty).Exec_select__rls_auto(); boolean schema_is_1 = core_mgr.File__schema_is_1(); try { if (rdr.Move_next()) { diff --git a/400_xowa/src/gplx/fsdb/meta/Fsm_bin_tbl.java b/400_xowa/src/gplx/fsdb/meta/Fsm_bin_tbl.java index 56f85ef7c..5b7735f71 100644 --- a/400_xowa/src/gplx/fsdb/meta/Fsm_bin_tbl.java +++ b/400_xowa/src/gplx/fsdb/meta/Fsm_bin_tbl.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.fsdb.meta; import gplx.*; import gplx.fsdb.*; import gplx.dbs.*; import gplx.dbs.qrys.*; public class Fsm_bin_tbl { - private final String tbl_name; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private final String tbl_name; private final Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); private final String fld_uid, fld_url, fld_bin_len, fld_bin_max; private final Db_conn conn; private int mnt_id; public Fsm_bin_tbl(Db_conn conn, boolean schema_is_1, int mnt_id) { @@ -33,17 +33,17 @@ public class Fsm_bin_tbl { fld_bin_max = flds.Add_long("bin_max"); } else { - fld_bin_len = Db_meta_fld.Key_null; - fld_bin_max = Db_meta_fld.Key_null; + fld_bin_len = Dbmeta_fld_itm.Key_null; + fld_bin_max = Dbmeta_fld_itm.Key_null; } } - public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds));} + public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds));} public void Insert(int id, String url_rel) { conn.Stmt_insert(tbl_name, flds).Crt_int(fld_uid, id).Val_str(fld_url, url_rel).Val_long(fld_bin_len, 0).Val_long(fld_bin_max, 0).Exec_insert(); } public Fsm_bin_fil[] Select_all(Fsdb_db_mgr db_conn_mgr) { List_adp rv = List_adp_.new_(); - Db_rdr rdr = conn.Stmt_select_order(tbl_name, flds, Db_meta_fld.Ary_empty, fld_uid).Clear().Exec_select__rls_auto(); + Db_rdr rdr = conn.Stmt_select_order(tbl_name, flds, Dbmeta_fld_itm.Str_ary_empty, fld_uid).Clear().Exec_select__rls_auto(); try { while (rdr.Move_next()) { int bin_id = rdr.Read_int(fld_uid); diff --git a/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_tbl.java b/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_tbl.java index 5627815fd..82e057626 100644 --- a/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_tbl.java +++ b/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_tbl.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.fsdb.meta; import gplx.*; import gplx.fsdb.*; import gplx.dbs.*; public class Fsm_mnt_tbl implements Rls_able { - private final String tbl_name = "fsdb_mnt"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private final String tbl_name = "fsdb_mnt"; private final Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); private final String fld_id, fld_name, fld_url; private final Db_conn conn; public Fsm_mnt_tbl(Db_conn conn, boolean schema_is_1) { @@ -29,7 +29,7 @@ public class Fsm_mnt_tbl implements Rls_able { conn.Rls_reg(this); } public void Create_tbl() { - Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds); + Dbmeta_tbl_itm meta = Dbmeta_tbl_itm.New(tbl_name, flds); conn.Ddl_create_tbl(meta); this.Insert(Fsm_mnt_mgr.Mnt_idx_main, Mnt_name_main, Mnt_name_main); this.Insert(Fsm_mnt_mgr.Mnt_idx_user, Mnt_name_user, Mnt_name_user); @@ -45,7 +45,7 @@ public class Fsm_mnt_tbl implements Rls_able { } public Fsm_mnt_itm[] Select_all() { List_adp list = List_adp_.new_(); - Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empty).Clear().Exec_select__rls_auto(); + Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Dbmeta_fld_itm.Str_ary_empty).Clear().Exec_select__rls_auto(); try { while (rdr.Move_next()) { Fsm_mnt_itm itm = new Fsm_mnt_itm(rdr.Read_int(fld_id), rdr.Read_str(fld_name), rdr.Read_str(fld_url)); diff --git a/400_xowa/src/gplx/langs/htmls/docs/Gfh_tag.java b/400_xowa/src/gplx/langs/htmls/docs/Gfh_tag.java index 481db36b3..5458da909 100644 --- a/400_xowa/src/gplx/langs/htmls/docs/Gfh_tag.java +++ b/400_xowa/src/gplx/langs/htmls/docs/Gfh_tag.java @@ -85,6 +85,10 @@ public class Gfh_tag implements Mwh_atr_wkr { byte[] rv_val = rv.Val(); return style_wkr.Parse(rv_val, 0, rv_val.length, key); } + public boolean Atrs__has(byte[] key) { + if (atrs_null) Atrs__make(); + return atrs_hash.Get_by(key) != null; + } public byte[] Atrs__get_as_bry(byte[] key) { if (atrs_null) Atrs__make(); Gfh_atr rv = (Gfh_atr)atrs_hash.Get_by(key); diff --git a/400_xowa/src/gplx/langs/htmls/docs/Gfh_tag_rdr.java b/400_xowa/src/gplx/langs/htmls/docs/Gfh_tag_rdr.java index 780ddded4..0f9ba2562 100644 --- a/400_xowa/src/gplx/langs/htmls/docs/Gfh_tag_rdr.java +++ b/400_xowa/src/gplx/langs/htmls/docs/Gfh_tag_rdr.java @@ -34,14 +34,14 @@ public class Gfh_tag_rdr { public int Pos() {return pos;} private int pos; public void Pos_(int v) {this.pos = v;} public void Atrs__make(Mwh_atr_wkr atr_wkr, int head_bgn, int head_end) {atr_parser.Parse(atr_wkr, -1, -1, src, head_bgn, head_end);} - public Gfh_tag Tag__move_fwd_head() {return Tag__find(Bool_.Y, Bool_.N, Bool_.N, pos, src_end, Gfh_tag_.Id__any);} + public Gfh_tag Tag__move_fwd_head() {return Tag__find(Bool_.Y, Bool_.N, Bool_.N, pos, src_end, Gfh_tag_.Id__any);} public Gfh_tag Tag__move_fwd_head(int match_name_id) {return Tag__find(Bool_.Y, Bool_.N, Bool_.N, pos, src_end, match_name_id);} public Gfh_tag Tag__move_fwd_tail(int match_name_id) {return Tag__find(Bool_.Y, Bool_.N, Bool_.Y, pos, src_end, match_name_id);} - public Gfh_tag Tag__peek_fwd_head() {return Tag__find(Bool_.N, Bool_.N, Bool_.N, pos, src_end, Gfh_tag_.Id__any);} + public Gfh_tag Tag__peek_fwd_head() {return Tag__find(Bool_.N, Bool_.N, Bool_.N, pos, src_end, Gfh_tag_.Id__any);} public Gfh_tag Tag__peek_fwd_head(int match_name_id) {return Tag__find(Bool_.N, Bool_.N, Bool_.N, pos, src_end, match_name_id);} public Gfh_tag Tag__peek_fwd_tail(int match_name_id) {return Tag__find(Bool_.N, Bool_.N, Bool_.Y, pos, src_end, match_name_id);} public Gfh_tag Tag__peek_bwd_tail(int match_name_id) {return Tag__find(Bool_.N, Bool_.Y, Bool_.Y, pos, src_end, match_name_id);} - public Gfh_tag Tag__peek_bwd_head() {return Tag__find(Bool_.N, Bool_.Y, Bool_.Y, pos, src_end, Gfh_tag_.Id__any);} + public Gfh_tag Tag__peek_bwd_head() {return Tag__find(Bool_.N, Bool_.Y, Bool_.Y, pos, src_end, Gfh_tag_.Id__any);} public Gfh_tag Tag__find_fwd_head(int bgn, int end, int match_name_id) {return Tag__find(Bool_.N, Bool_.N, Bool_.N, bgn, end, match_name_id);} private Gfh_tag Tag__find(boolean move, boolean bwd, boolean tail, int rng_bgn, int rng_end, int match_name_id) { int tmp = rng_bgn; diff --git a/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder_.java b/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder_.java index bcc681ed1..73bf469f7 100644 --- a/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder_.java +++ b/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder_.java @@ -58,8 +58,7 @@ public class Gfo_url_encoder_ { ( Byte_ascii.Semic, Byte_ascii.Colon, Byte_ascii.At, Byte_ascii.Dollar, Byte_ascii.Bang, Byte_ascii.Star , Byte_ascii.Paren_bgn, Byte_ascii.Paren_end, Byte_ascii.Comma, Byte_ascii.Slash , Byte_ascii.Question, Byte_ascii.Eq, Byte_ascii.Hash, Byte_ascii.Plus// NOTE: not part of wfUrlEncode; not sure where this is specified; needed for A#b - ) - ; + ); } public static Gfo_url_encoder_mkr New__http_url() { return new Gfo_url_encoder_mkr().Init(Byte_ascii.Percent).Init_common(Bool_.N) diff --git a/400_xowa/src/gplx/langs/htmls/styles/Gfh_style_parser_.java b/400_xowa/src/gplx/langs/htmls/styles/Gfh_style_parser_.java index 0b3c87704..6159e1471 100644 --- a/400_xowa/src/gplx/langs/htmls/styles/Gfh_style_parser_.java +++ b/400_xowa/src/gplx/langs/htmls/styles/Gfh_style_parser_.java @@ -24,32 +24,45 @@ public class Gfh_style_parser_ { Parse(tag.Src(), atr.Val_bgn(), atr.Val_end(), wkr); } public static void Parse(byte[] src, int src_bgn, int src_end, Gfh_style_wkr wkr) { - int atr_idx = 0, key_bgn = -1, key_end = -1, tmp_bgn = -1, tmp_end = -1; + int atr_idx = 0, itm_bgn = -1, itm_end = -1, key_bgn = -1, key_end = -1, tmp_bgn = -1, tmp_end = -1; int pos = src_bgn; while (true) { boolean pos_is_last = pos == src_end; byte b = pos_is_last ? Byte_ascii.Semic : src[pos]; switch (b) { case Byte_ascii.Semic: - if (key_bgn != -1) { // ignore empty atrs - if (!wkr.On_atr(src, atr_idx, src_bgn, src_end, key_bgn, key_end, tmp_bgn, tmp_end)) + if (tmp_bgn != -1) { // tmp_bgn == -1 if all ws + if (key_bgn == -1) { // handle malformed key-only pairs; EX: "style='center'" + key_bgn = tmp_bgn; + key_end = tmp_end; + tmp_bgn = tmp_end = -1; + } + if (!wkr.On_atr(src, atr_idx, src_bgn, src_end, itm_bgn, itm_end, key_bgn, key_end, tmp_bgn, tmp_end)) pos_is_last = true; } - ++atr_idx; key_bgn = -1; key_end = -1; tmp_bgn = -1; tmp_end = -1; + ++atr_idx; itm_bgn = itm_end = key_bgn = key_end = tmp_bgn = tmp_end = -1; break; case Byte_ascii.Colon: - key_bgn = tmp_bgn; - key_end = tmp_end; - tmp_bgn = -1; tmp_end = -1; + if (key_bgn == -1) { + key_bgn = tmp_bgn; + key_end = tmp_end; + tmp_bgn = -1; tmp_end = -1; + } break; - case Byte_ascii.Tab: case Byte_ascii.Nl: case Byte_ascii.Cr: case Byte_ascii.Space: + case Byte_ascii.Tab: case Byte_ascii.Nl: case Byte_ascii.Cr: case Byte_ascii.Space: + if (itm_bgn == -1) itm_bgn = pos; break; default: + if (itm_bgn == -1) itm_bgn = pos; if (tmp_bgn == -1) tmp_bgn = pos; tmp_end = pos + 1; break; } - if (pos_is_last) break; + if (pos_is_last) { + if (key_bgn != -1) // handle "k" + wkr.On_atr(src, atr_idx, src_bgn, src_end, itm_bgn, itm_end, key_bgn, key_end, tmp_bgn, tmp_end); + break; + } ++pos; } } diff --git a/400_xowa/src/gplx/langs/htmls/styles/Gfh_style_parser__tst.java b/400_xowa/src/gplx/langs/htmls/styles/Gfh_style_parser__tst.java index 9a9bbe228..4ecf6a0f3 100644 --- a/400_xowa/src/gplx/langs/htmls/styles/Gfh_style_parser__tst.java +++ b/400_xowa/src/gplx/langs/htmls/styles/Gfh_style_parser__tst.java @@ -33,6 +33,12 @@ public class Gfh_style_parser__tst { fxt.Test__parse("k_0:v_0;;" , fxt.Make("k_0", "v_0")); fxt.Test__parse("k_0:v_0; ; " , fxt.Make("k_0", "v_0")); } + @Test public void Invalid__no_semic() { + fxt.Test__parse("k_0" , fxt.Make("k_0", "")); + } + @Test public void Invalid__dupe_colon() { + fxt.Test__parse("a:b:c:d;" , fxt.Make("a", "b:c:d")); + } } class Gfh_style_parser__fxt { private final Gfh_style_wkr__ary wkr = Gfh_style_wkr__ary.Instance; diff --git a/400_xowa/src/gplx/langs/htmls/styles/Gfh_style_wkr.java b/400_xowa/src/gplx/langs/htmls/styles/Gfh_style_wkr.java index 3b8ddad9a..6c13d3e65 100644 --- a/400_xowa/src/gplx/langs/htmls/styles/Gfh_style_wkr.java +++ b/400_xowa/src/gplx/langs/htmls/styles/Gfh_style_wkr.java @@ -17,5 +17,5 @@ along with this program. If not, see . */ package gplx.langs.htmls.styles; import gplx.*; import gplx.langs.*; import gplx.langs.htmls.*; public interface Gfh_style_wkr { - boolean On_atr(byte[] src, int atr_idx, int atr_bgn, int atr_end, int key_bgn, int key_end, int val_bgn, int val_end); + boolean On_atr(byte[] src, int atr_idx, int atr_val_bgn, int atr_val_end, int itm_bgn, int itm_End, int key_bgn, int key_end, int val_bgn, int val_end); } diff --git a/400_xowa/src/gplx/langs/htmls/styles/Gfh_style_wkr__ary.java b/400_xowa/src/gplx/langs/htmls/styles/Gfh_style_wkr__ary.java index 87c5c5bda..aba512243 100644 --- a/400_xowa/src/gplx/langs/htmls/styles/Gfh_style_wkr__ary.java +++ b/400_xowa/src/gplx/langs/htmls/styles/Gfh_style_wkr__ary.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.langs.htmls.styles; import gplx.*; import gplx.langs.*; import gplx.langs.htmls.*; public class Gfh_style_wkr__ary implements Gfh_style_wkr { private final List_adp list = List_adp_.new_(); - public boolean On_atr(byte[] src, int atr_idx, int atr_bgn, int atr_end, int key_bgn, int key_end, int val_bgn, int val_end) { + public boolean On_atr(byte[] src, int atr_idx, int atr_val_bgn, int atr_val_end, int itm_bgn, int itm_End, int key_bgn, int key_end, int val_bgn, int val_end) { byte[] key = Bry_.Mid(src, key_bgn, key_end); byte[] val = Bry_.Mid(src, val_bgn, val_end); list.Add(new Gfh_style_itm(list.Count(), key, val)); diff --git a/400_xowa/src/gplx/langs/htmls/styles/Gfh_style_wkr__val_as_int.java b/400_xowa/src/gplx/langs/htmls/styles/Gfh_style_wkr__val_as_int.java index fa60c68cc..cf9687302 100644 --- a/400_xowa/src/gplx/langs/htmls/styles/Gfh_style_wkr__val_as_int.java +++ b/400_xowa/src/gplx/langs/htmls/styles/Gfh_style_wkr__val_as_int.java @@ -19,7 +19,7 @@ package gplx.langs.htmls.styles; import gplx.*; import gplx.langs.*; import gplx public class Gfh_style_wkr__val_as_int implements Gfh_style_wkr { private byte[] find_key; private int val_bgn, val_end; - public boolean On_atr(byte[] src, int atr_idx, int atr_bgn, int atr_end, int key_bgn, int key_end, int val_bgn, int val_end) { + public boolean On_atr(byte[] src, int atr_idx, int atr_val_bgn, int atr_val_end, int itm_bgn, int itm_End, int key_bgn, int key_end, int val_bgn, int val_end) { boolean rv = Bry_.Match(src, key_bgn, key_end, find_key); if (rv) { this.val_bgn = val_bgn; diff --git a/400_xowa/src/gplx/langs/mustaches/Mustache_dom_itm.java b/400_xowa/src/gplx/langs/mustaches/Mustache_dom_itm.java new file mode 100644 index 000000000..eeb964582 --- /dev/null +++ b/400_xowa/src/gplx/langs/mustaches/Mustache_dom_itm.java @@ -0,0 +1,71 @@ +/* +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.langs.mustaches; import gplx.*; import gplx.langs.*; +/* +root +txt +key +txt +section + txt + key + txt +txt +*/ +interface Mustache_elem_itm { + int Tid(); + byte[] Key(); + Mustache_elem_itm[] Subs(); +} +class Mustache_elem_itm_ {// for types, see http://mustache.github.io/mustache.5.html + public static final int Tid__root = 0, Tid__text = 1, Tid__variable = 2, Tid__escape = 3, Tid__section = 4, Tid__inverted = 5, Tid__comment = 6, Tid__partial = 7, Tid__delimiter = 8; + public static final Mustache_elem_itm[] Ary_empty = new Mustache_elem_itm[0]; +} +abstract class Mustache_elem_base implements Mustache_elem_itm { + public Mustache_elem_base(int tid, byte[] key) {this.tid = tid; this.key = key;} + public int Tid() {return tid;} private final int tid; + public byte[] Key() {return key;} private final byte[] key; + @gplx.Virtual public Mustache_elem_itm[] Subs() {return Mustache_elem_itm_.Ary_empty;} +} +class Mustache_elem_text extends Mustache_elem_base { // EX: text -> text + public Mustache_elem_text(byte[] val) {super(Mustache_elem_itm_.Tid__text, Bry_.Empty); + this.val = val; + } + public byte[] Val() {return val;} private final byte[] val; +} +class Mustache_elem_val extends Mustache_elem_base { // EX: {{variable}} -> <a> + public Mustache_elem_val(byte[] key) {super(Mustache_elem_itm_.Tid__variable, key);} +} +class Mustache_elem_escape extends Mustache_elem_base { // EX: {{{variable}}} -> + public Mustache_elem_escape(byte[] key) {super(Mustache_elem_itm_.Tid__escape, key);} +} +class Mustache_elem_section extends Mustache_elem_base { // EX: {{#section}}val{{/section}} -> val (if boolean) or valvalval (if list) + public Mustache_elem_section(byte[] key) {super(Mustache_elem_itm_.Tid__section, key);} +} +class Mustache_elem_inverted extends Mustache_elem_base { // EX: {{^section}}missing{{/section}} -> missing + public Mustache_elem_inverted(byte[] key) {super(Mustache_elem_itm_.Tid__inverted, key);} +} +class Mustache_elem_comment extends Mustache_elem_base { // EX: {{!section}}commentent{{/section}} -> + public Mustache_elem_comment(byte[] key) {super(Mustache_elem_itm_.Tid__inverted, key);} +} +class Mustache_elem_partial extends Mustache_elem_base { // EX: {{>a}} -> abc (deferred eval) + public Mustache_elem_partial(byte[] key) {super(Mustache_elem_itm_.Tid__partial, key);} +} +class Mustache_elem_delimiter extends Mustache_elem_base {// EX: {{=<% %>=}} -> <% variable %> + public Mustache_elem_delimiter(byte[] key) {super(Mustache_elem_itm_.Tid__delimiter, key);} +} diff --git a/400_xowa/src/gplx/xowa/Xoa_app.java b/400_xowa/src/gplx/xowa/Xoa_app.java index 39e05ace2..f0dfa728e 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app.java +++ b/400_xowa/src/gplx/xowa/Xoa_app.java @@ -53,6 +53,6 @@ public interface Xoa_app extends GfoInvkAble { Bry_bfr_mkr Utl__bfr_mkr(); Json_parser Utl__json_parser(); Gfo_inet_conn Utl__inet_conn(); - Xoa_meta_mgr Meta_mgr(); + Xoa_meta_mgr Dbmeta_mgr(); Xoa_site_cfg_mgr Site_cfg_mgr(); } diff --git a/400_xowa/src/gplx/xowa/Xoa_app_.java b/400_xowa/src/gplx/xowa/Xoa_app_.java index e11c28f3c..5fd7d284d 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app_.java +++ b/400_xowa/src/gplx/xowa/Xoa_app_.java @@ -34,7 +34,7 @@ public class Xoa_app_ { } } public static final String Name = "xowa"; - public static final String Version = "3.1.1.1"; + public static final String Version = "3.1.3.1"; public static String Build_date = "2012-12-30 00:00:00"; public static String Op_sys_str; public static String User_agent = ""; diff --git a/400_xowa/src/gplx/xowa/Xoa_app_fxt.java b/400_xowa/src/gplx/xowa/Xoa_app_fxt.java index 6647f14de..28f56f2a2 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app_fxt.java +++ b/400_xowa/src/gplx/xowa/Xoa_app_fxt.java @@ -71,7 +71,7 @@ public class Xoa_app_fxt { public static Xowe_wiki wiki_(Xoae_app app, String key, Xol_lang_itm lang) { Io_url wiki_dir = app.Fsys_mgr().Wiki_dir().GenSubDir(key); Xowe_wiki rv = new Xowe_wiki(app, lang, Xow_ns_mgr_.default_(lang.Case_mgr()), Xow_domain_itm_.parse(Bry_.new_u8(key)), wiki_dir); - rv.File_mgr().Meta_mgr().Depth_(2); // TEST: written for 2 depth + rv.File_mgr().Dbmeta_mgr().Depth_(2); // TEST: written for 2 depth rv.Props().Main_page_(Xoa_page_.Main_page_bry); // TEST: default to Main Page (nothing tests loading Main Page from wiki.gfs) rv.Ns_mgr().Ids_get_or_null(Xow_ns_.Tid__main).Subpages_enabled_(true); app.Wiki_mgr().Add(rv); diff --git a/400_xowa/src/gplx/xowa/Xoa_ttl.java b/400_xowa/src/gplx/xowa/Xoa_ttl.java index 6c267d522..5e9680c76 100644 --- a/400_xowa/src/gplx/xowa/Xoa_ttl.java +++ b/400_xowa/src/gplx/xowa/Xoa_ttl.java @@ -36,6 +36,11 @@ public class Xoa_ttl { // PAGE:en.w:http://en.wikipedia.org/wiki/Help:Link; REF. return Bry_.Mid(full_txt, bgn, end); } public byte[] Full_txt_raw() {return full_txt;} private byte[] full_txt = Bry_.Empty; + public byte[] Full_db_wo_xwiki() { + byte[] rv = Bry_.Mid(full_txt, wik_bgn == -1 ? 0 : ns_bgn == -1 ? page_bgn - 1 : ns_bgn - 1, full_txt.length); + Bry_.Replace_reuse(rv, Byte_ascii.Space, Byte_ascii.Underline); + return rv; + } public byte[] Page_txt_w_anchor() {return Bry_.Mid(full_txt, page_bgn, qarg_bgn == -1 ? full_txt.length : qarg_bgn - 1);} public byte[] Page_txt() {return Bry_.Mid(full_txt, page_bgn, anch_bgn == -1 ? full_txt.length : anch_bgn - 1);} public byte[] Page_db() { @@ -372,7 +377,8 @@ public class Xoa_ttl { // PAGE:en.w:http://en.wikipedia.org/wiki/Help:Link; REF. return true; } public static byte[] Replace_spaces(byte[] raw) {return Bry_.Replace(raw, Byte_ascii.Space, Byte_ascii.Underline);} - public static byte[] Replace_unders(byte[] raw) {return Bry_.Replace(raw, Byte_ascii.Underline, Byte_ascii.Space);} + public static byte[] Replace_unders(byte[] raw) {return Replace_unders(raw, 0, raw.length);} + public static byte[] Replace_unders(byte[] raw, int bgn, int end) {return Bry_.Replace(raw, bgn, end, Byte_ascii.Underline, Byte_ascii.Space);} private int wik_bgn = -1, ns_bgn = -1, page_bgn = 0, leaf_bgn = -1, anch_bgn = -1, root_bgn = -1; private byte[] tors_txt; public static final int Wik_bgn_int = -1; @@ -392,7 +398,7 @@ class Xoa_ttl_trie { rv.Add(Byte_ascii.Underline , Byte_obj_val.new_(Id_underline)); rv.Add(Byte_ascii.Amp , Byte_obj_val.new_(Id_amp)); rv.Add(Xop_comm_lxr.Bgn_ary , Byte_obj_val.new_(Id_comment_bgn)); - rv.Add(Byte_ascii.Nl , Byte_obj_val.new_(Id_newLine)); + rv.Add(Byte_ascii.Nl , Byte_obj_val.new_(Id_newLine)); rv.Add(Byte_ascii.Brack_bgn , Byte_obj_val.new_(Id_invalid)); rv.Add(Byte_ascii.Curly_bgn , Byte_obj_val.new_(Id_invalid)); return rv; diff --git a/400_xowa/src/gplx/xowa/Xoae_app.java b/400_xowa/src/gplx/xowa/Xoae_app.java index 8fcdabfe4..718c9597d 100644 --- a/400_xowa/src/gplx/xowa/Xoae_app.java +++ b/400_xowa/src/gplx/xowa/Xoae_app.java @@ -81,7 +81,7 @@ public class Xoae_app implements Xoa_app, GfoInvkAble { public Bry_bfr_mkr Utl__bfr_mkr() {return Xoa_app_.Utl__bfr_mkr();} public Json_parser Utl__json_parser() {return utl__json_parser;} private final Json_parser utl__json_parser = new Json_parser(); public Gfo_inet_conn Utl__inet_conn() {return inet_conn;} private final Gfo_inet_conn inet_conn = Gfo_inet_conn_.new_(); - public Xoa_meta_mgr Meta_mgr() {return meta_mgr;} private final Xoa_meta_mgr meta_mgr; + public Xoa_meta_mgr Dbmeta_mgr() {return meta_mgr;} private final Xoa_meta_mgr meta_mgr; public boolean Bldr__running() {return bldr__running;} public void Bldr__running_(boolean v) {this.bldr__running = v;} private boolean bldr__running; public Xoa_parser_mgr Parser_mgr() {return parser_mgr;} private final Xoa_parser_mgr parser_mgr = new Xoa_parser_mgr(); public Xoa_site_cfg_mgr Site_cfg_mgr() {return site_cfg_mgr;} private final Xoa_site_cfg_mgr site_cfg_mgr; diff --git a/400_xowa/src/gplx/xowa/Xowe_wiki.java b/400_xowa/src/gplx/xowa/Xowe_wiki.java index 40b2e0308..871bebbb5 100644 --- a/400_xowa/src/gplx/xowa/Xowe_wiki.java +++ b/400_xowa/src/gplx/xowa/Xowe_wiki.java @@ -148,7 +148,7 @@ public class Xowe_wiki implements Xow_wiki, GfoInvkAble, GfoEvObj { public Xoi_dump_mgr Import_mgr() {return import_mgr;} private Xoi_dump_mgr import_mgr = new Xoi_dump_mgr(); public Xow_maint_mgr Maint_mgr() {return maint_mgr;} private Xow_maint_mgr maint_mgr; public void Clear_for_tests() { // NOTE: these are structures that cache items for PERF; need to be cleared out for multiple test runs - file_mgr.Meta_mgr().Clear(); + file_mgr.Dbmeta_mgr().Clear(); db_mgr.Load_mgr().Clear(); } public Xodb_mgr_sql Db_mgr_create_as_sql() {Xodb_mgr_sql rv = new Xodb_mgr_sql(this); db_mgr = rv; return rv;} diff --git a/400_xowa/src/gplx/xowa/apps/Xoav_app.java b/400_xowa/src/gplx/xowa/apps/Xoav_app.java index 3cbfd05d5..4b56e4afa 100644 --- a/400_xowa/src/gplx/xowa/apps/Xoav_app.java +++ b/400_xowa/src/gplx/xowa/apps/Xoav_app.java @@ -62,10 +62,10 @@ public class Xoav_app implements Xoa_app, GfoInvkAble { public Xoh_lnki_bldr Html__lnki_bldr() {return html__lnki_bldr;} private final Xoh_lnki_bldr html__lnki_bldr; public Xoa_css_extractor Html__css_installer() {return html__css_installer;} private final Xoa_css_extractor html__css_installer = new Xoa_css_extractor(); public Xoh_bridge_mgr Html__bridge_mgr() {return html__bridge_mgr;} private final Xoh_bridge_mgr html__bridge_mgr; - public Xoa_meta_mgr Meta_mgr() {return meta_mgr;} private final Xoa_meta_mgr meta_mgr; + public Xoa_meta_mgr Dbmeta_mgr() {return meta_mgr;} private final Xoa_meta_mgr meta_mgr; public Gfo_inet_conn Utl__inet_conn() {return inet_conn;} private final Gfo_inet_conn inet_conn = Gfo_inet_conn_.new_(); public Xoa_site_cfg_mgr Site_cfg_mgr() {return site_cfg_mgr;} private final Xoa_site_cfg_mgr site_cfg_mgr; - public boolean Xwiki_mgr__missing(byte[] domain) {return wiki_mgr.Get_by_domain(domain) == null;} + public boolean Xwiki_mgr__missing(byte[] domain) {return wiki_mgr.Get_by_or_null(domain) == null;} public Xoa_sitelink_mgr Xwiki_mgr__sitelink_mgr() {return xwiki_mgr__sitelink_mgr;} private final Xoa_sitelink_mgr xwiki_mgr__sitelink_mgr = new Xoa_sitelink_mgr(); public Xow_xwiki_itm_parser Xwiki_mgr__itm_parser() {return xwiki_mgr__itm_parser;} private final Xow_xwiki_itm_parser xwiki_mgr__itm_parser = new Xow_xwiki_itm_parser(); diff --git a/400_xowa/src/gplx/xowa/apps/Xoav_wiki_mgr.java b/400_xowa/src/gplx/xowa/apps/Xoav_wiki_mgr.java index 1a4f6ed86..1b14481a0 100644 --- a/400_xowa/src/gplx/xowa/apps/Xoav_wiki_mgr.java +++ b/400_xowa/src/gplx/xowa/apps/Xoav_wiki_mgr.java @@ -21,16 +21,24 @@ import gplx.xowa.wikis.*; public class Xoav_wiki_mgr implements Xoa_wiki_mgr, GfoInvkAble { private final Xoav_app app; private final Ordered_hash hash = Ordered_hash_.New_bry(); public Xoav_wiki_mgr(Xoav_app app, Xol_case_mgr case_mgr) {this.app = app;} - public int Count() {return hash.Count();} - public Xow_wiki Get_at_i(int i) {return (Xow_wiki)hash.Get_at(i);} - public Xowv_wiki Get_by_domain(byte[] domain) {return (Xowv_wiki)hash.Get_by(domain);} - public Xowv_wiki Import_by_fil(Io_url fil) { + public int Count() {return hash.Count();} + public boolean Has(byte[] key) {return hash.Has(key);} + public Xow_wiki Get_at(int idx) {return (Xow_wiki)hash.Get_at(idx);} + public Xow_wiki Get_by_or_null(byte[] key) {return (Xow_wiki)hash.Get_by(key);} + public Xow_wiki Get_by_or_make_init_y(byte[] key) { + Xow_wiki rv = this.Get_by_or_null(key); + // if (rv == null) rv = New_wiki(key); // TODO: must init wiki, but need wiki_url; DATE:2015-05-23 + return rv; + } + public Xow_wiki Get_by_or_make_init_n(byte[] key) {return Get_by_or_make_init_y(key);} + public void Add(Xow_wiki wiki) {hash.Add_if_dupe_use_nth(wiki.Domain_bry(), wiki);} + public Xow_wiki Load_by_fil(Io_url fil) { Io_url wiki_dir = fil.OwnerDir(); - Xowv_wiki rv = Load(Gen_domain_str(fil.NameOnly()), wiki_dir); + Xow_wiki rv = Load(Gen_domain_str(fil.NameOnly()), wiki_dir); app.User().User_db_mgr().Site_mgr().Import(rv.Domain_str(), rv.Domain_str(), wiki_dir.Raw(), ""); return rv; } - public void Load_by_user_data() { + public void Load_by_user_data() { Xoud_site_row[] ary = app.User().User_db_mgr().Site_mgr().Get_all(); int len = ary.length; for (int i = 0; i < len; ++i) { @@ -38,34 +46,14 @@ public class Xoav_wiki_mgr implements Xoa_wiki_mgr, GfoInvkAble { Load(itm.Domain(), Io_url_.new_dir_(itm.Path())); } } - public Xowv_wiki Load_by_fil(Io_url fil) { - return Load(Gen_domain_str(fil.NameOnly()), fil.OwnerDir()); - } - public boolean Has(byte[] key) {return hash.Has(key);} - public Xow_wiki Get_by_key_or_null_i(byte[] key) {return (Xowv_wiki)hash.Get_by(key);} - public Xow_wiki Get_by_key_or_make_init_y(byte[] key) { - Xow_wiki rv = this.Get_by_domain(key); - // if (rv == null) rv = New_wiki(key); // TODO: must init wiki, but need wiki_url; DATE:2015-05-23 - return rv; - } - public Xow_wiki Get_by_key_or_make_init_n(byte[] key) {return Get_by_key_or_make_init_y(key);} - public void Load_by_dir(Io_url wiki_root_dir) { - Io_url[] wiki_dirs = Io_mgr.Instance.QueryDir_args(wiki_root_dir).DirOnly_().ExecAsUrlAry(); - for (Io_url wiki_dir : wiki_dirs) { - String wiki_dir_url = wiki_dir.Raw(); - if (String_.Has_at_bgn(wiki_dir_url, "#")) continue; - Load(wiki_dir.NameOnly(), wiki_dir); - } - } - private Xowv_wiki Load(String domain_str, Io_url wiki_dir) { + private Xow_wiki Load(String domain_str, Io_url wiki_dir) { byte[] domain_bry = Bry_.new_u8(domain_str); - Xowv_wiki rv = new Xowv_wiki(app, domain_bry, wiki_dir); + Xow_wiki rv = new Xowv_wiki(app, domain_bry, wiki_dir); hash.Add_if_dupe_use_nth(domain_bry, rv); return rv; } - public void Add(Xow_wiki wiki) {hash.Add_if_dupe_use_nth(wiki.Domain_bry(), wiki);} public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_import_by_fil)) return Import_by_fil(Io_url_.new_fil_(m.ReadStr("v"))); + if (ctx.Match(k, Invk_import_by_fil)) return Load_by_fil(Io_url_.new_fil_(m.ReadStr("v"))); else return GfoInvkAble_.Rv_unhandled; } public static final String Invk_import_by_fil = "import_by_fil"; diff --git a/400_xowa/src/gplx/xowa/apps/cfgs/Xoa_cfg_mgr.java b/400_xowa/src/gplx/xowa/apps/cfgs/Xoa_cfg_mgr.java index 337baf0c7..eb31b96e7 100644 --- a/400_xowa/src/gplx/xowa/apps/cfgs/Xoa_cfg_mgr.java +++ b/400_xowa/src/gplx/xowa/apps/cfgs/Xoa_cfg_mgr.java @@ -63,7 +63,7 @@ public class Xoa_cfg_mgr implements GfoInvkAble { int wiki_count = app.Wiki_mgri().Count(); boolean rv = true; for (int i = 0; i < wiki_count; i++) { - Xow_wiki wiki = app.Wiki_mgri().Get_at_i(i); + Xow_wiki wiki = app.Wiki_mgri().Get_at(i); if (all || wiki.Domain_tid() == grp_tid.Wiki_tid()) { if (!Eval_set(wiki, grp.Key_str(), itm.Val())) rv = false; @@ -71,7 +71,7 @@ public class Xoa_cfg_mgr implements GfoInvkAble { } return rv; case Xoa_cfg_grp_tid.Tid_wiki: { - Xow_wiki wiki = app.Wiki_mgri().Get_by_key_or_null_i(itm.Key()); + Xow_wiki wiki = app.Wiki_mgri().Get_by_or_null(itm.Key()); if (wiki == null) return true; // wiki not installed; return true (no error) return Eval_set(wiki, grp.Key_str(), itm.Val()); } diff --git a/400_xowa/src/gplx/xowa/apps/cfgs/Xoa_cfg_mgr_tst.java b/400_xowa/src/gplx/xowa/apps/cfgs/Xoa_cfg_mgr_tst.java index e14b5ac89..da5a6e839 100644 --- a/400_xowa/src/gplx/xowa/apps/cfgs/Xoa_cfg_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/apps/cfgs/Xoa_cfg_mgr_tst.java @@ -54,7 +54,7 @@ class Xoa_cfg_mgr_fxt { itm.Val_(val); } public Xowe_wiki Exec_make_wiki(String wiki_key_str) {return Exec_make_wiki(Bry_.new_a7(wiki_key_str));} - public Xowe_wiki Exec_make_wiki(byte[] wiki_key_bry) {return app.Wiki_mgr().Get_by_key_or_make(wiki_key_bry);} + public Xowe_wiki Exec_make_wiki(byte[] wiki_key_bry) {return app.Wiki_mgr().Get_by_or_make(wiki_key_bry);} public void Test_init_wiki(String wiki_key_str, String itm_key_str, String expd_val) { byte[] wiki_key_bry = Bry_.new_a7(wiki_key_str); Xowe_wiki wiki = Exec_make_wiki(wiki_key_bry); diff --git a/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_mgr.java b/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_mgr.java index c39529f71..1233ecdc7 100644 --- a/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_mgr.java +++ b/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_mgr.java @@ -92,7 +92,7 @@ public class Http_server_mgr implements GfoInvkAble { public String Parse_page_to_html(Http_data__client data__client, byte[] wiki_domain, byte[] page_ttl) { synchronized (thread_lock) { Init_gui(); - Xowe_wiki wiki = (Xowe_wiki)app.Wiki_mgr().Get_by_key_or_make_init_y(wiki_domain); // get the wiki; assert init for Main_Page; EX:click zh.w on wiki sidebar; DATE:2015-07-19 + Xowe_wiki wiki = (Xowe_wiki)app.Wiki_mgr().Get_by_or_make_init_y(wiki_domain); // get the wiki; assert init for Main_Page; EX:click zh.w on wiki sidebar; DATE:2015-07-19 if (Env_.System_memory_total() > Io_mgr.Len_gb) Xow_wiki_.Rls_mem(wiki, true); // release memory at 1 GB; DATE:2015-09-11 if (Bry_.Len_eq_0(page_ttl)) page_ttl = wiki.Props().Main_page(); Xoa_url page_url = wiki.Utl__url_parser().Parse(page_ttl); // get the url (needed for query args) diff --git a/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_wkr_.java b/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_wkr_.java index aa6d7707c..d2cc00017 100644 --- a/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_wkr_.java +++ b/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_wkr_.java @@ -29,7 +29,7 @@ class Http_server_wkr_ { byte[] wiki_domain = Bry_.new_u8(req_array[1]); Xow_domain_itm domain_itm = Xow_domain_itm_.parse(wiki_domain); if (domain_itm.Domain_type_id() == Xow_domain_tid_.Int__other && domain_itm.Lang_actl_itm().Id() == Xol_lang_stub_.Id__intl) return req; - Xowe_wiki wiki = app.Wiki_mgr().Get_by_key_or_make(wiki_domain); + Xowe_wiki wiki = app.Wiki_mgr().Get_by_or_make(wiki_domain); wiki.Init_assert(); String main_page = String_.new_u8(wiki.Props().Main_page()); if (mode == 1) main_page = "/" + main_page; diff --git a/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_wkr__tst.java b/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_wkr__tst.java index d60f44b62..a601b00ab 100644 --- a/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_wkr__tst.java +++ b/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_wkr__tst.java @@ -33,7 +33,7 @@ class Http_server_wkr__fxt { this.app = Xoa_app_fxt.app_(); } public void Init_wiki_main_page(String domain, String main_page) { - Xowe_wiki wiki = app.Wiki_mgr().Get_by_key_or_make(Bry_.new_u8(domain)); + Xowe_wiki wiki = app.Wiki_mgr().Get_by_or_make(Bry_.new_u8(domain)); wiki.Props().Main_page_(Bry_.new_u8(main_page)); } public void Test_assert_main_page(String url, String expd) { diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser.java b/400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser.java index f9ee2aac6..6792683e3 100644 --- a/400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser.java +++ b/400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser.java @@ -50,7 +50,7 @@ public class Xoa_url_parser { Xow_xwiki_itm xwiki_itm = app.User().Wikii().Xwiki_mgr().Get_by_key(wiki_bry); if (xwiki_itm == null) {Xoa_url_.Invalid_warn(str); return null;} // if wiki doesn't exist, warn and return nothing; DATE:2015-08-25 if (rv.Page_is_main()) { // Main_Page requested; EX: "zh.wikipedia.org"; "zh.wikipedia.org/wiki/"; DATE:2014-02-16 - Xow_wiki wiki_itm = app.Wiki_mgri().Get_by_key_or_make_init_y(wiki_bry); // NOTE: must call Init to load Main_Page; only call if from url_bar, else all sister wikis will be loaded when parsing Sister_wikis panel + Xow_wiki wiki_itm = app.Wiki_mgri().Get_by_or_make_init_y(wiki_bry); // NOTE: must call Init to load Main_Page; only call if from url_bar, else all sister wikis will be loaded when parsing Sister_wikis panel rv.Page_bry_(wiki_itm.Props().Main_page()); } return rv; @@ -241,10 +241,10 @@ public class Xoa_url_parser { if (colon_pos == Bry_find_.Not_found) return null; // no colon Xow_wiki alias_wiki = wiki; // default alias_wiki to cur_wiki if (!tmp_wiki_is_missing) // tmp_wiki exists; use it for alias wikis; DATE:2015-09-17 - alias_wiki = wiki.App().Wiki_mgri().Get_by_key_or_make_init_n(tmp_wiki); + alias_wiki = wiki.App().Wiki_mgri().Get_by_or_make_init_n(tmp_wiki); Xow_xwiki_itm alias_itm = alias_wiki.Xwiki_mgr().Get_by_mid(bry, 0, colon_pos); // check for alias; if (alias_itm == null) return null; // colon-word is not alias; EX:A:B - Xow_ns_mgr ns_mgr = tmp_wiki_is_missing ? wiki.Ns_mgr() : wiki.App().Meta_mgr().Ns__get_or_load(tmp_wiki); + Xow_ns_mgr ns_mgr = tmp_wiki_is_missing ? wiki.Ns_mgr() : wiki.App().Dbmeta_mgr().Ns__get_or_load(tmp_wiki); if (ns_mgr.Names_get_or_null(alias_itm.Key_bry()) != null) // special case to handle collision between "wikipedia" alias and "Wikipedia" namespace; if alias exists as ns, ignore it; EX:sv.wikipedia.org/wiki/Wikipedia:Main_Page DATE:2015-07-31 return null; byte[] rv = Bry_.Mid(bry, colon_pos + 1); diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser_fxt.java b/400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser_fxt.java index ce6ebe0a1..072477cbf 100644 --- a/400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser_fxt.java +++ b/400_xowa/src/gplx/xowa/apps/urls/Xoa_url_parser_fxt.java @@ -44,7 +44,7 @@ public class Xoa_url_parser_fxt { return this; } public Xow_ns_mgr Prep_get_ns_mgr_from_meta(String wiki) { - return app.Meta_mgr().Ns__get_or_load(Bry_.new_u8(wiki)); + return app.Dbmeta_mgr().Ns__get_or_load(Bry_.new_u8(wiki)); } public Xoa_url_parser_fxt Run_parse(String actl_str) {return Run_parse(cur_wiki, actl_str);} public Xoa_url_parser_fxt Run_parse(Xow_wiki wiki, String actl_str) { diff --git a/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_base.java b/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_base.java new file mode 100644 index 000000000..f19b5d005 --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_base.java @@ -0,0 +1,27 @@ +/* +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.bldrs; import gplx.*; import gplx.xowa.*; +public abstract class Xob_cmd_base implements Xob_cmd { + public abstract String Cmd_key(); + @gplx.Virtual public void Cmd_init(Xob_bldr bldr) {} + @gplx.Virtual public void Cmd_bgn(Xob_bldr bldr) {} + @gplx.Virtual public void Cmd_run() {} + @gplx.Virtual public void Cmd_end() {} + @gplx.Virtual public void Cmd_term() {} + @gplx.Virtual public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {return GfoInvkAble_.Rv_unhandled;} +} diff --git a/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_keys.java b/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_keys.java index e184b8b09..007f86290 100644 --- a/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_keys.java +++ b/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_keys.java @@ -56,6 +56,7 @@ public class Xob_cmd_keys { , Key_site_meta = "util.site_meta" , Key_diff_build = "diff.build" , Key_diff_merge = "diff.merge" + , Key_text_delete_page = "text.delete_page" , Key_tdb_text_init = "tdb.text.init" // "core.init" , Key_tdb_make_page = "tdb.text.page" // "core.make_page" diff --git a/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_mgr.java b/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_mgr.java index 3d980b3ea..cd0046201 100644 --- a/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_mgr.java +++ b/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_mgr.java @@ -37,6 +37,7 @@ public class Xob_cmd_mgr implements GfoInvkAble { else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_text_cat_link)) return Add(new Xob_categorylinks_sql(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_text_cat_hidden)) return Add(new Xoctg_hiddencat_parser_sql(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_text_term)) return Add(new Xob_term_cmd(bldr, wiki)); + else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_text_delete_page)) return Add(new Xob_page_delete_cmd(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_wiki_page_dump_make)) return Add(new Xob_page_dump_cmd_make(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_wiki_page_dump_drop)) return Add(new Xob_page_dump_cmd_drop(bldr, wiki)); else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_wiki_redirect)) return Add(new Xob_redirect_cmd(bldr, wiki)); @@ -142,7 +143,7 @@ public class Xob_cmd_mgr implements GfoInvkAble { private Xowe_wiki Wiki_get_or_make(GfoMsg m) { byte[] wiki_key = m.ReadBry("v"); Xoae_wiki_mgr wiki_mgr = bldr.App().Wiki_mgr(); - Xowe_wiki rv = wiki_mgr.Get_by_key_or_make(wiki_key); + Xowe_wiki rv = wiki_mgr.Get_by_or_make(wiki_key); rv.Lang().Init_by_load(); return rv; } diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/diffs/Bfr_arg__dump_dir.java b/400_xowa/src/gplx/xowa/bldrs/cmds/diffs/Bfr_arg__dump_dir.java new file mode 100644 index 000000000..69470ee30 --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/diffs/Bfr_arg__dump_dir.java @@ -0,0 +1,40 @@ +/* +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.bldrs.cmds.diffs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; +import gplx.core.brys.*; import gplx.xowa.wikis.*; +class Bfr_arg__dump_dir implements Bfr_arg { // .dump_dir = "C:\xowa\wiki\en.wikipedia.org" + private final Xow_wiki wiki; + public Bfr_arg__dump_dir(Xow_wiki wiki) {this.wiki = wiki;} + public void Bfr_arg__add(Bry_bfr bfr) { + bfr.Add(wiki.Fsys_mgr().Root_dir().RawBry()); + } +} +class Bfr_arg__dump_core implements Bfr_arg {// .dump_core = "en.wikipedia.org-core.xowa" + private final Xow_wiki wiki; + public Bfr_arg__dump_core(Xow_wiki wiki) {this.wiki = wiki;} + public void Bfr_arg__add(Bry_bfr bfr) { + bfr.Add(wiki.Data__core_mgr().Db__core().Url().RawBry()); + } +} +class Bfr_arg__dump_domain implements Bfr_arg {// .dump_domain = en.wikipedia.org + private final Xow_wiki wiki; + public Bfr_arg__dump_domain(Xow_wiki wiki) {this.wiki = wiki;} + public void Bfr_arg__add(Bry_bfr bfr) { + bfr.Add(wiki.Domain_bry()); + } +} diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/diffs/Xob_diff_build_wkr.java b/400_xowa/src/gplx/xowa/bldrs/cmds/diffs/Xob_diff_build_wkr.java index c27f28368..ce24842f8 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/diffs/Xob_diff_build_wkr.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/diffs/Xob_diff_build_wkr.java @@ -17,39 +17,54 @@ along with this program. If not, see . */ package gplx.xowa.bldrs.cmds.diffs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.core.brys.*; import gplx.core.brys.fmtrs.*; -import gplx.dbs.*; import gplx.dbs.diffs.*; import gplx.dbs.diffs.builds.*; +import gplx.dbs.*; import gplx.dbs.metas.*; import gplx.dbs.diffs.*; import gplx.dbs.diffs.builds.*; class Xob_diff_build_wkr { - private final Gfdb_diff_bldr diff_bldr = new Gfdb_diff_bldr(); - private Db_conn prev_conn, curr_conn, diff_conn; - public Xob_diff_build_wkr(Xob_bldr bldr, Xowe_wiki wiki, String prev_url, String curr_url, String diff_url, int commit_interval) { + private final Gfdb_diff_bldr dif_bldr = new Gfdb_diff_bldr(); + private Db_conn prv_conn, cur_conn, dif_conn; + public Xob_diff_build_wkr(Xob_bldr bldr, Xowe_wiki wiki, String prv_url, String cur_url, String dif_url, int commit_interval) { Bry_fmt url_fmt = Bry_fmt.New("").Args_(New_url_args(wiki)); Bry_bfr tmp_bfr = Bry_bfr.new_(); - prev_conn = New_conn(wiki, url_fmt, prev_url, tmp_bfr); - curr_conn = New_conn(wiki, url_fmt, curr_url, tmp_bfr); - diff_conn = New_conn(wiki, url_fmt, diff_url, tmp_bfr); - // get Gfdb_diff_tbl; format urls - Tfds.Write(prev_conn, curr_conn, diff_conn); + prv_conn = New_conn(Bool_.N, wiki, url_fmt, prv_url, tmp_bfr); + cur_conn = New_conn(Bool_.N, wiki, url_fmt, cur_url, tmp_bfr); + dif_conn = New_conn(Bool_.Y, wiki, url_fmt, dif_url, tmp_bfr); + Tfds.Dbg(prv_conn, cur_conn, dif_conn); } public void Exec() { - diff_bldr.Init(null); // diff_db_wkr - diff_bldr.Compare(null, null); // lhs_tbl, rhs_tbl + Gfdb_diff_db dif_db = new Gfdb_diff_db(dif_conn); + Gfdb_diff_wkr__db dif_wkr = new Gfdb_diff_wkr__db(); + dif_wkr.Init_conn(dif_db, 1000); + dif_bldr.Init(dif_wkr); + Dbmeta_tbl_mgr prv_tbl_mgr = prv_conn.Meta_tbl_load_all(); + Dbmeta_tbl_mgr cur_tbl_mgr = prv_conn.Meta_tbl_load_all(); + int cur_tbl_len = cur_tbl_mgr.Len(); + for (int i = 0; i < cur_tbl_len; ++i) { + Dbmeta_tbl_itm cur_tbl = cur_tbl_mgr.Get_at(i); + Dbmeta_tbl_itm prv_tbl = prv_tbl_mgr.Get_by(cur_tbl.Name()); if (prv_tbl == null) continue; + Gfdb_diff_tbl dif_tbl = Gfdb_diff_tbl.New(cur_tbl); + dif_bldr.Compare(dif_tbl, prv_conn, cur_conn); + } + int prv_tbl_len = prv_tbl_mgr.Len(); + for (int i = 0; i < prv_tbl_len; ++i) { + Dbmeta_tbl_itm prv_tbl = prv_tbl_mgr.Get_at(i); + Dbmeta_tbl_itm cur_tbl = cur_tbl_mgr.Get_by(prv_tbl.Name()); + if (cur_tbl == null) { + // delete all + } + } } - public static Db_conn New_conn(Xow_wiki wiki, Bry_fmt fmtr, String url_fmt, Bry_bfr tmp_bfr) { + public static Db_conn New_conn(boolean autocreate, Xow_wiki wiki, Bry_fmt fmtr, String url_fmt, Bry_bfr tmp_bfr) { fmtr.Fmt_(url_fmt).Bld_bfr_many(tmp_bfr); - Db_conn conn = Db_conn_pool.Instance.Get_or_new(tmp_bfr.To_str_and_clear()); - return conn; + return Db_conn_bldr.Instance.Get_or_autocreate(autocreate, Io_url_.new_any_(tmp_bfr.To_str_and_clear())); } private static Bfr_fmt_arg[] New_url_args(Xow_wiki wiki) { - return null; + Bfr_fmt_arg[] rv = new Bfr_fmt_arg[] + { new Bfr_fmt_arg(Bry_.new_a7(".dump_dir"), new Bfr_arg__dump_dir(wiki)) + , new Bfr_fmt_arg(Bry_.new_a7(".dump_core"), new Bfr_arg__dump_core(wiki)) + , new Bfr_fmt_arg(Bry_.new_a7(".dump_domain"), new Bfr_arg__dump_domain(wiki)) + }; + return rv; } - //prev_url='~{.dump_dir}-prev/~{.dump_core}'; - //curr_url='~{.dump_dir}/~{.dump_core}'; - //diff_url='~{.dump_dir}/~{.dump_domain}-diff.xowa'; + //prv_url='~{.dump_dir}-prev/~{.dump_core}'; + //cur_url='~{.dump_dir}/~{.dump_core}'; + //dif_url='~{.dump_dir}/~{.dump_domain}-diff.xowa'; } -// class Bfr_arg__dump_dir : Bfr_arg { -// public void Bfr_arg__add(Bry_bfr bfr) { -// // dump_dir = bfr.Add("C:\xowa\wiki\en.wikipedia.org"); -// // dump_core = en.wikipedia.org-core.xowa -// // dump_domain = en.wikipedia.org -// } -// } diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/diffs/Xob_diff_manifest.java b/400_xowa/src/gplx/xowa/bldrs/cmds/diffs/Xob_diff_manifest.java new file mode 100644 index 000000000..c5396e33e --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/diffs/Xob_diff_manifest.java @@ -0,0 +1,49 @@ +/* +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.bldrs.cmds.diffs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; +import gplx.dbs.*; import gplx.dbs.metas.*; import gplx.dbs.diffs.*; +class Xob_diff_manifest { + // page|page_id|* + public static Gfdb_diff_tbl[] Parse(Db_conn conn, String src_str) { +// byte[][] rows_ary = Bry_split_.Split_lines(Bry_.new_u8(src_str)); +// int rows_len = rows_ary.length; +// for (int i = 0; i < rows_len; ++i) { +// byte[] row = rows_ary[i]; +// byte[][] itms_ary = Bry_split_.Split(row, Byte_ascii.Pipe); +// byte[] tbl_name = itms_ary[0]; +// conn.Meta_tbl_exists +// int itms_len = itms_ary.length; +// for (int j = 0; j < itms_len; ++j) { +// byte[] itm = itms_ary[j]; +// Tfds.Dbg(itm); +// } +// Gfdb_diff_tbl tbl = new Gfdb_diff_tbl(String_.new_u8(itms_ary[0]),keys, vals, Db_rdr_.Empty); +// } + return null; + } +} +/* +class Wkr { + public void Make() { + sdif_db_mgr sdif_db = new Sdif_db_mgr(conn); + for (int i = 0; i < rhs_tbl_len; ++i) { + + } + } +} +*/ diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_diff_regy_exec_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_diff_regy_exec_cmd.java index 6e7053086..0cf8736d8 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_diff_regy_exec_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_diff_regy_exec_cmd.java @@ -60,7 +60,7 @@ class Xob_diff_regy_sql_runner { fsdb_db_tid = Fsdb_db_tid_.Xto_tid(parts[2]); } public void Run_sql(Xoae_app app) { - Xowe_wiki wiki = app.Wiki_mgr().Get_by_key_or_null(Bry_.new_u8(wiki_domain)); + Xowe_wiki wiki = (Xowe_wiki)app.Wiki_mgr().Get_by_or_null(Bry_.new_u8(wiki_domain)); app.Usr_dlg().Prog_many("", "", "running sql: url=~{0}", url.NameAndExt()); Db_conn conn = Get_conn(wiki, fsdb_db_id, fsdb_db_tid); conn.Exec_sql(Io_mgr.Instance.LoadFilStr(url)); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_diff_regy_make_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_diff_regy_make_cmd.java index d99526526..755a6474a 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_diff_regy_make_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_diff_regy_make_cmd.java @@ -35,8 +35,8 @@ public class Xob_diff_regy_make_cmd extends Xob_itm_basic_base implements Xob_cm } private void Make_join_indexes(Db_conn make_db_provider) { try { - make_db_provider.Ddl_create_idx(Db_meta_idx.new_normal_by_name("fsdb_regy", "fsdb_regy__join", "fsdb_name", "fsdb_is_orig", "fsdb_repo", "fsdb_w", "fsdb_time", "fsdb_page")); - make_db_provider.Ddl_create_idx(Db_meta_idx.new_normal_by_name("xfer_regy", "xfer_regy__join", "lnki_ttl", "file_is_orig", "orig_repo", "file_w", "lnki_time", "lnki_page")); + make_db_provider.Ddl_create_idx(Dbmeta_idx_itm.new_normal_by_name("fsdb_regy", "fsdb_regy__join", "fsdb_name", "fsdb_is_orig", "fsdb_repo", "fsdb_w", "fsdb_time", "fsdb_page")); + make_db_provider.Ddl_create_idx(Dbmeta_idx_itm.new_normal_by_name("xfer_regy", "xfer_regy__join", "lnki_ttl", "file_is_orig", "orig_repo", "file_w", "lnki_time", "lnki_page")); } catch (Exception exc) { app.Usr_dlg().Warn_many("", "", "error while making indexes: err=~{0}", Err_.Message_gplx_full(exc)); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_tbl.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_tbl.java index 51a961662..320efdb30 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_tbl.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.bldrs.cmds.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.dbs.*; import gplx.xowa.files.*; class Xob_lnki_temp_tbl { - private static final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private static final Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); private static final String Tbl_name = "lnki_temp"; public static final String Fld_lnki_id = flds.Add_int_pkey_autonum("lnki_id"); // NOTE: insertion order index; public b/c not used and want to bypass warning @@ -39,7 +39,7 @@ class Xob_lnki_temp_tbl { private Db_stmt stmt_insert; public Xob_lnki_temp_tbl(Db_conn conn) {this.conn = conn;} public Db_conn Conn() {return conn;} private final Db_conn conn; - public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(Tbl_name, flds));} + public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(Tbl_name, flds));} public void Insert_bgn() {conn.Txn_bgn("bldr__lnki_temp"); stmt_insert = conn.Stmt_insert(Tbl_name, flds);} public void Insert_commit() {conn.Txn_sav();} public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr.java index 6ad5c61d0..09befb9dc 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr.java @@ -57,7 +57,7 @@ public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements Xopg_redlink wiki.Html_mgr().Page_wtr_mgr().Wkr(Xopg_page_.Tid_read).Ctgs_enabled_(false); // disable categories else progress messages written (also for PERF) if (wiki.File__bin_mgr() != null) wiki.File__bin_mgr().Wkrs__del(gplx.xowa.files.bins.Xof_bin_wkr_.Key_http_wmf); // remove wmf wkr, else will try to download images during parsing - commons_wiki = app.Wiki_mgr().Get_by_key_or_make(Xow_domain_itm_.Bry__commons); + commons_wiki = app.Wiki_mgr().Get_by_or_make(Xow_domain_itm_.Bry__commons); Xop_log_mgr log_mgr = ctx.App().Log_mgr(); log_mgr.Log_dir_(wiki.Fsys_mgr().Root_dir()); // put log in wiki dir, instead of user.temp invoke_wkr = this.Invoke_wkr(); // set member reference diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_orig_regy_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_orig_regy_cmd.java index be1e8faed..6cd1538ed 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_orig_regy_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_orig_regy_cmd.java @@ -27,7 +27,7 @@ public class Xob_orig_regy_cmd extends Xob_itm_basic_base implements Xob_cmd { public void Cmd_bgn(Xob_bldr bldr) { Db_conn conn = Xob_db_file.new__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); Xob_orig_regy_tbl.Create_table(conn); - Xowe_wiki commons_wiki = bldr.App().Wiki_mgr().Get_by_key_or_make(Xow_domain_itm_.Bry__commons).Init_assert(); + Xowe_wiki commons_wiki = bldr.App().Wiki_mgr().Get_by_or_make(Xow_domain_itm_.Bry__commons).Init_assert(); Xowe_wiki repo_0 = wiki, repo_1 = commons_wiki; if (repo_0_is_remote) { // NOTE: default is false; local_wiki will be preferred over commons_wiki repo_0 = commons_wiki; diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_page_regy_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_page_regy_cmd.java index e8aabac64..28ff30be2 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_page_regy_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_page_regy_cmd.java @@ -25,7 +25,7 @@ public class Xob_page_regy_cmd extends Xob_itm_basic_base implements Xob_cmd { public String Cmd_key() {return Xob_cmd_keys.Key_file_page_regy;} public void Cmd_init(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) { - Xowe_wiki commons_wiki = bldr.App().Wiki_mgr().Get_by_key_or_make(Xow_domain_itm_.Bry__commons).Init_assert(); + Xowe_wiki commons_wiki = bldr.App().Wiki_mgr().Get_by_or_make(Xow_domain_itm_.Bry__commons).Init_assert(); Db_conn page_regy_provider = Xob_db_file.new__page_regy(commons_wiki.Fsys_mgr().Root_dir()).Conn(); commons_wiki.Init_assert(); if (build_commons) { diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_cmd.java index 6964fbae2..7575cf18b 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_cmd.java @@ -37,11 +37,12 @@ public class Xob_page_cmd extends Xob_itm_basic_base implements Xobd_wkr, GfoInv this.page_core_tbl = db_mgr.Tbl__page(); this.text_zip_mgr = Xoa_app_.Utl__zip_mgr(); text_zip_tid = import_cfg.Zip_tid_text(); this.ns_to_db_mgr = new Xob_ns_to_db_mgr(new Xob_ns_to_db_wkr__text(), db_mgr, import_cfg.Text_db_max()); + this.dg_match_mgr = app.Api_root().Bldr().Wiki().Filter().Dansguardian().New_mgr(wiki.Domain_str(), wiki.Fsys_mgr().Root_dir()); + if (dg_match_mgr != null) redirect_id_enabled = true; // always enable redirect_id if dg_match_mgr enabled; DATE:2016-01-04 if (redirect_id_enabled) { this.redirect_tbl = new Xob_redirect_tbl(wiki.Fsys_mgr().Root_dir(), gplx.langs.htmls.encoders.Gfo_url_encoder_.Http_url_ttl).Create_table(); redirect_tbl.Conn().Txn_bgn("bldr__page__redirect"); } - this.dg_match_mgr = app.Api_root().Bldr().Wiki().Filter().Dansguardian().New_mgr(wiki.Domain_str(), wiki.Fsys_mgr().Root_dir()); app.Bldr().Dump_parser().Trie_tab_del_(); // disable swapping for \t byte[] ns_file_map = import_cfg.New_ns_file_map(wiki.Import_cfg().Src_rdr_len()); Xob_ns_file_itm.Init_ns_bldr_data(Xowd_db_file_.Tid_text, wiki.Ns_mgr(), ns_file_map); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_delete_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_delete_cmd.java new file mode 100644 index 000000000..f52df218f --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_delete_cmd.java @@ -0,0 +1,85 @@ +/* +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.bldrs.cmds.texts.sqls; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*; +import gplx.dbs.*; import gplx.xowa.wikis.data.*; +public class Xob_page_delete_cmd extends Xob_cmd_base { + private final Xow_wiki wiki; + public Xob_page_delete_cmd(Xob_bldr bldr, Xow_wiki wiki) {this.wiki = wiki;} + @Override public String Cmd_key() {return Xob_cmd_keys.Key_text_delete_page;} + @Override public void Cmd_run() { + wiki.Init_by_wiki(); + Xowd_db_file core_db = wiki.Data__core_mgr().Db__core(); + Db_conn core_db_conn = core_db.Conn(); + Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_.Instance; + + usr_dlg.Plog_many("", "", "creating page_filter"); + if (!core_db_conn.Meta_tbl_exists("page_filter")) { + core_db_conn.Ddl_create_tbl + ( Dbmeta_tbl_itm.New("page_filter", new Dbmeta_fld_itm[] + { Dbmeta_fld_itm.new_int("page_id").Primary_y_() + , Dbmeta_fld_itm.new_int("page_text_db_id") + } + , Dbmeta_idx_itm.new_normal_by_tbl("page_filter", "db_id", "page_text_db_id", "page_id") + )); + } + + core_db_conn.Exec_sql_plog_ntx("finding missing redirects", String_.Concat_lines_nl_skip_last + ( "INSERT INTO page_filter (page_id, page_text_db_id)" + , "SELECT ptr.page_id, ptr.page_text_db_id" + , "FROM page ptr" + , " LEFT JOIN page orig ON ptr.page_redirect_id = orig.page_id" + , "WHERE ptr.page_is_redirect = 1" + , "AND orig.page_id IS NULL" + , "UNION" + , "SELECT ptr.page_id, ptr.page_text_db_id" + , "FROM page ptr" + , "WHERE ptr.page_is_redirect = 1" + , "AND ptr.page_redirect_id = -1" + , ";" + )); + + Xowd_db_file[] db_files = core_db.Tbl__db().Select_all(wiki.Data__core_mgr().Props(), wiki.Fsys_mgr().Root_dir()); + int len = db_files.length; + for (int i = 0; i < len; ++i) { + boolean db_file_is_text = Bool_.N, db_file_is_cat = Bool_.N, db_file_is_search = Bool_.N; + Xowd_db_file db_file = db_files[i]; + switch (db_file.Tid()) { + case Xowd_db_file_.Tid_core: case Xowd_db_file_.Tid_wiki_solo: case Xowd_db_file_.Tid_text_solo: + db_file_is_text = db_file_is_cat = db_file_is_search = Bool_.Y; break; + case Xowd_db_file_.Tid_text: db_file_is_text = Bool_.Y; break; + case Xowd_db_file_.Tid_cat: db_file_is_cat = Bool_.Y; break; + case Xowd_db_file_.Tid_search_core: db_file_is_search = Bool_.Y; break; + } + int db_id = db_file.Id(); + if (db_file_is_text) Run_sql(core_db_conn, db_file.Url(), db_id, "deleting text: " + db_id, "DELETE FROM text WHERE page_id IN (SELECT page_id FROM page_filter WHERE page_text_db_id = {0});"); + if (db_file_is_cat) Run_sql(core_db_conn, db_file.Url(), db_id, "deleting cat: " + db_id, "DELETE FROM cat_link WHERE cl_from IN (SELECT page_id FROM page_filter);"); + if (db_file_is_cat) Run_sql(core_db_conn, db_file.Url(), db_id, "deleting search:" + db_id, "DELETE FROM search_link WHERE page_id IN (SELECT page_id FROM page_filter);"); + if (db_file_is_text || db_file_is_cat || db_file_is_search) + db_file.Conn().Env_vacuum(); + } + core_db_conn.Exec_sql_plog_ntx("deleting from table: page", "DELETE FROM page WHERE page_id IN (SELECT page_id FROM page_filter);"); + // core_db_conn.Ddl_delete_tbl("page_filter"); + core_db_conn.Env_vacuum(); + usr_dlg.Plog_many("", "", ""); + } + private void Run_sql(Db_conn core_db_conn, Io_url db_url, int db_id, String prog_msg, String sql) { + Db_attach_cmd.new_(core_db_conn, "data_db", db_url) + .Add_fmt(prog_msg , sql, db_id) + .Exec(); + } +} diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_term_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_term_cmd.java index 92bcb8224..bb2a9ee68 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_term_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_term_cmd.java @@ -28,6 +28,8 @@ public class Xob_term_cmd extends Xob_term_base { cfg_tbl.Insert_bry(Xow_cfg_consts.Grp__wiki_init, "props.siteinfo_misc", wiki.Props().Siteinfo_misc()); cfg_tbl.Insert_bry(Xow_cfg_consts.Grp__wiki_init, "props.siteinfo_mainpage", wiki.Props().Siteinfo_mainpage()); gplx.fsdb.Fsdb_db_mgr__v2_bldr.Instance.Get_or_make(wiki, false);// always build file.user db; DATE:2015-05-12 + if (wiki.Appe().Api_root().Bldr().Wiki().Filter().Dansguardian().Enabled()) // if dansguardian, delete missing pages; DATE:2016-01-06 + new Xob_page_delete_cmd(wiki.Appe().Bldr(), wiki).Cmd_run(); wiki.Data__core_mgr().Rls(); } } diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_page_dump_tbl.java b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_page_dump_tbl.java index cf9dd9ac7..fd5c58e20 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_page_dump_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/wikis/Xob_page_dump_tbl.java @@ -20,7 +20,7 @@ import gplx.dbs.*; class Xobd_page_dump_tbl { public final static String Tbl_name = "page_dump"; private final String fld_id, fld_title, fld_namespace, fld_is_redirect; - private final Db_conn conn; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private final Db_conn conn; private final Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); public Xobd_page_dump_tbl(Db_conn conn) { this.conn = conn; this.fld_id = flds.Add_int_pkey("page_id"); @@ -29,12 +29,12 @@ class Xobd_page_dump_tbl { this.fld_is_redirect = flds.Add_int("page_is_redirect"); } public void Create_data(Io_url page_db_url, int text_db_id) { - conn.Ddl_create_tbl(Db_meta_tbl.new_(Tbl_name, flds)); + conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(Tbl_name, flds)); conn.Stmt_delete(Tbl_name).Exec_delete(); // always clear tables again; allows commands to be rerun; DATE:2015-08-04 Db_attach_cmd.new_(conn, "page_db", page_db_url) .Add_fmt("text_db_prep.clone_page", Sql_insert_data, text_db_id) .Exec(); - conn.Ddl_create_idx(Db_meta_idx.new_unique_by_tbl(Tbl_name, "main", fld_id, fld_namespace, fld_is_redirect, fld_title)); + conn.Ddl_create_idx(Dbmeta_idx_itm.new_unique_by_tbl(Tbl_name, "main", fld_id, fld_namespace, fld_is_redirect, fld_title)); } private static final String Sql_insert_data = String_.Concat_lines_nl ( "INSERT INTO page_dump (page_id, page_title, page_namespace, page_is_redirect)" diff --git a/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_log_mgr.java b/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_log_mgr.java index b3f3a35f1..f443d3e85 100644 --- a/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_log_mgr.java +++ b/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_log_mgr.java @@ -43,7 +43,7 @@ class Dg_log_mgr { public void Rls() {conn.Txn_end();} } class Dg_file_tbl { - private String tbl_name = "dg_file"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private String tbl_name = "dg_file"; private final Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); private String fld_file_id, fld_file_path, fld_rule_count; private Db_conn conn; private Db_stmt stmt_insert; public void Conn_(Db_conn new_conn, boolean created) { @@ -52,8 +52,8 @@ class Dg_file_tbl { fld_file_path = flds.Add_str("file_path", 512); fld_rule_count = flds.Add_int("rule_count"); if (created) { - Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds - , Db_meta_idx.new_unique_by_tbl(tbl_name, "file_id", fld_file_id) + Dbmeta_tbl_itm meta = Dbmeta_tbl_itm.New(tbl_name, flds + , Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "file_id", fld_file_id) ); conn.Ddl_create_tbl(meta); } @@ -69,7 +69,7 @@ class Dg_file_tbl { } } class Dg_rule_tbl implements Rls_able { - private String tbl_name = "dg_rule"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private String tbl_name = "dg_rule"; private final Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); private String fld_file_id, fld_rule_id, fld_rule_idx, fld_rule_score, fld_rule_text; private Db_conn conn; private Db_stmt stmt_insert; public void Conn_(Db_conn new_conn, boolean created) { @@ -80,8 +80,8 @@ class Dg_rule_tbl implements Rls_able { fld_rule_score = flds.Add_int("rule_score"); fld_rule_text = flds.Add_str("rule_text", 1024); if (created) { - Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds - , Db_meta_idx.new_unique_by_tbl(tbl_name, "pkey", fld_rule_id) + Dbmeta_tbl_itm meta = Dbmeta_tbl_itm.New(tbl_name, flds + , Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "pkey", fld_rule_id) ); conn.Ddl_create_tbl(meta); } @@ -102,7 +102,7 @@ class Dg_rule_tbl implements Rls_able { } } class Dg_page_score_tbl implements Rls_able { - private String tbl_name = "dg_page_score"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private String tbl_name = "dg_page_score"; private final Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); private String fld_log_tid, fld_page_id, fld_page_ns, fld_page_ttl, fld_page_len, fld_page_score, fld_page_rule_count, fld_clude_type; private Db_conn conn; private Db_stmt stmt_insert; public void Conn_(Db_conn new_conn, boolean created) { @@ -116,8 +116,8 @@ class Dg_page_score_tbl implements Rls_able { fld_page_rule_count = flds.Add_int("page_rule_count"); fld_clude_type = flds.Add_int("page_clude_type"); if (created) { - Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds - , Db_meta_idx.new_unique_by_tbl(tbl_name, "pkey", fld_log_tid, fld_page_id) + Dbmeta_tbl_itm meta = Dbmeta_tbl_itm.New(tbl_name, flds + , Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "pkey", fld_log_tid, fld_page_id) ); conn.Ddl_create_tbl(meta); } @@ -142,7 +142,7 @@ class Dg_page_score_tbl implements Rls_able { } } class Dg_page_rule_tbl implements Rls_able { - private String tbl_name = "dg_page_rule"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private String tbl_name = "dg_page_rule"; private final Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); private String fld_log_tid, fld_page_id, fld_rule_id, fld_rule_score_total; private Db_conn conn; private Db_stmt stmt_insert; public void Conn_(Db_conn new_conn, boolean created) { @@ -152,8 +152,8 @@ class Dg_page_rule_tbl implements Rls_able { fld_rule_id = flds.Add_int("rule_id"); fld_rule_score_total = flds.Add_int("rule_score_total"); if (created) { - Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds - , Db_meta_idx.new_unique_by_tbl(tbl_name, "pkey", fld_log_tid, fld_page_id, fld_rule_id) + Dbmeta_tbl_itm meta = Dbmeta_tbl_itm.New(tbl_name, flds + , Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "pkey", fld_log_tid, fld_page_id, fld_rule_id) ); conn.Ddl_create_tbl(meta); } diff --git a/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_base.java b/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_base.java index a07677d37..16c849bb6 100644 --- a/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_base.java +++ b/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_base.java @@ -45,7 +45,7 @@ abstract class Xoi_cmd_base implements Gfo_thread_cmd { public void Process_async() { Xoae_app app = install_mgr.App(); Xob_bldr bldr = app.Bldr(); - Xowe_wiki wiki = app.Wiki_mgr().Get_by_key_or_make(Bry_.new_a7(wiki_key)); + Xowe_wiki wiki = app.Wiki_mgr().Get_by_or_make(Bry_.new_a7(wiki_key)); wiki.Init_assert(); bldr.Cmd_mgr().Clear(); Process_async_init(app, wiki, bldr); @@ -81,7 +81,7 @@ class Xoi_cmd_category2_categorylinks extends Xoi_cmd_wiki_download { public Xoi class Xoi_cmd_category2_build extends Xoi_cmd_base { public Xoi_cmd_category2_build(Xoi_setup_mgr install_mgr, String wiki_key) {this.Ctor(install_mgr, wiki_key); this.app = install_mgr.App(); this.wiki_key = wiki_key;} private Xoae_app app; private String wiki_key; @Override public void Cmd_ctor() { - Xowe_wiki wiki = app.Wiki_mgr().Get_by_key_or_make(Bry_.new_u8(wiki_key)); + Xowe_wiki wiki = app.Wiki_mgr().Get_by_or_make(Bry_.new_u8(wiki_key)); wiki.Import_cfg().Category_version_(gplx.xowa.wikis.ctgs.Xoa_ctg_mgr.Version_2); } @Override public String Async_key() {return KEY;} public static final String KEY = "wiki.category2.build"; diff --git a/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_dumpfile.java b/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_dumpfile.java index 9e533eb32..e8b943785 100644 --- a/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_dumpfile.java +++ b/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_dumpfile.java @@ -45,7 +45,7 @@ class Xoi_cmd_dumpfile { return this; } public Gfo_thread_cmd Exec(Xoi_cmd_mgr cmd_mgr) { - Xowe_wiki wiki = cmd_mgr.App().Wiki_mgr().Get_by_key_or_make(domain); + Xowe_wiki wiki = cmd_mgr.App().Wiki_mgr().Get_by_or_make(domain); if (bz2_unzip) { // unzip requested; add unzip cmd GfoMsg unzip_msg = GfoMsg_.new_parse_(Gfo_thread_cmd_unzip.KEY).Add("v", Gfo_thread_cmd_unzip.KEY).Add("src", bz2_url.Raw()).Add("trg", xml_url.Raw()); Gfo_thread_cmd_unzip unzip_cmd = (Gfo_thread_cmd_unzip)cmd_mgr.Cmd_add(unzip_msg); diff --git a/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_mgr.java b/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_mgr.java index 398b35342..95e711b66 100644 --- a/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_mgr.java +++ b/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_mgr.java @@ -95,7 +95,7 @@ public class Xoi_cmd_mgr implements GfoInvkAble { if (dumpfile_cmd) { if (String_.Eq(cmd.Async_key(), Xoi_cmd_wiki_download.Key_wiki_download)) continue; // skip download if wiki.dump_file else if (String_.Eq(cmd.Async_key(), Xoi_cmd_wiki_unzip.KEY_dump)) { - Xowe_wiki wiki = app.Wiki_mgr().Get_by_key_or_make(Bry_.new_u8(wiki_key)); + Xowe_wiki wiki = app.Wiki_mgr().Get_by_or_make(Bry_.new_u8(wiki_key)); if (wiki.Import_cfg().Src_fil_xml() != null) continue; // skip unzip if xml exists } else if (String_.Eq(cmd.Async_key(), Xoi_cmd_wiki_import.KEY)) { diff --git a/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_wiki_download.java b/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_wiki_download.java index 0ac1fce02..18beb618d 100644 --- a/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_wiki_download.java +++ b/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_wiki_download.java @@ -42,7 +42,7 @@ class Xoi_cmd_wiki_download extends Gfo_thread_cmd_download implements Gfo_threa Dump_servers_offline_msg_shown = true; } } - Xowe_wiki wiki = app.Wiki_mgr().Get_by_key_or_make(dump_file.Domain_itm().Domain_bry()); + Xowe_wiki wiki = app.Wiki_mgr().Get_by_or_make(dump_file.Domain_itm().Domain_bry()); Io_url root_dir = wiki.Fsys_mgr().Root_dir(); Io_url[] trg_fil_ary = Io_mgr.Instance.QueryDir_args(root_dir).FilPath_("*." + dump_type + Download_file_ext() + "*").ExecAsUrlAry(); Io_url trg = trg_fil_ary.length == 0 ? root_dir.GenSubFil(dump_file.File_name()) : trg_fil_ary[0]; diff --git a/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_wiki_import.java b/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_wiki_import.java index 7bdb129da..642d63115 100644 --- a/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_wiki_import.java +++ b/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_wiki_import.java @@ -72,7 +72,7 @@ class Xoi_cmd_wiki_import implements Gfo_thread_cmd { Xoae_app app = install_mgr.App(); app.Usr_dlg().Prog_one("", "", "preparing import: ~{0}", wiki_key); Xob_bldr bldr = app.Bldr(); - wiki = app.Wiki_mgr().Get_by_key_or_make(Bry_.new_a7(wiki_key)); + wiki = app.Wiki_mgr().Get_by_or_make(Bry_.new_a7(wiki_key)); wiki.Init_assert(); bldr.Cmd_mgr().Clear(); bldr.Pause_at_end_(false); diff --git a/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_wiki_unzip.java b/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_wiki_unzip.java index b002e7947..fa5d2981c 100644 --- a/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_wiki_unzip.java +++ b/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_wiki_unzip.java @@ -23,7 +23,7 @@ class Xoi_cmd_wiki_unzip extends Gfo_thread_cmd_unzip implements Gfo_thread_cmd @Override public String Async_key() {return KEY_dump;} @Override public byte Async_init() { Xoae_app app = install_mgr.App(); Gfui_kit kit = app.Gui_mgr().Kit(); - Xowe_wiki wiki = app.Wiki_mgr().Get_by_key_or_make(Bry_.new_u8(wiki_key)); + Xowe_wiki wiki = app.Wiki_mgr().Get_by_or_make(Bry_.new_u8(wiki_key)); Io_url wiki_dir = wiki.Import_cfg().Src_dir(); Io_url[] urls = Io_mgr.Instance.QueryDir_args(wiki_dir).Recur_(false).FilPath_("*.xml.bz2").ExecAsUrlAry(); if (urls.length == 0) { diff --git a/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_wiki_zip.java b/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_wiki_zip.java index 0927598cb..1fe25328a 100644 --- a/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_wiki_zip.java +++ b/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_cmd_wiki_zip.java @@ -47,7 +47,7 @@ class Xoi_cmd_wiki_zip implements Gfo_thread_cmd { private void Process_async() { Xoae_app app = install_mgr.App(); Xob_bldr bldr = app.Bldr(); - wiki = app.Wiki_mgr().Get_by_key_or_make(Bry_.new_a7(wiki_key)); + wiki = app.Wiki_mgr().Get_by_or_make(Bry_.new_a7(wiki_key)); wiki.Init_assert(); bldr.Cmd_mgr().Clear(); bldr.Pause_at_end_(false); diff --git a/400_xowa/src/gplx/xowa/bldrs/setups/maints/Xoa_maint_mgr.java b/400_xowa/src/gplx/xowa/bldrs/setups/maints/Xoa_maint_mgr.java index 6e55fdbfc..1cdb6a7d2 100644 --- a/400_xowa/src/gplx/xowa/bldrs/setups/maints/Xoa_maint_mgr.java +++ b/400_xowa/src/gplx/xowa/bldrs/setups/maints/Xoa_maint_mgr.java @@ -66,7 +66,7 @@ public class Xoa_maint_mgr implements GfoInvkAble { len = app.Wiki_mgr().Count(); Xoa_app_.Usr_dlg().Log_many("", "", "maint.wiki_count; count=~{0}", len); for (int i = 0; i < len; i++) { - Xowe_wiki wiki = app.Wiki_mgr().Get_at(i); + Xowe_wiki wiki = app.Wiki_mgr().Get_at_or_null(i); Xoa_app_.Usr_dlg().Log_many("", "", "maint.wiki_itm; wiki=~{0}", wiki.Domain_str()); Wmf_dump_itm itm = (Wmf_dump_itm)itms_hash.Get_by_bry(wiki.Domain_bry()); if (itm == null) continue; wiki.Maint_mgr().Wmf_dump_date_(itm.Dump_date()).Wmf_dump_done_(itm.Status_tid() == Wmf_dump_itm.Status_tid_complete).Wmf_dump_status_(itm.Status_msg()); diff --git a/400_xowa/src/gplx/xowa/bldrs/setups/maints/Xoa_maint_wikis_mgr.java b/400_xowa/src/gplx/xowa/bldrs/setups/maints/Xoa_maint_wikis_mgr.java index c7dea00ab..60ee437d8 100644 --- a/400_xowa/src/gplx/xowa/bldrs/setups/maints/Xoa_maint_wikis_mgr.java +++ b/400_xowa/src/gplx/xowa/bldrs/setups/maints/Xoa_maint_wikis_mgr.java @@ -23,7 +23,7 @@ public class Xoa_maint_wikis_mgr implements GfoInvkAble { public Xowe_wiki Get_at(int i) { if (init) Init(); byte[] domain = (byte[])hash.Get_at(i); - Xowe_wiki wiki = app.Wiki_mgr().Get_by_key_or_make(domain); + Xowe_wiki wiki = app.Wiki_mgr().Get_by_or_make(domain); wiki.Init_assert(); return wiki; } @@ -32,7 +32,7 @@ public class Xoa_maint_wikis_mgr implements GfoInvkAble { int len = this.Len(); for (int i = 0; i < len; i++) { byte[] domain = (byte[])hash.Get_at(i); - Xowe_wiki wiki = app.Wiki_mgr().Get_by_key_or_make(domain); + Xowe_wiki wiki = app.Wiki_mgr().Get_by_or_make(domain); wiki.Init_assert(); } init = false; diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/Xoa_wmf_mgr.java b/400_xowa/src/gplx/xowa/bldrs/wms/Xoa_wmf_mgr.java index 76daa5a12..092e055cf 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/Xoa_wmf_mgr.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/Xoa_wmf_mgr.java @@ -27,7 +27,7 @@ public class Xoa_wmf_mgr implements GfoInvkAble { enabled = v; int len = wiki_mgr.Count(); for (int i = 0; i < len; i++) { - Xowe_wiki wiki = wiki_mgr.Get_at(i); + Xowe_wiki wiki = wiki_mgr.Get_at_or_null(i); wiki.File_mgr().Cfg_download().Enabled_(v); } } diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_core_tbl.java b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_core_tbl.java index 8c5b347f5..203819cc7 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_core_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_core_tbl.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.bldrs.wms.sites; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wms.*; import gplx.dbs.*; public class Site_core_tbl implements Db_tbl { - private static final String tbl_name = "site_core"; private final Db_meta_fld_list flds = new Db_meta_fld_list(); + private static final String tbl_name = "site_core"; private final Dbmeta_fld_list flds = new Dbmeta_fld_list(); private final String fld_site_abrv, fld_site_domain, fld_json_completed, fld_json_date, fld_json_text; private final Db_conn conn; private Db_stmt stmt_select, stmt_insert, stmt_delete, stmt_update; @@ -32,7 +32,7 @@ public class Site_core_tbl implements Db_tbl { conn.Rls_reg(this); } public Db_conn Conn() {return conn;} - public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, Db_meta_idx.Bld_idx_name(tbl_name, "main"), fld_site_abrv)));} + public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv)));} public void Rls() { stmt_select = Db_stmt_.Rls(stmt_select); stmt_insert = Db_stmt_.Rls(stmt_insert); diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_extension_tbl.java b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_extension_tbl.java index ccfc0c217..6066bdcc5 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_extension_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_extension_tbl.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.bldrs.wms.sites; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wms.*; import gplx.dbs.*; class Site_extension_tbl implements Db_tbl { - private static final String tbl_name = "site_extension"; private final Db_meta_fld_list flds = new Db_meta_fld_list(); + private static final String tbl_name = "site_extension"; private final Dbmeta_fld_list flds = new Dbmeta_fld_list(); private final String fld_site_abrv, fld_type, fld_name, fld_namemsg, fld_description, fld_descriptionmsg, fld_author, fld_url, fld_version , fld_vcs_system, fld_vcs_version, fld_vcs_url, fld_vcs_date, fld_license_name, fld_license, fld_credits; private final Db_conn conn; @@ -43,8 +43,8 @@ class Site_extension_tbl implements Db_tbl { this.fld_credits = flds.Add_str("credits", 255); conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, Db_meta_idx.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_type, fld_name)));} - public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();} + public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_type, fld_name)));} + public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();} public void Rls() { stmt_select = Db_stmt_.Rls(stmt_select); stmt_insert = Db_stmt_.Rls(stmt_insert); diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_interwikimap_tbl.java b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_interwikimap_tbl.java index f74f95dd5..564e8f610 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_interwikimap_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_interwikimap_tbl.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.bldrs.wms.sites; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wms.*; import gplx.dbs.*; class Site_interwikimap_tbl implements Db_tbl { - private static final String tbl_name = "site_interwikimap"; private final Db_meta_fld_list flds = new Db_meta_fld_list(); + private static final String tbl_name = "site_interwikimap"; private final Dbmeta_fld_list flds = new Dbmeta_fld_list(); private final String fld_site_abrv, fld_prefix, fld_local, fld_language, fld_localinterwiki, fld_url, fld_protorel; private final Db_conn conn; private Db_stmt stmt_select, stmt_insert, stmt_delete; @@ -33,8 +33,8 @@ class Site_interwikimap_tbl implements Db_tbl { this.fld_protorel = flds.Add_bool("protorel"); conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, Db_meta_idx.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_prefix)));} - public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();} + public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_prefix)));} + public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();} public void Rls() { stmt_select = Db_stmt_.Rls(stmt_select); stmt_insert = Db_stmt_.Rls(stmt_insert); diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_kv_tbl.java b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_kv_tbl.java index e9851f6e2..a21f1065b 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_kv_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_kv_tbl.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.bldrs.wms.sites; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wms.*; import gplx.dbs.*; class Site_kv_tbl implements Db_tbl { - private String tbl_name; private final Db_meta_fld_list flds = new Db_meta_fld_list(); + private String tbl_name; private final Dbmeta_fld_list flds = new Dbmeta_fld_list(); private final String fld_site_abrv, fld_key, fld_val; private final Db_conn conn; private Db_stmt stmt_select, stmt_insert, stmt_delete; @@ -29,8 +29,8 @@ class Site_kv_tbl implements Db_tbl { this.fld_val = flds.Add_str("val", 255); conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, Db_meta_idx.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_key)));} - public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();} + public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_key)));} + public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();} public void Rls() { stmt_select = Db_stmt_.Rls(stmt_select); stmt_insert = Db_stmt_.Rls(stmt_insert); diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_language_tbl.java b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_language_tbl.java index d7cd75ed0..74abb67d7 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_language_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_language_tbl.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.bldrs.wms.sites; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wms.*; import gplx.dbs.*; class Site_language_tbl implements Db_tbl { - private static final String tbl_name = "site_language"; private final Db_meta_fld_list flds = new Db_meta_fld_list(); + private static final String tbl_name = "site_language"; private final Dbmeta_fld_list flds = new Dbmeta_fld_list(); private final String fld_site_abrv, fld_code, fld_name; private final Db_conn conn; private Db_stmt stmt_select, stmt_insert, stmt_delete; @@ -29,8 +29,8 @@ class Site_language_tbl implements Db_tbl { this.fld_name = flds.Add_str("name", 255); conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, Db_meta_idx.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_code)));} - public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();} + public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_code)));} + public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();} public void Rls() { stmt_select = Db_stmt_.Rls(stmt_select); stmt_insert = Db_stmt_.Rls(stmt_insert); diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_library_tbl.java b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_library_tbl.java index 3f85e513a..7d051aed0 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_library_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_library_tbl.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.bldrs.wms.sites; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wms.*; import gplx.dbs.*; class Site_library_tbl implements Db_tbl { - private static final String tbl_name = "site_library"; private final Db_meta_fld_list flds = new Db_meta_fld_list(); + private static final String tbl_name = "site_library"; private final Dbmeta_fld_list flds = new Dbmeta_fld_list(); private final String fld_site_abrv, fld_name, fld_version; private final Db_conn conn; private Db_stmt stmt_select, stmt_insert, stmt_delete; @@ -29,8 +29,8 @@ class Site_library_tbl implements Db_tbl { this.fld_version = flds.Add_str("version", 255); conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, Db_meta_idx.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_name)));} - public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();} + public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_name)));} + public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();} public void Rls() { stmt_select = Db_stmt_.Rls(stmt_select); stmt_insert = Db_stmt_.Rls(stmt_insert); diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_magicword_tbl.java b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_magicword_tbl.java index 4bef17443..e20756ab5 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_magicword_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_magicword_tbl.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.bldrs.wms.sites; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wms.*; import gplx.dbs.*; class Site_magicword_tbl implements Db_tbl { - private static final String tbl_name = "site_magicword"; private final Db_meta_fld_list flds = new Db_meta_fld_list(); + private static final String tbl_name = "site_magicword"; private final Dbmeta_fld_list flds = new Dbmeta_fld_list(); private final String fld_site_abrv, fld_name, fld_case_match, fld_aliases; private final Db_conn conn; private Db_stmt stmt_select, stmt_insert, stmt_delete; @@ -30,8 +30,8 @@ class Site_magicword_tbl implements Db_tbl { this.fld_aliases = flds.Add_str("aliases", 2048); conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, Db_meta_idx.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_name)));} - public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();} + public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_name)));} + public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();} public void Rls() { stmt_select = Db_stmt_.Rls(stmt_select); stmt_insert = Db_stmt_.Rls(stmt_insert); diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_namespace_tbl.java b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_namespace_tbl.java index 5e938922c..4d47bbf69 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_namespace_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_namespace_tbl.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.bldrs.wms.sites; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wms.*; import gplx.dbs.*; public class Site_namespace_tbl implements Db_tbl { - private static final String tbl_name = "site_namespace"; private final Db_meta_fld_list flds = new Db_meta_fld_list(); + private static final String tbl_name = "site_namespace"; private final Dbmeta_fld_list flds = new Dbmeta_fld_list(); private final String fld_site_abrv, fld_id, fld_case_tid, fld_canonical, fld_localized, fld_subpages, fld_content, fld_defaultcontentmodel; private final Db_conn conn; private Db_stmt stmt_select, stmt_insert, stmt_delete; @@ -34,8 +34,8 @@ public class Site_namespace_tbl implements Db_tbl { this.fld_defaultcontentmodel = flds.Add_str("defaultcontentmodel", 255); conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, Db_meta_idx.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_id)));} - public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();} + public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_id)));} + public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();} public void Rls() { stmt_select = Db_stmt_.Rls(stmt_select); stmt_insert = Db_stmt_.Rls(stmt_insert); diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_namespacealias_tbl.java b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_namespacealias_tbl.java index 769941998..aaf68ad61 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_namespacealias_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_namespacealias_tbl.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.bldrs.wms.sites; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wms.*; import gplx.dbs.*; class Site_namespacealias_tbl implements Db_tbl { - private static final String tbl_name = "site_namespacealias"; private final Db_meta_fld_list flds = new Db_meta_fld_list(); + private static final String tbl_name = "site_namespacealias"; private final Dbmeta_fld_list flds = new Dbmeta_fld_list(); private final String fld_site_abrv, fld_id, fld_alias; private final Db_conn conn; private Db_stmt stmt_select, stmt_insert, stmt_delete; @@ -29,8 +29,8 @@ class Site_namespacealias_tbl implements Db_tbl { this.fld_alias = flds.Add_str("alias", 2048); conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_normal_by_name(tbl_name, Db_meta_idx.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_id, fld_alias)));} // NOTE: kk.w has duplicate entries in json - public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();} + public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_normal_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_id, fld_alias)));} // NOTE: kk.w has duplicate entries in json + public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();} public void Rls() { stmt_select = Db_stmt_.Rls(stmt_select); stmt_insert = Db_stmt_.Rls(stmt_insert); diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_showhook_tbl.java b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_showhook_tbl.java index af94c9eb8..9557ac6e4 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_showhook_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_showhook_tbl.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.bldrs.wms.sites; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wms.*; import gplx.dbs.*; class Site_showhook_tbl implements Db_tbl { - private static final String tbl_name = "site_showhook"; private final Db_meta_fld_list flds = new Db_meta_fld_list(); + private static final String tbl_name = "site_showhook"; private final Dbmeta_fld_list flds = new Dbmeta_fld_list(); private final String fld_site_abrv, fld_name, fld_scribunto, fld_subscribers; private final Db_conn conn; private Db_stmt stmt_select, stmt_insert, stmt_delete; @@ -30,8 +30,8 @@ class Site_showhook_tbl implements Db_tbl { this.fld_subscribers = flds.Add_str("subscribers", 2048); conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, Db_meta_idx.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_name)));} - public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();} + public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_name)));} + public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();} public void Rls() { stmt_select = Db_stmt_.Rls(stmt_select); stmt_insert = Db_stmt_.Rls(stmt_insert); diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_skin_tbl.java b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_skin_tbl.java index fb40e87ef..5f453b641 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_skin_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_skin_tbl.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.bldrs.wms.sites; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wms.*; import gplx.dbs.*; class Site_skin_tbl implements Db_tbl { - private static final String tbl_name = "site_skin"; private final Db_meta_fld_list flds = new Db_meta_fld_list(); + private static final String tbl_name = "site_skin"; private final Dbmeta_fld_list flds = new Dbmeta_fld_list(); private final String fld_site_abrv, fld_code, fld_dflt, fld_name, fld_unusable; private final Db_conn conn; private Db_stmt stmt_select, stmt_insert, stmt_delete; @@ -31,8 +31,8 @@ class Site_skin_tbl implements Db_tbl { this.fld_unusable = flds.Add_bool("unusable"); conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, Db_meta_idx.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_code)));} - public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();} + public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_code)));} + public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();} public void Rls() { stmt_select = Db_stmt_.Rls(stmt_select); stmt_insert = Db_stmt_.Rls(stmt_insert); diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_specialpagealias_tbl.java b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_specialpagealias_tbl.java index 3186ecec2..e7fc5c978 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_specialpagealias_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_specialpagealias_tbl.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.bldrs.wms.sites; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wms.*; import gplx.dbs.*; class Site_specialpagealias_tbl implements Db_tbl { - private static final String tbl_name = "site_specialpagealias"; private final Db_meta_fld_list flds = new Db_meta_fld_list(); + private static final String tbl_name = "site_specialpagealias"; private final Dbmeta_fld_list flds = new Dbmeta_fld_list(); private final String fld_site_abrv, fld_realname, fld_aliases; private final Db_conn conn; private Db_stmt stmt_select, stmt_insert, stmt_delete; @@ -29,8 +29,8 @@ class Site_specialpagealias_tbl implements Db_tbl { this.fld_aliases = flds.Add_str("aliases", 2048); conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, Db_meta_idx.Bld_idx_name(tbl_name, Db_meta_idx.Bld_idx_name(tbl_name, "main")), fld_site_abrv, fld_realname)));} - public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();} + public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main")), fld_site_abrv, fld_realname)));} + public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();} public void Rls() { stmt_select = Db_stmt_.Rls(stmt_select); stmt_insert = Db_stmt_.Rls(stmt_insert); diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_statistic_tbl.java b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_statistic_tbl.java index 5a97200aa..766072b2c 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_statistic_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_statistic_tbl.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.bldrs.wms.sites; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wms.*; import gplx.dbs.*; class Site_statistic_tbl implements Db_tbl { - private static final String tbl_name = "site_statistic"; private final Db_meta_fld_list flds = new Db_meta_fld_list(); + private static final String tbl_name = "site_statistic"; private final Dbmeta_fld_list flds = new Dbmeta_fld_list(); private final String fld_site_abrv, fld_pages, fld_articles, fld_edits, fld_images, fld_users, fld_activeusers, fld_admins, fld_jobs, fld_queued_massmessages; private final Db_conn conn; private Db_stmt stmt_select, stmt_insert, stmt_delete; @@ -36,8 +36,8 @@ class Site_statistic_tbl implements Db_tbl { this.fld_queued_massmessages = flds.Add_long("queued_massmessages"); conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, Db_meta_idx.Bld_idx_name(tbl_name, "main"), fld_site_abrv)));} - public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();} + public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv)));} + public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();} public void Rls() { stmt_select = Db_stmt_.Rls(stmt_select); stmt_insert = Db_stmt_.Rls(stmt_insert); diff --git a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_val_tbl.java b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_val_tbl.java index 8d7b17122..a2b042594 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_val_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/wms/sites/Site_val_tbl.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.bldrs.wms.sites; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wms.*; import gplx.dbs.*; class Site_val_tbl implements Db_tbl { - private String tbl_name; private final Db_meta_fld_list flds = new Db_meta_fld_list(); + private String tbl_name; private final Dbmeta_fld_list flds = new Dbmeta_fld_list(); private final String fld_site_abrv, fld_val; private final Db_conn conn; private Db_stmt stmt_select, stmt_insert, stmt_delete; @@ -29,8 +29,8 @@ class Site_val_tbl implements Db_tbl { this.fld_val = flds.Add_str("val", 255); conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_name(tbl_name, Db_meta_idx.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_val)));} - public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();} + public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_name(tbl_name, Dbmeta_idx_itm.Bld_idx_name(tbl_name, "main"), fld_site_abrv, fld_val)));} + public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();} public void Rls() { stmt_select = Db_stmt_.Rls(stmt_select); stmt_insert = Db_stmt_.Rls(stmt_insert); diff --git a/400_xowa/src/gplx/xowa/drds/Xod_app.java b/400_xowa/src/gplx/xowa/drds/Xod_app.java index c19be48c8..9a61799ac 100644 --- a/400_xowa/src/gplx/xowa/drds/Xod_app.java +++ b/400_xowa/src/gplx/xowa/drds/Xod_app.java @@ -18,8 +18,8 @@ along with this program. If not, see . package gplx.xowa.drds; import gplx.*; import gplx.xowa.*; import gplx.xowa.drds.pages.*; import gplx.xowa.drds.files.*; import gplx.xowa.apps.*; import gplx.xowa.wikis.data.tbls.*; -import gplx.xowa.files.gui.*; -import gplx.xowa.specials.search.*; +import gplx.xowa.wikis.nss.*; import gplx.xowa.files.gui.*; +import gplx.xowa.specials.search.*; import gplx.xowa.specials.randoms.*; public class Xod_app { private final Xoav_app app; private final Xod_page_mgr page_mgr = new Xod_page_mgr(); @@ -27,22 +27,24 @@ public class Xod_app { public Xod_app(Xoav_app app) { this.app = app; } - public int Get_wiki_count() { + public int Wikis__count() { int rv = app.Wiki_mgri().Count(); return rv - 1; // ignore home wiki } - public Xow_wiki Get_wiki(String wiki_domain) { - Xow_wiki rv = app.Wiki_mgri().Get_by_key_or_make_init_y(Bry_.new_u8(wiki_domain)); - if (rv.Data__core_mgr() == null) rv.Init_by_wiki(); + public Xow_wiki Wikis__get_by_domain(String wiki_domain) { + Xow_wiki rv = app.Wiki_mgri().Get_by_or_make_init_y(Bry_.new_u8(wiki_domain)); + if (rv != null && rv.Data__core_mgr() == null) rv.Init_by_wiki(); return rv; } - public Xod_page_itm Get_page(Xow_wiki wiki, Xoa_url page_url) { + public Xod_page_itm Wiki__get_by_url(Xow_wiki wiki, Xoa_url page_url) { return page_mgr.Get_page(wiki, page_url); } - public void Load_files(Xow_wiki wiki, Xod_page_itm pg, Xog_js_wkr js_wkr) { - file_mgr.Load_files(wiki, pg, js_wkr); + public Xod_page_itm Wiki__get_random(Xow_wiki wiki, Xow_ns ns) { + byte[] random_ttl_bry = wiki.Data__core_mgr().Tbl__page().Select_random(ns); + Xoa_url url = wiki.Utl__url_parser().Parse(random_ttl_bry); + return Wiki__get_by_url(wiki, url); } - public String[] Search_titles(Cancelable cancelable, Xow_wiki wiki, Xows_ui_async ui_async, String search) { + public String[] Wiki__search(Cancelable cancelable, Xow_wiki wiki, Xows_ui_async ui_async, String search) { Xows_db_wkr search_wkr = new Xows_db_wkr(); Xows_db_row[] rows = search_wkr.Search_by_drd(cancelable, wiki, ui_async, Bry_.new_u8(search), 50); int len = rows.length; @@ -52,4 +54,7 @@ public class Xod_app { } return rv; } + public void Page__load_files(Xow_wiki wiki, Xod_page_itm pg, Xog_js_wkr js_wkr) { + file_mgr.Load_files(wiki, pg, js_wkr); + } } diff --git a/400_xowa/src/gplx/xowa/drds/Xod_app_tst.java b/400_xowa/src/gplx/xowa/drds/Xod_app_tst.java index 85ea4093e..5a30a172b 100644 --- a/400_xowa/src/gplx/xowa/drds/Xod_app_tst.java +++ b/400_xowa/src/gplx/xowa/drds/Xod_app_tst.java @@ -41,9 +41,9 @@ class Xod_app_tstr { Io_mgr.Instance.InitEngine_mem(); } public void Test__get(String ttl, Xod_page_itm expd) { - Xow_wiki wiki = drd_provider.Get_wiki("en.wikipedia.org"); + Xow_wiki wiki = drd_provider.Wikis__get_by_domain("en.wikipedia.org"); Xoa_url page_url = wiki.Utl__url_parser().Parse(Bry_.new_u8(ttl)); - Xod_page_itm itm = drd_provider.Get_page(wiki, page_url); + Xod_page_itm itm = drd_provider.Wiki__get_by_url(wiki, page_url); Tfds.Eq(expd.To_str(), itm.To_str()); } public Xod_page_itm Make_page(int page_id, String ttl, String modified_on, Xoh_section_itm... section_ary) { diff --git a/400_xowa/src/gplx/xowa/files/Xoa_file_mgr.java b/400_xowa/src/gplx/xowa/files/Xoa_file_mgr.java index 0e329134e..c7d3b0270 100644 --- a/400_xowa/src/gplx/xowa/files/Xoa_file_mgr.java +++ b/400_xowa/src/gplx/xowa/files/Xoa_file_mgr.java @@ -15,14 +15,24 @@ 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.files; import gplx.*; import gplx.xowa.*; -public class Xoa_file_mgr { - private final List_adp list = List_adp_.new_(); - public void Clear() {list.Clear();} - public boolean Check_cache(Xof_fsdb_itm itm) { - return false; - } - public void Queue_for_viewing(Xof_fsdb_itm itm) { - list.Add(itm); - } -} +//namespace gplx.xowa.files { +// using gplx.xowa.files.caches; +// public class Xoa_file_mgr { +// private final List_adp list = List_adp_.new_(); +// public void Clear() {list.Clear();} +// public boolean Check_cache(Xow_wiki wiki, byte[] page_url, Xof_fsdb_itm fsdb_itm) { +// fsdb_itm.Init_at_cache(0, 0, null); +//// Xou_cache_mgr cache_mgr = new Xou_cache_mgr(null, null, null); +//// Xou_cache_itm cache_itm = cache_mgr.Get_or_null(fsdb_itm); +//// if (cache_itm == null) { +//// fsdb_itm.Init_at_cache(Bool_.N_byte, 0, 0, null); +//// return false; +//// } +//// else { +//// fsdb_itm.Init_at_cache(Bool_.Y_byte, cache_itm.Html_w(), cache_itm.Html_h(), cache_itm.File_url()); +//// return true; +//// } +// return true; +// } +// } +//} diff --git a/400_xowa/src/gplx/xowa/files/Xof_file_itm.java b/400_xowa/src/gplx/xowa/files/Xof_file_itm.java index 3e31f4df1..b3a3362b6 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_file_itm.java +++ b/400_xowa/src/gplx/xowa/files/Xof_file_itm.java @@ -38,6 +38,7 @@ public interface Xof_file_itm { boolean File_is_orig(); int File_w(); boolean File_exists(); + boolean File_exists_in_cache(); int Html_uid(); byte Html_elem_tid(); int Html_w(); @@ -60,5 +61,5 @@ public interface Xof_file_itm { void Init_at_gallery_bgn(int html_w, int html_h, int file_w); void Init_at_gallery_end(int html_w, int html_h, Io_url html_view_url, Io_url html_orig_url); - boolean Meta_is_new(); + boolean Dbmeta_is_new(); } diff --git a/400_xowa/src/gplx/xowa/files/Xof_file_wkr.java b/400_xowa/src/gplx/xowa/files/Xof_file_wkr.java index fb9c77f94..deb78c3fb 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_file_wkr.java +++ b/400_xowa/src/gplx/xowa/files/Xof_file_wkr.java @@ -51,10 +51,15 @@ public class Xof_file_wkr implements Gfo_thread_wkr { Exec_by_fsdb(fsdb); } private void Exec_by_fsdb(Xof_fsdb_itm fsdb) { - fsdb.Orig_exists_n_(); - Xof_orig_itm orig = orig_mgr.Find_by_ttl_or_null(fsdb.Lnki_ttl()); if (orig == Xof_orig_itm.Null) return; - Eval_orig(orig, fsdb, url_bldr, repo_mgr, img_size); - Show_img(fsdb, usr_dlg, bin_mgr, mnt_mgr, cache_mgr, repo_mgr, js_wkr, img_size, url_bldr, hpg); + try { + if (fsdb.File_exists_in_cache()) return; + fsdb.Orig_exists_n_(); + Xof_orig_itm orig = orig_mgr.Find_by_ttl_or_null(fsdb.Lnki_ttl()); if (orig == Xof_orig_itm.Null) return; + Eval_orig(orig, fsdb, url_bldr, repo_mgr, img_size); + Show_img(fsdb, usr_dlg, bin_mgr, mnt_mgr, cache_mgr, repo_mgr, js_wkr, img_size, url_bldr, hpg); + } catch (Exception e) { + usr_dlg.Warn_many("", "", "file.unknown: err=~{0}", Err_.Message_gplx_full(e)); + } } public static boolean Show_img(Xof_fsdb_itm fsdb, Gfo_usr_dlg usr_dlg, Xof_bin_mgr bin_mgr, Fsm_mnt_mgr mnt_mgr, Xou_cache_mgr cache_mgr, Xow_repo_mgr repo_mgr, Xog_js_wkr js_wkr, Xof_img_size img_size, Xof_url_bldr url_bldr, Xoa_page page) { try { diff --git a/400_xowa/src/gplx/xowa/files/Xof_fsdb_itm.java b/400_xowa/src/gplx/xowa/files/Xof_fsdb_itm.java index 623efc13c..aa88f6eba 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_fsdb_itm.java +++ b/400_xowa/src/gplx/xowa/files/Xof_fsdb_itm.java @@ -50,9 +50,10 @@ public class Xof_fsdb_itm implements Xof_file_itm { public boolean File_is_orig() {return file_is_orig;} private boolean file_is_orig; public int File_w() {return file_w;} private int file_w; public long File_size() {return file_size;} private long file_size; - public boolean Meta_is_new() {return false;} + public boolean Dbmeta_is_new() {return false;} public boolean Orig_exists() {return orig_exists;} public void Orig_exists_y_() {orig_exists = Bool_.Y;} public void Orig_exists_n_() {orig_exists = Bool_.N;} private boolean orig_exists; public boolean File_exists() {return file_exists;} public void File_exists_y_() {file_exists = Bool_.Y;} public void File_exists_n_() {file_exists = Bool_.N;} public void File_exists_(boolean v) {file_exists = v;} private boolean file_exists; + public boolean File_exists_in_cache() {return file_exists_in_cache;} private boolean file_exists_in_cache; public boolean File_resized() {return file_resized;} public void File_resized_y_() {file_resized = Bool_.Y;} private boolean file_resized; public boolean Fsdb_insert() {return fsdb_insert;} public void Fsdb_insert_y_() {fsdb_insert = true;} private boolean fsdb_insert; public int Xfer_idx() {return xfer_idx;} private int xfer_idx; @@ -117,6 +118,10 @@ public class Xof_fsdb_itm implements Xof_file_itm { public void Init_at_xfer(int idx, int len) { this.xfer_idx = idx; this.xfer_len = len; } + public void Init_at_cache(boolean file_exists_in_cache, int w, int h, Io_url view_url) { + this.file_exists_in_cache = file_exists_in_cache; + this.html_w = w; this.html_h = h; this.html_view_url = view_url; + } public void Change_repo(byte orig_repo_id, byte[] orig_repo_name) { this.orig_repo_id = orig_repo_id; this.orig_repo_name = orig_repo_name; } diff --git a/400_xowa/src/gplx/xowa/files/Xof_xfer_itm.java b/400_xowa/src/gplx/xowa/files/Xof_xfer_itm.java index d07d03958..e69f010d1 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_xfer_itm.java +++ b/400_xowa/src/gplx/xowa/files/Xof_xfer_itm.java @@ -62,7 +62,8 @@ public class Xof_xfer_itm implements Xof_file_itm { public int Html_gallery_mgr_h() {return html_gallery_mgr_h;} private int html_gallery_mgr_h; public Js_img_wkr Html_img_wkr() {return html_img_wkr;} private Js_img_wkr html_img_wkr; public boolean File_exists() {return file_exists;} private boolean file_exists; - public boolean Meta_is_new() {return meta_itm.State_new();} + public boolean File_exists_in_cache() {return false;} + public boolean Dbmeta_is_new() {return meta_itm.State_new();} public void Html_elem_tid_(byte v) {html_elem_tid = v;} public void Html_size_(int w, int h) {this.html_w = w; this.html_h = h;} public void Html_gallery_mgr_h_(int v) {html_gallery_mgr_h = v;} @@ -120,7 +121,7 @@ public class Xof_xfer_itm implements Xof_file_itm { this.orig_ttl_md5 = Xof_file_wkr_.Md5_fast(v); } - public Xof_meta_itm Meta_itm() {return meta_itm;} private Xof_meta_itm meta_itm; + public Xof_meta_itm Dbmeta_itm() {return meta_itm;} private Xof_meta_itm meta_itm; public void Trg_repo_itm_(Xof_repo_itm v) { trg_repo_itm = v; trg_repo_root = trg_repo_itm == null ? Bry_.Empty : trg_repo_itm.Root_http(); diff --git a/400_xowa/src/gplx/xowa/files/Xow_file_mgr.java b/400_xowa/src/gplx/xowa/files/Xow_file_mgr.java index 533bf5748..2dddac765 100644 --- a/400_xowa/src/gplx/xowa/files/Xow_file_mgr.java +++ b/400_xowa/src/gplx/xowa/files/Xow_file_mgr.java @@ -68,7 +68,7 @@ public class Xow_file_mgr implements GfoInvkAble { } public static final byte Version_null = Byte_.Max_value_127, Version_1 = 1, Version_2 = 2; public Xowe_repo_mgr Repo_mgr() {return repo_mgr;} private Xowe_repo_mgr repo_mgr; - public Xof_meta_mgr Meta_mgr() {return meta_mgr;} private Xof_meta_mgr meta_mgr; + public Xof_meta_mgr Dbmeta_mgr() {return meta_mgr;} private Xof_meta_mgr meta_mgr; public Xof_cfg_download Cfg_download() {return cfg_download;} private Xof_cfg_download cfg_download = new Xof_cfg_download(); public void Cfg_set(String grp, String key, String val) { // TEST: should only be called by tests if (test_grps == null) test_grps = Hash_adp_.new_(); diff --git a/400_xowa/src/gplx/xowa/files/caches/Xofc_dir_tbl.java b/400_xowa/src/gplx/xowa/files/caches/Xofc_dir_tbl.java index 095fcfbec..01d12db62 100644 --- a/400_xowa/src/gplx/xowa/files/caches/Xofc_dir_tbl.java +++ b/400_xowa/src/gplx/xowa/files/caches/Xofc_dir_tbl.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.files.caches; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; class Xofc_dir_tbl implements Rls_able { - private String tbl_name = "file_cache_dir"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private String tbl_name = "file_cache_dir"; private final Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); private String fld_id, fld_name; private Db_conn conn; private final Db_stmt_bldr stmt_bldr = new Db_stmt_bldr(); private Db_stmt select_stmt; public void Conn_(Db_conn new_conn, boolean created, boolean schema_is_1) { @@ -31,8 +31,8 @@ class Xofc_dir_tbl implements Rls_able { fld_id = flds.Add_int_pkey(fld_prefix + "id"); fld_name = flds.Add_str(fld_prefix + "name", 255); if (created) { - Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds - , Db_meta_idx.new_normal_by_tbl(tbl_name, "name", fld_name) + Dbmeta_tbl_itm meta = Dbmeta_tbl_itm.New(tbl_name, flds + , Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, "name", fld_name) ); conn.Ddl_create_tbl(meta); } @@ -73,7 +73,7 @@ class Xofc_dir_tbl implements Rls_able { } public void Select_all(List_adp list) { list.Clear(); - Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empty).Exec_select__rls_auto(); + Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Dbmeta_fld_itm.Str_ary_empty).Exec_select__rls_auto(); try { while (rdr.Move_next()) list.Add(new_itm(rdr)); diff --git a/400_xowa/src/gplx/xowa/files/caches/Xofc_fil_mgr.java b/400_xowa/src/gplx/xowa/files/caches/Xofc_fil_mgr.java index 0f10a664e..9ca0453fa 100644 --- a/400_xowa/src/gplx/xowa/files/caches/Xofc_fil_mgr.java +++ b/400_xowa/src/gplx/xowa/files/caches/Xofc_fil_mgr.java @@ -120,7 +120,7 @@ class Xofc_fil_mgr { private void Fsys_delete(Xof_url_bldr url_bldr, Xoae_wiki_mgr wiki_mgr, Xoa_repo_mgr repo_mgr, Xofc_dir_mgr dir_mgr, Xofc_fil_itm itm) { byte mode_id = itm.Is_orig() ? Xof_repo_itm_.Mode_orig : Xof_repo_itm_.Mode_thumb; byte[] wiki_domain = dir_mgr.Get_by_id(itm.Dir_id()).Name(); - Xowe_wiki wiki = wiki_mgr.Get_by_key_or_make(wiki_domain); + Xowe_wiki wiki = wiki_mgr.Get_by_or_make(wiki_domain); wiki.Init_assert(); Xof_repo_itm trg_repo = repo_mgr.Get_by_primary(wiki_domain); byte[] ttl = itm.Name(); diff --git a/400_xowa/src/gplx/xowa/files/caches/Xofc_fil_tbl.java b/400_xowa/src/gplx/xowa/files/caches/Xofc_fil_tbl.java index 93bff718a..2fd8d1fa8 100644 --- a/400_xowa/src/gplx/xowa/files/caches/Xofc_fil_tbl.java +++ b/400_xowa/src/gplx/xowa/files/caches/Xofc_fil_tbl.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.files.caches; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; class Xofc_fil_tbl implements Rls_able { - private String tbl_name = "file_cache_fil"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private String tbl_name = "file_cache_fil"; private final Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); private String fld_uid, fld_dir_id, fld_name, fld_is_orig, fld_w, fld_h, fld_time, fld_page, fld_ext, fld_size, fld_cache_time; private Db_conn conn; private final Db_stmt_bldr stmt_bldr = new Db_stmt_bldr(); private Db_stmt select_itm_stmt, select_itm_v2_stmt; public Db_conn Conn() {return conn;} @@ -37,7 +37,7 @@ class Xofc_fil_tbl implements Rls_able { fld_h = flds.Add_int(fld_prefix + "h"); fld_time = flds.Add_int(fld_prefix + "thumbtime"); if (schema_is_1) { - fld_page = Db_meta_fld.Key_null; + fld_page = Dbmeta_fld_itm.Key_null; } else { fld_page = flds.Add_int(fld_prefix + "page"); @@ -46,8 +46,8 @@ class Xofc_fil_tbl implements Rls_able { fld_size = flds.Add_long(fld_prefix + "size"); fld_cache_time = flds.Add_long("cache_time"); if (created) { - Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds - , Db_meta_idx.new_normal_by_tbl(tbl_name, "fil", fld_name, fld_is_orig, fld_w, fld_h, fld_time, fld_cache_time, fld_uid) + Dbmeta_tbl_itm meta = Dbmeta_tbl_itm.New(tbl_name, flds + , Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, "fil", fld_name, fld_is_orig, fld_w, fld_h, fld_time, fld_cache_time, fld_uid) ); conn.Ddl_create_tbl(meta); } @@ -122,7 +122,7 @@ class Xofc_fil_tbl implements Rls_able { } public void Select_all(Bry_bfr fil_key_bldr, Ordered_hash hash) { hash.Clear(); - Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empty).Exec_select__rls_auto(); + Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Dbmeta_fld_itm.Str_ary_empty).Exec_select__rls_auto(); try { while (rdr.Move_next()) { Xofc_fil_itm fil_itm = new_itm(rdr); diff --git a/400_xowa/src/gplx/xowa/files/caches/Xou_cache_finder.java b/400_xowa/src/gplx/xowa/files/caches/Xou_cache_finder.java new file mode 100644 index 000000000..5e09c6303 --- /dev/null +++ b/400_xowa/src/gplx/xowa/files/caches/Xou_cache_finder.java @@ -0,0 +1,23 @@ +/* +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.files.caches; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; +public interface Xou_cache_finder { + boolean Find(Xow_wiki wiki, byte[] page_url, Xof_fsdb_itm fsdb_itm); + void Clear(); + void Add(Xof_fsdb_itm fsdb_itm); +} diff --git a/400_xowa/src/gplx/xowa/files/caches/Xou_cache_finder_.java b/400_xowa/src/gplx/xowa/files/caches/Xou_cache_finder_.java new file mode 100644 index 000000000..3771b24dd --- /dev/null +++ b/400_xowa/src/gplx/xowa/files/caches/Xou_cache_finder_.java @@ -0,0 +1,79 @@ +/* +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.files.caches; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; +import gplx.xowa.files.repos.*; +public class Xou_cache_finder_ { + public static final Xou_cache_finder Noop = new Xou_cache_finder_noop(); + public static Xou_cache_finder New_mem() {return new Xou_cache_finder_mem();} + public static Xou_cache_finder New_db(Xou_cache_mgr cache_mgr) {return new Xou_cache_finder_db(cache_mgr);} +} +class Xou_cache_finder_noop implements Xou_cache_finder { + public boolean Find(Xow_wiki wiki, byte[] page_url, Xof_fsdb_itm fsdb_itm) { + fsdb_itm.Init_at_cache(false, 0, 0, Io_url_.Empty); + return false; + } + public void Clear() {} + public void Add(Xof_fsdb_itm fsdb_itm) {} +} +class Xou_cache_finder_mem implements Xou_cache_finder { + private final Ordered_hash hash = Ordered_hash_.New_bry(); + private final Bry_bfr tmp_bfr = Bry_bfr.new_(255); + private final Xof_img_size img_size = new Xof_img_size(); + private final Xof_url_bldr url_bldr = Xof_url_bldr.new_v2(); + public boolean Find(Xow_wiki wiki, byte[] page_url, Xof_fsdb_itm cur) { + byte[] key = Xou_cache_itm.Key_gen(tmp_bfr, cur.Lnki_wiki_abrv(), cur.Lnki_ttl(), cur.Lnki_type(), cur.Lnki_upright(), cur.Lnki_w(), cur.Lnki_h(), cur.Lnki_time(), cur.Lnki_page(), cur.User_thumb_w()); + Xof_fsdb_itm mem = (Xof_fsdb_itm)hash.Get_by(key); + if (mem == null) { + cur.Init_at_cache(false, 0, 0, Io_url_.Empty); + return false; + } + Xof_repo_itm repo = wiki.File__repo_mgr().Get_trg_by_id_or_null(mem.Orig_repo_id(), mem.Lnki_ttl(), page_url); + mem.Init_at_html(Xof_exec_tid.Tid_wiki_page, img_size, repo, url_bldr); + cur.Init_at_cache(true, mem.Html_w(), mem.Html_h(), mem.Html_view_url()); + return true; + } + public void Clear() {} + public void Add(Xof_fsdb_itm cur) { + byte[] key = Xou_cache_itm.Key_gen(tmp_bfr, cur.Lnki_wiki_abrv(), cur.Lnki_ttl(), cur.Lnki_type(), cur.Lnki_upright(), cur.Lnki_w(), cur.Lnki_h(), cur.Lnki_time(), cur.Lnki_page(), cur.User_thumb_w()); + hash.Add(key, cur); + } +} +class Xou_cache_finder_db implements Xou_cache_finder { + private final Xou_cache_mgr cache_mgr; + private final Xof_img_size img_size = new Xof_img_size(); private final Xof_url_bldr url_bldr = Xof_url_bldr.new_v2(); + public Xou_cache_finder_db(Xou_cache_mgr cache_mgr) {this.cache_mgr = cache_mgr;} + public boolean Find(Xow_wiki wiki, byte[] page_url, Xof_fsdb_itm cur) { + Xou_cache_itm cache_itm = cache_mgr.Get_or_null(cur); + if (cache_itm != null) { + Xof_repo_itm repo = wiki.File__repo_mgr().Get_trg_by_id_or_null(cache_itm.Orig_repo_id(), cur.Lnki_ttl(), page_url); + if (repo != null) {// unknown repo; shouldn't happen, but exit, else null ref + cur.Init_at_orig((byte)cache_itm.Orig_repo_id(), repo.Wiki_domain(), cache_itm.Orig_ttl(), cache_itm.Orig_ext_itm(), cache_itm.Orig_w(), cache_itm.Orig_h(), Bry_.Empty); + cur.Init_at_html(Xof_exec_tid.Tid_wiki_page, img_size, repo, url_bldr); + if (Io_mgr.Instance.ExistsFil(cur.Html_view_url())) { + cache_itm.Update_view_stats(); + cur.Init_at_cache(true, cur.Html_w(), cur.Html_h(), cur.Html_view_url()); + return true; + } + } + } + cur.Init_at_cache(false, 0, 0, Io_url_.Empty); + return false; + } + public void Clear() {} + public void Add(Xof_fsdb_itm cur) {} +} diff --git a/400_xowa/src/gplx/xowa/files/caches/Xou_cache_mgr.java b/400_xowa/src/gplx/xowa/files/caches/Xou_cache_mgr.java index 508c60201..9e555b54b 100644 --- a/400_xowa/src/gplx/xowa/files/caches/Xou_cache_mgr.java +++ b/400_xowa/src/gplx/xowa/files/caches/Xou_cache_mgr.java @@ -160,7 +160,7 @@ public class Xou_cache_mgr { } private Io_url Calc_url(Xou_cache_itm cache) { byte[] wiki_domain = Xow_abrv_xo_.To_itm(cache.Lnki_wiki_abrv()).Domain_bry(); - Xow_wiki wiki = wiki_mgr.Get_by_key_or_make_init_y(wiki_domain); if (wiki == null) return Io_url_.Empty; // wiki is not available; should only happen in read-only mode; DATE:2015-05-23 + Xow_wiki wiki = wiki_mgr.Get_by_or_make_init_y(wiki_domain); if (wiki == null) return Io_url_.Empty; // wiki is not available; should only happen in read-only mode; DATE:2015-05-23 Xof_repo_itm trg_repo = wiki.File__repo_mgr().Get_trg_by_id_or_null(cache.Orig_repo_id(), cache.Lnki_ttl(), Bry_.Empty); if (trg_repo == null) return Io_url_.Empty; byte[] orig_ttl = cache.Orig_ttl(); diff --git a/400_xowa/src/gplx/xowa/files/caches/Xou_cache_tbl.java b/400_xowa/src/gplx/xowa/files/caches/Xou_cache_tbl.java index 70fd13561..b6a6de47c 100644 --- a/400_xowa/src/gplx/xowa/files/caches/Xou_cache_tbl.java +++ b/400_xowa/src/gplx/xowa/files/caches/Xou_cache_tbl.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.files.caches; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.dbs.*; public class Xou_cache_tbl implements Rls_able { - private String tbl_name = "file_cache"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private String tbl_name = "file_cache"; private final Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); private String fld_lnki_wiki_abrv, fld_lnki_ttl, fld_lnki_type, fld_lnki_upright, fld_lnki_w, fld_lnki_h, fld_lnki_time, fld_lnki_page, fld_user_thumb_w , fld_orig_repo, fld_orig_ttl, fld_orig_ext, fld_orig_w, fld_orig_h @@ -65,10 +65,10 @@ public class Xou_cache_tbl implements Rls_able { select_stmt = Db_stmt_.Rls(select_stmt); } public void Create_tbl() { - Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds - , Db_meta_idx.new_unique_by_tbl(tbl_name, "main", fld_lnki_wiki_abrv, fld_lnki_ttl, fld_lnki_type, fld_lnki_upright, fld_lnki_w, fld_lnki_h, fld_lnki_time, fld_lnki_page, fld_user_thumb_w) - , Db_meta_idx.new_normal_by_tbl(tbl_name, "size", fld_file_size) - , Db_meta_idx.new_normal_by_tbl(tbl_name, "date", fld_view_date) + Dbmeta_tbl_itm meta = Dbmeta_tbl_itm.New(tbl_name, flds + , Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "main", fld_lnki_wiki_abrv, fld_lnki_ttl, fld_lnki_type, fld_lnki_upright, fld_lnki_w, fld_lnki_h, fld_lnki_time, fld_lnki_page, fld_user_thumb_w) + , Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, "size", fld_file_size) + , Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, "date", fld_view_date) ); conn.Ddl_create_tbl(meta); } @@ -90,7 +90,7 @@ public class Xou_cache_tbl implements Rls_able { } public void Select_all(Bry_bfr fil_key_bldr, Ordered_hash hash) { hash.Clear(); - Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empty).Exec_select__rls_auto(); + Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Dbmeta_fld_itm.Str_ary_empty).Exec_select__rls_auto(); try { while (rdr.Move_next()) { Xou_cache_itm itm = new_itm(rdr); @@ -112,7 +112,7 @@ public class Xou_cache_tbl implements Rls_able { itm.Db_state_(Db_cmd_mode.Tid_ignore); } catch (Exception e) {stmt_bldr.Rls(); throw Err_.new_exc(e, "xo", "db_save failed");} } - @gplx.Internal protected Db_rdr Select_all_for_test() {return conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empty).Exec_select__rls_manual();} + @gplx.Internal protected Db_rdr Select_all_for_test() {return conn.Stmt_select(tbl_name, flds, Dbmeta_fld_itm.Str_ary_empty).Exec_select__rls_manual();} private void Db_save_crt(Db_stmt stmt, Xou_cache_itm itm, boolean insert) { if (insert) { stmt.Val_bry_as_str (fld_lnki_wiki_abrv , itm.Lnki_wiki_abrv()) diff --git a/400_xowa/src/gplx/xowa/files/commons/Xof_commons_image_tbl.java b/400_xowa/src/gplx/xowa/files/commons/Xof_commons_image_tbl.java index 89bb60b77..e0dd3555e 100644 --- a/400_xowa/src/gplx/xowa/files/commons/Xof_commons_image_tbl.java +++ b/400_xowa/src/gplx/xowa/files/commons/Xof_commons_image_tbl.java @@ -52,7 +52,7 @@ public class Xof_commons_image_tbl implements Rls_able { ); } finally {rdr.Rls();} } - private static final String tbl_name = "image"; private static final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private static final String tbl_name = "image"; private static final Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); private static final String fld_img_name = flds.Add_str("img_name", 255) // varbinary(255) , fld_img_media_type = flds.Add_str("img_media_type", 255) // enum('UNKNOWN','BITMAP','DRAWING','AUDIO','VIDEO','MULTIMEDIA','OFFICE','TEXT','EXECUTABLE','ARCHIVE')" @@ -64,9 +64,9 @@ public class Xof_commons_image_tbl implements Rls_able { , fld_img_ext_id = flds.Add_int("img_ext_id") // xowa , fld_img_timestamp = flds.Add_str("img_timestamp", 255) // 20140101155749 ; - public static Db_meta_tbl new_meta() { - return Db_meta_tbl.new_(tbl_name, flds.To_fld_ary() - , Db_meta_idx.new_normal_by_tbl(tbl_name, "name", fld_img_name, fld_img_timestamp) + public static Dbmeta_tbl_itm new_meta() { + return Dbmeta_tbl_itm.New(tbl_name, flds.To_fld_ary() + , Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, "name", fld_img_name, fld_img_timestamp) ); } } diff --git a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Orig_fil_tbl.java b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Orig_fil_tbl.java index afac508c9..71ab22e0b 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Orig_fil_tbl.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Orig_fil_tbl.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.files.fsdb.fs_roots; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.xowa.files.fsdb.*; import gplx.dbs.*; public class Orig_fil_tbl implements Rls_able { - private String tbl_name = "orig_fil"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private String tbl_name = "orig_fil"; private final Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); private String fld_uid, fld_name, fld_ext_id, fld_w, fld_h, fld_dir_url; private Db_conn conn; private Db_stmt stmt_insert, stmt_select; public void Conn_(Db_conn new_conn, boolean created, boolean schema_is_1) { @@ -34,8 +34,8 @@ public class Orig_fil_tbl implements Rls_able { fld_h = flds.Add_int(fld_prefix + "h"); fld_dir_url = flds.Add_str(fld_prefix + "dir_url", 1024); // NOTE: don't put dir in separate table; note that entire root_dir_wkr is not built to scale due to need for recursively loading all files if (created) { - Db_meta_tbl meta = Db_meta_tbl.new_(tbl_name, flds - , Db_meta_idx.new_unique_by_tbl(tbl_name, "main", fld_name) + Dbmeta_tbl_itm meta = Dbmeta_tbl_itm.New(tbl_name, flds + , Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "main", fld_name) ); conn.Ddl_create_tbl(meta); } diff --git a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_tbl.java b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_tbl.java index 44756c463..1d7793328 100644 --- a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_tbl.java +++ b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_tbl.java @@ -20,7 +20,7 @@ import gplx.core.primitives.*; import gplx.dbs.*; import gplx.dbs.utls.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.files.repos.*; public class Xof_orig_tbl implements Rls_able { - private final String tbl_name; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private final String tbl_name; private final Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); private final String fld_repo, fld_ttl, fld_status, fld_ext, fld_w, fld_h, fld_redirect; private final Db_conn conn; private final Xof_orig_tbl__in_wkr select_in_wkr = new Xof_orig_tbl__in_wkr(); public Db_conn Conn() {return conn;} @@ -40,7 +40,7 @@ public class Xof_orig_tbl implements Rls_able { conn.Rls_reg(this); } public void Rls() {} - public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_normal_by_tbl(tbl_name, "main", fld_ttl)));} + public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, "main", fld_ttl)));} public void Select_by_list(Ordered_hash rv, List_adp itms) {select_in_wkr.Init(rv, itms).Select_in(Cancelable_.Never, conn, 0, itms.Count());} public Xof_orig_itm Select_itm(byte[] ttl) { Xof_orig_itm rv = Xof_orig_itm.Null; @@ -87,9 +87,9 @@ public class Xof_orig_tbl implements Rls_able { private static final byte Status_found = 1; } class Xof_orig_tbl__in_wkr extends Db_in_wkr__base { - private Xof_orig_tbl tbl; private String tbl_name; private Db_meta_fld_list flds; private String fld_ttl; + private Xof_orig_tbl tbl; private String tbl_name; private Dbmeta_fld_list flds; private String fld_ttl; private List_adp itms; private Ordered_hash rv; - public void Ctor(Xof_orig_tbl tbl, String tbl_name, Db_meta_fld_list flds, String fld_ttl) { + public void Ctor(Xof_orig_tbl tbl, String tbl_name, Dbmeta_fld_list flds, String fld_ttl) { this.tbl = tbl; this.tbl_name = tbl_name; this.flds = flds; this.fld_ttl = fld_ttl; } public Xof_orig_tbl__in_wkr Init(Ordered_hash rv, List_adp itms) {this.itms = itms; this.rv = rv; return this;} diff --git a/400_xowa/src/gplx/xowa/files/repos/Xofw_wiki_wkr_base.java b/400_xowa/src/gplx/xowa/files/repos/Xofw_wiki_wkr_base.java index 0f89bfd2e..abb3db31b 100644 --- a/400_xowa/src/gplx/xowa/files/repos/Xofw_wiki_wkr_base.java +++ b/400_xowa/src/gplx/xowa/files/repos/Xofw_wiki_wkr_base.java @@ -28,8 +28,7 @@ public class Xofw_wiki_wkr_base implements Xofw_wiki_finder { Xof_repo_pair repo_pair = (Xof_repo_pair)repo_pairs.Get_at(i); byte[] wiki_key = repo_pair.Src().Wiki_domain(); if (repo_pair.Src().Wmf_api()) continue; - Xowe_wiki repo_wiki = wiki_mgr.Get_by_key_or_null(wiki_key); - if (repo_wiki == null) {continue;} + Xowe_wiki repo_wiki = (Xowe_wiki)wiki_mgr.Get_by_or_null(wiki_key); if (repo_wiki == null) {continue;} Xoa_ttl ttl = Xoa_ttl.parse(repo_wiki, ttl_bry); Xow_ns file_ns = repo_wiki.Ns_mgr().Ns_file(); boolean found = repo_wiki.Db_mgr().Load_mgr().Load_by_ttl(tmp_db_page, file_ns, ttl.Page_db()); @@ -50,8 +49,7 @@ public class Xofw_wiki_wkr_base implements Xofw_wiki_finder { for (int i = 0; i < repo_pairs_len; i++) { Xof_repo_pair repo_pair = (Xof_repo_pair)repo_pairs.Get_at(i); byte[] src_wiki_key = repo_pair.Src().Wiki_domain(); - Xowe_wiki src_wiki = wiki_mgr.Get_by_key_or_null(src_wiki_key); - if (src_wiki == null) continue; // src_wiki defined as repo_pair in cfg, but it has not been downloaded; continue; EX: commons set up but not downloaded + Xowe_wiki src_wiki = (Xowe_wiki)wiki_mgr.Get_by_or_null(src_wiki_key); if (src_wiki == null) continue; // src_wiki defined as repo_pair in cfg, but it has not been downloaded; continue; EX: commons set up but not downloaded boolean found = src_wiki.Db_mgr().Load_mgr().Load_by_ttl(tmp_db_page, file_ns, ttl_db_key); if (!found) continue; // ttl does not exist in src_wiki; continue; EX: file does not exist in commons, but exists in en_wiki byte[] redirect = Get_redirect(src_wiki, file_ns, tmp_db_page); diff --git a/400_xowa/src/gplx/xowa/files/repos/Xowe_repo_mgr.java b/400_xowa/src/gplx/xowa/files/repos/Xowe_repo_mgr.java index 468cd9d63..58c62c21f 100644 --- a/400_xowa/src/gplx/xowa/files/repos/Xowe_repo_mgr.java +++ b/400_xowa/src/gplx/xowa/files/repos/Xowe_repo_mgr.java @@ -70,7 +70,7 @@ public class Xowe_repo_mgr implements Xow_repo_mgr, GfoInvkAble { public Xof_repo_pair[] Repos_ary() {if (repos_ary == null) repos_ary = (Xof_repo_pair[])repos.To_ary(Xof_repo_pair.class); return repos_ary;} private Xof_repo_pair[] repos_ary; public boolean Xfer_by_meta(Xof_xfer_itm xfer_itm, Xof_xfer_queue queue) { byte[] ttl = xfer_itm.Lnki_ttl(); - Xof_meta_itm meta_itm = xfer_itm.Meta_itm(); + Xof_meta_itm meta_itm = xfer_itm.Dbmeta_itm(); boolean chk_all = false; byte[] src_wiki_key = wiki.Domain_bry(); if (meta_itm.State_new()) { @@ -107,9 +107,9 @@ public class Xowe_repo_mgr implements Xow_repo_mgr, GfoInvkAble { byte[] trg_wiki_key = Bry_.Empty; if (repo_idx != Xof_meta_itm.Repo_unknown) { trg_wiki_key = wiki.File_mgr().Repo_mgr().Repos_get_at(repo_idx).Wiki_domain(); - trg_wiki = wiki.Appe().Wiki_mgr().Get_by_key_or_make(trg_wiki_key); + trg_wiki = wiki.Appe().Wiki_mgr().Get_by_or_make(trg_wiki_key); } - Xof_meta_itm redirect_meta = trg_wiki.File_mgr().Meta_mgr().Get_itm_or_new(redirect, md5); + Xof_meta_itm redirect_meta = trg_wiki.File_mgr().Dbmeta_mgr().Get_itm_or_new(redirect, md5); if (tmp_rslt.Redirect() == Xop_redirect_mgr.Redirect_null_bry) { if (redirect_meta.State_new()) { if (repo_idx == Xof_meta_itm.Repo_unknown) { @@ -152,8 +152,8 @@ public class Xowe_repo_mgr implements Xow_repo_mgr, GfoInvkAble { boolean make = xfer_mgr.Make_file(wiki); if (make) { xfer_itm.Trg_repo_itm_(pair.Trg()); - if (second_chance && xfer_itm.Meta_itm().Vrtl_repo() == 0) // second_chance and item found; change vrtl_repo from commons back to same; EX: tarball and [[Image:Rembrandt De aartsengel verlaat Tobias en zijn gezin. 1637.jpg|120px]] - xfer_itm.Meta_itm().Vrtl_repo_(Xof_meta_itm.Repo_same); + if (second_chance && xfer_itm.Dbmeta_itm().Vrtl_repo() == 0) // second_chance and item found; change vrtl_repo from commons back to same; EX: tarball and [[Image:Rembrandt De aartsengel verlaat Tobias en zijn gezin. 1637.jpg|120px]] + xfer_itm.Dbmeta_itm().Vrtl_repo_(Xof_meta_itm.Repo_same); return true; // file was made; return; if not continue looking at other repos } } @@ -211,7 +211,7 @@ public class Xowe_repo_mgr implements Xow_repo_mgr, GfoInvkAble { for (int i = 0; i < len; i++) { Xof_repo_pair pair = (Xof_repo_pair)repos.Get_at(i); if (i != repo_idx) { // try other wikis - file.Meta_itm().Orig_exists_(Xof_meta_itm.Exists_unknown); // always reset orig exists; this may have been flagged to missing above and should be cleared + file.Dbmeta_itm().Orig_exists_(Xof_meta_itm.Exists_unknown); // always reset orig exists; this may have been flagged to missing above and should be cleared make_pass = Xfer_file_exec(file, pair, i); if (make_pass) break; } @@ -220,7 +220,7 @@ public class Xowe_repo_mgr implements Xow_repo_mgr, GfoInvkAble { } private boolean Xfer_file_exec(Xof_xfer_itm file, Xof_repo_pair pair, int repo_idx) { xfer_mgr.Atrs_by_itm(file, pair.Src(), pair.Trg()); - Xof_meta_itm meta_itm = xfer_mgr.Meta_itm(); + Xof_meta_itm meta_itm = xfer_mgr.Dbmeta_itm(); boolean rv = xfer_mgr.Make_file(wiki); if (rv) { meta_itm.Vrtl_repo_(repo_idx); // update repo_idx to whatever is found diff --git a/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_mgr.java b/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_mgr.java index 7500e19a2..05c3582b6 100644 --- a/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_mgr.java +++ b/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_mgr.java @@ -34,14 +34,14 @@ public class Xof_xfer_mgr { this.orig_file_len = xfer_itm.Orig_file_len(); this.src_repo = src_repo; src_repo_is_wmf = src_repo.Wmf_fsys(); this.trg_repo = trg_repo; - this.meta_itm = xfer_itm.Meta_itm(); + this.meta_itm = xfer_itm.Dbmeta_itm(); ext_rule = src_repo.Ext_rules().Get_or_null(orig_ext.Ext()); orig_w = 0; orig_h = 0; file_w = 0; file_h = 0; } private byte lnki_type; private Xof_xfer_itm xfer_itm; private double lnki_thumbtime = Xof_lnki_time.Null; private boolean lnki_thumbable; private int lnki_w, lnki_h, file_w, file_h; private double lnki_upright; private Xof_ext orig_ext; private Xof_rule_itm ext_rule; private Xof_repo_itm src_repo, trg_repo; private boolean src_repo_is_wmf; private byte[] orig_ttl, orig_ttl_md5; private int orig_w, orig_h; private long orig_file_len; private int lnki_page = Xof_lnki_page.Null; - public Xof_meta_itm Meta_itm() {return meta_itm;} private Xof_meta_itm meta_itm; + public Xof_meta_itm Dbmeta_itm() {return meta_itm;} private Xof_meta_itm meta_itm; public boolean Download_allowed_by_ext() {return orig_file_len < ext_rule.Make_max();} public Xof_xfer_mgr Check_file_exists_before_xfer_n_() {check_file_exists_before_xfer = false; return this;} private boolean check_file_exists_before_xfer = true; public boolean Make_file(Xowe_wiki wiki) { diff --git a/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_queue.java b/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_queue.java index 304d09314..e1de14e3e 100644 --- a/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_queue.java +++ b/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_queue.java @@ -43,13 +43,13 @@ public class Xof_xfer_queue { for (int i = 0; i < xfer_len; i++) { if (wiki.Appe().Usr_dlg().Canceled()) break; Xof_xfer_itm xfer_itm = (Xof_xfer_itm)xfer_list.Get_at(i); - meta_mgr = xfer_itm.Meta_itm().Owner_fil().Owner_mgr(); + meta_mgr = xfer_itm.Dbmeta_itm().Owner_fil().Owner_mgr(); byte[] meta_mgr_key = meta_mgr.Wiki().Domain_bry(); if (!dirty_meta_mgrs.Has(meta_mgr_key)) dirty_meta_mgrs.Add(meta_mgr_key, meta_mgr); // only add if new String queue_msg = usr_dlg.Prog_many("", "", "downloading ~{0} of ~{1}: ~{2};", i + List_adp_.Base1, xfer_len, xfer_itm.Lnki_ttl()); wiki.App().Wmf_mgr().Download_wkr().Download_xrg().Prog_fmt_hdr_(queue_msg); wiki.File_mgr().Repo_mgr().Xfer_by_meta(xfer_itm, this); - xfer_itm.Set__meta(xfer_itm.Meta_itm(), xfer_itm.Meta_itm().Repo_itm(wiki), wiki.Html_mgr().Img_thumb_width()); + xfer_itm.Set__meta(xfer_itm.Dbmeta_itm(), xfer_itm.Dbmeta_itm().Repo_itm(wiki), wiki.Html_mgr().Img_thumb_width()); xfer_itm.Calc_by_meta(); if (!xfer_itm.File_exists()) continue; // file not found; don't call Update_img, else invalid src will be passed and caption box will be incorrectly resized; EX:ar.d:جَبَّارَة; DATE:2014-04-13 if (Bry_.Len_gt_0(xfer_itm.Html_view_url().To_http_file_bry()) // only update images that have been found; otherwise "Undefined" shows up in image box diff --git a/400_xowa/src/gplx/xowa/guis/Xogv_page_load_wkr.java b/400_xowa/src/gplx/xowa/guis/Xogv_page_load_wkr.java index b4faf18eb..25de7aacc 100644 --- a/400_xowa/src/gplx/xowa/guis/Xogv_page_load_wkr.java +++ b/400_xowa/src/gplx/xowa/guis/Xogv_page_load_wkr.java @@ -33,7 +33,7 @@ class Xogv_page_load_wkr implements Gfo_thread_wkr, GfoInvkAble { tab.Show_page(old_itm, new_itm, new_hpg); } private Xoh_page Fetch_page(byte[] wiki_domain, byte[] page_bry, byte[] qarg_bry) { - Xowv_wiki wiki = wiki_mgr.Get_by_domain(wiki_domain); + Xowv_wiki wiki = (Xowv_wiki)wiki_mgr.Get_by_or_null(wiki_domain); if (wiki == null) return new Xoh_page().Exists_n_(); // wiki does not exist; happens with xwiki; PAGE:s.w:Photon; EX:[[wikt:transmit]]; DATE:2015-04-27 Xoa_ttl ttl = wiki.Ttl_parse(page_bry); Gfo_url url = url_parser.Parse(Bry_.Add(wiki_domain, Byte_ascii.Slash_bry, page_bry, qarg_bry)); diff --git a/400_xowa/src/gplx/xowa/guis/Xogv_tab_base.java b/400_xowa/src/gplx/xowa/guis/Xogv_tab_base.java index 09bae7ec2..39fb0e6cd 100644 --- a/400_xowa/src/gplx/xowa/guis/Xogv_tab_base.java +++ b/400_xowa/src/gplx/xowa/guis/Xogv_tab_base.java @@ -27,7 +27,7 @@ public abstract class Xogv_tab_base { public void Ctor(Xoav_wiki_mgr wiki_mgr, Gfo_thread_pool thread_pool, Gfo_url_parser url_parser) {this.wiki_mgr = wiki_mgr; this.thread_pool = thread_pool; this.url_parser = url_parser;} public Xog_history_stack History_stack() {return history_stack;} private final Xog_history_stack history_stack = new Xog_history_stack(); public Xog_history_itm Cur_itm() {return history_stack.Cur_itm();} - public Xow_wiki Get_wiki_or_null(byte[] key) {return wiki_mgr.Get_by_domain(key);} + public Xow_wiki Get_wiki_or_null(byte[] key) {return wiki_mgr.Get_by_or_null(key);} public Xoh_page Go_to(byte[] page) {return Go_to(history_stack.Cur_itm().Wiki(), page, Bry_.Empty, Bry_.Empty, false, "");} public Xoh_page Go_to(byte[] wiki, byte[] page) {return Go_to(wiki, page, Bry_.Empty, Bry_.Empty, false, "");} public Xoh_page Go_to(byte[] wiki, byte[] page, byte[] anch, byte[] qarg, boolean redirect_force, String bmk_pos) { diff --git a/400_xowa/src/gplx/xowa/guis/views/Xog_launcher_tabs.java b/400_xowa/src/gplx/xowa/guis/views/Xog_launcher_tabs.java index b48e77677..8bdf97ad3 100644 --- a/400_xowa/src/gplx/xowa/guis/views/Xog_launcher_tabs.java +++ b/400_xowa/src/gplx/xowa/guis/views/Xog_launcher_tabs.java @@ -61,7 +61,7 @@ class Xog_launcher_tabs { private void Launch_tab(Xog_win_itm win, Xowe_wiki home_wiki, String launch_str) { Xoae_app app = win.App(); Xoa_url launch_url = home_wiki.Utl__url_parser().Parse_by_urlbar_or_null(launch_str); if (launch_url == null) return; - Xowe_wiki launch_wiki = (Xowe_wiki)app.Wiki_mgr().Get_by_key_or_make_init_y(launch_url.Wiki_bry()); + Xowe_wiki launch_wiki = (Xowe_wiki)app.Wiki_mgr().Get_by_or_make_init_y(launch_url.Wiki_bry()); Xoa_ttl launch_ttl = Xoa_ttl.parse(launch_wiki, launch_url.Page_bry()); Xog_tab_itm tab = win.Tab_mgr().Tabs_new_init(launch_wiki, Xoae_page.New(launch_wiki, launch_ttl)); // WORKAROUND: set the tab to an empty page, else null ref later; DATE:2014-07-23 tab.Show_url_bgn(launch_url); diff --git a/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm.java b/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm.java index 0a450ae22..2d2bb99b5 100644 --- a/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm.java +++ b/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm.java @@ -113,7 +113,7 @@ public class Xog_tab_itm implements GfoInvkAble { if (page != null) page.Tab_data().Close_mgr().When_close(this, url); // cancel any current search cmds app.Log_wtr().Queue_enabled_(true); usr_dlg.Gui_wkr().Clear(); - this.wiki = (Xowe_wiki)app.Wiki_mgr().Get_by_key_or_make_init_y(url.Wiki_bry()); // NOTE: must update wiki variable; DATE:????-??-??; NOTE: must load wiki; DATE:2015-07-22 + this.wiki = (Xowe_wiki)app.Wiki_mgr().Get_by_or_make_init_y(url.Wiki_bry()); // NOTE: must update wiki variable; DATE:????-??-??; NOTE: must load wiki; DATE:2015-07-22 if (url.Page_is_main()) url.Page_bry_(wiki.Props().Main_page()); if (url.Vnt_bry() != null) Cur_vnt_(wiki, url.Vnt_bry()); Xoa_ttl ttl = Xoa_ttl.parse(wiki, url.Page_bry()); 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 14344d5d9..aaf54db20 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 @@ -253,7 +253,7 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj { boolean output_html = String_.Eq(output_str, "html"); Xowe_wiki home_wiki = app.Usere().Wiki(); Xoa_url url = home_wiki.Utl__url_parser().Parse_by_urlbar_or_null(url_str); if (url == null) return Bry_.Empty; - Xowe_wiki wiki = (Xowe_wiki)app.Wiki_mgr().Get_by_key_or_make_init_y(url.Wiki_bry()); + Xowe_wiki wiki = (Xowe_wiki)app.Wiki_mgr().Get_by_or_make_init_y(url.Wiki_bry()); Xoa_ttl ttl = Xoa_ttl.parse(wiki, url.Page_bry()); Xoae_page new_page = wiki.Data_mgr().Load_page_by_ttl(url, ttl); if (new_page.Missing()) {return Bry_.Empty;} diff --git a/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr__load.java b/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr__load.java index 30256bec6..4616b177b 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr__load.java +++ b/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr__load.java @@ -23,7 +23,7 @@ import gplx.xowa.wikis.pages.*; import gplx.xowa.wikis.pages.skins.*; public class Xow_hdump_mgr__load { private final Xow_wiki wiki; private final Xoh_hzip_mgr hzip_mgr; private final Io_stream_zip_mgr zip_mgr; private final Xoh_page tmp_hpg; private final Bry_bfr tmp_bfr; private final Xowd_page_itm tmp_dbpg = new Xowd_page_itm(); - private Hash_adp_bry page_overrides; + private Xow_override_mgr override_mgr__html, override_mgr__page; public Xow_hdump_mgr__load(Xow_wiki wiki, Xoh_hzip_mgr hzip_mgr, Io_stream_zip_mgr zip_mgr, Xoh_page tmp_hpg, Bry_bfr tmp_bfr) { this.wiki = wiki; this.hzip_mgr = hzip_mgr; this.zip_mgr = zip_mgr; this.tmp_hpg = tmp_hpg; this.tmp_bfr = tmp_bfr; this.make_mgr = new Xoh_make_mgr(wiki.App().Usr_dlg(), wiki.App().Fsys_mgr(), gplx.langs.htmls.encoders.Gfo_url_encoder_.Fsys_lnx, wiki.Domain_bry()); @@ -37,11 +37,21 @@ public class Xow_hdump_mgr__load { } public boolean Load(Xoh_page hpg, Xoa_ttl ttl) { synchronized (tmp_dbpg) { - if (page_overrides == null) page_overrides = Init_page_overrides(wiki); - if (!Load__dbpg(wiki, tmp_dbpg.Clear(), hpg, ttl)) return Load__fail(hpg); // nothing in "page" table - Xowd_db_file html_db = wiki.Data__core_mgr().Dbs__get_at(tmp_dbpg.Html_db_id()); + if (override_mgr__page == null) { + Io_url override_root_url = wiki.Fsys_mgr().Root_dir().GenSubDir_nest("data", "wiki"); + this.override_mgr__page = new Xow_override_mgr(override_root_url.GenSubDir_nest("page")); + this.override_mgr__html = new Xow_override_mgr(override_root_url.GenSubDir_nest("html")); + } + boolean loaded = Load__dbpg(wiki, tmp_dbpg.Clear(), hpg, ttl); hpg.Init(hpg.Wiki(), hpg.Url(), ttl, tmp_dbpg.Id()); - if (!html_db.Tbl__html().Select_by_page(hpg)) return Load__fail(hpg); // nothing in "html_page" table + if (!loaded) { // nothing in "page" table + byte[] page_override = override_mgr__page.Get_or_same(ttl.Page_db(), null); + if (page_override == null) return Load__fail(hpg); + hpg.Body_(page_override); + return true; + } + Xowd_db_file html_db = wiki.Data__core_mgr().Dbs__get_at(tmp_dbpg.Html_db_id()); + if (!html_db.Tbl__html().Select_by_page(hpg)) return Load__fail(hpg); // nothing in "html" table byte[] src = Parse(hpg, hpg.Body_zip_tid(), hpg.Body_hzip_tid(), hpg.Body()); hpg.Body_(src); return true; @@ -52,8 +62,7 @@ public class Xow_hdump_mgr__load { if (zip_tid > gplx.core.ios.Io_stream_.Tid_raw) src = zip_mgr.Unzip((byte)zip_tid, src); if (hzip_tid == Xoh_hzip_dict_.Hzip__v1) { - byte[] page_override_src = (byte[])page_overrides.Get_by_bry(hpg.Ttl().Page_db()); - if (page_override_src != null) src = page_override_src; + src = override_mgr__html.Get_or_same(hpg.Ttl().Page_db(), src); hpg.Section_mgr().Add(0, 2, Bry_.Empty, Bry_.Empty).Content_bgn_(0); // +1 to skip \n src = Decode_as_bry(tmp_bfr.Clear(), hpg, src, Bool_.N); hpg.Section_mgr().Set_content(hpg.Section_mgr().Len() - 1, src, src.length); @@ -88,19 +97,28 @@ public class Xow_hdump_mgr__load { if (redirect_id == -1) break; } } - private static Hash_adp_bry Init_page_overrides(Xow_wiki wiki) { - Hash_adp_bry rv = Hash_adp_bry.cs(); - Io_url[] page_urls = Io_mgr.Instance.QueryDir_fils(wiki.Fsys_mgr().Root_dir().GenSubDir_nest("data", "page")); - int page_urls_len = page_urls.length; - for (int i = 0; i < page_urls_len; ++i) { - Io_url page_url = page_urls[i]; - byte[] page_raw = Io_mgr.Instance.LoadFilBry(page_url); - int page_raw_len = page_raw.length; - int page_nl = Bry_find_.Find_fwd(page_raw, Byte_ascii.Nl, 0, page_raw_len); if (page_nl == Bry_find_.Not_found) continue; - byte[] page_ttl_bry = Bry_.Mid(page_raw, 0, page_nl); - byte[] page_src_bry = Bry_.Mid(page_raw, page_nl + 1, page_raw_len); - rv.Add_bry_obj(page_ttl_bry, page_src_bry); +} +class Xow_override_mgr { + private final Hash_adp_bry hash = Hash_adp_bry.cs(); + private final Io_url root_dir; + private boolean init = true; + public Xow_override_mgr(Io_url root_dir) {this.root_dir = root_dir;} + public void Clear() {hash.Clear();} + public byte[] Get_or_same(byte[] ttl, byte[] src) { + if (init) {init = false; Load_from_fsys(hash, root_dir);} + byte[] rv = (byte[])hash.Get_by_bry(ttl); + return rv == null ? src : rv; + } + private static void Load_from_fsys(Hash_adp_bry hash, Io_url root_dir) { + Io_url[] urls = Io_mgr.Instance.QueryDir_args(root_dir).Recur_(true).ExecAsUrlAry(); + int urls_len = urls.length; + for (int i = 0; i < urls_len; ++i) { + Io_url url = urls[i]; + byte[] raw = Io_mgr.Instance.LoadFilBry(url); int bry_len = raw.length; + int nl_pos = Bry_find_.Find_fwd(raw, Byte_ascii.Nl, 0, bry_len); if (nl_pos == Bry_find_.Not_found) continue; + byte[] ttl = Bry_.Mid(raw, 0, nl_pos); + byte[] src = Bry_.Mid(raw, nl_pos + 1, bry_len); + hash.Add_bry_obj(ttl, src); } - return rv; } } diff --git a/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_hdump_bldr.java b/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_hdump_bldr.java index cef40905b..6fedea827 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_hdump_bldr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_hdump_bldr.java @@ -42,6 +42,7 @@ public class Xob_hdump_bldr implements GfoInvkAble { return true; } public void Insert(Xoae_page page) { + tmp_hpg.Clear(); // NOTE: must clear tmp_hpg or else will leak memory during mass build; DATE:2016-01-09 page.File_queue().Clear(); // need to reset uid to 0, else xowa_file_# will resume from last wiki.Html_mgr().Page_wtr_mgr().Wkr(Xopg_page_.Tid_read).Write_body(tmp_bfr, Xoh_wtr_ctx.Hdump, page); // write to html in hdump mode byte[] orig_bry = tmp_bfr.To_bry_and_clear(); diff --git a/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_link_dump_tbl.java b/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_link_dump_tbl.java index d14b2f2f1..50d7a3157 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_link_dump_tbl.java +++ b/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_link_dump_tbl.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.htmls.core.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.dbs.*; class Xob_link_dump_tbl implements Rls_able { - public static final String Tbl_name = "link_dump"; private static final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + public static final String Tbl_name = "link_dump"; private static final Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); public static final String Fld_uid = flds.Add_int_pkey_autonum("uid") , Fld_src_page_id = flds.Add_int("src_page_id") @@ -33,16 +33,16 @@ class Xob_link_dump_tbl implements Rls_able { conn.Rls_reg(this); } public Db_conn Conn() {return conn;} private final Db_conn conn; - public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(Tbl_name, flds));} + public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(Tbl_name, flds));} public void Create_idx_1() { conn.Ddl_create_idx - ( Db_meta_idx.new_normal_by_tbl(Tbl_name, "src", Fld_src_page_id, Fld_src_html_uid) - , Db_meta_idx.new_normal_by_tbl(Tbl_name, "trg_temp", Fld_trg_ns, Fld_trg_ttl) + ( Dbmeta_idx_itm.new_normal_by_tbl(Tbl_name, "src", Fld_src_page_id, Fld_src_html_uid) + , Dbmeta_idx_itm.new_normal_by_tbl(Tbl_name, "trg_temp", Fld_trg_ns, Fld_trg_ttl) ); } public void Create_idx_2() { conn.Ddl_create_idx - ( Db_meta_idx.new_normal_by_tbl(Tbl_name, "trg", Fld_trg_page_id, Fld_src_page_id, Fld_src_html_uid) + ( Dbmeta_idx_itm.new_normal_by_tbl(Tbl_name, "trg", Fld_trg_page_id, Fld_src_page_id, Fld_src_html_uid) ); } public void Rls() { diff --git a/400_xowa/src/gplx/xowa/htmls/core/dbs/Xoh_page_tbl.java b/400_xowa/src/gplx/xowa/htmls/core/dbs/Xoh_page_tbl.java index 074412dd7..fe0ca285f 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/dbs/Xoh_page_tbl.java +++ b/400_xowa/src/gplx/xowa/htmls/core/dbs/Xoh_page_tbl.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.htmls.core.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.dbs.*; import gplx.core.brys.*; public class Xoh_page_tbl implements Rls_able { - private final String tbl_name = "html"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private final String tbl_name = "html"; private final Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); private final String fld_page_id, fld_head_flag, fld_body_flag, fld_display_ttl, fld_content_sub, fld_sidebar_div, fld_body; private final Db_conn conn; private Db_stmt stmt_select, stmt_insert, stmt_delete, stmt_update; private final Int_flag_bldr body_flag_bldr = new Int_flag_bldr().Pow_ary_bld_(3, 2); // 8 different zip types; 4 different hzip types @@ -34,7 +34,7 @@ public class Xoh_page_tbl implements Rls_able { conn.Rls_reg(this); } public Db_conn Conn() {return conn;} - public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds));} + public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds));} public void Insert_bgn() {conn.Txn_bgn("html__insert"); 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(Xoh_page hpg, int zip_tid, int hzip_tid, byte[] body) {Insert(hpg.Page_id(), hpg.Head_mgr().Flag(), zip_tid, hzip_tid, hpg.Display_ttl(), hpg.Content_sub(), hpg.Sidebar_div(), body);} diff --git a/400_xowa/src/gplx/xowa/htmls/core/dbs/Xoh_redlink_tbl.java b/400_xowa/src/gplx/xowa/htmls/core/dbs/Xoh_redlink_tbl.java index be1eeede6..83fd703d5 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/dbs/Xoh_redlink_tbl.java +++ b/400_xowa/src/gplx/xowa/htmls/core/dbs/Xoh_redlink_tbl.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.htmls.core.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.dbs.*; public class Xoh_redlink_tbl implements Rls_able { - private final String tbl_name = "html_redlink"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private final String tbl_name = "html_redlink"; private final Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); private final String fld_page_id, fld_redlink_uids; private final Db_conn conn; private Db_stmt stmt_select, stmt_insert, stmt_delete, stmt_update; public Xoh_redlink_tbl(Db_conn conn) { @@ -28,7 +28,7 @@ public class Xoh_redlink_tbl implements Rls_able { conn.Rls_reg(this); } public Db_conn Conn() {return conn;} - public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds));} + public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds));} public void Insert_bgn() {conn.Txn_bgn("html_redlink__insert"); 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(int page_id, byte[] redlink_uids) { diff --git a/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_int__tst.java b/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_int__tst.java index fe18bb99c..d807ddc12 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_int__tst.java +++ b/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_int__tst.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.htmls.core.hzips; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; -import org.junit.*; +import org.junit.*; import gplx.core.encoders.*; public class Xoh_hzip_int__tst { private final Xoh_hzip_int__fxt fxt = new Xoh_hzip_int__fxt(); @Test public void Reqd__1() { @@ -40,9 +40,9 @@ class Xoh_hzip_int__fxt { private final Bry_bfr bfr = Bry_bfr.new_(); private final gplx.core.primitives.Int_obj_ref count_ref = gplx.core.primitives.Int_obj_ref.neg1_(); public void Test__encode(int reqd, int val, String expd) { - Xoh_hzip_int_.Encode(reqd, bfr, val); + Gfo_hzip_int_.Encode(reqd, bfr, val); byte[] actl = bfr.To_bry_and_clear(); Tfds.Eq(expd, String_.new_u8(actl)); - Tfds.Eq(val, Xoh_hzip_int_.Decode(reqd, actl, actl.length, 0, count_ref)); + Tfds.Eq(val, Gfo_hzip_int_.Decode(reqd, actl, actl.length, 0, count_ref)); } } diff --git a/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_stat_tbl.java b/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_stat_tbl.java index ccaa6721c..912571877 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_stat_tbl.java +++ b/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_stat_tbl.java @@ -19,7 +19,7 @@ package gplx.xowa.htmls.core.hzips; import gplx.*; import gplx.xowa.*; import gp import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; import gplx.xowa.htmls.core.makes.imgs.*; import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.wikis.pages.*; public class Xoh_stat_tbl implements Rls_able { - private static final String tbl_name = "hdump_stats"; private static final Db_meta_fld_list flds = Db_meta_fld_list.new_(); + private static final String tbl_name = "hdump_stats"; private static final Dbmeta_fld_list flds = Dbmeta_fld_list.new_(); private static final String fld_page_id = flds.Add_int_pkey("page_id"), fld_wtxt_len = flds.Add_int("wtxt_len"), fld_row_orig_len = flds.Add_int("row_orig_len"), fld_row_zip_len = flds.Add_int("row_zip_len") , fld_body_len = flds.Add_int("body_len"), fld_display_ttl_len = flds.Add_int("display_ttl_len"), fld_content_sub_len = flds.Add_int("content_sub_len"), fld_sidebar_div_len = flds.Add_int("sidebar_div_len") @@ -36,7 +36,7 @@ public class Xoh_stat_tbl implements Rls_able { conn.Stmt_delete(tbl_name).Exec_delete(); // always zap table conn.Rls_reg(this); } - public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_tbl(tbl_name, "pkey", fld_page_id)));} + public void Create_tbl() {conn.Ddl_create_tbl(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "pkey", fld_page_id)));} public void Rls() { stmt_insert = Db_stmt_.Rls(stmt_insert); } diff --git a/400_xowa/src/gplx/xowa/htmls/core/makes/Xoh_make_mgr__file__tst.java b/400_xowa/src/gplx/xowa/htmls/core/makes/Xoh_make_mgr__file__tst.java deleted file mode 100644 index 5132f4d19..000000000 --- a/400_xowa/src/gplx/xowa/htmls/core/makes/Xoh_make_mgr__file__tst.java +++ /dev/null @@ -1,91 +0,0 @@ -/* -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 . -*/ -//namespace gplx.xowa.htmls.core.makes { -// import org.junit.*; -// public class Xoh_make_mgr__file__tst { -// private final Xoh_make_mgr_fxt fxt = new Xoh_make_mgr_fxt(); -// @Before public void init() { -// fxt.Clear(); -// fxt.Init_data_img_basic("A.png", 0, 220, 110); -// } -// @Test public void Img() { -// fxt .Init_body("") -// .Test_html(""); -// } -// @Test public void Img_style() { -// fxt .Init_body("
") -// .Test_html("
"); -// } -// @Test public void File_info() { -// fxt .Init_body("") -// .Test_html(String_.Concat_lines_nl_skip_last -// ( "" -// , " " -// )); -// } -// @Test public void File_mgnf() { -// fxt .Init_body("") -// .Test_html(String_.Concat_lines_nl_skip_last -// ( "" -// , "
" -// , " " -// , " \"\"" -// , " " -// , "
" -// )); -// } -// @Test public void File_play() { -// fxt .Init_body("") -// .Test_html(String_.Concat_lines_nl_skip_last -// ( "" -// , "
" -// , " " -// , " \"Play" -// , " " -// , "
" -// )); -// } -// @Test public void Hiero_dir() { -// fxt .Init_body("") -// .Test_html(""); -// } -// @Test public void Gallery() { -// fxt.Clear_imgs(); -// fxt .Init_data_gly(0, 800); -// fxt .Init_data_img_gly("A.png", 0, 220, 110, 155, 150, 15); -// fxt .Init_body(String_.Concat_lines_nl_skip_last -// ( "
    " -// , "
  • " -// , "
    " -// , "
    " -// , "
    " -// )) -// .Test_html(String_.Concat_lines_nl_skip_last -// ( "
      " -// , "
    • " -// , "
      " -// , "
      " -// , "
      " -// )); -// } -// } -//} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_ctx.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_ctx.java index d50f1721c..599f9d719 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_ctx.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_ctx.java @@ -18,8 +18,8 @@ along with this program. If not, see . package gplx.xowa.htmls.core.wkrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.apps.urls.*; import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.htmls.core.wkrs.xndes.tags.*; import gplx.xowa.htmls.core.wkrs.xndes.dicts.*; -import gplx.xowa.files.*; import gplx.xowa.apps.fsys.*; -import gplx.xowa.wikis.domains.*; import gplx.xowa.wikis.ttls.*; import gplx.xowa.apps.metas.*; +import gplx.xowa.files.*; import gplx.xowa.apps.fsys.*; import gplx.xowa.files.caches.*; +import gplx.xowa.wikis.domains.*; import gplx.xowa.wikis.ttls.*; import gplx.xowa.apps.metas.*; public class Xoh_hdoc_ctx { private byte[] fsys__file; public byte[] Fsys__root() {return fsys__root;} private byte[] fsys__root; @@ -30,7 +30,7 @@ public class Xoh_hdoc_ctx { public Xow_ttl_parser Wiki__ttl_parser() {return wiki__ttl_parser;} private Xow_ttl_parser wiki__ttl_parser; public Xoa_url_parser Wiki__url_parser() {return wiki__url_parser;} private Xoa_url_parser wiki__url_parser; public boolean Xwiki_mgr__missing(byte[] domain){return app.Xwiki_mgr__missing(domain);} - public Xoa_file_mgr File__mgr() {return file__mgr;} private final Xoa_file_mgr file__mgr = new Xoa_file_mgr(); + public Xou_cache_finder File__mgr() {return file__mgr;} private Xou_cache_finder file__mgr = Xou_cache_finder_.Noop; public Xof_url_bldr File__url_bldr() {return file__url_bldr;} private final Xof_url_bldr file__url_bldr = new Xof_url_bldr(); public byte[] Page__url() {return page__url;} private byte[] page__url; public Xoh_pool_mgr__hzip Pool_mgr__hzip() {return pool_mgr__hzip;} private final Xoh_pool_mgr__hzip pool_mgr__hzip = new Xoh_pool_mgr__hzip(); @@ -48,6 +48,8 @@ public class Xoh_hdoc_ctx { this.fsys__root = fsys_mgr.Root_dir().To_http_file_bry(); this.fsys__file = fsys_mgr.File_dir().To_http_file_bry(); this.fsys__file__comm = Bry_.Add(fsys__file, Xow_domain_itm_.Bry__commons, Byte_ascii.Slash_bry); + Xou_cache_mgr cache_mgr = app.User().User_db_mgr().Cache_mgr(); + if (cache_mgr != null) file__mgr = Xou_cache_finder_.New_db(cache_mgr); // NOTE: this effectively only loads the cache db in app mode (and not in test mode) pool_mgr__hzip.Init(); } public void Init_by_page(Xow_wiki wiki, byte[] page_url) { diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hzip_fxt.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hzip_fxt.java index 1f8b6fffe..f22282b53 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hzip_fxt.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hzip_fxt.java @@ -42,6 +42,12 @@ public class Xoh_hzip_fxt { parser_fxt.Wiki().Xwiki_mgr().Add_by_atrs(Bry_.new_u8(alias), Bry_.new_u8(domain), null); return rv; } + public void Init__ns_alias__add(String alias, int ns_id) { + parser_fxt.Wiki().Ns_mgr().Aliases_add(ns_id, alias).Init(); + } + public void Init__ns_alias__del(String alias) { + parser_fxt.Wiki().Ns_mgr().Aliases_del(alias); + } public void Test__bicode(String hzip, String html) {Test__bicode(hzip, html, html);} public void Test__bicode(String hzip, String html_enc, String html_dec) { html_enc = Gfh_utl.Replace_apos(html_enc); diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/bfr_args/Bfr_arg__hatr_id.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/bfr_args/Bfr_arg__hatr_id.java index 0e88bfae1..cae330e5a 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/bfr_args/Bfr_arg__hatr_id.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/bfr_args/Bfr_arg__hatr_id.java @@ -20,7 +20,7 @@ import gplx.core.brys.*; public class Bfr_arg__hatr_id implements Bfr_arg_clearable { private final byte[] atr_bgn; private final byte[] bry; private int num; - public Bfr_arg__hatr_id(byte[] bry) {this.bry = bry; this.atr_bgn = Bfr_arg__hatr_.Bld_atr_bgn(gplx.langs.htmls.Gfh_atr_.Bry__id);} + public Bfr_arg__hatr_id(byte[] atr_key, byte[] bry) {this.bry = bry; this.atr_bgn = Bfr_arg__hatr_.Bld_atr_bgn(atr_key);} public Bfr_arg__hatr_id Set(int num) {this.num = num; return this;} public void Bfr_arg__clear() {num = -1;} public boolean Bfr_arg__missing() {return num == -1;} @@ -31,6 +31,6 @@ public class Bfr_arg__hatr_id implements Bfr_arg_clearable { bfr.Add_int_variable(num); bfr.Add_byte_quote(); } - public static Bfr_arg__hatr_id New(String v) {return new Bfr_arg__hatr_id(Bry_.new_u8(v));} - public static Bfr_arg__hatr_id New(byte[] v) {return new Bfr_arg__hatr_id(v);} + public static Bfr_arg__hatr_id New_id(String v) {return new Bfr_arg__hatr_id(gplx.langs.htmls.Gfh_atr_.Bry__id, Bry_.new_u8(v));} + public static Bfr_arg__hatr_id New_id(byte[] v) {return new Bfr_arg__hatr_id(gplx.langs.htmls.Gfh_atr_.Bry__id, v);} } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/glys/Xoh_gly_grp_data.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/glys/Xoh_gly_grp_data.java index eca67bc6b..9199fe45f 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/glys/Xoh_gly_grp_data.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/glys/Xoh_gly_grp_data.java @@ -20,12 +20,13 @@ import gplx.core.brys.*; import gplx.langs.htmls.*; import gplx.langs.htmls.docs.*; import gplx.langs.htmls.styles.*; import gplx.langs.htmls.clses.*; import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.xtns.gallery.*; -public class Xoh_gly_grp_data implements Gfh_class_parser_wkr, Gfh_style_wkr { // +public class Xoh_gly_grp_data implements Gfh_class_parser_wkr, Gfh_style_wkr { private final List_adp itms_list = List_adp_.new_(); public int Src_bgn() {return src_bgn;} private int src_bgn; public int Src_end() {return src_end;} private int src_end; public int Gly_tid() {return gly_tid;} private int gly_tid; - public int Gly_w() {return gly_w;} private int gly_w; + public int Ul_style_max_w() {return ul_style_max_w;} private int ul_style_max_w; + public int Ul_style_w() {return ul_style_w;} private int ul_style_w; public int Xtra_atr_bgn() {return xtra_atr_bgn;} private int xtra_atr_bgn; public int Xtra_atr_end() {return xtra_atr_end;} private int xtra_atr_end; public boolean Xtra_atr_exists() {return xtra_atr_end > xtra_atr_bgn;} @@ -39,7 +40,7 @@ public class Xoh_gly_grp_data implements Gfh_class_parser_wkr, Gfh_style_wkr { / public Xoh_gly_itm_data Itms__get_at(int i) {return (Xoh_gly_itm_data)itms_list.Get_at(i);} private void Clear() { this.gly_tid = Byte_.Max_value_127; - this.gly_w = 0; + this.ul_style_max_w = ul_style_w = 0; this.xtra_atr_bgn = xtra_atr_end = xtra_cls_bgn = xtra_cls_end = xtra_style_bgn = xtra_style_end = -1; itms_list.Clear(); } @@ -92,8 +93,11 @@ public class Xoh_gly_grp_data implements Gfh_class_parser_wkr, Gfh_style_wkr { / } } public boolean On_cls(byte[] src, int atr_idx, int atr_bgn, int atr_end, int val_bgn, int val_end) { - if (Bry_.Match(src, val_bgn, val_end, Atr__cls__gallery)) {} // ignore "gallery" - else if (Bry_.Match(src, val_bgn, val_bgn + Atr__cls__mw_gallery.length, Atr__cls__mw_gallery)) { // starts with 'mw-gallery-' + int val_pos = val_bgn - atr_bgn; + if ( Bry_.Match(src, val_bgn, val_end, Atr__cls__gallery) // ignore "gallery" + && val_pos == 0) {} // only if 1st; EX:'gallery mw-traditional gallery'; PAGE:en.w:Butuan; DATE:2016-01-05 + else if (Bry_.Match(src, val_bgn, val_bgn + Atr__cls__mw_gallery.length, Atr__cls__mw_gallery) // starts with 'mw-gallery-' + && val_pos == 8) { // occurs after "gallery " int tid_bgn = val_bgn + Atr__cls__mw_gallery.length; this.gly_tid = Gallery_mgr_base_.Hash.Get_as_byte_or(src, tid_bgn, val_end, Byte_.Max_value_127); return true; @@ -106,15 +110,22 @@ public class Xoh_gly_grp_data implements Gfh_class_parser_wkr, Gfh_style_wkr { / } return true; } - public boolean On_atr(byte[] src, int atr_idx, int atr_bgn, int atr_end, int key_bgn, int key_end, int val_bgn, int val_end) { - if (Bry_.Match(src, key_bgn, key_end, Style__max_width)) // 'max-width' - gly_w = Bry_.To_int_or__lax(src, val_bgn, val_end, 0); - else if (Bry_.Match(src, key_bgn, key_end, Style___width)) {} // '_width' - else { - if (this.xtra_style_bgn == -1) { - this.xtra_style_bgn = key_bgn; - this.xtra_style_end = atr_end; - } + public boolean On_atr(byte[] src, int atr_idx, int atr_val_bgn, int atr_val_end, int itm_bgn, int itm_end, int key_bgn, int key_end, int val_bgn, int val_end) { + if (Bry_.Match(src, key_bgn, key_end, Style__max_width)) { // 'max-width' + if (ul_style_max_w == 0) { + ul_style_max_w = Bry_.To_int_or__lax(src, val_bgn, val_end, 0); + return true; + } // else if already set, fall-thru to below + } + else if (Bry_.Match(src, key_bgn, key_end, Style___width)) { // '_width' + if (ul_style_w == 0) { + ul_style_w = Bry_.To_int_or__lax(src, val_bgn, val_end, 0); + return true; + } // else if already set, fall-thru to below + } + if (this.xtra_style_bgn == -1) { + this.xtra_style_bgn = itm_bgn; + this.xtra_style_end = atr_val_end; } return true; } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/glys/Xoh_gly_grp_wtr.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/glys/Xoh_gly_grp_wtr.java index 1cf2f71ed..aea5decf1 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/glys/Xoh_gly_grp_wtr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/glys/Xoh_gly_grp_wtr.java @@ -20,14 +20,14 @@ import gplx.core.brys.*; import gplx.core.brys.fmtrs.*; import gplx.langs.htmls.*; import gplx.xowa.htmls.core.wkrs.bfr_args.*; class Xoh_gly_grp_wtr implements Bfr_arg { private final Bfr_arg_clearable[] arg_ary; - private final Bfr_arg__hatr_id ul_id = Bfr_arg__hatr_id.New("xogly_li_"); + private final Bfr_arg__hatr_id ul_id = Bfr_arg__hatr_id.New_id("xogly_li_"); private final Bfr_arg__hatr_gly_style ul_style = new Bfr_arg__hatr_gly_style(Gfh_atr_.Bry__style); private byte[] ul_cls, xtra_cls, xtra_atr_bry, ul_nl; private final Xoh_gly_itm_list_wtr itm_list_wtr = new Xoh_gly_itm_list_wtr(); public Xoh_gly_grp_wtr() { arg_ary = new Bfr_arg_clearable[] {ul_id}; } - public void Init(boolean mode_is_diff, int id, byte[] cls, int ul_w, byte[] xtra_cls, byte[] xtra_style_bry, byte[] xtra_atr_bry, Xoh_gly_itm_wtr[] ary) { + public void Init(boolean mode_is_diff, int id, byte[] cls, int ul_style_max_w, int ul_style_w, byte[] xtra_cls, byte[] xtra_style_bry, byte[] xtra_atr_bry, Xoh_gly_itm_wtr[] ary) { this.Clear(); if (!mode_is_diff) ul_id.Set(id); @@ -36,7 +36,7 @@ class Xoh_gly_grp_wtr implements Bfr_arg { this.xtra_atr_bry = xtra_atr_bry; this.ul_nl = ary.length == 0 ? Bry_.Empty : Byte_ascii.Nl_bry; // TIDY:
        should be on same line if 0 items itm_list_wtr.Init(ary); - ul_style.Set_args(ul_w, xtra_style_bry); + ul_style.Set_args(ul_style_max_w, ul_style_w, xtra_style_bry); } public void Clear() { for (Bfr_arg_clearable arg : arg_ary) @@ -72,35 +72,38 @@ class Xoh_gly_itm_list_wtr implements Bfr_arg { } class Bfr_arg__hatr_gly_style implements Bfr_arg { private final byte[] atr_bgn; - private int width; + private int max_w, w; private byte[] xtra_cls; public Bfr_arg__hatr_gly_style(byte[] key) { this.atr_bgn = Bfr_arg__hatr_.Bld_atr_bgn(key); this.Clear(); } - public void Set_args(int w, byte[] xtra_cls) {this.width = w; this.xtra_cls = xtra_cls;} - public void Clear() {width = 0; xtra_cls = null;} + public void Set_args(int max_w, int w, byte[] xtra_cls) {this.max_w = max_w; this.w = w; this.xtra_cls = xtra_cls;} + public void Clear() {max_w = 0; w = 0; xtra_cls = null;} public void Bfr_arg__clear() {this.Clear();} - public boolean Bfr_arg__missing() {return width == 0 && xtra_cls == null;} + public boolean Bfr_arg__missing() {return max_w == 0 && xtra_cls == null;} public void Bfr_arg__add(Bry_bfr bfr) { if (Bfr_arg__missing()) return; bfr.Add(atr_bgn); - if (width > 0) { + if (max_w > 0) { bfr.Add(Style__frag_1); - bfr.Add_int_variable(width); + bfr.Add_int_variable(max_w); + bfr.Add(Style__frag_3); + } + if (w > 0) { + bfr.Add_byte_space(); bfr.Add(Style__frag_2); - bfr.Add_int_variable(width); + bfr.Add_int_variable(w); bfr.Add(Style__frag_3); } if (xtra_cls != null) { - if (width > 0) bfr.Add_byte_space(); bfr.Add(xtra_cls); } bfr.Add_byte_quote(); } private static final byte[] Style__frag_1 = Bry_.new_a7("max-width:") - , Style__frag_2 = Bry_.new_a7("px; _width:") + , Style__frag_2 = Bry_.new_a7("_width:") , Style__frag_3 = Bry_.new_a7("px;") ; } \ No newline at end of file diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/glys/Xoh_gly_html__dump__tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/glys/Xoh_gly_html__dump__tst.java index 2ef24dd90..11cbd7a47 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/glys/Xoh_gly_html__dump__tst.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/glys/Xoh_gly_html__dump__tst.java @@ -23,8 +23,8 @@ public class Xoh_gly_html__dump__tst { @Test public void Basic() { fxt.Test__html(String_.Concat_lines_nl_skip_last ( "" - , "File:A.jpg|A1" - , "File:B.jpg|B1" + , "File:A.png|A1" + , "File:B.png|B1" , "" ), String_.Concat_lines_nl_skip_last ( "abc")); + } + @Test public void Clear_state() { // page # wasn't being cleared between gallery itms; PAGE:en.w:Almagest; DATE:2016-01-05 + fxt.Test__bicode("~'!{,L#{\"g{\"b0!A1~!1A.png~{\"d\"D\"D!#{\"g{\"b0!B1~!1B.png~{\"d\"D\"D!$abc", String_.Concat_lines_nl_skip_last + ( "

        abc

        ")); } @Test public void Capt_is_br() { // PURPOSE: handle captions which have
        , not

        ; PAGE:s.w:Sociology; DATE:2015-12-20 - fxt.Test__bicode("~'!!\"{\"g{\"b0\"A1~!1A.png~9\"D\"D", String_.Concat_lines_nl_skip_last + fxt.Test__bicode(String_.Concat_lines_nl_skip_last + ( "~'!!\"{\"g{\"b0\"A1" + , "~!1A.png~9\"D\"D"), String_.Concat_lines_nl_skip_last ( "

        ")); } - @Test public void No_max_width() { // PURPOSE: if no perrow=# then no "style='max-width:###; _width:###;'" + @Test public void Capt_has_multiple_p() { // PURPOSE: handle captions with multiple

        ; PAGE:en.w:Wikipedia:Bot_requests/Archive_25; DATE:2016-01-12 + fxt.Test__bicode(String_.Concat_lines_nl_skip_last + ( "~'!!\"{\"g{\"b0!a
        " + , "b

        " + , "


        " + , "~!1A.png~9\"D\"D"), String_.Concat_lines_nl_skip_last + ( "

        ")); + } + @Test public void Capt_has_complicated_nl_behavior() {// handle complicated captions which force
        on different line PAGE:en.w:Tamago_kake_gohan; DATE:2016-01-05 + fxt.Test__bicode(String_.Concat_lines_nl_skip_last + ( "~'!!\"{\"g{\"b>\"
        \"\"
        " + , "abc~\"\\A.png~#9\"D\"D" + ), String_.Concat_lines_nl_skip_last + ( "
        " + , "
      • " + , "
      " + )); + } + @Test public void Style__no_max_width() { // PURPOSE: if no perrow=# then no "style='max-width:###; _width:###;'" fxt.Test__bicode("~'!!\"{\"g{\"b0!A1~!1A.png~9\"D\"D", String_.Concat_lines_nl_skip_last ( "")); + } + @Test public void Style__no_width() { // PURPOSE: if "_width" omitted, do not add back; EX: style="max-width:648px; margin:auto; background:transparent;"; PAGE:en.w:Wikipedia:Village_pump_(technical)/Archive_86 DATE:2016-01-12 + fxt.Test__bicode("~'i{,L! color:blue;~\"{\"g{\"b0!A1~!1A.png~9\"D\"D", String_.Concat_lines_nl_skip_last + ( "")); + } + @Test public void Style__max_width_duped() { // PURPOSE: if max-width duped, do not delete 2nd; EX: style="max-width:648px; color:blue; max-width:648px;"; PAGE:en.w:Wikipedia:Village_pump_(technical)/Archive_86 DATE:2016-01-12 + fxt.Test__bicode("~'){(Z max-width:648px; color:blue;~\"{\"g{\"b0!A1~!1A.png~9\"D\"D", String_.Concat_lines_nl_skip_last + ( "")); + } + @Test public void Style__append() { // PURPOSE: handle appended style; EX: + fxt.Test__bicode("~'){,L color:blue; float:left;~\"{\"g{\"b0!A1~!1A.png~9\"D\"D", String_.Concat_lines_nl_skip_last + ( "")); + } + @Test public void Style__invalid_unclosed() { // handle broken styles; EX: + fxt.Test__bicode("~'9!center~center~\"{\"g{\"bl!abc~!1A.png~9\"D\"D", String_.Concat_lines_nl_skip_last + ( "" + )); + } + @Test public void Style__extra_colon() { // handle broken styles; EX: " + , "
    • " + , "
      " + , "
      " + , "
      " + , "
      " + , "
      " + , "

      abc

      " + , "
      " + , "
      " + , "
    • " + , "
    " + )); + } + @Test public void Style__replace() { // PURPOSE: handle replaced style; EX: + fxt.Test__bicode("~')!color:blue; float:left;~\"{\"g{\"b0!A1~!1A.png~9\"D\"D", String_.Concat_lines_nl_skip_last + ( "")); + } + @Test public void Style__ws() { // PURPOSE: handle ws in style; EX: " + , "
  • " + , "
    " + , "
    " + , "
    " , "
    " , "
    " , "

    A1

    " @@ -101,7 +276,7 @@ public class Xoh_gly_hzip_tst { , "
  • " , "
    " , "
    " - , "
    " + , "
    " , "
    " , "
    " , "

    A1

    " @@ -110,28 +285,13 @@ public class Xoh_gly_hzip_tst { , "
  • " , "")); } - @Test public void Xtra_style__append() { // PURPOSE: handle appended style; EX: - fxt.Test__bicode("~'){,Lcolor:blue; float:left;~\"{\"g{\"b0!A1~!1A.png~9\"D\"D", String_.Concat_lines_nl_skip_last - ( "