From efaf9dcd009b4a65cd77826e42491e46b36a79ab Mon Sep 17 00:00:00 2001 From: gnosygnu Date: Sun, 25 Jan 2015 20:56:50 -0500 Subject: [PATCH] v2.1.4.1 --- .../src_000_err/gplx/Gfo_msg_root_tst.java | 2 +- 100_core/src_110_primitive/gplx/Array_.java | 2 - 100_core/src_110_primitive/gplx/Bool_.java | 39 +- .../src_110_primitive/gplx/Bool_obj_ref.java | 4 +- .../src_110_primitive/gplx/Bool_obj_val.java | 11 +- 100_core/src_110_primitive/gplx/Bry_.java | 4 +- 100_core/src_110_primitive/gplx/Bry__tst.java | 2 +- 100_core/src_110_primitive/gplx/Bry_bfr.java | 1 + .../src_110_primitive/gplx/Bry_finder.java | 2 +- 100_core/src_110_primitive/gplx/Byte_.java | 39 +- .../src_110_primitive/gplx/Byte__tst.java | 2 +- .../src_110_primitive/gplx/Byte_ascii.java | 2 + 100_core/src_110_primitive/gplx/Double_.java | 4 +- 100_core/src_110_primitive/gplx/Float_.java | 3 +- 100_core/src_110_primitive/gplx/Int_.java | 4 +- 100_core/src_110_primitive/gplx/Long_.java | 3 +- 100_core/src_110_primitive/gplx/Object_.java | 15 +- 100_core/src_110_primitive/gplx/Short_.java | 1 + 100_core/src_110_primitive/gplx/String_.java | 4 +- .../src_120_basicDataType/gplx/DateAdp_.java | 1 + .../gplx/DecimalAdp_.java | 1 + .../src_120_basicDataType/gplx/KeyVal_.java | 2 +- 100_core/src_140_list/gplx/ListAdp.java | 1 + 100_core/src_140_list/gplx/ListAdp_.java | 1 + 100_core/src_140_list/gplx/ListAdp_base.java | 6 + .../src_150_text/gplx/texts/HexDecUtl.java | 6 +- .../src_200_io/gplx/ios/IoEngine_system.java | 1 + 100_core/src_200_io/gplx/ios/IoItmDir_.java | 21 + 100_core/src_200_io/gplx/ios/IoItmFil_.java | 10 +- 100_core/src_200_io/gplx/ios/IoItm_base.java | 1 - 100_core/src_200_io/gplx/ios/Io_size_.java | 25 +- .../src_200_io/gplx/ios/Io_size__tst.java | 73 +- 100_core/src_311_gfoObj/gplx/GfoMsg_.java | 2 +- 100_core/src_330_store/gplx/DataRdr_.java | 2 +- 100_core/src_400_gfs/gplx/GfsCore.java | 6 +- 140_dbs/.classpath | 2 +- 140_dbs/src/gplx/dbs/Db_conn.java | 48 + 140_dbs/src/gplx/dbs/Db_conn_.java | 48 + 140_dbs/src/gplx/dbs/Db_conn_itm.java | 21 + 140_dbs/src/gplx/dbs/Db_conn_mkr.java | 34 + 140_dbs/src/gplx/dbs/Db_conn_mkr_.java | 25 + 140_dbs/src/gplx/dbs/Db_conn_pool.java | 48 + 140_dbs/src/gplx/dbs/Db_conn_pool_old.java | 40 + 140_dbs/src/gplx/dbs/Db_meta_fld.java | 31 + 140_dbs/src/gplx/dbs/Db_meta_fld_list.java | 45 + 140_dbs/src/gplx/dbs/Db_meta_idx.java | 27 + 140_dbs/src/gplx/dbs/Db_meta_tbl.java | 28 + 140_dbs/src/gplx/dbs/Db_rdr.java | 42 + 140_dbs/src/gplx/dbs/Db_rdr_.java | 45 + 140_dbs/src/gplx/dbs/Db_rdr__basic.java | 49 + 140_dbs/src/gplx/dbs/Db_sqlbldr__sqlite.java | 73 + 140_dbs/src/gplx/dbs/Db_sqlbldr_tst.java | 64 + 140_dbs/src/gplx/dbs/Db_sys_regy_mgr.java | 40 + 140_dbs/src/gplx/dbs/Db_sys_regy_mgr_tst.java | 54 + 140_dbs/src/gplx/dbs/Db_sys_regy_tbl.java | 61 + 140_dbs/src/gplx/dbs/Db_url.java | 95 + 140_dbs/src/gplx/dbs/Db_url_.java | 55 + 140_dbs/src/gplx/dbs/Db_url__base.java | 51 + 140_dbs/src/gplx/dbs/Db_url__sqlite.java | 46 + 140_dbs/src/gplx/dbs/Db_url_tst.java | 46 + 140_dbs/src/gplx/dbs/Sql_join_itm.java | 67 + 140_dbs/src/gplx/dbs/Sql_order_by.java | 73 + 140_dbs/src/gplx/dbs/Sql_qry_wtr.java | 22 + 140_dbs/src/gplx/dbs/Sql_qry_wtr_.java | 24 + 140_dbs/src/gplx/dbs/Sql_qry_wtr_ansi.java | 286 +++ 140_dbs/src/gplx/dbs/Sql_qry_wtr_tst.java | 61 + 140_dbs/src/gplx/dbs/Sql_select.java | 143 ++ 140_dbs/src/gplx/dbs/Sql_where.java | 32 + .../gplx/dbs/engines/mems/Db_engine__mem.java | 46 + .../gplx/dbs/engines/mems/Db_rdr__mem.java | 57 + .../gplx/dbs/engines/mems/Db_stmt__mem.java | 127 ++ .../gplx/dbs/engines/mems/Db_url__mem.java | 33 + .../src/gplx/dbs/engines/mems/Mem_itm.java | 29 + .../src/gplx/dbs/engines/mems/Mem_tbl.java | 91 + .../src/gplx/dbs/sqls/Sql_dummy_class.java | 19 + 140_dbs/src_110_dbQry/gplx/dbs/Db_arg.java | 24 + 140_dbs/src_110_dbQry/gplx/dbs/Db_qry.java | 8 +- 140_dbs/src_110_dbQry/gplx/dbs/Db_qry_.java | 19 +- .../gplx/dbs/Db_qry__select_in_tbl.java | 13 +- .../gplx/dbs/Db_qry_arg_owner.java | 7 - .../src_110_dbQry/gplx/dbs/Db_qry_delete.java | 36 +- .../gplx/dbs/Db_qry_dml_tst.java | 6 +- .../src_110_dbQry/gplx/dbs/Db_qry_flush.java | 12 +- .../src_110_dbQry/gplx/dbs/Db_qry_insert.java | 29 +- .../src_110_dbQry/gplx/dbs/Db_qry_select.java | 20 +- .../gplx/dbs/Db_qry_select_tst.java | 4 +- .../src_110_dbQry/gplx/dbs/Db_qry_sql.java | 52 +- .../gplx/dbs/Db_qry_sql_tst.java | 47 + .../src_110_dbQry/gplx/dbs/Db_qry_update.java | 29 +- 140_dbs/src_110_dbQry/gplx/dbs/Db_stmt.java | 45 +- 140_dbs/src_110_dbQry/gplx/dbs/Db_stmt_.java | 49 +- .../src_110_dbQry/gplx/dbs/Db_stmt_bldr.java | 18 +- .../src_110_dbQry/gplx/dbs/Db_stmt_cmd.java | 80 +- .../src_110_dbQry/gplx/dbs/Db_stmt_sql.java | 81 +- .../gplx/dbs/Db_stmt_sql_tst.java | 2 +- .../src_110_dbQry/gplx/dbs/Db_txn_mgr.java | 2 +- .../src_120_sql/gplx/dbs/Db_obj_ary_tst.java | 4 +- 140_dbs/src_130_misc/gplx/dbs/PoolIds.java | 18 +- .../src_200_engine/gplx/dbs/Db_engine.java | 47 +- .../gplx/dbs/Db_engine_regy.java | 2 +- .../gplx/dbs/Db_engine_sql_base.java | 87 +- .../src_300_sqlDbs/gplx/dbs/Mysql_engine.java | 17 +- .../gplx/dbs/Postgres_engine.java | 17 +- .../gplx/dbs/Sqlite_engine.java | 21 +- .../gplx/dbs/Sqlite_engine_.java | 36 +- .../gplx/dbs/db_CrudOps_tst.java | 18 +- .../gplx/dbs/db_DataTypes_tst.java | 26 +- .../gplx/dbs/TdbConnectInfo_tst.java | 8 +- .../src_400_tdbs/gplx/dbs/TdbDatabase.java | 2 +- 140_dbs/src_400_tdbs/gplx/dbs/TdbDelete.java | 4 +- 140_dbs/src_400_tdbs/gplx/dbs/TdbEngine.java | 53 +- .../src_400_tdbs/gplx/dbs/TdbFlush_tst.java | 8 +- 140_dbs/src_400_tdbs/gplx/dbs/TdbInsert.java | 4 +- 140_dbs/src_400_tdbs/gplx/dbs/TdbSelect.java | 4 +- .../gplx/stores/DbMaprMgr_tst.java | 66 +- .../src_410_stores/gplx/stores/DbMaprRdr.java | 8 +- .../src_410_stores/gplx/stores/DbMaprWtr.java | 22 +- 140_dbs/tst/gplx/dbs/AnsiSqlWtr_tst.java | 6 +- 140_dbs/tst/gplx/dbs/Db_conn_fxt.java | 54 + 140_dbs/tst/gplx/dbs/Db_qry_fxt.java | 20 +- .../tst/gplx/dbs/IoSqlCriteriaWriter_tst.java | 6 +- 140_dbs/tst/gplx/dbs/PoolIds_tst.java | 10 +- .../gplx/dbs/groupBys/GroupBys_base_tst.java | 40 +- .../gplx/dbs/groupBys/GroupBys_mysql_tst.java | 2 +- .../gplx/dbs/groupBys/GroupBys_tdb_tst.java | 2 +- .../dbs/insertIntos/InsertIntos_base_tst.java | 26 +- .../insertIntos/InsertIntos_mysql_tst.java | 2 +- .../dbs/insertIntos/InsertIntos_tdb_tst.java | 2 +- .../tst/gplx/dbs/joins/Joins_base_tst.java | 24 +- 140_dbs/tst/gplx/dbs/joins/Joins_tdb_tst.java | 2 +- .../gplx/dbs/orderBys/OrderBys_base_tst.java | 20 +- .../gplx/dbs/orderBys/OrderBys_tdb_tst.java | 6 +- 140_dbs/xtn/gplx/dbs/SqliteDbMain.java | 20 +- 150_gfui/xtn/gplx/gfui/Swt_html.java | 50 +- 400_xowa/src/gplx/core/brys/Bit_.java | 38 + 400_xowa/src/gplx/core/brys/Bit__tst.java | 40 + 400_xowa/src/gplx/core/brys/Bry_rdr.java | 3 + 400_xowa/src/gplx/dbs/Gfdb_db_base.java | 27 + .../src/gplx/dbs/schemas/Schema_db_mgr.java | 28 + .../src/gplx/dbs/schemas/Schema_itm_tid.java | 28 + .../gplx/dbs/schemas/Schema_loader_mgr.java | 21 + .../gplx/dbs/schemas/Schema_loader_mgr_.java | 47 + .../src/gplx/dbs/schemas/Schema_tbl_itm.java | 23 + .../src/gplx/dbs/schemas/Schema_tbl_mgr.java | 24 + .../schemas/updates/Schema_update_cmd.java | 23 + .../schemas/updates/Schema_update_cmd_.java | 36 + .../schemas/updates/Schema_update_mgr.java | 32 + .../updates/Schema_update_mgr_tst.java | 55 + 400_xowa/src/gplx/fsdb/Fsdb_bin_tbl.java | 26 +- 400_xowa/src/gplx/fsdb/Fsdb_cfg_mgr.java | 8 +- 400_xowa/src/gplx/fsdb/Fsdb_cfg_tbl.java | 38 +- 400_xowa/src/gplx/fsdb/Fsdb_db_abc_mgr.java | 14 +- 400_xowa/src/gplx/fsdb/Fsdb_db_atr_fil.java | 22 +- 400_xowa/src/gplx/fsdb/Fsdb_db_atr_mgr.java | 8 +- 400_xowa/src/gplx/fsdb/Fsdb_db_atr_tbl.java | 14 +- 400_xowa/src/gplx/fsdb/Fsdb_db_bin_fil.java | 26 +- 400_xowa/src/gplx/fsdb/Fsdb_db_bin_mgr.java | 20 +- 400_xowa/src/gplx/fsdb/Fsdb_db_bin_tbl.java | 14 +- 400_xowa/src/gplx/fsdb/Fsdb_dir_tbl.java | 30 +- 400_xowa/src/gplx/fsdb/Fsdb_fil_tbl.java | 60 +- 400_xowa/src/gplx/fsdb/Fsdb_mnt_mgr.java | 14 +- 400_xowa/src/gplx/fsdb/Fsdb_mnt_tbl.java | 22 +- 400_xowa/src/gplx/fsdb/Fsdb_xtn_thm_tbl.java | 48 +- 400_xowa/src/gplx/intl/Gfo_app.java | 21 + 400_xowa/src/gplx/intl/Gfo_i18n_itm.java | 42 + 400_xowa/src/gplx/intl/Gfo_i18n_mgr.java | 41 + 400_xowa/src/gplx/intl/Gfo_i18n_val_cmd.java | 21 + .../src/gplx/threads/Gfo_async_cmd_itm.java | 42 + .../src/gplx/threads/Gfo_async_cmd_mkr.java | 34 + 400_xowa/src/gplx/threads/Gfo_async_mgr.java | 57 + 400_xowa/src/gplx/xowa/Xoa_app.java | 3 +- 400_xowa/src/gplx/xowa/Xoa_app_.java | 14 +- .../src/gplx/xowa/apps/fsys/Xoa_fsys_mgr.java | 36 +- 400_xowa/src/gplx/xowa/bldrs/Db_mgr_fxt.java | 20 +- .../bldrs/files/Xob_diff_regy_exec_cmd.java | 12 +- .../bldrs/files/Xob_diff_regy_make_cmd.java | 8 +- .../gplx/xowa/bldrs/files/Xob_fsdb_make.java | 20 +- .../xowa/bldrs/files/Xob_lnki_regy_cmd.java | 6 +- .../xowa/bldrs/files/Xob_lnki_regy_tbl.java | 4 +- .../xowa/bldrs/files/Xob_lnki_temp_tbl.java | 26 +- .../xowa/bldrs/files/Xob_lnki_temp_wkr.java | 24 +- .../xowa/bldrs/files/Xob_orig_qry_cmd.java | 8 +- .../xowa/bldrs/files/Xob_orig_regy_cmd.java | 6 +- .../xowa/bldrs/files/Xob_orig_regy_tbl.java | 12 +- .../xowa/bldrs/files/Xob_page_regy_cmd.java | 2 +- .../xowa/bldrs/files/Xob_page_regy_tbl.java | 10 +- .../xowa/bldrs/files/Xob_xfer_regy_cmd.java | 12 +- .../xowa/bldrs/files/Xob_xfer_regy_tbl.java | 28 +- .../bldrs/files/Xob_xfer_regy_update_cmd.java | 6 +- .../bldrs/files/Xob_xfer_temp_cmd_orig.java | 12 +- .../bldrs/files/Xob_xfer_temp_cmd_thumb.java | 12 +- .../xowa/bldrs/files/Xob_xfer_temp_itm.java | 2 +- .../xowa/bldrs/files/Xob_xfer_temp_tbl.java | 42 +- .../xowa/bldrs/imports/Xob_cmd_exec_sql.java | 2 +- .../gplx/xowa/bldrs/imports/Xob_page_sql.java | 47 +- .../xowa/bldrs/imports/Xob_search_base.java | 2 +- .../bldrs/imports/Xob_search_sql_cmd.java | 10 +- .../bldrs/imports/Xob_search_sql_wkr.java | 30 +- .../gplx/xowa/bldrs/imports/Xob_term_sql.java | 8 +- .../ctgs/Xob_category_registry_sql.java | 4 +- .../imports/ctgs/Xob_categorylinks_base.java | 2 +- .../ctgs/Xob_categorylinks_sql_make.java | 10 +- .../ctgs/Xob_categorylinks_sql_tst.java | 12 +- .../ctgs/Xoctg_hiddencat_parser_sql.java | 10 +- .../ctgs/Xoctg_hiddencat_parser_sql_tst.java | 8 +- .../gplx/xowa/bldrs/oimgs/Xob_bmk_mgr.java | 6 +- .../xowa/bldrs/oimgs/Xob_dump_mgr_base.java | 10 +- .../bldrs/oimgs/Xob_parse_all_src_sql.java | 8 +- .../xowa/bldrs/oimgs/Xob_text_db_prep.java | 14 +- .../xowa/bldrs/oimgs/Xob_xfer_update_cmd.java | 16 +- .../gplx/xowa/bldrs/oimgs/Xodb_db_file.java | 12 +- .../wikis/images/Xob_wiki_image_sql.java | 16 +- .../wikis/images/Xob_wiki_image_tbl.java | 24 +- .../wikis/redirects/Xob_redirect_cmd.java | 16 +- .../wikis/redirects/Xob_redirect_tbl.java | 48 +- 400_xowa/src/gplx/xowa/ctgs/Xoa_ctg_mgr.java | 2 +- 400_xowa/src/gplx/xowa/dbs/Xodb_file.java | 20 +- 400_xowa/src/gplx/xowa/dbs/Xodb_fsys_mgr.java | 26 +- .../src/gplx/xowa/dbs/Xodb_load_mgr_sql.java | 28 +- .../gplx/xowa/dbs/Xodb_load_mgr_sql_tst.java | 4 +- 400_xowa/src/gplx/xowa/dbs/Xodb_mgr_sql.java | 37 +- .../src/gplx/xowa/dbs/Xodb_save_mgr_sql.java | 22 +- .../src/gplx/xowa/dbs/Xodb_upgrade_mgr.java | 6 +- .../gplx/xowa/dbs/tbls/Xodb_category_tbl.java | 26 +- .../xowa/dbs/tbls/Xodb_categorylinks_tbl.java | 20 +- .../gplx/xowa/dbs/tbls/Xodb_in_wkr_base.java | 4 +- .../gplx/xowa/dbs/tbls/Xodb_in_wkr_page.java | 12 +- .../src/gplx/xowa/dbs/tbls/Xodb_page_tbl.java | 78 +- .../dbs/tbls/Xodb_search_title_page_tbl.java | 12 +- .../dbs/tbls/Xodb_search_title_word_tbl.java | 14 +- .../xowa/dbs/tbls/Xodb_site_stats_tbl.java | 14 +- .../src/gplx/xowa/dbs/tbls/Xodb_text_tbl.java | 22 +- .../xowa/dbs/tbls/Xodb_wdata_pids_tbl.java | 10 +- .../xowa/dbs/tbls/Xodb_wdata_qids_tbl.java | 10 +- .../gplx/xowa/dbs/tbls/Xodb_xowa_cfg_tbl.java | 30 +- .../gplx/xowa/dbs/tbls/Xodb_xowa_db_tbl.java | 26 +- .../gplx/xowa/dbs/tbls/Xodb_xowa_ns_tbl.java | 22 +- .../src/gplx/xowa/files/Xof_doc_page.java | 4 +- .../src/gplx/xowa/files/Xof_doc_thumb.java | 4 +- .../gplx/xowa/files/Xof_lnki_file_mgr.java | 2 +- .../src/gplx/xowa/files/Xof_url_bldr.java | 45 +- .../src/gplx/xowa/files/Xof_url_bldr_tst.java | 2 +- .../src/gplx/xowa/files/Xof_xfer_itm.java | 3 +- .../src/gplx/xowa/files/Xow_file_mgr.java | 9 +- .../src/gplx/xowa/files/bins/Xof_bin_wkr.java | 1 + .../gplx/xowa/files/bins/Xof_bin_wkr_.java | 2 +- .../files/bins/Xof_bin_wkr_fsdb_regy.java | 7 +- .../xowa/files/bins/Xof_bin_wkr_fsdb_sql.java | 32 +- .../files/bins/Xof_bin_wkr_fsys_base.java | 7 +- .../xowa/files/bins/Xof_bin_wkr_http_wmf.java | 19 +- .../gplx/xowa/files/cnvs/Xof_cnv_wkr_.java | 2 +- .../gplx/xowa/files/fsdb/Xof_fsdb_itm.java | 10 + .../xowa/files/fsdb/Xof_fsdb_mgr_mem.java | 19 +- .../xowa/files/fsdb/Xof_fsdb_mgr_sql.java | 12 +- .../xowa/files/fsdb/caches/Cache_cfg_mgr.java | 8 +- .../xowa/files/fsdb/caches/Cache_dir_mgr.java | 4 +- .../xowa/files/fsdb/caches/Cache_dir_tbl.java | 22 +- .../xowa/files/fsdb/caches/Cache_fil_itm.java | 12 +- .../xowa/files/fsdb/caches/Cache_fil_mgr.java | 10 +- .../xowa/files/fsdb/caches/Cache_fil_tbl.java | 50 +- .../xowa/files/fsdb/caches/Cache_mgr.java | 26 +- .../xowa/files/fsdb/fs_roots/Fs_root_dir.java | 18 +- .../files/fsdb/fs_roots/Fs_root_dir_tst.java | 2 +- .../files/fsdb/fs_roots/Fs_root_wkr_fsdb.java | 2 +- .../files/fsdb/fs_roots/Orig_fil_tbl.java | 32 +- .../src/gplx/xowa/files/qrys/Xof_qry_wkr.java | 2 +- .../gplx/xowa/files/qrys/Xof_qry_wkr_.java | 2 +- .../xowa/files/qrys/Xof_qry_wkr_xowa_reg.java | 20 +- .../files/wiki_orig/Xof_orig_regy_itm.java | 58 + .../files/wiki_orig/Xof_orig_regy_tbl.java | 114 ++ .../files/wiki_orig/Xof_wiki_orig_cmd.java | 16 +- .../files/wiki_orig/Xof_wiki_orig_tbl.java | 34 +- .../wiki_orig/Xof_wiki_orig_tbl_in_wkr.java | 8 +- .../files/wiki_orig/Xof_wiki_orig_wkr_.java | 2 +- .../xowa/gui/history/Xog_history_itm.java | 10 + .../xowa/gui/history/Xog_history_stack.java | 21 +- .../gui/history/Xog_history_stack_tst.java | 2 +- .../src/gplx/xowa/gui/urls/Xog_url_wkr.java | 1 - .../xowa/gui/views/Xog_launcher_tabs.java | 5 +- .../src/gplx/xowa/gui/views/Xog_tab_itm.java | 7 +- .../src/gplx/xowa/gui/views/Xog_win_itm.java | 8 +- .../src/gplx/xowa/hdumps/Xob_hdump_bldr.java | 18 +- .../src/gplx/xowa/hdumps/Xodb_hdump_mgr.java | 11 +- .../xowa/hdumps/Xodb_hdump_mgr__save_tst.java | 2 +- .../hdumps/Xodb_hdump_mgr__write_tst.java | 14 +- .../xowa/hdumps/Xodb_hdump_mgr_setup.java | 16 +- .../src/gplx/xowa/hdumps/Xodbv_dbs_tbl.java | 6 +- .../src/gplx/xowa/hdumps/Xodbv_page_tbl.java | 16 +- .../src/gplx/xowa/hdumps/Xowd_hdump_mgr.java | 16 +- .../gplx/xowa/hdumps/core/Hdump_img_bldr.java | 9 +- .../xowa/hdumps/core/Xob_lnki_regy_mgr.java | 8 +- .../hdumps/dbs/Xodb_wiki_page_html_tbl.java | 18 +- .../dbs/Xodb_wiki_page_html_tbl_mem.java | 2 +- .../xowa/hdumps/htmls/Hdump_html_body.java | 11 +- .../xowa/hdumps/htmls/Hdump_html_mgr_tst.java | 3 +- .../xowa/hdumps/loads/Hdump_load_mgr.java | 19 +- .../xowa/hdumps/loads/Hdump_load_mgr_tst.java | 3 +- .../hdumps/loads/Hdump_page_body_srl.java | 9 +- .../xowa/hdumps/saves/Hdump_save_mgr.java | 5 +- .../xowa/hdumps/saves/Hdump_stats_tbl.java | 27 +- .../gplx/xowa/hdumps/srls/Hpg_srl_itm.java | 5 +- .../gplx/xowa/hdumps/srls/Hpg_srl_itm_.java | 31 +- .../xowa/hdumps/srls/Hpg_srl_itm_tst.java | 9 +- .../gplx/xowa/hdumps/srls/Hpg_srl_mgr.java | 5 +- 400_xowa/src/gplx/xowa/html/Xoh_html_wtr.java | 2 +- .../gplx/xowa/html/hzips/Xow_hzip_dict.java | 2 +- .../xowa/html/hzips/Xow_hzip_itm__anchor.java | 39 +- .../html/hzips/Xow_hzip_itm__anchor_tst.java | 7 +- .../html/hzips/Xow_hzip_itm__file_tst.java | 8 +- .../html/hzips/Xow_hzip_itm__header_tst.java | 12 +- .../gplx/xowa/html/hzips/Xow_hzip_xtid.java | 2 +- .../html/lnkis/Xoh_file_html_fmtr__hdump.java | 24 +- .../xowa/langs/grammars/Xol_grammar_.java | 2 +- .../gplx/xowa/parsers/amps/Xop_amp_trie.java | 2 + .../gplx/xowa/parsers/lnkes/Xop_lnke_wkr.java | 5 +- .../parsers/lnkes/Xop_lnke_wkr_text_tst.java | 10 + .../xowa/parsers/logs/Xop_log_basic_tbl.java | 28 +- .../xowa/parsers/logs/Xop_log_invoke_wkr.java | 26 +- .../gplx/xowa/parsers/logs/Xop_log_mgr.java | 30 +- .../parsers/logs/Xop_log_property_wkr.java | 24 +- .../gplx/xowa/parsers/paras/Xop_para_wkr.java | 20 +- .../parsers/paras/Xop_para_wkr_pre_tst.java | 11 + .../xowa/parsers/tmpls/Nowiki_escape_itm.java | 3 +- .../gplx/xowa/servers/Gxw_html_server.java | 4 + .../xowa/servers/http/Http_server_mgr.java | 3 +- .../gplx/xowa/servers/tcp/Xosrv_server.java | 2 +- .../xowa/setup/maints/Wmf_latest_itm.java | 26 + .../xowa/setup/maints/Wmf_latest_parser.java | 65 + .../setup/maints/Wmf_latest_parser_tst.java | 53 + 400_xowa/src/gplx/xowa/specials/Xows_mgr.java | 33 +- .../xowa/file_browsers/Xoa_url_arg_mgr.java | 71 + .../file_browsers/Xosp_fbrow_cmd__base.java | 216 +++ .../file_browsers/Xosp_fbrow_data_dir.java | 61 + .../xowa/file_browsers/Xosp_fbrow_rslt.java | 24 + .../file_browsers/Xosp_fbrow_special.java | 40 + .../file_browsers/Xosp_fbrow_special_tst.java | 145 ++ .../xowa/system_data/System_data_page.java | 1 - 400_xowa/src/gplx/xowa/users/Xou_user.java | 3 + 400_xowa/src/gplx/xowa/users/Xou_user_.java | 20 +- .../gplx/xowa/users/data/Xoud_bmk_row.java | 31 + .../gplx/xowa/users/data/Xoud_bmk_tbl.java | 80 + .../gplx/xowa/users/data/Xoud_data_mgr.java | 39 + .../xowa/users/data/Xoud_history_mgr.java | 52 + .../xowa/users/data/Xoud_history_row.java | 32 + .../xowa/users/data/Xoud_history_special.java | 59 + .../xowa/users/data/Xoud_history_tbl.java | 99 + .../gplx/xowa/users/data/Xoud_regy_mgr.java | 54 + .../gplx/xowa/users/data/Xoud_regy_row.java | 24 + .../gplx/xowa/users/data/Xoud_regy_tbl.java | 87 + .../src/gplx/xowa/users/dbs/Xou_db_mgr.java | 20 +- .../gplx/xowa/users/dbs/Xou_db_xtn_mgr.java | 8 +- .../gplx/xowa/users/dbs/Xou_db_xtn_tbl.java | 20 +- .../xowa/users/history/Xou_history_mgr.java | 8 +- .../src/gplx/xowa/wikis/Xow_wiki_domain_.java | 2 +- .../gplx/xowa/wikis/xwikis/Xow_xwiki_mgr.java | 8 +- .../xowa/wikis/xwikis/Xow_xwiki_mgr_srl.java | 15 +- .../xtns/dynamicPageList/Dpl_itm_keys.java | 2 +- .../xtns/dynamicPageList/Dpl_redirect.java | 2 +- .../xtns/dynamicPageList/Dpl_xnde_tst.java | 11 + .../src/gplx/xowa/xtns/imaps/Imap_parser.java | 7 +- .../xtns/pfuncs/exprs/Pfunc_expr_ops.java | 2 +- .../xtns/pfuncs/ifs/Pfunc_ifexist_mgr.java | 2 +- .../xowa/xtns/pfuncs/ttls/Pfunc_filepath.java | 2 +- .../xtns/scribunto/Scrib_invoke_func_fxt.java | 8 +- .../scribunto/engines/luaj/Luaj_value.java | 8 +- .../engines/process/Process_send_wtr.java | 6 +- .../engines/process/Process_server_mock.java | 2 +- .../xowa/xtns/scribunto/lib/Scrib_lib_mw.java | 24 +- .../scribunto/lib/Scrib_lib_mw__lib_tst.java | 3 + .../xtns/scribunto/lib/Scrib_lib_site.java | 51 +- .../xtns/scribunto/lib/Scrib_lib_text.java | 12 +- .../xtns/scribunto/lib/Scrib_lib_title.java | 96 +- .../scribunto/lib/Scrib_lib_title_tst.java | 97 +- .../xtns/scribunto/lib/Scrib_lib_ustring.java | 13 +- .../lib/Scrib_lib_ustring__lib_tst.java | 3 +- .../scribunto/lib/Scrib_lib_wikibase_srl.java | 2 +- .../scribunto/lib/Scrib_regx_converter.java | 44 +- .../lib/Scrib_regx_converter_tst.java | 17 +- .../xtns/wdatas/core/Wdata_dict_rank.java | 2 +- .../xowa/xtns/wdatas/core/Wdata_dict_utl.java | 2 +- .../xtns/wdatas/imports/Xob_wdata_db_cmd.java | 110 +- .../wdatas/imports/Xob_wdata_pid_sql.java | 10 +- .../wdatas/imports/Xob_wdata_qid_sql.java | 12 +- .../parsers/Wdata_claims_parser_v2.java | 2 +- 400_xowa/src/gplx/xowa2/apps/Xoav_app.java | 42 + .../src/gplx/xowa2/apps/Xoav_wiki_mgr.java | 62 + .../src/gplx/xowa2/apps/urls/Xoav_url.java | 25 + .../gplx/xowa2/apps/urls/Xoav_url_parser.java | 43 + .../xowa2/apps/urls/Xoav_url_parser_tst.java | 43 + .../src/gplx/xowa2/files/Xof_fsdb_mgr.java | 21 + .../src/gplx/xowa2/files/Xof_orig_mgr.java | 22 + .../src/gplx/xowa2/files/Xofv_file_itm.java | 71 + .../gplx/xowa2/files/Xofv_file_itm_list.java | 64 + .../src/gplx/xowa2/files/Xofv_file_mgr.java | 65 + .../gplx/xowa2/files/Xofv_file_mgr_tst.java | 322 +++ .../src/gplx/xowa2/files/Xofv_repo_itm.java | 35 + .../src/gplx/xowa2/files/Xofv_repo_mgr.java | 33 + .../src/gplx/xowa2/files/Xou_cache_dir.java | 27 + .../gplx/xowa2/files/Xou_cache_dir_tbl.java | 72 + .../src/gplx/xowa2/files/Xou_cache_fil.java | 52 + .../gplx/xowa2/files/Xou_cache_fil_tbl.java | 117 ++ .../src/gplx/xowa2/files/Xou_cache_mgr.java | 75 + .../files/commons/Xof_commons_image_itm.java | 32 + .../files/commons/Xof_commons_image_tbl.java | 71 + .../xowa2/files/metas/Xof_file_meta_itm.java | 25 + .../xowa2/files/metas/Xof_file_meta_wkr.java | 21 + .../metas/Xof_file_meta_wkr__db_image.java | 37 + .../metas/Xof_file_meta_wkr__db_orig.java | 28 + 400_xowa/src/gplx/xowa2/gui/Xog_page.java | 68 + .../src/gplx/xowa2/gui/Xogv_tab_base.java | 59 + .../gplx/xowa2/users/data/Xoud_site_mgr.java | 42 + .../gplx/xowa2/users/data/Xoud_site_row.java | 29 + .../gplx/xowa2/users/data/Xoud_site_tbl.java | 93 + 400_xowa/src/gplx/xowa2/wikis/Xowv_wiki.java | 66 + .../gplx/xowa2/wikis/data/Xodata_db_mgr.java | 52 + .../xowa2/wikis/data/tbls/Xodata_db_tbl.java | 51 + .../wikis/data/tbls/Xodata_ns_regy_tbl.java | 76 + .../wikis/data/tbls/Xow_ns_regy_tbl.java | 78 + .../wikis/data/tbls/Xow_page_regy_tbl.java | 116 ++ .../wikis/specials/Xosp_special_mgr.java | 30 + 400_xowa/src_060_utl/gplx/Gfo_url_arg.java | 13 + 400_xowa/src_060_utl/gplx/Gfo_url_parser.java | 17 +- .../src_060_utl/gplx/Gfo_usr_dlg_base.java | 10 +- 400_xowa/src_120_wiki/gplx/xowa/Xow_wiki.java | 4 +- .../src_140_lang/gplx/xowa/Xol_msg_itm.java | 19 +- .../gplx/xowa/Xoaf_download_mgr.java | 2 +- .../src_160_file/gplx/xowa/Xof_file_mgr.java | 1 + .../src_160_file/gplx/xowa/Xof_repo_itm.java | 29 +- .../gplx/xowa/Xofo_lnki_parser_tst.java | 4 +- .../gplx/xowa/Xofw_file_finder_rslt.java | 2 +- .../src_161_meta/gplx/xowa/Xof_meta_itm.java | 4 +- .../src_162_xfer/gplx/xowa/Xow_repo_mgr.java | 2 +- .../gplx/xowa/Xoi_cmd_wiki_tst.java | 1728 +++++++++-------- .../gplx/xowa/Xow_cfg_wiki_core.java | 6 +- 400_xowa/src_310_url/gplx/xowa/Xoa_url.java | 18 +- .../gplx/xowa/Xoa_url_arg_hash.java | 2 +- .../src_310_url/gplx/xowa/Xoa_url_parser.java | 2 - .../gplx/xowa/Xop_lnki_tkn_chkr.java | 12 +- .../gplx/xowa/Xop_tkn_chkr_base.java | 2 +- .../gplx/xowa/Xop_xnde_tkn_chkr.java | 8 +- .../src_440_lnki/gplx/xowa/Xop_lnki_tkn.java | 2 +- .../src_490_xnde/gplx/xowa/Xop_xnde_tkn.java | 2 +- .../src_490_xnde/gplx/xowa/Xop_xnde_wkr.java | 16 +- .../xowa/Xop_xnde_wkr__err_dangling_tst.java | 14 + .../gplx/xowa/Xop_xnde_wkr__nowiki_tst.java | 19 + .../src_500_tmpl/gplx/xowa/Xot_defn_.java | 4 +- .../src_500_tmpl/gplx/xowa/Xot_invk_mock.java | 4 +- 447 files changed, 10258 insertions(+), 3016 deletions(-) create mode 100644 140_dbs/src/gplx/dbs/Db_conn.java create mode 100644 140_dbs/src/gplx/dbs/Db_conn_.java create mode 100644 140_dbs/src/gplx/dbs/Db_conn_itm.java create mode 100644 140_dbs/src/gplx/dbs/Db_conn_mkr.java create mode 100644 140_dbs/src/gplx/dbs/Db_conn_mkr_.java create mode 100644 140_dbs/src/gplx/dbs/Db_conn_pool.java create mode 100644 140_dbs/src/gplx/dbs/Db_conn_pool_old.java create mode 100644 140_dbs/src/gplx/dbs/Db_meta_fld.java create mode 100644 140_dbs/src/gplx/dbs/Db_meta_fld_list.java create mode 100644 140_dbs/src/gplx/dbs/Db_meta_idx.java create mode 100644 140_dbs/src/gplx/dbs/Db_meta_tbl.java create mode 100644 140_dbs/src/gplx/dbs/Db_rdr.java create mode 100644 140_dbs/src/gplx/dbs/Db_rdr_.java create mode 100644 140_dbs/src/gplx/dbs/Db_rdr__basic.java create mode 100644 140_dbs/src/gplx/dbs/Db_sqlbldr__sqlite.java create mode 100644 140_dbs/src/gplx/dbs/Db_sqlbldr_tst.java create mode 100644 140_dbs/src/gplx/dbs/Db_sys_regy_mgr.java create mode 100644 140_dbs/src/gplx/dbs/Db_sys_regy_mgr_tst.java create mode 100644 140_dbs/src/gplx/dbs/Db_sys_regy_tbl.java create mode 100644 140_dbs/src/gplx/dbs/Db_url.java create mode 100644 140_dbs/src/gplx/dbs/Db_url_.java create mode 100644 140_dbs/src/gplx/dbs/Db_url__base.java create mode 100644 140_dbs/src/gplx/dbs/Db_url__sqlite.java create mode 100644 140_dbs/src/gplx/dbs/Db_url_tst.java create mode 100644 140_dbs/src/gplx/dbs/Sql_join_itm.java create mode 100644 140_dbs/src/gplx/dbs/Sql_order_by.java create mode 100644 140_dbs/src/gplx/dbs/Sql_qry_wtr.java create mode 100644 140_dbs/src/gplx/dbs/Sql_qry_wtr_.java create mode 100644 140_dbs/src/gplx/dbs/Sql_qry_wtr_ansi.java create mode 100644 140_dbs/src/gplx/dbs/Sql_qry_wtr_tst.java create mode 100644 140_dbs/src/gplx/dbs/Sql_select.java create mode 100644 140_dbs/src/gplx/dbs/Sql_where.java create mode 100644 140_dbs/src/gplx/dbs/engines/mems/Db_engine__mem.java create mode 100644 140_dbs/src/gplx/dbs/engines/mems/Db_rdr__mem.java create mode 100644 140_dbs/src/gplx/dbs/engines/mems/Db_stmt__mem.java create mode 100644 140_dbs/src/gplx/dbs/engines/mems/Db_url__mem.java create mode 100644 140_dbs/src/gplx/dbs/engines/mems/Mem_itm.java create mode 100644 140_dbs/src/gplx/dbs/engines/mems/Mem_tbl.java create mode 100644 140_dbs/src/gplx/dbs/sqls/Sql_dummy_class.java create mode 100644 140_dbs/src_110_dbQry/gplx/dbs/Db_arg.java create mode 100644 140_dbs/src_110_dbQry/gplx/dbs/Db_qry_sql_tst.java create mode 100644 140_dbs/tst/gplx/dbs/Db_conn_fxt.java create mode 100644 400_xowa/src/gplx/dbs/Gfdb_db_base.java create mode 100644 400_xowa/src/gplx/dbs/schemas/Schema_db_mgr.java create mode 100644 400_xowa/src/gplx/dbs/schemas/Schema_itm_tid.java create mode 100644 400_xowa/src/gplx/dbs/schemas/Schema_loader_mgr.java create mode 100644 400_xowa/src/gplx/dbs/schemas/Schema_loader_mgr_.java create mode 100644 400_xowa/src/gplx/dbs/schemas/Schema_tbl_itm.java create mode 100644 400_xowa/src/gplx/dbs/schemas/Schema_tbl_mgr.java create mode 100644 400_xowa/src/gplx/dbs/schemas/updates/Schema_update_cmd.java create mode 100644 400_xowa/src/gplx/dbs/schemas/updates/Schema_update_cmd_.java create mode 100644 400_xowa/src/gplx/dbs/schemas/updates/Schema_update_mgr.java create mode 100644 400_xowa/src/gplx/dbs/schemas/updates/Schema_update_mgr_tst.java create mode 100644 400_xowa/src/gplx/intl/Gfo_app.java create mode 100644 400_xowa/src/gplx/intl/Gfo_i18n_itm.java create mode 100644 400_xowa/src/gplx/intl/Gfo_i18n_mgr.java create mode 100644 400_xowa/src/gplx/intl/Gfo_i18n_val_cmd.java create mode 100644 400_xowa/src/gplx/threads/Gfo_async_cmd_itm.java create mode 100644 400_xowa/src/gplx/threads/Gfo_async_cmd_mkr.java create mode 100644 400_xowa/src/gplx/threads/Gfo_async_mgr.java create mode 100644 400_xowa/src/gplx/xowa/files/wiki_orig/Xof_orig_regy_itm.java create mode 100644 400_xowa/src/gplx/xowa/files/wiki_orig/Xof_orig_regy_tbl.java create mode 100644 400_xowa/src/gplx/xowa/setup/maints/Wmf_latest_itm.java create mode 100644 400_xowa/src/gplx/xowa/setup/maints/Wmf_latest_parser.java create mode 100644 400_xowa/src/gplx/xowa/setup/maints/Wmf_latest_parser_tst.java create mode 100644 400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xoa_url_arg_mgr.java create mode 100644 400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_cmd__base.java create mode 100644 400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_data_dir.java create mode 100644 400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_rslt.java create mode 100644 400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_special.java create mode 100644 400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_special_tst.java create mode 100644 400_xowa/src/gplx/xowa/users/data/Xoud_bmk_row.java create mode 100644 400_xowa/src/gplx/xowa/users/data/Xoud_bmk_tbl.java create mode 100644 400_xowa/src/gplx/xowa/users/data/Xoud_data_mgr.java create mode 100644 400_xowa/src/gplx/xowa/users/data/Xoud_history_mgr.java create mode 100644 400_xowa/src/gplx/xowa/users/data/Xoud_history_row.java create mode 100644 400_xowa/src/gplx/xowa/users/data/Xoud_history_special.java create mode 100644 400_xowa/src/gplx/xowa/users/data/Xoud_history_tbl.java create mode 100644 400_xowa/src/gplx/xowa/users/data/Xoud_regy_mgr.java create mode 100644 400_xowa/src/gplx/xowa/users/data/Xoud_regy_row.java create mode 100644 400_xowa/src/gplx/xowa/users/data/Xoud_regy_tbl.java create mode 100644 400_xowa/src/gplx/xowa2/apps/Xoav_app.java create mode 100644 400_xowa/src/gplx/xowa2/apps/Xoav_wiki_mgr.java create mode 100644 400_xowa/src/gplx/xowa2/apps/urls/Xoav_url.java create mode 100644 400_xowa/src/gplx/xowa2/apps/urls/Xoav_url_parser.java create mode 100644 400_xowa/src/gplx/xowa2/apps/urls/Xoav_url_parser_tst.java create mode 100644 400_xowa/src/gplx/xowa2/files/Xof_fsdb_mgr.java create mode 100644 400_xowa/src/gplx/xowa2/files/Xof_orig_mgr.java create mode 100644 400_xowa/src/gplx/xowa2/files/Xofv_file_itm.java create mode 100644 400_xowa/src/gplx/xowa2/files/Xofv_file_itm_list.java create mode 100644 400_xowa/src/gplx/xowa2/files/Xofv_file_mgr.java create mode 100644 400_xowa/src/gplx/xowa2/files/Xofv_file_mgr_tst.java create mode 100644 400_xowa/src/gplx/xowa2/files/Xofv_repo_itm.java create mode 100644 400_xowa/src/gplx/xowa2/files/Xofv_repo_mgr.java create mode 100644 400_xowa/src/gplx/xowa2/files/Xou_cache_dir.java create mode 100644 400_xowa/src/gplx/xowa2/files/Xou_cache_dir_tbl.java create mode 100644 400_xowa/src/gplx/xowa2/files/Xou_cache_fil.java create mode 100644 400_xowa/src/gplx/xowa2/files/Xou_cache_fil_tbl.java create mode 100644 400_xowa/src/gplx/xowa2/files/Xou_cache_mgr.java create mode 100644 400_xowa/src/gplx/xowa2/files/commons/Xof_commons_image_itm.java create mode 100644 400_xowa/src/gplx/xowa2/files/commons/Xof_commons_image_tbl.java create mode 100644 400_xowa/src/gplx/xowa2/files/metas/Xof_file_meta_itm.java create mode 100644 400_xowa/src/gplx/xowa2/files/metas/Xof_file_meta_wkr.java create mode 100644 400_xowa/src/gplx/xowa2/files/metas/Xof_file_meta_wkr__db_image.java create mode 100644 400_xowa/src/gplx/xowa2/files/metas/Xof_file_meta_wkr__db_orig.java create mode 100644 400_xowa/src/gplx/xowa2/gui/Xog_page.java create mode 100644 400_xowa/src/gplx/xowa2/gui/Xogv_tab_base.java create mode 100644 400_xowa/src/gplx/xowa2/users/data/Xoud_site_mgr.java create mode 100644 400_xowa/src/gplx/xowa2/users/data/Xoud_site_row.java create mode 100644 400_xowa/src/gplx/xowa2/users/data/Xoud_site_tbl.java create mode 100644 400_xowa/src/gplx/xowa2/wikis/Xowv_wiki.java create mode 100644 400_xowa/src/gplx/xowa2/wikis/data/Xodata_db_mgr.java create mode 100644 400_xowa/src/gplx/xowa2/wikis/data/tbls/Xodata_db_tbl.java create mode 100644 400_xowa/src/gplx/xowa2/wikis/data/tbls/Xodata_ns_regy_tbl.java create mode 100644 400_xowa/src/gplx/xowa2/wikis/data/tbls/Xow_ns_regy_tbl.java create mode 100644 400_xowa/src/gplx/xowa2/wikis/data/tbls/Xow_page_regy_tbl.java create mode 100644 400_xowa/src/gplx/xowa2/wikis/specials/Xosp_special_mgr.java diff --git a/100_core/src_000_err/gplx/Gfo_msg_root_tst.java b/100_core/src_000_err/gplx/Gfo_msg_root_tst.java index 4e0b9bd77..94fa66dba 100644 --- a/100_core/src_000_err/gplx/Gfo_msg_root_tst.java +++ b/100_core/src_000_err/gplx/Gfo_msg_root_tst.java @@ -56,7 +56,7 @@ class Gfo_msg_root_fxt { public void Tst_data_new_many(String path, String key, String fmt, Object... vals) { Gfo_msg_data data = root.Data_new_many(Gfo_msg_itm_.Cmd_note, path, key, fmt, vals); if (expd_item_uid != -1) Tfds.Eq(expd_item_uid, data.Item().Uid());; - if (expd_item_fmtr_arg_exists != Bool_.__byte) Tfds.Eq(Bool_.int_(expd_item_fmtr_arg_exists), data.Item().Fmtr().Fmt_args_exist()); + if (expd_item_fmtr_arg_exists != Bool_.__byte) Tfds.Eq(Bool_.By_int(expd_item_fmtr_arg_exists), data.Item().Fmtr().Fmt_args_exist()); if (expd_data_str != null) Tfds.Eq(expd_data_str, data.Item().Gen_str_many(data.Vals())); } } diff --git a/100_core/src_110_primitive/gplx/Array_.java b/100_core/src_110_primitive/gplx/Array_.java index 41e1e2bdd..293069a4e 100644 --- a/100_core/src_110_primitive/gplx/Array_.java +++ b/100_core/src_110_primitive/gplx/Array_.java @@ -47,8 +47,6 @@ public class Array_ { rv[i + curReplacePos] = add[i]; for (int i = curReplacePos + addInsertPos; i < curLen; i++) // copy old after curReplacePos rv[i + newLen] = cur[i]; -// tst_ReplaceInsert(ary_obj(0, 1, 4, 5) , ary_obj(1, 2, 3), 1, 1, ary_obj(0, 1, 2, 3, 4, 5)); -// tst_ReplaceInsert(ary_obj(0, 1, 2, 4, 5), ary_obj(1, 2, 3), 1, 2, ary_obj(0, 1, 2, 3, 4, 5));//3,4 -> 4,5 return rv; } public static Object Resize(Object src, int trgLen) { diff --git a/100_core/src_110_primitive/gplx/Bool_.java b/100_core/src_110_primitive/gplx/Bool_.java index d51801d62..dcb36ecae 100644 --- a/100_core/src_110_primitive/gplx/Bool_.java +++ b/100_core/src_110_primitive/gplx/Bool_.java @@ -16,36 +16,35 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx; -public class Bool_ implements GfoInvkAble { - public static final boolean[] Ary_empty = new boolean[0]; - public static final Class ClassOf = Boolean.class; - public static int Xto_int(boolean v) {return v ? 1 : 0;} - public static String Xto_str_lower(boolean v) {return v ? "true" : "false";} - public static byte Xto_byte(boolean v) {return v ? Y_byte : N_byte;} - public static boolean cast_(Object obj) {try {return (Boolean)obj;} catch (Exception e) {throw Err_.type_mismatch_exc_(e, boolean.class, obj);}} - public static boolean cast_or_(Object obj, boolean v) {try {return (Boolean)obj;} catch (Exception e) {Err_.Noop(e); return v;}} - public static boolean int_(int v) {return v != 0;} - public static boolean TypeMatch(Class type) {return type == boolean.class || type == Boolean.class;} +public class Bool_ implements GfoInvkAble { + public static final String Cls_val_name = "boolean"; + public static final Class Cls_ref_type = Boolean.class; + public static final boolean N = false , Y = true; + public static final byte N_byte = 0 , Y_byte = 1 , __byte = 127; + public static final int N_int = 0 , Y_int = 1 , __int = -1; + public static final String N_str = "n" , Y_str = "y"; + public static final byte[] Y_bry = new byte[] {Byte_ascii.Ltr_y}, N_bry = new byte[] {Byte_ascii.Ltr_n}; + public static final String True_str = "true", False_str = "false"; + public static final byte[] True_bry = Bry_.new_ascii_(True_str), False_bry = Bry_.new_ascii_(False_str); + public static boolean cast_(Object obj) {try {return (Boolean)obj;} catch (Exception e) {throw Err_.type_mismatch_exc_(e, boolean.class, obj);}} + public static boolean cast_or_(Object obj, boolean v) {try {return (Boolean)obj;} catch (Exception e) {Err_.Noop(e); return v;}} + public static boolean By_int(int v) {return v != 0;} public static boolean parse_(String raw) { if ( String_.Eq(raw, "true") || String_.Eq(raw, "True") // needed for Store_Wtr(){boolVal.toString();} - ) + ) return true; else if ( String_.Eq(raw, "false") || String_.Eq(raw, "False") - ) + ) return false; throw Err_.parse_type_(boolean.class, raw); } - public static final int N_int = 0, Y_int = 1, __int = -1; - public static final byte N_byte = 0, Y_byte = 1, __byte = 127; - public static final boolean N = false, Y = true; - public static final String N_str = "n", Y_str = "y"; - public static final String True_str = "true", False_str = "false"; - public static final byte[] True_bry = Bry_.new_ascii_(True_str), False_bry = Bry_.new_ascii_(False_str); - public static final byte[] Y_bry = new byte[] {Byte_ascii.Ltr_y}, N_bry = new byte[] {Byte_ascii.Ltr_n}; + public static byte Xto_byte(boolean v) {return v ? Y_byte : N_byte;} + public static int Xto_int(boolean v) {return v ? 1 : 0;} + public static String Xto_str_lower(boolean v) {return v ? "true" : "false";} + public static final boolean[] Ary_empty = new boolean[0]; public static final Bool_ Gfs = new Bool_(); - public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_to_str)) { boolean v = m.ReadBool(GfsCore_.Arg_primitive); diff --git a/100_core/src_110_primitive/gplx/Bool_obj_ref.java b/100_core/src_110_primitive/gplx/Bool_obj_ref.java index 4fa867267..0719d0fe0 100644 --- a/100_core/src_110_primitive/gplx/Bool_obj_ref.java +++ b/100_core/src_110_primitive/gplx/Bool_obj_ref.java @@ -16,8 +16,10 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx; -public class Bool_obj_ref { +public class Bool_obj_ref { public boolean Val() {return val;} private boolean val; + public boolean Val_y() {return val;} + public boolean Val_n() {return !val;} public Bool_obj_ref Val_y_() {val = true; return this;} public Bool_obj_ref Val_n_() {val = false; return this;} public Bool_obj_ref Val_(boolean v) {val = v; return this;} diff --git a/100_core/src_110_primitive/gplx/Bool_obj_val.java b/100_core/src_110_primitive/gplx/Bool_obj_val.java index b380523ff..750575441 100644 --- a/100_core/src_110_primitive/gplx/Bool_obj_val.java +++ b/100_core/src_110_primitive/gplx/Bool_obj_val.java @@ -16,13 +16,14 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx; -public class Bool_obj_val { +public class Bool_obj_val { + Bool_obj_val(int v) {val = v;} private final int val; public boolean Val() {return val == 1;} - Bool_obj_val(int v) {val = v;} int val; public static final Bool_obj_val - Null = new Bool_obj_val(-1) - , False = new Bool_obj_val(0) - , True = new Bool_obj_val(1); + Null = new Bool_obj_val(-1) + , False = new Bool_obj_val(0) + , True = new Bool_obj_val(1) + ; public static Bool_obj_val read_(Object o) {String s = String_.as_(o); return s == null ? (Bool_obj_val)o : parse_(s);} public static Bool_obj_val parse_(String raw) { if (String_.Eq(raw, "y")) return Bool_obj_val.True; diff --git a/100_core/src_110_primitive/gplx/Bry_.java b/100_core/src_110_primitive/gplx/Bry_.java index 35dd713d1..6816ff8a7 100644 --- a/100_core/src_110_primitive/gplx/Bry_.java +++ b/100_core/src_110_primitive/gplx/Bry_.java @@ -19,11 +19,11 @@ package gplx; import java.lang.*; import gplx.ios.*; public class Bry_ { - public static final String Cls_name = "byte[]"; + public static final String Cls_val_name = "byte[]"; public static final int NotFound = -1; public static final byte[] Empty = new byte[0]; public static final byte[][] Ary_empty = new byte[0][]; - public static final Class ClassOf = byte[].class; + public static final Class Cls_ref_type = byte[].class; public static byte[] bytes_(byte... ary) {return ary;} public static byte[] ints_ (int... ary) { int len = ary.length; diff --git a/100_core/src_110_primitive/gplx/Bry__tst.java b/100_core/src_110_primitive/gplx/Bry__tst.java index 0657c6a24..65f28cfd1 100644 --- a/100_core/src_110_primitive/gplx/Bry__tst.java +++ b/100_core/src_110_primitive/gplx/Bry__tst.java @@ -172,7 +172,7 @@ public class Bry__tst { byte[] ary_(int... ary) { byte[] rv = new byte[ary.length]; for (int i = 0; i < ary.length; i++) - rv[i] = Byte_.int_(ary[i]); + rv[i] = Byte_.By_int(ary[i]); return rv; } void tst_IncrementLast(byte[] ary, byte[] expd) {Tfds.Eq_ary(expd, Bry_.Increment_last(Bry_.Copy(ary)));} diff --git a/100_core/src_110_primitive/gplx/Bry_bfr.java b/100_core/src_110_primitive/gplx/Bry_bfr.java index 66742a6f5..a9209dce3 100644 --- a/100_core/src_110_primitive/gplx/Bry_bfr.java +++ b/100_core/src_110_primitive/gplx/Bry_bfr.java @@ -170,6 +170,7 @@ public class Bry_bfr { Add_int_fixed(val, digit_len); return this; } + public Bry_bfr Add_int_digits(int digits, int val) {return Add_int(val, Int_.Log10(val), digits);} public Bry_bfr Add_int_fixed(int val, int digits) {return Add_int(val, Int_.Log10(val), digits);} public Bry_bfr Add_int(int val, int valLog, int arySlots) { int aryBgn = bfr_len, aryEnd = bfr_len + arySlots; diff --git a/100_core/src_110_primitive/gplx/Bry_finder.java b/100_core/src_110_primitive/gplx/Bry_finder.java index cfd29e5dd..c59de5f5b 100644 --- a/100_core/src_110_primitive/gplx/Bry_finder.java +++ b/100_core/src_110_primitive/gplx/Bry_finder.java @@ -35,7 +35,7 @@ public class Bry_finder { return Bry_finder.Not_found; } public static int Move_fwd(byte[] src, byte[] lkp, int cur, int end) { - int rv = Find_fwd(src, lkp, 0, src.length); + int rv = Find_fwd(src, lkp, cur, src.length); return rv == Bry_finder.Not_found ? rv : rv + lkp.length; } public static int Find_fwd(byte[] src, byte[] lkp) {return Find(src, lkp, 0 , src.length, true);} diff --git a/100_core/src_110_primitive/gplx/Byte_.java b/100_core/src_110_primitive/gplx/Byte_.java index 24f9c539c..9d95b3d02 100644 --- a/100_core/src_110_primitive/gplx/Byte_.java +++ b/100_core/src_110_primitive/gplx/Byte_.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; -public class Byte_ { - public static final byte MinValue = Byte.MIN_VALUE; - public static final String Cls_name = "byte"; - public static byte[] Ary(byte... ary) {return ary;} - public static byte[] Ary_by_ints(int... ary) { - int ary_len = ary.length; - byte[] rv = new byte[ary_len]; - for (int i = 0; i < ary_len; i++) - rv[i] = int_(ary[i]); - return rv; - } - public static String Xto_str(byte v) {return new Byte(v).toString();} - public static int Xto_int(byte v) {return v < 0 ? (int)v + 256 : v;} +public class Byte_ { + public static final String Cls_val_name = "byte"; + public static final Class Cls_ref_type = Byte.class; + public static final byte + Zero = 0 + , Min_value = Byte.MIN_VALUE + , Max_value_127 = 127 + ; + public static byte cast_(Object o) {try {return (Byte)o;} catch (Exception e) {throw Err_.type_mismatch_exc_(e, byte.class, o);}} + public static byte parse_(String raw) {return Byte.parseByte(raw);} + public static byte By_int(int v) {return v > 127 ? (byte)(v - 256) : (byte)v;} // PERF?: (byte)(v & 0xff) + public static int Xto_int(byte v) {return v < 0 ? (int)v + 256 : v;} + public static String Xto_str(byte v) {return new Byte(v).toString();} public static boolean In(byte v, byte... ary) { for (byte itm : ary) if (v == itm) return true; @@ -39,11 +39,12 @@ public class Byte_ { else if (lhs < rhs) return CompareAble_.Less; else return CompareAble_.More; } - public static byte cast_(Object o) {try {return (Byte)o;} catch (Exception e) {throw Err_.type_mismatch_exc_(e, byte.class, o);}} - public static byte parse_(String raw) {return Byte.parseByte(raw);} - public static byte int_(int v) {return v > 127 ? (byte)(v - 256) : (byte)v;} // PERF?: (byte)(v & 0xff) - public static byte Xto_boolean_byte(boolean v) { - return v ? Bool_.Y_byte : Bool_.N_byte; + public static byte[] Ary(byte... ary) {return ary;} + public static byte[] Ary_by_ints(int... ary) { + int ary_len = ary.length; + byte[] rv = new byte[ary_len]; + for (int i = 0; i < ary_len; i++) + rv[i] = By_int(ary[i]); + return rv; } - public static final byte Zero = 0, MaxValue_127 = 127; } diff --git a/100_core/src_110_primitive/gplx/Byte__tst.java b/100_core/src_110_primitive/gplx/Byte__tst.java index ad7a691a2..4bb4b80cb 100644 --- a/100_core/src_110_primitive/gplx/Byte__tst.java +++ b/100_core/src_110_primitive/gplx/Byte__tst.java @@ -24,7 +24,7 @@ public class Byte__tst { tst_int_( 128, 128); // NOTE: JAVA defines byte as -128 -> 127 tst_int_( 255, 255); tst_int_( 256, 0); // NOTE: 256 will cast to 1; (byte)256 works same in both JAVA/.NET - } void tst_int_(int v, int expd) {Tfds.Eq((byte)expd, Byte_.int_(v));} // WORKAROUND/JAVA: expd is of type int b/c java promotes numbers to ints + } void tst_int_(int v, int expd) {Tfds.Eq((byte)expd, Byte_.By_int(v));} // WORKAROUND/JAVA: expd is of type int b/c java promotes numbers to ints @Test public void XtoInt() { tst_XtoInt( 0, 0); tst_XtoInt( 127, 127); diff --git a/100_core/src_110_primitive/gplx/Byte_ascii.java b/100_core/src_110_primitive/gplx/Byte_ascii.java index ac64d7a9b..47c25ca17 100644 --- a/100_core/src_110_primitive/gplx/Byte_ascii.java +++ b/100_core/src_110_primitive/gplx/Byte_ascii.java @@ -102,7 +102,9 @@ public class Byte_ascii { , Quote_bry = new byte[] {Byte_ascii.Quote} , Pipe_bry = new byte[] {Byte_ascii.Pipe} , Underline_bry = new byte[] {Byte_ascii.Underline} + , Slash_bry = new byte[] {Byte_ascii.Slash} , Asterisk_bry = new byte[] {Byte_ascii.Asterisk} + , Dash_bry = new byte[] {Byte_ascii.Dash} , Space_bry = new byte[] {Byte_ascii.Space} ; } diff --git a/100_core/src_110_primitive/gplx/Double_.java b/100_core/src_110_primitive/gplx/Double_.java index bcb7489fe..42ce2533b 100644 --- a/100_core/src_110_primitive/gplx/Double_.java +++ b/100_core/src_110_primitive/gplx/Double_.java @@ -17,8 +17,8 @@ along with this program. If not, see . */ package gplx; public class Double_ { - public static final Class ClassOf = Double.class; - public static final String Cls_name = "double"; + public static final Class Cls_ref_type = Double.class; + public static final String Cls_val_name = "double"; public static final double Inf_pos = Double.POSITIVE_INFINITY;; public static final double NaN = Double.NaN;; public static final byte[] NaN_bry = Bry_.new_ascii_("NaN"); diff --git a/100_core/src_110_primitive/gplx/Float_.java b/100_core/src_110_primitive/gplx/Float_.java index 7152c648c..afe796afe 100644 --- a/100_core/src_110_primitive/gplx/Float_.java +++ b/100_core/src_110_primitive/gplx/Float_.java @@ -17,7 +17,8 @@ along with this program. If not, see . */ package gplx; public class Float_ { - public static final String Cls_name = "float"; + public static final Class Cls_ref_type = Float.class; + public static final String Cls_val_name = "float"; public static final float NaN = Float.NaN;; public static boolean IsNaN(float v) {return Float.isNaN(v);} public static int RoundUp(float val) { diff --git a/100_core/src_110_primitive/gplx/Int_.java b/100_core/src_110_primitive/gplx/Int_.java index 8be0ba006..8910411f1 100644 --- a/100_core/src_110_primitive/gplx/Int_.java +++ b/100_core/src_110_primitive/gplx/Int_.java @@ -17,8 +17,8 @@ along with this program. If not, see . */ package gplx; public class Int_ implements GfoInvkAble { - public static final Class ClassOf = Integer.class; - public static final String Cls_name = "int"; + public static final String Cls_val_name = "int"; + public static final Class Cls_ref_type = Integer.class; public static final int Base1 = 1; public static final int Const_dlm_len = 1; public static final int Const_position_after_char = 1; diff --git a/100_core/src_110_primitive/gplx/Long_.java b/100_core/src_110_primitive/gplx/Long_.java index 0f99505ed..6656c9df1 100644 --- a/100_core/src_110_primitive/gplx/Long_.java +++ b/100_core/src_110_primitive/gplx/Long_.java @@ -17,9 +17,10 @@ along with this program. If not, see . */ package gplx; public class Long_ { + public static final Class Cls_ref_type = Long.class; public static final long MinValue = Long.MIN_VALUE; public static final long MaxValue = Long.MAX_VALUE; - public static final String Cls_name = "long"; + public static final String Cls_val_name = "long"; public static final long Neg1 = -1; public static final int Log10Ary_len = 21; public static long[] Log10Ary = new long[] diff --git a/100_core/src_110_primitive/gplx/Object_.java b/100_core/src_110_primitive/gplx/Object_.java index 11b1869a4..f4df5daea 100644 --- a/100_core/src_110_primitive/gplx/Object_.java +++ b/100_core/src_110_primitive/gplx/Object_.java @@ -27,20 +27,19 @@ public class Object_ { 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);} - static String ToString_lang(Object v) { - if (v == null) return null; + private static String ToString_lang(Object v) { Class c = v.getClass(); - if (ClassAdp_.Eq(c, Bry_.ClassOf)) return String_.new_utf8_((byte[])v); - else if (ClassAdp_.Eq(c, String_.ClassOf)) return (String)v; + if (ClassAdp_.Eq(c, String_.Cls_ref_type)) return (String)v; + else if (ClassAdp_.Eq(c, Bry_.Cls_ref_type)) return String_.new_utf8_((byte[])v); else return v.toString(); } public static String Xto_str_loose_or(Object v, String or) { // tries to pretty-print doubles; also standardizes true/false; DATE:2014-07-14 if (v == null) return null; Class c = ClassAdp_.ClassOf_obj(v); - if (ClassAdp_.Eq(c, Bry_.ClassOf)) return String_.new_utf8_((byte[])v); - else if (ClassAdp_.Eq(c, String_.ClassOf)) return (String)v; - else if (ClassAdp_.Eq(c, Bool_.ClassOf)) return Bool_.cast_(v) ? Bool_.True_str : Bool_.False_str; // always return true / false - else if (ClassAdp_.Eq(c, Double_.ClassOf)) return Double_.Xto_str_loose(Double_.cast_(v)); + if (ClassAdp_.Eq(c, String_.Cls_ref_type)) return (String)v; + else if (ClassAdp_.Eq(c, Bry_.Cls_ref_type)) return String_.new_utf8_((byte[])v); + else if (ClassAdp_.Eq(c, Bool_.Cls_ref_type)) return Bool_.cast_(v) ? Bool_.True_str : Bool_.False_str; // always return "true" / "false" + else if (ClassAdp_.Eq(c, Double_.Cls_ref_type)) return Double_.Xto_str_loose(Double_.cast_(v)); else return v.toString(); } } \ No newline at end of file diff --git a/100_core/src_110_primitive/gplx/Short_.java b/100_core/src_110_primitive/gplx/Short_.java index c21430b3a..90e99d320 100644 --- a/100_core/src_110_primitive/gplx/Short_.java +++ b/100_core/src_110_primitive/gplx/Short_.java @@ -17,5 +17,6 @@ along with this program. If not, see . */ package gplx; public class Short_ { + public static final Class Cls_ref_type = Short.class; public static short cast_(Object obj) {try {return (Short)obj;} catch(Exception exc) {throw Err_.type_mismatch_exc_(exc, short.class, obj);}} } diff --git a/100_core/src_110_primitive/gplx/String_.java b/100_core/src_110_primitive/gplx/String_.java index 8739208e2..ef76f5647 100644 --- a/100_core/src_110_primitive/gplx/String_.java +++ b/100_core/src_110_primitive/gplx/String_.java @@ -18,8 +18,8 @@ along with this program. If not, see . package gplx; import java.lang.*; public class String_ implements GfoInvkAble { - public static final Class ClassOf = String.class; - public static final String Cls_name = "str" + "ing"; + public static final Class Cls_ref_type = String.class; + public static final String Cls_val_name = "str" + "ing"; public static final int Find_none = -1, Pos_neg1 = -1; public static final String Null = null, Empty = "", Null_mark = "<>", Tab = "\t", Lf = "\n", CrLf = "\r\n"; public static String cast_(Object v) {return (String)v;} diff --git a/100_core/src_120_basicDataType/gplx/DateAdp_.java b/100_core/src_120_basicDataType/gplx/DateAdp_.java index 7f38261f5..03eecaa31 100644 --- a/100_core/src_120_basicDataType/gplx/DateAdp_.java +++ b/100_core/src_120_basicDataType/gplx/DateAdp_.java @@ -25,6 +25,7 @@ import java.util.GregorianCalendar; import java.util.Locale; import java.util.TimeZone; public class DateAdp_ implements GfoInvkAble { + public static final Class Cls_ref_type = DateAdp.class; public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_Now)) return Now(); else return GfoInvkAble_.Rv_unhandled; diff --git a/100_core/src_120_basicDataType/gplx/DecimalAdp_.java b/100_core/src_120_basicDataType/gplx/DecimalAdp_.java index 8ce1bb876..40feaacae 100644 --- a/100_core/src_120_basicDataType/gplx/DecimalAdp_.java +++ b/100_core/src_120_basicDataType/gplx/DecimalAdp_.java @@ -17,6 +17,7 @@ along with this program. If not, see . */ package gplx; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; public class DecimalAdp_ { + public static final Class Cls_ref_type = DecimalAdp.class; public static DecimalAdp as_(Object obj) {return obj instanceof DecimalAdp ? (DecimalAdp)obj : null;} public static final DecimalAdp Zero = new DecimalAdp(0); public static final DecimalAdp One = new DecimalAdp(1); diff --git a/100_core/src_120_basicDataType/gplx/KeyVal_.java b/100_core/src_120_basicDataType/gplx/KeyVal_.java index 35e4414fd..02cbd2e94 100644 --- a/100_core/src_120_basicDataType/gplx/KeyVal_.java +++ b/100_core/src_120_basicDataType/gplx/KeyVal_.java @@ -84,7 +84,7 @@ public class KeyVal_ { Ary_xto_str_nested(bfr, indent + 1, (KeyVal[])val); continue; // don't add \n below } - else if (ClassAdp_.Eq(val_type, Bool_.ClassOf)) { // val is boolean + else if (ClassAdp_.Eq(val_type, Bool_.Cls_ref_type)) { // val is boolean boolean val_as_bool = Bool_.cast_(val); bfr.Add(val_as_bool ? Bool_.True_bry : Bool_.False_bry); // add "true" or "false"; don't call toString } diff --git a/100_core/src_140_list/gplx/ListAdp.java b/100_core/src_140_list/gplx/ListAdp.java index bd5da2f61..592b84e15 100644 --- a/100_core/src_140_list/gplx/ListAdp.java +++ b/100_core/src_140_list/gplx/ListAdp.java @@ -42,6 +42,7 @@ public interface ListAdp extends EnumerAble { String[] XtoStrAry(); Object Xto_ary(Class memberType); Object Xto_ary_and_clear(Class memberType); + Object[] Xto_obj_ary(); void Reverse(); void Sort(); diff --git a/100_core/src_140_list/gplx/ListAdp_.java b/100_core/src_140_list/gplx/ListAdp_.java index 14d366a05..ca5ed2a4a 100644 --- a/100_core/src_140_list/gplx/ListAdp_.java +++ b/100_core/src_140_list/gplx/ListAdp_.java @@ -77,6 +77,7 @@ class ListAdp_null implements ListAdp { public Object Xto_ary_and_clear(Class memberType) {return Object_.Ary_empty;} public String XtoStr() {return "< NULL LIST >";} public String[] XtoStrAry() {return new String[0];} + public Object[] Xto_obj_ary() {return Object_.Ary_empty;} public java.util.Iterator iterator() {return Iterator_null._;} public void Reverse() {} public void SetAt(int i, Object o) {} diff --git a/100_core/src_140_list/gplx/ListAdp_base.java b/100_core/src_140_list/gplx/ListAdp_base.java index a62e22f41..fb883ffde 100644 --- a/100_core/src_140_list/gplx/ListAdp_base.java +++ b/100_core/src_140_list/gplx/ListAdp_base.java @@ -25,6 +25,12 @@ public abstract class ListAdp_base implements ListAdp, GfoInvkAble { Array_.Set(rv, i, list[i]); return rv; } + public Object[] Xto_obj_ary() { + Object[] rv = new Object[count]; + for (int i = 0; i < count; ++i) + rv[i] = list[i]; + return rv; + } public java.util.Iterator iterator() { if (count == 0) return Iterator_null._; diff --git a/100_core/src_150_text/gplx/texts/HexDecUtl.java b/100_core/src_150_text/gplx/texts/HexDecUtl.java index 24f9eae0d..11bce8a7e 100644 --- a/100_core/src_150_text/gplx/texts/HexDecUtl.java +++ b/100_core/src_150_text/gplx/texts/HexDecUtl.java @@ -30,16 +30,16 @@ public class HexDecUtl { public static int parse_or_(byte[] raw, int or) {return parse_or_(raw, 0, raw.length, or);} public static int parse_or_(byte[] raw, int bgn, int end, int or) { int rv = 0; int factor = 1; - byte b = Byte_.MaxValue_127; + byte b = Byte_.Max_value_127; for (int i = end - 1; i >= bgn; i--) { switch (raw[i]) { case Byte_ascii.Num_0: b = 0; break; case Byte_ascii.Num_1: b = 1; break; case Byte_ascii.Num_2: b = 2; break; case Byte_ascii.Num_3: b = 3; break; case Byte_ascii.Num_4: b = 4; break; case Byte_ascii.Num_5: b = 5; break; case Byte_ascii.Num_6: b = 6; break; case Byte_ascii.Num_7: b = 7; break; case Byte_ascii.Num_8: b = 8; break; case Byte_ascii.Num_9: b = 9; break; case Byte_ascii.Ltr_A: b = 10; break; case Byte_ascii.Ltr_B: b = 11; break; case Byte_ascii.Ltr_C: b = 12; break; case Byte_ascii.Ltr_D: b = 13; break; case Byte_ascii.Ltr_E: b = 14; break; case Byte_ascii.Ltr_F: b = 15; break; case Byte_ascii.Ltr_a: b = 10; break; case Byte_ascii.Ltr_b: b = 11; break; case Byte_ascii.Ltr_c: b = 12; break; case Byte_ascii.Ltr_d: b = 13; break; case Byte_ascii.Ltr_e: b = 14; break; case Byte_ascii.Ltr_f: b = 15; break; - default: b = Byte_.MaxValue_127; break; + default: b = Byte_.Max_value_127; break; } - if (b == Byte_.MaxValue_127) return or; + if (b == Byte_.Max_value_127) return or; rv += b * factor; factor *= 16; } diff --git a/100_core/src_200_io/gplx/ios/IoEngine_system.java b/100_core/src_200_io/gplx/ios/IoEngine_system.java index cb57fe3ef..cf8ee4c67 100644 --- a/100_core/src_200_io/gplx/ios/IoEngine_system.java +++ b/100_core/src_200_io/gplx/ios/IoEngine_system.java @@ -455,6 +455,7 @@ public class IoEngine_system extends IoEngine_base { try { if (src_stream != null) src_stream.close(); if (src_conn != null) src_conn.disconnect(); + src_conn.getInputStream().close(); } catch (Exception exc) { Err_.Noop(exc); } diff --git a/100_core/src_200_io/gplx/ios/IoItmDir_.java b/100_core/src_200_io/gplx/ios/IoItmDir_.java index f9d0b25d3..5bc5ec464 100644 --- a/100_core/src_200_io/gplx/ios/IoItmDir_.java +++ b/100_core/src_200_io/gplx/ios/IoItmDir_.java @@ -25,10 +25,31 @@ public class IoItmDir_ { rv.ctor_IoItmBase_url(url); return rv; } + public static IoItmDir sub_(String name) { + IoItmDir rv = new IoItmDir(Bool_.Y); + rv.ctor_IoItmBase_url(Io_url_.mem_dir_("mem/" + name)); + return rv; + } static IoItmDir null_() { IoItmDir rv = new IoItmDir(true); // TODO: NULL should be removed rv.ctor_IoItmBase_url(Io_url_.Null); rv.Exists_set(false); return rv; } + public static void Make(IoItmDir dir) { + Io_mgr._.CreateDir(dir.Url()); + int len = dir.SubDirs().Count(); + for (int i = 0; i < len; ++i) { + IoItmDir sub_dir = (IoItmDir)dir.SubDirs().FetchAt(i); + Make(sub_dir); + } + len = dir.SubFils().Count(); + for (int i = 0; i < len; ++i) { + IoItmFil sub_fil = (IoItmFil)dir.SubFils().FetchAt(i); + String text = String_.Repeat("a", (int)sub_fil.Size()); + Io_url sub_url = sub_fil.Url(); + Io_mgr._.SaveFilStr(sub_url, text); + Io_mgr._.UpdateFilModifiedTime(sub_url, sub_fil.ModifiedTime()); + } + } } diff --git a/100_core/src_200_io/gplx/ios/IoItmFil_.java b/100_core/src_200_io/gplx/ios/IoItmFil_.java index 22085ead9..9f847ce5a 100644 --- a/100_core/src_200_io/gplx/ios/IoItmFil_.java +++ b/100_core/src_200_io/gplx/ios/IoItmFil_.java @@ -19,7 +19,13 @@ package gplx.ios; import gplx.*; public class IoItmFil_ { public static IoItmFil as_(Object obj) {return obj instanceof IoItmFil ? (IoItmFil)obj : null;} public static final String - Prop_Size = "size" - , Prop_Modified = "modified"; + Prop_Size = "size" + , Prop_Modified = "modified"; public static IoItmFil new_(Io_url url, long size, DateAdp created, DateAdp modified) {return new IoItmFil().ctor_IoItmFil(url, size, modified);} + public static IoItmFil sub_(String name, long size, DateAdp modified) { + IoItmFil rv = new IoItmFil(); + rv.ctor_IoItmFil(Io_url_.mem_fil_("mem/" + name), size, modified); + rv.Name_(name); + return rv; + } } diff --git a/100_core/src_200_io/gplx/ios/IoItm_base.java b/100_core/src_200_io/gplx/ios/IoItm_base.java index 4f9897758..ec39007c2 100644 --- a/100_core/src_200_io/gplx/ios/IoItm_base.java +++ b/100_core/src_200_io/gplx/ios/IoItm_base.java @@ -51,4 +51,3 @@ public abstract class IoItm_base implements GfoInvkAble, CompareAble { @gplx.Internal protected void ctor_IoItmBase_url(Io_url url) {this.url = url; this.name = url.NameAndExt();} @gplx.Internal protected void ctor_IoItmBase_name(String name) {this.name = name;} } - diff --git a/100_core/src_200_io/gplx/ios/Io_size_.java b/100_core/src_200_io/gplx/ios/Io_size_.java index 53c16cc13..7c374fc12 100644 --- a/100_core/src_200_io/gplx/ios/Io_size_.java +++ b/100_core/src_200_io/gplx/ios/Io_size_.java @@ -28,6 +28,13 @@ public class Io_size_ { String[] unit = Io_size_.Units[pow]; return valDecimal.Xto_str("#,###.000") + " " + String_.PadBgn(unit[0], 2, " "); } + public static String Xto_str(long val, int exp_1024, String val_fmt, String unit_pad, boolean round_0_to_1) { + long exp_val = (long)Math_.Pow(1024, exp_1024); + DecimalAdp val_as_decimal = DecimalAdp_.divide_(val, exp_val); + if (round_0_to_1 && val_as_decimal.Comp_lt(1)) val_as_decimal = DecimalAdp_.One; + String[] unit = Io_size_.Units[exp_1024]; + return val_as_decimal.Xto_str(val_fmt) + " " + String_.PadBgn(unit[0], 2, unit_pad); + } public static long parse_or_(String raw, long or) { if (raw == null || raw == String_.Empty) return or; String[] terms = String_.Split(raw, " "); @@ -46,11 +53,12 @@ public class Io_size_ { val = val.Op_mult(1024); curPow--; } - DecimalAdp comp = val.Op_truncate_decimal(); - if (!val.Eq(comp)) return or; + // DELETED:do not check for fractional bytes; EX: 10.7 GB DATE:2015-01-06 + // DecimalAdp comp = val.Op_truncate_decimal(); + // if (!val.Eq(comp)) return or; return val.Xto_long(); } - static int parse_unitPow_(String unitStr) { + private static int parse_unitPow_(String unitStr) { int unitLen = Array_.Len(Units); int unitPow = -1; for (int i = 0; i < unitLen; i++) { @@ -59,16 +67,7 @@ public class Io_size_ { } return unitPow; } - static String UnitsXtoStr() { - String_bldr sb = String_bldr_.new_(); - int len = Array_.Len(Units); - for (int i = 0; i < len; i++) { - String[] eny = Units[i]; - sb.Add_fmt("{0},{1};", eny[0], eny[1]); - } - return sb.XtoStr(); - } - static final String[][] Units = new String[][] + private static final String[][] Units = new String[][] { String_.Ary("B", "BYTE") , String_.Ary("KB", "KILOBYTE") , String_.Ary("MB", "MEGABYTE") diff --git a/100_core/src_200_io/gplx/ios/Io_size__tst.java b/100_core/src_200_io/gplx/ios/Io_size__tst.java index bfd470345..6a32d8d90 100644 --- a/100_core/src_200_io/gplx/ios/Io_size__tst.java +++ b/100_core/src_200_io/gplx/ios/Io_size__tst.java @@ -18,39 +18,52 @@ along with this program. If not, see . package gplx.ios; import gplx.*; import org.junit.*; public class Io_size__tst { - @Test public void XtoLong() { - tst_XtoLong("1", 1); - tst_XtoLong("1 KB", 1024); - tst_XtoLong("1 MB", 1024 * 1024); - tst_XtoLong("1 GB", 1024 * 1024 * 1024); - tst_XtoLong("12 kb", 12 * 1024); - tst_XtoLong("1.5 kb", 1024 + 512); // 1536 - tst_XtoLong("1.5 mb", (long)(1024 * 1024 * 1.5)); - tst_XtoLong("-1", -1); // NOTE: negative bytes allowed + private Io_size__fxt fxt = new Io_size__fxt(); + @Test public void XtoLong() { + fxt.Test_XtoLong("1", 1); + fxt.Test_XtoLong("1 KB", 1024); + fxt.Test_XtoLong("1 MB", 1024 * 1024); + fxt.Test_XtoLong("1 GB", 1024 * 1024 * 1024); + fxt.Test_XtoLong("12 kb", 12 * 1024); + fxt.Test_XtoLong("1.5 kb", 1024 + 512); // 1536 + fxt.Test_XtoLong("1.5 mb", (long)(1024 * 1024 * 1.5)); + fxt.Test_XtoLong("-1", -1); // NOTE: negative bytes allowed - tst_XtoLongFail("1 kilobite"); - tst_XtoLongFail("1 BB"); - tst_XtoLongFail("1.1"); - tst_XtoLongFail("1.51 kb"); + fxt.Test_XtoLongFail("1 kilobite"); + fxt.Test_XtoLongFail("1 BB"); + // fxt.Test_XtoLongFail("1.1"); // DELETED:do not check for fractional bytes; EX: 10.7 GB DATE:2015-01-06 + // fxt.Test_XtoLongFail("1.51 kb"); } - void tst_XtoLong(String raw, long expd) {Tfds.Eq(expd, Io_size_.parse_or_(raw, Long_.MinValue));} - void tst_XtoLongFail(String raw) { + @Test public void XtoStr() { + fxt.Test_XtoStr(1, "1.000 B"); + fxt.Test_XtoStr(1024, "1.000 KB"); + fxt.Test_XtoStr(1536, "1.500 KB"); + fxt.Test_XtoStr(1024 * 1024, "1.000 MB"); + fxt.Test_XtoStr(1016, "1,016.000 B"); // NOTE: 1016 is not 1.016 KB + } + @Test public void Xto_str_full() { + fxt.Test_Xto_str( 500, 1, "#,###", " ", Bool_.Y, "1 KB"); + fxt.Test_Xto_str( 1000, 1, "#,###", " ", Bool_.Y, "1 KB"); + fxt.Test_Xto_str( 2000, 1, "#,###", " ", Bool_.Y, "2 KB"); + fxt.Test_Xto_str( 1234567, 1, "#,###", " ", Bool_.Y, "1,206 KB"); + fxt.Test_Xto_str(1234567890, 1, "#,###", " ", Bool_.Y, "1,205,633 KB"); + } + @Test public void EqualsTest() { + fxt.Test_Equals("1", "1"); + fxt.Test_Equals("1 kb", "1 kb"); + fxt.Test_Equals("1024", "1 kb"); + fxt.Test_Equals("1048576", "1 mb"); + fxt.Test_Equals("1024 kb", "1 mb"); + fxt.Test_Equals("1.5 kb", "1536 b"); + } +} +class Io_size__fxt { + public void Test_XtoLong(String raw, long expd) {Tfds.Eq(expd, Io_size_.parse_or_(raw, Long_.MinValue));} + public void Test_XtoLongFail(String raw) { long val = Io_size_.parse_or_(raw, Long_.MinValue); if (val != Long_.MinValue) Tfds.Fail("expd parse failure; raw=" + raw); } - @Test public void XtoStr() { - tst_XtoStr(1, "1.000 B"); - tst_XtoStr(1024, "1.000 KB"); - tst_XtoStr(1536, "1.500 KB"); - tst_XtoStr(1024 * 1024, "1.000 MB"); - tst_XtoStr(1016, "1,016.000 B"); // NOTE: 1016 is not 1.016 KB - } void tst_XtoStr(long val, String expd) {Tfds.Eq(expd, Io_size_.Xto_str(val));} - @Test public void EqualsTest() { - tst_Equals("1", "1"); - tst_Equals("1 kb", "1 kb"); - tst_Equals("1024", "1 kb"); - tst_Equals("1048576", "1 mb"); - tst_Equals("1024 kb", "1 mb"); - tst_Equals("1.5 kb", "1536 b"); - } void tst_Equals(String lhs, String rhs) {Tfds.Eq(Io_size_.parse_or_(lhs, Long_.MinValue), Io_size_.parse_or_(rhs, Long_.MinValue));} + public void Test_Equals(String lhs, String rhs) {Tfds.Eq(Io_size_.parse_or_(lhs, Long_.MinValue), Io_size_.parse_or_(rhs, Long_.MinValue));} + public void Test_XtoStr(long val, String expd) {Tfds.Eq(expd, Io_size_.Xto_str(val));} + public void Test_Xto_str(long val, int exp_1024, String val_fmt, String unit_pad, boolean round_0_to_1, String expd) {Tfds.Eq(expd, Io_size_.Xto_str(val, exp_1024, val_fmt, unit_pad, round_0_to_1));} } diff --git a/100_core/src_311_gfoObj/gplx/GfoMsg_.java b/100_core/src_311_gfoObj/gplx/GfoMsg_.java index dcfe809b6..116ef9779 100644 --- a/100_core/src_311_gfoObj/gplx/GfoMsg_.java +++ b/100_core/src_311_gfoObj/gplx/GfoMsg_.java @@ -261,7 +261,7 @@ class XtoStrWkr_gplx implements XtoStrWkr { String rv = null; if (type == String.class) rv = String_.cast_(o); else if (Int_.TypeMatch(type)) return Int_.Xto_str(Int_.cast_(o)); - else if (Bool_.TypeMatch(type)) return Yn.Xto_str(Bool_.cast_(o)); + else if (ClassAdp_.Eq(type, Bool_.Cls_ref_type)) return Yn.Xto_str(Bool_.cast_(o)); else if (type == DateAdp.class) return DateAdp_.cast_(o).XtoStr_gplx(); else rv = Object_.Xto_str_strict_or_empty(o); return String_.Replace(rv, "'", "''"); diff --git a/100_core/src_330_store/gplx/DataRdr_.java b/100_core/src_330_store/gplx/DataRdr_.java index 70a7d155c..8d013be8f 100644 --- a/100_core/src_330_store/gplx/DataRdr_.java +++ b/100_core/src_330_store/gplx/DataRdr_.java @@ -41,7 +41,7 @@ class DataRdr_null implements DataRdr { public long ReadLong(String key) {return Long_.MinValue;} public long ReadLongOr(String key, long or) {return or;} public double ReadDouble(String key) {return Double_.NaN;} public double ReadDoubleOr(String key, double or) {return or;} public float ReadFloat(String key) {return Float_.NaN;} public float ReadFloatOr(String key, float or) {return or;} - public byte ReadByte(String key) {return Byte_.MinValue;} public byte ReadByteOr(String key, byte or) {return or;} + public byte ReadByte(String key) {return Byte_.Min_value;} public byte ReadByteOr(String key, byte or) {return or;} public DecimalAdp ReadDecimal(String key) {return DecimalAdp_.Zero;}public DecimalAdp ReadDecimalOr(String key, DecimalAdp or) {return or;} public DateAdp ReadDate(String key) {return DateAdp_.MinValue;} public DateAdp ReadDateOr(String key, DateAdp or) {return or;} public gplx.ios.Io_stream_rdr ReadRdr(String key) {return gplx.ios.Io_stream_rdr_.Null;} diff --git a/100_core/src_400_gfs/gplx/GfsCore.java b/100_core/src_400_gfs/gplx/GfsCore.java index 024301078..ca7f2f804 100644 --- a/100_core/src_400_gfs/gplx/GfsCore.java +++ b/100_core/src_400_gfs/gplx/GfsCore.java @@ -116,9 +116,9 @@ class GfsCore_ { Object primitive = null; if (invk == null) { // rv is primitive; find appropriate mgr Class type = rv.getClass(); - if (type == String.class) invk = String_.Gfs; - else if (Int_.TypeMatch(type)) invk = Int_.Gfs; - else if (Bool_.TypeMatch(type)) invk = Bool_.Gfs; + if (type == String.class) invk = String_.Gfs; + else if (Int_.TypeMatch(type)) invk = Int_.Gfs; + else if (ClassAdp_.Eq(type, Bool_.Cls_ref_type)) invk = Bool_.Gfs; else throw Err_.new_("unknown primitive").Add("type", ClassAdp_.NameOf_type(type)).Add("obj", Object_.Xto_str_strict_or_null_mark(rv)); primitive = rv; } diff --git a/140_dbs/.classpath b/140_dbs/.classpath index 8d056becb..f51172064 100644 --- a/140_dbs/.classpath +++ b/140_dbs/.classpath @@ -1,6 +1,6 @@ - + diff --git a/140_dbs/src/gplx/dbs/Db_conn.java b/140_dbs/src/gplx/dbs/Db_conn.java new file mode 100644 index 000000000..21f0754ac --- /dev/null +++ b/140_dbs/src/gplx/dbs/Db_conn.java @@ -0,0 +1,48 @@ +/* +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_conn { + private final Db_engine engine; + private final ListAdp itm_list = ListAdp_.new_(); + public Db_conn(Db_engine engine) { + this.engine = engine; + this.txn_mgr = new Db_txn_mgr_base(engine); + } + public Db_url Url() {return engine.Url();} + public Db_txn_mgr Txn_mgr() {return txn_mgr;} private final Db_txn_mgr txn_mgr; + public Db_stmt New_stmt_insert(String tbl, String... cols) {return engine.New_stmt_prep(Db_qry_insert.new_(tbl, cols));} + public Db_stmt New_stmt_update(String tbl, String[] where, String... cols) {return engine.New_stmt_prep(Db_qry_update.new_(tbl, where, cols));} + public Db_stmt New_stmt_delete(String tbl, String... where) {return engine.New_stmt_prep(Db_qry_delete.new_(tbl, where));} + public Db_stmt New_stmt_select_all_where(String tbl, String[] cols, String... where) {return engine.New_stmt_prep(Db_qry__select_in_tbl.new_(tbl, where, cols));} + public void Itms_add(Db_conn_itm itm) {itm_list.Add(itm);} + public void Itms_del(Db_conn_itm itm) {itm_list.Del(itm);} + public void Conn_term() { + int len = itm_list.Count(); + for (int i = 0; i < len; ++i) { + Db_conn_itm itm = (Db_conn_itm)itm_list.FetchAt(i); + itm.Conn_term(); + } + engine.Conn_term(); + Db_conn_pool_old._.Del(this.Url()); // remove from pool, else rls'd instance will be cached and fail upon next use + } + public Db_stmt New_stmt(Db_qry qry) {return engine.New_stmt_prep(qry);} + public int Exec_qry(Db_qry qry) {txn_mgr.Txn_count_(txn_mgr.Txn_count() + 1); return Int_.cast_(engine.Exec_as_obj(qry));} + public DataRdr Exec_qry_as_rdr(Db_qry qry) {return DataRdr_.cast_(engine.Exec_as_obj(qry));} + public int Exec_sql(String sql) {return this.Exec_qry(Db_qry_sql.dml_(sql));} + public DataRdr Exec_sql_as_rdr(String sql) {return this.Exec_qry_as_rdr(Db_qry_sql.rdr_(sql));} +} diff --git a/140_dbs/src/gplx/dbs/Db_conn_.java b/140_dbs/src/gplx/dbs/Db_conn_.java new file mode 100644 index 000000000..15599b6ec --- /dev/null +++ b/140_dbs/src/gplx/dbs/Db_conn_.java @@ -0,0 +1,48 @@ +/* +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_conn_ { + public static final Db_conn Null = new_and_open_(Db_url_.Null); + public static Db_conn new_and_open_(Db_url url) { + Db_engine prototype = Db_engine_regy._.Get(url.Tid()); + Db_engine engine = prototype.New_clone(url); + engine.Conn_open(); // auto-open + return new Db_conn(engine); + } + public static Db_conn Reg_itm(Db_conn_itm itm, Db_conn old_conn, Db_conn new_conn) { + if (old_conn != null) old_conn.Itms_del(itm); + new_conn.Itms_add(itm); + return new_conn; + } + public static int Select_fld0_as_int_or(Db_conn p, String sql, int or) { + DataRdr rdr = DataRdr_.Null; + try { + rdr = p.Exec_qry_as_rdr(Db_qry_sql.rdr_(sql)); + int rv = or; + if (rdr.MoveNextPeer()) { + Object rv_obj = rdr.ReadAt(0); + if (rv_obj != null) // Max(fil_id) will be NULL if tbl is empty + rv = Int_.cast_or_(rv_obj, or); + } + return rv; + } + finally { + rdr.Rls(); + } + } +} diff --git a/140_dbs/src/gplx/dbs/Db_conn_itm.java b/140_dbs/src/gplx/dbs/Db_conn_itm.java new file mode 100644 index 000000000..d6f8634e4 --- /dev/null +++ b/140_dbs/src/gplx/dbs/Db_conn_itm.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; import gplx.*; +public interface Db_conn_itm { + void Conn_term(); +} diff --git a/140_dbs/src/gplx/dbs/Db_conn_mkr.java b/140_dbs/src/gplx/dbs/Db_conn_mkr.java new file mode 100644 index 000000000..8ede66037 --- /dev/null +++ b/140_dbs/src/gplx/dbs/Db_conn_mkr.java @@ -0,0 +1,34 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.dbs; import gplx.*; +public interface Db_conn_mkr { + Db_conn Load_or_make_(Io_url db_url, Bool_obj_ref created_ref); +} +class Db_conn_mkr_sqlite implements Db_conn_mkr { + public Db_conn Load_or_make_(Io_url db_url, Bool_obj_ref created_ref) {return Sqlite_engine_.Conn_load_or_make_(db_url, created_ref);} + public static final Db_conn_mkr_sqlite _ = new Db_conn_mkr_sqlite(); Db_conn_mkr_sqlite() {} +} +class Db_conn_mkr_mem implements Db_conn_mkr { + private boolean create; + public Db_conn Load_or_make_(Io_url db_url, Bool_obj_ref create_ref) {create_ref.Val_(create); return null;} + public static Db_conn_mkr_mem create_(boolean create) { + Db_conn_mkr_mem rv = new Db_conn_mkr_mem(); + rv.create = create; + return rv; + } +} diff --git a/140_dbs/src/gplx/dbs/Db_conn_mkr_.java b/140_dbs/src/gplx/dbs/Db_conn_mkr_.java new file mode 100644 index 000000000..4e4413c10 --- /dev/null +++ b/140_dbs/src/gplx/dbs/Db_conn_mkr_.java @@ -0,0 +1,25 @@ +/* +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_conn_mkr_ { + public static final Db_conn_mkr + Sqlite = Db_conn_mkr_sqlite._ + , Mem_create_y = Db_conn_mkr_mem.create_(Bool_.Y) + , Mem_create_n = Db_conn_mkr_mem.create_(Bool_.N) + ; +} diff --git a/140_dbs/src/gplx/dbs/Db_conn_pool.java b/140_dbs/src/gplx/dbs/Db_conn_pool.java new file mode 100644 index 000000000..a13865e8f --- /dev/null +++ b/140_dbs/src/gplx/dbs/Db_conn_pool.java @@ -0,0 +1,48 @@ +/* +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.engines.mems.*; +public class Db_conn_pool { + private final HashAdp dbm_hash = HashAdp_.new_(); private final HashAdp engine_hash = HashAdp_.new_(); + Db_conn_pool() {this.Init();} + public Db_conn Get_or_new__sqlite(Io_url url) {return Get_or_new(Db_url_.sqlite_(url));} + public Db_conn Get_or_new(Db_url url) { + Db_conn rv = (Db_conn)dbm_hash.Fetch(url.Xto_api()); + if (rv == null) { + Db_engine prime = (Db_engine)engine_hash.Fetch(url.Tid()); if (prime == null) throw Err_.new_("db engine prototype not found; tid={0}", url.Tid()); + Db_engine clone = prime.New_clone(url); + rv = new Db_conn(clone); + dbm_hash.Add(url.Xto_api(), rv); + } + return rv; + } + public void Set_mem(String db, Db_meta_tbl... tbls) { + Db_url url = Db_url__mem.new_(db); + Db_engine__mem engine = new Db_engine__mem(url, tbls); + Db_conn dbm = new Db_conn(engine); + dbm_hash.AddReplace(url.Xto_api(), dbm); + } + private void Init() { + this.Engines__add(Db_engine_null._, TdbEngine._, Mysql_engine._, Postgres_engine._, Sqlite_engine._, Db_engine__mem._); + } + public void Engines__add(Db_engine... ary) { + for (Db_engine itm : ary) + engine_hash.Add(itm.Tid(), itm); + } + public static final Db_conn_pool I = new Db_conn_pool(); +} diff --git a/140_dbs/src/gplx/dbs/Db_conn_pool_old.java b/140_dbs/src/gplx/dbs/Db_conn_pool_old.java new file mode 100644 index 000000000..077a96877 --- /dev/null +++ b/140_dbs/src/gplx/dbs/Db_conn_pool_old.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.dbs; import gplx.*; +public class Db_conn_pool_old { + private final OrderedHash hash = OrderedHash_.new_(); + public Db_conn Get_or_new(Db_url url) {return Get_or_new(url.Xto_raw());} + public Db_conn Get_or_new(String raw) { + Db_conn rv = (Db_conn)hash.Fetch(raw); + if (rv == null) { + rv = Db_conn_.new_and_open_(Db_url_.parse_(raw)); + hash.Add(raw, rv); + } + return rv; + } + public void Del(Db_url url) {hash.Del(url.Xto_raw());} + public void Clear() { + int len = hash.Count(); + for (int i = 0; i < len; i++) { + Db_conn conn = (Db_conn)hash.FetchAt(0); + conn.Conn_term(); + } + hash.Clear(); + } + public static final Db_conn_pool_old _ = new Db_conn_pool_old(); Db_conn_pool_old() {} +} diff --git a/140_dbs/src/gplx/dbs/Db_meta_fld.java b/140_dbs/src/gplx/dbs/Db_meta_fld.java new file mode 100644 index 000000000..38c260f2b --- /dev/null +++ b/140_dbs/src/gplx/dbs/Db_meta_fld.java @@ -0,0 +1,31 @@ +/* +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, boolean nullable, boolean primary, boolean autoincrement) { + this.name = name; this.tid = tid; this.len = len; + this.nullable = nullable; this.primary = primary; this.autoincrement = autoincrement; + } + 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;} private final boolean nullable; + public boolean Primary() {return primary;} private final boolean primary; + public boolean Autoincrement() {return autoincrement;} private final boolean autoincrement; + 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; +} diff --git a/140_dbs/src/gplx/dbs/Db_meta_fld_list.java b/140_dbs/src/gplx/dbs/Db_meta_fld_list.java new file mode 100644 index 000000000..7cc2d4902 --- /dev/null +++ b/140_dbs/src/gplx/dbs/Db_meta_fld_list.java @@ -0,0 +1,45 @@ +/* +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_list { + private final OrderedHash flds = OrderedHash_.new_(); + private final ListAdp keys = ListAdp_.new_(); + public Db_meta_fld Get_by(String name) {return (Db_meta_fld)flds.Fetch(name);} + public String[] Xto_str_ary() {if (str_ary == null) str_ary = (String[])keys.Xto_ary(String.class); return str_ary;} private String[] str_ary; + public Db_meta_fld[] Xto_fld_ary() {if (fld_ary == null) fld_ary = (Db_meta_fld[])flds.Xto_ary(Db_meta_fld.class); return fld_ary;} private Db_meta_fld[] fld_ary; + public String Add_bool(String name) {return Add(name, Db_meta_fld.Tid_bool, Len_null, Bool_.N, Bool_.N, Bool_.N);} + public String Add_byte(String name) {return Add(name, Db_meta_fld.Tid_byte, Len_null, Bool_.N, Bool_.N, Bool_.N);} + public String Add_short(String name) {return Add(name, Db_meta_fld.Tid_short, Len_null, Bool_.N, Bool_.N, Bool_.N);} + public String Add_int(String name) {return Add(name, Db_meta_fld.Tid_int, Len_null, Bool_.N, Bool_.N, Bool_.N);} + public String Add_int_pkey(String name) {return Add(name, Db_meta_fld.Tid_int, Len_null, Bool_.N, Bool_.Y, Bool_.N);} + public String Add_int_pkey_autonum(String name) {return Add(name, Db_meta_fld.Tid_int, Len_null, Bool_.N, Bool_.Y, Bool_.Y);} + public String Add_long(String name) {return Add(name, Db_meta_fld.Tid_long, Len_null, Bool_.N, Bool_.N, Bool_.N);} + public String Add_float(String name) {return Add(name, Db_meta_fld.Tid_float, Len_null, Bool_.N, Bool_.N, Bool_.N);} + public String Add_double(String name) {return Add(name, Db_meta_fld.Tid_double, Len_null, Bool_.N, Bool_.N, Bool_.N);} + public String Add_str(String name, int len) {return Add(name, Db_meta_fld.Tid_str, len, Bool_.N, Bool_.N, Bool_.N);} + public String Add_text(String name) {return Add(name, Db_meta_fld.Tid_text, Len_null, Bool_.N, Bool_.N, Bool_.N);} + public String Add_bry(String name) {return Add(name, Db_meta_fld.Tid_bry, Len_null, Bool_.N, Bool_.N, Bool_.N);} + public String Add(String name, int tid, int len, boolean nullable, boolean primary, boolean autoincrement) { + Db_meta_fld fld = new Db_meta_fld(name, tid, len, nullable, primary, autoincrement); + flds.Add(name, fld); + keys.Add(name); + return name; + } + private static final int Len_null = -1; + public static Db_meta_fld_list new_() {return new Db_meta_fld_list();} +} diff --git a/140_dbs/src/gplx/dbs/Db_meta_idx.java b/140_dbs/src/gplx/dbs/Db_meta_idx.java new file mode 100644 index 000000000..cbf017289 --- /dev/null +++ b/140_dbs/src/gplx/dbs/Db_meta_idx.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.dbs; import gplx.*; +public class Db_meta_idx { + public 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 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 Tbl() {return tbl;} private final String tbl; + public static Db_meta_idx new_unique(String tbl, String name, String... flds) {return new Db_meta_idx(tbl, name, Bool_.Y, flds);} + public static Db_meta_idx new_normal(String tbl, String name, String... flds) {return new Db_meta_idx(tbl, name, Bool_.N, flds);} +} diff --git a/140_dbs/src/gplx/dbs/Db_meta_tbl.java b/140_dbs/src/gplx/dbs/Db_meta_tbl.java new file mode 100644 index 000000000..c7b337341 --- /dev/null +++ b/140_dbs/src/gplx/dbs/Db_meta_tbl.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; import gplx.*; +public class Db_meta_tbl { + public Db_meta_tbl(String name, Db_meta_fld[] flds, Db_meta_idx[] idxs) { + 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 Db_meta_idx[] Idxs() {return idxs;} private final Db_meta_idx[] 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_rdr.java b/140_dbs/src/gplx/dbs/Db_rdr.java new file mode 100644 index 000000000..101836065 --- /dev/null +++ b/140_dbs/src/gplx/dbs/Db_rdr.java @@ -0,0 +1,42 @@ +/* +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 interface Db_rdr { + boolean Move_next(); + byte[] Read_bry(int i); + byte[] Read_bry(String k); + byte[] Read_bry_by_str(int i); + byte[] Read_bry_by_str(String k); + String Read_str(int i); + String Read_str(String k); + byte Read_byte(int i); + byte Read_byte(String k); + int Read_int(int i); + int Read_int(String k); + long Read_long(int i); + long Read_long(String k); + float Read_float(int i); + float Read_float(String k); + double Read_double(int i); + double Read_double(String k); + DateAdp Read_date_by_str(int i); + DateAdp Read_date_by_str(String k); + boolean Read_bool_by_byte(int i); + boolean Read_bool_by_byte(String k); + void Rls(); +} diff --git a/140_dbs/src/gplx/dbs/Db_rdr_.java b/140_dbs/src/gplx/dbs/Db_rdr_.java new file mode 100644 index 000000000..074aeefe8 --- /dev/null +++ b/140_dbs/src/gplx/dbs/Db_rdr_.java @@ -0,0 +1,45 @@ +/* +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_rdr_ { + public static final Db_rdr Null = new Db_rdr__null(); +} +class Db_rdr__null implements Db_rdr { + public boolean Move_next() {return false;} + public byte[] Read_bry(int i) {return Bry_.Empty;} + public byte[] Read_bry(String k) {return Bry_.Empty;} + public byte[] Read_bry_by_str(int i) {return Bry_.Empty;} + public byte[] Read_bry_by_str(String k) {return Bry_.Empty;} + public byte Read_byte(int i) {return Byte_.Max_value_127;} + public byte Read_byte(String k) {return Byte_.Max_value_127;} + public String Read_str(int i) {return String_.Empty;} + public String Read_str(String k) {return String_.Empty;} + public DateAdp Read_date_by_str(int i) {return DateAdp_.MinValue;} + public DateAdp Read_date_by_str(String k) {return DateAdp_.MinValue;} + public int Read_int(int i) {return Int_.MinValue;} + public int Read_int(String k) {return Int_.MinValue;} + public long Read_long(int i) {return Long_.MinValue;} + public long Read_long(String k) {return Long_.MinValue;} + public float Read_float(int i) {return Float_.NaN;} + public float Read_float(String k) {return Float_.NaN;} + public double Read_double(int i) {return Double_.NaN;} + public double Read_double(String k) {return Double_.NaN;} + public boolean Read_bool_by_byte(int i) {return false;} + public boolean Read_bool_by_byte(String k) {return false;} + public void Rls() {} +} diff --git a/140_dbs/src/gplx/dbs/Db_rdr__basic.java b/140_dbs/src/gplx/dbs/Db_rdr__basic.java new file mode 100644 index 000000000..5e333e9c1 --- /dev/null +++ b/140_dbs/src/gplx/dbs/Db_rdr__basic.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.dbs; import gplx.*; +import java.sql.ResultSet; +class Db_rdr__basic implements Db_rdr { + protected ResultSet rdr; + public void Ctor(ResultSet rdr, String sql) {this.rdr = rdr; this.sql = sql;} + public String Sql() {return sql;} private String sql; + public boolean Move_next() { + try {return rdr.next();} + catch (Exception e) {throw Err_.new_fmt_("move_next failed; check column casting error in SQL: err={0} sql={1}", Err_.Message_lang(e), sql);} + } + public byte[] Read_bry(int i) {try {return rdr.getBytes(i + 1);} catch (Exception e) {throw Err_.new_("read failed: i={0} type={1} err={2}", i, Bry_.Cls_val_name, Err_.Message_lang(e));}} + public byte[] Read_bry(String k) {try {return (byte[])rdr.getObject(k);} catch (Exception e) {throw Err_.new_("read failed: k={0} type={1} err={2}", k, Bry_.Cls_val_name, Err_.Message_lang(e));}} + public byte[] Read_bry_by_str(int i) {try {return Bry_.new_utf8_(rdr.getString(i + 1));} catch (Exception e) {throw Err_.new_("read failed: i={0} type={1} err={2}", i, String_.Cls_val_name, Err_.Message_lang(e));}} + public byte[] Read_bry_by_str(String k) {try {return Bry_.new_utf8_((String)rdr.getObject(k));} catch (Exception e) {throw Err_.new_("read failed: k={0} type={1} err={2}", k, String_.Cls_val_name, Err_.Message_lang(e));}} + public String Read_str(int i) {try {return rdr.getString(i + 1);} catch (Exception e) {throw Err_.new_("read failed: i={0} type={1} err={2}", i, String_.Cls_val_name, Err_.Message_lang(e));}} + public String Read_str(String k) {try {return (String)rdr.getObject(k);} catch (Exception e) {throw Err_.new_("read failed: k={0} type={1} err={2}", k, String_.Cls_val_name, Err_.Message_lang(e));}} + public DateAdp Read_date_by_str(int i) {return DateAdp_.parse_iso8561(Read_str(i));} + public DateAdp Read_date_by_str(String k) {return DateAdp_.parse_iso8561(Read_str(k));} + public int Read_int(int i) {try {return rdr.getInt(i + 1);} catch (Exception e) {throw Err_.new_("read failed: i={0} type={1} err={2}", i, Int_.Cls_val_name, Err_.Message_lang(e));}} + public int Read_int(String k) {try {return Int_.cast_(rdr.getObject(k));} catch (Exception e) {throw Err_.new_("read failed: k={0} type={1} err={2}", k, Int_.Cls_val_name, Err_.Message_lang(e));}} + public long Read_long(int i) {try {return rdr.getLong(i + 1);} catch (Exception e) {throw Err_.new_("read failed: i={0} type={1} err={2}", i, Long_.Cls_val_name, Err_.Message_lang(e));}} + public long Read_long(String k) {try {return Long_.cast_(rdr.getObject(k));} catch (Exception e) {throw Err_.new_("read failed: k={0} type={1} err={2}", k, Long_.Cls_val_name, Err_.Message_lang(e));}} + public float Read_float(int i) {try {return rdr.getFloat(i + 1);} catch (Exception e) {throw Err_.new_("read failed: i={0} type={1} err={2}", i, Float_.Cls_val_name, Err_.Message_lang(e));}} + public float Read_float(String k) {try {return Float_.cast_(rdr.getObject(k));} catch (Exception e) {throw Err_.new_("read failed: k={0} type={1} err={2}", k, Float_.Cls_val_name, Err_.Message_lang(e));}} + public double Read_double(int i) {try {return rdr.getDouble(i + 1);} catch (Exception e) {throw Err_.new_("read failed: i={0} type={1} err={2}", i, Double_.Cls_val_name, Err_.Message_lang(e));}} + public double Read_double(String k) {try {return Double_.cast_(rdr.getObject(k));} catch (Exception e) {throw Err_.new_("read failed: k={0} type={1} err={2}", k, Double_.Cls_val_name, Err_.Message_lang(e));}} + @gplx.Virtual public byte Read_byte(int i) {try {return rdr.getByte(i + 1);} catch (Exception e) {throw Err_.new_("read failed: i={0} type={1} err={2}", i, Byte_.Cls_val_name, Err_.Message_lang(e));}} + @gplx.Virtual public byte Read_byte(String k) {try {return Byte_.cast_(rdr.getObject(k));} catch (Exception e) {throw Err_.new_("read failed: k={0} type={1} err={2}", k, Byte_.Cls_val_name, Err_.Message_lang(e));}} + public boolean Read_bool_by_byte(int i) {try {return rdr.getByte(i + 1) == 1;} catch (Exception e) {throw Err_.new_("read failed: i={0} type={1} err={2}", i, Bool_.Cls_val_name, Err_.Message_lang(e));}} + public boolean Read_bool_by_byte(String k) {try {return Byte_.cast_(rdr.getObject(k)) == 1;} catch (Exception e) {throw Err_.new_("read failed: k={0} type={1} err={2}", k, Bool_.Cls_val_name, Err_.Message_lang(e));}} + public void Rls() {try {rdr.close();} catch (Exception e) {throw Err_.new_("close failed: err={0}", Err_.Message_lang(e));}} +} diff --git a/140_dbs/src/gplx/dbs/Db_sqlbldr__sqlite.java b/140_dbs/src/gplx/dbs/Db_sqlbldr__sqlite.java new file mode 100644 index 000000000..a6b306c12 --- /dev/null +++ b/140_dbs/src/gplx/dbs/Db_sqlbldr__sqlite.java @@ -0,0 +1,73 @@ +/* +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.*; +interface Db_sqlbldr {} +class Db_sqlbldr__sqlite implements Db_sqlbldr { + private final Bry_bfr tmp_bfr = Bry_bfr.reset_(1024); + public String Bld_create_idx(Db_meta_idx idx) { + tmp_bfr.Add_str_ascii("CREATE "); + if (idx.Unique()) + tmp_bfr.Add_str_ascii("UNIQUE "); + tmp_bfr.Add_str_ascii("INDEX "); + tmp_bfr.Add_str_ascii("IF NOT EXISTS "); + tmp_bfr.Add_str_ascii(idx.Tbl()).Add_str_ascii("__").Add_str_ascii(idx.Name()); + tmp_bfr.Add_str_ascii(" ("); + String[] flds = idx.Flds(); + int flds_len = flds.length; + for (int i = 0; i < flds_len; ++i) { + String fld = flds[i]; + if (i != 0) tmp_bfr.Add_str_ascii(", "); + tmp_bfr.Add_str_ascii(fld); + } + tmp_bfr.Add_str_ascii(");"); + return tmp_bfr.Xto_str_and_clear(); + } + public String Bld_create_tbl(Db_meta_tbl tbl) { + tmp_bfr.Add_str_ascii("CREATE TABLE ").Add_str_ascii(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]; + tmp_bfr.Add_byte(i == 0 ? Byte_ascii.Paren_bgn : Byte_ascii.Comma).Add_byte_space(); + tmp_bfr.Add_str_ascii(fld.Name()).Add_byte_space(); + Tid_to_sql(tmp_bfr, fld.Tid(), fld.Len()); tmp_bfr.Add_byte_space(); + tmp_bfr.Add_str_ascii(fld.Nullable() ? "NULL " : "NOT NULL "); + if (fld.Primary()) tmp_bfr.Add_str_ascii("PRIMARY KEY "); + if (fld.Autoincrement()) tmp_bfr.Add_str_ascii("AUTOINCREMENT "); + tmp_bfr.Del_by_1(); // remove trailing space + tmp_bfr.Add_byte_nl(); + } + tmp_bfr.Add_str_ascii(");"); + return tmp_bfr.Xto_str_and_clear(); + } + public 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_ascii("boolean"); break; + case Db_meta_fld.Tid_byte: tmp_bfr.Add_str_ascii("tinyint"); break; + case Db_meta_fld.Tid_short: tmp_bfr.Add_str_ascii("smallint"); break; + case Db_meta_fld.Tid_int: tmp_bfr.Add_str_ascii("int"); break; + case Db_meta_fld.Tid_long: tmp_bfr.Add_str_ascii("bigint"); break; + case Db_meta_fld.Tid_float: tmp_bfr.Add_str_ascii("float"); break; + case Db_meta_fld.Tid_double: tmp_bfr.Add_str_ascii("double"); break; + case Db_meta_fld.Tid_str: tmp_bfr.Add_str_ascii("varchar(").Add_int_variable(len).Add_byte(Byte_ascii.Paren_end); break; + case Db_meta_fld.Tid_text: tmp_bfr.Add_str_ascii("text"); break; + case Db_meta_fld.Tid_bry: tmp_bfr.Add_str_ascii("blob"); break; + default: throw Err_.unhandled(tid); + } + } +} diff --git a/140_dbs/src/gplx/dbs/Db_sqlbldr_tst.java b/140_dbs/src/gplx/dbs/Db_sqlbldr_tst.java new file mode 100644 index 000000000..03bd4f401 --- /dev/null +++ b/140_dbs/src/gplx/dbs/Db_sqlbldr_tst.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 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("tbl_name", "idx_name", "fld_1", "fld_2") + , "CREATE UNIQUE INDEX IF NOT EXISTS tbl_name__idx_name (fld_1, fld_2);" + ); + } + @Test public void Tbl_basic() { + Db_meta_fld_list flds = Db_meta_fld_list.new_(); + flds.Add_int_pkey("fld_int_pkey"); + flds.Add_bool("fld_bool"); + flds.Add_short("fld_short"); + flds.Add_int("fld_int"); + flds.Add_long("fld_long"); + flds.Add_float("fld_float"); + flds.Add_double("fld_double"); + 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.Xto_fld_ary()) + , String_.Concat_lines_nl_skip_last + ( "CREATE TABLE tbl_name" + , "( fld_int_pkey int NOT NULL PRIMARY KEY" + , ", fld_bool boolean NOT NULL" + , ", fld_short smallint NOT NULL" + , ", fld_int int NOT NULL" + , ", fld_long bigint NOT NULL" + , ", fld_float float NOT NULL" + , ", fld_double double NOT NULL" + , ", fld_str varchar(123) NOT NULL" + , ", fld_text text NOT NULL" + , ", fld_bry blob NOT NULL" + , ");" + )); + } +} +class Db_sqlbldr_fxt { + private Db_sqlbldr__sqlite sqlbldr = new Db_sqlbldr__sqlite(); + 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)); + } +} diff --git a/140_dbs/src/gplx/dbs/Db_sys_regy_mgr.java b/140_dbs/src/gplx/dbs/Db_sys_regy_mgr.java new file mode 100644 index 000000000..eaafd2611 --- /dev/null +++ b/140_dbs/src/gplx/dbs/Db_sys_regy_mgr.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.dbs; import gplx.*; +class Db_sys_regy_mgr { + private Db_sys_regy_tbl tbl; + public Db_sys_regy_mgr(Db_url url, String name) {tbl = new Db_sys_regy_tbl(url, name);} + public void Set(String grp, String key, String val) { + if (tbl.Select_val_or(grp, key, null) == null) + tbl.Insert(grp, key, val); + else + tbl.Update(grp, key, val); + } + public void Del(String grp, String key) { + tbl.Delete(grp, key); + } + public String Get_val_as_str_or(String grp, String key, String or) { + return tbl.Select_val_or(grp, key, or); + } +} +class Db_sys_regy_itm { + public Db_sys_regy_itm(String grp, String key, String val) {this.grp = grp; this.key = key; this.val = val;} + public String Grp() {return grp;} private final String grp; + public String Key() {return key;} private final String key; + public String Val() {return val;} private final String val; +} diff --git a/140_dbs/src/gplx/dbs/Db_sys_regy_mgr_tst.java b/140_dbs/src/gplx/dbs/Db_sys_regy_mgr_tst.java new file mode 100644 index 000000000..e28916fce --- /dev/null +++ b/140_dbs/src/gplx/dbs/Db_sys_regy_mgr_tst.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 org.junit.*; +public class Db_sys_regy_mgr_tst { + @Before public void init() {fxt.Init();} private Db_sys_regy_mgr_fxt fxt = new Db_sys_regy_mgr_fxt(); + @Test public void Insert() { + fxt .Exec_set("grp", "key", "val_0") + .Test_get("grp", "key", "val_0"); + } + @Test public void Update() { + fxt .Exec_set("grp", "key", "val_0") + .Exec_set("grp", "key", "val_1") + .Test_get("grp", "key", "val_1"); + } + @Test public void Delete() { + fxt .Exec_set("grp", "key_0", "val_0") + .Exec_set("grp", "key_1", "val_0") + .Exec_del("grp", "key_1") + .Test_get("grp", "key_0", null) + .Test_get("grp", "key_1", null) + ; + } +} +class Db_sys_regy_mgr_fxt { + private Db_sys_regy_mgr sys_regy_mgr; + public void Init() { + if (sys_regy_mgr == null) { + Db_conn_pool.I.Set_mem("test_db", Db_sys_regy_tbl.new_meta("test_regy")); + sys_regy_mgr = new Db_sys_regy_mgr(Db_url_.mem_("test_db"), "test_regy"); + } + } + public Db_sys_regy_mgr_fxt Exec_set(String grp, String key, String val) {sys_regy_mgr.Set(grp, key, val); return this;} + public Db_sys_regy_mgr_fxt Exec_del(String grp, String key) {sys_regy_mgr.Del(grp, key); return this;} + public Db_sys_regy_mgr_fxt Test_get(String grp, String key, String expd_val) { + Tfds.Eq(expd_val, sys_regy_mgr.Get_val_as_str_or(grp, key, null)); + return this; + } +} diff --git a/140_dbs/src/gplx/dbs/Db_sys_regy_tbl.java b/140_dbs/src/gplx/dbs/Db_sys_regy_tbl.java new file mode 100644 index 000000000..7d71774b9 --- /dev/null +++ b/140_dbs/src/gplx/dbs/Db_sys_regy_tbl.java @@ -0,0 +1,61 @@ +/* +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.*; +class Db_sys_regy_tbl implements Db_conn_itm { + private final String tbl_name; + private Db_conn conn; + public void Conn_term() {} + public Db_sys_regy_tbl(Db_url url, String tbl_name) { + this.tbl_name = tbl_name; +// this.meta = Db_sys_regy_tbl.new_meta(tbl_name); + this.conn = Db_conn_pool.I.Get_or_new(url); + conn.Itms_add(this); + } +// private Db_meta_tbl meta; + public void Insert(String grp, String key, String val) { + Db_stmt stmt = conn.New_stmt_insert(tbl_name, Flds.Xto_str_ary()); + stmt.Clear().Val_str(grp).Val_str(key).Val_str(val).Exec_insert(); + } + public void Update(String grp, String key, String val) { + Db_stmt stmt = conn.New_stmt_update(tbl_name, String_.Ary(Fld_regy_grp, Fld_regy_key), Fld_regy_val); + stmt.Clear().Val_str(val).Val_str(grp).Val_str(key).Exec_update(); + } + public void Delete(String grp, String key) { + Db_stmt stmt = conn.New_stmt_delete(tbl_name, Fld_regy_grp, Fld_regy_key); + stmt.Clear().Val_str(grp).Val_str(key).Exec_delete(); + } + public String Select_val_or(String grp, String key, String or) { + Db_stmt stmt = conn.New_stmt_select_all_where(tbl_name, Flds.Xto_str_ary(), Fld_regy_grp, Fld_regy_key); + Db_rdr rdr = Db_rdr_.Null; + try { + rdr = stmt.Clear().Val_str(grp).Val_str(key).Exec_select_as_rdr(); + return rdr.Move_next() ? rdr.Read_str(Fld_regy_val) : or; + } finally {rdr.Rls();} + } + private static final Db_meta_fld_list Flds = Db_meta_fld_list.new_(); + private static final String + Fld_regy_grp = Flds.Add_str("regy_grp", 1024) + , Fld_regy_key = Flds.Add_str("regy_key", 1024) + , Fld_regy_val = Flds.Add_str("regy_val", 4096) + ; + public static Db_meta_tbl new_meta(String tbl) { + return Db_meta_tbl.new_(tbl, Flds.Xto_fld_ary() + , Db_meta_idx.new_unique(tbl, "key", Flds.Xto_str_ary()) + ); + } +} diff --git a/140_dbs/src/gplx/dbs/Db_url.java b/140_dbs/src/gplx/dbs/Db_url.java new file mode 100644 index 000000000..f5494be78 --- /dev/null +++ b/140_dbs/src/gplx/dbs/Db_url.java @@ -0,0 +1,95 @@ +/* +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 interface Db_url { + String Tid(); + String Xto_raw(); + String Xto_api(); + Db_url New_self(String raw, GfoMsg m); +} +class Db_url__null extends Db_url__base { + @Override public String Tid() {return Tid_const;} public static final String Tid_const = "null_db"; + @Override public Db_url New_self(String raw, GfoMsg m) {return this;} + public static final Db_url__null _ = new Db_url__null(); Db_url__null() {this.Ctor("", "", "gplx_key=null_db", "");} +} +class Db_url__mysql extends Db_url__base { + @Override public String Tid() {return Tid_const;} public static final String Tid_const = "mysql"; + public String Uid() {return uid;} private String uid; + public String Pwd() {return pwd;} private String pwd; + public static Db_url new_(String server, String database, String uid, String pwd) { + return Db_url_.parse_(Bld_raw + ( "gplx_key", Tid_const + , "server", server + , "database", database + , "uid", uid + , "pwd", pwd + , "charset", "utf8" + )); + } + @Override public Db_url New_self(String raw, GfoMsg m) { + Db_url__mysql rv = new Db_url__mysql(); + rv.Ctor(m.ReadStr("server"), m.ReadStr("database"), raw, BldApi(m, KeyVal_.new_("charset", "utf8"))); + rv.uid = m.ReadStr("uid"); + rv.pwd = m.ReadStr("pwd"); + return rv; + } + public static final Db_url__mysql _ = new Db_url__mysql(); Db_url__mysql() {} +} +class Db_url__postgres extends Db_url__base { + @Override public String Tid() {return Tid_const;} public static final String Tid_const = "postgresql"; + public String Uid() {return uid;} private String uid; + public String Pwd() {return pwd;} private String pwd; + public static Db_url new_(String server, String database, String uid, String pwd) { + return Db_url_.parse_(Bld_raw + ( "gplx_key", Tid_const + , "server", server + , "database", database + , "port", "5432" + , "user id", uid + , "password", pwd + , "encoding", "unicode" // needed for 1.1 conn; otherwise, ascii + )); + } + @Override public Db_url New_self(String raw, GfoMsg m) { + Db_url__postgres rv = new Db_url__postgres(); + rv.Ctor(m.ReadStr("server"), m.ReadStr("database"), raw, BldApi(m, KeyVal_.new_("encoding", "unicode"))); + rv.uid = m.ReadStr("user id"); + rv.pwd = m.ReadStr("password"); + return rv; + } + public static final Db_url__postgres _ = new Db_url__postgres(); Db_url__postgres() {} +} +class Db_url__tdb extends Db_url__base { + public Io_url Url() {return url;} Io_url url; + @Override public String Tid() {return Tid_const;} public static final String Tid_const = "tdb"; + public static Db_url new_(Io_url url) { + return Db_url_.parse_(Bld_raw + ( "gplx_key", Tid_const + , "url", url.Raw() + )); + } Db_url__tdb() {} + @Override public Db_url New_self(String raw, GfoMsg m) { + Db_url__tdb rv = new Db_url__tdb(); + String urlStr = m.ReadStr("url"); + Io_url url = Io_url_.new_any_(urlStr); + rv.Ctor(urlStr, url.NameOnly(), raw, BldApi(m)); + rv.url = url; + return rv; + } + public static final Db_url__tdb _ = new Db_url__tdb(); +} diff --git a/140_dbs/src/gplx/dbs/Db_url_.java b/140_dbs/src/gplx/dbs/Db_url_.java new file mode 100644 index 000000000..1fb412883 --- /dev/null +++ b/140_dbs/src/gplx/dbs/Db_url_.java @@ -0,0 +1,55 @@ +/* +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.engines.mems.*; +public class Db_url_ { + public static final Db_url Null = Db_url__null._; + public static final Db_url Test = Db_url__mysql.new_("127.0.0.1", "unit_tests", "root", "mysql7760"); + public static Db_url parse_(String raw) {return Db_url_pool._.Parse(raw);} + public static Db_url sqlite_(Io_url url) {return Db_url__sqlite.load_(url);} + public static Db_url tdb_(Io_url url) {return Db_url__tdb.new_(url);} + public static Db_url mem_(String db) {return Db_url__mem.new_(db);} + public static final String Key_tdb = Db_url__tdb.Tid_const; +} +class Db_url_pool { + private OrderedHash regy = OrderedHash_.new_(); + public Db_url_pool() { + this.Add(Db_url__null._).Add(Db_url__tdb._).Add(Db_url__mysql._).Add(Db_url__postgres._).Add(Db_url__sqlite._); + this.Add(Db_url__mem.I); + } + public Db_url_pool Add(Db_url itm) {regy.AddReplace(itm.Tid(), itm); return this;} + public Db_url Parse(String raw) {// assume each pair has format of: name=val; + try { + GfoMsg m = GfoMsg_.new_parse_("db_url"); + String[] terms = String_.Split(raw, ";"); + String url_tid = ""; + for (String term : terms) { + if (String_.Len(term) == 0) continue; + String[] kv = String_.Split(term, "="); + if (String_.Eq(kv[0], "gplx_key")) + url_tid = kv[1]; // NOTE: do not add to GfoMsg; will not be part of ApiStr + else + m.Add(kv[0], kv[1]); + } + Db_url prototype = (Db_url)regy.Fetch(url_tid); + return prototype.New_self(raw, m); + } + catch(Exception exc) {throw Err_.parse_type_exc_(exc, Db_url.class, raw);} + } + public static final Db_url_pool _ = new Db_url_pool(); +} diff --git a/140_dbs/src/gplx/dbs/Db_url__base.java b/140_dbs/src/gplx/dbs/Db_url__base.java new file mode 100644 index 000000000..9763324b1 --- /dev/null +++ b/140_dbs/src/gplx/dbs/Db_url__base.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; import gplx.*; +public abstract class Db_url__base implements Db_url { + public abstract String Tid(); + public String Xto_raw() {return raw;} private String raw = ""; + public String Xto_api() {return api;} private String api = ""; + public String Database() {return database;} private String database = ""; + public String Server() {return server;} private String server = ""; + public abstract Db_url New_self(String raw, GfoMsg m); + protected void Ctor(String server, String database, String raw, String api) {this.server = server; this.database = database; this.raw = raw; this.api = api;} + protected static String BldApi(GfoMsg m, KeyVal... xtnAry) { + String_bldr sb = String_bldr_.new_(); + HashAdp hash = HashAdp_.new_(); + for (int i = 0; i < m.Args_count(); i++) { + KeyVal kv = m.Args_getAt(i); + sb.Add_fmt("{0}={1};", kv.Key(), kv.Val_to_str_or_empty()); + hash.AddKeyVal(kv.Key()); + } + for (KeyVal xtn : xtnAry) { + if (hash.Has(xtn.Key())) continue; + sb.Add_fmt("{0}={1};", xtn.Key(), xtn.Val_to_str_or_empty()); + } + return sb.XtoStr(); + } + protected static String Bld_raw(String... ary) { + Bry_bfr bfr = Bry_bfr.reset_(255); + int len = ary.length; + for (int i = 0; i < len; ++i) { + String itm = ary[i]; + bfr.Add_str_utf8(itm); + bfr.Add_byte(i % 2 == 0 ? Byte_ascii.Eq : Byte_ascii.Semic); + } + return bfr.Xto_str(); + } +} diff --git a/140_dbs/src/gplx/dbs/Db_url__sqlite.java b/140_dbs/src/gplx/dbs/Db_url__sqlite.java new file mode 100644 index 000000000..f4dbdbb25 --- /dev/null +++ b/140_dbs/src/gplx/dbs/Db_url__sqlite.java @@ -0,0 +1,46 @@ +/* +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_url__sqlite extends Db_url__base { + @Override public String Tid() {return Tid_const;} public static final String Tid_const = "sqlite"; + public Io_url Url() {return url;} private Io_url url; + @Override public Db_url New_self(String raw, GfoMsg m) { + Db_url__sqlite rv = new Db_url__sqlite(); + String url = m.ReadStr("data source"); + rv.url = Io_url_.new_any_(url); + rv.Ctor("", url, raw, BldApi(m, KeyVal_.new_("version", "3"))); + return rv; + } + public static Db_url load_(Io_url url) { + return Db_url_.parse_(Bld_raw + ( "gplx_key" , Tid_const + , "data source" , url.Xto_api() + , "version" , "3" + )); + } + public static Db_url make_(Io_url url) { + Io_mgr._.CreateDirIfAbsent(url.OwnerDir()); + return Db_url_.parse_(Bld_raw + ( "gplx_key" , Tid_const + , "data source" , url.Xto_api() + , "version" , "3" + + )); + } + public static final Db_url__sqlite _ = new Db_url__sqlite(); Db_url__sqlite() {} +} \ No newline at end of file diff --git a/140_dbs/src/gplx/dbs/Db_url_tst.java b/140_dbs/src/gplx/dbs/Db_url_tst.java new file mode 100644 index 000000000..a40046a72 --- /dev/null +++ b/140_dbs/src/gplx/dbs/Db_url_tst.java @@ -0,0 +1,46 @@ +/* +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 org.junit.*; +public class Db_url_tst { + @Before public void setup() { + regy.Add(Db_url_mock._); + } private final Db_url_pool regy = new Db_url_pool(); + @Test public void Parse() { + tst_Parse("gplx_key=mock;id=1;", kv_("id", "1")); // one; gplx_key removed + tst_Parse("gplx_key=mock;id=1;name=me;", kv_("id", "1"), kv_("name", "me")); // many + tst_Parse("gplx_key=mock;id=1;name=me" , kv_("id", "1"), kv_("name", "me")); // no semi-colon at end + } + private KeyVal kv_(String key, Object val) {return KeyVal_.new_(key, val);} + private void tst_Parse(String raw, KeyVal... expd) { + Db_url_mock mock = (Db_url_mock)regy.Parse(raw); + Tfds.Eq_ary_str(expd, mock.Kvs()); + } +} +class Db_url_mock extends Db_url__base { + public KeyVal[] Kvs() {return kvs;} KeyVal[] kvs; + @Override public String Tid() {return Tid_const;} public static final String Tid_const = "mock"; + @Override public Db_url New_self(String raw, GfoMsg m) { + Db_url_mock rv = new Db_url_mock(); + rv.kvs = new KeyVal[m.Args_count()]; + for (int i = 0; i < m.Args_count(); i++) + rv.kvs[i] = m.Args_getAt(i); + return rv; + } + public static final Db_url_mock _ = new Db_url_mock(); Db_url_mock() {} +} diff --git a/140_dbs/src/gplx/dbs/Sql_join_itm.java b/140_dbs/src/gplx/dbs/Sql_join_itm.java new file mode 100644 index 000000000..13f1403b3 --- /dev/null +++ b/140_dbs/src/gplx/dbs/Sql_join_itm.java @@ -0,0 +1,67 @@ +/* +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 Sql_join_itm { + public String SrcTbl() {return srcTbl;} public Sql_join_itm SrcTbl_(String v) {srcTbl = v; return this;} private String srcTbl; + public String SrcFld() {return srcFld;} public Sql_join_itm SrcFld_(String v) {srcFld = v; return this;} private String srcFld; + public String TrgFld() {return trgFld;} public Sql_join_itm TrgFld_(String v) {trgFld = v; return this;} private String trgFld; + public String TrgFldOrSrcFld() {return trgFld == null ? srcFld : trgFld;} + public static Sql_join_itm new_(String trgFld, String srcTbl, String srcFld) { + Sql_join_itm rv = new Sql_join_itm(); + rv.trgFld = trgFld; rv.srcTbl = srcTbl; rv.srcFld = srcFld; + return rv; + } Sql_join_itm() {} + public static Sql_join_itm same_(String tbl, String fld) { + Sql_join_itm rv = new Sql_join_itm(); + rv.trgFld = fld; rv.srcTbl = tbl; rv.srcFld = fld; + return rv; + } +} +class Sql_from { + public ListAdp Tbls() {return tbls;} ListAdp tbls = ListAdp_.new_(); + public Sql_tbl_src BaseTable() {return (Sql_tbl_src)tbls.FetchAt(0);} + + public static Sql_from new_(Sql_tbl_src baseTable) { + Sql_from rv = new Sql_from(); + rv.tbls.Add(baseTable); + return rv; + } Sql_from() {} +} +class Sql_tbl_src { + public Sql_join_itmType JoinType() {return type;} public Sql_tbl_src JoinType_(Sql_join_itmType v) {this.type = v; return this;} Sql_join_itmType type = Sql_join_itmType.Inner; + public ListAdp JoinLinks() {return joinLinks;} ListAdp joinLinks = ListAdp_.new_(); + public String TblName() {return tblName;} public Sql_tbl_src TblName_(String s) {tblName = s; return this;} private String tblName; + public String Alias() {return alias;} public Sql_tbl_src Alias_(String s) {alias = s; return this;} private String alias; + public void XtoSql(String_bldr sb) { + sb.Add_many(tblName, alias == null ? "" : " " + alias); + } + public static Sql_tbl_src new_() {return new Sql_tbl_src();} Sql_tbl_src() {} +} +class Sql_join_itmType { + public int Val() {return val;} int val; + public String Name() {return name;} private String name; + Sql_join_itmType(int v, String name) {this.val = v; this.name = name;} + public static final Sql_join_itmType + From = new Sql_join_itmType(0, "FROM") + , Inner = new Sql_join_itmType(1, "INNER JOIN") + , Left = new Sql_join_itmType(2, "LEFT JOIN") + , Right = new Sql_join_itmType(3, "RIGHT JOIN") + , Outer = new Sql_join_itmType(4, "OUTER JOIN") + , Cross = new Sql_join_itmType(5, "CROSS JOIN") + ; +} diff --git a/140_dbs/src/gplx/dbs/Sql_order_by.java b/140_dbs/src/gplx/dbs/Sql_order_by.java new file mode 100644 index 000000000..fa30513f9 --- /dev/null +++ b/140_dbs/src/gplx/dbs/Sql_order_by.java @@ -0,0 +1,73 @@ +/* +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.lists.*; /*ComparerAble*/ +class Sql_order_by { + public ListAdp Flds() {return flds;} ListAdp flds = ListAdp_.new_(); + + public static Sql_order_by new_(Sql_order_by_itm... ary) { + Sql_order_by rv = new Sql_order_by(); + for (Sql_order_by_itm itm : ary) + rv.flds.Add(itm); + return rv; + } Sql_order_by() {} +} +class Sql_group_by { + public ListAdp Flds() {return flds;} ListAdp flds = ListAdp_.new_(); + + public static Sql_group_by new_(String... ary) { + Sql_group_by rv = new Sql_group_by(); + for (String itm : ary) + rv.flds.Add(itm); + return rv; + } Sql_group_by() {} +} +class Sql_order_by_itm { + public String Name() {return name;} private String name; + public boolean Ascending() {return ascending;} private boolean ascending; + public String XtoSql() { + String ascString = ascending ? "" : " DESC"; + return name + ascString; + } + public static Sql_order_by_itm new_(String name, boolean ascending) { + Sql_order_by_itm rv = new Sql_order_by_itm(); + rv.name = name; rv.ascending = ascending; + return rv; + } Sql_order_by_itm() {} +} +class Sql_order_by_sorter implements ComparerAble { + public int compare(Object lhsObj, Object rhsObj) { + GfoNde lhs = (GfoNde)lhsObj; GfoNde rhs = (GfoNde)rhsObj; + Sql_order_by_itm item = null; Object lhsData = null, rhsData = null; + for (int i = 0; i < items.length; i++) { + item = items[i]; + lhsData = lhs.Read(item.Name()); rhsData = rhs.Read(item.Name()); + int compare = CompareAble_.Compare_obj(lhsData, rhsData); + if (compare == CompareAble_.Same) continue; + int ascendingVal = item.Ascending() ? 1 : -1; + return compare * ascendingVal; + } + return CompareAble_.Same; + } + Sql_order_by_itm[] items; + public static ComparerAble new_(Sql_order_by_itm[] items) { + Sql_order_by_sorter rv = new Sql_order_by_sorter(); + rv.items = items; + return rv; + } +} \ No newline at end of file diff --git a/140_dbs/src/gplx/dbs/Sql_qry_wtr.java b/140_dbs/src/gplx/dbs/Sql_qry_wtr.java new file mode 100644 index 000000000..d8a5a72be --- /dev/null +++ b/140_dbs/src/gplx/dbs/Sql_qry_wtr.java @@ -0,0 +1,22 @@ +/* +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.criterias.*; +public interface Sql_qry_wtr { + String Xto_str(Db_qry qry, boolean prepare); +} diff --git a/140_dbs/src/gplx/dbs/Sql_qry_wtr_.java b/140_dbs/src/gplx/dbs/Sql_qry_wtr_.java new file mode 100644 index 000000000..eae3e7ca1 --- /dev/null +++ b/140_dbs/src/gplx/dbs/Sql_qry_wtr_.java @@ -0,0 +1,24 @@ +/* +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 Sql_qry_wtr_ { + public static Sql_qry_wtr new_ansi() {return new Sql_qry_wtr_ansi();} + public static Sql_qry_wtr new_escape_backslash() {return new Sql_qry_wtr_ansi_escape_backslash();} + public static final Sql_qry_wtr I = new Sql_qry_wtr_ansi(); + public static String Gen_placeholder_parameters(Db_qry qry) {return Sql_qry_wtr_.I.Xto_str(qry, true);} // replace arguments with ?; EX: UPDATE a SET b = ? WHERE c = ?; +} diff --git a/140_dbs/src/gplx/dbs/Sql_qry_wtr_ansi.java b/140_dbs/src/gplx/dbs/Sql_qry_wtr_ansi.java new file mode 100644 index 000000000..5fd9a82b3 --- /dev/null +++ b/140_dbs/src/gplx/dbs/Sql_qry_wtr_ansi.java @@ -0,0 +1,286 @@ +/* +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.criterias.*; +class Sql_qry_wtr_ansi implements Sql_qry_wtr { + private final String_bldr sb = String_bldr_.new_(); + private boolean prepare = false; + public String Xto_str(Db_qry cmd, boolean prepare) { + this.prepare = prepare; + switch (cmd.Tid()) { + case Db_qry_.Tid_insert: return Bld_qry_insert((Db_qry_insert)cmd); + case Db_qry_.Tid_delete: return Bld_qry_delete((Db_qry_delete)cmd); + case Db_qry_.Tid_update: return Bld_qry_update((Db_qry_update)cmd); + case Db_qry_.Tid_select_in_tbl: + case Db_qry_.Tid_select: return Bld_qry_select((Db_qry_select)cmd); + case Db_qry_.Tid_sql: return ((Db_qry_sql)cmd).Xto_sql(); + default: throw Err_.unhandled(cmd.Tid()); + } + } + private String Bld_qry_delete(Db_qry_delete cmd) { + sb.Add_many("DELETE FROM ", cmd.Base_table()); + Bld_where2(sb, cmd.Where()); + return sb.Xto_str_and_clear(); + } + private String Bld_qry_insert(Db_qry_insert cmd) { + if (cmd.Select() != null) { + sb.Add_many("INSERT INTO ", cmd.Base_table(), " ("); + for (int i = 0; i < cmd.Cols().Count(); i++) { + Sql_select_fld_base fld = cmd.Cols().FetchAt(i); + sb.Add(fld.Alias()); + sb.Add(i == cmd.Cols().Count() - 1 ? ") " : ", "); + } + sb.Add(Bld_qry_select(cmd.Select())); + return sb.Xto_str_and_clear(); + } + int arg_count = cmd.Args().Count(); if (arg_count == 0) throw Err_.new_("Db_qry_insert has no columns").Add("base_table", cmd.Base_table()); + int last = arg_count - 1; + sb.Add_many("INSERT INTO ", cmd.Base_table(), " ("); + for (int i = 0; i < arg_count; i++) { + KeyVal pair = cmd.Args().FetchAt(i); + this.XtoSqlCol(sb, pair.Key_as_obj()); + sb.Add(i == last ? ")" : ", "); + } + sb.Add(" VALUES ("); + for (int i = 0; i < arg_count; i++) { + KeyVal pair = cmd.Args().FetchAt(i); + Db_arg prm = (Db_arg)pair.Val(); + this.Bld_val(sb, prm); + sb.Add(i == last ? ")" : ", "); + } + return sb.Xto_str_and_clear(); + } + private String Bld_qry_update(Db_qry_update cmd) { + int arg_count = cmd.Args().Count(); if (arg_count == 0) throw Err_.new_("Db_qry_update has no columns").Add("base_table", cmd.Base_table()); + sb.Add_many("UPDATE ", cmd.Base_table(), " SET "); + for (int i = 0; i < arg_count; i++) { + KeyVal pair = cmd.Args().FetchAt(i); + if (i > 0) sb.Add(", "); + this.XtoSqlCol(sb, pair.Key_as_obj()); + sb.Add("="); + this.Bld_val(sb, (Db_arg)pair.Val()); + } + Bld_where(sb, cmd.Where()); + return sb.Xto_str_and_clear(); + } + private String Bld_qry_select(Db_qry_select cmd) { + sb.Add("SELECT "); + if (cmd.Cols().Distinct()) sb.Add("DISTINCT "); + Sql_select_fld_list flds = cmd.Cols().Flds(); + if (flds.Count() == 0) sb.Add("*"); + for (int i = 0; i < flds.Count(); i++) { + Sql_select_fld_base fld = (Sql_select_fld_base)flds.FetchAt(i); + if (i > 0) sb.Add(", "); + this.XtoSqlCol(sb, fld.XtoSql()); + } + Bld_clause_from(sb, cmd.From()); + Bld_where(sb, cmd.Where()); + Bld_select_group_by(sb, cmd.GroupBy()); + Bld_select_order_by(sb, cmd.OrderBy()); + Bld_select_limit(sb, cmd.Limit()); + return sb.Xto_str_and_clear(); + } + private void Bld_select_group_by(String_bldr sb, Sql_group_by groupBy) { + if (groupBy == null) return; + sb.Add(" GROUP BY "); + for (int i = 0; i < groupBy.Flds().Count(); i++) { + String item = (String)groupBy.Flds().FetchAt(i); + if (i > 0) sb.Add(", "); + sb.Add(item); + } + } + private void Bld_select_order_by(String_bldr sb, Sql_order_by orderBy) { + if (orderBy == null) return; + sb.Add(" ORDER BY "); + for (int i = 0; i < orderBy.Flds().Count(); i++) { + Sql_order_by_itm item = (Sql_order_by_itm)orderBy.Flds().FetchAt(i); + if (i > 0) sb.Add(", "); + sb.Add(item.XtoSql()); + } + } + private void Bld_select_limit(String_bldr sb, int limit) { + if (limit == Db_qry_select.Limit_disabled) return; + sb.Add(" LIMIT ").Add(limit); + } + private void Bld_clause_from(String_bldr sb, Sql_from from) { + for (Object tblObj : from.Tbls()) { + Sql_tbl_src tbl = (Sql_tbl_src)tblObj; + sb.Add_many + ( " ", String_.Upper(tbl.JoinType().Name()), " ", tbl.TblName(), String_.FormatOrEmptyStrIfNull(" {0}", tbl.Alias()) + ); + String tblAliasForJoin = tbl.Alias() == null ? tbl.TblName() : tbl.Alias(); + for (int i = 0; i < tbl.JoinLinks().Count(); i++) { + Sql_join_itm joinLink = (Sql_join_itm)tbl.JoinLinks().FetchAt(i); + String conjunction = i == 0 ? " ON " : " AND "; + sb.Add_many + ( conjunction, joinLink.SrcTbl(), ".", joinLink.SrcFld(), "=", tblAliasForJoin, ".", joinLink.TrgFldOrSrcFld() + ); + } + } + } + private void XtoSqlCol(String_bldr sb, Object obj) { + if (obj == null) throw Err_.null_("ColName"); + sb.Add_obj(obj); // FIXME: options for bracketing; ex: [name] + } + public void Bld_val(String_bldr sb, Db_arg arg) { + if (prepare) { + sb.Add("?"); + return; + } + Object val = arg.Val(); + if (val == null) { + sb.Add("NULL"); + return; + } + Class val_type = val.getClass(); + if (val_type == Bool_.Cls_ref_type) + sb.Add_obj(Bool_.Xto_int(Bool_.cast_(val))); // NOTE: save boolean to 0 or 1, b/c (a) db may not support bit datatype (sqllite) and (b) avoid i18n issues with "true"/"false" + else if + ( val_type == Byte_.Cls_ref_type || val_type == Short_.Cls_ref_type + || val_type == Int_.Cls_ref_type || val_type == Long_.Cls_ref_type + || val_type == Float_.Cls_ref_type || val_type == Double_.Cls_ref_type + ) + sb.Add(Object_.Xto_str_strict_or_null(val)); + else if (val_type == DateAdp.class) + Bld_val_date(sb, arg, (DateAdp)val); + else if (val_type == DecimalAdp.class) { + DecimalAdp valDecimal = (DecimalAdp)val; + sb.Add(valDecimal.Xto_str()); + } + else { + String valString = Object_.Xto_str_strict_or_null(val); + Bld_val_str(sb, arg, valString); + } + } + @gplx.Virtual public void Bld_val_str(String_bldr sb, Db_arg prm, String s) { + sb.Add_many("'", String_.Replace(s, "'", "''"), "'"); // stupid escaping of ' + } + @gplx.Virtual public void Bld_val_date(String_bldr sb, Db_arg prm, DateAdp s) { + sb.Add_many("'", s.XtoStr_gplx_long(), "'"); + } + private void Bld_where(String_bldr sb, Sql_where where) { + if (where == null || where.Crt() == Db_crt_.Wildcard) return; + sb.Add(" WHERE "); + this.Bld_where(sb, where.Crt()); + } + private void Bld_where2(String_bldr sb, Criteria crt) { + if (crt == null || crt == Db_crt_.Wildcard) return; + sb.Add(" WHERE "); + this.Bld_where(sb, crt); + } + public void Bld_where(String_bldr sb, Criteria crt) { + Criteria_bool_base crt_bool = Criteria_bool_base.as_(crt); + if (crt_bool != null) { + sb.Add("("); + Bld_where(sb, crt_bool.Lhs()); + sb.Add_many(" ", crt_bool.OpLiteral(), " "); + Bld_where(sb, crt_bool.Rhs()); + sb.Add(")"); + return; + } + if (crt.Crt_tid() == Criteria_.Tid_db_obj_ary) { + Append_db_obj_ary(sb, (Db_obj_ary_crt)crt); + } + else { + Criteria_wrapper leaf = Criteria_wrapper.as_(crt); if (leaf == null) throw Err_.invalid_op_(crt.XtoStr()); + sb.Add(leaf.Name_of_GfoFldCrt()); + Bld_where_crt(sb, leaf.Crt_of_GfoFldCrt()); + } + } + private void Bld_where_crt(String_bldr sb, Criteria crt) { + switch (crt.Crt_tid()) { + case Criteria_.Tid_eq: Bld_where_eq(sb, Criteria_eq.as_(crt)); break; + case Criteria_.Tid_comp: Bld_where_comp(sb, Criteria_comp.as_(crt)); break; + case Criteria_.Tid_between: Bld_where_between(sb, Criteria_between.as_(crt)); break; + case Criteria_.Tid_in: Bld_where_in(sb, Criteria_in.as_(crt)); break; + case Criteria_.Tid_like: Bld_where_like(sb, Criteria_like.as_(crt)); break; + case Criteria_.Tid_iomatch: Bld_where_iomatch(sb, Criteria_ioMatch.as_(crt)); break; + default: throw Err_.unhandled(crt); + } + } + private void Bld_where_eq(String_bldr sb, Criteria_eq crt) { + sb.Add(crt.Negated() ? "!=" : "="); + this.Bld_val(sb, Wrap(crt.Value())); + } + private void Bld_where_comp(String_bldr sb, Criteria_comp crt) { + sb.Add_many(crt.XtoSymbol()); + this.Bld_val(sb, Wrap(crt.Value())); + } + private void Bld_where_between(String_bldr sb, Criteria_between crt) { + sb.Add(crt.Negated() ? " NOT BETWEEN " : " BETWEEN "); + this.Bld_val(sb, Wrap(crt.Lhs())); + sb.Add(" AND "); + this.Bld_val(sb, Wrap(crt.Rhs())); + } + private void Bld_where_like(String_bldr sb, Criteria_like crt) { + sb.Add(crt.Negated() ? " NOT LIKE " : " LIKE "); + this.Bld_val(sb, Wrap(crt.Pattern().Raw())); + sb.Add_fmt(" ESCAPE '{0}'", crt.Pattern().Escape()); + } + private void Bld_where_in(String_bldr sb, Criteria_in crt) { + sb.Add(crt.Negated() ? " NOT IN (" : " IN ("); + Object[] crt_vals = crt.Values(); + int len = crt_vals.length; + int last = len - 1; + for (int i = 0; i < len; i++) { + Object val = crt_vals[i]; + this.Bld_val(sb, Wrap(val)); + sb.Add(i == last ? ")" : ", "); + } + } + private void Bld_where_iomatch(String_bldr sb, Criteria_ioMatch crt) { + sb.Add(crt.Negated() ? " NOT IOMATCH " : " IOMATCH "); + this.Bld_val(sb, Wrap(crt.Pattern().Raw())); + } + public void Append_db_obj_ary(String_bldr sb, Db_obj_ary_crt crt) { + Object[][] ary = crt.Vals(); + int ary_len = ary.length; + Db_fld[] flds = crt.Flds(); + for (int i = 0; i < ary_len; i++) { + Object[] itm = (Object[])ary[i]; + int itm_len = itm.length; + if (i != 0) sb.Add(" OR "); + sb.Add("("); + for (int j = 0; j < itm_len; j++) { + if (j != 0) sb.Add(" AND "); + Db_fld fld = flds[j]; + Object val = itm[j]; + boolean quote = false; + switch (fld.Type_tid()) { + case ClassAdp_.Tid_str: + case ClassAdp_.Tid_char: + case ClassAdp_.Tid_date: + quote = true; + break; + } + sb.Add(fld.Name()); + sb.Add("="); + if (quote) sb.Add("'"); + sb.Add(Object_.Xto_str_strict_or_empty(val)); + if (quote) sb.Add("'"); + } + sb.Add(")"); + } + } + private Db_arg Wrap(Object val) {return new Db_arg("unknown", val);} +} +class Sql_qry_wtr_ansi_escape_backslash extends Sql_qry_wtr_ansi { @Override public void Bld_val_str(String_bldr sb, Db_arg prm, String s) { + if (String_.Has(s, "\\")) s = String_.Replace(s, "\\", "\\\\"); + super.Bld_val_str(sb, prm, s); + } +} diff --git a/140_dbs/src/gplx/dbs/Sql_qry_wtr_tst.java b/140_dbs/src/gplx/dbs/Sql_qry_wtr_tst.java new file mode 100644 index 000000000..c31deb4f4 --- /dev/null +++ b/140_dbs/src/gplx/dbs/Sql_qry_wtr_tst.java @@ -0,0 +1,61 @@ +/* +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 org.junit.*; +import gplx.criterias.*; +public class Sql_qry_wtr_tst { + private final Sql_qry_wtr_fxt fxt = new Sql_qry_wtr_fxt(); + @Test public void Val() { + fxt.Test_val(null , "NULL"); + fxt.Test_val(true , "1"); + fxt.Test_val(false , "0"); + fxt.Test_val(1 , "1"); + fxt.Test_val(1.1 , "1.1"); + fxt.Test_val("a" , "'a'"); + fxt.Test_val("a'b" , "'a''b'"); + } + @Test public void Where_basic() { + fxt.Test_where(Db_crt_.eq_("id", 1), "id=1"); + fxt.Test_where(Db_crt_.eqn_("id", 1), "id!=1"); + fxt.Test_where(Db_crt_.mt_("id", 1), "id>1"); + fxt.Test_where(Db_crt_.mte_("id", 1), "id>=1"); + fxt.Test_where(Db_crt_.lt_("id", 1), "id<1"); + fxt.Test_where(Db_crt_.lte_("id", 1), "id<=1"); + fxt.Test_where(Db_crt_.between_("id", 1, 2), "id BETWEEN 1 AND 2"); + fxt.Test_where(Db_crt_.in_("id", 1, 2, 3), "id IN (1, 2, 3)"); + } + @Test public void Where_and() { + fxt.Test_where(Criteria_.And(Db_crt_.eq_("id", 1), Db_crt_.eq_("name", "me")), "(id=1 AND name='me')"); + fxt.Test_where(Criteria_.Or(Db_crt_.eq_("id", 1), Db_crt_.eq_("name", "me")), "(id=1 OR name='me')"); + fxt.Test_where(Criteria_.Or(Db_crt_.eq_("id", 1), Criteria_.And(Db_crt_.eq_("name", "me"), Db_crt_.eq_("id", 1))), "(id=1 OR (name='me' AND id=1))"); + } +} +class Sql_qry_wtr_fxt { + private final Sql_qry_wtr_ansi sql_wtr = (Sql_qry_wtr_ansi)Sql_qry_wtr_.new_ansi(); + public void Test_val(Object val, String expd) { + String_bldr sb = String_bldr_.new_(); + Db_arg arg = new Db_arg("not needed", val); + sql_wtr.Bld_val(sb, arg); + Tfds.Eq(expd, sb.XtoStr()); + } + public void Test_where(Criteria crt, String expd) { + String_bldr sb = String_bldr_.new_(); + sql_wtr.Bld_where(sb, crt); + Tfds.Eq(expd, sb.XtoStr()); + } +} diff --git a/140_dbs/src/gplx/dbs/Sql_select.java b/140_dbs/src/gplx/dbs/Sql_select.java new file mode 100644 index 000000000..01a32c809 --- /dev/null +++ b/140_dbs/src/gplx/dbs/Sql_select.java @@ -0,0 +1,143 @@ +/* +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.*; +class Sql_select { + public Sql_select_fld_list Flds() {return flds;} Sql_select_fld_list flds = Sql_select_fld_list.new_(); + public boolean Distinct() {return distinct;} public void Distinct_set(boolean v) {distinct = v;} private boolean distinct; + public void Add(String fldName) {flds.Add(Sql_select_fld_fld.new_(Sql_select_fld_base.Tbl_null, fldName, fldName));} + public void Add(String fldName, String alias) {flds.Add(Sql_select_fld_fld.new_(Sql_select_fld_base.Tbl_null, fldName, alias));} + public void Add(Sql_select_fld_base fld) {flds.Add(fld);} + + public static final Sql_select All = all_(); static Sql_select all_() {Sql_select rv = new_(); rv.Add(Sql_select_fld_wild._); return rv;} + public static Sql_select new_() {return new Sql_select();} Sql_select() {} +} +abstract class Sql_select_fld_base { + public String Tbl() {return tbl;} public void Tbl_set(String val) {tbl = val;} private String tbl; + public String Fld() {return fld;} public void Fld_set(String val) {fld = val;} private String fld; + public String Alias() {return alias;} public void Alias_set(String val) {alias = val;} private String alias; + public ClassXtn ValType() {return valType;} public void ValType_set(ClassXtn val) {valType = val;} ClassXtn valType = ObjectClassXtn._; + public abstract Object GroupBy_eval(Object groupByVal, Object curVal, ClassXtn type); + @gplx.Virtual public void GroupBy_type(GfoFld fld) {this.ValType_set(fld.Type());} + @gplx.Virtual public boolean Type_fld() {return true;} + public abstract String XtoSql(); + public static final String Tbl_null = null; + @gplx.Internal protected void ctor_(String tbl, String fld, String alias) { + Tbl_set(tbl); Fld_set(fld); Alias_set(alias); + } +} +class Sql_select_fld_wild extends Sql_select_fld_base { + @Override public Object GroupBy_eval(Object groupByVal, Object curVal, ClassXtn type) {throw Err_.new_("group by eval not allowed on *");} + @Override public void GroupBy_type(GfoFld fld) {throw Err_.new_("group by type not allowed on *");} + @Override public String XtoSql() {return "*";} + public static final Sql_select_fld_wild _ = new Sql_select_fld_wild(); Sql_select_fld_wild() {this.ctor_(Tbl_null, "*", "*");} +} +class Sql_select_fld_fld extends Sql_select_fld_base { + @Override public Object GroupBy_eval(Object groupByVal, Object curVal, ClassXtn type) {return curVal;} + @Override public void GroupBy_type(GfoFld fld) {this.ValType_set(fld.Type());} + @Override public String XtoSql() { + String rv = Fld(); + if (Tbl() != Tbl_null) + rv = Tbl() + "." + Fld(); + if (!String_.Eq(Alias(), Fld())) + rv = rv + " AS " + Alias(); + return rv; + } + public static Sql_select_fld_fld new_(String tbl, String fld, String alias) { + Sql_select_fld_fld rv = new Sql_select_fld_fld(); + rv.ctor_(tbl, fld, alias); + return rv; + } Sql_select_fld_fld() {} +} +abstract class Sql_select_fld_func_base extends Sql_select_fld_base { + public abstract String XtoSql_functionName(); + @Override public boolean Type_fld() {return false;} + @Override public String XtoSql() { + return String_.Format("{0}({1}) AS {2}", XtoSql_functionName(), Fld(), Alias()); + } +} +class Sql_select_fld_count extends Sql_select_fld_func_base { + @Override public String XtoSql_functionName() {return "COUNT";} + @Override public void GroupBy_type(GfoFld fld) {this.ValType_set(IntClassXtn._);} + @Override public Object GroupBy_eval(Object groupByVal, Object curVal, ClassXtn type) { + if (groupByVal == null) return 1; + return Int_.cast_(groupByVal) + 1; + } + public static Sql_select_fld_count new_(String tbl, String fld, String alias) { + Sql_select_fld_count rv = new Sql_select_fld_count(); + rv.ctor_(tbl, fld, alias); + return rv; + } Sql_select_fld_count() {} +} +class Sql_select_fld_sum extends Sql_select_fld_func_base { + @Override public String XtoSql_functionName() {return "SUM";} + @Override public void GroupBy_type(GfoFld fld) {this.ValType_set(IntClassXtn._);} + @Override public Object GroupBy_eval(Object groupByVal, Object curVal, ClassXtn type) { + if (groupByVal == null) return Int_.cast_(curVal); + return Int_.cast_(groupByVal) + Int_.cast_(curVal); + } + public static Sql_select_fld_sum new_(String tbl, String fld, String alias) { + Sql_select_fld_sum rv = new Sql_select_fld_sum(); + rv.ctor_(tbl, fld, alias); + return rv; + } Sql_select_fld_sum() {} +} +class Sql_select_fld_minMax extends Sql_select_fld_func_base { + int compareType = CompareAble_.Less; + @Override public String XtoSql_functionName() {return compareType == CompareAble_.Less ? "MIN" : "MAX";} + @Override public Object GroupBy_eval(Object groupByVal, Object curVal, ClassXtn type) { + if (groupByVal == null) return curVal; + int compareVal = CompareAble_.Compare_obj(curVal, groupByVal); + return compareVal * compareType > 0 ? curVal : groupByVal; + } + public static Sql_select_fld_minMax min_(String tbl, String fld, String alias) {return new_(CompareAble_.Less, tbl, fld, alias);} + public static Sql_select_fld_minMax max_(String tbl, String fld, String alias) {return new_(CompareAble_.More, tbl, fld, alias);} + static Sql_select_fld_minMax new_(int compareType, String tbl, String fld, String alias) { + Sql_select_fld_minMax rv = new Sql_select_fld_minMax(); + rv.compareType = compareType; + rv.ctor_(tbl, fld, alias); + return rv; + } Sql_select_fld_minMax() {} +} +class Sql_select_fld_list { + public int Count() {return hash.Count();} + public void Add(Sql_select_fld_base fld) {hash.Add(fld.Alias(), fld);} + public Sql_select_fld_base FetchAt(int i) {return (Sql_select_fld_base)hash.FetchAt(i);} + public Sql_select_fld_base FetchOrNull(String k) {return (Sql_select_fld_base)hash.Fetch(k);} + public GfoFldList XtoGfoFldLst(TdbTable tbl) { + GfoFldList rv = GfoFldList_.new_(); + for (int i = 0; i < this.Count(); i++) { + Sql_select_fld_base selectFld = this.FetchAt(i); + GfoFld fld = tbl.Flds().FetchOrNull(selectFld.Fld()); + if (fld == null) throw Err_.new_("fld not found in tbl").Add("fldName", selectFld.Fld()).Add("tblName", tbl.Name()).Add("tblFlds", tbl.Flds().XtoStr()); + if (rv.Has(selectFld.Alias())) throw Err_.new_("alias is not unique").Add("fldName", selectFld.Fld()).Add("flds", rv.XtoStr()); + selectFld.GroupBy_type(fld); + rv.Add(selectFld.Alias(), selectFld.ValType()); + } + return rv; + } + public String XtoStr() { + String_bldr sb = String_bldr_.new_(); + for (int i = 0; i < this.Count(); i++) { + Sql_select_fld_base fld = this.FetchAt(i); + sb.Add_fmt("{0},{1}|", fld.Fld(), fld.Alias()); + } + return sb.XtoStr(); + } + OrderedHash hash = OrderedHash_.new_(); + public static Sql_select_fld_list new_() {return new Sql_select_fld_list();} Sql_select_fld_list() {} +} diff --git a/140_dbs/src/gplx/dbs/Sql_where.java b/140_dbs/src/gplx/dbs/Sql_where.java new file mode 100644 index 000000000..bb58f459b --- /dev/null +++ b/140_dbs/src/gplx/dbs/Sql_where.java @@ -0,0 +1,32 @@ +/* +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.criterias.*; +class Sql_where { + public Criteria Crt() {return crt;} Criteria crt; + public static Sql_where merge_or_new_(Sql_where where, Criteria crt) { + return where == null + ? Sql_where.new_(crt) + : Sql_where.new_(Criteria_.And(where.Crt(), crt)); + } + public static Sql_where new_(Criteria crt) { + Sql_where rv = new Sql_where(); + rv.crt = crt; + return rv; + } Sql_where() {} +} 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 new file mode 100644 index 000000000..8409aed45 --- /dev/null +++ b/140_dbs/src/gplx/dbs/engines/mems/Db_engine__mem.java @@ -0,0 +1,46 @@ +/* +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.mems; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; +public class Db_engine__mem implements Db_engine { + private final HashAdp tbl_hash = HashAdp_.new_(); + public Db_engine__mem(Db_url url, Db_meta_tbl[] meta_tbls) { + this.url = url; + int tbls_len = meta_tbls.length; + for (int i = 0; i < tbls_len; ++i) { + Db_meta_tbl meta_tbl = meta_tbls[i]; + Mem_tbl tbl = new Mem_tbl(); + tbl_hash.Add(meta_tbl.Name(), tbl); + } + } + public String Tid() {return Db_url__mem.Tid_const;} + public Db_url Url() {return url;} private Db_url url; + public Db_engine New_clone(Db_url url) {return this;} + public Db_stmt New_stmt_prep(Db_qry qry) {return new Db_stmt__mem(this, qry);} + public Mem_tbl Tbls_get(String name) {return (Mem_tbl)tbl_hash.Fetch(name);} + public void Txn_bgn() {++txn_count;} private int txn_count = 0; + public void Txn_end() {--txn_count;} + public Object Exec_as_obj(Db_qry qry) {throw Err_.not_implemented_();} + public void Conn_open() {} + public void Conn_term() { + if (txn_count != 0) throw Err_.new_("Conn_term.txns still open; txn_count={0}", txn_count); + } + public Db_rdr New_rdr_by_obj(Object rdr, String sql) {throw Err_.not_implemented_();} + public DataRdr New_rdr(java.sql.ResultSet rdr, String sql) {throw Err_.not_implemented_();} + public Object New_stmt_prep_as_obj(String sql) {throw Err_.not_implemented_();} + public static final Db_engine__mem _ = new Db_engine__mem(); Db_engine__mem() {} +} diff --git a/140_dbs/src/gplx/dbs/engines/mems/Db_rdr__mem.java b/140_dbs/src/gplx/dbs/engines/mems/Db_rdr__mem.java new file mode 100644 index 000000000..378f22020 --- /dev/null +++ b/140_dbs/src/gplx/dbs/engines/mems/Db_rdr__mem.java @@ -0,0 +1,57 @@ +/* +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.mems; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; +public class Db_rdr__mem implements Db_rdr { + private final Mem_itm[] rows; private int row_idx = -1; private final int rows_len; + private final HashAdp ords = HashAdp_.new_(); + private Mem_itm row; + public Db_rdr__mem(String[] cols, Mem_itm[] rows) { + this.rows = rows; this.rows_len = rows.length; + int cols_len = cols.length; + for (int i = 0; i < cols_len; ++i) + ords.Add(cols[i], i); + } + public boolean Move_next() { + boolean rv = ++row_idx < rows_len; + if (rv) + row = rows[row_idx]; + return rv; + } + public byte[] Read_bry(int i) {return (byte[])row.Get_at(i);} + public byte[] Read_bry(String k) {return (byte[])row.Get_at(Ord_by_key(k));} + public String Read_str(int i) {return (String)row.Get_at(i);} + public String Read_str(String k) {return (String)row.Get_at(Ord_by_key(k));} + public byte[] Read_bry_by_str(int i) {return Bry_.new_utf8_((String)row.Get_at(i));} + public byte[] Read_bry_by_str(String k) {return Bry_.new_utf8_((String)row.Get_at(Ord_by_key(k)));} + public DateAdp Read_date_by_str(int i) {return DateAdp_.parse_iso8561((String)row.Get_at(i));} + public DateAdp Read_date_by_str(String k) {return DateAdp_.parse_iso8561((String)row.Get_at(Ord_by_key(k)));} + public byte Read_byte(int i) {return Byte_.cast_(row.Get_at(i));} + public byte Read_byte(String k) {return Byte_.cast_(row.Get_at(Ord_by_key(k)));} + public int Read_int(int i) {return Int_.cast_(row.Get_at(i));} + public int Read_int(String k) {return Int_.cast_(row.Get_at(Ord_by_key(k)));} + public long Read_long(int i) {return Long_.cast_(row.Get_at(i));} + public long Read_long(String k) {return Long_.cast_(row.Get_at(Ord_by_key(k)));} + public float Read_float(int i) {return Float_.cast_(row.Get_at(i));} + public float Read_float(String k) {return Float_.cast_(row.Get_at(Ord_by_key(k)));} + public double Read_double(int i) {return Double_.cast_(row.Get_at(i));} + public double Read_double(String k) {return Double_.cast_(row.Get_at(Ord_by_key(k)));} + public boolean Read_bool_by_byte(int i) {return Byte_.cast_(row.Get_at(i)) == 1;} + public boolean Read_bool_by_byte(String k) {return Byte_.cast_(row.Get_at(Ord_by_key(k))) == 1;} + public void Rls() {} + private int Ord_by_key(String k) {return Int_.cast_(ords.Fetch(k));} +} 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 new file mode 100644 index 000000000..b760c18cf --- /dev/null +++ b/140_dbs/src/gplx/dbs/engines/mems/Db_stmt__mem.java @@ -0,0 +1,127 @@ +/* +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.mems; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; +public class Db_stmt__mem implements Db_stmt { + private int val_idx; + public Db_stmt__mem(Db_engine__mem engine, Db_qry qry) {this.engine = engine; this.qry = qry;} private Db_engine__mem engine; + public int Args_len() {return args.Count();} + public Object Args_get_at(int i) {return args.FetchAt(i);} + public Db_qry Qry() {return qry;} private Db_qry qry; + public Db_stmt Reset_stmt() {return this;} + public Db_stmt Clear() { + val_idx = 0; + args.Clear(); + return this; + } + public void Rls() { + this.Clear(); + } + public Db_stmt Crt_bool_as_byte(String k, boolean v) {return Add_byte_by_bool(Bool_.Y, k, v);} + public Db_stmt Val_bool_as_byte(String k, boolean v) {return Add_byte_by_bool(Bool_.N, k, v);} + public Db_stmt Val_bool_as_byte(boolean v) {return Add_byte_by_bool(Bool_.N, null, v);} + private Db_stmt Add_byte_by_bool(boolean where, String k, boolean v) {return Add_byte(where, k, v ? Bool_.Y_byte : Bool_.N_byte);} + public Db_stmt Crt_byte(String k, byte v) {return Add_byte(Bool_.Y, k, v);} + 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, null, v);} + private Db_stmt Add_byte(boolean where, String k, byte v) { + try {Add(++val_idx, v);} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "byte", v);} + return this; + } + public Db_stmt Crt_int(String k, int v) {return Add_int(Bool_.Y, k, v);} + 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, null, v);} + private Db_stmt Add_int(boolean where, String k, int v) { + try {Add(++val_idx, v);} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "int", v);} + return this; + } + public Db_stmt Crt_long(String k, long v) {return Add_long(Bool_.Y, k, v);} + 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, null, v);} + private Db_stmt Add_long(boolean where, String k, long v) { + try {Add(++val_idx, v);} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "long", v);} + return this; + } + public Db_stmt Crt_float(String k, float v) {return Add_float(Bool_.Y, k, v);} + 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, null, v);} + private Db_stmt Add_float(boolean where, String k, float v) { + try {Add(++val_idx, v);} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "float", v);} + return this; + } + public Db_stmt Crt_double(String k, double v) {return Add_double(Bool_.Y, k, v);} + 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, null, v);} + private Db_stmt Add_double(boolean where, String k, double v) { + try {Add(++val_idx, v);} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "double", v);} + return this; + } + public Db_stmt Crt_decimal(String k, DecimalAdp v) {return Add_decimal(Bool_.Y, k, v);} + public Db_stmt Val_decimal(String k, DecimalAdp v) {return Add_decimal(Bool_.N, k, v);} + public Db_stmt Val_decimal(DecimalAdp v) {return Add_decimal(Bool_.N, null, v);} + private Db_stmt Add_decimal(boolean where, String k, DecimalAdp v) { + try {Add(++val_idx, v);} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "decimal", v);} + return this; + } + public Db_stmt Crt_bry(String k, byte[] v) {return Add_bry(Bool_.Y, k, v);} + 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, null, v);} + private Db_stmt Add_bry(boolean where, String k, byte[] v) { + try {Add(++val_idx, v);} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "byte[]", v.length);} + return this; + } + public Db_stmt Crt_bry_as_str(String k, byte[] v) {return Add_bry_as_str(Bool_.Y, k, v);} + public Db_stmt Val_bry_as_str(String k, byte[] v) {return Add_bry_as_str(Bool_.N, k, v);} + public Db_stmt Val_bry_as_str(byte[] v) {return Add_bry_as_str(Bool_.N, null, v);} + private Db_stmt Add_bry_as_str(boolean where, String k, byte[] v) {return Add_str(where, k, String_.new_utf8_(v));} + public Db_stmt Crt_str(String k, String v) {return Add_str(Bool_.Y, k, v);} + 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, null, v);} + private Db_stmt Add_str(boolean where, String k, String v) { + try {Add(++val_idx, v);} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "String", v);} + return this; + } + public Db_stmt Val_rdr_(gplx.ios.Io_stream_rdr v, long rdr_len) { + try { + Bry_bfr bfr = Bry_bfr.new_(); + gplx.ios.Io_stream_rdr_.Load_all_to_bfr(bfr, v); + Add(++val_idx, bfr.Xto_str_and_clear()); + } catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "rdr", v);} + return this; + } + public boolean Exec_insert() { + Mem_tbl tbl = engine.Tbls_get(qry.Base_table()); + return tbl.Insert(this) == 1; + } + public int Exec_update() { + Mem_tbl tbl = engine.Tbls_get(qry.Base_table()); + return tbl.Update(this); + } + public int Exec_delete() { + Mem_tbl tbl = engine.Tbls_get(qry.Base_table()); + return tbl.Delete(this); + } + public DataRdr Exec_select() {throw Err_.not_implemented_();} + public Db_rdr Exec_select_as_rdr() { + Mem_tbl tbl = engine.Tbls_get(qry.Base_table()); + return tbl.Select(this); + } + public Object Exec_select_val() { + try {Object rv = Db_qry_select.Rdr_to_val(this.Exec_select()); return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec select_val: tbl={0}", qry.Base_table());} + } + private void Add(int idx, Object v) {args.Add(v);} private ListAdp args = ListAdp_.new_(); +} diff --git a/140_dbs/src/gplx/dbs/engines/mems/Db_url__mem.java b/140_dbs/src/gplx/dbs/engines/mems/Db_url__mem.java new file mode 100644 index 000000000..7d8f5ef9b --- /dev/null +++ b/140_dbs/src/gplx/dbs/engines/mems/Db_url__mem.java @@ -0,0 +1,33 @@ +/* +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.mems; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; +public class Db_url__mem extends Db_url__base { + @Override public String Tid() {return Tid_const;} public static final String Tid_const = "mem"; + @Override public Db_url New_self(String raw, GfoMsg m) { + Db_url__mem rv = new Db_url__mem(); + rv.Ctor("", m.ReadStr("database"), raw, raw); + return rv; + } + public static Db_url new_(String database) { + return Db_url_.parse_(Bld_raw + ( "gplx_key", Tid_const + , "database", database + )); + } + public static final Db_url__mem I = new Db_url__mem(); Db_url__mem() {} +} diff --git a/140_dbs/src/gplx/dbs/engines/mems/Mem_itm.java b/140_dbs/src/gplx/dbs/engines/mems/Mem_itm.java new file mode 100644 index 000000000..6052b53f8 --- /dev/null +++ b/140_dbs/src/gplx/dbs/engines/mems/Mem_itm.java @@ -0,0 +1,29 @@ +/* +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.mems; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; +public class Mem_itm implements GfoInvkAble { + private final OrderedHash hash = OrderedHash_.new_(); + public Object Get_by(String key) {return hash.Fetch(key);} + public Object Get_at(int i) {return hash.FetchAt(i);} + public void Set_by(String key, Object val) {hash.AddReplace(key, val);} + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + Object rv = Get_by(k); + if (rv == null) return GfoInvkAble_.Rv_unhandled; + return rv; + } +} diff --git a/140_dbs/src/gplx/dbs/engines/mems/Mem_tbl.java b/140_dbs/src/gplx/dbs/engines/mems/Mem_tbl.java new file mode 100644 index 000000000..1cbc68267 --- /dev/null +++ b/140_dbs/src/gplx/dbs/engines/mems/Mem_tbl.java @@ -0,0 +1,91 @@ +/* +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.mems; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; +import gplx.criterias.*; +public class Mem_tbl { + private final ListAdp rows = ListAdp_.new_(); private final ListAdp where_rows = ListAdp_.new_(); + public int Insert(Db_stmt__mem stmt) { + Db_qry_insert qry = (Db_qry_insert)stmt.Qry(); + String[] cols = qry.Cols_for_insert(); int len = cols.length; + Mem_itm itm = new Mem_itm(); + for (int i = 0; i < len; ++i) + itm.Set_by(cols[i], stmt.Args_get_at(i)); + rows.Add(itm); + return 1; + } + public int Update(Db_stmt__mem stmt) { + Db_qry_update qry = (Db_qry_update)stmt.Qry(); + Select_rows_where(where_rows, stmt, qry.Cols_where()); + int where_rows_len = where_rows.Count(); + String[] update_cols = qry.Cols_update(); int update_cols_len = update_cols.length; + for (int i = 0; i < where_rows_len; ++i) { + Mem_itm itm = (Mem_itm)where_rows.FetchAt(i); + for (int j = 0; j < update_cols_len; ++j) + itm.Set_by(update_cols[j], stmt.Args_get_at(j)); + } + return where_rows_len; + } + public int Delete(Db_stmt__mem stmt) { + Db_qry_delete qry = (Db_qry_delete)stmt.Qry(); + Select_rows_where(where_rows, stmt, qry.Where_cols()); + int where_rows_len = where_rows.Count(); + for (int i = 0; i < where_rows_len; ++i) { + Mem_itm itm = (Mem_itm)where_rows.FetchAt(i); + rows.Del(itm); + } + return where_rows_len; + } + public Db_rdr Select(Db_stmt__mem stmt) { + Db_qry__select_in_tbl qry = (Db_qry__select_in_tbl)stmt.Qry(); + Select_rows_where(where_rows, stmt, qry.Where_flds()); + return new Db_rdr__mem(qry.Select_flds(), (Mem_itm[])where_rows.Xto_ary_and_clear(Mem_itm.class)); + } + private void Select_rows_where(ListAdp rv, Db_stmt__mem stmt, String[] where_cols) { + int where_len = where_cols.length; + KeyVal[] where_kvs = Bld_where_kvs(stmt, where_cols, where_len); + Bld_where_rows(where_rows, where_kvs, where_len); + } + private KeyVal[] Bld_where_kvs(Db_stmt__mem stmt, String[] keys, int keys_len) { + KeyVal[] rv = new KeyVal[keys_len]; + for (int i = 0; i < keys_len; ++i) + rv[i] = KeyVal_.new_(keys[i], stmt.Args_get_at(i)); + return rv; + } + private void Bld_where_rows(ListAdp rv, KeyVal[] where_kvs, int where_len) { + rv.Clear(); + int rows_len = rows.Count(); + for (int i = 0; i < rows_len; ++i) { + Mem_itm itm = (Mem_itm)rows.FetchAt(i); + for (int j = 0; j < where_len; ++j) { + KeyVal kv = where_kvs[j]; + Object itm_val = itm.Get_by(kv.Key()); + if (!Object_.Eq(itm_val, kv.Val())) break; + } + rv.Add(itm); + } + } +// private void Select_rows_where(ListAdp rv, Db_stmt__mem stmt, Criteria crt) { +// rv.Clear(); +// int rows_len = rows.Count(); +// for (int i = 0; i < rows_len; ++i) { +// Mem_itm itm = (Mem_itm)rows.FetchAt(i); +// if (crt.Matches(itm)) +// rv.Add(itm); +// } +// } +} diff --git a/140_dbs/src/gplx/dbs/sqls/Sql_dummy_class.java b/140_dbs/src/gplx/dbs/sqls/Sql_dummy_class.java new file mode 100644 index 000000000..0f2394edd --- /dev/null +++ b/140_dbs/src/gplx/dbs/sqls/Sql_dummy_class.java @@ -0,0 +1,19 @@ +/* +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.sqls; import gplx.*; import gplx.dbs.*; +public class Sql_dummy_class {} diff --git a/140_dbs/src_110_dbQry/gplx/dbs/Db_arg.java b/140_dbs/src_110_dbQry/gplx/dbs/Db_arg.java new file mode 100644 index 000000000..1e1e677f7 --- /dev/null +++ b/140_dbs/src_110_dbQry/gplx/dbs/Db_arg.java @@ -0,0 +1,24 @@ +/* +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_arg { + @gplx.Internal protected Db_arg(String key, Object val) {this.key = key; this.val = val;} + public String Key() {return key;} private String key; + public Object Val() {return val;} public void Val_(Object v) {this.val = v;} private Object val; + public byte Val_tid() {return val_tid;} public Db_arg Val_tid_(byte v) {val_tid = v; return this;} private byte val_tid = Db_val_type.Tid_null; +} diff --git a/140_dbs/src_110_dbQry/gplx/dbs/Db_qry.java b/140_dbs/src_110_dbQry/gplx/dbs/Db_qry.java index ef526fa6c..0b5e3150c 100644 --- a/140_dbs/src_110_dbQry/gplx/dbs/Db_qry.java +++ b/140_dbs/src_110_dbQry/gplx/dbs/Db_qry.java @@ -17,8 +17,8 @@ along with this program. If not, see . */ package gplx.dbs; import gplx.*; public interface Db_qry { - int Tid(); - String KeyOfDb_qry(); - boolean ExecRdrAble(); - String XtoSql(); + int Tid(); + boolean Exec_is_rdr(); + String Base_table(); + String Xto_sql(); } diff --git a/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_.java b/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_.java index 55cbc0f9e..bbc2aa60e 100644 --- a/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_.java +++ b/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_.java @@ -22,11 +22,11 @@ public class Db_qry_ { public static Db_qry_select select_val_(String tbl, String col, Criteria crt) {return select_().From_(tbl).Where_(crt).Cols_(col);} public static Db_qry_select select_tbl_(String tbl) {return select_().From_(tbl);} public static Db_qry_select select_() {return Db_qry_select.new_();} - public static Db_qry_delete delete_(String tbl, Criteria crt) {return Db_qry_delete.new_().BaseTable_(tbl).Where_(crt);} - public static Db_qry_delete delete_tbl_(String tbl) {return Db_qry_delete.new_().BaseTable_(tbl);} - public static Db_qry_insert insert_(String tbl) {return Db_qry_insert.new_().BaseTable_(tbl);} + public static Db_qry_delete delete_(String tbl, Criteria crt) {return Db_qry_delete.new_(tbl, crt);} + public static Db_qry_delete delete_tbl_(String tbl) {return Db_qry_delete.new_(tbl);} + public static Db_qry_insert insert_(String tbl) {return new Db_qry_insert(tbl);} public static Db_qry_insert insert_common_(String tbl, KeyVal... pairs) { - Db_qry_insert cmd = Db_qry_insert.new_().BaseTable_(tbl); + Db_qry_insert cmd = new Db_qry_insert(tbl); for (KeyVal pair : pairs) cmd.Arg_obj_(pair.Key(), pair.Val()); return cmd; @@ -47,14 +47,5 @@ public class Db_qry_ { } public static final Object WhereAll = null; public static Db_qry as_(Object obj) {return obj instanceof Db_qry ? (Db_qry)obj : null;} - public static final int Tid_basic = 0, Tid_select_in_tbl = 1; -} -interface Db_qryWkr { - Object Exec(Db_engine engine, Db_qry cmd); -} -class Db_qryWkr_ { - public static final Db_qryWkr Null = new Db_qryWrk_null(); -} -class Db_qryWrk_null implements Db_qryWkr { - public Object Exec(Db_engine engine, Db_qry cmd) {return null;} + public static final int Tid_insert = 0, Tid_delete = 1, Tid_update = 2, Tid_select = 3, Tid_sql = 4, Tid_select_in_tbl = 5, Tid_flush = 6; } diff --git a/140_dbs/src_110_dbQry/gplx/dbs/Db_qry__select_in_tbl.java b/140_dbs/src_110_dbQry/gplx/dbs/Db_qry__select_in_tbl.java index 8f7f76c53..9634ec8d2 100644 --- a/140_dbs/src_110_dbQry/gplx/dbs/Db_qry__select_in_tbl.java +++ b/140_dbs/src_110_dbQry/gplx/dbs/Db_qry__select_in_tbl.java @@ -20,8 +20,10 @@ public class Db_qry__select_in_tbl implements Db_qry { public Db_qry__select_in_tbl(String tbl_name, String[] select_flds, String[] where_flds, String group_by_sql, String having_sql, String order_by_sql, String limit_sql) { this.tbl_name = tbl_name; this.select_flds = select_flds; this.where_flds = where_flds; this.group_by_sql = group_by_sql; this.having_sql = having_sql; this.order_by_sql = order_by_sql; this.limit_sql = limit_sql; } - public int Tid() {return Db_qry_.Tid_select_in_tbl;} - public String Tbl_name() {return tbl_name;} private final String tbl_name; + public int Tid() {return Db_qry_.Tid_select_in_tbl;} + public boolean Exec_is_rdr() {return true;} + public String Base_table() {return tbl_name;} private final String tbl_name; + public String From() {return tbl_name;} public String[] Select_flds() {return select_flds;} private final String[] select_flds; public String[] Where_flds() {return where_flds;} private final String[] where_flds; public void Where_sql(String_bldr sb) { @@ -37,9 +39,6 @@ public class Db_qry__select_in_tbl implements Db_qry { public String Having_sql() {return having_sql;} private final String having_sql; public String Order_by_sql() {return order_by_sql;} public Db_qry__select_in_tbl Order_by_sql_(String v) {order_by_sql = v; return this;} private String order_by_sql; public String Limit_sql() {return limit_sql;} private final String limit_sql; - public static Db_qry__select_in_tbl new_(String tbl_name, String[] where_flds, String[] select_flds) {return new Db_qry__select_in_tbl(tbl_name, select_flds, where_flds, null, null, null, null);} - public String KeyOfDb_qry() {return "select_in_tbl";} - public boolean ExecRdrAble() {return true;} public String XtoSql() {return Xto_sql();} public String Xto_sql() { String_bldr sb = String_bldr_.new_(); @@ -57,5 +56,9 @@ public class Db_qry__select_in_tbl implements Db_qry { if (limit_sql != null) sb.Add(limit_sql); return sb.XtoStr(); } + public static Db_qry__select_in_tbl new_(String tbl_name, String[] where_flds, String[] select_flds) { + Db_qry__select_in_tbl rv = new Db_qry__select_in_tbl(tbl_name, select_flds, where_flds, null, null, null, null); + return rv; + } public static final String[] Where_flds__all = null; } diff --git a/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_arg_owner.java b/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_arg_owner.java index bac9b672d..bdd23619f 100644 --- a/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_arg_owner.java +++ b/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_arg_owner.java @@ -18,7 +18,6 @@ along with this program. If not, see . package gplx.dbs; import gplx.*; public interface Db_qry_arg_owner extends Db_qry { Db_qry_arg_owner From_(String tbl); - Db_qry_arg_owner Key_arg_(String k, int v); Db_qry_arg_owner Key_arg_(String k, String v); Db_qry_arg_owner Arg_(String k, int v); @@ -32,9 +31,3 @@ public interface Db_qry_arg_owner extends Db_qry { Db_qry_arg_owner Arg_obj_(String key, Object val); Db_qry_arg_owner Arg_obj_type_(String key, Object val, byte val_tid); } -class Db_arg { - public String Key() {return key;} private String key; - public Object Val() {return val;} public Db_arg Val_(Object v) {val = v; return this;} Object val; - public byte Val_tid() {return val_tid;} public Db_arg Val_tid_(byte v) {val_tid = v; return this;} private byte val_tid = Db_val_type.Tid_null; - @gplx.Internal protected Db_arg(String key, Object val) {this.key = key; this.val = val;} -} diff --git a/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_delete.java b/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_delete.java index 6bdefeb9e..c30f95285 100644 --- a/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_delete.java +++ b/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_delete.java @@ -16,24 +16,26 @@ 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.criterias.*; -public class Db_qry_delete implements Db_qry { - public int Tid() {return Db_qry_.Tid_basic;} - public String KeyOfDb_qry() {return KeyConst;} public static final String KeyConst = "DELETE"; - public boolean ExecRdrAble() {return false;} - public String XtoSql() {return Sql_cmd_wtr_.Ansi.XtoSqlQry(this, false);} - public int Exec_qry(Db_provider provider) {return provider.Exec_qry(this);} - public Db_qry_delete Where_add_(String key, int val) { - Criteria crt = Db_crt_.eq_(key, val); - where = Sql_where.merge_or_new_(where, crt); - return this; - } - @gplx.Internal protected String BaseTable() {return baseTable;} public Db_qry_delete BaseTable_(String baseTable_) {baseTable = baseTable_; return this;} private String baseTable; - @gplx.Internal protected Sql_where Where() {return where;} public Db_qry_delete Where_(Criteria crt) {where = Sql_where.new_(crt); return this;} Sql_where where; - public static Db_qry_delete new_() {return new Db_qry_delete();} Db_qry_delete() {} +import gplx.criterias.*; import gplx.dbs.sqls.*; +public class Db_qry_delete implements Db_qry { + Db_qry_delete(String base_table, Criteria where) {this.base_table = base_table; this.where = where;} + public int Tid() {return Db_qry_.Tid_delete;} + public boolean Exec_is_rdr() {return false;} + public String Base_table() {return base_table;} private final String base_table; + public String Xto_sql() {return Sql_qry_wtr_.I.Xto_str(this, false);} + public Criteria Where() {return where;} private final Criteria where; + public int Exec_qry(Db_conn conn) {return conn.Exec_qry(this);} + + public String[] Where_cols() {return where_cols;} private String[] where_cols; public static Db_qry_delete new_all_(String tbl) { - Db_qry_delete rv = new Db_qry_delete(); - rv.baseTable = tbl; + Db_qry_delete rv = new_(tbl, Criteria_.All); + rv.where_cols = String_.Ary_empty; return rv; } + public static Db_qry_delete new_(String tbl, String... where) { + Db_qry_delete rv = Db_qry_delete.new_(tbl, Db_crt_.eq_many_(where)); + rv.where_cols = where; + return rv; + } + public static Db_qry_delete new_(String tbl, Criteria where) {return new Db_qry_delete(tbl, where);} } diff --git a/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_dml_tst.java b/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_dml_tst.java index 8735b349d..219305eed 100644 --- a/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_dml_tst.java +++ b/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_dml_tst.java @@ -20,11 +20,11 @@ import org.junit.*; import gplx.criterias.*; public class Db_qry_dml_tst { @Test public void Delete_basic() { - tst_XtoSql(Db_qry_delete.new_().BaseTable_("tbl0").Where_(Db_crt_.eq_("fld0", "val0")) + tst_XtoSql(Db_qry_delete.new_("tbl0", Db_crt_.eq_("fld0", "val0")) , "DELETE FROM tbl0 WHERE fld0='val0'"); } @Test public void Insert_basic() { - tst_XtoSql(Db_qry_insert.new_().BaseTable_("tbl0").Arg_("id", 0).Arg_("name", "me").Arg_("time", DateAdp_.parse_gplx("2007-12-23")) + tst_XtoSql(new Db_qry_insert("tbl0").Arg_("id", 0).Arg_("name", "me").Arg_("time", DateAdp_.parse_gplx("2007-12-23")) , "INSERT INTO tbl0 (id, name, time) VALUES (0, 'me', '2007-12-23 00:00:00.000')"); } @Test public void Update_basic() { @@ -40,5 +40,5 @@ public class Db_qry_dml_tst { qry.Where_(Criteria_.And(Db_crt_.eq_("id", 0), Db_crt_.mt_("startTime", DateAdp_.parse_gplx("2005-01-01")))); tst_XtoSql(qry, "UPDATE tbl0 SET id=1, name='me', startTime='2007-12-23 00:00:00.000' WHERE (id=0 AND startTime>'2005-01-01 00:00:00.000')"); } - void tst_XtoSql(Db_qry qry, String expd) {Tfds.Eq(expd, qry.XtoSql());} + void tst_XtoSql(Db_qry qry, String expd) {Tfds.Eq(expd, qry.Xto_sql());} } diff --git a/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_flush.java b/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_flush.java index 307faf9f8..0d4771b17 100644 --- a/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_flush.java +++ b/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_flush.java @@ -16,14 +16,16 @@ 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_qry_flush implements Db_qry { - public int Tid() {return Db_qry_.Tid_basic;} - public String KeyOfDb_qry() {return KeyConst;} public static final String KeyConst = "FLUSH"; - public boolean ExecRdrAble() {return false;} - public int Exec_qry(Db_provider provider) {return provider.Exec_qry(this);} - public String XtoSql() {return Sql_cmd_wtr_.Ansi.XtoSqlQry(this, false);} + public int Tid() {return Db_qry_.Tid_flush;} + public boolean Exec_is_rdr() {return false;} + public String Base_table() {return tableNames[0];} + public String Xto_sql() {return Sql_qry_wtr_.I.Xto_str(this, false);} + public int Exec_qry(Db_conn conn) {return conn.Exec_qry(this);} @gplx.Internal protected String[] TableNames() {return tableNames;} private String[] tableNames; + public static Db_qry_flush as_(Object obj) {return obj instanceof Db_qry_flush ? (Db_qry_flush)obj : null;} public static Db_qry_flush cast_(Object obj) {try {return (Db_qry_flush)obj;} catch(Exception exc) {throw Err_.type_mismatch_exc_(exc, Db_qry_flush.class, obj);}} diff --git a/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_insert.java b/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_insert.java index 2218460c3..7a1a83884 100644 --- a/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_insert.java +++ b/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_insert.java @@ -16,13 +16,15 @@ 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_qry_insert implements Db_qry_arg_owner { - public int Tid() {return Db_qry_.Tid_basic;} - public String KeyOfDb_qry() {return KeyConst;} public static final String KeyConst = "INSERT"; - public boolean ExecRdrAble() {return false;} - public String XtoSql() {return Sql_cmd_wtr_.Ansi.XtoSqlQry(this, false);} - public int Exec_qry(Db_provider provider) {return provider.Exec_qry(this);} - public Db_qry_arg_owner From_(String tbl) {baseTable = tbl; return this;} + public Db_qry_insert(String base_table) {this.base_table = base_table;} + public int Tid() {return Db_qry_.Tid_insert;} + public boolean Exec_is_rdr() {return false;} + public String Base_table() {return base_table;} private String base_table; + public String Xto_sql() {return Sql_qry_wtr_.I.Xto_str(this, false);} + public int Exec_qry(Db_conn conn) {return conn.Exec_qry(this);} + public Db_qry_arg_owner From_(String tbl) {base_table = tbl; return this;} public Db_qry_arg_owner Arg_(String k, DecimalAdp v) {return Arg_obj_type_(k, v.Xto_decimal(), Db_val_type.Tid_decimal);} public Db_qry_arg_owner Arg_(String k, DateAdp v) {return Arg_obj_type_(k, v, Db_val_type.Tid_date);} public Db_qry_arg_owner Arg_byte_(String k, byte v) {return Arg_obj_type_(k, v, Db_val_type.Tid_byte);} @@ -47,9 +49,18 @@ public class Db_qry_insert implements Db_qry_arg_owner { cols.Add(Sql_select_fld_fld.new_(Sql_select_fld_base.Tbl_null, fld, fld)); return this; } - @gplx.Internal protected String BaseTable() {return baseTable;} public Db_qry_insert BaseTable_(String val) {baseTable = val; return this;} private String baseTable; - @gplx.Internal protected KeyValHash Args() {return args;} KeyValHash args = KeyValHash.new_(); - @gplx.Internal protected Sql_select_fld_list Cols() {return cols;} Sql_select_fld_list cols; + public KeyValHash Args() {return args;} private final KeyValHash args = KeyValHash.new_(); + @gplx.Internal protected Sql_select_fld_list Cols() {return cols;} private Sql_select_fld_list cols; + public String[] Cols_for_insert() {return cols_for_insert;} private String[] cols_for_insert; public static Db_qry_insert new_() {return new Db_qry_insert();} Db_qry_insert() {} + public static Db_qry_insert new_(String tbl, String... keys) { + Db_qry_insert rv = Db_qry_insert.new_(); + rv.base_table = tbl; + rv.cols_for_insert = keys; + int len = keys.length; + for (int i = 0; i < len; ++i) + rv.Arg_obj_(keys[i], null); + return rv; + } } diff --git a/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_select.java b/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_select.java index 0d9d9f6db..0e1280c60 100644 --- a/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_select.java +++ b/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_select.java @@ -16,18 +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.*; -import gplx.criterias.*; +import gplx.criterias.*; import gplx.dbs.sqls.*; public class Db_qry_select implements Db_qry { - public int Tid() {return Db_qry_.Tid_basic;} - public String KeyOfDb_qry() {return KeyConst;} public static final String KeyConst = "SELECT"; - public boolean ExecRdrAble() {return true;} - public DataRdr Exec_qry_as_rdr(Db_provider provider) {return provider.Exec_qry_as_rdr(this);} - public GfoNde ExecRdr_nde(Db_provider provider) { + public int Tid() {return Db_qry_.Tid_select;} + public boolean Exec_is_rdr() {return true;} + public String Base_table() {return from.BaseTable().TblName();} + public String Xto_sql() {return Sql_qry_wtr_.I.Xto_str(this, false);} + public DataRdr Exec_qry_as_rdr(Db_conn conn) {return conn.Exec_qry_as_rdr(this);} + public GfoNde ExecRdr_nde(Db_conn conn) { DataRdr rdr = DataRdr_.Null; - try {return GfoNde_.rdr_(Exec_qry_as_rdr(provider));} finally {rdr.Rls();} + try {return GfoNde_.rdr_(Exec_qry_as_rdr(conn));} finally {rdr.Rls();} } - public Object ExecRdr_val(Db_provider provider) { - DataRdr rdr = Exec_qry_as_rdr(provider); + public Object ExecRdr_val(Db_conn conn) { + DataRdr rdr = Exec_qry_as_rdr(conn); try { Object rv = null; if (rdr.MoveNextPeer()) { @@ -46,7 +47,6 @@ public class Db_qry_select implements Db_qry { } finally {rdr.Rls();} } - public String XtoSql() {return Sql_cmd_wtr_.Ansi.XtoSqlQry(this, false);} @gplx.Internal protected Sql_from From() {return from;} Sql_from from; public Db_qry_select From_(String tblName) {return From_(tblName, null);} diff --git a/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_select_tst.java b/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_select_tst.java index c903cd082..51098886d 100644 --- a/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_select_tst.java +++ b/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_select_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.dbs; import gplx.*; -import org.junit.*; +import org.junit.*; import gplx.dbs.sqls.*; public class Db_qry_select_tst { @Before public void setup() { cmd = Db_qry_select.new_(); @@ -85,5 +85,5 @@ public class Db_qry_select_tst { // expd = "SELECT fld0, fld1 FROM tbl0 GROUP BY fld0, fld1 HAVING Count(fld0) > 1"; // Tfds.Eq(cmd.XtoStr(), expd); // } - void tst_XtoStr(Db_qry qry, String expd) {Tfds.Eq(expd, cmd.XtoSql());} + void tst_XtoStr(Db_qry qry, String expd) {Tfds.Eq(expd, cmd.Xto_sql());} } diff --git a/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_sql.java b/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_sql.java index b266a404b..93b19acdd 100644 --- a/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_sql.java +++ b/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_sql.java @@ -16,12 +16,13 @@ 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_qry_sql implements Db_qry { - public int Tid() {return Db_qry_.Tid_basic;} - public String KeyOfDb_qry() {return KeyConst;} public static final String KeyConst = "SQL"; - public boolean ExecRdrAble() {return isReader;} private boolean isReader; - public int Exec_qry(Db_provider provider) {return provider.Exec_qry(this);} - public String XtoSql() {return sql;} private String sql; + public int Tid() {return Db_qry_.Tid_sql;} + public boolean Exec_is_rdr() {return isReader;} private boolean isReader; + public String Base_table() {throw Err_.not_implemented_();} + public String Xto_sql() {return sql;} private String sql; + public int Exec_qry(Db_conn conn) {return conn.Exec_qry(this);} public static Db_qry_sql dml_(String sql) {return sql_(sql);} public static Db_qry_sql ddl_(String sql) {return sql_(sql);} public static Db_qry_sql xtn_(String sql) {return sql_(sql);} @@ -37,4 +38,45 @@ public class Db_qry_sql implements Db_qry { } public static Db_qry_sql as_(Object obj) {return obj instanceof Db_qry_sql ? (Db_qry_sql)obj : null;} public static Db_qry_sql cast_(Object obj) {try {return (Db_qry_sql)obj;} catch(Exception exc) {throw Err_.type_mismatch_exc_(exc, Db_qry_sql.class, obj);}} + public static String Gen_sql(Db_qry qry, Object... args) { + byte[] src = Bry_.new_utf8_(Sql_qry_wtr_.Gen_placeholder_parameters(qry)); + int src_len = src.length; + int args_idx = 0, args_len = args.length, pos = 0; + Bry_bfr bfr = Bry_bfr.new_(src_len); + while (pos < src_len) { + int question_pos = Bry_finder.Find_fwd(src, Byte_ascii.Question, pos); + if (question_pos == Bry_.NotFound) + question_pos = src_len; + bfr.Add_mid(src, pos, question_pos); + if (args_idx < args_len) + Gen_sql_arg(bfr, args[args_idx++]); + pos = question_pos + 1; + } + return bfr.Xto_str_and_clear(); + } + private static void Gen_sql_arg(Bry_bfr bfr, Object val) { + if (val == null) {bfr.Add(Bry_null); return;} + Class val_type = val.getClass(); + if (ClassAdp_.Eq(val_type, Int_.Cls_ref_type)) + bfr.Add_int_variable(Int_.cast_(val)); + else if (ClassAdp_.Eq(val_type, Bool_.Cls_ref_type)) + bfr.Add_int_fixed(1, Bool_.Xto_int(Bool_.cast_(val))); // NOTE: save boolean to 0 or 1, b/c (a) db may not support bit datatype (sqllite) and (b) avoid i18n issues with "true"/"false" + else if (ClassAdp_.Eq(val_type, Double_.Cls_ref_type)) + bfr.Add_double(Double_.cast_(val)); + else if (ClassAdp_.Eq(val_type, Long_.Cls_ref_type)) + bfr.Add_long_variable(Long_.cast_(val)); + else if (ClassAdp_.Eq(val_type, Float_.Cls_ref_type)) + bfr.Add_float(Float_.cast_(val)); + else if (ClassAdp_.Eq(val_type, Byte_.Cls_ref_type)) + bfr.Add_byte(Byte_.cast_(val)); + else if (ClassAdp_.Eq(val_type, DateAdp_.Cls_ref_type)) + bfr.Add_byte_apos().Add_str(DateAdp_.cast_(val).XtoStr_gplx_long()).Add_byte_apos(); + else if (ClassAdp_.Eq(val_type, DecimalAdp_.Cls_ref_type)) + bfr.Add_str(DecimalAdp_.cast_(val).Xto_str()); + else { + byte[] val_bry = Bry_.new_utf8_(Object_.Xto_str_strict_or_null(val)); + val_bry = Bry_.Replace(val_bry, Byte_ascii.Apos_bry, Bry_escape_apos); + bfr.Add_byte_apos().Add(val_bry).Add_byte_apos(); + } + } private static final byte[] Bry_null = Bry_.new_utf8_("NULL"), Bry_escape_apos = Bry_.new_ascii_("''"); } diff --git a/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_sql_tst.java b/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_sql_tst.java new file mode 100644 index 000000000..6fb69ef54 --- /dev/null +++ b/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_sql_tst.java @@ -0,0 +1,47 @@ +/* +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 org.junit.*; +public class Db_qry_sql_tst { + @Before public void init() {fxt.Clear();} private Db_qry_sql_fxt fxt = new Db_qry_sql_fxt(); + @Test public void Insert() { + fxt.Test_qry + ( Db_qry_insert.new_("tbl", "k1", "k2", "k3", "k4", "k5", "k6", "k7", "k8", "k9") + , Object_.Ary(123, Bool_.Y, 1.23d, 123L, 123f, Byte_ascii.Num_1, "123", DateAdp_.parse_iso8561("1981-04-05T14:30:30"), DecimalAdp_.parse_("1.23")) + , "INSERT INTO tbl (k1, k2, k3, k4, k5, k6, k7, k8, k9) VALUES (123, 1, 1.23, 123, 123, 1, '123', '1981-04-05 14:30:30.000', 1.23)" + ); + } + @Test public void Update() { + fxt.Test_qry + ( Db_qry_update.new_("tbl", String_.Ary("k1", "k2"), "k3", "k4") + , Object_.Ary("v3", "v4", "v1", "v2") + , "UPDATE tbl SET k3='v3', k4='v4' WHERE (k1='v1' AND k2='v2')" + ); + } + @Test public void Delete() { + fxt.Test_qry + ( Db_qry_delete.new_("tbl", String_.Ary("k1", "k2")) + , Object_.Ary("v1", "v2") + , "DELETE FROM tbl WHERE (k1='v1' AND k2='v2')" + ); + } +} +class Db_qry_sql_fxt { + public void Clear() {} + public void Test_qry(Db_qry qry, Object[] vals, String expd) {Tfds.Eq(expd, Db_qry_sql.Gen_sql(qry, vals));} +} diff --git a/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_update.java b/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_update.java index e6dc51299..901c3c2f3 100644 --- a/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_update.java +++ b/140_dbs/src_110_dbQry/gplx/dbs/Db_qry_update.java @@ -16,14 +16,13 @@ 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.criterias.*; +import gplx.criterias.*; import gplx.dbs.sqls.*; public class Db_qry_update implements Db_qry_arg_owner { - public int Tid() {return Db_qry_.Tid_basic;} - public String KeyOfDb_qry() {return KeyConst;} public static final String KeyConst = "UPDATE"; - public boolean ExecRdrAble() {return false;} - public int Exec_qry(Db_provider provider) {return provider.Exec_qry(this);} - public String XtoSql() {return Sql_cmd_wtr_.Ansi.XtoSqlQry(this, false);} - + public int Tid() {return Db_qry_.Tid_update;} + public boolean Exec_is_rdr() {return false;} + public String Base_table() {return baseTable;} + public String Xto_sql() {return Sql_qry_wtr_.I.Xto_str(this, false);} + public int Exec_qry(Db_conn conn) {return conn.Exec_qry(this);} public Db_qry_arg_owner From_(String tbl) {baseTable = tbl; return this;} public Db_qry_arg_owner Arg_(String k, DecimalAdp v) {return Arg_obj_type_(k, v.Xto_decimal(), Db_val_type.Tid_decimal);} public Db_qry_arg_owner Arg_(String k, DateAdp v) {return Arg_obj_type_(k, v, Db_val_type.Tid_date);} @@ -46,9 +45,19 @@ public class Db_qry_update implements Db_qry_arg_owner { where = Sql_where.merge_or_new_(where, crt); return this; } + public KeyValHash Args() {return args;} private final KeyValHash args = KeyValHash.new_(); @gplx.Internal protected String BaseTable() {return baseTable;} private String baseTable; - @gplx.Internal protected KeyValHash Args() {return args;} final KeyValHash args = KeyValHash.new_(); - @gplx.Internal protected Sql_where Where() {return where;} public Db_qry_update Where_(Criteria crt) {where = Sql_where.new_(crt); return this;} Sql_where where; - + @gplx.Internal protected Sql_where Where() {return where;} public Db_qry_update Where_(Criteria crt) {where = Sql_where.new_(crt); return this;} private Sql_where where; + public String[] Cols_where() {return cols_where;} private String[] cols_where; + public String[] Cols_update() {return cols_update;} private String[] cols_update; public static Db_qry_update new_() {return new Db_qry_update();} Db_qry_update() {} + public static Db_qry_update new_(String tbl, String[] where, String... update) { + Db_qry_update rv = Db_qry_.update_(tbl, Db_crt_.eq_many_(where)); + rv.cols_update = update; + rv.cols_where = where; + int len = update.length; + for (int i = 0; i < len; i++) + rv.Arg_obj_(update[i], null); + return rv; + } } diff --git a/140_dbs/src_110_dbQry/gplx/dbs/Db_stmt.java b/140_dbs/src_110_dbQry/gplx/dbs/Db_stmt.java index a6f72aad9..0b842e39a 100644 --- a/140_dbs/src_110_dbQry/gplx/dbs/Db_stmt.java +++ b/140_dbs/src_110_dbQry/gplx/dbs/Db_stmt.java @@ -17,19 +17,36 @@ along with this program. If not, see . */ package gplx.dbs; import gplx.*; public interface Db_stmt extends RlsAble { - Db_provider Provider(); - Db_stmt Val_bool_(boolean v); - Db_stmt Val_byte_(byte v); - Db_stmt Val_byte_by_bool_(boolean v); - Db_stmt Val_int_(int v); - Db_stmt Val_long_(long v); - Db_stmt Val_float_(float v); - Db_stmt Val_double_(double v); - Db_stmt Val_decimal_(DecimalAdp v); - Db_stmt Val_bry_(byte[] v); - Db_stmt Val_bry_by_str_(String v); - Db_stmt Val_str_by_bry_(byte[] v); - Db_stmt Val_str_(String v); + Db_stmt Crt_bool_as_byte(String k, boolean v); + Db_stmt Val_bool_as_byte(String k, boolean v); + Db_stmt Val_bool_as_byte(boolean v); + Db_stmt Crt_byte(String k, byte v); + Db_stmt Val_byte(String k, byte v); + Db_stmt Val_byte(byte v); + Db_stmt Crt_int(String k, int v); + Db_stmt Val_int(String k, int v); + Db_stmt Val_int(int v); + Db_stmt Crt_long(String k, long v); + Db_stmt Val_long(String k, long v); + Db_stmt Val_long(long v); + Db_stmt Crt_float(String k, float v); + Db_stmt Val_float(String k, float v); + Db_stmt Val_float(float v); + Db_stmt Crt_double(String k, double v); + Db_stmt Val_double(String k, double v); + Db_stmt Val_double(double v); + Db_stmt Crt_decimal(String k, DecimalAdp v); + Db_stmt Val_decimal(String k, DecimalAdp v); + Db_stmt Val_decimal(DecimalAdp v); + Db_stmt Crt_bry(String k, byte[] v); + Db_stmt Val_bry(String k, byte[] v); + Db_stmt Val_bry(byte[] v); + Db_stmt Crt_str(String k, String v); + Db_stmt Val_str(String k, String v); + Db_stmt Val_str(String v); + Db_stmt Crt_bry_as_str(String k, byte[] v); + Db_stmt Val_bry_as_str(String k, byte[] v); + Db_stmt Val_bry_as_str(byte[] v); Db_stmt Val_rdr_(gplx.ios.Io_stream_rdr rdr, long rdr_len); boolean Exec_insert(); int Exec_update(); @@ -38,5 +55,5 @@ public interface Db_stmt extends RlsAble { Db_rdr Exec_select_as_rdr(); Object Exec_select_val(); Db_stmt Clear(); - Db_stmt New(); + Db_stmt Reset_stmt(); } diff --git a/140_dbs/src_110_dbQry/gplx/dbs/Db_stmt_.java b/140_dbs/src_110_dbQry/gplx/dbs/Db_stmt_.java index 03d893904..04a126b81 100644 --- a/140_dbs/src_110_dbQry/gplx/dbs/Db_stmt_.java +++ b/140_dbs/src_110_dbQry/gplx/dbs/Db_stmt_.java @@ -18,39 +18,40 @@ along with this program. If not, see . package gplx.dbs; import gplx.*; public class Db_stmt_ { public static final Db_stmt Null = new Db_stmt_sql(); - public static Db_stmt new_insert_(Db_provider provider, String tbl, String... flds) { - Db_qry_insert qry = Db_qry_insert.new_().BaseTable_(tbl); - int len = flds.length; - for (int i = 0; i < len; i++) - qry.Arg_obj_(flds[i], null); - return provider.Prepare(qry); + public static Db_stmt new_insert_(Db_conn conn, String tbl, String... flds) { + Db_qry qry = Db_qry_insert.new_(tbl, flds); + return conn.New_stmt(qry); } - public static Db_stmt new_update_(Db_provider provider, String tbl, String[] where, String... flds) { - Db_qry_update qry = Db_qry_.update_(tbl, Db_crt_.eq_many_(where)); - int len = flds.length; - for (int i = 0; i < len; i++) - qry.Arg_obj_(flds[i], null); - return provider.Prepare(qry); + public static Db_stmt new_update_(Db_conn conn, String tbl, String[] where, String... flds) { + Db_qry qry = Db_qry_update.new_(tbl, where, flds); + return conn.New_stmt(qry); } - public static Db_stmt new_delete_(Db_provider provider, String tbl, String... where) { + public static Db_stmt new_delete_(Db_conn conn, String tbl, String... where) { Db_qry_delete qry = Db_qry_.delete_(tbl, Db_crt_.eq_many_(where)); - return provider.Prepare(qry); + return conn.New_stmt(qry); } - public static Db_stmt new_select_(Db_provider provider, String tbl, String[] where, String... flds) { + public static Db_stmt new_select_(Db_conn conn, String tbl, String[] where, String... flds) { Db_qry_select qry = Db_qry_.select_cols_(tbl, Db_crt_.eq_many_(where), flds); - return provider.Prepare(qry); + return conn.New_stmt(qry); } - public static Db_stmt new_select_in_(Db_provider provider, String tbl, String in_fld, Object[] in_vals, String... flds) { + public static Db_stmt new_select_in_(Db_conn conn, String tbl, String in_fld, Object[] in_vals, String... flds) { Db_qry_select qry = Db_qry_.select_cols_(tbl, Db_crt_.in_(in_fld, in_vals), flds).OrderBy_asc_(in_fld); - return provider.Prepare(qry); + return conn.New_stmt(qry); } - public static Db_stmt new_select_all_(Db_provider provider, String tbl) { - return provider.Prepare(Db_qry_.select_tbl_(tbl)); + public static Db_stmt new_select_all_(Db_conn conn, String tbl) { + return conn.New_stmt(Db_qry_.select_tbl_(tbl)); } - public static Db_stmt new_select_as_rdr(Db_provider provider, Db_qry__select_in_tbl qry) { - return provider.Prepare(qry); + public static Db_stmt new_select_as_rdr(Db_conn conn, Db_qry__select_in_tbl qry) { + return conn.New_stmt(qry); } - public static Db_stmt new_select_as_rdr(Db_provider provider, String sql) { - return provider.Prepare(Db_qry_sql.rdr_(sql)); + public static Db_stmt new_select_as_rdr(Db_conn conn, String sql) { + return conn.New_stmt(Db_qry_sql.rdr_(sql)); } + public static Err err_(Exception e, Db_stmt stmt, String proc) { + throw Err_.err_(e, String_.Format("db stmt failed: proc=~{0} err=~{1}", proc, Err_.Message_gplx_brief(e))); + } + public static Err err_(Exception e, String tbl, String proc) { + throw Err_.err_(e, String_.Format("db call failed: tbl=~{0} proc=~{1} err=~{2}", tbl, proc, Err_.Message_gplx_brief(e))); + } + public static Db_stmt Rls(Db_stmt v) {if (v != null) v.Rls(); return null;} } diff --git a/140_dbs/src_110_dbQry/gplx/dbs/Db_stmt_bldr.java b/140_dbs/src_110_dbQry/gplx/dbs/Db_stmt_bldr.java index 6b1562a64..3cdaeafb2 100644 --- a/140_dbs/src_110_dbQry/gplx/dbs/Db_stmt_bldr.java +++ b/140_dbs/src_110_dbQry/gplx/dbs/Db_stmt_bldr.java @@ -17,32 +17,32 @@ along with this program. If not, see . */ package gplx.dbs; import gplx.*; public class Db_stmt_bldr implements RlsAble { - private Db_provider provider; + private Db_conn conn; private Db_stmt create, update, delete; private String tbl_name; private String[] flds_keys, flds_vals, flds_all; public Db_stmt_bldr(String tbl_name, String[] flds_keys, String... flds_vals) { this.tbl_name = tbl_name; this.flds_keys = flds_keys; this.flds_vals = flds_vals; flds_all = String_.Ary_add(flds_keys, flds_vals); } - public Db_stmt_bldr Init(Db_provider v) { - this.provider = v; - provider.Txn_mgr().Txn_bgn_if_none(); + public Db_stmt_bldr Init(Db_conn v) { + this.conn = v; + conn.Txn_mgr().Txn_bgn_if_none(); return this; } public Db_stmt Get(byte cmd_mode) { switch (cmd_mode) { - case Db_cmd_mode.Create: if (create == null) create = Db_stmt_.new_insert_(provider, tbl_name, flds_all); return create; - case Db_cmd_mode.Update: if (update == null) update = Db_stmt_.new_update_(provider, tbl_name, flds_keys, flds_vals); return update; - case Db_cmd_mode.Delete: if (delete == null) delete = Db_stmt_.new_delete_(provider, tbl_name, flds_keys); return delete; + case Db_cmd_mode.Create: if (create == null) create = Db_stmt_.new_insert_(conn, tbl_name, flds_all); return create; + case Db_cmd_mode.Update: if (update == null) update = Db_stmt_.new_update_(conn, tbl_name, flds_keys, flds_vals); return update; + case Db_cmd_mode.Delete: if (delete == null) delete = Db_stmt_.new_delete_(conn, tbl_name, flds_keys); return delete; case Db_cmd_mode.Ignore: return Db_stmt_.Null; default: throw Err_.unhandled(cmd_mode); } } public void Commit() { - provider.Txn_mgr().Txn_end_all(); + conn.Txn_mgr().Txn_end_all(); } public void Rls() { - provider = null; + conn = null; create = Rls(create); update = Rls(update); delete = Rls(delete); diff --git a/140_dbs/src_110_dbQry/gplx/dbs/Db_stmt_cmd.java b/140_dbs/src_110_dbQry/gplx/dbs/Db_stmt_cmd.java index d0a92e28d..4754137a7 100644 --- a/140_dbs/src_110_dbQry/gplx/dbs/Db_stmt_cmd.java +++ b/140_dbs/src_110_dbQry/gplx/dbs/Db_stmt_cmd.java @@ -17,57 +17,81 @@ along with this program. If not, see . */ package gplx.dbs; import gplx.*; import java.sql.*; +import gplx.dbs.sqls.*; class Db_stmt_cmd implements Db_stmt { - private Db_engine engine; + private final Db_engine engine; private PreparedStatement stmt = null; - private String sql; - private int val_idx = 0; - public Db_stmt_cmd(Db_provider provider, Db_qry qry) { - this.provider = provider; this.engine = provider.Engine(); - sql = qry.Tid() == Db_qry_.Tid_select_in_tbl ? ((Db_qry__select_in_tbl)qry).Xto_sql() : Sql_cmd_wtr_.Ansi.XtoSqlQry(qry, true); - New(); + private String sql; private int val_idx = 0; + public Db_stmt_cmd(Db_engine engine, Db_qry qry) { + this.engine = engine; + sql = qry.Tid() == Db_qry_.Tid_select_in_tbl ? ((Db_qry__select_in_tbl)qry).Xto_sql() : Sql_qry_wtr_.I.Xto_str(qry, true); + Reset_stmt(); } - public Db_stmt New() { - stmt = (PreparedStatement)engine.New_db_cmd(sql); + public Db_stmt Reset_stmt() { + stmt = (PreparedStatement)engine.New_stmt_prep_as_obj(sql); return this; } - public Db_provider Provider() {return provider;} Db_provider provider; - public Db_stmt Val_bool_(boolean v) { - try {stmt.setBoolean(++val_idx, v);} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "int", v);} - return this; - } - public Db_stmt Val_byte_by_bool_(boolean v) {return Val_byte_(v ? Bool_.Y_byte : Bool_.N_byte);} - public Db_stmt Val_byte_(byte v) { + public Db_stmt Crt_bool_as_byte(String k, boolean v) {return Add_byte_by_bool(Bool_.Y, k, v);} + public Db_stmt Val_bool_as_byte(String k, boolean v) {return Add_byte_by_bool(Bool_.N, k, v);} + public Db_stmt Val_bool_as_byte(boolean v) {return Add_byte_by_bool(Bool_.N, null, v);} + private Db_stmt Add_byte_by_bool(boolean where, String k, boolean v) {return Add_byte(where, k, v ? Bool_.Y_byte : Bool_.N_byte);} + public Db_stmt Crt_byte(String k, byte v) {return Add_byte(Bool_.Y, k, v);} + 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, null, v);} + private Db_stmt Add_byte(boolean where, String k, byte v) { try {stmt.setByte(++val_idx, v);} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "byte", v);} return this; } - public Db_stmt Val_int_(int v) { + public Db_stmt Crt_int(String k, int v) {return Add_int(Bool_.Y, k, v);} + 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, null, v);} + private Db_stmt Add_int(boolean where, String k, int v) { try {stmt.setInt(++val_idx, v);} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "int", v);} return this; } - public Db_stmt Val_long_(long v) { + public Db_stmt Crt_long(String k, long v) {return Add_long(Bool_.Y, k, v);} + 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, null, v);} + private Db_stmt Add_long(boolean where, String k, long v) { try {stmt.setLong(++val_idx, v);} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "long", v);} return this; } - public Db_stmt Val_float_(float v) { + public Db_stmt Crt_float(String k, float v) {return Add_float(Bool_.Y, k, v);} + 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, null, v);} + private Db_stmt Add_float(boolean where, String k, float v) { try {stmt.setFloat(++val_idx, v);} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "float", v);} return this; } - public Db_stmt Val_double_(double v) { + public Db_stmt Crt_double(String k, double v) {return Add_double(Bool_.Y, k, v);} + 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, null, v);} + private Db_stmt Add_double(boolean where, String k, double v) { try {stmt.setDouble(++val_idx, v);} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "double", v);} return this; } - public Db_stmt Val_decimal_(DecimalAdp v) { + public Db_stmt Crt_decimal(String k, DecimalAdp v) {return Add_decimal(Bool_.Y, k, v);} + public Db_stmt Val_decimal(String k, DecimalAdp v) {return Add_decimal(Bool_.N, k, v);} + public Db_stmt Val_decimal(DecimalAdp v) {return Add_decimal(Bool_.N, null, v);} + private Db_stmt Add_decimal(boolean where, String k, DecimalAdp v) { try {stmt.setBigDecimal(++val_idx, v.Xto_decimal());} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "decimal", v);} return this; } - public Db_stmt Val_bry_by_str_(String v) {return Val_bry_(Bry_.new_utf8_(v));} - public Db_stmt Val_bry_(byte[] v) { + public Db_stmt Crt_bry(String k, byte[] v) {return Add_bry(Bool_.Y, k, v);} + 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, null, v);} + private Db_stmt Add_bry(boolean where, String k, byte[] v) { try {stmt.setBytes(++val_idx, v);} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "byte[]", v.length);} return this; } - public Db_stmt Val_str_by_bry_(byte[] v) {return Val_str_(String_.new_utf8_(v));} - public Db_stmt Val_str_(String v) { + public Db_stmt Crt_bry_as_str(String k, byte[] v) {return Add_bry_as_str(Bool_.Y, k, v);} + public Db_stmt Val_bry_as_str(String k, byte[] v) {return Add_bry_as_str(Bool_.N, k, v);} + public Db_stmt Val_bry_as_str(byte[] v) {return Add_bry_as_str(Bool_.N, null, v);} + private Db_stmt Add_bry_as_str(boolean where, String k, byte[] v) {return Add_str(where, k, String_.new_utf8_(v));} + public Db_stmt Crt_str(String k, String v) {return Add_str(Bool_.Y, k, v);} + 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, null, v);} + private Db_stmt Add_str(boolean where, String k, String v) { try {stmt.setString(++val_idx, v);} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "String", v);} return this; } @@ -85,13 +109,13 @@ class Db_stmt_cmd implements Db_stmt { try {int rv = stmt.executeUpdate(); return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql);} } public DataRdr Exec_select() { - try {DataRdr rv = engine.NewDataRdr(stmt.executeQuery(), sql); return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql);} + try {DataRdr rv = engine.New_rdr(stmt.executeQuery(), sql); return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql);} } public Db_rdr Exec_select_as_rdr() { - try {return engine.New_db_rdr(stmt.executeQuery(), sql);} catch (Exception e) {throw Err_.err_(e, "select failed: sql={0}", sql);} + try {return engine.New_rdr_by_obj(stmt.executeQuery(), sql);} catch (Exception e) {throw Err_.err_(e, "select failed: sql={0}", sql);} } public Object Exec_select_val() { - try {Object rv = Db_qry_select.Rdr_to_val(engine.NewDataRdr(stmt.executeQuery(), sql)); return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql);} + try {Object rv = Db_qry_select.Rdr_to_val(engine.New_rdr(stmt.executeQuery(), sql)); return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql);} } public Db_stmt Clear() { val_idx = 0; diff --git a/140_dbs/src_110_dbQry/gplx/dbs/Db_stmt_sql.java b/140_dbs/src_110_dbQry/gplx/dbs/Db_stmt_sql.java index fef18b790..7024965d0 100644 --- a/140_dbs/src_110_dbQry/gplx/dbs/Db_stmt_sql.java +++ b/140_dbs/src_110_dbQry/gplx/dbs/Db_stmt_sql.java @@ -16,48 +16,73 @@ 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.*; -class Db_stmt_sql implements Db_stmt { +public class Db_stmt_sql implements Db_stmt {// used for formatting SQL statements; not used for actual insert into database private Bry_bfr tmp_bfr = Bry_bfr.new_(); private Bry_fmtr tmp_fmtr = Bry_fmtr.new_(); private int val_idx = 0; - public Db_provider Provider() {return provider;} public void Provider_(Db_provider v) {this.provider = v;} Db_provider provider; - public Db_stmt New() {return this;} - public Db_stmt Val_bool_(boolean v) { - try {Add(++val_idx, v ? "true" : "false");} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "int", v);} - return this; - } - public Db_stmt Val_byte_by_bool_(boolean v) {return Val_byte_(v ? Bool_.Y_byte : Bool_.N_byte);} - public Db_stmt Val_byte_(byte v) { + public Db_conn Conn() {return conn;} public void Conn_(Db_conn v) {this.conn = v;} Db_conn conn; + public Db_stmt Reset_stmt() {return this;} + public Db_stmt Crt_bool_as_byte(String k, boolean v) {return Add_byte_by_bool(Bool_.Y, k, v);} + public Db_stmt Val_bool_as_byte(String k, boolean v) {return Add_byte_by_bool(Bool_.N, k, v);} + public Db_stmt Val_bool_as_byte(boolean v) {return Add_byte_by_bool(Bool_.N, null, v);} + private Db_stmt Add_byte_by_bool(boolean where, String k, boolean v) {return Add_byte(where, k, v ? Bool_.Y_byte : Bool_.N_byte);} + public Db_stmt Crt_byte(String k, byte v) {return Add_byte(Bool_.Y, k, v);} + 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, null, v);} + private Db_stmt Add_byte(boolean where, String k, byte v) { try {Add(++val_idx, Byte_.Xto_str(v));} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "byte", v);} return this; } - public Db_stmt Val_int_(int v) { + public Db_stmt Crt_int(String k, int v) {return Add_int(Bool_.Y, k, v);} + 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, null, v);} + private Db_stmt Add_int(boolean where, String k, int v) { try {Add(++val_idx, Int_.Xto_str(v));} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "int", v);} return this; } - public Db_stmt Val_long_(long v) { + public Db_stmt Crt_long(String k, long v) {return Add_long(Bool_.Y, k, v);} + 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, null, v);} + private Db_stmt Add_long(boolean where, String k, long v) { try {Add(++val_idx, Long_.Xto_str(v));} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "long", v);} return this; } - public Db_stmt Val_float_(float v) { + public Db_stmt Crt_float(String k, float v) {return Add_float(Bool_.Y, k, v);} + 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, null, v);} + private Db_stmt Add_float(boolean where, String k, float v) { try {Add(++val_idx, Float_.Xto_str(v));} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "float", v);} return this; } - public Db_stmt Val_double_(double v) { + public Db_stmt Crt_double(String k, double v) {return Add_double(Bool_.Y, k, v);} + 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, null, v);} + private Db_stmt Add_double(boolean where, String k, double v) { try {Add(++val_idx, Double_.Xto_str(v));} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "double", v);} return this; } - public Db_stmt Val_decimal_(DecimalAdp v) { + public Db_stmt Crt_decimal(String k, DecimalAdp v) {return Add_decimal(Bool_.Y, k, v);} + public Db_stmt Val_decimal(String k, DecimalAdp v) {return Add_decimal(Bool_.N, k, v);} + public Db_stmt Val_decimal(DecimalAdp v) {return Add_decimal(Bool_.N, null, v);} + private Db_stmt Add_decimal(boolean where, String k, DecimalAdp v) { try {Add(++val_idx, v.Xto_str());} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "decimal", v);} return this; } - public Db_stmt Val_bry_by_str_(String v) {return Val_bry_(Bry_.new_utf8_(v));} - public Db_stmt Val_bry_(byte[] v) { // HACK: convert to String b/c tdb does not support byte[] + public Db_stmt Crt_bry(String k, byte[] v) {return Add_bry(Bool_.Y, k, v);} + 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, null, v);} + private Db_stmt Add_bry(boolean where, String k, byte[] v) {// HACK: convert to String b/c tdb does not support byte[] try {Add(++val_idx, Val_str_wrap(String_.new_utf8_(v)));} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "byte[]", v.length);} return this; } - public Db_stmt Val_str_by_bry_(byte[] v) {return Val_str_(String_.new_utf8_(v));} - public Db_stmt Val_str_(String v) { + public Db_stmt Crt_bry_as_str(String k, byte[] v) {return Add_bry_as_str(Bool_.Y, k, v);} + public Db_stmt Val_bry_as_str(String k, byte[] v) {return Add_bry_as_str(Bool_.N, k, v);} + public Db_stmt Val_bry_as_str(byte[] v) {return Add_bry_as_str(Bool_.N, null, v);} + private Db_stmt Add_bry_as_str(boolean where, String k, byte[] v) {return Add_str(where, k, String_.new_utf8_(v));} + public Db_stmt Crt_str(String k, String v) {return Add_str(Bool_.Y, k, v);} + 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, null, v);} + private Db_stmt Add_str(boolean where, String k, String v) { try {Add(++val_idx, Val_str_wrap(v));} catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "String", v);} return this; } @@ -69,20 +94,20 @@ class Db_stmt_sql implements Db_stmt { } catch (Exception e) {throw Err_.err_(e, "failed to add value: type={0} val={1}", "rdr", v);} return this; } - String Val_str_wrap(String v) { + private String Val_str_wrap(String v) { return "'" + String_.Replace(v, "'", "\\'") + "'"; } public boolean Exec_insert() { - try {boolean rv = provider.Exec_qry(Db_qry_sql.dml_(this.Xto_sql())) != 0; return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql_orig);} + try {boolean rv = conn.Exec_qry(Db_qry_sql.dml_(this.Xto_sql())) != 0; return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql_orig);} } public int Exec_update() { - try {int rv = provider.Exec_qry(Db_qry_sql.dml_(this.Xto_sql())); return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql_orig);} + try {int rv = conn.Exec_qry(Db_qry_sql.dml_(this.Xto_sql())); return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql_orig);} } public int Exec_delete() { - try {int rv = provider.Exec_qry(Db_qry_sql.dml_(this.Xto_sql())); return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql_orig);} + try {int rv = conn.Exec_qry(Db_qry_sql.dml_(this.Xto_sql())); return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql_orig);} } public DataRdr Exec_select() { - try {DataRdr rv = provider.Exec_qry_as_rdr(Db_qry_sql.rdr_(this.Xto_sql())); return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql_orig);} + try {DataRdr rv = conn.Exec_qry_as_rdr(Db_qry_sql.rdr_(this.Xto_sql())); return rv;} catch (Exception e) {throw Err_.err_(e, "failed to exec prepared statement: sql={0}", sql_orig);} } public Db_rdr Exec_select_as_rdr() {throw Err_.not_implemented_();} public Object Exec_select_val() { @@ -97,13 +122,17 @@ class Db_stmt_sql implements Db_stmt { this.Clear(); } public void Add(String v) {Add(-1, v);} - public void Add(int idx, String v) {args.Add(v);} ListAdp args = ListAdp_.new_(); + public void Add(int idx, String v) {args.Add(v);} private ListAdp args = ListAdp_.new_(); public String Xto_sql() { tmp_fmtr.Bld_bfr_many(tmp_bfr, (Object[])args.Xto_ary_and_clear(Object.class)); return tmp_bfr.Xto_str_and_clear(); } - String sql_orig; - public Db_stmt Parse(String sql_str) { + public int Args_len() {return args.Count();} + public String Args_get_at(int i) {return (String)args.FetchAt(i);} + private String sql_orig; + public Db_qry Qry() {return qry;} private Db_qry qry; + public Db_stmt Parse(Db_qry qry, String sql_str) { + this.qry = qry; this.sql_orig = sql_str; int arg_idx = 0; byte[] src = Bry_.new_utf8_(sql_str); diff --git a/140_dbs/src_110_dbQry/gplx/dbs/Db_stmt_sql_tst.java b/140_dbs/src_110_dbQry/gplx/dbs/Db_stmt_sql_tst.java index f6a8f181e..c6c50d421 100644 --- a/140_dbs/src_110_dbQry/gplx/dbs/Db_stmt_sql_tst.java +++ b/140_dbs/src_110_dbQry/gplx/dbs/Db_stmt_sql_tst.java @@ -21,7 +21,7 @@ public class Db_stmt_sql_tst { @Before public void init() {} @Test public void Basic() { Db_stmt_sql stmt = new Db_stmt_sql(); - stmt.Parse("UPDATE tbl_0 SET col_0 = ? WHERE col_1 = ?"); + stmt.Parse(null, "UPDATE tbl_0 SET col_0 = ? WHERE col_1 = ?"); stmt.Add("1"); stmt.Add("2"); Tfds.Eq("UPDATE tbl_0 SET col_0 = 1 WHERE col_1 = 2", stmt.Xto_sql()); diff --git a/140_dbs/src_110_dbQry/gplx/dbs/Db_txn_mgr.java b/140_dbs/src_110_dbQry/gplx/dbs/Db_txn_mgr.java index 54086ca94..5d3bf545e 100644 --- a/140_dbs/src_110_dbQry/gplx/dbs/Db_txn_mgr.java +++ b/140_dbs/src_110_dbQry/gplx/dbs/Db_txn_mgr.java @@ -26,7 +26,7 @@ public interface Db_txn_mgr { int Txn_count(); void Txn_count_(int v); } class Db_txn_mgr_base implements Db_txn_mgr { - public Db_txn_mgr_base(Db_engine engine) {this.engine = engine;} private Db_engine engine; + public Db_txn_mgr_base(Db_engine engine) {this.engine = engine;} private final Db_engine engine; public int Txn_depth() {return txn_depth;} int txn_depth; // NOTE: only support 1 level for now; public void Txn_bgn_if_none() {if (txn_depth == 0) this.Txn_bgn();} public void Txn_bgn() { diff --git a/140_dbs/src_120_sql/gplx/dbs/Db_obj_ary_tst.java b/140_dbs/src_120_sql/gplx/dbs/Db_obj_ary_tst.java index 589b5ae1e..fe562760d 100644 --- a/140_dbs/src_120_sql/gplx/dbs/Db_obj_ary_tst.java +++ b/140_dbs/src_120_sql/gplx/dbs/Db_obj_ary_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.dbs; import gplx.*; -import org.junit.*; +import org.junit.*; import gplx.dbs.sqls.*; public class Db_obj_ary_tst { @Before public void init() {} private Db_obj_ary_fxt fxt = new Db_obj_ary_fxt(); @Test public void Int() { @@ -31,7 +31,7 @@ class Db_obj_ary_fxt { public Db_obj_ary_fxt Init_fld(String name, byte tid) {flds_list.Add(new Db_fld(name, tid)); return this;} private ListAdp flds_list = ListAdp_.new_(); public Db_obj_ary_fxt Init_vals(Object... ary) {vals_list.Add(ary); return this;} private ListAdp vals_list = ListAdp_.new_(); public Db_obj_ary_fxt Test_sql(String expd) { - Sql_cmd_wtr_ansi cmd_wtr = (Sql_cmd_wtr_ansi)Sql_cmd_wtr_ansi_.default_(); + Sql_qry_wtr_ansi cmd_wtr = (Sql_qry_wtr_ansi)Sql_qry_wtr_.I; String_bldr sb = String_bldr_.new_(); crt.Flds_((Db_fld[])flds_list.Xto_ary_and_clear(Db_fld.class)); crt.Vals_((Object[][])vals_list.Xto_ary_and_clear(Object[].class)); diff --git a/140_dbs/src_130_misc/gplx/dbs/PoolIds.java b/140_dbs/src_130_misc/gplx/dbs/PoolIds.java index 4b7855701..3a7a6045a 100644 --- a/140_dbs/src_130_misc/gplx/dbs/PoolIds.java +++ b/140_dbs/src_130_misc/gplx/dbs/PoolIds.java @@ -17,12 +17,12 @@ along with this program. If not, see . */ package gplx.dbs; import gplx.*; public class PoolIds { - public int FetchNext(Db_provider provider, String url) { + public int FetchNext(Db_conn conn, String url) { Db_qry_select cmd = Db_qry_.select_().From_(Tbl_Name).Where_(Db_crt_.eq_(Fld_id_path, url)); int rv = 0;//boolean isNew = true; DataRdr rdr = DataRdr_.Null; try { - rdr = cmd.Exec_qry_as_rdr(provider); + rdr = cmd.Exec_qry_as_rdr(conn); if (rdr.MoveNextPeer()) { rv = rdr.ReadInt(Fld_id_next_id); } @@ -31,17 +31,17 @@ public class PoolIds { return rv; } public int FetchNextAndCommit(String dbInfo, String url) { - Db_provider provider = Db_provider_pool._.Get_or_new(dbInfo); - int rv = PoolIds._.FetchNext(provider, url); - PoolIds._.Commit(provider, url, rv + 1); + Db_conn conn = Db_conn_pool_old._.Get_or_new(dbInfo); + int rv = PoolIds._.FetchNext(conn, url); + PoolIds._.Commit(conn, url, rv + 1); return rv; } - public void Commit(Db_provider provider, String url, int val) { - int rv = provider.Exec_qry(Db_qry_.update_(Tbl_Name, Db_crt_.eq_(Fld_id_path, url)).Arg_(Fld_id_path, url).Arg_(Fld_id_next_id, val)); + public void Commit(Db_conn conn, String url, int val) { + int rv = conn.Exec_qry(Db_qry_.update_(Tbl_Name, Db_crt_.eq_(Fld_id_path, url)).Arg_(Fld_id_path, url).Arg_(Fld_id_next_id, val)); if (rv == 0) { - rv = provider.Exec_qry(Db_qry_.insert_(Tbl_Name).Arg_(Fld_id_path, url).Arg_(Fld_id_next_id, val)); + rv = conn.Exec_qry(Db_qry_.insert_(Tbl_Name).Arg_(Fld_id_path, url).Arg_(Fld_id_next_id, val)); } - if (rv != 1) throw Err_.new_("failed to update nextId").Add("provider", provider.Conn_info().Str_raw()).Add("url", url).Add("nextId", val); + if (rv != 1) throw Err_.new_("failed to update nextId").Add("url", url).Add("nextId", val); } public static final String Tbl_Name = "pool_ids"; @gplx.Internal protected static final String Fld_id_path = "id_path"; diff --git a/140_dbs/src_200_engine/gplx/dbs/Db_engine.java b/140_dbs/src_200_engine/gplx/dbs/Db_engine.java index c9217c9e9..1689d9b2b 100644 --- a/140_dbs/src_200_engine/gplx/dbs/Db_engine.java +++ b/140_dbs/src_200_engine/gplx/dbs/Db_engine.java @@ -17,42 +17,31 @@ along with this program. If not, see . */ package gplx.dbs; import gplx.*; public interface Db_engine { - String Key(); - String Conn_info_tid(); - Db_conn_info Conn_info(); - void Conn_open(); - void Conn_term(); + String Tid(); + Db_url Url(); + Db_engine New_clone(Db_url url); + Db_rdr New_rdr_by_obj(Object o, String sql); // Object o:ResultSet if desktop; Cursor if android + Db_stmt New_stmt_prep(Db_qry qry); + Object New_stmt_prep_as_obj(String sql); + DataRdr New_rdr(java.sql.ResultSet rdr, String sql); void Txn_bgn(); void Txn_end(); - Db_engine Make_new(Db_conn_info conn_info); - - Db_rdr New_db_rdr(Object o, String sql); // ResultSet if desktop; Cursor if android - Db_stmt New_db_stmt(Db_provider provider, Db_qry sql); - Object Execute(Db_qry cmd); - DataRdr NewDataRdr(java.sql.ResultSet rdr, String sql); - Object New_db_cmd(String sql); + void Conn_open(); + void Conn_term(); + Object Exec_as_obj(Db_qry qry); } class Db_engine_null implements Db_engine { - public String Key() {return Db_conn_info_.Null.Key();} - public String Conn_info_tid() {return Db_conn_info_.Null.Key();} - public Db_conn_info Conn_info() {return Db_conn_info_.Null;} + public String Tid() {return Db_url__null.Tid_const;} + public Db_url Url() {return Db_url_.Null;} public void Conn_open() {} public void Conn_term() {} + public Db_engine New_clone(Db_url url) {return this;} + public Db_rdr New_rdr_by_obj(Object o, String sql) {return Db_rdr_.Null;} + public Db_stmt New_stmt_prep(Db_qry qry) {return Db_stmt_.Null;} + public Object New_stmt_prep_as_obj(String sql) {throw Err_.not_implemented_();} + public DataRdr New_rdr(java.sql.ResultSet rdr, String sql) {return DataRdr_.Null;} public void Txn_bgn() {} public void Txn_end() {} - public Db_engine Make_new(Db_conn_info conn_info) {return this;} - - public Object Execute(Db_qry cmd) {return cmd.ExecRdrAble() ? (Object)DataRdr_.Null : -1;} - public Object New_db_cmd(String sql) {throw Err_.not_implemented_();} - public DataRdr NewDataRdr(java.sql.ResultSet rdr, String sql) {return DataRdr_.Null;} - public Db_rdr New_db_rdr(Object o, String sql) {return Db_rdr_.Null;} - public Db_stmt New_db_stmt(Db_provider provider, Db_qry qry) {return Db_stmt_.Null;} + public Object Exec_as_obj(Db_qry cmd) {return cmd.Exec_is_rdr() ? (Object)DataRdr_.Null : -1;} public static final Db_engine_null _ = new Db_engine_null(); Db_engine_null() {} } -class ExecSqlWkr implements Db_qryWkr { - public Object Exec(Db_engine engineObj, Db_qry cmd) { - Db_engine_sql_base engine = (Db_engine_sql_base)engineObj; - String sql = engine.SqlWtr().XtoSqlQry(cmd, false); // Tfds.Write(sql); - return cmd.ExecRdrAble() ? (Object)engine.ExecuteReader(sql) : engine.ExecuteNonQuery(sql); - } -} diff --git a/140_dbs/src_200_engine/gplx/dbs/Db_engine_regy.java b/140_dbs/src_200_engine/gplx/dbs/Db_engine_regy.java index a15b577ff..e4e7a8851 100644 --- a/140_dbs/src_200_engine/gplx/dbs/Db_engine_regy.java +++ b/140_dbs/src_200_engine/gplx/dbs/Db_engine_regy.java @@ -27,7 +27,7 @@ public class Db_engine_regy { .Add(Sqlite_engine._) ; } - public Db_engine_regy Add(Db_engine engine) {hash.Add(engine.Key(), engine); return this;} + public Db_engine_regy Add(Db_engine engine) {hash.Add(engine.Tid(), engine); return this;} public Db_engine Get(String key) {return (Db_engine)hash.FetchOrFail(key);} public static final Db_engine_regy _ = new Db_engine_regy(1); } diff --git a/140_dbs/src_200_engine/gplx/dbs/Db_engine_sql_base.java b/140_dbs/src_200_engine/gplx/dbs/Db_engine_sql_base.java index e14b1dcaa..d9137ad00 100644 --- a/140_dbs/src_200_engine/gplx/dbs/Db_engine_sql_base.java +++ b/140_dbs/src_200_engine/gplx/dbs/Db_engine_sql_base.java @@ -17,68 +17,65 @@ along with this program. If not, see . */ package gplx.dbs; import gplx.*; import java.sql.*; +import gplx.dbs.sqls.*; abstract class Db_engine_sql_base implements Db_engine { - public abstract String Key(); - public abstract String Conn_info_tid(); - public Db_conn_info Conn_info() {return conn_info;} protected Db_conn_info conn_info; - @gplx.Virtual public void Txn_bgn() {Execute(Db_qry_sql.xtn_("BEGIN TRANSACTION;"));} - @gplx.Virtual public void Txn_end() {Execute(Db_qry_sql.xtn_("COMMIT TRANSACTION;"));} - public abstract Db_engine Make_new(Db_conn_info conn_info); - @gplx.Virtual public Sql_cmd_wtr SqlWtr() {return Sql_cmd_wtr_.Ansi;} - public Object Execute(Db_qry cmd) { - Db_qryWkr wkr = (Db_qryWkr)wkrs.FetchOrFail(cmd.KeyOfDb_qry()); - return wkr.Exec(this, cmd); + @gplx.Internal protected void Ctor(Db_url url) {this.url = url;} + public abstract String Tid(); + public Db_url Url() {return url;} protected Db_url url; + public abstract Db_engine New_clone(Db_url url); + public Db_rdr New_rdr_by_obj(Object rdr, String sql) { + Db_rdr__basic rv = New_rdr_clone(); + rv.Ctor((ResultSet)rdr, sql); + return rv; } - @gplx.Internal protected void ctor_SqlEngineBase(Db_conn_info conn_info) { - this.conn_info = conn_info; - wkrs.Add(Db_qry_select.KeyConst, new ExecSqlWkr()); - wkrs.Add(Db_qry_insert.KeyConst, new ExecSqlWkr()); - wkrs.Add(Db_qry_update.KeyConst, new ExecSqlWkr()); - wkrs.Add(Db_qry_delete.KeyConst, new ExecSqlWkr()); - wkrs.Add(Db_qry_sql.KeyConst, new ExecSqlWkr()); - wkrs.Add(Db_qry_flush.KeyConst, Db_qryWkr_.Null); - } HashAdp wkrs = HashAdp_.new_(); - @gplx.Internal @gplx.Virtual protected int ExecuteNonQuery(String sql) { + @gplx.Virtual public Db_rdr__basic 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 void Txn_bgn() {Exec_as_obj(Db_qry_sql.xtn_("BEGIN TRANSACTION;"));} + public void Txn_end() {Exec_as_obj(Db_qry_sql.xtn_("COMMIT TRANSACTION;"));} + public Object Exec_as_obj(Db_qry qry) { + if (qry.Tid() == Db_qry_.Tid_flush) return null; // ignore flush (delete-db) statements + String sql = this.SqlWtr().Xto_str(qry, false); // DBG: Tfds.Write(sql); + return qry.Exec_is_rdr() ? (Object)this.Exec_as_rdr(sql) : this.Exec_as_int(sql); + } + private int Exec_as_int(String sql) { try { - Statement cmd = NewDbCmd(sql); - return cmd.executeUpdate(sql); + Statement cmd = New_stmt_exec(sql); + return cmd.executeUpdate(sql); } catch (Exception exc) {throw Err_.err_(exc, "exec nonQuery failed").Add("sql", sql).Add("err", Err_.Message_gplx_brief(exc));} } - @gplx.Internal @gplx.Virtual protected DataRdr ExecuteReader(String sql) { + private DataRdr Exec_as_rdr(String sql) { try { - Statement cmd = NewDbCmd(sql); + Statement cmd = New_stmt_exec(sql); cmd.execute(sql); ResultSet rdr = cmd.getResultSet(); - return NewDataRdr(rdr, sql); + return New_rdr(rdr, sql); } catch (Exception exc) {throw Err_.err_(exc, "exec reader failed").Add("sql", sql).Add("err", Err_.Message_gplx_brief(exc));} } + @gplx.Virtual public DataRdr New_rdr(ResultSet rdr, String sql) {return gplx.stores.Db_data_rdr_.new_(rdr, sql);} + @gplx.Virtual public Sql_qry_wtr SqlWtr() {return Sql_qry_wtr_.new_ansi();} @gplx.Internal protected abstract Connection Conn_new(); - @gplx.Virtual public DataRdr NewDataRdr(ResultSet rdr, String sql) {return gplx.stores.Db_data_rdr_.new_(rdr, sql);} - public Db_rdr New_db_rdr(Object rdr, String sql) {return new Db_rdr__basic((ResultSet)rdr, sql);} - public Db_stmt New_db_stmt(Db_provider provider, Db_qry qry) {return new Db_stmt_cmd(provider, qry);} - public Object New_db_cmd(String sql) { - try {return connection.prepareStatement(sql);} - catch (Exception e) { - throw Err_.err_(e, "failed to prepare sql; sql={0}", sql);} - } - public void Conn_open() { - connection = Conn_new(); - } private Connection connection; + private Connection connection; + public void Conn_open() {connection = Conn_new();} public void Conn_term() { -// if (Env_.Mode_testing()) return; // WORKAROUND:MYSQL:else errors randomly when running all tests. possible connection pooling issue (?); // commented out 2013-08-22 + if (connection == null) return; // connection never opened; just exit try {connection.close();} - catch (SQLException e) {throw Err_.err_(e, "close connection failed").Add("ConnectInfo", conn_info.Str_raw());} + catch (Exception e) {throw Err_.err_(e, "Conn_term.fail; url={0} err={1}", url.Xto_raw(), Err_.Message_lang(e));} + connection = null; } - Statement NewDbCmd(String commandText) { - Statement cmd = null; - try {cmd = connection.createStatement();} - catch (SQLException e) {throw Err_.err_(e, "could not create statement").Add("commandText", commandText).Add("e", Err_.Message_lang(e));} - return cmd; + public Object New_stmt_prep_as_obj(String sql) { + if (connection == null) connection = Conn_new(); // auto-open connection + try {return connection.prepareStatement(sql);} + catch (Exception e) {throw Err_.err_(e, "New_stmt_prep.fail; sql={0} err={1}", sql, Err_.Message_lang(e));} } - protected Connection NewDbCon(String url, String uid, String pwd) { + private Statement New_stmt_exec(String sql) { + if (connection == null) connection = Conn_new(); // auto-open connection + try {return connection.createStatement();} + catch (Exception e) {throw Err_.err_(e, "New_stmt_exec.fail; sql={0} err={1}", sql, Err_.Message_lang(e));} + } + protected Connection Conn_make_by_url(String url, String uid, String pwd) { try {return DriverManager.getConnection(url, uid, pwd);} - catch (SQLException e) {throw Err_.err_(e, "connection open failed").Add("ConnectInfo", Conn_info().Str_raw());} + catch (SQLException e) {throw Err_.err_(e, "connection open failed").Add("ConnectInfo", Url().Xto_raw());} } } diff --git a/140_dbs/src_300_sqlDbs/gplx/dbs/Mysql_engine.java b/140_dbs/src_300_sqlDbs/gplx/dbs/Mysql_engine.java index 499dfe597..bb20dbe9e 100644 --- a/140_dbs/src_300_sqlDbs/gplx/dbs/Mysql_engine.java +++ b/140_dbs/src_300_sqlDbs/gplx/dbs/Mysql_engine.java @@ -16,21 +16,20 @@ 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.stores.*; +import gplx.stores.*; import gplx.dbs.sqls.*; import java.sql.*; class Mysql_engine extends Db_engine_sql_base { - @Override public String Key() {return Db_conn_info__mysql.Key_const;} - @Override public String Conn_info_tid() {return this.Key();} - @Override public Sql_cmd_wtr SqlWtr() {return Sql_cmd_wtr_.BackslashSensitive;} - @Override public Db_engine Make_new(Db_conn_info connectInfo) { + @Override public String Tid() {return Db_url__mysql.Tid_const;} + @Override public Sql_qry_wtr SqlWtr() {return Sql_qry_wtr_.new_escape_backslash();} + @Override public Db_engine New_clone(Db_url connectInfo) { Mysql_engine rv = new Mysql_engine(); - rv.ctor_SqlEngineBase(connectInfo); + rv.Ctor(connectInfo); return rv; } - @Override public DataRdr NewDataRdr(ResultSet rdr, String commandText) {return Mysql_rdr.new_(rdr, commandText);} + @Override public DataRdr New_rdr(ResultSet rdr, String commandText) {return Mysql_rdr.new_(rdr, commandText);} @gplx.Internal @Override protected Connection Conn_new() { - Db_conn_info__mysql connUrl = (Db_conn_info__mysql)conn_info; - return NewDbCon("jdbc:mysql://localhost/" + connUrl.Database() + "?characterEncoding=UTF8", connUrl.Uid(), connUrl.Pwd()); + Db_url__mysql url_as_mysql = (Db_url__mysql)url; + return Conn_make_by_url("jdbc:mysql://localhost/" + url_as_mysql.Database() + "?characterEncoding=UTF8", url_as_mysql.Uid(), url_as_mysql.Pwd()); } @gplx.Internal protected static final Mysql_engine _ = new Mysql_engine(); Mysql_engine() {} } diff --git a/140_dbs/src_300_sqlDbs/gplx/dbs/Postgres_engine.java b/140_dbs/src_300_sqlDbs/gplx/dbs/Postgres_engine.java index ffcf1cd0e..66577124f 100644 --- a/140_dbs/src_300_sqlDbs/gplx/dbs/Postgres_engine.java +++ b/140_dbs/src_300_sqlDbs/gplx/dbs/Postgres_engine.java @@ -16,21 +16,20 @@ 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.stores.*; +import gplx.stores.*; import gplx.dbs.sqls.*; import java.sql.*; class Postgres_engine extends Db_engine_sql_base { - @Override public String Key() {return Db_conn_info__postgres.Key_const;} - @Override public String Conn_info_tid() {return this.Key();} - @Override public Sql_cmd_wtr SqlWtr() {return Sql_cmd_wtr_.BackslashSensitive;} - @Override public Db_engine Make_new(Db_conn_info connectInfo) { + @Override public String Tid() {return Db_url__postgres.Tid_const;} + @Override public Sql_qry_wtr SqlWtr() {return Sql_qry_wtr_.new_escape_backslash();} + @Override public Db_engine New_clone(Db_url connectInfo) { Postgres_engine rv = new Postgres_engine(); - rv.ctor_SqlEngineBase(connectInfo); + rv.Ctor(connectInfo); return rv; } - @Override public DataRdr NewDataRdr(ResultSet rdr, String commandText) {return Db_data_rdr_.new_(rdr, commandText);} + @Override public DataRdr New_rdr(ResultSet rdr, String commandText) {return Db_data_rdr_.new_(rdr, commandText);} @gplx.Internal @Override protected Connection Conn_new() { - Db_conn_info__postgres connUrl = (Db_conn_info__postgres)conn_info; - return NewDbCon("jdbc:" + connUrl.Key() + "://localhost/" + connUrl.Database(), connUrl.Uid(), connUrl.Pwd()); + Db_url__postgres url_as_postgres = (Db_url__postgres)url; + return Conn_make_by_url("jdbc:" + url_as_postgres.Tid() + "://localhost/" + url_as_postgres.Database(), url_as_postgres.Uid(), url_as_postgres.Pwd()); } @gplx.Internal protected static final Postgres_engine _ = new Postgres_engine(); Postgres_engine() {} } diff --git a/140_dbs/src_300_sqlDbs/gplx/dbs/Sqlite_engine.java b/140_dbs/src_300_sqlDbs/gplx/dbs/Sqlite_engine.java index 5eb292489..2c8f22d86 100644 --- a/140_dbs/src_300_sqlDbs/gplx/dbs/Sqlite_engine.java +++ b/140_dbs/src_300_sqlDbs/gplx/dbs/Sqlite_engine.java @@ -19,14 +19,14 @@ package gplx.dbs; import gplx.*; import gplx.stores.*; import java.sql.*; class Sqlite_engine extends Db_engine_sql_base { - @Override public String Key() {return Db_conn_info__sqlite.Key_const;} - @Override public String Conn_info_tid() {return this.Key();} - @Override public Db_engine Make_new(Db_conn_info connectInfo) { + @Override public String Tid() {return Db_url__sqlite.Tid_const;} + @Override public Db_engine New_clone(Db_url connectInfo) { Sqlite_engine rv = new Sqlite_engine(); - rv.ctor_SqlEngineBase(connectInfo); + rv.Ctor(connectInfo); return rv; } - @Override public DataRdr NewDataRdr(ResultSet rdr, String commandText) {return Sqlite_rdr.new_(rdr, commandText);} + @Override public DataRdr New_rdr(ResultSet rdr, String commandText) {return Sqlite_rdr.new_(rdr, commandText);} + @Override public Db_rdr__basic New_rdr_clone() {return new Db_rdr__sqlite();} static boolean loaded = false; @gplx.Internal @Override protected Connection Conn_new() { if (!loaded) { @@ -36,8 +36,8 @@ class Sqlite_engine extends Db_engine_sql_base { catch (ClassNotFoundException e) {throw Err_.new_("could not load sqlite jdbc driver");} loaded = true; } - Db_conn_info__sqlite connUrl = (Db_conn_info__sqlite)conn_info; - return NewDbCon("jdbc:sqlite://" + String_.Replace(connUrl.Database(), "\\", "/"), "", ""); + Db_url__sqlite url_as_sqlite = (Db_url__sqlite)url; + return Conn_make_by_url("jdbc:sqlite://" + String_.Replace(url_as_sqlite.Database(), "\\", "/"), "", ""); } private boolean pragma_needed = true; @Override public void Txn_bgn() { @@ -45,16 +45,19 @@ class Sqlite_engine extends Db_engine_sql_base { // Execute(Db_qry_sql.xtn_("PRAGMA journal_mode = OFF;")); // will cause out of memory // Execute(Db_qry_sql.xtn_("PRAGMA journal_mode = MEMORY;")); if (pragma_needed) { - Execute(Db_qry_sql.xtn_("PRAGMA synchronous = OFF;")); + Exec_as_obj(Db_qry_sql.xtn_("PRAGMA synchronous = OFF;")); pragma_needed = false; } // Execute(Db_qry_sql.xtn_("PRAGMA temp_store = MEMORY;")); // Execute(Db_qry_sql.xtn_("PRAGMA locking_mode = EXCLUSIVE;")); // Execute(Db_qry_sql.xtn_("PRAGMA cache_size=4000;")); // too many will also cause out of memory - Execute(Db_qry_sql.xtn_("BEGIN TRANSACTION;")); + Exec_as_obj(Db_qry_sql.xtn_("BEGIN TRANSACTION;")); } @gplx.Internal protected static final Sqlite_engine _ = new Sqlite_engine(); Sqlite_engine() {} } +class Db_rdr__sqlite extends Db_rdr__basic { @Override public byte Read_byte(int i) {try {return (byte)rdr.getInt(i + 1);} catch (Exception e) {throw Err_.new_("read failed: i={0} type={1} err={2}", i, Byte_.Cls_val_name, Err_.Message_lang(e));}} + @Override public byte Read_byte(String k) {try {return (byte)Int_.cast_(rdr.getObject(k));} catch (Exception e) {throw Err_.new_("read failed: k={0} type={1} err={2}", k, Byte_.Cls_val_name, Err_.Message_lang(e));}} +} class Sqlite_rdr extends Db_data_rdr { @Override public float ReadFloat(String key) {return ReadFloatOr(key, Float.NaN);} @Override public float ReadFloatOr(String key, float or) { Object val = Read(key); diff --git a/140_dbs/src_300_sqlDbs/gplx/dbs/Sqlite_engine_.java b/140_dbs/src_300_sqlDbs/gplx/dbs/Sqlite_engine_.java index cdf0a32a8..7fab6a30d 100644 --- a/140_dbs/src_300_sqlDbs/gplx/dbs/Sqlite_engine_.java +++ b/140_dbs/src_300_sqlDbs/gplx/dbs/Sqlite_engine_.java @@ -17,45 +17,45 @@ along with this program. If not, see . */ package gplx.dbs; import gplx.*; public class Sqlite_engine_ { - public static void Db_attach(Db_provider p, String alias, String url) { + public static void Db_attach(Db_conn p, String alias, String url) { String s = String_.Format("ATTACH '{0}' AS {1};", url, alias); Db_qry qry = Db_qry_sql.xtn_(s); p.Exec_qry(qry); } - public static void Db_detach(Db_provider p, String alias) { + public static void Db_detach(Db_conn p, String alias) { String s = String_.Format("DETACH '{0}';", alias); Db_qry qry = Db_qry_sql.xtn_(s); p.Exec_qry(qry); } - public static void Tbl_create_and_delete(Db_provider p, String tbl_name, String tbl_sql) { + public static void Tbl_create_and_delete(Db_conn p, String tbl_name, String tbl_sql) { Tbl_delete(p, tbl_name); Db_qry qry = Db_qry_sql.ddl_(tbl_sql); p.Exec_qry(qry); } - public static void Tbl_create(Db_provider p, String tbl_name, String tbl_sql) { + public static void Tbl_create(Db_conn p, String tbl_name, String tbl_sql) { Db_qry qry = Db_qry_sql.ddl_(tbl_sql); p.Exec_qry(qry); } - public static void Tbl_delete_many(Db_provider p, String... tbls) { + public static void Tbl_delete_many(Db_conn p, String... tbls) { int len = tbls.length; for (int i = 0; i < len; i++) Tbl_delete(p, tbls[i]); } - public static void Tbl_delete(Db_provider p, String tbl) { + public static void Tbl_delete(Db_conn p, String tbl) { Db_qry qry = Db_qry_sql.ddl_("DROP TABLE IF EXISTS " + tbl + ";"); p.Exec_qry(qry); } - public static void Tbl_rename(Db_provider p, String src, String trg) { + public static void Tbl_rename(Db_conn p, String src, String trg) { Db_qry qry = Db_qry_sql.ddl_(String_.Format("ALTER TABLE {0} RENAME TO {1};", src, trg)); p.Exec_qry(qry); } - public static void Pragma_page_size_4096(Db_provider p) {Pragma_page_size(p, 4096);} - public static void Pragma_page_size(Db_provider p, int val) { + public static void Pragma_page_size_4096(Db_conn p) {Pragma_page_size(p, 4096);} + public static void Pragma_page_size(Db_conn p, int val) { Db_qry qry = Db_qry_sql.ddl_("PRAGMA page_size = " + Int_.Xto_str(val) + ";"); p.Exec_qry(qry); } - public static void Idx_create(Db_provider p, Db_idx_itm... idxs) {Idx_create(Gfo_usr_dlg_.Null, p, "", idxs);} - public static void Idx_create(Gfo_usr_dlg usr_dlg, Db_provider p, String file_id, Db_idx_itm... idxs) { + public static void Idx_create(Db_conn p, Db_idx_itm... idxs) {Idx_create(Gfo_usr_dlg_.Null, p, "", idxs);} + public static void Idx_create(Gfo_usr_dlg usr_dlg, Db_conn p, String file_id, Db_idx_itm... idxs) { int len = idxs.length; p.Txn_mgr().Txn_end_all(); // commit any pending transactions for (int i = 0; i < len; i++) { @@ -65,18 +65,18 @@ public class Sqlite_engine_ { usr_dlg.Log_many("", "", "index created: ~{0} ~{1}", file_id, index); } } - public static Db_provider Provider_load_or_fail_(Io_url url) { + public static Db_conn Conn_load_or_fail_(Io_url url) { boolean exists = Io_mgr._.ExistsFil(url); if (!exists) throw Err_.new_fmt_("db does not exist; url=~{0}", url.Raw()); - Db_conn_info connect = Db_conn_info__sqlite.load_(url); - return Db_provider_.new_and_open_(connect); + Db_url connect = Db_url__sqlite.load_(url); + return Db_conn_.new_and_open_(connect); } - public static Db_provider Provider_load_or_make_(Io_url url) {return Provider_load_or_make_(url, Bool_obj_ref.n_());} - public static Db_provider Provider_load_or_make_(Io_url url, Bool_obj_ref created) { + public static Db_conn Conn_load_or_make_(Io_url url) {return Conn_load_or_make_(url, Bool_obj_ref.n_());} + public static Db_conn Conn_load_or_make_(Io_url url, Bool_obj_ref created) { boolean exists = Io_mgr._.ExistsFil(url); created.Val_(!exists); - Db_conn_info connect = exists ? Db_conn_info__sqlite.load_(url) : Db_conn_info__sqlite.make_(url); - Db_provider p = Db_provider_.new_and_open_(connect); + Db_url connect = exists ? Db_url__sqlite.load_(url) : Db_url__sqlite.make_(url); + Db_conn p = Db_conn_.new_and_open_(connect); if (!exists) Pragma_page_size(p, 4096); return p; diff --git a/140_dbs/src_300_sqlDbs/gplx/dbs/db_CrudOps_tst.java b/140_dbs/src_300_sqlDbs/gplx/dbs/db_CrudOps_tst.java index 121fc72f3..ee5605735 100644 --- a/140_dbs/src_300_sqlDbs/gplx/dbs/db_CrudOps_tst.java +++ b/140_dbs/src_300_sqlDbs/gplx/dbs/db_CrudOps_tst.java @@ -20,24 +20,24 @@ import org.junit.*; public class db_CrudOps_tst { CrudOpsFxt fx = new CrudOpsFxt(); @Test public void Mysql() {if (Tfds.SkipDb) return; - fx.RunAll(Db_provider_fxt.Mysql()); + fx.RunAll(Db_conn_fxt.Mysql()); } @Test public void Tdb() {if (Tfds.SkipDb) return; - fx.RunAll(Db_provider_fxt.Tdb("100_dbs_crud_ops.dsv")); + fx.RunAll(Db_conn_fxt.Tdb("100_dbs_crud_ops.dsv")); } - @Test public void Postgres() {if (Db_provider_fxt.SkipPostgres) return; - fx.RunAll(Db_provider_fxt.Postgres()); + @Test public void Postgres() {if (Db_conn_fxt.SkipPostgres) return; + fx.RunAll(Db_conn_fxt.Postgres()); } @Test public void Sqlite() {if (Tfds.SkipDb) return; fx.Fx().DmlAffectedAvailable_(false); - fx.RunAll(Db_provider_fxt.Sqlite()); + fx.RunAll(Db_conn_fxt.Sqlite()); } } class CrudOpsFxt { - public Db_provider_fxt Fx() {return fx;} Db_provider_fxt fx = new Db_provider_fxt(); + public Db_conn_fxt Fx() {return fx;} Db_conn_fxt fx = new Db_conn_fxt(); void Init() {fx.ini_DeleteAll("dbs_crud_ops");} - public void RunAll(Db_provider provider) { - fx.Provider_(provider); + public void RunAll(Db_conn conn) { + fx.Conn_(conn); Insert_hook(); UpdateOne_hook(); UpdateMany_hook(); @@ -125,5 +125,5 @@ class CrudOpsFxt { Tfds.Eq(val, ExecRdr_val(Db_qry_.select_val_("dbs_crud_ops", "name", Db_crt_.eq_("id", 3)))); Tfds.Eq(val, ExecRdr_val(Db_qry_.select_val_("dbs_crud_ops", "name", Db_crt_.eq_("name", "\\")))); } - String ExecRdr_val(Db_qry_select select) {return (String)select.ExecRdr_val(fx.Provider());} + String ExecRdr_val(Db_qry_select select) {return (String)select.ExecRdr_val(fx.Conn());} } diff --git a/140_dbs/src_300_sqlDbs/gplx/dbs/db_DataTypes_tst.java b/140_dbs/src_300_sqlDbs/gplx/dbs/db_DataTypes_tst.java index 876358fd2..8eedceff2 100644 --- a/140_dbs/src_300_sqlDbs/gplx/dbs/db_DataTypes_tst.java +++ b/140_dbs/src_300_sqlDbs/gplx/dbs/db_DataTypes_tst.java @@ -21,19 +21,19 @@ public class db_DataTypes_tst { DataTypes_base_fxt fx = new DataTypes_base_fxt(); @Test public void Mysql() {if (Tfds.SkipDb) return; fx.Select_FloatStr_("0.333333"); - fx.RunAll(Db_provider_fxt.Mysql()); + fx.RunAll(Db_conn_fxt.Mysql()); } @Test public void Tdb() {if (Tfds.SkipDb) return; fx.Select_FloatStr_(Float_.Xto_str(Float_.Div(1, 3))); - fx.RunAll(Db_provider_fxt.Tdb("110_dbs_multiple_data_types.dsv")); + fx.RunAll(Db_conn_fxt.Tdb("110_dbs_multiple_data_types.dsv")); } - @Test public void Postgres() {if (Db_provider_fxt.SkipPostgres) return; + @Test public void Postgres() {if (Db_conn_fxt.SkipPostgres) return; fx.Select_FloatStr_("0.33333334"); - fx.RunAll(Db_provider_fxt.Postgres()); + fx.RunAll(Db_conn_fxt.Postgres()); } @Test public void Sqlite() {if (Tfds.SkipDb) return; fx.Select_FloatStr_("0.33333334"); - fx.RunAll(Db_provider_fxt.Sqlite()); + fx.RunAll(Db_conn_fxt.Sqlite()); } /* DROP TABLE dbs_multiple_data_types; @@ -49,17 +49,17 @@ INSERT INTO dbs_multiple_data_types VALUES (1, 'John Doe', B'1', '3/30/2006 10:2 */ } class DataTypes_base_fxt { - public Db_provider Provider() {return provider;} Db_provider provider; + public Db_conn Conn() {return conn;} Db_conn conn; public DataTypes_base_fxt() {} - public void Rls() {provider.Conn_term();} + public void Rls() {conn.Conn_term();} public String Select_FloatStr() {return select_FloatStr;} public DataTypes_base_fxt Select_FloatStr_(String v) {select_FloatStr = v; return this;} private String select_FloatStr; - public void RunAll(Db_provider provider) { - this.provider = provider; + public void RunAll(Db_conn conn) { + this.conn = conn; this.Select_hook(select_FloatStr); - provider.Conn_term(); + conn.Conn_term(); } public void Select_hook(String floatStr) { - DataRdr rdr = Db_qry_.select_tbl_("dbs_multiple_data_types").Exec_qry_as_rdr(provider); + DataRdr rdr = Db_qry_.select_tbl_("dbs_multiple_data_types").Exec_qry_as_rdr(conn); rdr.MoveNextPeer(); Tfds.Eq(rdr.ReadInt("unique_id"), 1); @@ -70,9 +70,9 @@ class DataTypes_base_fxt { Tfds.Eq_decimal(rdr.ReadDecimal("amount"), DecimalAdp_.parts_(12, 345)); } public void UpdateDate_hook() { - provider.Exec_qry(Db_qry_.update_("dbs_multiple_data_types", Db_crt_.eq_("unique_id", 1)).Arg_obj_("last_update", DateAdpClassXtn._.XtoDb(DateAdp_.parse_gplx("20091115 220000.000")))); + conn.Exec_qry(Db_qry_.update_("dbs_multiple_data_types", Db_crt_.eq_("unique_id", 1)).Arg_obj_("last_update", DateAdpClassXtn._.XtoDb(DateAdp_.parse_gplx("20091115 220000.000")))); - DataRdr rdr = Db_qry_.select_tbl_("dbs_multiple_data_types").Exec_qry_as_rdr(provider); + DataRdr rdr = Db_qry_.select_tbl_("dbs_multiple_data_types").Exec_qry_as_rdr(conn); rdr.MoveNextPeer(); Tfds.Eq_date(rdr.ReadDate("last_update"), DateAdp_.parse_gplx("20091115 220000.000")); } diff --git a/140_dbs/src_400_tdbs/gplx/dbs/TdbConnectInfo_tst.java b/140_dbs/src_400_tdbs/gplx/dbs/TdbConnectInfo_tst.java index 464920904..a4f5c738c 100644 --- a/140_dbs/src_400_tdbs/gplx/dbs/TdbConnectInfo_tst.java +++ b/140_dbs/src_400_tdbs/gplx/dbs/TdbConnectInfo_tst.java @@ -19,14 +19,14 @@ package gplx.dbs; import gplx.*; import org.junit.*; public class TdbConnectInfo_tst { @Test public void Full() { - Db_conn_info connectInfo = Db_conn_info_.parse_("gplx_key=tdb;url=C:\\dir\\xmpl.tdb;format=dsv;"); + Db_url connectInfo = Db_url_.parse_("gplx_key=tdb;url=C:\\dir\\xmpl.tdb;format=dsv;"); tst_Parse(connectInfo, Io_url_.new_any_("C:\\dir\\xmpl.tdb"), "dsv"); } @Test public void DefaultFormat() { - Db_conn_info connectInfo = Db_conn_info_.parse_("gplx_key=tdb;url=C:\\dir\\xmpl.tdb"); // dsv Format inferred + Db_url connectInfo = Db_url_.parse_("gplx_key=tdb;url=C:\\dir\\xmpl.tdb"); // dsv Format inferred tst_Parse(connectInfo, Io_url_.new_any_("C:\\dir\\xmpl.tdb"), "dsv"); } - void tst_Parse(Db_conn_info connectInfo, Io_url url, String format) { - Tfds.Eq(((Db_conn_info__tdb)connectInfo).Url(), url); + void tst_Parse(Db_url connectInfo, Io_url url, String format) { + Tfds.Eq(((Db_url__tdb)connectInfo).Url(), url); } } diff --git a/140_dbs/src_400_tdbs/gplx/dbs/TdbDatabase.java b/140_dbs/src_400_tdbs/gplx/dbs/TdbDatabase.java index 29dc94f96..6c428d985 100644 --- a/140_dbs/src_400_tdbs/gplx/dbs/TdbDatabase.java +++ b/140_dbs/src_400_tdbs/gplx/dbs/TdbDatabase.java @@ -43,5 +43,5 @@ public class TdbDatabase { } int FileId_next = TdbFile.MainFileId + 1; int TableId_next = 1; -// public static Io_url UrlOf(Db_conn_info url) {return Io_url_.new_any_(url.ServerName());} +// public static Io_url UrlOf(Db_url url) {return Io_url_.new_any_(url.ServerName());} } diff --git a/140_dbs/src_400_tdbs/gplx/dbs/TdbDelete.java b/140_dbs/src_400_tdbs/gplx/dbs/TdbDelete.java index 3c4ce3f6e..c3c66e931 100644 --- a/140_dbs/src_400_tdbs/gplx/dbs/TdbDelete.java +++ b/140_dbs/src_400_tdbs/gplx/dbs/TdbDelete.java @@ -21,7 +21,7 @@ import gplx.lists.*; /*GfoNde*/ class TdbDeleteWkr implements Db_qryWkr { public Object Exec(Db_engine engineObj, Db_qry cmdObj) { TdbEngine engine = TdbEngine.cast_(engineObj); Db_qry_delete cmd = (Db_qry_delete)cmdObj; - TdbTable tbl = engine.FetchTbl(cmd.BaseTable()); + TdbTable tbl = engine.FetchTbl(cmd.Base_table()); ListAdp deleted = ListAdp_.new_(); int rv = 0; if (cmd.Where() == Db_qry_.WhereAll) { @@ -29,7 +29,7 @@ class TdbDeleteWkr implements Db_qryWkr { tbl.Rows().Clear(); } else { - Criteria crt = cmd.Where().Crt(); + Criteria crt = cmd.Where(); for (int i = 0; i < tbl.Rows().Count(); i++) { GfoNde row = tbl.Rows().FetchAt_asGfoNde(i); if (crt.Matches(row)) diff --git a/140_dbs/src_400_tdbs/gplx/dbs/TdbEngine.java b/140_dbs/src_400_tdbs/gplx/dbs/TdbEngine.java index c07387565..9ed97ab4f 100644 --- a/140_dbs/src_400_tdbs/gplx/dbs/TdbEngine.java +++ b/140_dbs/src_400_tdbs/gplx/dbs/TdbEngine.java @@ -16,31 +16,32 @@ 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.*; class TdbEngine implements Db_engine { - public String Key() {return KeyDef;} public static final String KeyDef = "tdb"; - public String Conn_info_tid() {return this.Key();} - public Db_conn_info Conn_info() {return conn_info;} Db_conn_info conn_info; + public String Tid() {return Db_url__tdb.Tid_const;} + public Db_url Url() {return url;} private Db_url url; public TdbDatabase Db() {return db;} TdbDatabase db; public void Conn_open() { - String urlStr = (String)conn_info.Server(); - db = loadMgr.LoadTbls(Io_url_.new_any_(urlStr)); + Db_url__tdb tdb_url = (Db_url__tdb)url; + String url_str = tdb_url.Server(); + db = loadMgr.LoadTbls(Io_url_.new_any_(url_str)); } public void Conn_term() {} public void Txn_bgn() {} public void Txn_end() {} - public Db_engine Make_new(Db_conn_info conn_info) { + public Db_engine New_clone(Db_url url) { TdbEngine rv = new TdbEngine(); - rv.CtorTdbEngine(conn_info); + rv.CtorTdbEngine(url); return rv; } - public Object Execute(Db_qry cmd) { - Db_qryWkr wkr = (Db_qryWkr)wkrs.FetchOrFail(cmd.KeyOfDb_qry()); - return wkr.Exec(this, cmd); + public Object Exec_as_obj(Db_qry qry) { + Db_qryWkr wkr = (Db_qryWkr)wkrs.FetchOrFail(qry.Tid()); + return wkr.Exec(this, qry); } - public DataRdr NewDataRdr(java.sql.ResultSet rdr, String sql) {return DataRdr_.Null;} - public Db_stmt New_db_stmt(Db_provider provider, Db_qry qry) {return new Db_stmt_sql().Parse(Sql_cmd_wtr_.Ansi.XtoSqlQry(qry, true));} - public Object New_db_cmd(String sql) {throw Err_.not_implemented_();} - public Db_rdr New_db_rdr(Object o, String sql) {return Db_rdr_.Null;} + public Db_stmt New_stmt_prep(Db_qry qry) {return new Db_stmt_sql().Parse(qry, Sql_qry_wtr_.I.Xto_str(qry, true));} + public Object New_stmt_prep_as_obj(String sql) {throw Err_.not_implemented_();} + public Db_rdr New_rdr_by_obj(Object o, String sql) {return Db_rdr_.Null;} + public DataRdr New_rdr(java.sql.ResultSet rdr, String sql) {return DataRdr_.Null;} public TdbTable FetchTbl(String name) { TdbTable tbl = db.Tables().FetchOrFail(name); if (!tbl.IsLoaded()) loadMgr.LoadTbl(db, tbl); @@ -55,15 +56,23 @@ class TdbEngine implements Db_engine { HashAdp wkrs = HashAdp_.new_(); TdbDbLoadMgr loadMgr = TdbDbLoadMgr.new_(); TdbDbSaveMgr saveMgr = TdbDbSaveMgr.new_(); @gplx.Internal protected static final TdbEngine _ = new TdbEngine(); - //TdbEngine() {this.conn_info = TdbConnectUrl._;} - void CtorTdbEngine(Db_conn_info conn_info) { - this.conn_info = conn_info; - wkrs.Add(Db_qry_select.KeyConst, TdbSelectWkr._); - wkrs.Add(Db_qry_insert.KeyConst, TdbInsertWkr.new_()); - wkrs.Add(Db_qry_update.KeyConst, TdbUpdateWkr.new_()); - wkrs.Add(Db_qry_delete.KeyConst, TdbDeleteWkr.new_()); - wkrs.Add(Db_qry_flush.KeyConst, TdbFlushWkr.new_()); + void CtorTdbEngine(Db_url url) { + this.url = url; + wkrs.Add(Db_qry_.Tid_select, TdbSelectWkr._); + wkrs.Add(Db_qry_.Tid_insert, TdbInsertWkr.new_()); + wkrs.Add(Db_qry_.Tid_update, TdbUpdateWkr.new_()); + wkrs.Add(Db_qry_.Tid_delete, TdbDeleteWkr.new_()); + wkrs.Add(Db_qry_.Tid_flush, TdbFlushWkr.new_()); } public static TdbEngine as_(Object obj) {return obj instanceof TdbEngine ? (TdbEngine)obj : null;} public static TdbEngine cast_(Object obj) {try {return (TdbEngine)obj;} catch(Exception exc) {throw Err_.type_mismatch_exc_(exc, TdbEngine.class, obj);}} } +interface Db_qryWkr { + Object Exec(Db_engine engine, Db_qry cmd); +} +class Db_qryWkr_ { + public static final Db_qryWkr Null = new Db_qryWrk_null(); +} +class Db_qryWrk_null implements Db_qryWkr { + public Object Exec(Db_engine engine, Db_qry cmd) {return null;} +} diff --git a/140_dbs/src_400_tdbs/gplx/dbs/TdbFlush_tst.java b/140_dbs/src_400_tdbs/gplx/dbs/TdbFlush_tst.java index a01eb81da..60492683c 100644 --- a/140_dbs/src_400_tdbs/gplx/dbs/TdbFlush_tst.java +++ b/140_dbs/src_400_tdbs/gplx/dbs/TdbFlush_tst.java @@ -81,8 +81,8 @@ public class TdbFlush_tst { } class TdbEngineFxt { public TdbEngine run_MakeEngine(Io_url url) { - Db_conn_info connectInfo = Db_conn_info_.tdb_(url); - TdbEngine engine = (TdbEngine)TdbEngine._.Make_new(connectInfo); + Db_url connectInfo = Db_url_.tdb_(url); + TdbEngine engine = (TdbEngine)TdbEngine._.New_clone(connectInfo); engine.Conn_open(); return engine; } @@ -93,9 +93,9 @@ class TdbEngineFxt { return rv; } public void run_InsertRow(TdbEngine engine, String tblName, int idVal) { - Db_qry_insert cmd = Db_qry_insert.new_().BaseTable_(tblName); + Db_qry_insert cmd = new Db_qry_insert(tblName); cmd.Arg_("id", idVal); - engine.Execute(cmd); + engine.Exec_as_obj(cmd); } public void tst_FilesCount(TdbEngine engine, int count) {Tfds.Eq(engine.Db().Files().Count(), count);} diff --git a/140_dbs/src_400_tdbs/gplx/dbs/TdbInsert.java b/140_dbs/src_400_tdbs/gplx/dbs/TdbInsert.java index f24182979..7f50171c1 100644 --- a/140_dbs/src_400_tdbs/gplx/dbs/TdbInsert.java +++ b/140_dbs/src_400_tdbs/gplx/dbs/TdbInsert.java @@ -16,12 +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; import gplx.*; -import gplx.lists.*; /*GfoNde*/ +import gplx.lists.*; import gplx.dbs.sqls.*; class TdbInsertWkr implements Db_qryWkr { public Object Exec(Db_engine engineObj, Db_qry cmdObj) { TdbEngine engine = TdbEngine.cast_(engineObj); Db_qry_insert cmd = (Db_qry_insert)cmdObj; - TdbTable tbl = engine.FetchTbl(cmd.BaseTable()); + TdbTable tbl = engine.FetchTbl(cmd.Base_table()); tbl.IsDirty_set(true); return cmd.Select() == null ? InsertRowsByVals(engine, tbl, cmd) diff --git a/140_dbs/src_400_tdbs/gplx/dbs/TdbSelect.java b/140_dbs/src_400_tdbs/gplx/dbs/TdbSelect.java index 9815f7a77..36f08d4d3 100644 --- a/140_dbs/src_400_tdbs/gplx/dbs/TdbSelect.java +++ b/140_dbs/src_400_tdbs/gplx/dbs/TdbSelect.java @@ -16,12 +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; import gplx.*; -import gplx.criterias.*; +import gplx.criterias.*; import gplx.dbs.sqls.*; import gplx.lists.*; /*ComparerAble*/ import gplx.stores.*; /*GfoNdeRdr*/ class TdbSelectWkr implements Db_qryWkr { public Object Exec(Db_engine engineObj, Db_qry cmdObj) { TdbEngine engine = TdbEngine.cast_(engineObj); Db_qry_select cmd = (Db_qry_select)cmdObj; - if (cmd.From().Tbls().Count() > 1) throw Err_.new_key_("gplx.tdbs", "joins not supported for tdbs").Add("sql", cmd.XtoSql()); + if (cmd.From().Tbls().Count() > 1) throw Err_.new_key_("gplx.tdbs", "joins not supported for tdbs").Add("sql", cmd.Xto_sql()); TdbTable tbl = engine.FetchTbl(cmd.From().BaseTable().TblName()); GfoNdeList rv = (cmd.Where() == Db_qry_.WhereAll && cmd.Limit() == Db_qry_select.Limit_disabled) ? rv = tbl.Rows() : FilterRecords(tbl, cmd.Where().Crt(), cmd.Limit()); diff --git a/140_dbs/src_410_stores/gplx/stores/DbMaprMgr_tst.java b/140_dbs/src_410_stores/gplx/stores/DbMaprMgr_tst.java index 241f1d19d..08c388509 100644 --- a/140_dbs/src_410_stores/gplx/stores/DbMaprMgr_tst.java +++ b/140_dbs/src_410_stores/gplx/stores/DbMaprMgr_tst.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.stores; import gplx.*; import org.junit.*; -import gplx.dbs.*; /*Db_conn_info*/ +import gplx.dbs.*; /*Db_url*/ public class DbMaprMgr_tst { @Before public void setup() { mgr = DbMaprMgr.new_().RootIndexFlds_(DbMaprArg.new_("id", "disc_id")) @@ -37,42 +37,42 @@ public class DbMaprMgr_tst { . Flds_add(MockStream.id_idk, "stream_id").Flds_add(MockStream.name_idk, "stream_name") . ConstantFlds_add("stream_type", 1) ))); - wtr = DbMaprWtr.new_by_url_(Db_conn_info_.Test); + wtr = DbMaprWtr.new_by_url_(Db_url_.Test); wtr.EnvVars().Add(DbMaprWtr.Key_Mgr, mgr); - provider = Db_provider_pool._.Get_or_new(Db_conn_info_.Test); - Db_qry_fxt.DeleteAll(provider, "mock_discs", "mock_titles", "mock_chapters", "mock_streams"); - } DbMaprMgr mgr; DbMaprWtr wtr; Db_provider provider; MockDisc disc; MockTitle title; MockChapter chapter; MockStream audio, subtitle; SrlMgr rdr; + conn = Db_conn_pool_old._.Get_or_new(Db_url_.Test); + Db_qry_fxt.DeleteAll(conn, "mock_discs", "mock_titles", "mock_chapters", "mock_streams"); + } DbMaprMgr mgr; DbMaprWtr wtr; Db_conn conn; MockDisc disc; MockTitle title; MockChapter chapter; MockStream audio, subtitle; SrlMgr rdr; @Test public void PurgeObjTree() { disc = MockDisc.new_().Id_(1); - Db_qry_fxt.Insert_kvo(provider, "mock_discs", KeyValList.args_("disc_id", 1)); - DbMaprWtrUtl.PurgeObjTree(disc, mgr, provider); - Tfds.Eq(0, Db_qry_fxt.SelectAll_count(provider, "mock_discs")); + Db_qry_fxt.Insert_kvo(conn, "mock_discs", KeyValList.args_("disc_id", 1)); + DbMaprWtrUtl.PurgeObjTree(disc, mgr, conn); + Tfds.Eq(0, Db_qry_fxt.SelectAll_count(conn, "mock_discs")); } @Test public void PurgeObjTree_deep() { disc = MockDisc.new_().Id_(1); - Db_qry_fxt.Insert_kvo(provider, "mock_discs", KeyValList.args_("disc_id", 1)); - Db_qry_fxt.Insert_kvo(provider, "mock_titles", KeyValList.args_("disc_id", 1).Add("title_id", 1)); - Db_qry_fxt.Insert_kvo(provider, "mock_chapters", KeyValList.args_("disc_id", 1).Add("title_id", 2).Add("chapter_id", 3)); - Db_qry_fxt.Insert_kvo(provider, "mock_chapters", KeyValList.args_("disc_id", 2).Add("title_id", 2).Add("chapter_id", 3)); - DbMaprWtrUtl.PurgeObjTree(disc, mgr, provider); + Db_qry_fxt.Insert_kvo(conn, "mock_discs", KeyValList.args_("disc_id", 1)); + Db_qry_fxt.Insert_kvo(conn, "mock_titles", KeyValList.args_("disc_id", 1).Add("title_id", 1)); + Db_qry_fxt.Insert_kvo(conn, "mock_chapters", KeyValList.args_("disc_id", 1).Add("title_id", 2).Add("chapter_id", 3)); + Db_qry_fxt.Insert_kvo(conn, "mock_chapters", KeyValList.args_("disc_id", 2).Add("title_id", 2).Add("chapter_id", 3)); + DbMaprWtrUtl.PurgeObjTree(disc, mgr, conn); - Tfds.Eq(0, Db_qry_fxt.SelectAll_count(provider, "mock_discs")); - Tfds.Eq(0, Db_qry_fxt.SelectAll_count(provider, "mock_titles")); - Tfds.Eq(1, Db_qry_fxt.SelectAll_count(provider, "mock_chapters")); // ignore chapter with disc_id=2 + Tfds.Eq(0, Db_qry_fxt.SelectAll_count(conn, "mock_discs")); + Tfds.Eq(0, Db_qry_fxt.SelectAll_count(conn, "mock_titles")); + Tfds.Eq(1, Db_qry_fxt.SelectAll_count(conn, "mock_chapters")); // ignore chapter with disc_id=2 } @Test public void Save_root() { disc = MockDisc.new_().Id_(1).Name_("disc"); wtr.StoreRoot(disc, "mock_discs"); - Db_qry_fxt.tst_Select(provider, "mock_discs", DbTstRow.vals_only_(1, "disc")); + Db_qry_fxt.tst_Select(conn, "mock_discs", DbTstRow.vals_only_(1, "disc")); } @Test public void Save_subs() { disc = MockDisc.new_().Id_(1).Name_("disc"); title = MockTitle.new_().Id_(2).Name_("title").Disc_(disc); wtr.StoreRoot(disc, "mock_discs"); - Db_qry_fxt.tst_Select(provider, "mock_discs", DbTstRow.vals_only_(1, "disc")); - Db_qry_fxt.tst_Select(provider, "mock_titles", DbTstRow.vals_only_(1, 2, "title")); + Db_qry_fxt.tst_Select(conn, "mock_discs", DbTstRow.vals_only_(1, "disc")); + Db_qry_fxt.tst_Select(conn, "mock_titles", DbTstRow.vals_only_(1, 2, "title")); } @Test public void Save_deep() { disc = MockDisc.new_().Id_(1).Name_("disc"); @@ -82,17 +82,17 @@ public class DbMaprMgr_tst { subtitle = MockStream.new_().Id_(5).Name_("subtitle").Title_(title.Subtitles()); wtr.StoreRoot(disc, "mock_discs"); - Db_qry_fxt.tst_Select(provider, "mock_discs", DbTstRow.vals_only_(1, "disc")); - Db_qry_fxt.tst_Select(provider, "mock_titles", DbTstRow.vals_only_(1, 2, "title")); - Db_qry_fxt.tst_Select(provider, "mock_chapters", DbTstRow.vals_only_(1, 2, 3, "chap")); - Db_qry_fxt.tst_Select(provider, "mock_streams" + Db_qry_fxt.tst_Select(conn, "mock_discs", DbTstRow.vals_only_(1, "disc")); + Db_qry_fxt.tst_Select(conn, "mock_titles", DbTstRow.vals_only_(1, 2, "title")); + Db_qry_fxt.tst_Select(conn, "mock_chapters", DbTstRow.vals_only_(1, 2, 3, "chap")); + Db_qry_fxt.tst_Select(conn, "mock_streams" , DbTstRow.vals_only_(1, 2, null, 4, "audio") , DbTstRow.vals_only_(1, 2, null, 5, "subtitle") ); } @Test public void Load_root() { rdr = rdr_(); - Db_qry_fxt.Insert_kvo(provider, "mock_discs", KeyValList.args_("disc_id", 1).Add("disc_name", "name")); + Db_qry_fxt.Insert_kvo(conn, "mock_discs", KeyValList.args_("disc_id", 1).Add("disc_name", "name")); disc = (MockDisc)rdr.StoreRoot(MockDisc._, null); Tfds.Eq(1, disc.Id()); @@ -101,9 +101,9 @@ public class DbMaprMgr_tst { } @Test public void Load_subs() { rdr = rdr_(); - Db_qry_fxt.Insert_kvo(provider, "mock_discs", KeyValList.args_("disc_id", 1).Add("disc_name", "name")); - Db_qry_fxt.Insert_kvo(provider, "mock_titles", KeyValList.args_("disc_id", 1).Add("title_id", 1).Add("title_name", "title1")); - Db_qry_fxt.Insert_kvo(provider, "mock_titles", KeyValList.args_("disc_id", 1).Add("title_id", 2).Add("title_name", "title2")); + Db_qry_fxt.Insert_kvo(conn, "mock_discs", KeyValList.args_("disc_id", 1).Add("disc_name", "name")); + Db_qry_fxt.Insert_kvo(conn, "mock_titles", KeyValList.args_("disc_id", 1).Add("title_id", 1).Add("title_name", "title1")); + Db_qry_fxt.Insert_kvo(conn, "mock_titles", KeyValList.args_("disc_id", 1).Add("title_id", 2).Add("title_name", "title2")); disc = (MockDisc)rdr.StoreRoot(MockDisc._, null); Tfds.Eq(1, disc.Id()); @@ -114,11 +114,11 @@ public class DbMaprMgr_tst { } @Test public void Load_deep() { rdr = rdr_(); - Db_qry_fxt.Insert_kvo(provider, "mock_discs", KeyValList.args_("disc_id", 1).Add("disc_name", "name")); - Db_qry_fxt.Insert_kvo(provider, "mock_titles", KeyValList.args_("disc_id", 1).Add("title_id", 1).Add("title_name", "title1")); - Db_qry_fxt.Insert_kvo(provider, "mock_chapters", KeyValList.args_("disc_id", 1).Add("title_id", 1).Add("chapter_id", 3).Add("chapter_name", "chapter1")); - Db_qry_fxt.Insert_kvo(provider, "mock_streams", KeyValList.args_("disc_id", 1).Add("title_id", 1).Add("stream_id", 4).Add("stream_type", 0).Add("stream_name", "audio1")); - Db_qry_fxt.Insert_kvo(provider, "mock_streams", KeyValList.args_("disc_id", 1).Add("title_id", 1).Add("stream_id", 5).Add("stream_type", 1).Add("stream_name", "subtitle1")); + Db_qry_fxt.Insert_kvo(conn, "mock_discs", KeyValList.args_("disc_id", 1).Add("disc_name", "name")); + Db_qry_fxt.Insert_kvo(conn, "mock_titles", KeyValList.args_("disc_id", 1).Add("title_id", 1).Add("title_name", "title1")); + Db_qry_fxt.Insert_kvo(conn, "mock_chapters", KeyValList.args_("disc_id", 1).Add("title_id", 1).Add("chapter_id", 3).Add("chapter_name", "chapter1")); + Db_qry_fxt.Insert_kvo(conn, "mock_streams", KeyValList.args_("disc_id", 1).Add("title_id", 1).Add("stream_id", 4).Add("stream_type", 0).Add("stream_name", "audio1")); + Db_qry_fxt.Insert_kvo(conn, "mock_streams", KeyValList.args_("disc_id", 1).Add("title_id", 1).Add("stream_id", 5).Add("stream_type", 1).Add("stream_name", "subtitle1")); disc = (MockDisc)rdr.StoreRoot(MockDisc._, null); Tfds.Eq(1, disc.Id()); @@ -133,7 +133,7 @@ public class DbMaprMgr_tst { Tfds.Eq("subtitle1", ((MockStream)t.Subtitles().FetchAt(0)).Name()); } DbMaprRdr rdr_() { - DbMaprRdr rv = DbMaprRdr.new_(Db_conn_info_.Test, Db_crt_.eq_("disc_id", 1)); + DbMaprRdr rv = DbMaprRdr.new_(Db_url_.Test, Db_crt_.eq_("disc_id", 1)); rv.EnvVars().Add(DbMaprWtr.Key_Mgr, mgr); return rv; } diff --git a/140_dbs/src_410_stores/gplx/stores/DbMaprRdr.java b/140_dbs/src_410_stores/gplx/stores/DbMaprRdr.java index 3af5bdd70..9e31a34bf 100644 --- a/140_dbs/src_410_stores/gplx/stores/DbMaprRdr.java +++ b/140_dbs/src_410_stores/gplx/stores/DbMaprRdr.java @@ -80,7 +80,7 @@ public class DbMaprRdr extends DataRdr_base implements SrlMgr { if (tblByRootCrt == null) { DataRdr dbRdr = null; try { - dbRdr = Db_qry_.select_().From_(mapr.TableName()).Where_(rootCrt).Exec_qry_as_rdr(provider); + dbRdr = Db_qry_.select_().From_(mapr.TableName()).Where_(rootCrt).Exec_qry_as_rdr(conn); tblByRootCrt = GfoNde_.rdr_(dbRdr); } finally {dbRdr.Rls();} @@ -112,11 +112,11 @@ public class DbMaprRdr extends DataRdr_base implements SrlMgr { @Override public KeyVal KeyValAt(int i) {throw Err_.not_implemented_();} @Override public SrlMgr SrlMgr_new(Object o) {return new DbMaprRdr();} HashAdp tables = HashAdp_.new_(); - Db_provider provider; Criteria rootCrt; + Db_conn conn; Criteria rootCrt; DbMaprMgr mgr; ListAdp rowStack = ListAdp_.new_(); - public static DbMaprRdr new_(Db_conn_info dbInfo, Criteria rootCrt) { + public static DbMaprRdr new_(Db_url dbInfo, Criteria rootCrt) { DbMaprRdr rv = new DbMaprRdr(); - rv.provider = Db_provider_pool._.Get_or_new(dbInfo); rv.rootCrt = rootCrt; + rv.conn = Db_conn_pool_old._.Get_or_new(dbInfo); rv.rootCrt = rootCrt; return rv; } DbMaprRdr() {} } \ No newline at end of file diff --git a/140_dbs/src_410_stores/gplx/stores/DbMaprWtr.java b/140_dbs/src_410_stores/gplx/stores/DbMaprWtr.java index 61bbc6af1..5c5041672 100644 --- a/140_dbs/src_410_stores/gplx/stores/DbMaprWtr.java +++ b/140_dbs/src_410_stores/gplx/stores/DbMaprWtr.java @@ -21,7 +21,7 @@ public class DbMaprWtr extends DataWtr_base implements DataWtr { public void InitWtr(String key, Object val) {} @Override public Object StoreRoot(SrlObj root, String key) { mgr = (DbMaprMgr)this.EnvVars().FetchOrFail(DbMaprWtr.Key_Mgr); - DbMaprWtrUtl.PurgeObjTree(root, mgr, provider); + DbMaprWtrUtl.PurgeObjTree(root, mgr, conn); WriteGfoObj(root, mgr.Root()); mgr.Clear(); return null; @@ -56,7 +56,7 @@ public class DbMaprWtr extends DataWtr_base implements DataWtr { } } @Override public void WriteNodeBgn(String v) { - if (insertCmd != null) insertCmd.Exec_qry(provider); // occurs for nodes; ex: new title starts; commit changes for own disc + if (insertCmd != null) insertCmd.Exec_qry(conn); // occurs for nodes; ex: new title starts; commit changes for own disc curTableName = v; insertCmd = null; } @@ -73,7 +73,7 @@ public class DbMaprWtr extends DataWtr_base implements DataWtr { insertCmd.Arg_obj_(fld, val); } @Override public void WriteNodeEnd() { - if (insertCmd != null) insertCmd.Exec_qry(provider); // occurs for nodes and leaves; for nodes, insertCmd will be null (committed by last leaf) + if (insertCmd != null) insertCmd.Exec_qry(conn); // occurs for nodes and leaves; for nodes, insertCmd will be null (committed by last leaf) insertCmd = null; } public void WriteTableBgn(String name, GfoFldList fields) {} @@ -82,18 +82,18 @@ public class DbMaprWtr extends DataWtr_base implements DataWtr { public void Clear() {} public String XtoStr() {return "";} @Override public SrlMgr SrlMgr_new(Object o) {return new DbMaprWtr();} - DbMaprMgr mgr; Db_provider provider; String curTableName; Db_qry_insert insertCmd; - public static DbMaprWtr new_by_url_(Db_conn_info url) { + DbMaprMgr mgr; Db_conn conn; String curTableName; Db_qry_insert insertCmd; + public static DbMaprWtr new_by_url_(Db_url url) { DbMaprWtr rv = new DbMaprWtr(); - rv.provider = Db_provider_pool._.Get_or_new(url); + rv.conn = Db_conn_pool_old._.Get_or_new(url); return rv; } DbMaprWtr() {} public static final String Key_Mgr = "DbMapr.mgr"; } class DbMaprWtrUtl { - public static void PurgeObjTree(SrlObj root, DbMaprMgr mgr, Db_provider provider) { + public static void PurgeObjTree(SrlObj root, DbMaprMgr mgr, Db_conn conn) { Criteria crt = MakeCriteria(root, mgr.RootIndexFlds()); - PurgeObj(mgr.Root(), crt, provider); + PurgeObj(mgr.Root(), crt, conn); } static Criteria MakeCriteria(SrlObj root, DbMaprArg[] objRootIdxFlds) { Criteria rv = null; @@ -104,11 +104,11 @@ class DbMaprWtrUtl { } return rv; } - static void PurgeObj(DbMaprItm mapr, Criteria crt, Db_provider provider) { - Db_qry_.delete_(mapr.TableName(), crt).Exec_qry(provider); + static void PurgeObj(DbMaprItm mapr, Criteria crt, Db_conn conn) { + Db_qry_.delete_(mapr.TableName(), crt).Exec_qry(conn); for (Object subObj : mapr.Subs()) { DbMaprItm sub = (DbMaprItm)subObj; - PurgeObj(sub, crt, provider); + PurgeObj(sub, crt, conn); } } } diff --git a/140_dbs/tst/gplx/dbs/AnsiSqlWtr_tst.java b/140_dbs/tst/gplx/dbs/AnsiSqlWtr_tst.java index 8a8b4dd39..4d085684d 100644 --- a/140_dbs/tst/gplx/dbs/AnsiSqlWtr_tst.java +++ b/140_dbs/tst/gplx/dbs/AnsiSqlWtr_tst.java @@ -17,9 +17,9 @@ along with this program. If not, see . */ package gplx.dbs; import gplx.*; import org.junit.*; -import gplx.criterias.*; +import gplx.criterias.*; import gplx.dbs.sqls.*; public class AnsiSqlWtr_tst { - Sql_cmd_wtr sqlWtr = Sql_cmd_wtr_ansi_.default_(); + Sql_qry_wtr sqlWtr = Sql_qry_wtr_.new_ansi(); @Test public void Insert() { tst_XtoSql ( Db_qry_.insert_("people").Arg_("id", 1).Arg_("name", "me") @@ -95,5 +95,5 @@ public class AnsiSqlWtr_tst { ); } void tst_XtoSql(Db_qry cmd, String expd) {tst_XtoSql(cmd, expd, false);} - void tst_XtoSql(Db_qry cmd, String expd, boolean prepare) {Tfds.Eq(expd, sqlWtr.XtoSqlQry(cmd, prepare));} + void tst_XtoSql(Db_qry cmd, String expd, boolean prepare) {Tfds.Eq(expd, sqlWtr.Xto_str(cmd, prepare));} } diff --git a/140_dbs/tst/gplx/dbs/Db_conn_fxt.java b/140_dbs/tst/gplx/dbs/Db_conn_fxt.java new file mode 100644 index 000000000..c96b50ca7 --- /dev/null +++ b/140_dbs/tst/gplx/dbs/Db_conn_fxt.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.*; +public class Db_conn_fxt implements RlsAble { + public Db_conn Conn() {return conn;} public Db_conn_fxt Conn_(Db_conn v) {conn = v; return this;} Db_conn conn; + public void DmlAffectedAvailable_(boolean v) {dmlAffectedAvailable = v;} private boolean dmlAffectedAvailable = true; + public void ini_DeleteAll(String tbl) {conn.Exec_qry(Db_qry_.delete_tbl_(tbl));} + public void tst_ExecDml(int expd, Db_qry qry) { + int actl = conn.Exec_qry(qry); + if (dmlAffectedAvailable) + Tfds.Eq(expd, actl, "Exec_qry failed: sql={0}", qry.Xto_sql()); + } + public void tst_ExecRdrTbl(int expd, String tblName) {tst_ExecRdr(expd, Db_qry_.select_tbl_(tblName));} + public void tst_ExecRdr(int expd, Db_qry qry) { + DataRdr rdr = DataRdr_.Null; + try { + rdr = conn.Exec_qry_as_rdr(qry); + tbl = GfoNde_.rdr_(rdr); + } + catch (Exception e) {Err_.Noop(e); rdr.Rls();} + Tfds.Eq(expd, tbl.Subs().Count(), "Exec_qry_as_rdr failed: sql={0}", qry.Xto_sql()); + } GfoNde tbl; + public GfoNde tst_RowAry(int index, Object... expdValAry) { + GfoNde record = tbl.Subs().FetchAt_asGfoNde(index); + Object[] actlValAry = new Object[expdValAry.length]; + for (int i = 0; i < actlValAry.length; i++) + actlValAry[i] = record.ReadAt(i); + Tfds.Eq_ary(actlValAry, expdValAry); + return record; + } + public void Rls() {conn.Conn_term();} + + public static Db_conn Mysql() {return Db_conn_.new_and_open_(Db_url__mysql.new_("127.0.0.1", "unit_tests", "gplx_user", "gplx_password"));} + public static Db_conn Tdb(String fileName) {return Db_conn_.new_and_open_(Db_url_.tdb_(Tfds.RscDir.GenSubDir_nest("140_dbs", "tdbs").GenSubFil(fileName)));} + public static Db_conn Postgres() {return Db_conn_.new_and_open_(Db_url__postgres.new_("127.0.0.1", "unit_tests", "gplx_user", "gplx_password"));} + public static Db_conn Sqlite() {return Db_conn_.new_and_open_(Db_url__sqlite.load_(Tfds.RscDir.GenSubFil_nest("140_dbs", "sqlite", "unit_tests.db")));} +// public static Db_conn Mssql() {return MssqlConnectUrl.WindowsAuth(".", "unit_tests"); + public static final boolean SkipPostgres = Tfds.SkipDb || true; +} \ No newline at end of file diff --git a/140_dbs/tst/gplx/dbs/Db_qry_fxt.java b/140_dbs/tst/gplx/dbs/Db_qry_fxt.java index 3c82b5936..ff5fa67d8 100644 --- a/140_dbs/tst/gplx/dbs/Db_qry_fxt.java +++ b/140_dbs/tst/gplx/dbs/Db_qry_fxt.java @@ -17,27 +17,27 @@ along with this program. If not, see . */ package gplx.dbs; import gplx.*; public class Db_qry_fxt { - public static void Insert_kvo(Db_provider provider, String tblName, KeyValList kvList) { + public static void Insert_kvo(Db_conn conn, String tblName, KeyValList kvList) { Db_qry_insert qry = Db_qry_.insert_(tblName); for (int i = 0; i < kvList.Count(); i++) { KeyVal kv = kvList.GetAt(i); qry.Arg_obj_(kv.Key(), kv.Val()); } - qry.Exec_qry(provider); + qry.Exec_qry(conn); } - public static GfoNde SelectAll(Db_provider provider, String tblName) { - return Db_qry_.select_tbl_(tblName).ExecRdr_nde(provider); + public static GfoNde SelectAll(Db_conn conn, String tblName) { + return Db_qry_.select_tbl_(tblName).ExecRdr_nde(conn); } - public static int SelectAll_count(Db_provider provider, String tblName) { - GfoNde nde = Db_qry_fxt.SelectAll(provider, tblName); + public static int SelectAll_count(Db_conn conn, String tblName) { + GfoNde nde = Db_qry_fxt.SelectAll(conn, tblName); return nde.Subs().Count(); } - public static void DeleteAll(Db_provider provider, String... ary) { + public static void DeleteAll(Db_conn conn, String... ary) { for (String s : ary) - Db_qry_.delete_tbl_(s).Exec_qry(provider); + Db_qry_.delete_tbl_(s).Exec_qry(conn); } - public static void tst_Select(Db_provider provider, String tblName, DbTstRow... expdAry) { - GfoNde nde = Db_qry_fxt.SelectAll(provider, tblName); + public static void tst_Select(Db_conn conn, String tblName, DbTstRow... expdAry) { + GfoNde nde = Db_qry_fxt.SelectAll(conn, tblName); int len = Array_.Len(expdAry); for (int i = 0; i < len; i++) { DbTstRow expdRow = expdAry[i]; diff --git a/140_dbs/tst/gplx/dbs/IoSqlCriteriaWriter_tst.java b/140_dbs/tst/gplx/dbs/IoSqlCriteriaWriter_tst.java index 05ecaeb69..9f7e198c3 100644 --- a/140_dbs/tst/gplx/dbs/IoSqlCriteriaWriter_tst.java +++ b/140_dbs/tst/gplx/dbs/IoSqlCriteriaWriter_tst.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.dbs; import gplx.*; import org.junit.*; import gplx.criterias.*; /*Criteria_base*/ -import gplx.ios.*; +import gplx.ios.*; import gplx.dbs.sqls.*; public class IoSqlCriteriaWriter_tst { @Test public void Type() { fld = IoItm_base_.Prop_Type; @@ -53,8 +53,8 @@ public class IoSqlCriteriaWriter_tst { String fld; void tst_Write(String expd, Criteria crt) { String_bldr sb = String_bldr_.new_(); - Sql_cmd_wtr whereWtr = Sql_cmd_wtr_ansi_.default_(); - whereWtr.BldWhere(sb, crt); + Sql_qry_wtr_ansi whereWtr = (Sql_qry_wtr_ansi)Sql_qry_wtr_.new_ansi(); + whereWtr.Bld_where(sb, crt); Tfds.Eq(expd, sb.XtoStr()); } } diff --git a/140_dbs/tst/gplx/dbs/PoolIds_tst.java b/140_dbs/tst/gplx/dbs/PoolIds_tst.java index 479ec6ec6..2a472b740 100644 --- a/140_dbs/tst/gplx/dbs/PoolIds_tst.java +++ b/140_dbs/tst/gplx/dbs/PoolIds_tst.java @@ -19,8 +19,8 @@ package gplx.dbs; import gplx.*; import org.junit.*; public class PoolIds_tst { @Before public void setup() { - provider = Db_provider_pool._.Get_or_new(Db_conn_info_.Test); - Db_qry_fxt.DeleteAll(provider, PoolIds.Tbl_Name); + conn = Db_conn_pool_old._.Get_or_new(Db_url_.Test); + Db_qry_fxt.DeleteAll(conn, PoolIds.Tbl_Name); mgr = PoolIds._; } @Test public void FetchNextId() { @@ -45,12 +45,12 @@ public class PoolIds_tst { tst_Fetch("/test1", 1); } void run_Change(String url, int expd) { - mgr.Commit(provider, url, expd); + mgr.Commit(conn, url, expd); } void tst_Fetch(String url, int expd) { - int actl = mgr.FetchNext(provider, url); + int actl = mgr.FetchNext(conn, url); Tfds.Eq(expd, actl); } - Db_provider provider; + Db_conn conn; PoolIds mgr; } diff --git a/140_dbs/tst/gplx/dbs/groupBys/GroupBys_base_tst.java b/140_dbs/tst/gplx/dbs/groupBys/GroupBys_base_tst.java index 097424ea7..c277bc65e 100644 --- a/140_dbs/tst/gplx/dbs/groupBys/GroupBys_base_tst.java +++ b/140_dbs/tst/gplx/dbs/groupBys/GroupBys_base_tst.java @@ -18,41 +18,41 @@ along with this program. If not, see . package gplx.dbs.groupBys; import gplx.*; import gplx.dbs.*; import org.junit.*; public abstract class GroupBys_base_tst { - protected abstract Db_provider provider_(); - protected Db_provider provider; + protected abstract Db_conn provider_(); + protected Db_conn conn; @Before public void setup() { - provider = provider_(); - Db_qry_.delete_tbl_("dbs_group_bys").Exec_qry(provider); + conn = provider_(); + Db_qry_.delete_tbl_("dbs_group_bys").Exec_qry(conn); } @After public void teardown() { - provider.Conn_term(); + conn.Conn_term(); } protected void GroupBy_1fld_hook() { - provider.Exec_qry(Db_qry_.insert_("dbs_group_bys").Arg_("key1", "a").Arg_("val_int", 1)); - provider.Exec_qry(Db_qry_.insert_("dbs_group_bys").Arg_("key1", "a").Arg_("val_int", 2)); + conn.Exec_qry(Db_qry_.insert_("dbs_group_bys").Arg_("key1", "a").Arg_("val_int", 1)); + conn.Exec_qry(Db_qry_.insert_("dbs_group_bys").Arg_("key1", "a").Arg_("val_int", 2)); DataRdr rdr = Db_qry_.select_().From_("dbs_group_bys") .Cols_("key1") .GroupBy_("key1") - .Exec_qry_as_rdr(provider); + .Exec_qry_as_rdr(conn); GfoNde nde = GfoNde_.rdr_(rdr); GfoNdeTstr.tst_ValsByCol(nde, "key1", "a"); } protected void GroupBy_2fld_hook() { - provider.Exec_qry(Db_qry_.insert_("dbs_group_bys").Arg_("key1", "a").Arg_("key2", "b").Arg_("val_int", 1)); - provider.Exec_qry(Db_qry_.insert_("dbs_group_bys").Arg_("key1", "a").Arg_("key2", "b").Arg_("val_int", 2)); + conn.Exec_qry(Db_qry_.insert_("dbs_group_bys").Arg_("key1", "a").Arg_("key2", "b").Arg_("val_int", 1)); + conn.Exec_qry(Db_qry_.insert_("dbs_group_bys").Arg_("key1", "a").Arg_("key2", "b").Arg_("val_int", 2)); DataRdr rdr = Db_qry_.select_().From_("dbs_group_bys") .Cols_("key1", "key2") .GroupBy_("key1", "key2") - .Exec_qry_as_rdr(provider); + .Exec_qry_as_rdr(conn); GfoNde nde = GfoNde_.rdr_(rdr); GfoNdeTstr.tst_ValsByCol(nde, "key1", "a"); GfoNdeTstr.tst_ValsByCol(nde, "key2", "b"); } protected void MinMax_hook(boolean min) { - provider.Exec_qry(Db_qry_.insert_("dbs_group_bys").Arg_("key1", "a").Arg_("val_int", 1)); - provider.Exec_qry(Db_qry_.insert_("dbs_group_bys").Arg_("key1", "a").Arg_("val_int", 2)); + conn.Exec_qry(Db_qry_.insert_("dbs_group_bys").Arg_("key1", "a").Arg_("val_int", 1)); + conn.Exec_qry(Db_qry_.insert_("dbs_group_bys").Arg_("key1", "a").Arg_("val_int", 2)); Db_qry_select qry = Db_qry_.select_().From_("dbs_group_bys") .Cols_("key1") @@ -63,31 +63,31 @@ public abstract class GroupBys_base_tst { else qry.Cols_groupBy_max("val_int", "val_int_func"); - DataRdr rdr = qry.Exec_qry_as_rdr(provider); + DataRdr rdr = qry.Exec_qry_as_rdr(conn); GfoNde nde = GfoNde_.rdr_(rdr); GfoNdeTstr.tst_ValsByCol(nde, "key1", "a"); GfoNdeTstr.tst_ValsByCol(nde, "val_int_func", expd); } protected void Count_hook() { - provider.Exec_qry(Db_qry_.insert_("dbs_group_bys").Arg_("key1", "a").Arg_("val_int", 10)); - provider.Exec_qry(Db_qry_.insert_("dbs_group_bys").Arg_("key1", "a").Arg_("val_int", 20)); + conn.Exec_qry(Db_qry_.insert_("dbs_group_bys").Arg_("key1", "a").Arg_("val_int", 10)); + conn.Exec_qry(Db_qry_.insert_("dbs_group_bys").Arg_("key1", "a").Arg_("val_int", 20)); DataRdr rdr = Db_qry_.select_().From_("dbs_group_bys") .Cols_("key1").Cols_groupBy_count("val_int", "val_int_func") .GroupBy_("key1") - .Exec_qry_as_rdr(provider); + .Exec_qry_as_rdr(conn); GfoNde nde = GfoNde_.rdr_(rdr); GfoNdeTstr.tst_ValsByCol(nde, "key1", "a"); GfoNdeTstr.tst_ValsByCol(nde, "val_int_func", 2); } protected void Sum_hook() { - provider.Exec_qry(Db_qry_.insert_("dbs_group_bys").Arg_("key1", "a").Arg_("val_int", 10)); - provider.Exec_qry(Db_qry_.insert_("dbs_group_bys").Arg_("key1", "a").Arg_("val_int", 20)); + conn.Exec_qry(Db_qry_.insert_("dbs_group_bys").Arg_("key1", "a").Arg_("val_int", 10)); + conn.Exec_qry(Db_qry_.insert_("dbs_group_bys").Arg_("key1", "a").Arg_("val_int", 20)); DataRdr rdr = Db_qry_.select_().From_("dbs_group_bys") .Cols_("key1").Cols_groupBy_sum("val_int", "val_int_func") .GroupBy_("key1") - .Exec_qry_as_rdr(provider); + .Exec_qry_as_rdr(conn); GfoNde nde = GfoNde_.rdr_(rdr); GfoNdeTstr.tst_ValsByCol(nde, "key1", "a"); GfoNdeTstr.tst_ValsByCol(nde, "val_int_func", 30); diff --git a/140_dbs/tst/gplx/dbs/groupBys/GroupBys_mysql_tst.java b/140_dbs/tst/gplx/dbs/groupBys/GroupBys_mysql_tst.java index b20817a9b..ed168dbe8 100644 --- a/140_dbs/tst/gplx/dbs/groupBys/GroupBys_mysql_tst.java +++ b/140_dbs/tst/gplx/dbs/groupBys/GroupBys_mysql_tst.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.dbs.groupBys; import gplx.*; import gplx.dbs.*; import org.junit.*; public class GroupBys_mysql_tst extends GroupBys_base_tst { - @Override protected Db_provider provider_() {return Db_provider_fxt.Mysql();} + @Override protected Db_conn provider_() {return Db_conn_fxt.Mysql();} @Test public void GroupBy_1fld() {super.GroupBy_1fld_hook();} @Test public void GroupBy_2fld() {super.GroupBy_2fld_hook();} @Test public void Min() {super.MinMax_hook(true);} diff --git a/140_dbs/tst/gplx/dbs/groupBys/GroupBys_tdb_tst.java b/140_dbs/tst/gplx/dbs/groupBys/GroupBys_tdb_tst.java index 92ad1e872..010172bf7 100644 --- a/140_dbs/tst/gplx/dbs/groupBys/GroupBys_tdb_tst.java +++ b/140_dbs/tst/gplx/dbs/groupBys/GroupBys_tdb_tst.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.dbs.groupBys; import gplx.*; import gplx.dbs.*; import org.junit.*; public class GroupBys_tdb_tst extends GroupBys_base_tst { - @Override protected Db_provider provider_() {return Db_provider_fxt.Tdb("130_dbs_group_bys.dsv");} + @Override protected Db_conn provider_() {return Db_conn_fxt.Tdb("130_dbs_group_bys.dsv");} @Test public void GroupBy_1fld() {super.GroupBy_1fld_hook();} @Test public void GroupBy_2fld() {super.GroupBy_2fld_hook();} @Test public void Min() {super.MinMax_hook(true);} diff --git a/140_dbs/tst/gplx/dbs/insertIntos/InsertIntos_base_tst.java b/140_dbs/tst/gplx/dbs/insertIntos/InsertIntos_base_tst.java index dbbbbeae4..a92892e12 100644 --- a/140_dbs/tst/gplx/dbs/insertIntos/InsertIntos_base_tst.java +++ b/140_dbs/tst/gplx/dbs/insertIntos/InsertIntos_base_tst.java @@ -18,42 +18,42 @@ along with this program. If not, see . package gplx.dbs.insertIntos; import gplx.*; import gplx.dbs.*; import org.junit.*; public abstract class InsertIntos_base_tst { - protected abstract Db_provider provider_(); - protected Db_provider provider; + protected abstract Db_conn provider_(); + protected Db_conn conn; @Before public void setup() { - provider = provider_(); - provider.Exec_qry(Db_qry_delete.new_().BaseTable_("dbs_group_bys")); - provider.Exec_qry(Db_qry_delete.new_().BaseTable_("dbs_insert_intos")); + conn = provider_(); + conn.Exec_qry(Db_qry_delete.new_("dbs_group_bys")); + conn.Exec_qry(Db_qry_delete.new_("dbs_insert_intos")); } @After public void teardown() { - provider.Conn_term(); + conn.Conn_term(); } protected void Select_hook() { - provider.Exec_qry(Db_qry_.insert_("dbs_group_bys").Arg_("key1", "a").Arg_("val_int", 1)); + conn.Exec_qry(Db_qry_.insert_("dbs_group_bys").Arg_("key1", "a").Arg_("val_int", 1)); - provider.Exec_qry + conn.Exec_qry (Db_qry_.insert_("dbs_insert_intos") .Cols_("key1", "val_int") .Select_ ( Db_qry_select.new_().Cols_("key1", "val_int").From_("dbs_group_bys") ) ); - DataRdr rdr = provider.Exec_qry_as_rdr(Db_qry_select.new_().Cols_("key1", "val_int").From_("dbs_insert_intos")); + DataRdr rdr = conn.Exec_qry_as_rdr(Db_qry_select.new_().Cols_("key1", "val_int").From_("dbs_insert_intos")); GfoNde nde = GfoNde_.rdr_(rdr); GfoNdeTstr.tst_ValsByCol(nde, "key1", "a"); } protected void GroupBy_hook() { - provider.Exec_qry(Db_qry_.insert_("dbs_group_bys").Arg_("key1", "a").Arg_("val_int", 1)); - provider.Exec_qry(Db_qry_.insert_("dbs_group_bys").Arg_("key1", "a").Arg_("val_int", 2)); + conn.Exec_qry(Db_qry_.insert_("dbs_group_bys").Arg_("key1", "a").Arg_("val_int", 1)); + conn.Exec_qry(Db_qry_.insert_("dbs_group_bys").Arg_("key1", "a").Arg_("val_int", 2)); - provider.Exec_qry + conn.Exec_qry (Db_qry_.insert_("dbs_insert_intos") .Cols_("key1", "val_int") .Select_ ( Db_qry_select.new_().Cols_("key1").Cols_groupBy_sum("val_int", "val_int_func") .From_("dbs_group_bys").GroupBy_("key1") )); - DataRdr rdr = provider.Exec_qry_as_rdr(Db_qry_select.new_().Cols_("key1", "val_int").From_("dbs_insert_intos")); + DataRdr rdr = conn.Exec_qry_as_rdr(Db_qry_select.new_().Cols_("key1", "val_int").From_("dbs_insert_intos")); GfoNde nde = GfoNde_.rdr_(rdr); GfoNdeTstr.tst_ValsByCol(nde, "val_int", 3); } diff --git a/140_dbs/tst/gplx/dbs/insertIntos/InsertIntos_mysql_tst.java b/140_dbs/tst/gplx/dbs/insertIntos/InsertIntos_mysql_tst.java index cbc2dca6f..bfa857361 100644 --- a/140_dbs/tst/gplx/dbs/insertIntos/InsertIntos_mysql_tst.java +++ b/140_dbs/tst/gplx/dbs/insertIntos/InsertIntos_mysql_tst.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.dbs.insertIntos; import gplx.*; import gplx.dbs.*; import org.junit.*; public class InsertIntos_mysql_tst extends InsertIntos_base_tst { - @Override protected Db_provider provider_() {return Db_provider_fxt.Mysql();} + @Override protected Db_conn provider_() {return Db_conn_fxt.Mysql();} @Test public void Select() {super.Select_hook();} @Test public void GroupBy() {super.GroupBy_hook();} } diff --git a/140_dbs/tst/gplx/dbs/insertIntos/InsertIntos_tdb_tst.java b/140_dbs/tst/gplx/dbs/insertIntos/InsertIntos_tdb_tst.java index 3789be2db..64faf5866 100644 --- a/140_dbs/tst/gplx/dbs/insertIntos/InsertIntos_tdb_tst.java +++ b/140_dbs/tst/gplx/dbs/insertIntos/InsertIntos_tdb_tst.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.dbs.insertIntos; import gplx.*; import gplx.dbs.*; import org.junit.*; public class InsertIntos_tdb_tst extends InsertIntos_base_tst { - @Override protected Db_provider provider_() {return Db_provider_fxt.Tdb("140_dbs_insert_intos.dsv");} + @Override protected Db_conn provider_() {return Db_conn_fxt.Tdb("140_dbs_insert_intos.dsv");} @Test public void Select() {super.Select_hook();} @Test public void GroupBy() {super.GroupBy_hook();} } diff --git a/140_dbs/tst/gplx/dbs/joins/Joins_base_tst.java b/140_dbs/tst/gplx/dbs/joins/Joins_base_tst.java index ab4dafb43..931ac25da 100644 --- a/140_dbs/tst/gplx/dbs/joins/Joins_base_tst.java +++ b/140_dbs/tst/gplx/dbs/joins/Joins_base_tst.java @@ -16,29 +16,29 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.dbs.joins; import gplx.*; import gplx.dbs.*; -import org.junit.*; +import org.junit.*; import gplx.dbs.sqls.*; public abstract class Joins_base_tst { - protected Db_provider provider; + protected Db_conn conn; @Before public void setup() { - provider = provider_(); - Db_qry_delete.new_().BaseTable_("dbs_crud_ops").Exec_qry(provider); - Db_qry_delete.new_().BaseTable_("dbs_join1").Exec_qry(provider); + conn = provider_(); + Db_qry_delete.new_("dbs_crud_ops").Exec_qry(conn); + Db_qry_delete.new_("dbs_join1").Exec_qry(conn); } @After public void teardown() { - provider.Conn_term(); + conn.Conn_term(); } protected void InnerJoin_hook() { - provider.Exec_qry(Db_qry_insert.new_().BaseTable_("dbs_crud_ops").Arg_("id", 0).Arg_("name", "me")); - provider.Exec_qry(Db_qry_insert.new_().BaseTable_("dbs_crud_ops").Arg_("id", 1).Arg_("name", "you")); - provider.Exec_qry(Db_qry_insert.new_().BaseTable_("dbs_join1").Arg_("join_id", 0).Arg_("join_data", "data0")); - provider.Exec_qry(Db_qry_insert.new_().BaseTable_("dbs_join1").Arg_("join_id", 1).Arg_("join_data", "data1")); + conn.Exec_qry(new Db_qry_insert("dbs_crud_ops").Arg_("id", 0).Arg_("name", "me")); + conn.Exec_qry(new Db_qry_insert("dbs_crud_ops").Arg_("id", 1).Arg_("name", "you")); + conn.Exec_qry(new Db_qry_insert("dbs_join1").Arg_("join_id", 0).Arg_("join_data", "data0")); + conn.Exec_qry(new Db_qry_insert("dbs_join1").Arg_("join_id", 1).Arg_("join_data", "data1")); Db_qry_select select = Db_qry_select.new_().From_("dbs_crud_ops").Join_("dbs_join1", "j1", Sql_join_itm.new_("join_id", "dbs_crud_ops", "id")).Cols_("id", "name", "join_data"); - DataRdr rdr = provider.Exec_qry_as_rdr(select); + DataRdr rdr = conn.Exec_qry_as_rdr(select); GfoNde table = GfoNde_.rdr_(rdr); Tfds.Eq(table.Subs().Count(), 2); Tfds.Eq(table.Subs().FetchAt_asGfoNde(0).Read("join_data"), "data0"); Tfds.Eq(table.Subs().FetchAt_asGfoNde(1).Read("join_data"), "data1"); } - protected abstract Db_provider provider_(); + protected abstract Db_conn provider_(); } diff --git a/140_dbs/tst/gplx/dbs/joins/Joins_tdb_tst.java b/140_dbs/tst/gplx/dbs/joins/Joins_tdb_tst.java index 34b8ae367..dbc39cc2d 100644 --- a/140_dbs/tst/gplx/dbs/joins/Joins_tdb_tst.java +++ b/140_dbs/tst/gplx/dbs/joins/Joins_tdb_tst.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.dbs.joins; import gplx.*; import gplx.dbs.*; import org.junit.*; public class Joins_tdb_tst extends Joins_base_tst { - @Override protected Db_provider provider_() {return Db_provider_fxt.Tdb("120_dbs_joins.dsv");} + @Override protected Db_conn provider_() {return Db_conn_fxt.Tdb("120_dbs_joins.dsv");} @Test public void InnerJoin() { try { InnerJoin_hook(); diff --git a/140_dbs/tst/gplx/dbs/orderBys/OrderBys_base_tst.java b/140_dbs/tst/gplx/dbs/orderBys/OrderBys_base_tst.java index 01ce53b99..32a627a46 100644 --- a/140_dbs/tst/gplx/dbs/orderBys/OrderBys_base_tst.java +++ b/140_dbs/tst/gplx/dbs/orderBys/OrderBys_base_tst.java @@ -19,15 +19,15 @@ package gplx.dbs.orderBys; import gplx.*; import gplx.dbs.*; import org.junit.*; public abstract class OrderBys_base_tst { @Before public void setup() { - provider = provider_(); - fx.Provider_(provider); - Db_qry_delete.new_().BaseTable_("dbs_crud_ops").Exec_qry(provider); - } protected Db_provider_fxt fx = new Db_provider_fxt(); - @After public void teardown() {provider.Conn_term();} - protected abstract Db_provider provider_(); protected Db_provider provider; + conn = provider_(); + fx.Conn_(conn); + Db_qry_delete.new_("dbs_crud_ops").Exec_qry(conn); + } protected Db_conn_fxt fx = new Db_conn_fxt(); + @After public void teardown() {conn.Conn_term();} + protected abstract Db_conn provider_(); protected Db_conn conn; protected void Basic_hook() { - fx.tst_ExecDml(1, Db_qry_insert.new_().BaseTable_("dbs_crud_ops").Arg_("id", 1).Arg_("name", "you")); - fx.tst_ExecDml(1, Db_qry_insert.new_().BaseTable_("dbs_crud_ops").Arg_("id", 0).Arg_("name", "me")); + fx.tst_ExecDml(1, new Db_qry_insert("dbs_crud_ops").Arg_("id", 1).Arg_("name", "you")); + fx.tst_ExecDml(1, new Db_qry_insert("dbs_crud_ops").Arg_("id", 0).Arg_("name", "me")); fx.tst_ExecRdr(2, Db_qry_select.new_().From_("dbs_crud_ops").OrderBy_("id", true)); fx.tst_RowAry(0, 0, "me"); @@ -38,8 +38,8 @@ public abstract class OrderBys_base_tst { fx.tst_RowAry(1, 0, "me"); } protected void SameVals_hook() { - fx.tst_ExecDml(1, Db_qry_insert.new_().BaseTable_("dbs_crud_ops").Arg_("id", 0).Arg_("name", "me")); - fx.tst_ExecDml(1, Db_qry_insert.new_().BaseTable_("dbs_crud_ops").Arg_("id", 0).Arg_("name", "you")); + fx.tst_ExecDml(1, new Db_qry_insert("dbs_crud_ops").Arg_("id", 0).Arg_("name", "me")); + fx.tst_ExecDml(1, new Db_qry_insert("dbs_crud_ops").Arg_("id", 0).Arg_("name", "you")); fx.tst_ExecRdr(2, Db_qry_select.new_().From_("dbs_crud_ops").OrderBy_("id", true)); fx.tst_RowAry(0, 0, "me"); diff --git a/140_dbs/tst/gplx/dbs/orderBys/OrderBys_tdb_tst.java b/140_dbs/tst/gplx/dbs/orderBys/OrderBys_tdb_tst.java index f0b200cb9..e424c93d4 100644 --- a/140_dbs/tst/gplx/dbs/orderBys/OrderBys_tdb_tst.java +++ b/140_dbs/tst/gplx/dbs/orderBys/OrderBys_tdb_tst.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.dbs.orderBys; import gplx.*; import gplx.dbs.*; import org.junit.*; public class OrderBys_tdb_tst extends OrderBys_base_tst { - @Override protected Db_provider provider_() {return Db_provider_fxt.Tdb("120_dbs_joins.dsv");} + @Override protected Db_conn provider_() {return Db_conn_fxt.Tdb("120_dbs_joins.dsv");} @Test public void Basic() { Basic_hook(); } @@ -29,10 +29,10 @@ public class OrderBys_tdb_tst extends OrderBys_base_tst { //namespace gplx.dbs.crudOps { // import org.junit.*; // public class CrudOps_tdb_tst { -// @Before public void setup() {fx = new CrudOpsFxt(Db_provider_fxt.Tdb("100_dbs_crud_ops.dsv"));} CrudOpsFxt fx; +// @Before public void setup() {fx = new CrudOpsFxt(Db_conn_fxt.Tdb("100_dbs_crud_ops.dsv"));} CrudOpsFxt fx; // @Test public void FlushToDisk() { // fx.Fx().tst_ExecDml(1, Db_qry_.insert_("dbs_crud_ops").Arg_("id", 2).Arg_("name", "you")); -// Db_qry_flush.new_("dbs_crud_ops").Exec_qry(fx.Fx().Provider()); +// Db_qry_flush.new_("dbs_crud_ops").Exec_qry(fx.Fx().Conn()); // } // } //} \ No newline at end of file diff --git a/140_dbs/xtn/gplx/dbs/SqliteDbMain.java b/140_dbs/xtn/gplx/dbs/SqliteDbMain.java index 8d19db77f..f58762273 100644 --- a/140_dbs/xtn/gplx/dbs/SqliteDbMain.java +++ b/140_dbs/xtn/gplx/dbs/SqliteDbMain.java @@ -50,7 +50,7 @@ public class SqliteDbMain { // } private void CreateMany(int number, int base_val) { long time_bgn = Env_.TickCount(); - Db_provider provider = Sqlite_engine_.Provider_load_or_make_(Io_url_.new_fil_("E:\\test.sqlite3")); + Db_conn provider = Sqlite_engine_.Conn_load_or_make_(Io_url_.new_fil_("E:\\test.sqlite3")); String tbl_sql = String_.Concat_lines_nl ( "CREATE TABLE fsdb_xtn_thm" , "( thm_id integer NOT NULL PRIMARY KEY" @@ -69,15 +69,15 @@ public class SqliteDbMain { Db_stmt stmt = Db_stmt_.new_insert_(provider, "fsdb_xtn_thm", "thm_id", "thm_owner_id", "thm_w", "thm_h", "thm_thumbtime", "thm_bin_db_id", "thm_size", "thm_modified", "thm_hash"); for (int i = 0; i < number; i++) { stmt.Clear() - .Val_int_(base_val + i) - .Val_int_(base_val + i) - .Val_int_(220) - .Val_int_(200) - .Val_int_(-1) - .Val_int_(15) - .Val_long_(23456) - .Val_str_("") - .Val_str_("") + .Val_int(base_val + i) + .Val_int(base_val + i) + .Val_int(220) + .Val_int(200) + .Val_int(-1) + .Val_int(15) + .Val_long(23456) + .Val_str("") + .Val_str("") .Exec_insert(); } long time_elapsed = (Env_.TickCount() - time_bgn); diff --git a/150_gfui/xtn/gplx/gfui/Swt_html.java b/150_gfui/xtn/gplx/gfui/Swt_html.java index 87c198100..5c87cb950 100644 --- a/150_gfui/xtn/gplx/gfui/Swt_html.java +++ b/150_gfui/xtn/gplx/gfui/Swt_html.java @@ -17,6 +17,14 @@ along with this program. If not, see . */ package gplx.gfui; import java.security.acl.Owner; +import gplx.*; +import gplx.threads.ThreadAdp_; +import org.eclipse.swt.SWT; +import org.eclipse.swt.browser.*; +import org.eclipse.swt.events.*; +import org.eclipse.swt.graphics.*; +import org.eclipse.swt.widgets.*; +import java.security.acl.Owner; import gplx.*; import gplx.threads.ThreadAdp_; @@ -151,16 +159,8 @@ class Swt_html implements Gxw_html, Swt_control, FocusListener { } catch (Exception e) {eval_rslt.Error_set(e.getMessage()); return eval_rslt.Error();} } private Swt_html_eval_rslt eval_rslt = new Swt_html_eval_rslt(); - @Override public void focusGained(FocusEvent arg0) { -// if (!focus_acquired && Swt_kit.Html_box_focus_automatically) { -// browser.forceFocus(); -// focus_acquired = true; -// HtmlBox_focus(); -// } - } //boolean focus_acquired = false; - @Override public void focusLost(FocusEvent arg0) { -// focus_acquired = false; - } + @Override public void focusGained(FocusEvent arg0) {} + @Override public void focusLost(FocusEvent arg0) {} public static final int Browser_tid_none = SWT.NONE , Browser_tid_mozilla = SWT.MOZILLA @@ -168,7 +168,7 @@ class Swt_html implements Gxw_html, Swt_control, FocusListener { ; } class Swt_core_cmds_html extends Swt_core_cmds { - public Swt_core_cmds_html(Swt_html html_box, Control control) {super(control); this.html_box = html_box;} Swt_html html_box; + public Swt_core_cmds_html(Swt_html html_box, Control control) {super(control);} @Override public void Focus() { if (Focus_able()) control.forceFocus(); @@ -180,26 +180,27 @@ class Swt_core_cmds_html extends Swt_core_cmds { class Swt_html_eval_rslt { public void Clear() {error = null; result = null;} public boolean Result_pass() {return error == null;} - public Object Result() {return result;} public void Result_set(Object v) {result = v; error = null;} Object result; - public String Error () {return error;} public void Error_set(String v) {error = v; result = null;} String error; + public Object Result() {return result;} public void Result_set(Object v) {result = v; error = null;} private Object result; + public String Error () {return error;} public void Error_set(String v) {error = v; result = null;} private String error; } class Swt_html_lnr_Traverse implements TraverseListener { - public Swt_html_lnr_Traverse(Swt_html html_box) {this.html_box = html_box;} Swt_html html_box; + public Swt_html_lnr_Traverse(Swt_html html_box) {} @Override public void keyTraversed(TraverseEvent arg0) {} } class Swt_html_lnr_title implements TitleListener { - public Swt_html_lnr_title(Swt_html html_box) {this.html_box = html_box;} Swt_html html_box; + private Swt_html html_box; + public Swt_html_lnr_title(Swt_html html_box) {this.html_box = html_box;} @Override public void changed(TitleEvent ev) { try {UsrDlg_._.Note(ev.title);} catch (Exception e) {html_box.Kit().Ask_ok("xowa.swt.html_box", "title.fail", Err_.Message_gplx_brief(e));} // NOTE: must catch error or will cause app to lock; currently called inside displaySync } } class Swt_html_func extends BrowserFunction { + private GfoInvkAble invk; public Swt_html_func(Browser browser, String name, GfoInvkAble invk) { super (browser, name); - this.browser = browser; this.invk = invk; - } Browser browser; GfoInvkAble invk; + } public Object function (Object[] args) { try { return gplx.gfui.Gfui_html.Js_args_exec(invk, args); @@ -210,7 +211,7 @@ class Swt_html_func extends BrowserFunction { } } class Swt_html_lnr_status implements StatusTextListener { - public Swt_html_lnr_status(Swt_html html_box) {this.html_box = html_box;} Swt_html html_box; + public Swt_html_lnr_status(Swt_html html_box) {this.html_box = html_box;} private Swt_html html_box; public void Host_set(GfoEvObj host) {this.host = host;} GfoEvObj host; @Override public void changed(StatusTextEvent ev) { if (html_box.Kit().Mode_is_shutdown()) @@ -222,18 +223,18 @@ class Swt_html_lnr_status implements StatusTextListener { } } class Swt_html_lnr_progress implements ProgressListener { - public Swt_html_lnr_progress(Swt_html html_box) {this.html_box = html_box;} Swt_html html_box; + public Swt_html_lnr_progress(Swt_html html_box) {} @Override public void changed(ProgressEvent arg0) {} @Override public void completed(ProgressEvent arg0) { // UsrDlg_._.Note("done"); } } class Swt_html_lnr_location implements LocationListener { - public Swt_html_lnr_location(Swt_html html_box) {this.html_box = html_box;} Swt_html html_box; - public void Host_set(GfoEvObj host) {this.host = host;} GfoEvObj host; + public Swt_html_lnr_location(Swt_html html_box) {this.html_box = html_box;} private Swt_html html_box; + public void Host_set(GfoEvObj host) {this.host = host;} private GfoEvObj host; @Override public void changed(LocationEvent arg) {Pub_evt(arg, Gfui_html.Evt_location_changed);} @Override public void changing(LocationEvent arg) {Pub_evt(arg, Gfui_html.Evt_location_changing);} - void Pub_evt(LocationEvent arg, String evt) { + private void Pub_evt(LocationEvent arg, String evt) { String location = arg.location; if (String_.Eq(location, "about:blank")) return; // location changing event fires once when page is loaded; ignore if ( html_box.Html_doc_html_load_tid() == Gxw_html_load_tid_.Tid_url // navigating to file://page.html will fire location event; ignore if url mode @@ -249,7 +250,8 @@ class Swt_html_lnr_location implements LocationListener { } } class Swt_html_lnr_mouse implements MouseListener { - public Swt_html_lnr_mouse(GxwElem elem, Browser browser, Swt_kit kit) {this.elem = elem; this.browser = browser; this.kit = kit;} GxwElem elem; Browser browser; Swt_kit kit; + private GxwElem elem; private Browser browser; private Swt_kit kit; + public Swt_html_lnr_mouse(GxwElem elem, Browser browser, Swt_kit kit) {this.elem = elem; this.browser = browser; this.kit = kit;} @Override public void mouseDown(MouseEvent ev) { if (Is_at_scrollbar_area()) return; elem.Host().MouseDownCbk(XtoMouseData(ev)); @@ -258,7 +260,7 @@ class Swt_html_lnr_mouse implements MouseListener { if (Is_at_scrollbar_area()) return; elem.Host().MouseUpCbk(XtoMouseData(ev)); } - boolean Is_at_scrollbar_area() { + private boolean Is_at_scrollbar_area() { // WORKAROUND.SWT: SEE:NOTE_1:browser scrollbar and click Point browser_size = browser.getSize(); Point click_pos = kit.Swt_display().getCursorLocation(); diff --git a/400_xowa/src/gplx/core/brys/Bit_.java b/400_xowa/src/gplx/core/brys/Bit_.java index 2694cc604..60c2db593 100644 --- a/400_xowa/src/gplx/core/brys/Bit_.java +++ b/400_xowa/src/gplx/core/brys/Bit_.java @@ -62,6 +62,44 @@ public class Bit_ { v = factor == 0 ? v : (v % factor); // NOTE: if 0, do not do modulus or else div by zero } } + public static byte Xto_byte(byte[] pow_ary, byte... val_ary) { + int pow_ary_last = pow_ary.length - 1; + int val = 0; + for (int i = pow_ary_last; i > -1; --i) + val += pow_ary[i] * val_ary[i]; + return (byte)val; + } + public static void Xto_bry(byte[] rv, byte[] pow_ary, byte val) { + int pow_ary_len = pow_ary.length; + int rv_len = rv.length; + for (int i = 0; i < pow_ary_len; i++) { + if (i >= rv_len) break; + rv[i] = (byte)(val / pow_ary[i]); + int factor = pow_ary[i] * rv[i]; + val = (byte)(factor == 0 ? val : (val % factor)); // NOTE: if 0, do not do modulus or else div by zero + } + } + public static int Shift_lhs(int val, int shift) {return val << shift;} + public static int Shift_rhs(int val, int shift) {return val >> shift;} + public static int Shift_lhs_to_int(int[] shift_ary, int... val_ary) { + int val_len = val_ary.length; if (val_len > shift_ary.length) throw Err_.new_("vals must be less than shifts; vals={0} shifts=~{1}"); + int rv = 0; + for (int i = 0; i < val_len; ++i) { + int val = val_ary[i]; + int shift = shift_ary[i]; + rv += val << shift; + } + return rv; + } + public static void Shift_rhs_to_ary(int[] rv, int[] shift_ary, int val) { + int shift_len = shift_ary.length; + for (int i = shift_len - 1; i > - 1; --i) { + int shift = shift_ary[i]; + int itm = val >> shift; + rv[i] = itm; + val -= (itm << shift); + } + } public static int Xto_int_date_short(int[] val_ary) { val_ary[0] -= 1900; return Xto_int(Pow_ary_date_short, val_ary); diff --git a/400_xowa/src/gplx/core/brys/Bit__tst.java b/400_xowa/src/gplx/core/brys/Bit__tst.java index 3be80823a..1c8bd7650 100644 --- a/400_xowa/src/gplx/core/brys/Bit__tst.java +++ b/400_xowa/src/gplx/core/brys/Bit__tst.java @@ -18,6 +18,7 @@ along with this program. If not, see . package gplx.core.brys; import gplx.*; import gplx.core.*; import org.junit.*; public class Bit__tst { + @Before public void init() {fxt.Clear();} private Bit__fxt fxt = new Bit__fxt(); @Test public void XtoBitStr() { tst_XtoBitStr( 0, "00000000"); tst_XtoBitStr( 1, "00000001"); @@ -66,4 +67,43 @@ public class Bit__tst { Tfds.Eq(expd, date_int); Tfds.Eq(date_str, Bit_.Xto_date_short(date_int).XtoStr_fmt("yyyyMMdd HHmm")); } + @Test public void Shift_lhs() {// simple: shift 1 bit + fxt.Test_shift_lhs(1, 1, 2); + fxt.Test_shift_lhs(2, 1, 4); + fxt.Test_shift_lhs(3, 1, 6); + fxt.Test_shift_lhs(4, 1, 8); + } + @Test public void Shift_rhs() { + fxt.Test_shift_rhs(2, 1, 1); + fxt.Test_shift_rhs(4, 1, 2); + fxt.Test_shift_rhs(6, 1, 3); + fxt.Test_shift_rhs(8, 1, 4); + } + @Test public void Shift_lhs_to_int() { + int[] shift_ary = Int_.Ary(0, 3, 5); + fxt.Test_shift_lhs_to_int(shift_ary, Int_.Ary(0, 0, 0), 0); + fxt.Test_shift_lhs_to_int(shift_ary, Int_.Ary(7, 0, 0), 7); // 1st 3 bits + fxt.Test_shift_lhs_to_int(shift_ary, Int_.Ary(0, 3, 0), 24); // 2nd 2 bits + fxt.Test_shift_lhs_to_int(shift_ary, Int_.Ary(0, 0, 1), 32); // 3rd 1 bit + fxt.Test_shift_lhs_to_int(shift_ary, Int_.Ary(7, 3, 1), 63); // many bits + } + @Test public void Shift_rhs_to_ary() { + int[] shift_ary = Int_.Ary(0, 3, 5); + fxt.Test_shift_rhs_to_ary(shift_ary, 0, Int_.Ary(0, 0, 0)); + fxt.Test_shift_rhs_to_ary(shift_ary, 7, Int_.Ary(7, 0, 0)); // 1st 3 bits + fxt.Test_shift_rhs_to_ary(shift_ary, 24, Int_.Ary(0, 3, 0)); // 2nd 2 bits + fxt.Test_shift_rhs_to_ary(shift_ary, 32, Int_.Ary(0, 0, 1)); // 3rd 1 bit + fxt.Test_shift_rhs_to_ary(shift_ary, 63, Int_.Ary(7, 3, 1)); // many bits + } +} +class Bit__fxt { + public void Clear() {} + public void Test_shift_lhs(int val, int shift, int expd) {Tfds.Eq(expd, Bit_.Shift_lhs(val, shift));} + public void Test_shift_rhs(int val, int shift, int expd) {Tfds.Eq(expd, Bit_.Shift_rhs(val, shift));} + public void Test_shift_lhs_to_int(int[] shift_ary, int[] val_ary, int expd) {Tfds.Eq(expd, Bit_.Shift_lhs_to_int(shift_ary, val_ary));} + public void Test_shift_rhs_to_ary(int[] shift_ary, int val, int[] expd_ary) { + int[] actl_ary = Int_.Ary(0, 0, 0); + Bit_.Shift_rhs_to_ary(actl_ary, shift_ary, val); + Tfds.Eq_ary(expd_ary, actl_ary); + } } diff --git a/400_xowa/src/gplx/core/brys/Bry_rdr.java b/400_xowa/src/gplx/core/brys/Bry_rdr.java index f3c4582c7..c498cb092 100644 --- a/400_xowa/src/gplx/core/brys/Bry_rdr.java +++ b/400_xowa/src/gplx/core/brys/Bry_rdr.java @@ -36,6 +36,7 @@ public class Bry_rdr { public int Read_int_to_comma() {return Read_int_to(Byte_ascii.Comma);} public int Read_int_to_pipe() {return Read_int_to(Byte_ascii.Pipe);} public int Read_int_to_nl() {return Read_int_to(Byte_ascii.NewLine);} + public int Read_int_to_quote() {return Read_int_to(Byte_ascii.Quote);} public int Read_int_to(byte to_char) { int bgn = pos; int rv = 0; @@ -61,6 +62,8 @@ public class Bry_rdr { } public byte[] Read_bry_to_nl() {return Read_bry_to(Byte_ascii.NewLine);} public byte[] Read_bry_to_pipe() {return Read_bry_to(Byte_ascii.Pipe);} + public byte[] Read_bry_to_quote() {return Read_bry_to(Byte_ascii.Quote);} + public byte[] Read_bry_to_apos() {return Read_bry_to(Byte_ascii.Apos);} public byte[] Read_bry_to(byte to_char) { int bgn = pos; while (pos < src_len) { diff --git a/400_xowa/src/gplx/dbs/Gfdb_db_base.java b/400_xowa/src/gplx/dbs/Gfdb_db_base.java new file mode 100644 index 000000000..3a75dfb8a --- /dev/null +++ b/400_xowa/src/gplx/dbs/Gfdb_db_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.dbs; import gplx.*; +import gplx.dbs.schemas.*; +public class Gfdb_db_base { + public Db_conn Conn() {return conn;} private Db_conn conn; + public Schema_db_mgr Schema() {return schema;} private Schema_db_mgr schema = new Schema_db_mgr(); + public void Init(Db_conn conn) { + this.conn = conn; + schema.Init(conn); + } +} diff --git a/400_xowa/src/gplx/dbs/schemas/Schema_db_mgr.java b/400_xowa/src/gplx/dbs/schemas/Schema_db_mgr.java new file mode 100644 index 000000000..2a37c2a7d --- /dev/null +++ b/400_xowa/src/gplx/dbs/schemas/Schema_db_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.schemas; import gplx.*; import gplx.dbs.*; +import gplx.dbs.schemas.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 Schema_tbl_mgr Tbl_mgr() {return tbl_mgr;} private final Schema_tbl_mgr tbl_mgr = new Schema_tbl_mgr(); + public void Init(Db_conn conn) { + loader.Load(this, conn); + updater.Update(this, conn); + } +} diff --git a/400_xowa/src/gplx/dbs/schemas/Schema_itm_tid.java b/400_xowa/src/gplx/dbs/schemas/Schema_itm_tid.java new file mode 100644 index 000000000..f00cff1bc --- /dev/null +++ b/400_xowa/src/gplx/dbs/schemas/Schema_itm_tid.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.schemas; import gplx.*; import gplx.dbs.*; +public class Schema_itm_tid { + public static final int Tid_table = 1, Tid_index = 2; + public static final String Key_table = "table", Key_index = "index"; + public static int Xto_int(String s) { + s = String_.Lower(s); + if (String_.Eq(s, Key_table)) return Tid_table; + else if (String_.Eq(s, Key_index)) return Tid_index; + else throw Err_.unhandled(s); + } +} diff --git a/400_xowa/src/gplx/dbs/schemas/Schema_loader_mgr.java b/400_xowa/src/gplx/dbs/schemas/Schema_loader_mgr.java new file mode 100644 index 000000000..dbca1e5d4 --- /dev/null +++ b/400_xowa/src/gplx/dbs/schemas/Schema_loader_mgr.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.schemas; import gplx.*; import gplx.dbs.*; +public interface Schema_loader_mgr { + void Load(Schema_db_mgr db_mgr, Db_conn conn); +} diff --git a/400_xowa/src/gplx/dbs/schemas/Schema_loader_mgr_.java b/400_xowa/src/gplx/dbs/schemas/Schema_loader_mgr_.java new file mode 100644 index 000000000..8a50f3d87 --- /dev/null +++ b/400_xowa/src/gplx/dbs/schemas/Schema_loader_mgr_.java @@ -0,0 +1,47 @@ +/* +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.schemas; import gplx.*; import gplx.dbs.*; +public class Schema_loader_mgr_ { + public static final Schema_loader_mgr Null = new Schema_loader_mgr__null(); + public static final Schema_loader_mgr Sqlite = new Schema_loader_mgr__sqlite(); +} +class Schema_loader_mgr__null implements Schema_loader_mgr { + public void Load(Schema_db_mgr db_mgr, Db_conn conn) {} +} +class Schema_loader_mgr__sqlite implements Schema_loader_mgr { + public void Load(Schema_db_mgr db_mgr, Db_conn conn) { + Gfo_usr_dlg_._.Log_many("", "", "db.schema.load.bgn: conn=~{0}", conn.Url().Xto_api()); + Schema_tbl_mgr tbl_mgr = db_mgr.Tbl_mgr(); + Db_qry__select_in_tbl qry = Db_qry__select_in_tbl.new_("sqlite_master", null, String_.Ary("type", "name", "sql")); + Db_stmt stmt = Db_stmt_.new_select_as_rdr(conn, qry); + Db_rdr rdr = stmt.Exec_select_as_rdr(); + while (rdr.Move_next()) { + int type = Schema_itm_tid.Xto_int(rdr.Read_str(0)); + switch (type) { + case Schema_itm_tid.Tid_table: + Schema_tbl_itm tbl_itm = new Schema_tbl_itm(rdr.Read_str(1), rdr.Read_str(2)); + tbl_mgr.Add(tbl_itm); + break; + case Schema_itm_tid.Tid_index: break; // noop for now + default: throw Err_.unhandled(type); + } + } + rdr.Rls(); + Gfo_usr_dlg_._.Log_many("", "", "db.schema.load.end"); + } +} diff --git a/400_xowa/src/gplx/dbs/schemas/Schema_tbl_itm.java b/400_xowa/src/gplx/dbs/schemas/Schema_tbl_itm.java new file mode 100644 index 000000000..7b16d18e5 --- /dev/null +++ b/400_xowa/src/gplx/dbs/schemas/Schema_tbl_itm.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.dbs.schemas; import gplx.*; import gplx.dbs.*; +public class Schema_tbl_itm { + public Schema_tbl_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; +} diff --git a/400_xowa/src/gplx/dbs/schemas/Schema_tbl_mgr.java b/400_xowa/src/gplx/dbs/schemas/Schema_tbl_mgr.java new file mode 100644 index 000000000..72377aa7e --- /dev/null +++ b/400_xowa/src/gplx/dbs/schemas/Schema_tbl_mgr.java @@ -0,0 +1,24 @@ +/* +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.schemas; import gplx.*; import gplx.dbs.*; +public class Schema_tbl_mgr { + private OrderedHash hash = OrderedHash_.new_(); + public void Add(Schema_tbl_itm itm) {hash.Add(itm.Name(), itm);} + public boolean Has(String name) {return hash.Has(name);} + public Schema_tbl_itm Get(String name) {return (Schema_tbl_itm)hash.Fetch(name);} +} diff --git a/400_xowa/src/gplx/dbs/schemas/updates/Schema_update_cmd.java b/400_xowa/src/gplx/dbs/schemas/updates/Schema_update_cmd.java new file mode 100644 index 000000000..47c16d8af --- /dev/null +++ b/400_xowa/src/gplx/dbs/schemas/updates/Schema_update_cmd.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.dbs.schemas.updates; import gplx.*; import gplx.dbs.*; import gplx.dbs.schemas.*; +public interface Schema_update_cmd { + String Name(); + boolean Exec_is_done(); + void Exec(Schema_db_mgr mgr, Db_conn conn); +} diff --git a/400_xowa/src/gplx/dbs/schemas/updates/Schema_update_cmd_.java b/400_xowa/src/gplx/dbs/schemas/updates/Schema_update_cmd_.java new file mode 100644 index 000000000..62cd43707 --- /dev/null +++ b/400_xowa/src/gplx/dbs/schemas/updates/Schema_update_cmd_.java @@ -0,0 +1,36 @@ +/* +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.schemas.updates; import gplx.*; import gplx.dbs.*; import gplx.dbs.schemas.*; +public class Schema_update_cmd_ { + public static Schema_update_cmd Make_tbl_create(String tbl_name, String tbl_sql, Db_idx_itm... tbl_idxs) {return new Schema_update_cmd__tbl_create(tbl_name, tbl_sql, tbl_idxs);} +} +class Schema_update_cmd__tbl_create implements Schema_update_cmd { + private final String tbl_sql; private final Db_idx_itm[] tbl_idxs; + public Schema_update_cmd__tbl_create(String tbl_name, String tbl_sql, Db_idx_itm... tbl_idxs) { + this.tbl_name = tbl_name; this.tbl_sql = tbl_sql; this.tbl_idxs = tbl_idxs; + } + public String Name() {return "schema.tbl.create." + tbl_name;} private final String tbl_name; + public boolean Exec_is_done() {return exec_is_done;} private boolean exec_is_done; + public void Exec(Schema_db_mgr db_mgr, Db_conn conn) { + if (db_mgr.Tbl_mgr().Has(tbl_name)) return; + Gfo_usr_dlg_._.Log_many("", "", "schema.tbl.create: tbl=~{0}", tbl_name); + Sqlite_engine_.Tbl_create(conn, tbl_name, tbl_sql); + Sqlite_engine_.Idx_create(conn, tbl_idxs); + exec_is_done = true; + } +} diff --git a/400_xowa/src/gplx/dbs/schemas/updates/Schema_update_mgr.java b/400_xowa/src/gplx/dbs/schemas/updates/Schema_update_mgr.java new file mode 100644 index 000000000..b0a974982 --- /dev/null +++ b/400_xowa/src/gplx/dbs/schemas/updates/Schema_update_mgr.java @@ -0,0 +1,32 @@ +/* +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.schemas.updates; import gplx.*; import gplx.dbs.*; import gplx.dbs.schemas.*; +public class Schema_update_mgr { + private ListAdp cmds = ListAdp_.new_(); + public void Add(Schema_update_cmd cmd) {cmds.Add(cmd);} + public void Update(Schema_db_mgr schema_mgr, Db_conn conn) { + int cmds_len = cmds.Count(); + for (int i = 0; i < cmds_len; ++i) { + Schema_update_cmd cmd = (Schema_update_cmd)cmds.FetchAt(i); + try {cmd.Exec(schema_mgr, conn);} + catch (Exception e) { + Gfo_usr_dlg_._.Warn_many("", "", "failed to run update cmd; name=~{0} err=~{1}", cmd.Name(), Err_.Message_gplx_brief(e)); + } + } + } +} diff --git a/400_xowa/src/gplx/dbs/schemas/updates/Schema_update_mgr_tst.java b/400_xowa/src/gplx/dbs/schemas/updates/Schema_update_mgr_tst.java new file mode 100644 index 000000000..397c6f790 --- /dev/null +++ b/400_xowa/src/gplx/dbs/schemas/updates/Schema_update_mgr_tst.java @@ -0,0 +1,55 @@ +/* +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.schemas.updates; import gplx.*; import gplx.dbs.*; import gplx.dbs.schemas.*; +import org.junit.*; import gplx.dbs.*; +public class Schema_update_mgr_tst { + @Before public void init() {fxt.Clear();} private Schema_update_mgr_fxt fxt = new Schema_update_mgr_fxt(); + @Test public void Create() { + fxt.Test_exec_y(new Schema_update_cmd__mock()); + } + @Test public void Delete() { + fxt.Init_itm(Schema_itm_tid.Tid_table, Schema_update_cmd__mock.Tbl_name); + fxt.Test_exec_n(new Schema_update_cmd__mock()); + } +} +class Schema_update_mgr_fxt { + private Schema_update_mgr update_mgr; private Schema_db_mgr db_mgr; + public void Clear() { + update_mgr = new Schema_update_mgr(); + db_mgr = new Schema_db_mgr(); + } + public void Init_itm(int tid, String name) { + db_mgr.Tbl_mgr().Add(new Schema_tbl_itm(name, "sql")); + } + 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);} + private void Test_exec(Schema_update_cmd cmd, boolean expd) { + update_mgr.Add(cmd); + update_mgr.Update(db_mgr, Db_conn_.Null); + Tfds.Eq(expd, cmd.Exec_is_done()); + } +} +class Schema_update_cmd__mock implements Schema_update_cmd { + public String Name() {return "xowa.user.cfg_regy.create";} + public boolean Exec_is_done() {return exec_is_done;} private boolean exec_is_done; + public void Exec(Schema_db_mgr mgr, Db_conn conn) { + if (mgr.Tbl_mgr().Has(Tbl_name)) return; + exec_is_done = true; + } + public static final String Tbl_name = "tbl_mock"; +} diff --git a/400_xowa/src/gplx/fsdb/Fsdb_bin_tbl.java b/400_xowa/src/gplx/fsdb/Fsdb_bin_tbl.java index d4b6a6ffe..67e5ee563 100644 --- a/400_xowa/src/gplx/fsdb/Fsdb_bin_tbl.java +++ b/400_xowa/src/gplx/fsdb/Fsdb_bin_tbl.java @@ -18,9 +18,9 @@ along with this program. If not, see . package gplx.fsdb; import gplx.*; import gplx.dbs.*; import gplx.ios.*; public class Fsdb_bin_tbl { - public static void Create_table(Db_provider p) {Sqlite_engine_.Tbl_create(p, Tbl_name, Tbl_sql);} - public static Db_stmt Insert_stmt(Db_provider p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_bin_owner_id, Fld_bin_owner_tid, Fld_bin_part_id, Fld_bin_data_url, Fld_bin_data);} - public static void Insert_rdr(Db_provider p, int id, byte tid, long bin_len, Io_stream_rdr bin_rdr) { + public static void Create_table(Db_conn p) {Sqlite_engine_.Tbl_create(p, Tbl_name, Tbl_sql);} + public static Db_stmt Insert_stmt(Db_conn p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_bin_owner_id, Fld_bin_owner_tid, Fld_bin_part_id, Fld_bin_data_url, Fld_bin_data);} + public static void Insert_rdr(Db_conn p, int id, byte tid, long bin_len, Io_stream_rdr bin_rdr) { Db_stmt stmt = Insert_stmt(p); try {Insert_rdr(stmt, id, tid, bin_len, bin_rdr);} finally {stmt.Rls();} @@ -28,33 +28,33 @@ public class Fsdb_bin_tbl { public static long Insert_rdr(Db_stmt stmt, int id, byte tid, long bin_len, Io_stream_rdr bin_rdr) { long rv = bin_len; stmt.Clear() - .Val_int_(id) - .Val_byte_(tid) - .Val_int_(Null_part_id) - .Val_str_(Null_data_url) + .Val_int(id) + .Val_byte(tid) + .Val_int(Null_part_id) + .Val_str(Null_data_url) ; if (Sqlite_engine_.Supports_read_binary_stream) stmt.Val_rdr_(bin_rdr, bin_len); else { byte[] bin_ary = Io_stream_rdr_.Load_all_as_bry(Bry_bfr.new_(), bin_rdr); - stmt.Val_bry_(bin_ary); + stmt.Val_bry(bin_ary); rv = bin_ary.length; } stmt.Exec_insert(); return rv; } - public static void Delete(Db_provider p, int id) { + public static void Delete(Db_conn p, int id) { Db_stmt stmt = Delete_stmt(p); try {Delete(stmt, id);} finally {stmt.Rls();} } - private static Db_stmt Delete_stmt(Db_provider p) {return Db_stmt_.new_delete_(p, Tbl_name, Fld_bin_owner_id);} + private static Db_stmt Delete_stmt(Db_conn p) {return Db_stmt_.new_delete_(p, Tbl_name, Fld_bin_owner_id);} private static void Delete(Db_stmt stmt, int id) { stmt.Clear() - .Val_int_(id) + .Val_int(id) .Exec_delete(); } - public static Io_stream_rdr Select_as_rdr(Db_provider p, int owner) { + public static Io_stream_rdr Select_as_rdr(Db_conn p, int owner) { Db_qry qry = Db_qry_.select_().From_(Tbl_name).Cols_(Fld_bin_data).Where_(Db_crt_.eq_(Fld_bin_owner_id, owner)); DataRdr rdr = DataRdr_.Null; try { @@ -70,7 +70,7 @@ public class Fsdb_bin_tbl { } finally {rdr.Rls();} } - public static boolean Select_to_url(Db_provider p, int owner, Io_url url, byte[] bin_bfr, int bin_flush_when) { + public static boolean Select_to_url(Db_conn p, int owner, Io_url url, byte[] bin_bfr, int bin_flush_when) { Db_qry qry = Db_qry_.select_().From_(Tbl_name).Cols_(Fld_bin_data).Where_(Db_crt_.eq_(Fld_bin_owner_id, owner)); DataRdr rdr = DataRdr_.Null; try { diff --git a/400_xowa/src/gplx/fsdb/Fsdb_cfg_mgr.java b/400_xowa/src/gplx/fsdb/Fsdb_cfg_mgr.java index 8cf8f8ea0..a6df17fde 100644 --- a/400_xowa/src/gplx/fsdb/Fsdb_cfg_mgr.java +++ b/400_xowa/src/gplx/fsdb/Fsdb_cfg_mgr.java @@ -57,9 +57,9 @@ public class Fsdb_cfg_mgr { } return grp; } - public static Fsdb_cfg_mgr load_(Fsdb_db_abc_mgr abc_mgr, Db_provider p) {return new Fsdb_cfg_mgr().Init_by_load(p);} - public static Fsdb_cfg_mgr make_(Fsdb_db_abc_mgr abc_mgr, Db_provider p) {return new Fsdb_cfg_mgr().Init_by_make(p);} - private Fsdb_cfg_mgr Init_by_load(Db_provider p) { + public static Fsdb_cfg_mgr load_(Fsdb_db_abc_mgr abc_mgr, Db_conn p) {return new Fsdb_cfg_mgr().Init_by_load(p);} + public static Fsdb_cfg_mgr make_(Fsdb_db_abc_mgr abc_mgr, Db_conn p) {return new Fsdb_cfg_mgr().Init_by_make(p);} + private Fsdb_cfg_mgr Init_by_load(Db_conn p) { this.cfg_tbl = new Fsdb_cfg_tbl_sql().Ctor(p, false); Fsdb_cfg_grp core_grp = Grps_get_or_load(Grp_core); this.next_id = core_grp.Get_int_or(Key_next_id, -1); if (next_id == -1) throw Err_.new_("next_id not found in fsdb_cfg"); @@ -67,7 +67,7 @@ public class Fsdb_cfg_mgr { this.patch_next_id = core_grp.Get_yn_or_n(Key_patch_next_id); return this; } - private Fsdb_cfg_mgr Init_by_make(Db_provider p) { + private Fsdb_cfg_mgr Init_by_make(Db_conn p) { this.cfg_tbl = new Fsdb_cfg_tbl_sql().Ctor(p, true); this.cfg_tbl.Insert(Grp_core, Key_next_id , "1"); // start next_id at 1 this.cfg_tbl.Insert(Grp_core, Key_schema_thm_page , "y"); // new dbs automatically have page and time in fsdb_xtn_tm diff --git a/400_xowa/src/gplx/fsdb/Fsdb_cfg_tbl.java b/400_xowa/src/gplx/fsdb/Fsdb_cfg_tbl.java index cd35e3ba5..faf18ff35 100644 --- a/400_xowa/src/gplx/fsdb/Fsdb_cfg_tbl.java +++ b/400_xowa/src/gplx/fsdb/Fsdb_cfg_tbl.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.fsdb; import gplx.*; import gplx.dbs.*; public interface Fsdb_cfg_tbl extends RlsAble { - Fsdb_cfg_tbl Ctor(Db_provider provider, boolean created); + Fsdb_cfg_tbl Ctor(Db_conn conn, boolean created); void Insert(String grp, String key, String val); void Update(String grp, String key, String val); int Select_as_int_or(String grp, String key, int or); @@ -36,7 +36,7 @@ abstract class Fsdb_cfg_tbl_base { } class Fsdb_cfg_tbl_mem extends Fsdb_cfg_tbl_base implements Fsdb_cfg_tbl { private HashAdp grps = HashAdp_.new_(); - public Fsdb_cfg_tbl Ctor(Db_provider provider, boolean created) {return this;} + public Fsdb_cfg_tbl Ctor(Db_conn conn, boolean created) {return this;} public void Insert(String grp, String key, String val) { Fsdb_cfg_grp grp_itm = Grps_get_or_make(grp); grp_itm.Insert(key, val); @@ -66,45 +66,45 @@ class Fsdb_cfg_tbl_mem extends Fsdb_cfg_tbl_base implements Fsdb_cfg_tbl { public Fsdb_cfg_grp Grps_get_or_null(String grp) {return (Fsdb_cfg_grp)grps.Fetch(grp);} } class Fsdb_cfg_tbl_sql extends Fsdb_cfg_tbl_base implements Fsdb_cfg_tbl { - private Db_provider provider; + private Db_conn conn; private Db_stmt stmt_insert, stmt_update, stmt_select; - public Fsdb_cfg_tbl Ctor(Db_provider provider, boolean created) { - this.provider = provider; + public Fsdb_cfg_tbl Ctor(Db_conn conn, boolean created) { + this.conn = conn; if (created) Create_table(); return this; } private void Create_table() { - Sqlite_engine_.Tbl_create(provider, Tbl_name, Tbl_sql); - Sqlite_engine_.Idx_create(provider, Idx_main); + Sqlite_engine_.Tbl_create(conn, Tbl_name, Tbl_sql); + Sqlite_engine_.Idx_create(conn, Idx_main); } - private Db_stmt Insert_stmt() {return Db_stmt_.new_insert_(provider, Tbl_name, Fld_cfg_grp, Fld_cfg_key, Fld_cfg_val);} + private Db_stmt Insert_stmt() {return Db_stmt_.new_insert_(conn, Tbl_name, Fld_cfg_grp, Fld_cfg_key, Fld_cfg_val);} public void Insert(String grp, String key, String val) { if (stmt_insert == null) stmt_insert = Insert_stmt(); stmt_insert.Clear() - .Val_str_(grp) - .Val_str_(key) - .Val_str_(val) + .Val_str(grp) + .Val_str(key) + .Val_str(val) .Exec_insert(); } - private Db_stmt Update_stmt() {return Db_stmt_.new_update_(provider, Tbl_name, String_.Ary(Fld_cfg_grp, Fld_cfg_key), Fld_cfg_val);} + private Db_stmt Update_stmt() {return Db_stmt_.new_update_(conn, Tbl_name, String_.Ary(Fld_cfg_grp, Fld_cfg_key), Fld_cfg_val);} public void Update(String grp, String key, String val) { if (stmt_update == null) stmt_update = Update_stmt(); stmt_update.Clear() - .Val_str_(val) - .Val_str_(grp) - .Val_str_(key) + .Val_str(val) + .Val_str(grp) + .Val_str(key) .Exec_update(); } private Db_stmt Select_stmt() { Db_qry_select qry = Db_qry_.select_val_(Tbl_name, Fld_cfg_val, gplx.criterias.Criteria_.And_many(Db_crt_.eq_(Fld_cfg_grp, ""), Db_crt_.eq_(Fld_cfg_key, ""))); - return provider.Prepare(qry); + return conn.New_stmt(qry); } @Override public int Select_as_int_or(String grp, String key, int or) {return Int_.parse_or_(Select_as_str_or(grp, key, null), or);} public String Select_as_str_or(String grp, String key, String or) { if (stmt_select == null) stmt_select = Select_stmt(); Object rv = (String)stmt_select.Clear() - .Val_str_(grp) - .Val_str_(key) + .Val_str(grp) + .Val_str(key) .Exec_select_val(); return rv == null ? or : (String)rv; } @@ -113,7 +113,7 @@ class Fsdb_cfg_tbl_sql extends Fsdb_cfg_tbl_base implements Fsdb_cfg_tbl { Db_qry_select qry = Db_qry_.select_cols_(Tbl_name, gplx.criterias.Criteria_.And_many(Db_crt_.eq_(Fld_cfg_grp, "")), Fld_cfg_key, Fld_cfg_val); DataRdr rdr = DataRdr_.Null; try { - rdr = provider.Prepare(qry).Clear().Val_str_(grp).Exec_select(); + rdr = conn.New_stmt(qry).Clear().Val_str(grp).Exec_select(); while (rdr.MoveNextPeer()) { if (rv == null) rv = new Fsdb_cfg_grp(grp); String key = rdr.ReadStr(Fld_cfg_key); diff --git a/400_xowa/src/gplx/fsdb/Fsdb_db_abc_mgr.java b/400_xowa/src/gplx/fsdb/Fsdb_db_abc_mgr.java index 2f513aab8..af968ddd1 100644 --- a/400_xowa/src/gplx/fsdb/Fsdb_db_abc_mgr.java +++ b/400_xowa/src/gplx/fsdb/Fsdb_db_abc_mgr.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.fsdb; import gplx.*; import gplx.dbs.*; public class Fsdb_db_abc_mgr implements RlsAble { - private Db_provider boot_provider; + private Db_conn boot_provider; public int Next_id() {return cfg_mgr.Next_id();} public Fsdb_mnt_mgr Mnt_mgr() {return mnt_mgr;} private Fsdb_mnt_mgr mnt_mgr; public Fsdb_db_abc_mgr(Fsdb_mnt_mgr mnt_mgr) {this.mnt_mgr = mnt_mgr;} @@ -78,16 +78,16 @@ public class Fsdb_db_abc_mgr implements RlsAble { boot_provider.Conn_term(); } private void Init_load(Io_url dir, Io_url boot_url) { - Db_conn_info connect = Db_conn_info__sqlite.load_(boot_url); - boot_provider = Db_provider_.new_and_open_(connect); + Db_url connect = Db_url__sqlite.load_(boot_url); + boot_provider = Db_conn_.new_and_open_(connect); atr_mgr = Fsdb_db_atr_mgr.load_(this, boot_provider, dir); bin_mgr = Fsdb_db_bin_mgr.load_(boot_provider, dir); cfg_mgr = Fsdb_cfg_mgr.load_(this, boot_provider); if (!cfg_mgr.Patch_next_id()) Fsdb_db_abc_mgr_.Patch_next_id(this, dir); } private void Init_make(Io_url dir, Io_url boot_url) { - Db_conn_info connect = Db_conn_info__sqlite.make_(boot_url); - boot_provider = Db_provider_.new_and_open_(connect); + Db_url connect = Db_url__sqlite.make_(boot_url); + boot_provider = Db_conn_.new_and_open_(connect); Sqlite_engine_.Pragma_page_size_4096(boot_provider); atr_mgr = Fsdb_db_atr_mgr.make_(this, boot_provider, dir); bin_mgr = Fsdb_db_bin_mgr.make_(boot_provider, dir); @@ -103,8 +103,8 @@ class Fsdb_db_abc_mgr_ { int last_id = -1; if (atr_mgr.Len() > 0) { Fsdb_db_atr_fil atr_fil = atr_mgr.Get_at(0); - int max_fil_id = Db_provider_.Select_fld0_as_int_or(atr_fil.Provider(), "SELECT Max(fil_id) AS MaxId FROM fsdb_fil;", -1); - int max_thm_id = Db_provider_.Select_fld0_as_int_or(atr_fil.Provider(), "SELECT Max(thm_id) AS MaxId FROM fsdb_xtn_thm;", -1); + int max_fil_id = Db_conn_.Select_fld0_as_int_or(atr_fil.Conn(), "SELECT Max(fil_id) AS MaxId FROM fsdb_fil;", -1); + int max_thm_id = Db_conn_.Select_fld0_as_int_or(atr_fil.Conn(), "SELECT Max(thm_id) AS MaxId FROM fsdb_xtn_thm;", -1); last_id = max_fil_id > max_thm_id ? max_fil_id : max_thm_id; } cfg_mgr.Patch_next_id_exec(last_id); diff --git a/400_xowa/src/gplx/fsdb/Fsdb_db_atr_fil.java b/400_xowa/src/gplx/fsdb/Fsdb_db_atr_fil.java index b34cf2392..f047a5ae6 100644 --- a/400_xowa/src/gplx/fsdb/Fsdb_db_atr_fil.java +++ b/400_xowa/src/gplx/fsdb/Fsdb_db_atr_fil.java @@ -22,15 +22,15 @@ public class Fsdb_db_atr_fil implements RlsAble { private Fsdb_dir_tbl tbl_dir; private Fsdb_fil_tbl tbl_fil; private Fsdb_xtn_thm_tbl tbl_thm; public Fsdb_db_atr_fil(Fsdb_db_abc_mgr abc_mgr, Io_url url, boolean create) { this.abc_mgr = abc_mgr; - Db_conn_info connect = create ? Db_conn_info__sqlite.make_(url) : Db_conn_info__sqlite.load_(url); - provider = Db_provider_.new_and_open_(connect); - Sqlite_engine_.Pragma_page_size_4096(provider); - tbl_dir = new Fsdb_dir_tbl(provider, create); - tbl_fil = new Fsdb_fil_tbl(provider, create); - tbl_thm = new Fsdb_xtn_thm_tbl(this, provider, create); + Db_url connect = create ? Db_url__sqlite.make_(url) : Db_url__sqlite.load_(url); + conn = Db_conn_.new_and_open_(connect); + Sqlite_engine_.Pragma_page_size_4096(conn); + tbl_dir = new Fsdb_dir_tbl(conn, create); + tbl_fil = new Fsdb_fil_tbl(conn, create); + tbl_thm = new Fsdb_xtn_thm_tbl(this, conn, create); } public Fsdb_db_abc_mgr Abc_mgr() {return abc_mgr;} private Fsdb_db_abc_mgr abc_mgr; - public Db_provider Provider() {return provider;} private Db_provider provider; + public Db_conn Conn() {return conn;} private Db_conn conn; public int Id() {return id;} private int id; public Io_url Url() {return url;} private Io_url url; public String Path_bgn() {return path_bgn;} private String path_bgn; @@ -39,14 +39,14 @@ public class Fsdb_db_atr_fil implements RlsAble { tbl_dir.Rls(); tbl_fil.Rls(); tbl_thm.Rls(); - provider.Txn_mgr().Txn_end_all(); - provider.Conn_term(); + conn.Txn_mgr().Txn_end_all(); + conn.Conn_term(); } public void Txn_open() { - provider.Txn_mgr().Txn_bgn_if_none(); + conn.Txn_mgr().Txn_bgn_if_none(); } public void Txn_save() { - provider.Txn_mgr().Txn_end_all(); + conn.Txn_mgr().Txn_end_all(); } public Fsdb_fil_itm Fil_select(byte[] dir, byte[] fil) { Int_obj_ref dir_id_obj = (Int_obj_ref)dir_cache.Get_or_null(dir); diff --git a/400_xowa/src/gplx/fsdb/Fsdb_db_atr_mgr.java b/400_xowa/src/gplx/fsdb/Fsdb_db_atr_mgr.java index 0951d8b9f..947b28d9a 100644 --- a/400_xowa/src/gplx/fsdb/Fsdb_db_atr_mgr.java +++ b/400_xowa/src/gplx/fsdb/Fsdb_db_atr_mgr.java @@ -39,8 +39,8 @@ public class Fsdb_db_atr_mgr implements RlsAble { itm.Txn_open(); } } - public void Txn_save(Db_provider provider) { - Fsdb_db_atr_tbl.Commit_all(provider, itms); + public void Txn_save(Db_conn conn) { + Fsdb_db_atr_tbl.Commit_all(conn, itms); int len = itms.length; for (int i = 0; i < len; i++) { Fsdb_db_atr_fil itm = itms[i]; @@ -54,13 +54,13 @@ public class Fsdb_db_atr_mgr implements RlsAble { itm.Rls(); } } - public static Fsdb_db_atr_mgr load_(Fsdb_db_abc_mgr abc_mgr, Db_provider p, Io_url dir) { + public static Fsdb_db_atr_mgr load_(Fsdb_db_abc_mgr abc_mgr, Db_conn p, Io_url dir) { Fsdb_db_atr_mgr rv = new Fsdb_db_atr_mgr(); rv.itms = Fsdb_db_atr_tbl.Select_all(abc_mgr, p, dir); rv.itms_0 = rv.itms[0]; return rv; } - public static Fsdb_db_atr_mgr make_(Fsdb_db_abc_mgr abc_mgr, Db_provider p, Io_url dir) { + public static Fsdb_db_atr_mgr make_(Fsdb_db_abc_mgr abc_mgr, Db_conn p, Io_url dir) { Fsdb_db_atr_tbl.Create_table(p); Fsdb_db_atr_mgr rv = new Fsdb_db_atr_mgr(); Fsdb_db_atr_fil itm = Fsdb_db_atr_fil.make_(abc_mgr, Id_0, url_(dir, Id_0), Path_bgn_0); diff --git a/400_xowa/src/gplx/fsdb/Fsdb_db_atr_tbl.java b/400_xowa/src/gplx/fsdb/Fsdb_db_atr_tbl.java index 35bd2c65f..fbb2a1415 100644 --- a/400_xowa/src/gplx/fsdb/Fsdb_db_atr_tbl.java +++ b/400_xowa/src/gplx/fsdb/Fsdb_db_atr_tbl.java @@ -18,8 +18,8 @@ along with this program. If not, see . package gplx.fsdb; import gplx.*; import gplx.dbs.*; public class Fsdb_db_atr_tbl { - public static void Create_table(Db_provider p) {Sqlite_engine_.Tbl_create(p, Tbl_name, Tbl_sql);} - public static Fsdb_db_atr_fil[] Select_all(Fsdb_db_abc_mgr abc_mgr, Db_provider p, Io_url dir) { + public static void Create_table(Db_conn p) {Sqlite_engine_.Tbl_create(p, Tbl_name, Tbl_sql);} + public static Fsdb_db_atr_fil[] Select_all(Fsdb_db_abc_mgr abc_mgr, Db_conn p, Io_url dir) { ListAdp rv = ListAdp_.new_(); Db_qry qry = Db_qry_select.new_().From_(Tbl_name).Cols_all_().OrderBy_asc_(Fld_uid); DataRdr rdr = DataRdr_.Null; @@ -32,8 +32,8 @@ public class Fsdb_db_atr_tbl { } finally {rdr.Rls();} return (Fsdb_db_atr_fil[])rv.Xto_ary(Fsdb_db_atr_fil.class); } - public static void Commit_all(Db_provider provider, Fsdb_db_atr_fil[] ary) { - stmt_bldr.Init(provider); + public static void Commit_all(Db_conn conn, Fsdb_db_atr_fil[] ary) { + stmt_bldr.Init(conn); try { int len = ary.length; for (int i = 0; i < len; i++) @@ -44,9 +44,9 @@ public class Fsdb_db_atr_tbl { private static void Commit_itm(Fsdb_db_atr_fil itm) { Db_stmt stmt = stmt_bldr.Get(itm.Cmd_mode()); switch (itm.Cmd_mode()) { - case Db_cmd_mode.Create: stmt.Clear().Val_int_(itm.Id()) .Val_str_(itm.Url().NameAndExt()).Val_str_(itm.Path_bgn()).Exec_insert(); break; - case Db_cmd_mode.Update: stmt.Clear() .Val_str_(itm.Url().NameAndExt()).Val_str_(itm.Path_bgn()).Val_int_(itm.Id()).Exec_update(); break; - case Db_cmd_mode.Delete: stmt.Clear().Val_int_(itm.Id()).Exec_delete(); break; + case Db_cmd_mode.Create: stmt.Clear().Val_int(itm.Id()) .Val_str(itm.Url().NameAndExt()).Val_str(itm.Path_bgn()).Exec_insert(); break; + case Db_cmd_mode.Update: stmt.Clear() .Val_str(itm.Url().NameAndExt()).Val_str(itm.Path_bgn()).Val_int(itm.Id()).Exec_update(); break; + case Db_cmd_mode.Delete: stmt.Clear().Val_int(itm.Id()).Exec_delete(); break; case Db_cmd_mode.Ignore: break; default: throw Err_.unhandled(itm.Cmd_mode()); } diff --git a/400_xowa/src/gplx/fsdb/Fsdb_db_bin_fil.java b/400_xowa/src/gplx/fsdb/Fsdb_db_bin_fil.java index 31c54891c..3912045a7 100644 --- a/400_xowa/src/gplx/fsdb/Fsdb_db_bin_fil.java +++ b/400_xowa/src/gplx/fsdb/Fsdb_db_bin_fil.java @@ -31,32 +31,32 @@ public class Fsdb_db_bin_fil implements RlsAble { if (cmd_mode == Db_cmd_mode.Ignore) cmd_mode = Db_cmd_mode.Update; } public byte Cmd_mode() {return cmd_mode;} public Fsdb_db_bin_fil Cmd_mode_(byte v) {cmd_mode = v; return this;} private byte cmd_mode; - public Db_provider Provider() { - if (provider == null) { + public Db_conn Conn() { + if (conn == null) { if (cmd_mode == Db_cmd_mode.Create) { - provider = Db_provider_.new_and_open_(Db_conn_info__sqlite.make_(url)); - Sqlite_engine_.Pragma_page_size_4096(provider); - Fsdb_bin_tbl.Create_table(provider); + conn = Db_conn_.new_and_open_(Db_url__sqlite.make_(url)); + Sqlite_engine_.Pragma_page_size_4096(conn); + Fsdb_bin_tbl.Create_table(conn); } else - provider = Db_provider_.new_and_open_(Db_conn_info__sqlite.load_(url)); + conn = Db_conn_.new_and_open_(Db_url__sqlite.load_(url)); } - return provider; - } private Db_provider provider; - public void Rls() {if (provider != null) provider.Conn_term();} + return conn; + } private Db_conn conn; + public void Rls() {if (conn != null) conn.Conn_term();} public long Insert(int bin_id, byte owner_tid, long bin_len, gplx.ios.Io_stream_rdr bin_rdr) { Db_stmt stmt = Db_stmt_.Null; try { - stmt = Fsdb_bin_tbl.Insert_stmt(this.Provider()); + stmt = Fsdb_bin_tbl.Insert_stmt(this.Conn()); return Fsdb_bin_tbl.Insert_rdr(stmt, bin_id, owner_tid, bin_len, bin_rdr); } finally {stmt.Rls();} } public boolean Get_to_url(int id, Io_url url, byte[] bin_bfr, int bin_flush_when) { - return Fsdb_bin_tbl.Select_to_url(this.Provider(), id, url, bin_bfr, bin_flush_when); + return Fsdb_bin_tbl.Select_to_url(this.Conn(), id, url, bin_bfr, bin_flush_when); } public Io_stream_rdr Get_as_rdr(int id) { - return Fsdb_bin_tbl.Select_as_rdr(this.Provider(), id); + return Fsdb_bin_tbl.Select_as_rdr(this.Conn(), id); } public static Fsdb_db_bin_fil load_(DataRdr rdr, Io_url dir) { return new_ @@ -69,7 +69,7 @@ public class Fsdb_db_bin_fil implements RlsAble { } public static Fsdb_db_bin_fil make_(int id, Io_url url, long bin_len, long bin_max) { Fsdb_db_bin_fil rv = new_(id, url, bin_len, bin_max, Db_cmd_mode.Create); - rv.Provider(); // force table create + rv.Conn(); // force table create return rv; } private static Fsdb_db_bin_fil new_(int id, Io_url url, long bin_len, long bin_max, byte cmd_mode) { diff --git a/400_xowa/src/gplx/fsdb/Fsdb_db_bin_mgr.java b/400_xowa/src/gplx/fsdb/Fsdb_db_bin_mgr.java index 9ff2ee8e4..453bd1584 100644 --- a/400_xowa/src/gplx/fsdb/Fsdb_db_bin_mgr.java +++ b/400_xowa/src/gplx/fsdb/Fsdb_db_bin_mgr.java @@ -21,7 +21,7 @@ public class Fsdb_db_bin_mgr implements RlsAble { private Io_url dir; private Fsdb_db_bin_fil[] itms = Fsdb_db_bin_fil.Ary_empty; private int itms_len = 0; private Fsdb_db_bin_fil itms_n; - private Db_provider provider; + private Db_conn conn; private Fsdb_db_bin_mgr(Io_url dir) {this.dir = dir;} public int Len() {return itms.length;} public long Db_bin_max() {return db_bin_max;} @@ -35,11 +35,11 @@ public class Fsdb_db_bin_mgr implements RlsAble { public Fsdb_db_bin_fil Get_at(int i) {return itms[i];} private Fsdb_db_bin_fil Get_cur() {return itms_len == 0 ? null : itms[itms_len - 1];} public void Txn_open() { - Get_cur().Provider().Txn_mgr().Txn_bgn_if_none(); + Get_cur().Conn().Txn_mgr().Txn_bgn_if_none(); } public void Txn_save() { - Fsdb_db_bin_tbl.Commit_all(provider, itms); - Get_cur().Provider().Txn_mgr().Txn_end_all(); + Fsdb_db_bin_tbl.Commit_all(conn, itms); + Get_cur().Conn().Txn_mgr().Txn_end_all(); } public void Rls() { int len = itms.length; @@ -62,26 +62,26 @@ public class Fsdb_db_bin_mgr implements RlsAble { Fsdb_db_bin_fil bin_fil = itms[db_id]; return bin_fil.Insert(bin_id, owner_tid, bin_len, bin_rdr); } - public static Fsdb_db_bin_mgr load_(Db_provider p, Io_url dir) { + public static Fsdb_db_bin_mgr load_(Db_conn p, Io_url dir) { Fsdb_db_bin_mgr rv = new Fsdb_db_bin_mgr(dir); - rv.provider = p; + rv.conn = p; rv.itms = Fsdb_db_bin_tbl.Select_all(p, dir); rv.itms_len = rv.itms.length; rv.itms_n = rv.itms[rv.itms_len - 1]; return rv; } - public static Fsdb_db_bin_mgr make_(Db_provider p, Io_url dir) { + public static Fsdb_db_bin_mgr make_(Db_conn p, Io_url dir) { Fsdb_db_bin_tbl.Create_table(p); Fsdb_db_bin_mgr rv = new Fsdb_db_bin_mgr(dir); - rv.provider = p; + rv.conn = p; rv.Itms_add(0); return rv; } private void Itms_add(long bin_len) { Fsdb_db_bin_fil cur = Get_cur(); if (cur != null) { - cur.Provider().Txn_mgr().Txn_end_all(); - cur.Provider().Conn_term(); + cur.Conn().Txn_mgr().Txn_end_all(); + cur.Conn().Conn_term(); } int new_itms_len = itms_len + 1; Fsdb_db_bin_fil[] new_itms = new Fsdb_db_bin_fil[new_itms_len]; diff --git a/400_xowa/src/gplx/fsdb/Fsdb_db_bin_tbl.java b/400_xowa/src/gplx/fsdb/Fsdb_db_bin_tbl.java index 9857306af..90e5138d2 100644 --- a/400_xowa/src/gplx/fsdb/Fsdb_db_bin_tbl.java +++ b/400_xowa/src/gplx/fsdb/Fsdb_db_bin_tbl.java @@ -18,9 +18,9 @@ along with this program. If not, see . package gplx.fsdb; import gplx.*; import gplx.dbs.*; public class Fsdb_db_bin_tbl { - public static void Create_table(Db_provider p) {Sqlite_engine_.Tbl_create(p, Tbl_name, Tbl_sql);} - public static void Commit_all(Db_provider provider, Fsdb_db_bin_fil[] ary) { - stmt_bldr.Init(provider); + public static void Create_table(Db_conn p) {Sqlite_engine_.Tbl_create(p, Tbl_name, Tbl_sql);} + public static void Commit_all(Db_conn conn, Fsdb_db_bin_fil[] ary) { + stmt_bldr.Init(conn); try { int len = ary.length; for (int i = 0; i < len; i++) @@ -31,15 +31,15 @@ public class Fsdb_db_bin_tbl { private static void Commit_itm(Fsdb_db_bin_fil itm) { Db_stmt stmt = stmt_bldr.Get(itm.Cmd_mode()); switch (itm.Cmd_mode()) { - case Db_cmd_mode.Create: stmt.Clear().Val_int_(itm.Id()) .Val_str_(itm.Url().NameAndExt()).Val_long_(itm.Bin_len()).Val_long_(itm.Bin_max()).Exec_insert(); break; - case Db_cmd_mode.Update: stmt.Clear() .Val_str_(itm.Url().NameAndExt()).Val_long_(itm.Bin_len()).Val_long_(itm.Bin_max()).Val_int_(itm.Id()).Exec_update(); break; - case Db_cmd_mode.Delete: stmt.Clear().Val_int_(itm.Id()).Exec_delete(); break; + case Db_cmd_mode.Create: stmt.Clear().Val_int(itm.Id()) .Val_str(itm.Url().NameAndExt()).Val_long(itm.Bin_len()).Val_long(itm.Bin_max()).Exec_insert(); break; + case Db_cmd_mode.Update: stmt.Clear() .Val_str(itm.Url().NameAndExt()).Val_long(itm.Bin_len()).Val_long(itm.Bin_max()).Val_int(itm.Id()).Exec_update(); break; + case Db_cmd_mode.Delete: stmt.Clear().Val_int(itm.Id()).Exec_delete(); break; case Db_cmd_mode.Ignore: break; default: throw Err_.unhandled(itm.Cmd_mode()); } itm.Cmd_mode_(Db_cmd_mode.Ignore); } - public static Fsdb_db_bin_fil[] Select_all(Db_provider p, Io_url dir) { + public static Fsdb_db_bin_fil[] Select_all(Db_conn p, Io_url dir) { ListAdp rv = ListAdp_.new_(); Db_qry qry = Db_qry_select.new_().From_(Tbl_name).Cols_all_().OrderBy_asc_(Fld_uid); DataRdr rdr = DataRdr_.Null; diff --git a/400_xowa/src/gplx/fsdb/Fsdb_dir_tbl.java b/400_xowa/src/gplx/fsdb/Fsdb_dir_tbl.java index f334b5d43..884d16a0a 100644 --- a/400_xowa/src/gplx/fsdb/Fsdb_dir_tbl.java +++ b/400_xowa/src/gplx/fsdb/Fsdb_dir_tbl.java @@ -18,10 +18,10 @@ along with this program. If not, see . package gplx.fsdb; import gplx.*; import gplx.dbs.*; public class Fsdb_dir_tbl { - private Db_provider provider; + private Db_conn conn; private Db_stmt stmt_insert, stmt_update, stmt_select_by_name; - public Fsdb_dir_tbl(Db_provider provider, boolean created) { - this.provider = provider; + public Fsdb_dir_tbl(Db_conn conn, boolean created) { + this.conn = conn; if (created) Create_table(); } public void Rls() { @@ -30,41 +30,41 @@ public class Fsdb_dir_tbl { if (stmt_select_by_name != null) {stmt_select_by_name.Rls(); stmt_select_by_name = null;} } public void Create_table() { - Sqlite_engine_.Tbl_create(provider, Tbl_name, Tbl_sql); - Sqlite_engine_.Idx_create(provider, Idx_name); + Sqlite_engine_.Tbl_create(conn, Tbl_name, Tbl_sql); + Sqlite_engine_.Idx_create(conn, Idx_name); } - private Db_stmt Insert_stmt() {return Db_stmt_.new_insert_(provider, Tbl_name, Fld_dir_id, Fld_dir_owner_id, Fld_dir_name);} + private Db_stmt Insert_stmt() {return Db_stmt_.new_insert_(conn, Tbl_name, Fld_dir_id, Fld_dir_owner_id, Fld_dir_name);} public void Insert(int id, String name, int owner_id) { if (stmt_insert == null) stmt_insert = Insert_stmt(); try { stmt_insert.Clear() - .Val_int_(id) - .Val_int_(owner_id) - .Val_str_(name) + .Val_int(id) + .Val_int(owner_id) + .Val_str(name) .Exec_insert(); } catch (Exception exc) {stmt_insert = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail } - private Db_stmt Update_stmt() {return Db_stmt_.new_update_(provider, Tbl_name, String_.Ary(Fld_dir_id), Fld_dir_owner_id, Fld_dir_name);} + private Db_stmt Update_stmt() {return Db_stmt_.new_update_(conn, Tbl_name, String_.Ary(Fld_dir_id), Fld_dir_owner_id, Fld_dir_name);} public void Update(int id, String name, int owner_id) { if (stmt_update == null) stmt_update = Update_stmt(); try { stmt_update.Clear() - .Val_int_(id) - .Val_str_(name) - .Val_int_(owner_id) + .Val_int(id) + .Val_str(name) + .Val_int(owner_id) .Exec_update(); } catch (Exception exc) {stmt_update = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail } private Db_stmt Select_itm_stmt() { Db_qry qry = Db_qry_.select_().From_(Tbl_name).Cols_(Fld_dir_id, Fld_dir_owner_id).Where_(Db_crt_.eq_(Fld_dir_name, Bry_.Empty)); - return provider.Prepare(qry); + return conn.New_stmt(qry); } public Fsdb_dir_itm Select_itm(String dir_name) { if (stmt_select_by_name == null) stmt_select_by_name = Select_itm_stmt(); DataRdr rdr = DataRdr_.Null; try { rdr = stmt_select_by_name.Clear() - .Val_str_(dir_name) + .Val_str(dir_name) .Exec_select(); while (rdr.MoveNextPeer()) { return new Fsdb_dir_itm(rdr.ReadInt(Fld_dir_id), rdr.ReadInt(Fld_dir_owner_id), dir_name); diff --git a/400_xowa/src/gplx/fsdb/Fsdb_fil_tbl.java b/400_xowa/src/gplx/fsdb/Fsdb_fil_tbl.java index 5aaf0bf63..9cb07490f 100644 --- a/400_xowa/src/gplx/fsdb/Fsdb_fil_tbl.java +++ b/400_xowa/src/gplx/fsdb/Fsdb_fil_tbl.java @@ -18,15 +18,15 @@ along with this program. If not, see . package gplx.fsdb; import gplx.*; import gplx.dbs.*; public class Fsdb_fil_tbl { - private Db_provider provider; + private Db_conn conn; private Db_stmt stmt_insert, stmt_update, stmt_select_by_name, stmt_select_by_id; - public Fsdb_fil_tbl(Db_provider provider, boolean created) { - this.provider = provider; + public Fsdb_fil_tbl(Db_conn conn, boolean created) { + this.conn = conn; if (created) Create_table(); } private void Create_table() { - Sqlite_engine_.Tbl_create(provider, Tbl_name, Tbl_sql); - Sqlite_engine_.Idx_create(provider, Idx_owner); + Sqlite_engine_.Tbl_create(conn, Tbl_name, Tbl_sql); + Sqlite_engine_.Idx_create(conn, Idx_owner); } public void Rls() { if (stmt_insert != null) {stmt_insert.Rls(); stmt_insert = null;} @@ -34,37 +34,37 @@ public class Fsdb_fil_tbl { if (stmt_select_by_name != null) {stmt_select_by_name.Rls(); stmt_select_by_name = null;} if (stmt_select_by_id != null) {stmt_select_by_id.Rls(); stmt_select_by_id = null;} } - private Db_stmt Insert_stmt() {return Db_stmt_.new_insert_(provider, Tbl_name, Fld_fil_id, Fld_fil_owner_id, Fld_fil_name, Fld_fil_xtn_id, Fld_fil_ext_id, Fld_fil_bin_db_id, Fld_fil_size, Fld_fil_modified, Fld_fil_hash);} + private Db_stmt Insert_stmt() {return Db_stmt_.new_insert_(conn, Tbl_name, Fld_fil_id, Fld_fil_owner_id, Fld_fil_name, Fld_fil_xtn_id, Fld_fil_ext_id, Fld_fil_bin_db_id, Fld_fil_size, Fld_fil_modified, Fld_fil_hash);} public void Insert(int id, int owner_id, String name, int xtn_id, int ext_id, long size, DateAdp modified, String hash, int bin_db_id) { if (stmt_insert == null) stmt_insert = Insert_stmt(); try { stmt_insert.Clear() - .Val_int_(id) - .Val_int_(owner_id) - .Val_str_(name) - .Val_int_(xtn_id) - .Val_int_(ext_id) - .Val_int_(bin_db_id) - .Val_long_(size) - .Val_str_(Sqlite_engine_.X_date_to_str(modified)) - .Val_str_(hash) + .Val_int(id) + .Val_int(owner_id) + .Val_str(name) + .Val_int(xtn_id) + .Val_int(ext_id) + .Val_int(bin_db_id) + .Val_long(size) + .Val_str(Sqlite_engine_.X_date_to_str(modified)) + .Val_str(hash) .Exec_insert(); } catch (Exception exc) {stmt_insert = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail } - private Db_stmt Update_stmt() {return Db_stmt_.new_update_(provider, Tbl_name, String_.Ary(Fld_fil_id), Fld_fil_owner_id, Fld_fil_name, Fld_fil_xtn_id, Fld_fil_ext_id, Fld_fil_bin_db_id, Fld_fil_size, Fld_fil_modified, Fld_fil_hash);} + private Db_stmt Update_stmt() {return Db_stmt_.new_update_(conn, Tbl_name, String_.Ary(Fld_fil_id), Fld_fil_owner_id, Fld_fil_name, Fld_fil_xtn_id, Fld_fil_ext_id, Fld_fil_bin_db_id, Fld_fil_size, Fld_fil_modified, Fld_fil_hash);} public void Update(int id, int owner_id, String name, int xtn_id, int ext_id, long size, DateAdp modified, String hash, int bin_db_id) { if (stmt_update == null) stmt_update = Update_stmt(); try { stmt_update.Clear() - .Val_int_(owner_id) - .Val_str_(name) - .Val_int_(xtn_id) - .Val_int_(ext_id) - .Val_int_(bin_db_id) - .Val_long_(size) - .Val_str_(Sqlite_engine_.X_date_to_str(modified)) - .Val_str_(hash) - .Val_int_(id) + .Val_int(owner_id) + .Val_str(name) + .Val_int(xtn_id) + .Val_int(ext_id) + .Val_int(bin_db_id) + .Val_long(size) + .Val_str(Sqlite_engine_.X_date_to_str(modified)) + .Val_str(hash) + .Val_int(id) .Exec_update(); } catch (Exception exc) {stmt_update = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail } @@ -73,15 +73,15 @@ public class Fsdb_fil_tbl { ? (Db_qry)Db_qry_sql.rdr_("SELECT * FROM fsdb_fil INDEXED BY fsdb_fil__owner WHERE fil_owner_id = ? AND fil_name = ?;") : Db_qry_.select_().From_(Tbl_name).Cols_all_().Where_(gplx.criterias.Criteria_.And_many(Db_crt_.eq_(Fld_fil_owner_id, Int_.MinValue), Db_crt_.eq_(Fld_fil_name, ""))) ; - return provider.Prepare(qry); + return conn.New_stmt(qry); } public Fsdb_fil_itm Select_itm_by_name(int dir_id, String fil_name) { if (stmt_select_by_name == null) stmt_select_by_name = Select_by_name_stmt(); DataRdr rdr = DataRdr_.Null; try { rdr = stmt_select_by_name.Clear() - .Val_int_(dir_id) - .Val_str_(fil_name) + .Val_int(dir_id) + .Val_str(fil_name) .Exec_select(); if (rdr.MoveNextPeer()) return load_(rdr); @@ -92,14 +92,14 @@ public class Fsdb_fil_tbl { } private Db_stmt Select_by_id_stmt() { Db_qry qry = Db_qry_.select_().From_(Tbl_name).Cols_all_().Where_(Db_crt_.eq_(Fld_fil_id, 0)); - return provider.Prepare(qry); + return conn.New_stmt(qry); } public Fsdb_fil_itm Select_itm_by_id(int fil_id) { if (stmt_select_by_id == null) stmt_select_by_id = Select_by_id_stmt(); DataRdr rdr = DataRdr_.Null; try { rdr = stmt_select_by_name.Clear() - .Val_int_(fil_id) + .Val_int(fil_id) .Exec_select(); if (rdr.MoveNextPeer()) return load_(rdr); diff --git a/400_xowa/src/gplx/fsdb/Fsdb_mnt_mgr.java b/400_xowa/src/gplx/fsdb/Fsdb_mnt_mgr.java index 730dc66a3..ceac57194 100644 --- a/400_xowa/src/gplx/fsdb/Fsdb_mnt_mgr.java +++ b/400_xowa/src/gplx/fsdb/Fsdb_mnt_mgr.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.fsdb; import gplx.*; import gplx.dbs.*; import gplx.xowa.files.fsdb.*; public class Fsdb_mnt_mgr implements GfoInvkAble { - private Db_provider provider; + private Db_conn conn; private Fsdb_cfg_tbl tbl_cfg; private Fsdb_db_abc_mgr[] ary; int ary_len = 0; public Gfo_usr_dlg Usr_dlg() {return usr_dlg;} public Fsdb_mnt_mgr Usr_dlg_(Gfo_usr_dlg v) {usr_dlg = v; return this;} private Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_.Null; @@ -38,15 +38,15 @@ public class Fsdb_mnt_mgr implements GfoInvkAble { public Fsdb_db_abc_mgr Abc_mgr_at(int i) {return ary[i];} private Fsdb_mnt_itm[] Db_load_or_make(Io_url cur_dir) { Bool_obj_ref created = Bool_obj_ref.n_(); - provider = Sqlite_engine_.Provider_load_or_make_(cur_dir.GenSubFil("wiki.mnt.sqlite3"), created); - tbl_cfg = new Fsdb_cfg_tbl_sql().Ctor(provider, created.Val()); + conn = Sqlite_engine_.Conn_load_or_make_(cur_dir.GenSubFil("wiki.mnt.sqlite3"), created); + tbl_cfg = new Fsdb_cfg_tbl_sql().Ctor(conn, created.Val()); if (created.Val()) { - Fsdb_mnt_tbl.Create_table(provider); - Fsdb_mnt_tbl.Insert(provider, Mnt_idx_main, "fsdb.main", "fsdb.main"); - Fsdb_mnt_tbl.Insert(provider, Mnt_idx_user, "fsdb.user", "fsdb.user"); + Fsdb_mnt_tbl.Create_table(conn); + Fsdb_mnt_tbl.Insert(conn, Mnt_idx_main, "fsdb.main", "fsdb.main"); + Fsdb_mnt_tbl.Insert(conn, Mnt_idx_user, "fsdb.user", "fsdb.user"); tbl_cfg.Insert("core", "mnt.insert_idx", Int_.Xto_str(Mnt_idx_user)); } - return Fsdb_mnt_tbl.Select_all(provider); + return Fsdb_mnt_tbl.Select_all(conn); } public Fsdb_db_bin_fil Bin_db_get(int mnt_id, int bin_db_id) { return ary[mnt_id].Bin_mgr().Get_at(bin_db_id); diff --git a/400_xowa/src/gplx/fsdb/Fsdb_mnt_tbl.java b/400_xowa/src/gplx/fsdb/Fsdb_mnt_tbl.java index 5ad185cd3..e11e42779 100644 --- a/400_xowa/src/gplx/fsdb/Fsdb_mnt_tbl.java +++ b/400_xowa/src/gplx/fsdb/Fsdb_mnt_tbl.java @@ -18,31 +18,31 @@ along with this program. If not, see . package gplx.fsdb; import gplx.*; import gplx.dbs.*; public class Fsdb_mnt_tbl { - public static void Create_table(Db_provider p) { + public static void Create_table(Db_conn p) { Sqlite_engine_.Tbl_create(p, Tbl_name, Tbl_sql); } - public static void Insert(Db_provider p, int id, String name, String url) { + public static void Insert(Db_conn p, int id, String name, String url) { Db_stmt stmt = Insert_stmt(p); try {Insert(stmt, id, name, url);} finally {stmt.Rls();} } - private static Db_stmt Insert_stmt(Db_provider p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_mnt_id, Fld_mnt_name, Fld_mnt_url);} + private static Db_stmt Insert_stmt(Db_conn p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_mnt_id, Fld_mnt_name, Fld_mnt_url);} private static void Insert(Db_stmt stmt, int id, String name, String url) { stmt.Clear() - .Val_int_(id) - .Val_str_(name) - .Val_str_(url) + .Val_int(id) + .Val_str(name) + .Val_str(url) .Exec_insert(); } - public static Db_stmt Update_stmt(Db_provider p) {return Db_stmt_.new_update_(p, Tbl_name, String_.Ary(Fld_mnt_id), Fld_mnt_name, Fld_mnt_url);} + public static Db_stmt Update_stmt(Db_conn p) {return Db_stmt_.new_update_(p, Tbl_name, String_.Ary(Fld_mnt_id), Fld_mnt_name, Fld_mnt_url);} public static void Update(Db_stmt stmt, int id, String name, String url) { stmt.Clear() - .Val_str_(name) - .Val_str_(url) - .Val_int_(id) + .Val_str(name) + .Val_str(url) + .Val_int(id) .Exec_update(); } - public static Fsdb_mnt_itm[] Select_all(Db_provider p) { + public static Fsdb_mnt_itm[] Select_all(Db_conn p) { Db_qry qry = Db_qry_.select_().From_(Tbl_name); DataRdr rdr = DataRdr_.Null; ListAdp list = ListAdp_.new_(); diff --git a/400_xowa/src/gplx/fsdb/Fsdb_xtn_thm_tbl.java b/400_xowa/src/gplx/fsdb/Fsdb_xtn_thm_tbl.java index b5647a853..9b24a5c81 100644 --- a/400_xowa/src/gplx/fsdb/Fsdb_xtn_thm_tbl.java +++ b/400_xowa/src/gplx/fsdb/Fsdb_xtn_thm_tbl.java @@ -18,15 +18,15 @@ along with this program. If not, see . package gplx.fsdb; import gplx.*; import gplx.dbs.*; public class Fsdb_xtn_thm_tbl { - private Fsdb_db_atr_fil atr_fil; private Db_provider provider; + private Fsdb_db_atr_fil atr_fil; private Db_conn conn; private Db_stmt stmt_insert, stmt_select_by_fil_w; - public Fsdb_xtn_thm_tbl(Fsdb_db_atr_fil atr_fil, Db_provider provider, boolean created) { - this.atr_fil = atr_fil; this.provider = provider; + public Fsdb_xtn_thm_tbl(Fsdb_db_atr_fil atr_fil, Db_conn conn, boolean created) { + this.atr_fil = atr_fil; this.conn = conn; if (created) Create_table(); } private void Create_table() { - Sqlite_engine_.Tbl_create(provider, Tbl_name, Tbl_sql); - Sqlite_engine_.Idx_create(provider, Idx_name); + Sqlite_engine_.Tbl_create(conn, Tbl_name, Tbl_sql); + Sqlite_engine_.Idx_create(conn, Idx_name); } public void Rls() { if (stmt_insert != null) {stmt_insert.Rls(); stmt_insert = null;} @@ -41,28 +41,28 @@ public class Fsdb_xtn_thm_tbl { } private boolean schema_thm_page, schema_thm_page_init = true; private Db_stmt Make_stmt_insert() { return this.Schema_thm_page() - ? Db_stmt_.new_insert_(provider, Tbl_name, Fld_thm_id, Fld_thm_owner_id, Fld_thm_w, Fld_thm_h, Fld_thm_bin_db_id, Fld_thm_size, Fld_thm_modified, Fld_thm_hash, Fld_thm_time, Fld_thm_page) - : Db_stmt_.new_insert_(provider, Tbl_name, Fld_thm_id, Fld_thm_owner_id, Fld_thm_w, Fld_thm_h, Fld_thm_bin_db_id, Fld_thm_size, Fld_thm_modified, Fld_thm_hash, Fld_thm_thumbtime) + ? Db_stmt_.new_insert_(conn, Tbl_name, Fld_thm_id, Fld_thm_owner_id, Fld_thm_w, Fld_thm_h, Fld_thm_bin_db_id, Fld_thm_size, Fld_thm_modified, Fld_thm_hash, Fld_thm_time, Fld_thm_page) + : Db_stmt_.new_insert_(conn, Tbl_name, Fld_thm_id, Fld_thm_owner_id, Fld_thm_w, Fld_thm_h, Fld_thm_bin_db_id, Fld_thm_size, Fld_thm_modified, Fld_thm_hash, Fld_thm_thumbtime) ; } public void Insert(int id, int thm_owner_id, int width, int height, double thumbtime, int page, int bin_db_id, long size, DateAdp modified, String hash) { if (stmt_insert == null) stmt_insert = Make_stmt_insert(); try { stmt_insert.Clear() - .Val_int_(id) - .Val_int_(thm_owner_id) - .Val_int_(width) - .Val_int_(height) - .Val_int_(bin_db_id) - .Val_long_(size) - .Val_str_(Sqlite_engine_.X_date_to_str(modified)) - .Val_str_(hash); + .Val_int(id) + .Val_int(thm_owner_id) + .Val_int(width) + .Val_int(height) + .Val_int(bin_db_id) + .Val_long(size) + .Val_str(Sqlite_engine_.X_date_to_str(modified)) + .Val_str(hash); if (this.Schema_thm_page()) { - stmt_insert.Val_double_ (gplx.xowa.files.Xof_doc_thumb.Db_save_double(thumbtime)); - stmt_insert.Val_int_ (gplx.xowa.files.Xof_doc_page.Db_save_int(page)); + stmt_insert.Val_double (gplx.xowa.files.Xof_doc_thumb.Db_save_double(thumbtime)); + stmt_insert.Val_int (gplx.xowa.files.Xof_doc_page.Db_save_int(page)); } else - stmt_insert.Val_int_(gplx.xowa.files.Xof_doc_thumb.Db_save_int(thumbtime)); + stmt_insert.Val_int(gplx.xowa.files.Xof_doc_thumb.Db_save_int(thumbtime)); stmt_insert.Exec_insert(); } catch (Exception exc) {stmt_insert = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail } @@ -74,22 +74,22 @@ public class Fsdb_xtn_thm_tbl { : gplx.criterias.Criteria_.And_many(Db_crt_.eq_(Fld_thm_owner_id, Int_.MinValue), Db_crt_.eq_(Fld_thm_w, Int_.MinValue), Db_crt_.eq_(Fld_thm_thumbtime, Int_.MinValue)) ; qry.Where_(crt); - return provider.Prepare(qry); + return conn.New_stmt(qry); } public boolean Select_itm_by_fil_width(int owner_id, Fsdb_xtn_thm_itm thm) { if (stmt_select_by_fil_w == null) stmt_select_by_fil_w = Select_by_fil_w_stmt(); DataRdr rdr = DataRdr_.Null; try { stmt_select_by_fil_w.Clear() - .Val_int_(owner_id) - .Val_int_(thm.Width()) + .Val_int(owner_id) + .Val_int(thm.Width()) ; if (this.Schema_thm_page()) { - stmt_select_by_fil_w.Val_double_(gplx.xowa.files.Xof_doc_thumb.Db_save_double(thm.Thumbtime())); - stmt_select_by_fil_w.Val_int_(gplx.xowa.files.Xof_doc_page.Db_save_int(thm.Page())); + stmt_select_by_fil_w.Val_double(gplx.xowa.files.Xof_doc_thumb.Db_save_double(thm.Thumbtime())); + stmt_select_by_fil_w.Val_int(gplx.xowa.files.Xof_doc_page.Db_save_int(thm.Page())); } else { - stmt_select_by_fil_w.Val_int_(gplx.xowa.files.Xof_doc_thumb.Db_save_int(thm.Thumbtime())); + stmt_select_by_fil_w.Val_int(gplx.xowa.files.Xof_doc_thumb.Db_save_int(thm.Thumbtime())); } rdr = stmt_select_by_fil_w.Exec_select(); if (rdr.MoveNextPeer()) { diff --git a/400_xowa/src/gplx/intl/Gfo_app.java b/400_xowa/src/gplx/intl/Gfo_app.java new file mode 100644 index 000000000..95418194b --- /dev/null +++ b/400_xowa/src/gplx/intl/Gfo_app.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.intl; import gplx.*; +public class Gfo_app { + public Gfo_i18n_mgr I18n_mgr() {return i18n_mgr;} private Gfo_i18n_mgr i18n_mgr = new Gfo_i18n_mgr(); +} diff --git a/400_xowa/src/gplx/intl/Gfo_i18n_itm.java b/400_xowa/src/gplx/intl/Gfo_i18n_itm.java new file mode 100644 index 000000000..aa318e320 --- /dev/null +++ b/400_xowa/src/gplx/intl/Gfo_i18n_itm.java @@ -0,0 +1,42 @@ +/* +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.intl; import gplx.*; +class Gfo_i18n_itm { + public Gfo_i18n_itm(int src, byte[] key, byte[] val, boolean val_fmt_exists, Gfo_i18n_val_cmd val_cmd) { + this.src = src; this.key = key; this.val = val; this.val_fmt_exists = val_fmt_exists; this.val_cmd = val_cmd; + } + public int Src() {return src;} private final int src; + public byte[] Key() {return key;} private final byte[] key; + public byte[] Val() {return val;} private final byte[] val; + public boolean Val_fmt_exists() {return val_fmt_exists;} private final boolean val_fmt_exists; + public Gfo_i18n_val_cmd Val_cmd() {return val_cmd;} private final Gfo_i18n_val_cmd val_cmd; + public byte[] Bld_none() { + return val_cmd == null ? val : val_cmd.Process(src, key, val); + } + public byte[] Bld_many(Object... args) { + byte[] rv = null; + synchronized (tmp_fmtr) { + tmp_fmtr.Fmt_(val); + tmp_fmtr.Bld_bfr_many(tmp_bfr, args); + rv = tmp_bfr.Xto_bry_and_clear(); + } + return val_cmd == null ? rv : val_cmd.Process(src, key, rv); + } + private static final Bry_fmtr tmp_fmtr = Bry_fmtr.new_(); + private static final Bry_bfr tmp_bfr = Bry_bfr.reset_(255); +} diff --git a/400_xowa/src/gplx/intl/Gfo_i18n_mgr.java b/400_xowa/src/gplx/intl/Gfo_i18n_mgr.java new file mode 100644 index 000000000..829cc3c71 --- /dev/null +++ b/400_xowa/src/gplx/intl/Gfo_i18n_mgr.java @@ -0,0 +1,41 @@ +/* +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.intl; import gplx.*; +public class Gfo_i18n_mgr { + public String Dflt() {return dflt;} private String dflt = "en"; + public Gfo_i18n_mgr Add_txt_dflt(String key, String val) {return this;} + public Gfo_i18n_mgr Add_txt_one(String key, String lng, String val) {return this;} + public Gfo_i18n_mgr Add_txt_many(String key, String... ary) {return this;} +} +class Gfo_i18n_lng { + private Hash_adp_bry hash = Hash_adp_bry.cs_(); + public Gfo_i18n_lng(String lng) {this.lng = lng;} + public String Lng() {return lng;} private final String lng; + public void Add(int src, byte[] key, byte[] val, boolean val_fmt_exists, Gfo_i18n_val_cmd val_cmd) { + Gfo_i18n_itm itm = new Gfo_i18n_itm(src, key, val, val_fmt_exists, val_cmd); + hash.Add_bry_obj(key, itm); + } + public byte[] Bld_to_bry_none(byte[] key) { + Gfo_i18n_itm itm = (Gfo_i18n_itm)hash.Get_by_bry(key); + return itm.Bld_none(); + } + public byte[] Bld_to_bry_many(byte[] key, Object... args) { + Gfo_i18n_itm itm = (Gfo_i18n_itm)hash.Get_by_bry(key); + return itm.Bld_many(args); + } +} diff --git a/400_xowa/src/gplx/intl/Gfo_i18n_val_cmd.java b/400_xowa/src/gplx/intl/Gfo_i18n_val_cmd.java new file mode 100644 index 000000000..a1cdde4b6 --- /dev/null +++ b/400_xowa/src/gplx/intl/Gfo_i18n_val_cmd.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.intl; import gplx.*; +interface Gfo_i18n_val_cmd { + byte[] Process(int src, byte[] key, byte[] val); +} diff --git a/400_xowa/src/gplx/threads/Gfo_async_cmd_itm.java b/400_xowa/src/gplx/threads/Gfo_async_cmd_itm.java new file mode 100644 index 000000000..55e115f3d --- /dev/null +++ b/400_xowa/src/gplx/threads/Gfo_async_cmd_itm.java @@ -0,0 +1,42 @@ +/* +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.threads; import gplx.*; +public class Gfo_async_cmd_itm implements GfoInvkAble { + private GfoInvkAble invk; private String invk_key; private GfoMsg msg = GfoMsg_.new_cast_(""); + public Gfo_async_cmd_itm Init(GfoInvkAble invk, String invk_key, Object... args) { + this.invk = invk; this.invk_key = invk_key; + msg.Args_reset(); + msg.Clear(); + int len = args.length; + for (int i = 0; i < len; i += 2) { + String key = (String)args[i]; + Object val = args[i + 1]; + msg.Add(key, val); + } + return this; + } + public void Exec() { + GfoInvkAble_.InvkCmd_msg(invk, invk_key, msg); + } + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk_exec)) Exec(); + else return GfoInvkAble_.Rv_unhandled; + return this; + } private static final String Invk_exec = "exec"; + public static final Gfo_async_cmd_itm[] Ary_empty = new Gfo_async_cmd_itm[0]; +} diff --git a/400_xowa/src/gplx/threads/Gfo_async_cmd_mkr.java b/400_xowa/src/gplx/threads/Gfo_async_cmd_mkr.java new file mode 100644 index 000000000..d7cb0548b --- /dev/null +++ b/400_xowa/src/gplx/threads/Gfo_async_cmd_mkr.java @@ -0,0 +1,34 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.threads; import gplx.*; +class Gfo_async_cmd_mkr { +// private Gfo_async_cmd_itm[] free = Gfo_async_cmd_itm.Ary_empty, used = Gfo_async_cmd_itm.Ary_empty; +// private int free_bgn = 0, free_end = 0, ary_len = 0; +// public void Resize(int v) { +// free = (Gfo_async_cmd_itm[])Array_.Resize(free, v); +// used = (Gfo_async_cmd_itm[])Array_.Resize(used, v); +// ary_len = v; +// } + public Gfo_async_cmd_itm Get(GfoInvkAble invk, String invk_key, Object... args) { + Gfo_async_cmd_itm rv = new Gfo_async_cmd_itm(); + rv.Init(invk, invk_key, args); + return rv; + } + public void Rls(Gfo_async_cmd_itm cmd) { + } +} diff --git a/400_xowa/src/gplx/threads/Gfo_async_mgr.java b/400_xowa/src/gplx/threads/Gfo_async_mgr.java new file mode 100644 index 000000000..e2f36f497 --- /dev/null +++ b/400_xowa/src/gplx/threads/Gfo_async_mgr.java @@ -0,0 +1,57 @@ +/* +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.threads; import gplx.*; +public class Gfo_async_mgr implements GfoInvkAble { + private ListAdp queue = ListAdp_.new_(); + private Bool_obj_ref running = Bool_obj_ref.n_(); + private Gfo_async_cmd_mkr cmd_mkr = new Gfo_async_cmd_mkr(); + public void Queue(GfoInvkAble invk, String invk_key, Object... args) { + Gfo_async_cmd_itm cmd = cmd_mkr.Get(invk, invk_key, args); + synchronized (queue) { + queue.Add(cmd); + } + synchronized (running) { + if (running.Val_n()) { + running.Val_y_(); + gplx.threads.ThreadAdp_.invk_(Invk_run, this, Invk_run).Start(); + } + } + } + public void Run() { + Gfo_async_cmd_itm cmd = null; + try { + while (true) { + synchronized (queue) { + if (queue.Count() == 0) break; + cmd = (Gfo_async_cmd_itm)ListAdp_.Pop(queue); + cmd.Exec(); + } + } + } + finally { + synchronized (running) { + running.Val_n_(); + } + } + } + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk_run)) Run(); + else return GfoInvkAble_.Rv_unhandled; + return this; + } private static final String Invk_run = "run"; +} diff --git a/400_xowa/src/gplx/xowa/Xoa_app.java b/400_xowa/src/gplx/xowa/Xoa_app.java index af8edff83..5de9408ac 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app.java +++ b/400_xowa/src/gplx/xowa/Xoa_app.java @@ -31,7 +31,7 @@ public class Xoa_app implements GfoInvkAble { cfg_mgr = new Xoa_cfg_mgr(this); api_root = new Xoapi_root(this); url_cmd_eval = new Xoa_fsys_eval(this); - fsys_mgr = new Xoa_fsys_mgr(root_dir, bin_dir_name); + fsys_mgr = new Xoa_fsys_mgr(bin_dir_name, root_dir); launcher = new Launcher_app_mgr(this); fsys_mgr.Init_by_app(launcher); user = new Xou_user(this, user_dir); @@ -129,6 +129,7 @@ public class Xoa_app implements GfoInvkAble { public Xof_math_subst_regy Math_subst_regy() {return math_subst_regy;} private Xof_math_subst_regy math_subst_regy = new Xof_math_subst_regy(); public Gfo_usr_dlg Gui_wtr() {return gui_mgr.Browser_win().Usr_dlg();} public Launcher_app_mgr Launcher() {return launcher;} private Launcher_app_mgr launcher; + public Gfo_async_mgr Async_mgr() {return async_mgr;} private Gfo_async_mgr async_mgr = new Gfo_async_mgr(); public Xoi_setup_mgr Setup_mgr() {return setup_mgr;} private Xoi_setup_mgr setup_mgr; public Gfo_msg_log Msg_log() {return msg_log;} private Gfo_msg_log msg_log = new Gfo_msg_log(Xoa_app_.Name); diff --git a/400_xowa/src/gplx/xowa/Xoa_app_.java b/400_xowa/src/gplx/xowa/Xoa_app_.java index 73761c1ba..a809a47f1 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app_.java +++ b/400_xowa/src/gplx/xowa/Xoa_app_.java @@ -24,7 +24,7 @@ public class Xoa_app_ { boot_mgr.Run(args); } public static final String Name = "xowa"; - public static final String Version = "1.11.3.1"; + public static final String Version = "2.1.4.1"; public static String Build_date = "2012-12-30 00:00:00"; public static String Op_sys; public static String User_agent = ""; @@ -36,18 +36,6 @@ public class Xoa_app_ { rv.Log_wtr().Queue_enabled_(true); return rv; } - public static void Run_viewer() { - Io_url root_dir = Io_url_.new_dir_("J:\\gplx\\xowa\\"); - Xoav_app app = new Xoav_app(Gfo_usr_dlg_._, root_dir, "drd"); - app.Wiki_mgr().Load_default(); - - Xowv_wiki wiki = app.Wiki_mgr().Get_by_domain(Bry_.new_ascii_("simple.wikibooks.org")); - Hdump_page hpg = new Hdump_page(); - wiki.Hdump_mgr().Load(hpg, Bry_.new_utf8_("Main_Page")); - String html = String_.new_utf8_(hpg.Page_body()); - ConsoleAdp._.WriteLine(html); - ConsoleAdp._.ReadLine(""); - } public static final byte Mode_console = 0, Mode_gui = 1, Mode_http = 2; } class Xoa_app_boot_mgr { diff --git a/400_xowa/src/gplx/xowa/apps/fsys/Xoa_fsys_mgr.java b/400_xowa/src/gplx/xowa/apps/fsys/Xoa_fsys_mgr.java index 83c1f8a89..9c7df894b 100644 --- a/400_xowa/src/gplx/xowa/apps/fsys/Xoa_fsys_mgr.java +++ b/400_xowa/src/gplx/xowa/apps/fsys/Xoa_fsys_mgr.java @@ -17,29 +17,37 @@ along with this program. If not, see . */ package gplx.xowa.apps.fsys; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; public class Xoa_fsys_mgr implements GfoInvkAble { - public Xoa_fsys_mgr(Io_url root_dir, String plat_name) { + public Xoa_fsys_mgr() {} // DRD + public Xoa_fsys_mgr(String plat_name, Io_url root_dir) { + Init_by_boot(plat_name, root_dir); + } + public Io_url Root_dir() {return root_dir;} private Io_url root_dir; + public byte[] Root_dir_bry() {return root_dir_bry;} private byte[] root_dir_bry; + public Io_url File_dir() {return file_dir;} private Io_url file_dir; + public Io_url Wiki_dir() {return wiki_dir;} private Io_url wiki_dir; + public Io_url Bin_plat_dir() {return bin_plat_dir;} private Io_url bin_plat_dir; + public Io_url Bin_any_dir() {return bin_any_dir;} private Io_url bin_any_dir; + public Io_url Bin_xowa_dir() {return bin_any_dir.GenSubDir("xowa");} + public Io_url Bin_xtns_dir() {return bin_xtns_dir;} private Io_url bin_xtns_dir; + public Io_url Cfg_lang_core_dir() {return cfg_lang_core_dir;} private Io_url cfg_lang_core_dir; + public Io_url Cfg_wiki_core_dir() {return cfg_wiki_core_dir;} private Io_url cfg_wiki_core_dir; + public Io_url Bin_data_os_cfg_fil() {return bin_plat_dir.GenSubFil_nest("xowa", "cfg", Xoa_gfs_mgr.Cfg_os);} + public void Init_by_boot(String plat_name, Io_url root_dir) { this.root_dir = root_dir; root_dir_bry = root_dir.To_http_file_bry(); file_dir = root_dir.GenSubDir("file"); - wiki_dir = root_dir.GenSubDir("wiki"); bin_plat_dir = root_dir.GenSubDir("bin").GenSubDir(plat_name); bin_any_dir = root_dir.GenSubDir("bin").GenSubDir("any"); bin_xtns_dir = bin_any_dir.GenSubDir_nest("xowa", "xtns"); cfg_lang_core_dir = bin_any_dir.GenSubDir_nest("xowa", "cfg", "lang", "core"); cfg_wiki_core_dir = bin_any_dir.GenSubDir_nest("xowa", "cfg", "wiki", "core"); + Wiki_dir_ (root_dir.GenSubDir("wiki")); } - public Io_url Root_dir() {return root_dir;} private final Io_url root_dir; - public byte[] Root_dir_bry() {return root_dir_bry;} private final byte[] root_dir_bry; - public Io_url File_dir() {return file_dir;} private final Io_url file_dir; - public Io_url Wiki_dir() {return wiki_dir;} public Xoa_fsys_mgr Wiki_dir_(Io_url v) {wiki_dir = v; return this;} private Io_url wiki_dir; - public Io_url Bin_plat_dir() {return bin_plat_dir;} private final Io_url bin_plat_dir; - public Io_url Bin_any_dir() {return bin_any_dir;} private final Io_url bin_any_dir; - public Io_url Bin_xowa_dir() {return bin_any_dir.GenSubDir("xowa");} - public Io_url Bin_xtns_dir() {return bin_xtns_dir;} private final Io_url bin_xtns_dir; - public Io_url Cfg_lang_core_dir() {return cfg_lang_core_dir;} private final Io_url cfg_lang_core_dir; - public Io_url Cfg_wiki_core_dir() {return cfg_wiki_core_dir;} private final Io_url cfg_wiki_core_dir; - public Io_url Bin_data_os_cfg_fil() {return bin_plat_dir.GenSubFil_nest("xowa", "cfg", Xoa_gfs_mgr.Cfg_os);} - public void Init_by_app(GfoInvkAble app_mgr_invk) { + public Xoa_fsys_mgr Wiki_dir_(Io_url v) { + wiki_dir = v; + return this; + } + public void Init_by_app(GfoInvkAble app_mgr_invk) {// for gfs and app.launcher this.app_mgr_invk = app_mgr_invk; } private GfoInvkAble app_mgr_invk; public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { diff --git a/400_xowa/src/gplx/xowa/bldrs/Db_mgr_fxt.java b/400_xowa/src/gplx/xowa/bldrs/Db_mgr_fxt.java index b1f74dcfc..d16e755e7 100644 --- a/400_xowa/src/gplx/xowa/bldrs/Db_mgr_fxt.java +++ b/400_xowa/src/gplx/xowa/bldrs/Db_mgr_fxt.java @@ -37,7 +37,7 @@ public class Db_mgr_fxt { Xodb_page_tbl tbl_page = wiki.Db_mgr_as_sql().Tbl_page(); Db_stmt stmt = Db_stmt_.Null; try { - stmt = tbl_page.Insert_stmt(wiki.Db_mgr_as_sql().Fsys_mgr().Provider_page()); + stmt = tbl_page.Insert_stmt(wiki.Db_mgr_as_sql().Fsys_mgr().Conn_page()); int len = ttls.length; DateAdp modified_on = Tfds.Now_time0_add_min(0); for (int i = 0; i < len; i++) { @@ -127,18 +127,18 @@ public class Db_mgr_fxt { public void Init_db_sqlite() {Init_db_sqlite(Xoa_test_.Url_wiki_enwiki().GenSubFil_nest("en.wikipedia.org.sqlite3"));} public void Init_db_sqlite(Io_url url) { Xow_wiki wiki = this.Wiki(); - Db_provider_pool._.Clear(); + Db_conn_pool_old._.Clear(); Xodb_mgr_sql db_mgr = wiki.Db_mgr_create_as_sql(); db_mgr.Data_storage_format_(gplx.ios.Io_stream_.Tid_file); db_mgr.Init_by_ns_map(""); - Db_provider provider = db_mgr.Fsys_mgr().Provider_core(); - provider.Exec_qry(Db_qry_delete.new_all_("xowa_cfg")); - provider.Exec_qry(Db_qry_delete.new_all_("xowa_db")); - provider.Exec_qry(Db_qry_delete.new_all_("xowa_ns")); - provider.Exec_qry(Db_qry_delete.new_all_("page")); - provider.Exec_qry(Db_qry_delete.new_all_("text")); - provider.Exec_qry(Db_qry_delete.new_all_("category")); - provider.Exec_qry(Db_qry_delete.new_all_("categorylinks")); + Db_conn conn = db_mgr.Fsys_mgr().Conn_core(); + conn.Exec_qry(Db_qry_delete.new_all_("xowa_cfg")); + conn.Exec_qry(Db_qry_delete.new_all_("xowa_db")); + conn.Exec_qry(Db_qry_delete.new_all_("xowa_ns")); + conn.Exec_qry(Db_qry_delete.new_all_("page")); + conn.Exec_qry(Db_qry_delete.new_all_("text")); + conn.Exec_qry(Db_qry_delete.new_all_("category")); + conn.Exec_qry(Db_qry_delete.new_all_("categorylinks")); } String dsv_db; public void Init_db_tdb() { Io_mgr._.InitEngine_mem(); diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_diff_regy_exec_cmd.java b/400_xowa/src/gplx/xowa/bldrs/files/Xob_diff_regy_exec_cmd.java index c1bf60eb2..a9cc2db2d 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_diff_regy_exec_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/files/Xob_diff_regy_exec_cmd.java @@ -61,18 +61,18 @@ class Xob_diff_regy_sql_runner { public void Run_sql(Xoa_app app) { Xow_wiki wiki = app.Wiki_mgr().Get_by_key_or_null(Bry_.new_utf8_(wiki_domain)); app.Usr_dlg().Prog_many("", "", "running sql: url=~{0}", url.NameAndExt()); - Db_provider provider = Get_provider(wiki, fsdb_db_id, fsdb_db_tid); - provider.Exec_sql(Io_mgr._.LoadFilStr(url)); + Db_conn conn = Get_provider(wiki, fsdb_db_id, fsdb_db_tid); + conn.Exec_sql(Io_mgr._.LoadFilStr(url)); if (fsdb_db_tid == Fsdb_db_tid_.Tid_bin) - provider.Exec_sql("VACUUM;"); + conn.Exec_sql("VACUUM;"); } - public static Db_provider Get_provider(Xow_wiki wiki, int fsdb_db_id, byte fsdb_db_tid) { + public static Db_conn Get_provider(Xow_wiki wiki, int fsdb_db_id, byte fsdb_db_tid) { wiki.File_mgr().Fsdb_mgr().Init_by_wiki(wiki); Fsdb_db_abc_mgr abc_mgr = wiki.File_mgr().Fsdb_mgr().Mnt_mgr().Abc_mgr_at(0); if (fsdb_db_tid == Fsdb_db_tid_.Tid_bin) - return abc_mgr.Bin_mgr().Get_at(fsdb_db_id).Provider(); + return abc_mgr.Bin_mgr().Get_at(fsdb_db_id).Conn(); else if (fsdb_db_tid == Fsdb_db_tid_.Tid_atr) - return abc_mgr.Atr_mgr().Get_at(0).Provider(); + return abc_mgr.Atr_mgr().Get_at(0).Conn(); else throw Err_.unhandled(fsdb_db_tid); } diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_diff_regy_make_cmd.java b/400_xowa/src/gplx/xowa/bldrs/files/Xob_diff_regy_make_cmd.java index b5e223d45..0fe9be81e 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_diff_regy_make_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/files/Xob_diff_regy_make_cmd.java @@ -26,12 +26,12 @@ public class Xob_diff_regy_make_cmd extends Xob_itm_basic_base implements Xob_cm public void Cmd_end() {} public void Cmd_print() {} private void Exec_main() { - Db_provider make_db_provider = Xodb_db_file.init__file_make(wiki.Fsys_mgr().Root_dir()).Provider(); + Db_conn make_db_provider = Xodb_db_file.init__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); this.Make_join_indexes(make_db_provider); this.Make_diff_regy(make_db_provider); this.Make_delete_sql(make_db_provider); } - private void Make_join_indexes(Db_provider make_db_provider) { + private void Make_join_indexes(Db_conn make_db_provider) { try { Sqlite_engine_.Idx_create(make_db_provider, Xob_diff_regy_tbl.Idx_fsdb_regy__join); Sqlite_engine_.Idx_create(make_db_provider, Xob_diff_regy_tbl.Idx_xfer_regy__join); @@ -40,12 +40,12 @@ public class Xob_diff_regy_make_cmd extends Xob_itm_basic_base implements Xob_cm app.Usr_dlg().Warn_many("", "", "error while making indexes: err=~{0}", Err_.Message_gplx(exc)); } } - private void Make_diff_regy(Db_provider make_db_provider) { + private void Make_diff_regy(Db_conn make_db_provider) { Sqlite_engine_.Tbl_create_and_delete(make_db_provider, Xob_diff_regy_tbl.Tbl_name, Xob_diff_regy_tbl.Tbl_sql); make_db_provider.Exec_sql(Xob_diff_regy_tbl.Make_diff_regy); Sqlite_engine_.Idx_create(make_db_provider, Xob_diff_regy_tbl.Idx_diff_regy__load); } - private void Make_delete_sql(Db_provider make_db_provider) { + private void Make_delete_sql(Db_conn make_db_provider) { DataRdr rdr = make_db_provider.Exec_sql_as_rdr(Xob_diff_regy_tbl.Make_deletes); int cur_db_id = -1, cur_count = 0; Bry_bfr atr_bfr = Bry_bfr.new_(), bin_bfr = Bry_bfr.new_(); diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_fsdb_make.java b/400_xowa/src/gplx/xowa/bldrs/files/Xob_fsdb_make.java index 9525ebb0b..7c08cfdc0 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_fsdb_make.java +++ b/400_xowa/src/gplx/xowa/bldrs/files/Xob_fsdb_make.java @@ -30,7 +30,7 @@ public class Xob_fsdb_make extends Xob_itm_basic_base implements Xob_cmd { private byte[] wiki_key; private Xobu_poll_mgr poll_mgr; private int poll_interval; private long time_bgn; - private Xodb_xowa_cfg_tbl tbl_cfg; private Db_provider provider; private Db_stmt db_select_stmt; + private Xodb_xowa_cfg_tbl tbl_cfg; private Db_conn conn; private Db_stmt db_select_stmt; private Xof_bin_mgr src_mgr; private Xof_fsdb_mgr_sql trg_fsdb_mgr; private Fsdb_mnt_mgr trg_mnt_mgr; private ListAdp temp_files = ListAdp_.new_(); @@ -69,7 +69,7 @@ public class Xob_fsdb_make extends Xob_itm_basic_base implements Xob_cmd { trg_fsdb_mgr.Txn_save(); trg_fsdb_mgr.Rls(); // save changes and rls all connections db_select_stmt.Rls(); - provider.Conn_term(); + conn.Conn_term(); } public void Cmd_print() {} private int db_reset_tries_count = 0, db_reset_tries_max = 5; @@ -79,7 +79,7 @@ public class Xob_fsdb_make extends Xob_itm_basic_base implements Xob_cmd { ListAdp list = ListAdp_.new_(); boolean loop = true; time_bgn = Env_.TickCount(); - usr_dlg.Note_many("", "", "total pending: ~{0}", Xob_xfer_regy_tbl.Select_total_pending(provider)); + usr_dlg.Note_many("", "", "total pending: ~{0}", Xob_xfer_regy_tbl.Select_total_pending(conn)); this.Txn_open(); while (loop) { byte rslt = Select_ttls(list); @@ -120,12 +120,12 @@ public class Xob_fsdb_make extends Xob_itm_basic_base implements Xob_cmd { } private void Init_db(boolean chk_reset) { Xodb_db_file db_file = Xodb_db_file.init__file_make(wiki.Fsys_mgr().Root_dir()); - provider = db_file.Provider(); - tbl_cfg = new Xodb_xowa_cfg_tbl().Provider_(provider); + conn = db_file.Conn(); + tbl_cfg = new Xodb_xowa_cfg_tbl().Conn_(conn); if (reset_db && chk_reset) { - provider.Exec_qry(Db_qry_.delete_tbl_(Xodb_xowa_cfg_tbl.Tbl_name)); + conn.Exec_qry(Db_qry_.delete_tbl_(Xodb_xowa_cfg_tbl.Tbl_name)); } - db_select_stmt = Xob_xfer_regy_tbl.Select_by_page_id_stmt(provider); + db_select_stmt = Xob_xfer_regy_tbl.Select_by_page_id_stmt(conn); } private boolean Init_bmk(Xodb_xowa_cfg_tbl tbl_cfg) { if (!resume_enabled) { // clear cfg entries if resume disabled; note that disabled by default; DATE:2014-10-24 @@ -162,7 +162,7 @@ public class Xob_fsdb_make extends Xob_itm_basic_base implements Xob_cmd { DataRdr rdr = DataRdr_.Null; boolean pages_found = false, links_found = false; try { - rdr = Xob_xfer_regy_tbl.Select_by_lnki_page_id(provider, page_id_val, select_interval); + rdr = Xob_xfer_regy_tbl.Select_by_lnki_page_id(conn, page_id_val, select_interval); while (rdr.MoveNextPeer()) { pages_found = true; // at least one page found; set true Xodb_tbl_oimg_xfer_itm itm = Xodb_tbl_oimg_xfer_itm.new_rdr_(rdr); @@ -250,14 +250,14 @@ public class Xob_fsdb_make extends Xob_itm_basic_base implements Xob_cmd { this.Txn_open(); } private void Txn_open() { - tbl_cfg.Provider().Txn_mgr().Txn_bgn_if_none(); + tbl_cfg.Conn().Txn_mgr().Txn_bgn_if_none(); trg_mnt_mgr.Txn_open(); } private void Txn_save() { usr_dlg.Prog_many("", "", "committing data: count=~{0} failed=~{1}", exec_count, exec_fail); tbl_cfg.Update(Cfg_fsdb_make, Cfg_page_id_bmk, page_id_val); tbl_cfg.Update(Cfg_fsdb_make, Cfg_lnki_id_bmk, lnki_id_val); - tbl_cfg.Provider().Txn_mgr().Txn_end_all(); + tbl_cfg.Conn().Txn_mgr().Txn_end_all(); trg_mnt_mgr.Txn_save(); if (exit_after_commit) exit_now = true; diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_regy_cmd.java b/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_regy_cmd.java index 2eaebd064..11c455d87 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_regy_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_regy_cmd.java @@ -22,9 +22,9 @@ public class Xob_lnki_regy_cmd extends Xob_itm_basic_base implements Xob_cmd { public String Cmd_key() {return KEY_oimg;} public static final String KEY_oimg = "file.lnki_regy"; public void Cmd_ini(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) { - Db_provider provider = Xodb_db_file.init__file_make(wiki.Fsys_mgr().Root_dir()).Provider(); - Xob_lnki_regy_tbl.Create_table(provider); - Xob_lnki_regy_tbl.Create_data(usr_dlg, provider, Xob_lnki_temp_wkr.Wiki_ns_for_file_is_case_match_all(wiki)); + Db_conn conn = Xodb_db_file.init__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); + Xob_lnki_regy_tbl.Create_table(conn); + Xob_lnki_regy_tbl.Create_data(usr_dlg, conn, Xob_lnki_temp_wkr.Wiki_ns_for_file_is_case_match_all(wiki)); } public void Cmd_run() {} public void Cmd_end() {} diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_regy_tbl.java b/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_regy_tbl.java index 24510181f..d9acf9eda 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_regy_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_regy_tbl.java @@ -18,8 +18,8 @@ along with this program. If not, see . package gplx.xowa.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.dbs.*; import gplx.xowa.dbs.*; class Xob_lnki_regy_tbl { - public static void Create_table(Db_provider p) {Sqlite_engine_.Tbl_create_and_delete(p, Tbl_name, Tbl_sql);} - public static void Create_data(Gfo_usr_dlg usr_dlg, Db_provider p, boolean wiki_ns_for_file_is_case_match_all) { + public static void Create_table(Db_conn p) {Sqlite_engine_.Tbl_create_and_delete(p, Tbl_name, Tbl_sql);} + public static void Create_data(Gfo_usr_dlg usr_dlg, Db_conn p, boolean wiki_ns_for_file_is_case_match_all) { p.Exec_sql(Sql_create_data); Sqlite_engine_.Idx_create(usr_dlg, p, "lnki_regy", Idx_ttl); if (wiki_ns_for_file_is_case_match_all) diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_temp_tbl.java b/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_temp_tbl.java index df93d7b95..80b497fc2 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_temp_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_temp_tbl.java @@ -18,21 +18,21 @@ along with this program. If not, see . package gplx.xowa.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.dbs.*; class Xob_lnki_temp_tbl { - public static void Create_table(Db_provider p) {Sqlite_engine_.Tbl_create(p, Tbl_name, Tbl_sql);} - public static Db_stmt Insert_stmt(Db_provider p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_lnki_page_id, Fld_lnki_ttl, Fld_lnki_commons_ttl, Fld_lnki_ext, Fld_lnki_type, Fld_lnki_src_tid, Fld_lnki_w, Fld_lnki_h, Fld_lnki_upright, Fld_lnki_time, Fld_lnki_page);} + public static void Create_table(Db_conn p) {Sqlite_engine_.Tbl_create(p, Tbl_name, Tbl_sql);} + public static Db_stmt Insert_stmt(Db_conn p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_lnki_page_id, Fld_lnki_ttl, Fld_lnki_commons_ttl, Fld_lnki_ext, Fld_lnki_type, Fld_lnki_src_tid, Fld_lnki_w, Fld_lnki_h, Fld_lnki_upright, Fld_lnki_time, Fld_lnki_page);} public static void Insert(Db_stmt stmt, int page_id, byte[] ttl, byte[] ttl_commons, byte ext_id, byte img_type, byte lnki_src_tid, int w, int h, double upright, double thumbtime, int page) { stmt.Clear() - .Val_int_(page_id) - .Val_str_by_bry_(ttl) - .Val_str_by_bry_(ttl_commons) - .Val_byte_(ext_id) - .Val_byte_(img_type) - .Val_int_(lnki_src_tid) - .Val_int_(w) - .Val_int_(h) - .Val_double_(upright) - .Val_double_(gplx.xowa.files.Xof_doc_thumb.Db_save_double(thumbtime)) - .Val_int_(page) + .Val_int(page_id) + .Val_bry_as_str(ttl) + .Val_bry_as_str(ttl_commons) + .Val_byte(ext_id) + .Val_byte(img_type) + .Val_int(lnki_src_tid) + .Val_int(w) + .Val_int(h) + .Val_double(upright) + .Val_double(gplx.xowa.files.Xof_doc_thumb.Db_save_double(thumbtime)) + .Val_int(page) .Exec_insert(); } public static final String Tbl_name = "lnki_temp" diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_temp_wkr.java b/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_temp_wkr.java index 33d03a5fb..3e4a83bf5 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_temp_wkr.java +++ b/400_xowa/src/gplx/xowa/bldrs/files/Xob_lnki_temp_wkr.java @@ -22,7 +22,7 @@ import gplx.xowa.bldrs.oimgs.*; import gplx.fsdb.*; import gplx.xowa.files.*; im import gplx.xowa.parsers.lnkis.redlinks.*; import gplx.xowa.parsers.logs.*; import gplx.xowa.hdumps.*; import gplx.xowa.xtns.scribunto.*; import gplx.xowa.xtns.wdatas.*; public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements Xop_lnki_logger { - private Db_provider provider; private Db_stmt stmt; + private Db_conn conn; private Db_stmt stmt; private boolean wdata_enabled = true, xtn_ref_enabled = true, gen_html, gen_hdump; private Xop_log_invoke_wkr invoke_wkr; private Xop_log_property_wkr property_wkr; private int[] ns_ids = Int_.Ary(Xow_ns_.Id_main);// , Xow_ns_.Id_category, Xow_ns_.Id_template @@ -32,19 +32,19 @@ public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements Xop_lnki_log @Override public String Cmd_key() {return KEY_oimg;} public static final String KEY_oimg = "file.lnki_temp"; @Override public byte Init_redirect() {return Bool_.N_byte;} @Override public int[] Init_ns_ary() {return ns_ids;} - @Override protected void Init_reset(Db_provider p) { + @Override protected void Init_reset(Db_conn p) { p.Exec_sql("DELETE FROM " + Xodb_xowa_cfg_tbl.Tbl_name); p.Exec_sql("DELETE FROM " + Xob_lnki_temp_tbl.Tbl_name); invoke_wkr.Init_reset(); property_wkr.Init_reset(); } - @Override protected Db_provider Init_db_file() { + @Override protected Db_conn Init_db_file() { ctx.Lnki().File_wkr_(this); Xodb_db_file make_db_file = Xodb_db_file.init__file_make(wiki.Fsys_mgr().Root_dir()); - provider = make_db_file.Provider(); - Xob_lnki_temp_tbl.Create_table(provider); - stmt = Xob_lnki_temp_tbl.Insert_stmt(provider); - return provider; + conn = make_db_file.Conn(); + Xob_lnki_temp_tbl.Create_table(conn); + stmt = Xob_lnki_temp_tbl.Insert_stmt(conn); + return conn; } @Override protected void Cmd_bgn_end() { wiki_ns_file_is_case_match_all = Wiki_ns_for_file_is_case_match_all(wiki); // NOTE: must call after wiki.init @@ -69,10 +69,10 @@ public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements Xop_lnki_log trg_mnt_mgr.Insert_to_mnt_(Fsdb_mnt_mgr.Mnt_idx_main); Fsdb_mnt_mgr.Patch(trg_mnt_mgr); // NOTE: see fsdb_make; DATE:2014-04-26 if (gen_hdump) { - hdump_bldr = new Xob_hdump_bldr(wiki.Db_mgr_as_sql(), provider, hdump_max); + hdump_bldr = new Xob_hdump_bldr(wiki.Db_mgr_as_sql(), conn, hdump_max); hdump_bldr.Bld_init(); } - provider.Txn_mgr().Txn_bgn_if_none(); + conn.Txn_mgr().Txn_bgn_if_none(); log_mgr.Txn_bgn(); } @Override public void Exec_pg_itm_hook(Xow_ns ns, Xodb_page db_page, byte[] page_src) { @@ -101,13 +101,13 @@ public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements Xop_lnki_log } } @Override public void Exec_commit_hook() { - provider.Txn_mgr().Txn_end_all_bgn_if_none(); // save lnki_temp + conn.Txn_mgr().Txn_end_all_bgn_if_none(); // save lnki_temp if (gen_hdump) hdump_bldr.Commit(); } @Override public void Exec_end_hook() { if (gen_hdump) hdump_bldr.Bld_term(); wiki.App().Log_mgr().Txn_end(); - provider.Txn_mgr().Txn_end(); + conn.Txn_mgr().Txn_end(); } public void Wkr_exec(Xop_ctx ctx, byte[] src, Xop_lnki_tkn lnki, byte lnki_src_tid) { if (lnki.Ttl().ForceLiteralLink()) return; // ignore literal links which creat a link to file, but do not show the image; EX: [[:File:A.png|thumb|120px]] creates a link to File:A.png, regardless of other display-oriented args @@ -121,7 +121,7 @@ public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements Xop_lnki_log usr_dlg.Warn_many("", "", "page and thumbtime both set; this may be an issue with fsdb: page=~{0} ttl=~{1}", ctx.Cur_page().Ttl().Page_db_as_str(), String_.new_utf8_(ttl)); if (lnki.Ns_id() == Xow_ns_.Id_media) lnki_src_tid = Xob_lnki_src_tid.Tid_media; - Xob_lnki_temp_tbl.Insert(stmt, ctx.Cur_page().Revision_data().Id(), ttl, ttl_commons, Byte_.int_(ext.Id()), lnki.Lnki_type(), lnki_src_tid, lnki.Lnki_w(), lnki.Lnki_h(), lnki.Upright(), lnki_thumbtime, lnki_page); + Xob_lnki_temp_tbl.Insert(stmt, ctx.Cur_page().Revision_data().Id(), ttl, ttl_commons, Byte_.By_int(ext.Id()), lnki.Lnki_type(), lnki_src_tid, lnki.Lnki_w(), lnki.Lnki_h(), lnki.Upright(), lnki_thumbtime, lnki_page); } @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_wdata_enabled_)) wdata_enabled = m.ReadYn("v"); diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_orig_qry_cmd.java b/400_xowa/src/gplx/xowa/bldrs/files/Xob_orig_qry_cmd.java index 5149dc774..95af1f0af 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_orig_qry_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/files/Xob_orig_qry_cmd.java @@ -24,14 +24,14 @@ public class Xob_orig_qry_cmd extends Xob_itm_basic_base implements Xob_cmd { public void Cmd_ini(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) { // Xof_qry_mgr qry_mgr = new Xof_qry_mgr(); - Db_provider provider = Xodb_db_file.init__file_make(wiki.Fsys_mgr().Root_dir()).Provider(); + Db_conn conn = Xodb_db_file.init__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); Xob_bmk_mgr bmk = new Xob_bmk_mgr(); - bmk.Init(provider, this.Cmd_key(), true, false, true); + bmk.Init(conn, this.Cmd_key(), true, false, true); bmk.Load(); Xof_fsdb_itm itm = new Xof_fsdb_itm(); DataRdr rdr = DataRdr_.Null; try { - // rdr = Select(provider, bmk.Repo_prv(), bmk.Ttl_prv()); + // rdr = Select(conn, bmk.Repo_prv(), bmk.Ttl_prv()); while (rdr.MoveNextPeer()) { Load_itm(itm, rdr); // QueryItm @@ -51,7 +51,7 @@ public class Xob_orig_qry_cmd extends Xob_itm_basic_base implements Xob_cmd { private void Load_itm(Xof_fsdb_itm itm, DataRdr rdr) { itm.Lnki_ttl_(null); } - public DataRdr Select(Db_provider p, byte prv_repo_id, byte[] prv_ttl) { + public DataRdr Select(Db_conn p, byte prv_repo_id, byte[] prv_ttl) { String sql = String_.Concat_lines_nl_skip_last ( "SELECT lnki_ttl" , "FROM orig_regy" diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_orig_regy_cmd.java b/400_xowa/src/gplx/xowa/bldrs/files/Xob_orig_regy_cmd.java index 045817b2e..0bdb10bb0 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_orig_regy_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/files/Xob_orig_regy_cmd.java @@ -23,8 +23,8 @@ public class Xob_orig_regy_cmd extends Xob_itm_basic_base implements Xob_cmd { public String Cmd_key() {return KEY_oimg;} public static final String KEY_oimg = "file.orig_regy"; public void Cmd_ini(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) { - Db_provider provider = Xodb_db_file.init__file_make(wiki.Fsys_mgr().Root_dir()).Provider(); - Xob_orig_regy_tbl.Create_table(provider); + Db_conn conn = Xodb_db_file.init__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); + Xob_orig_regy_tbl.Create_table(conn); Xow_wiki commons_wiki = bldr.App().Wiki_mgr().Get_by_key_or_make(Xow_wiki_.Domain_commons_bry).Init_assert(); Xow_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 @@ -33,7 +33,7 @@ public class Xob_orig_regy_cmd extends Xob_itm_basic_base implements Xob_cmd { } repo_0.Init_assert(); repo_1.Init_assert(); Xodb_db_file file_registry_db = Xodb_db_file.init__page_regy(commons_wiki.Fsys_mgr().Root_dir()); - Xob_orig_regy_tbl.Create_data(bldr.Usr_dlg(), provider, file_registry_db, repo_0_is_remote, repo_0, repo_1, Xob_lnki_temp_wkr.Wiki_ns_for_file_is_case_match_all(wiki)); + Xob_orig_regy_tbl.Create_data(bldr.Usr_dlg(), conn, file_registry_db, repo_0_is_remote, repo_0, repo_1, Xob_lnki_temp_wkr.Wiki_ns_for_file_is_case_match_all(wiki)); } public void Cmd_run() {} public void Cmd_end() {} diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_orig_regy_tbl.java b/400_xowa/src/gplx/xowa/bldrs/files/Xob_orig_regy_tbl.java index 784ca3edd..95fcdc154 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_orig_regy_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/files/Xob_orig_regy_tbl.java @@ -18,8 +18,8 @@ along with this program. If not, see . package gplx.xowa.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.bldrs.oimgs.*; class Xob_orig_regy_tbl { - public static void Create_table(Db_provider p) {Sqlite_engine_.Tbl_create_and_delete(p, Tbl_name, Tbl_sql);} - public static void Create_data(Gfo_usr_dlg usr_dlg, Db_provider p, Xodb_db_file file_registry_db, boolean repo_0_is_remote, Xow_wiki repo_0_wiki, Xow_wiki repo_1_wiki, boolean wiki_ns_for_file_is_case_match_all) { + public static void Create_table(Db_conn p) {Sqlite_engine_.Tbl_create_and_delete(p, Tbl_name, Tbl_sql);} + public static void Create_data(Gfo_usr_dlg usr_dlg, Db_conn p, Xodb_db_file file_registry_db, boolean repo_0_is_remote, Xow_wiki repo_0_wiki, Xow_wiki repo_1_wiki, boolean wiki_ns_for_file_is_case_match_all) { usr_dlg.Prog_many("", "", "inserting lnki_regy"); p.Exec_sql(Sql_create_data); Sqlite_engine_.Idx_create(usr_dlg, p, "orig_regy", Idx_ttl_local); @@ -37,9 +37,9 @@ class Xob_orig_regy_tbl { repo_1_tid = Xof_repo_itm.Repo_local; local_wiki = repo_1_wiki; } - Create_data_for_repo(usr_dlg, p, local_wiki, Byte_.int_(repo_0_tid), repo_0_dir.GenSubFil(Xodb_db_file.Name__wiki_image)); + Create_data_for_repo(usr_dlg, p, local_wiki, Byte_.By_int(repo_0_tid), repo_0_dir.GenSubFil(Xodb_db_file.Name__wiki_image)); if (!local_is_remote) { // only run for repo_1 if local != remote; only affects commons - Create_data_for_repo(usr_dlg, p, local_wiki, Byte_.int_(repo_1_tid), repo_1_dir.GenSubFil(Xodb_db_file.Name__wiki_image)); + Create_data_for_repo(usr_dlg, p, local_wiki, Byte_.By_int(repo_1_tid), repo_1_dir.GenSubFil(Xodb_db_file.Name__wiki_image)); if (wiki_ns_for_file_is_case_match_all) { Io_url repo_remote_dir = repo_0_is_remote ? repo_0_dir : repo_1_dir; Create_data_for_cs(usr_dlg, p, local_wiki, repo_remote_dir); @@ -48,7 +48,7 @@ class Xob_orig_regy_tbl { Sqlite_engine_.Db_detach(p, "page_db"); Sqlite_engine_.Idx_create(usr_dlg, p, "orig_regy", Idx_xfer_temp); } - private static void Create_data_for_repo(Gfo_usr_dlg usr_dlg, Db_provider cur, Xow_wiki local_wiki, byte repo_tid, Io_url join) { + private static void Create_data_for_repo(Gfo_usr_dlg usr_dlg, Db_conn cur, Xow_wiki local_wiki, byte repo_tid, Io_url join) { usr_dlg.Note_many("", "", "inserting page for xowa.wiki.image: ~{0}", join.OwnerDir().NameOnly()); boolean wiki_has_cs_file = repo_tid == Xof_repo_itm.Repo_remote && local_wiki.Ns_mgr().Ns_file().Case_match() == Xow_ns_case_.Id_all; String lnki_ttl_fld = wiki_has_cs_file ? "Coalesce(o.lnki_commons_ttl, o.lnki_ttl)" : "o.lnki_ttl"; // NOTE: use lnki_commons_ttl if [[File]] is cs PAGE:en.d:water EX:[[image:wikiquote-logo.png|50px|none|alt=]]; DATE:2014-09-05 @@ -59,7 +59,7 @@ class Xob_orig_regy_tbl { cur.Exec_sql(String_.Format(Sql_update_repo_redirect, repo_tid, lnki_ttl_fld)); Sqlite_engine_.Db_detach(cur, "image_db"); } - private static void Create_data_for_cs(Gfo_usr_dlg usr_dlg, Db_provider p, Xow_wiki local_wiki, Io_url repo_remote_dir) { + private static void Create_data_for_cs(Gfo_usr_dlg usr_dlg, Db_conn p, Xow_wiki local_wiki, Io_url repo_remote_dir) { p.Exec_sql(Xob_orig_regy_tbl.Sql_cs_mark_dupes); // orig_regy: find dupes; see note in SQL p.Exec_sql(Xob_orig_regy_tbl.Sql_cs_update_ttls); // orig_regy: update lnki_ttl with lnki_commons_ttl Create_data_for_repo(usr_dlg, p, local_wiki, Xof_repo_itm.Repo_remote, repo_remote_dir.GenSubFil(Xodb_db_file.Name__wiki_image)); diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_page_regy_cmd.java b/400_xowa/src/gplx/xowa/bldrs/files/Xob_page_regy_cmd.java index 2fc82455a..7147e7595 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_page_regy_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/files/Xob_page_regy_cmd.java @@ -24,7 +24,7 @@ public class Xob_page_regy_cmd extends Xob_itm_basic_base implements Xob_cmd { public void Cmd_ini(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) { Xow_wiki commons_wiki = bldr.App().Wiki_mgr().Get_by_key_or_make(Xow_wiki_.Domain_commons_bry).Init_assert(); - Db_provider page_regy_provider = Xodb_db_file.init__page_regy(commons_wiki.Fsys_mgr().Root_dir()).Provider(); + Db_conn page_regy_provider = Xodb_db_file.init__page_regy(commons_wiki.Fsys_mgr().Root_dir()).Conn(); commons_wiki.Init_assert(); if (build_commons) { Xob_page_regy_tbl.Reset_table(page_regy_provider); diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_page_regy_tbl.java b/400_xowa/src/gplx/xowa/bldrs/files/Xob_page_regy_tbl.java index 975baed4a..6964271b3 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_page_regy_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/files/Xob_page_regy_tbl.java @@ -18,21 +18,21 @@ along with this program. If not, see . package gplx.xowa.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.bldrs.oimgs.*; class Xob_page_regy_tbl { - public static void Reset_table(Db_provider p) {Sqlite_engine_.Tbl_create_and_delete(p, Tbl_name, Tbl_sql);} - public static void Create_data(Gfo_usr_dlg usr_dlg, Db_provider p, byte repo_tid, Xow_wiki wiki) { + public static void Reset_table(Db_conn p) {Sqlite_engine_.Tbl_create_and_delete(p, Tbl_name, Tbl_sql);} + public static void Create_data(Gfo_usr_dlg usr_dlg, Db_conn p, byte repo_tid, Xow_wiki wiki) { Create_data__insert_page(usr_dlg, p, repo_tid, wiki.Db_mgr_as_sql().Fsys_mgr().Get_url(Xodb_file_tid.Tid_core)); Create_data__insert_redirect(usr_dlg, p, repo_tid, wiki.Fsys_mgr().Root_dir().GenSubFil(Xodb_db_file.Name__wiki_redirect)); } - public static void Delete_local(Db_provider p) { + public static void Delete_local(Db_conn p) { p.Exec_sql("DELETE FROM page_regy WHERE repo_id = " + Xof_repo_itm.Repo_local); } - private static void Create_data__insert_page(Gfo_usr_dlg usr_dlg, Db_provider cur, byte repo_tid, Io_url join) { + private static void Create_data__insert_page(Gfo_usr_dlg usr_dlg, Db_conn cur, byte repo_tid, Io_url join) { usr_dlg.Note_many("", "", "inserting page: ~{0}", join.NameOnly()); Sqlite_engine_.Db_attach(cur, "page_db", join.Raw()); cur.Exec_sql(String_.Format(Sql_create_page, repo_tid)); Sqlite_engine_.Db_detach(cur, "page_db"); } - private static void Create_data__insert_redirect(Gfo_usr_dlg usr_dlg, Db_provider cur, byte repo_tid, Io_url join) { + private static void Create_data__insert_redirect(Gfo_usr_dlg usr_dlg, Db_conn cur, byte repo_tid, Io_url join) { usr_dlg.Note_many("", "", "inserting redirect: ~{0}", join.OwnerDir().NameOnly()); Sqlite_engine_.Db_attach(cur, "redirect_db", join.Raw()); cur.Exec_sql(String_.Format(Sql_create_redirect, repo_tid)); diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_regy_cmd.java b/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_regy_cmd.java index 4844b5d1f..8c9e3df83 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_regy_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_regy_cmd.java @@ -23,12 +23,12 @@ public class Xob_xfer_regy_cmd extends Xob_itm_basic_base implements Xob_cmd { public void Cmd_ini(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) {} public void Cmd_run() { - Db_provider provider = Xodb_db_file.init__file_make(wiki.Fsys_mgr().Root_dir()).Provider(); - Xob_xfer_regy_tbl.Create_table(provider); - Xob_xfer_regy_tbl.Create_data(usr_dlg, provider); - Xob_xfer_regy_tbl.Create_index(usr_dlg, provider); - Xob_xfer_regy_log_tbl.Create_table(provider); - provider.Txn_mgr().Txn_end_all(); + Db_conn conn = Xodb_db_file.init__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); + Xob_xfer_regy_tbl.Create_table(conn); + Xob_xfer_regy_tbl.Create_data(usr_dlg, conn); + Xob_xfer_regy_tbl.Create_index(usr_dlg, conn); + Xob_xfer_regy_log_tbl.Create_table(conn); + conn.Txn_mgr().Txn_end_all(); } public void Cmd_end() {} public void Cmd_print() {} diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_regy_tbl.java b/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_regy_tbl.java index 7abc5bd32..02af0d760 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_regy_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_regy_tbl.java @@ -18,13 +18,13 @@ along with this program. If not, see . package gplx.xowa.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.dbs.*; import gplx.xowa.bldrs.oimgs.*; public class Xob_xfer_regy_tbl { - public static void Create_table(Db_provider p) {Sqlite_engine_.Tbl_create_and_delete(p, Tbl_name, Tbl_sql);} - public static void Create_data(Gfo_usr_dlg usr_dlg, Db_provider p) { + public static void Create_table(Db_conn p) {Sqlite_engine_.Tbl_create_and_delete(p, Tbl_name, Tbl_sql);} + public static void Create_data(Gfo_usr_dlg usr_dlg, Db_conn p) { p.Exec_sql(Sql_create_data_orig); p.Exec_sql(Sql_create_data_thumb); } - public static void Create_index(Gfo_usr_dlg usr_dlg, Db_provider p) {Sqlite_engine_.Idx_create(usr_dlg, p, Xodb_db_file.Name__file_make, Idx_lnki_page_id, Idx_lnki_ttl);} - public static DataRdr Select(Db_provider p, byte repo_id, byte[] ttl, int limit) { + public static void Create_index(Gfo_usr_dlg usr_dlg, Db_conn p) {Sqlite_engine_.Idx_create(usr_dlg, p, Xodb_db_file.Name__file_make, Idx_lnki_page_id, Idx_lnki_ttl);} + public static DataRdr Select(Db_conn p, byte repo_id, byte[] ttl, int limit) { Db_qry qry = Db_qry_.select_().Cols_all_() .From_(Tbl_name) .Where_(gplx.criterias.Criteria_.And_many(Db_crt_.mte_(Fld_orig_repo, repo_id), Db_crt_.mt_(Fld_lnki_ttl, String_.new_utf8_(ttl)), Db_crt_.eq_(Fld_xfer_status, 0))) @@ -33,8 +33,8 @@ public class Xob_xfer_regy_tbl { ; return p.Exec_qry_as_rdr(qry); } - public static Db_stmt Select_by_page_id_stmt(Db_provider p) {return p.Prepare(Db_qry_sql.rdr_(Sql_select));} - public static DataRdr Select_by_page_id(Db_stmt stmt, int page_id, int limit) {return stmt.Val_int_(page_id).Val_int_(limit).Exec_select();} + public static Db_stmt Select_by_page_id_stmt(Db_conn p) {return p.New_stmt(Db_qry_sql.rdr_(Sql_select));} + public static DataRdr Select_by_page_id(Db_stmt stmt, int page_id, int limit) {return stmt.Val_int(page_id).Val_int(limit).Exec_select();} private static final String Sql_select = String_.Concat_lines_nl ( "SELECT *" @@ -50,7 +50,7 @@ public class Xob_xfer_regy_tbl { , "WHERE xfer_status = 0" ) ; - public static DataRdr Select_by_lnki_page_id(Db_provider p, int lnki_page_id, int select_interval) { + public static DataRdr Select_by_lnki_page_id(Db_conn p, int lnki_page_id, int select_interval) { Db_qry qry = Db_qry_.select_().Cols_all_() .From_(Tbl_name) .Where_(gplx.criterias.Criteria_.And_many(Db_crt_.eq_(Fld_xfer_status, 0), Db_crt_.mte_(Fld_lnki_page_id, lnki_page_id))) @@ -59,7 +59,7 @@ public class Xob_xfer_regy_tbl { ; return p.Exec_qry_as_rdr(qry); } - public static int Select_total_pending(Db_provider p) { + public static int Select_total_pending(Db_conn p) { DataRdr rdr = p.Exec_sql_as_rdr(Sql_select_total_pending); int rv = 0; if (rdr.MoveNextPeer()) @@ -132,14 +132,14 @@ public class Xob_xfer_regy_tbl { public static byte Status_todo = 0, Status_pass = 1, Status_fail = 2, Status_ignore_processed = 3; } class Xob_xfer_regy_log_tbl { - public static void Create_table(Db_provider p) {Sqlite_engine_.Tbl_create_and_delete(p, Tbl_name, Tbl_sql);} - public static Db_stmt Insert_stmt(Db_provider p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_lnki_id, Fld_xfer_status, Fld_xfer_bin_tid, Fld_xfer_bin_msg);} + public static void Create_table(Db_conn p) {Sqlite_engine_.Tbl_create_and_delete(p, Tbl_name, Tbl_sql);} + public static Db_stmt Insert_stmt(Db_conn p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_lnki_id, Fld_xfer_status, Fld_xfer_bin_tid, Fld_xfer_bin_msg);} public static void Insert(Db_stmt stmt, byte status, int id, byte wkr_tid, String wkr_msg) { stmt.Clear() - .Val_int_(id) - .Val_byte_(status) - .Val_byte_(wkr_tid) - .Val_str_(wkr_msg) + .Val_int(id) + .Val_byte(status) + .Val_byte(wkr_tid) + .Val_str(wkr_msg) .Exec_insert(); } private static final String Tbl_sql = String_.Concat_lines_nl diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_regy_update_cmd.java b/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_regy_update_cmd.java index cd2c526a6..0ecb48194 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_regy_update_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_regy_update_cmd.java @@ -26,11 +26,11 @@ public class Xob_xfer_regy_update_cmd extends Xob_itm_basic_base implements Xob_ public void Cmd_end() {} public void Cmd_print() {} private void Exec_main() { - Db_provider make_db_provider = Xodb_db_file.init__file_make(wiki.Fsys_mgr().Root_dir()).Provider(); + Db_conn make_db_provider = Xodb_db_file.init__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); this.Copy_atrs_to_make_db(make_db_provider); this.Update_status(make_db_provider); } - private void Copy_atrs_to_make_db(Db_provider make_db_provider) { + private void Copy_atrs_to_make_db(Db_conn make_db_provider) { wiki.File_mgr().Fsdb_mgr().Init_by_wiki(wiki); Fsdb_db_abc_mgr fsdb_abc_mgr = wiki.File_mgr().Fsdb_mgr().Mnt_mgr().Abc_mgr_at(0); // 0 = fsdb.main Io_url fsdb_atr_url = fsdb_abc_mgr.Atr_mgr().Get_at(0).Url(); // 0 = fsdb.atr.00 @@ -47,7 +47,7 @@ public class Xob_xfer_regy_update_cmd extends Xob_itm_basic_base implements Xob_ Sqlite_engine_.Idx_create(make_db_provider, Xob_fsdb_regy_tbl.Idx_main); Sqlite_engine_.Db_detach(make_db_provider, "fsdb_db"); } - private void Update_status(Db_provider make_db_provider) { + private void Update_status(Db_conn make_db_provider) { make_db_provider.Txn_mgr().Txn_bgn(); make_db_provider.Exec_sql(Xob_fsdb_regy_tbl.Update_regy_fil); make_db_provider.Exec_sql(Xob_fsdb_regy_tbl.Update_regy_thm); diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_temp_cmd_orig.java b/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_temp_cmd_orig.java index 16de8874b..60b1f069a 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_temp_cmd_orig.java +++ b/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_temp_cmd_orig.java @@ -23,11 +23,11 @@ public class Xob_xfer_temp_cmd_orig extends Xob_itm_basic_base implements Xob_cm public String Cmd_key() {return KEY_oimg;} public static final String KEY_oimg = "file.xfer_temp.orig"; public void Cmd_ini(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) { - Db_provider provider = Xodb_db_file.init__file_make(wiki.Fsys_mgr().Root_dir()).Provider(); - Xob_xfer_temp_tbl.Create_table(provider); - Db_stmt trg_stmt = Xob_xfer_temp_tbl.Insert_stmt(provider); - provider.Txn_mgr().Txn_bgn_if_none(); - DataRdr rdr = provider.Exec_sql_as_rdr(Sql_select); + Db_conn conn = Xodb_db_file.init__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); + Xob_xfer_temp_tbl.Create_table(conn); + Db_stmt trg_stmt = Xob_xfer_temp_tbl.Insert_stmt(conn); + conn.Txn_mgr().Txn_bgn_if_none(); + DataRdr rdr = conn.Exec_sql_as_rdr(Sql_select); long[] ext_maxs = Calc_ext_max(); while (rdr.MoveNextPeer()) { int lnki_ext = rdr.ReadByte(Xob_lnki_regy_tbl.Fld_lnki_ext); @@ -55,7 +55,7 @@ public class Xob_xfer_temp_cmd_orig extends Xob_itm_basic_base implements Xob_cm , Xof_doc_page.Null , 0); } - provider.Txn_mgr().Txn_end_all(); + conn.Txn_mgr().Txn_end_all(); } private long[] Calc_ext_max() { Xoft_rule_grp ext_rules = wiki.App().File_mgr().Ext_rules().Get_or_new(ext_rules_key); diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_temp_cmd_thumb.java b/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_temp_cmd_thumb.java index 454297d15..8ed68dd74 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_temp_cmd_thumb.java +++ b/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_temp_cmd_thumb.java @@ -22,11 +22,11 @@ public class Xob_xfer_temp_cmd_thumb extends Xob_itm_basic_base implements Xob_c public String Cmd_key() {return KEY_oimg;} public static final String KEY_oimg = "file.xfer_temp.thumb"; public void Cmd_ini(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) { - Db_provider provider = Xodb_db_file.init__file_make(wiki.Fsys_mgr().Root_dir()).Provider(); - Xob_xfer_temp_tbl.Create_table(provider); - Db_stmt trg_stmt = Xob_xfer_temp_tbl.Insert_stmt(provider); - provider.Txn_mgr().Txn_bgn_if_none(); - DataRdr rdr = provider.Exec_sql_as_rdr(Sql_select); + Db_conn conn = Xodb_db_file.init__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); + Xob_xfer_temp_tbl.Create_table(conn); + Db_stmt trg_stmt = Xob_xfer_temp_tbl.Insert_stmt(conn); + conn.Txn_mgr().Txn_bgn_if_none(); + DataRdr rdr = conn.Exec_sql_as_rdr(Sql_select); Xob_xfer_temp_itm temp_itm = new Xob_xfer_temp_itm(); Xof_img_size img_size = new Xof_img_size(); while (rdr.MoveNextPeer()) { @@ -35,7 +35,7 @@ public class Xob_xfer_temp_cmd_thumb extends Xob_itm_basic_base implements Xob_c if (temp_itm.Chk(img_size)) temp_itm.Insert(trg_stmt, img_size); } - provider.Txn_mgr().Txn_end_all(); + conn.Txn_mgr().Txn_end_all(); } public void Cmd_run() {} public void Cmd_end() {} diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_temp_itm.java b/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_temp_itm.java index 7ac275dc7..75825f672 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_temp_itm.java +++ b/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_temp_itm.java @@ -41,7 +41,7 @@ class Xob_xfer_temp_itm { public int Lnki_page() {return lnki_page;} private int lnki_page; public void Clear() { lnki_ext = lnki_type = lnki_src_tid - = orig_repo = orig_media_type_tid = Byte_.MaxValue_127; + = orig_repo = orig_media_type_tid = Byte_.Max_value_127; chk_tid = Chk_tid_none; lnki_id = lnki_w = lnki_h = lnki_count = lnki_page_id = orig_w = orig_h = orig_page_id = Int_.Neg1; diff --git a/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_temp_tbl.java b/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_temp_tbl.java index ddaf5ec9f..546b2e909 100644 --- a/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_temp_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/files/Xob_xfer_temp_tbl.java @@ -18,29 +18,29 @@ along with this program. If not, see . package gplx.xowa.bldrs.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.files.*; class Xob_xfer_temp_tbl { - public static void Create_table(Db_provider p) {Sqlite_engine_.Tbl_create_and_delete(p, Tbl_name, Tbl_sql);} - public static Db_stmt Insert_stmt(Db_provider p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_lnki_id, Fld_lnki_page_id, Fld_orig_repo, Fld_orig_page_id, Fld_lnki_ttl, Fld_orig_redirect_src, Fld_lnki_ext, Fld_lnki_type, Fld_orig_media_type, Fld_file_is_orig, Fld_orig_w, Fld_orig_h, Fld_file_w, Fld_file_h, Fld_html_w, Fld_html_h, Fld_lnki_time, Fld_lnki_page, Fld_lnki_count);} + public static void Create_table(Db_conn p) {Sqlite_engine_.Tbl_create_and_delete(p, Tbl_name, Tbl_sql);} + public static Db_stmt Insert_stmt(Db_conn p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_lnki_id, Fld_lnki_page_id, Fld_orig_repo, Fld_orig_page_id, Fld_lnki_ttl, Fld_orig_redirect_src, Fld_lnki_ext, Fld_lnki_type, Fld_orig_media_type, Fld_file_is_orig, Fld_orig_w, Fld_orig_h, Fld_file_w, Fld_file_h, Fld_html_w, Fld_html_h, Fld_lnki_time, Fld_lnki_page, Fld_lnki_count);} public static void Insert(Db_stmt stmt, int lnki_id, int lnki_page_id, byte repo_id, int page_id, String ttl, String redirect_src, int ext_id, byte lnki_type, String orig_media_type, boolean file_is_orig, int orig_w, int orig_h, int html_w, int html_h, int file_w, int file_h, double thumbtime, int page, int count) { stmt.Clear() - .Val_int_(lnki_id) - .Val_int_(lnki_page_id) - .Val_byte_(repo_id) - .Val_int_(page_id) - .Val_str_(ttl) - .Val_str_(redirect_src) - .Val_int_(ext_id) - .Val_byte_(lnki_type) - .Val_str_(orig_media_type) - .Val_byte_by_bool_(file_is_orig) - .Val_int_(orig_w) - .Val_int_(orig_h) - .Val_int_(file_w) - .Val_int_(file_h) - .Val_int_(html_w) - .Val_int_(html_h) - .Val_double_(Xof_doc_thumb.Db_save_double(thumbtime)) - .Val_int_(page) - .Val_int_(count) + .Val_int(lnki_id) + .Val_int(lnki_page_id) + .Val_byte(repo_id) + .Val_int(page_id) + .Val_str(ttl) + .Val_str(redirect_src) + .Val_int(ext_id) + .Val_byte(lnki_type) + .Val_str(orig_media_type) + .Val_bool_as_byte(file_is_orig) + .Val_int(orig_w) + .Val_int(orig_h) + .Val_int(file_w) + .Val_int(file_h) + .Val_int(html_w) + .Val_int(html_h) + .Val_double(Xof_doc_thumb.Db_save_double(thumbtime)) + .Val_int(page) + .Val_int(count) .Exec_insert(); } public static final String Tbl_name = "xfer_temp" diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_cmd_exec_sql.java b/400_xowa/src/gplx/xowa/bldrs/imports/Xob_cmd_exec_sql.java index 6ea431a5e..4e7a4d44b 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_cmd_exec_sql.java +++ b/400_xowa/src/gplx/xowa/bldrs/imports/Xob_cmd_exec_sql.java @@ -29,7 +29,7 @@ public class Xob_cmd_exec_sql implements Xob_cmd { Xodb_fsys_mgr fsys_mgr = db_mgr.Fsys_mgr(); Xodb_file file = fsys_mgr.Get_by_idx(file_idx); app.Usr_dlg().Plog_many("", "", "exec_sql: running sql; file_idx=~{0} sql=~{1}", file_idx, sql); - file.Provider().Exec_sql(sql); + file.Conn().Exec_sql(sql); } public void Cmd_run() {} public void Cmd_end() {} diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_page_sql.java b/400_xowa/src/gplx/xowa/bldrs/imports/Xob_page_sql.java index 5fbbf340c..933284974 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_page_sql.java +++ b/400_xowa/src/gplx/xowa/bldrs/imports/Xob_page_sql.java @@ -20,7 +20,7 @@ import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.dbs.tbls.*; import g public class Xob_page_sql extends Xob_itm_basic_base implements Xobd_wkr, GfoInvkAble { private Db_idx_mode idx_mode = Db_idx_mode.Itm_end; private Io_stream_zip_mgr zip_mgr; private byte data_storage_format; private boolean redirect_id_enabled; - private Xodb_mgr_sql db_mgr; private Xodb_fsys_mgr fsys_mgr; private Db_provider page_provider; private Db_stmt page_stmt; private Xob_text_stmts_mgr text_stmts_mgr; + private Xodb_mgr_sql db_mgr; private Xodb_fsys_mgr fsys_mgr; private Db_conn page_provider; private Db_stmt page_stmt; private Xob_text_stmts_mgr text_stmts_mgr; private int page_count_all, page_count_main = 0; private int txn_commit_interval = 100000; // 100 k private DateAdp modified_latest = DateAdp_.MinValue; private Xop_redirect_mgr redirect_mgr; private Xob_redirect_tbl redirect_tbl; @@ -38,7 +38,7 @@ public class Xob_page_sql extends Xob_itm_basic_base implements Xobd_wkr, GfoInv db_mgr = wiki.Db_mgr_as_sql(); db_mgr.Data_storage_format_(data_storage_format); fsys_mgr = db_mgr.Fsys_mgr(); - page_provider = fsys_mgr.Provider_page(); + page_provider = fsys_mgr.Conn_page(); page_stmt = db_mgr.Tbl_page().Insert_stmt(page_provider); page_provider.Txn_mgr().Txn_bgn_if_none(); text_stmts_mgr = new Xob_text_stmts_mgr(db_mgr, fsys_mgr); @@ -46,7 +46,7 @@ public class Xob_page_sql extends Xob_itm_basic_base implements Xobd_wkr, GfoInv if (redirect_id_enabled) { redirect_tbl = new Xob_redirect_tbl(wiki.Fsys_mgr().Root_dir(), app.Encoder_mgr().Url_ttl()).Create_table(); - redirect_tbl.Provider().Txn_mgr().Txn_bgn_if_none(); + redirect_tbl.Conn().Txn_mgr().Txn_bgn_if_none(); } } public void Wkr_run(Xodb_page page) { @@ -62,22 +62,25 @@ public class Xob_page_sql extends Xob_itm_basic_base implements Xobd_wkr, GfoInv int random_int = ns.Count() + 1; ns.Count_(random_int); text = zip_mgr.Zip(data_storage_format, text); - int text_stmt_idx = text_stmts_mgr.Get_by_ns(ns.Bldr_file_idx(), text.length); // NOTE: was text.length, but want text_len which is original page_len, not compressed; DATE:2014-08-04 - Db_stmt text_stmt = text_stmts_mgr.Get_at(text_stmt_idx); + int text_stmt_idx = text_stmts_mgr.Stmt_by_ns(ns.Bldr_file_idx(), text.length); // NOTE: was text.length, but want text_len which is original page_len, not compressed; DATE:2014-08-04 + Db_stmt text_stmt = text_stmts_mgr.Stmt_at(text_stmt_idx); try { db_mgr.Page_create(page_stmt, text_stmt, page_id, page.Ns_id(), page.Ttl_wo_ns(), redirect, modified, text, random_int, text_stmt_idx); } catch (Exception e) { usr_dlg.Warn_many("", "", "failed to insert page: id=~{0} ns=~{1} title=~{2} error=~{3}", page.Id(), page.Ns_id(), String_.new_utf8_(page.Ttl_wo_ns()), Err_.Message_gplx_brief(e)); - page_stmt.New(); // must new stmt variable, else java.sql.SQLException: "statement is not executing" - text_stmt.New(); // must new stmt variable, else java.sql.SQLException: "statement is not executing" + page_stmt.Reset_stmt(); // must new stmt variable, else java.sql.SQLException: "statement is not executing" + text_stmt.Reset_stmt(); // must new stmt variable, else java.sql.SQLException: "statement is not executing" } if (redirect && redirect_id_enabled) { redirect_tbl.Insert(page_id, page.Ttl_wo_ns(), redirect_ttl); } ++page_count_all; if (ns.Id_main() && !page.Type_redirect()) ++page_count_main; - if (page_count_all % txn_commit_interval == 0) text_stmt.Provider().Txn_mgr().Txn_end_all_bgn_if_none(); + if (page_count_all % txn_commit_interval == 0) { + Db_conn conn = text_stmts_mgr.Conn_at(text_stmt_idx); + conn.Txn_mgr().Txn_end_all_bgn_if_none(); + } } public void Wkr_end() { usr_dlg.Log_many("", "", "import.page: insert done; committing pages; pages=~{0}", page_count_all); @@ -92,7 +95,7 @@ public class Xob_page_sql extends Xob_itm_basic_base implements Xobd_wkr, GfoInv db_mgr.Tbl_xowa_cfg().Insert_str(Xodb_mgr_sql.Grp_wiki_init, "props.modified_latest", modified_latest.XtoStr_fmt(DateAdp_.Fmt_iso8561_date_time)); if (idx_mode.Tid_is_end()) Idx_create(); if (redirect_id_enabled) { - redirect_tbl.Provider().Txn_mgr().Txn_end_all(); + redirect_tbl.Conn().Txn_mgr().Txn_end_all(); Xodb_file core_file = fsys_mgr.Get_tid_root(Xodb_file_tid.Tid_core); redirect_tbl.Update_trg_redirect_id(core_file.Url(), 1); redirect_tbl.Update_src_redirect_id(core_file.Url(), page_provider); @@ -118,8 +121,9 @@ public class Xob_page_sql extends Xob_itm_basic_base implements Xobd_wkr, GfoInv } class Xob_text_stmts_mgr { public Xob_text_stmts_mgr(Xodb_mgr_sql db_mgr, Xodb_fsys_mgr fsys_mgr) {this.db_mgr = db_mgr; this.fsys_mgr = fsys_mgr;} private Xodb_mgr_sql db_mgr; Xodb_fsys_mgr fsys_mgr; - public Db_stmt Get_at(int i) {return text_stmts[i];} - public int Get_by_ns(int ns_file_idx, int text_len) { + public Db_stmt Stmt_at(int i) {return text_stmts[i];} + public Db_conn Conn_at(int i) {return text_providers[i];} + public int Stmt_by_ns(int ns_file_idx, int text_len) { Xodb_file file = File_get(ns_file_idx, text_len); int stmt_idx = file.Id(); Db_stmt stmt = null; @@ -127,16 +131,18 @@ class Xob_text_stmts_mgr { stmt = text_stmts[stmt_idx]; if (stmt != null) return stmt_idx; } - stmt = db_mgr.Tbl_text().Insert_stmt(file.Provider()); - file.Provider().Txn_mgr().Txn_bgn_if_none(); // automatically start txn - Add(stmt, stmt_idx); + Db_conn conn = file.Conn(); + stmt = db_mgr.Tbl_text().Insert_stmt(conn); + conn.Txn_mgr().Txn_bgn_if_none(); // automatically start txn + Add(conn, stmt, stmt_idx); return stmt_idx; } public void Rls() { for (int i = 0; i < text_stmts_len; i++) { Db_stmt stmt = text_stmts[i]; if (stmt != null) { - stmt.Provider().Txn_mgr().Txn_end_all(); + Db_conn conn = text_providers[i]; + conn.Txn_mgr().Txn_end_all(); stmt.Rls(); } text_stmts[i] = null; @@ -150,7 +156,7 @@ class Xob_text_stmts_mgr { long file_len = file.File_len(); long file_max = fsys_mgr.Tid_text_max(); if (file_max != Xodb_fsys_mgr.Heap_max_infinite && (file_len + text_len > file_max)) { // file is "full" - file.Provider().Txn_mgr().Txn_end_all(); // close txn + file.Conn().Txn_mgr().Txn_end_all(); // close txn file = fsys_mgr.Make(Xodb_file_tid.Tid_text); file_idx = file.Id(); fsys_mgr.Tid_text_idx_(file_idx); @@ -161,15 +167,20 @@ class Xob_text_stmts_mgr { else return fsys_mgr.Get_or_make(Xodb_file_tid.Tid_text, file_idx); } - private void Add(Db_stmt stmt, int stmt_idx) { + private void Add(Db_conn conn, Db_stmt stmt, int stmt_idx) { int new_len = stmt_idx + 1; if (new_len > text_stmts_max) { // ary too small >>> expand text_stmts_max = new_len * 2; Db_stmt[] text_stmts_subs = new Db_stmt[text_stmts_max]; Array_.CopyTo(text_stmts, 0, text_stmts_subs, 0, text_stmts_len); text_stmts = text_stmts_subs; + + Db_conn[] new_providers = new Db_conn[text_stmts_max]; + Array_.CopyTo(text_providers, 0, new_providers, 0, text_stmts_len); + text_providers = new_providers; } text_stmts[stmt_idx] = stmt; + text_providers[stmt_idx] = conn; text_stmts_len = new_len; - } private Db_stmt[] text_stmts = new Db_stmt[0]; int text_stmts_len, text_stmts_max = 0; + } private Db_stmt[] text_stmts = new Db_stmt[0]; int text_stmts_len, text_stmts_max = 0; private Db_conn[] text_providers = new Db_conn[0]; } diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_base.java b/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_base.java index 64929e926..f3f0303ae 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_base.java +++ b/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_base.java @@ -59,7 +59,7 @@ public abstract class Xob_search_base extends Xob_itm_dump_base implements Xobd_ if (delete_temp) Io_mgr._.DeleteDirDeep(temp_dir); if (wiki.Db_mgr().Tid() == Xodb_mgr_sql.Tid_sql) { Xodb_fsys_mgr db_fs = wiki.Db_mgr_as_sql().Fsys_mgr(); - wiki.Db_mgr_as_sql().Tbl_xowa_db().Commit_all(db_fs.Provider_core(), db_fs.Files_ary()); // always save files now; need to commit created search_db_idx to xowa_db, else will be reused by ctg v2; DATE:2014-02-07 + wiki.Db_mgr_as_sql().Tbl_xowa_db().Commit_all(db_fs.Conn_core(), db_fs.Files_ary()); // always save files now; need to commit created search_db_idx to xowa_db, else will be reused by ctg v2; DATE:2014-02-07 } } public void Wkr_print() {} diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_sql_cmd.java b/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_sql_cmd.java index 227b1f2e9..84d45125e 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_sql_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_sql_cmd.java @@ -38,15 +38,15 @@ public class Xob_search_sql_cmd extends Xob_itm_basic_base implements Xob_cmd { search_db = db_fs.Make(Xodb_file_tid.Tid_search); } DataRdr page_rdr = DataRdr_.Null; - Db_provider search_provider = search_db.Provider(); + Db_conn search_provider = search_db.Conn(); usr_dlg.Log_many("", "", "search_title.cmd: droping tables"); Sqlite_engine_.Tbl_delete_many(search_provider, Xodb_tbl_search_title_temp.Tbl_name, Xodb_search_title_word_tbl.Tbl_name, Xodb_search_title_page_tbl.Tbl_name); - usr_dlg.Log_many("", "", "search_title.cmd: creating db connection; conn=~{0}", search_provider.Conn_info().Str_raw()); + usr_dlg.Log_many("", "", "search_title.cmd: creating db connection; conn=~{0}", search_provider.Url().Xto_raw()); Xodb_tbl_search_title_temp search_temp_tbl = new Xodb_tbl_search_title_temp().Create_table(search_provider); try { usr_dlg.Log_many("", "", "search_title.cmd: starting select;"); search_provider.Txn_mgr().Txn_bgn_if_none(); - page_rdr = wiki.Db_mgr_as_sql().Tbl_page().Select_all(page_db.Provider()); + page_rdr = wiki.Db_mgr_as_sql().Tbl_page().Select_all(page_db.Conn()); usr_dlg.Log_many("", "", "search_title.cmd: other init;"); Db_stmt search_temp_stmt = search_temp_tbl.Insert_stmt(search_provider); Xol_lang lang = wiki.Lang(); @@ -76,10 +76,10 @@ public class Xob_search_sql_cmd extends Xob_itm_basic_base implements Xob_cmd { search_provider.Txn_mgr().Txn_end_all_bgn_if_none(); search_temp_tbl.Make_data(usr_dlg, search_provider); search_provider.Txn_mgr().Txn_bgn_if_none(); - wiki.Db_mgr_as_sql().Tbl_xowa_db().Commit_all(db_fs.Provider_core(), db_fs.Files_ary()); + wiki.Db_mgr_as_sql().Tbl_xowa_db().Commit_all(db_fs.Conn_core(), db_fs.Files_ary()); search_provider.Txn_mgr().Txn_end_all(); } private int commit_interval = 100000, progress_interval = 10000; - private void Commit(Db_provider search_provider) { + private void Commit(Db_conn search_provider) { search_provider.Txn_mgr().Txn_end_all_bgn_if_none(); } @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_sql_wkr.java b/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_sql_wkr.java index d69898bf5..ace23d64d 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_sql_wkr.java +++ b/400_xowa/src/gplx/xowa/bldrs/imports/Xob_search_sql_wkr.java @@ -30,15 +30,15 @@ public class Xob_search_sql_wkr extends Xob_search_base implements Io_make_cmd { search_db = db_mgr.Fsys_mgr().Make(Xodb_file_tid.Tid_search); created = true; } - provider = search_db.Provider(); + conn = search_db.Conn(); if (created) { - Xodb_search_title_word_tbl.Create_table(provider); - Xodb_search_title_page_tbl.Create_table(provider); + Xodb_search_title_word_tbl.Create_table(conn); + Xodb_search_title_page_tbl.Create_table(conn); } - provider.Txn_mgr().Txn_bgn_if_none(); - stmt_word = Xodb_search_title_word_tbl.Insert_stmt(provider); - stmt_page = Xodb_search_title_page_tbl.Insert_stmt(provider); - } private Db_provider provider; private int search_id = 0; private Db_stmt stmt_word, stmt_page; + conn.Txn_mgr().Txn_bgn_if_none(); + stmt_word = Xodb_search_title_word_tbl.Insert_stmt(conn); + stmt_page = Xodb_search_title_page_tbl.Insert_stmt(conn); + } private Db_conn conn; private int search_id = 0; private Db_stmt stmt_word, stmt_page; public byte Line_dlm() {return line_dlm;} public Xob_search_sql_wkr Line_dlm_(byte v) {line_dlm = v; return this;} private byte line_dlm = Byte_ascii.Nil; private byte[] prv_word = Bry_.Empty; public void Sort_do(Io_line_rdr rdr) { @@ -52,13 +52,13 @@ public class Xob_search_sql_wkr extends Xob_search_base implements Io_make_cmd { Xodb_search_title_page_tbl.Insert(stmt_page, search_id, Base85_utl.XtoIntByAry(bry, rdr.Key_pos_end() + 1, rdr.Key_pos_end() + 5)); // -1: ignore rdr_dlm } public void Sort_end() { - provider.Txn_mgr().Txn_end_all(); - Xodb_tbl_search_title_temp.Cleanup(usr_dlg, provider); + conn.Txn_mgr().Txn_end_all(); + Xodb_tbl_search_title_temp.Cleanup(usr_dlg, conn); } } class Xodb_tbl_search_title_temp { - public Xodb_tbl_search_title_temp Create_table(Db_provider p) {Sqlite_engine_.Tbl_create(p, Tbl_name, Tbl_sql); return this;} - public void Make_data(Gfo_usr_dlg usr_dlg, Db_provider p) { + public Xodb_tbl_search_title_temp Create_table(Db_conn p) {Sqlite_engine_.Tbl_create(p, Tbl_name, Tbl_sql); return this;} + public void Make_data(Gfo_usr_dlg usr_dlg, Db_conn p) { Xodb_search_title_word_tbl.Create_table(p); Xodb_search_title_page_tbl.Create_table(p); p.Txn_mgr().Txn_end_all_bgn_if_none(); @@ -73,7 +73,7 @@ class Xodb_tbl_search_title_temp { p.Txn_mgr().Txn_end(); // must end all transactions before vacuum p.Exec_sql("VACUUM;"); } - public static void Cleanup(Gfo_usr_dlg usr_dlg, Db_provider p) { + public static void Cleanup(Gfo_usr_dlg usr_dlg, Db_conn p) { p.Exec_sql("DROP TABLE IF EXISTS search_title_temp;"); try { Xodb_search_title_word_tbl.Create_index(usr_dlg, p); @@ -87,11 +87,11 @@ class Xodb_tbl_search_title_temp { Xodb_search_title_page_tbl.Create_index_non_unique(usr_dlg, p); } } - public Db_stmt Insert_stmt(Db_provider p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_stt_page_id, Fld_stt_word);} + public Db_stmt Insert_stmt(Db_conn p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_stt_page_id, Fld_stt_word);} public void Insert(Db_stmt stmt, int page_id, byte[] word) { stmt.Clear() - .Val_int_(page_id) - .Val_str_by_bry_(word) + .Val_int(page_id) + .Val_bry_as_str(word) .Exec_insert(); } public static final String Tbl_name = "search_title_temp", Fld_stt_page_id = "stt_page_id", Fld_stt_word = "stt_word"; diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_term_sql.java b/400_xowa/src/gplx/xowa/bldrs/imports/Xob_term_sql.java index 1e26b2304..efc5184c1 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/Xob_term_sql.java +++ b/400_xowa/src/gplx/xowa/bldrs/imports/Xob_term_sql.java @@ -23,10 +23,10 @@ public class Xob_term_sql extends Xob_term_base { @Override public void Cmd_end_hook() { Io_mgr._.DeleteDirDeep(wiki.Fsys_mgr().Tmp_dir()); Xodb_mgr_sql db_mgr = wiki.Db_mgr_as_sql(); - db_mgr.Tbl_xowa_cfg().Insert_str_by_bry (Xodb_mgr_sql.Grp_wiki_init, "props.bldr_version", wiki.Props().Bldr_version()); - db_mgr.Tbl_xowa_cfg().Insert_str_by_bry (Xodb_mgr_sql.Grp_wiki_init, "props.main_page", wiki.Props().Main_page()); - db_mgr.Tbl_xowa_cfg().Insert_str_by_bry (Xodb_mgr_sql.Grp_wiki_init, "props.siteinfo_misc", wiki.Props().Siteinfo_misc()); - db_mgr.Tbl_xowa_cfg().Insert_str_by_bry (Xodb_mgr_sql.Grp_wiki_init, "props.siteinfo_mainpage", wiki.Props().Siteinfo_mainpage()); + db_mgr.Tbl_xowa_cfg().Insert_bry_as_str (Xodb_mgr_sql.Grp_wiki_init, "props.bldr_version", wiki.Props().Bldr_version()); + db_mgr.Tbl_xowa_cfg().Insert_bry_as_str (Xodb_mgr_sql.Grp_wiki_init, "props.main_page", wiki.Props().Main_page()); + db_mgr.Tbl_xowa_cfg().Insert_bry_as_str (Xodb_mgr_sql.Grp_wiki_init, "props.siteinfo_misc", wiki.Props().Siteinfo_misc()); + db_mgr.Tbl_xowa_cfg().Insert_bry_as_str (Xodb_mgr_sql.Grp_wiki_init, "props.siteinfo_mainpage", wiki.Props().Siteinfo_mainpage()); wiki.Db_mgr_as_sql().Fsys_mgr().Rls(); } } diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_category_registry_sql.java b/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_category_registry_sql.java index 160fd063a..220490f21 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_category_registry_sql.java +++ b/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_category_registry_sql.java @@ -30,7 +30,7 @@ public class Xob_category_registry_sql implements Xob_cmd { Xob_tmp_wtr rslt_wtr = Xob_tmp_wtr.new_wo_ns_(Io_url_gen_.dir_(rslt_dir), Io_mgr.Len_mb); Xodb_mgr_sql db_mgr = Xodb_mgr_sql.Get_or_load(wiki); - Db_provider provider = db_mgr.Fsys_mgr().Provider_core(); + Db_conn conn = db_mgr.Fsys_mgr().Conn_core(); Db_qry_select qry = Db_qry_select.new_() .Cols_(Xodb_page_tbl.Fld_page_title, Xodb_page_tbl.Fld_page_id) .From_(Xodb_page_tbl.Tbl_name) @@ -39,7 +39,7 @@ public class Xob_category_registry_sql implements Xob_cmd { DataRdr rdr = DataRdr_.Null; Gfo_usr_dlg usr_dlg = wiki.App().Usr_dlg(); try { - rdr = qry.Exec_qry_as_rdr(provider); + rdr = qry.Exec_qry_as_rdr(conn); while (rdr.MoveNextPeer()) { byte[] page_ttl = rdr.ReadBryByStr(Xodb_page_tbl.Fld_page_title); int page_id = rdr.ReadInt(Xodb_page_tbl.Fld_page_id); diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_base.java b/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_base.java index 389d1b96b..f478daa8b 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_base.java +++ b/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_base.java @@ -63,7 +63,7 @@ public abstract class Xob_categorylinks_base extends Xob_sql_dump_base implement fld_wtr.Write_int_base85_len5_fld(cur_id); fld_wtr.Write_int_base85_len5_fld(cur_date); } - } int cur_id = -1, cur_date = -1; byte[] cur_ctg = null, cur_sortkey = null; byte cur_tid = Byte_.MaxValue_127; boolean cur_collation_is_uca; int[] cur_modified_on = new int[7]; + } int cur_id = -1, cur_date = -1; byte[] cur_ctg = null, cur_sortkey = null; byte cur_tid = Byte_.Max_value_127; boolean cur_collation_is_uca; int[] cur_modified_on = new int[7]; @Override public void Cmd_end() { Xobdc_merger.Basic(bldr.Usr_dlg(), dump_url_gen, temp_dir.GenSubDir("sort"), sort_mem_len, Xoctg_link_sql_sorter._, Io_line_rdr_key_gen_.noop, Make_sort_cmd(sql_parser)); wiki.Html_mgr().Importing_ctgs_(Bool_.N); diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_sql_make.java b/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_sql_make.java index aa5500697..9b05c8f4e 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_sql_make.java +++ b/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_sql_make.java @@ -35,15 +35,15 @@ public class Xob_categorylinks_sql_make implements Io_make_cmd { Xodb_file category_file = fsys_mgr.Get_tid_root(Xodb_file_tid.Tid_core); if (cur_cat_file_max > 0) { category_file = fsys_mgr.Make(Xodb_file_tid.Tid_category); - fsys_mgr.Provider_ctg_(category_file); + fsys_mgr.Conn_ctg_(category_file); } - cat_provider = db_mgr.Fsys_mgr().Provider_ctg(); + cat_provider = db_mgr.Fsys_mgr().Conn_ctg(); ctg_stmt = db_mgr.Tbl_category().Insert_stmt(cat_provider); File_open(category_file); first_provider = true; if (idx_mode.Tid_is_bgn()) Idx_create(fsys_mgr); - } Db_provider cl_provider, cat_provider; Gfo_fld_rdr fld_rdr = Gfo_fld_rdr.xowa_(); Db_stmt cl_stmt = Db_stmt_.Null, ctg_stmt = Db_stmt_.Null; int row_count = 0; Gfo_usr_dlg usr_dlg; boolean first_provider; + } Db_conn cl_provider, cat_provider; Gfo_fld_rdr fld_rdr = Gfo_fld_rdr.xowa_(); Db_stmt cl_stmt = Db_stmt_.Null, ctg_stmt = Db_stmt_.Null; int row_count = 0; Gfo_usr_dlg usr_dlg; boolean first_provider; int[] cur_cat_counts = new int[Xoa_ctg_mgr.Tid__max]; long cur_cat_file_size, cur_cat_file_max; byte[] cur_cat_ttl = Ttl_first; int cur_cat_id; int cur_cat_file_idx; public byte Line_dlm() {return line_dlm;} public Xob_categorylinks_sql_make Line_dlm_(byte v) {line_dlm = v; return this;} private byte line_dlm = Byte_ascii.Nil; public void Sort_do(Io_line_rdr rdr) { @@ -70,7 +70,7 @@ public class Xob_categorylinks_sql_make implements Io_make_cmd { Xodb_fsys_mgr fsys_mgr = db_mgr.Fsys_mgr(); Ctg_grp_end(Ttl_last); File_close(); - db_mgr.Tbl_xowa_db().Commit_all(fsys_mgr.Provider_core(), fsys_mgr.Files_ary()); + db_mgr.Tbl_xowa_db().Commit_all(fsys_mgr.Conn_core(), fsys_mgr.Files_ary()); if (db_mgr.Category_version() == Xoa_ctg_mgr.Version_null) // NOTE: ctg_v1 wkr will set this to v1; only set to v2 if null db_mgr.Category_version_update(false); usr_dlg.Log_many("", "", "import.category.v2: insert done; committing; rows=~{0}", row_count); @@ -96,7 +96,7 @@ public class Xob_categorylinks_sql_make implements Io_make_cmd { return cur_cat_id; } private void File_open(Xodb_file file) { - cl_provider = file.Provider(); + cl_provider = file.Conn(); cl_stmt = db_mgr.Tbl_categorylinks().Insert_stmt(cl_provider); cl_provider.Txn_mgr().Txn_bgn_if_none(); cur_cat_file_idx = file.Id(); diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_sql_tst.java b/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_sql_tst.java index d2475695d..4ced8b9ef 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_sql_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xob_categorylinks_sql_tst.java @@ -34,18 +34,18 @@ public class Xob_categorylinks_sql_tst { )); fxt.Exec_run(new Xob_category_registry_sql(fxt.Bldr(), fxt.Wiki())); fxt.Exec_run(new Xob_categorylinks_sql(fxt.Bldr(), fxt.Wiki())); - Db_provider provider = fxt.Wiki().Db_mgr_as_sql().Fsys_mgr().Provider_ctg(); + Db_conn conn = fxt.Wiki().Db_mgr_as_sql().Fsys_mgr().Conn_ctg(); Db_tst_qry.tbl_(Xodb_category_tbl.Tbl_name, Xodb_category_tbl.Fld_cat_id) .Cols_(Xodb_category_tbl.Fld_cat_id, Xodb_category_tbl.Fld_cat_subcats, Xodb_category_tbl.Fld_cat_files, Xodb_category_tbl.Fld_cat_pages) .Rows_add_vals(1, 0, 0, 2) .Rows_add_vals(2, 0, 1, 0) - .Test(provider); + .Test(conn); Db_tst_qry.tbl_(Xodb_categorylinks_tbl.Tbl_name, Xodb_categorylinks_tbl.Fld_cl_from) .Cols_(Xodb_categorylinks_tbl.Fld_cl_from, Xodb_categorylinks_tbl.Fld_cl_to_id, Xodb_categorylinks_tbl.Fld_cl_sortkey, Xodb_categorylinks_tbl.Fld_cl_type_id) .Rows_add_vals(3, 2, "File:2a" , Xoa_ctg_mgr.Tid_file) .Rows_add_vals(4, 1, "1b" , Xoa_ctg_mgr.Tid_page) .Rows_add_vals(5, 1, "1a" , Xoa_ctg_mgr.Tid_page) - .Test(provider); + .Test(conn); } } class Db_tst_val { @@ -92,11 +92,11 @@ class Db_tst_qry { rows.Add(row); return this; } - public void Test(Db_provider provider) { + public void Test(Db_conn conn) { DataRdr rdr = DataRdr_.Null; Bry_bfr bfr = Bry_bfr.new_(); try { - rdr = provider.Exec_qry_as_rdr(qry); + rdr = conn.Exec_qry_as_rdr(qry); int expd_row_idx = 0, expd_row_max = rows.Count(); while (rdr.MoveNextPeer()) { if (expd_row_idx == expd_row_max) break; @@ -127,7 +127,7 @@ class Db_tst_qry { } if (!pass) { bfr.Add(Lbl_row_hdr).Add_int_variable(expd_row_idx).Add_byte_nl(); - bfr.Add_str(qry.XtoSql()).Add_byte(Byte_ascii.Semic); + bfr.Add_str(qry.Xto_sql()).Add_byte(Byte_ascii.Semic); throw Err_.new_(bfr.Xto_str_and_clear()); } } static final byte[] Lbl_row_hdr = Bry_.new_ascii_("row: "), Lbl_eq_y = Bry_.new_ascii_(" == "), Lbl_eq_n = Bry_.new_ascii_(" != "); diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_hiddencat_parser_sql.java b/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_hiddencat_parser_sql.java index a4b64c2e4..a2a3c2893 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_hiddencat_parser_sql.java +++ b/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_hiddencat_parser_sql.java @@ -18,16 +18,16 @@ along with this program. If not, see . package gplx.xowa.bldrs.imports.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.imports.*; import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.dbs.tbls.*; public class Xoctg_hiddencat_parser_sql extends Xoctg_hiddencat_parser_base { - public Xoctg_hiddencat_parser_sql(Xob_bldr bldr, Xow_wiki wiki) {this.Ctor(bldr, wiki);} + public Xoctg_hiddencat_parser_sql(Xob_bldr bldr, Xow_wiki wiki) {this.Ctor(bldr, wiki);} private Db_conn conn; @Override public String Cmd_key() {return KEY;} public static final String KEY = "import.sql.hiddencat"; @Override public void Cmd_bgn_hook(Xob_bldr bldr, Sql_file_parser parser) { super.Cmd_bgn_hook(bldr, parser); Xodb_mgr_sql db_mgr = wiki.Db_mgr_as_sql(); Xodb_fsys_mgr fsys_mgr = db_mgr.Fsys_mgr(); - Db_provider provider = fsys_mgr.Provider_ctg(); - provider.Txn_mgr().Txn_bgn_if_none(); + conn = fsys_mgr.Conn_ctg(); + conn.Txn_mgr().Txn_bgn_if_none(); tbl = db_mgr.Tbl_category(); - stmt = tbl.Update_stmt(provider); + stmt = tbl.Update_stmt(conn); } private Xodb_category_tbl tbl; private Db_stmt stmt; @Override public void Exec_hook(Bry_bfr file_bfr, int cur_id, boolean cur_is_hiddencat) { @@ -36,7 +36,7 @@ public class Xoctg_hiddencat_parser_sql extends Xoctg_hiddencat_parser_base { } @Override public void Cmd_end() { if (stmt == null) return; // stmt is null when ctg fails (for example, category files not downloaded); DATE:2013-12-20 - stmt.Provider().Txn_mgr().Txn_end_all(); + conn.Txn_mgr().Txn_end_all(); if (!Env_.Mode_testing()) // NOTE: do not delete when testing Io_mgr._.DeleteDirDeep(wiki.Fsys_mgr().Tmp_dir()); // delete /wiki/wiki_name/tmp Io_url[] sql_files = Io_mgr._.QueryDir_args(wiki.Fsys_mgr().Root_dir()).FilPath_("*.sql.gz").ExecAsUrlAry(); diff --git a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_hiddencat_parser_sql_tst.java b/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_hiddencat_parser_sql_tst.java index 559fd7797..67b06842f 100644 --- a/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_hiddencat_parser_sql_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/imports/ctgs/Xoctg_hiddencat_parser_sql_tst.java @@ -40,8 +40,8 @@ public class Xoctg_hiddencat_parser_sql_tst { private void Init_ctgs(int... ctgs) { int len = ctgs.length; Xodb_category_tbl tbl = fxt.Wiki().Db_mgr_as_sql().Tbl_category(); - Db_provider provider = fxt.Wiki().Db_mgr_as_sql().Fsys_mgr().Provider_ctg(); - Db_stmt stmt = tbl.Insert_stmt(provider); + Db_conn conn = fxt.Wiki().Db_mgr_as_sql().Fsys_mgr().Conn_ctg(); + Db_stmt stmt = tbl.Insert_stmt(conn); try { for (int i = 0; i < len; i++) { int ctg_id = ctgs[i]; @@ -52,10 +52,10 @@ public class Xoctg_hiddencat_parser_sql_tst { private void Tst_ctg_hidden(boolean expd_hidden, int... ctgs) { int len = ctgs.length; Xodb_category_tbl tbl = fxt.Wiki().Db_mgr_as_sql().Tbl_category(); - Db_provider provider = fxt.Wiki().Db_mgr_as_sql().Fsys_mgr().Provider_ctg(); + Db_conn conn = fxt.Wiki().Db_mgr_as_sql().Fsys_mgr().Conn_ctg(); for (int i = 0; i < len; i++) { int ctg_id = ctgs[i]; - Xodb_category_itm ctg_itm = tbl.Select(provider, ctg_id); + Xodb_category_itm ctg_itm = tbl.Select(conn, ctg_id); Tfds.Eq(expd_hidden, ctg_itm.Hidden(), Int_.Xto_str(ctg_id)); } } diff --git a/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_bmk_mgr.java b/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_bmk_mgr.java index e26a34e58..0541d9eb6 100644 --- a/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_bmk_mgr.java +++ b/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_bmk_mgr.java @@ -25,9 +25,9 @@ public class Xob_bmk_mgr implements GfoInvkAble { public byte[] Ttl_prv() {return ttl_prv;} private byte[] ttl_prv; private boolean repo_enable, ns_enable, ttl_enable; private boolean repo_dirty, ns_dirty, ttl_dirty; - public Xob_bmk_mgr Init(Db_provider p, String grp, boolean repo_enable, boolean ns_enable, boolean ttl_enable) { + public Xob_bmk_mgr Init(Db_conn p, String grp, boolean repo_enable, boolean ns_enable, boolean ttl_enable) { this.cfg_grp = grp; - cfg_tbl = new Xodb_xowa_cfg_tbl().Provider_(p); + cfg_tbl = new Xodb_xowa_cfg_tbl().Conn_(p); cfg_stmt = cfg_tbl.Update_stmt(); this.repo_enable = repo_enable; this.ns_enable = ns_enable; @@ -96,6 +96,6 @@ public class Xob_bmk_mgr implements GfoInvkAble { private static final String Invk_repo_prv_ = "repo_prv_", Invk_ns_prv_ = "ns_prv_", Invk_ttl_prv_ = "ttl_prv_"; private static final String Cfg_repo_prv = "repo_prv", Cfg_ns_prv = "ns_prv", Cfg_ttl_prv = "ttl_prv"; private static final int Null_ns = -1; -// public static final byte Null_repo = Byte_.MaxValue_127; +// public static final byte Null_repo = Byte_.Max_value_127; // public static final byte[ Null_ttl = null; } diff --git a/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_dump_mgr_base.java b/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_dump_mgr_base.java index 2a5833177..2eeda3000 100644 --- a/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_dump_mgr_base.java +++ b/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_dump_mgr_base.java @@ -39,20 +39,20 @@ public abstract class Xob_dump_mgr_base extends Xob_itm_basic_base implements Xo ctx = wiki.Ctx(); root = ctx.Tkn_mkr().Root(Bry_.Empty); wiki.Init_assert(); // NOTE: must init wiki for db_mgr_as_sql - wiki.Db_mgr_as_sql().Init_load(Db_conn_info_.sqlite_(Xodb_mgr_sql.Find_core_url(wiki))); // NOTE: must reinit providers as previous steps may have rls'd (and left member variable provider which is closed) + wiki.Db_mgr_as_sql().Init_load(Db_url_.sqlite_(Xodb_mgr_sql.Find_core_url(wiki))); // NOTE: must reinit providers as previous steps may have rls'd (and left member variable conn which is closed) db_fsys_mgr = wiki.Db_mgr_as_sql().Fsys_mgr(); db_ary = Xob_dump_src_ttl.Init_text_files_ary(db_fsys_mgr); poll_interval = poll_mgr.Poll_interval(); page_src = new Xob_dump_src_id().Init(wiki, this.Init_redirect(), select_size); ns_ary = Init_ns_ary(); - Db_provider provider = Init_db_file(); + Db_conn conn = Init_db_file(); Io_url wiki_dir = wiki.Fsys_mgr().Root_dir(); bmk_mgr.Cfg_url_(wiki_dir.GenSubFil("xowa.file.make.cfg.gfs")); rate_mgr.Log_file_(wiki_dir.GenSubFil("xowa.file.make.log.csv")); if (reset_db) { bmk_mgr.Reset(); - Init_reset(provider); + Init_reset(conn); } bmk_mgr.Load(wiki.App(), this); Cmd_bgn_end(); @@ -60,8 +60,8 @@ public abstract class Xob_dump_mgr_base extends Xob_itm_basic_base implements Xo protected abstract void Cmd_bgn_end(); public abstract byte Init_redirect(); public abstract int[] Init_ns_ary(); - protected abstract void Init_reset(Db_provider p); - protected abstract Db_provider Init_db_file(); + protected abstract void Init_reset(Db_conn p); + protected abstract Db_conn Init_db_file(); private long time_bgn; public void Cmd_run() {Exec_ns_ary();} private void Exec_ns_ary() { diff --git a/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_parse_all_src_sql.java b/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_parse_all_src_sql.java index 7c08a6406..9166d2cfc 100644 --- a/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_parse_all_src_sql.java +++ b/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_parse_all_src_sql.java @@ -21,7 +21,7 @@ class Xob_dump_src_ttl implements Xob_parse_all_db { private Xodb_mgr_sql db_mgr; private Db_stmt page_stmt; private Xodb_file[] text_files_ary; private int text_files_len; private byte redirect; public Xob_dump_src_ttl Init(Xow_wiki wiki, int limit, byte redirect) { this.db_mgr = wiki.Db_mgr_as_sql(); this.redirect = redirect; - page_stmt = db_mgr.Tbl_page().Select_for_parse_all_stmt(db_mgr.Fsys_mgr().Provider_core(), limit, redirect); + page_stmt = db_mgr.Tbl_page().Select_for_parse_all_stmt(db_mgr.Fsys_mgr().Conn_core(), limit, redirect); text_files_ary = Init_text_files_ary(db_mgr.Fsys_mgr()); text_files_len = text_files_ary.length; return this; @@ -77,11 +77,11 @@ class Xob_dump_src_id { if (cur_text_db_idx != text_db_idx) { cur_text_db_idx = text_db_idx; Xodb_file text_db = db_mgr.Fsys_mgr().Get_by_idx(text_db_idx); - Db_provider provider = text_db.Provider(); + Db_conn conn = text_db.Conn(); String sql = String_.Format(Sql_select, New_rdr__redirect_clause(redirect)); - text_stmt = provider.Prepare(Db_qry_sql.rdr_(sql)); + text_stmt = conn.New_stmt(Db_qry_sql.rdr_(sql)); } - return text_stmt.Clear().Val_int_(prv_id).Val_int_(cur_ns).Exec_select(); + return text_stmt.Clear().Val_int(prv_id).Val_int(cur_ns).Exec_select(); } private static Xodb_page New_page(Xodb_mgr_sql db_mgr, int ns_id, DataRdr rdr) { Xodb_page rv = new Xodb_page(); diff --git a/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_text_db_prep.java b/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_text_db_prep.java index 6db353938..8c26678d0 100644 --- a/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_text_db_prep.java +++ b/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_text_db_prep.java @@ -48,13 +48,13 @@ public class Xob_text_db_prep extends Xob_itm_basic_base implements Xob_cmd { public void Cmd_print() {} private void Prep_db(String page_db_url, Xodb_file text_db) { usr_dlg.Note_many("", "", "copying page_rows to text_db: ~{0}", text_db.Url().NameOnly()); - Db_provider provider = text_db.Provider(); - Sqlite_engine_.Tbl_create_and_delete(provider, "page_dump", Sql_create_tbl); - Sqlite_engine_.Db_attach(provider, "page_db", page_db_url); - provider.Txn_mgr().Txn_bgn_if_none(); - provider.Exec_sql(String_.Format(Sql_insert_data, text_db.Id())); - provider.Txn_mgr().Txn_end_all(); - Sqlite_engine_.Idx_create(provider, Idx_create); + Db_conn conn = text_db.Conn(); + Sqlite_engine_.Tbl_create_and_delete(conn, "page_dump", Sql_create_tbl); + Sqlite_engine_.Db_attach(conn, "page_db", page_db_url); + conn.Txn_mgr().Txn_bgn_if_none(); + conn.Exec_sql(String_.Format(Sql_insert_data, text_db.Id())); + conn.Txn_mgr().Txn_end_all(); + Sqlite_engine_.Idx_create(conn, Idx_create); } private static final String Sql_create_tbl = String_.Concat_lines_nl ( "CREATE TABLE IF NOT EXISTS page_dump" diff --git a/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_xfer_update_cmd.java b/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_xfer_update_cmd.java index ab7532c34..93781e93a 100644 --- a/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_xfer_update_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/oimgs/Xob_xfer_update_cmd.java @@ -26,19 +26,19 @@ public class Xob_xfer_update_cmd extends Xob_itm_basic_base implements Xob_cmd { public void Cmd_run() { // init vars Xodb_db_file cur_file = Xodb_db_file.init__file_make(wiki.Fsys_mgr().Root_dir()); - Db_provider provider = cur_file.Provider(); + Db_conn conn = cur_file.Conn(); if (prv_url == null) { prv_url = wiki.App().Fsys_mgr().File_dir().GenSubFil_nest(wiki.Domain_str(), "bldr", Xodb_db_file.Name__file_make); } // run sql - Sqlite_engine_.Tbl_rename(provider, "xfer_regy", "xfer_regy_old"); - Xob_xfer_regy_tbl.Create_table(provider); - Sqlite_engine_.Db_attach(provider, "old_db", prv_url.Raw()); - provider.Exec_sql(Sql_update); - Sqlite_engine_.Db_detach(provider, "old_db"); - Sqlite_engine_.Tbl_delete(provider, "xfer_regy_old"); - Xob_xfer_regy_tbl.Create_index(usr_dlg, provider); + Sqlite_engine_.Tbl_rename(conn, "xfer_regy", "xfer_regy_old"); + Xob_xfer_regy_tbl.Create_table(conn); + Sqlite_engine_.Db_attach(conn, "old_db", prv_url.Raw()); + conn.Exec_sql(Sql_update); + Sqlite_engine_.Db_detach(conn, "old_db"); + Sqlite_engine_.Tbl_delete(conn, "xfer_regy_old"); + Xob_xfer_regy_tbl.Create_index(usr_dlg, conn); // // rotate db // DateAdp wiki_date = wiki.Db_mgr().Dump_date_query(); diff --git a/400_xowa/src/gplx/xowa/bldrs/oimgs/Xodb_db_file.java b/400_xowa/src/gplx/xowa/bldrs/oimgs/Xodb_db_file.java index 95030b6ea..6f4c9df98 100644 --- a/400_xowa/src/gplx/xowa/bldrs/oimgs/Xodb_db_file.java +++ b/400_xowa/src/gplx/xowa/bldrs/oimgs/Xodb_db_file.java @@ -18,9 +18,9 @@ along with this program. If not, see . package gplx.xowa.bldrs.oimgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.dbs.tbls.*; public class Xodb_db_file { - Xodb_db_file(Io_url url, Db_provider provider, boolean created) {this.url = url; this.provider = provider; this.created = created;} + Xodb_db_file(Io_url url, Db_conn conn, boolean created) {this.url = url; this.conn = conn; this.created = created;} public Io_url Url() {return url;} private Io_url url; - public Db_provider Provider() {return provider;} private Db_provider provider; + public Db_conn Conn() {return conn;} private Db_conn conn; public boolean Created() {return created;} public void Created_clear() {created = false;} private boolean created; public static Xodb_db_file init__file_make(Io_url dir) {return init_(dir, Name__file_make);} @@ -31,12 +31,12 @@ public class Xodb_db_file { public static Xodb_db_file init_(Io_url dir, String name) { Io_url url = dir.GenSubFil(name); Bool_obj_ref created = Bool_obj_ref.n_(); - Db_provider provider = Sqlite_engine_.Provider_load_or_make_(url, created); + Db_conn conn = Sqlite_engine_.Conn_load_or_make_(url, created); if (created.Val()) { // always create cfg table - Xodb_xowa_cfg_tbl.Create_table(provider); - Xodb_xowa_cfg_tbl.Create_index(provider); + Xodb_xowa_cfg_tbl.Create_table(conn); + Xodb_xowa_cfg_tbl.Create_index(conn); } - return new Xodb_db_file(url, provider, created.Val()); + return new Xodb_db_file(url, conn, created.Val()); } public static final String Name__wiki_image = "xowa.wiki.image.sqlite3", Name__wiki_redirect = "xowa.wiki.redirect.sqlite3" diff --git a/400_xowa/src/gplx/xowa/bldrs/wikis/images/Xob_wiki_image_sql.java b/400_xowa/src/gplx/xowa/bldrs/wikis/images/Xob_wiki_image_sql.java index 12dfb33ca..d8030c425 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wikis/images/Xob_wiki_image_sql.java +++ b/400_xowa/src/gplx/xowa/bldrs/wikis/images/Xob_wiki_image_sql.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.bldrs.wikis.images; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wikis.*; import gplx.ios.*; import gplx.xowa.bldrs.*; import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.dbs.tbls.*; import gplx.xowa.bldrs.oimgs.*; public class Xob_wiki_image_sql extends Xob_itm_dump_base implements Xob_cmd, GfoInvkAble, Sql_file_parser_cmd { - private Db_provider provider = null; private Db_stmt stmt = null; + private Db_conn conn = null; private Db_stmt stmt = null; private Xob_wiki_image_tbl tbl_image = new Xob_wiki_image_tbl(); private byte[] cur_ttl, cur_media_type, cur_minor_mime, cur_timestamp; private int cur_size, cur_width, cur_height, cur_bits, cur_ext_id; private int commit_count = 10000; @@ -36,16 +36,16 @@ public class Xob_wiki_image_sql extends Xob_itm_dump_base implements Xob_cmd, Gf } parser.Src_fil_(src_fil).Trg_fil_gen_(dump_url_gen).Fld_cmd_(this).Flds_req_idx_(20, Fld_img_name, Fld_img_size, Fld_img_width, Fld_img_height, Fld_img_bits, Fld_img_media_type, Fld_img_minor_mime, Fld_img_timestamp); - provider = Xodb_db_file.init__wiki_image(wiki.Fsys_mgr().Root_dir()).Provider(); - provider.Txn_mgr().Txn_bgn_if_none(); + conn = Xodb_db_file.init__wiki_image(wiki.Fsys_mgr().Root_dir()).Conn(); + conn.Txn_mgr().Txn_bgn_if_none(); tbl_image = new Xob_wiki_image_tbl(); - tbl_image.Create_table(provider); - stmt = tbl_image.Insert_stmt(provider); + tbl_image.Create_table(conn); + stmt = tbl_image.Insert_stmt(conn); } public void Cmd_run() { parser.Parse(bldr.Usr_dlg()); - tbl_image.Create_index(provider); - provider.Txn_mgr().Txn_end_all(); + tbl_image.Create_index(conn); + conn.Txn_mgr().Txn_end_all(); } public void Exec(byte[] src, byte[] fld_key, int fld_idx, int fld_bgn, int fld_end, Bry_bfr file_bfr, Sql_file_parser_data data) { switch (fld_idx) { @@ -62,7 +62,7 @@ public class Xob_wiki_image_sql extends Xob_itm_dump_base implements Xob_cmd, Gf ++commit_count; if ((commit_count % 10000) == 0) { usr_dlg.Prog_many("", "", "committing: count=~{0} last=~{1}", commit_count, String_.new_utf8_(cur_ttl)); - provider.Txn_mgr().Txn_end_all_bgn_if_none(); + conn.Txn_mgr().Txn_end_all_bgn_if_none(); } break; } diff --git a/400_xowa/src/gplx/xowa/bldrs/wikis/images/Xob_wiki_image_tbl.java b/400_xowa/src/gplx/xowa/bldrs/wikis/images/Xob_wiki_image_tbl.java index 591742535..43ddbb57b 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wikis/images/Xob_wiki_image_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/wikis/images/Xob_wiki_image_tbl.java @@ -18,20 +18,20 @@ along with this program. If not, see . package gplx.xowa.bldrs.wikis.images; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wikis.*; import gplx.dbs.*; public class Xob_wiki_image_tbl { - public Xob_wiki_image_tbl Create_table(Db_provider p) {Sqlite_engine_.Tbl_create_and_delete(p, Tbl_name, Tbl_sql); return this;} - public Xob_wiki_image_tbl Create_index(Db_provider p) {Sqlite_engine_.Idx_create(p, Idx_img_name); return this;} - public Db_stmt Insert_stmt(Db_provider p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_img_name, Fld_img_media_type, Fld_img_minor_mime, Fld_img_size, Fld_img_width, Fld_img_height, Fld_img_bits, Fld_img_ext_id, Fld_img_timestamp);} + public Xob_wiki_image_tbl Create_table(Db_conn p) {Sqlite_engine_.Tbl_create_and_delete(p, Tbl_name, Tbl_sql); return this;} + public Xob_wiki_image_tbl Create_index(Db_conn p) {Sqlite_engine_.Idx_create(p, Idx_img_name); return this;} + public Db_stmt Insert_stmt(Db_conn p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_img_name, Fld_img_media_type, Fld_img_minor_mime, Fld_img_size, Fld_img_width, Fld_img_height, Fld_img_bits, Fld_img_ext_id, Fld_img_timestamp);} public void Insert(Db_stmt stmt, byte[] ttl, byte[] media_type, byte[] minor_mime, int size, int w, int h, int bits, int ext_id, byte[] img_timestamp) { stmt.Clear() - .Val_str_by_bry_(ttl) - .Val_str_by_bry_(media_type) - .Val_str_by_bry_(minor_mime) - .Val_int_(size) - .Val_int_(w) - .Val_int_(h) - .Val_int_(bits) - .Val_int_(ext_id) - .Val_str_by_bry_(img_timestamp) + .Val_bry_as_str(ttl) + .Val_bry_as_str(media_type) + .Val_bry_as_str(minor_mime) + .Val_int(size) + .Val_int(w) + .Val_int(h) + .Val_int(bits) + .Val_int(ext_id) + .Val_bry_as_str(img_timestamp) .Exec_insert(); } public static final String Tbl_name = "image" diff --git a/400_xowa/src/gplx/xowa/bldrs/wikis/redirects/Xob_redirect_cmd.java b/400_xowa/src/gplx/xowa/bldrs/wikis/redirects/Xob_redirect_cmd.java index 6edc94c69..7ea6430da 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wikis/redirects/Xob_redirect_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/wikis/redirects/Xob_redirect_cmd.java @@ -18,25 +18,25 @@ along with this program. If not, see . package gplx.xowa.bldrs.wikis.redirects; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wikis.*; import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.dbs.tbls.*; import gplx.xowa.bldrs.oimgs.*; public class Xob_redirect_cmd extends Xob_dump_mgr_base { - private Db_provider provider; private Xob_redirect_tbl redirect_tbl; + private Db_conn conn; private Xob_redirect_tbl redirect_tbl; private Xodb_mgr_sql db_mgr; private Xop_redirect_mgr redirect_mgr; private Url_encoder encoder; public Xob_redirect_cmd(Xob_bldr bldr, Xow_wiki wiki) {this.Cmd_ctor(bldr, wiki);} @Override public String Cmd_key() {return KEY_redirect;} public static final String KEY_redirect = "wiki.redirect"; @Override public int[] Init_ns_ary() {return Int_.Ary(Xow_ns_.Id_file);} // restrict to file ns @Override public byte Init_redirect() {return Bool_.Y_byte;} // restrict to redirects - @Override protected void Init_reset(Db_provider p) { + @Override protected void Init_reset(Db_conn p) { p.Exec_sql("DELETE FROM " + Xodb_xowa_cfg_tbl.Tbl_name); p.Exec_sql("DELETE FROM " + Xob_redirect_tbl.Tbl_name); } - @Override protected Db_provider Init_db_file() { + @Override protected Db_conn Init_db_file() { this.db_mgr = wiki.Db_mgr_as_sql(); Xoa_app app = bldr.App(); redirect_mgr = wiki.Redirect_mgr(); encoder = app.Encoder_mgr().Url_ttl(); redirect_tbl = new Xob_redirect_tbl(wiki.Fsys_mgr().Root_dir(), app.Encoder_mgr().Url_ttl()).Create_table(); - provider = redirect_tbl.Provider(); - provider.Txn_mgr().Txn_bgn_if_none(); - return provider; + conn = redirect_tbl.Conn(); + conn.Txn_mgr().Txn_bgn_if_none(); + return conn; } @Override protected void Cmd_bgn_end() {} @@ -47,10 +47,10 @@ public class Xob_redirect_cmd extends Xob_dump_mgr_base { redirect_tbl.Insert(page.Id(), Xoa_ttl.Replace_spaces(page.Ttl_wo_ns()), -1, redirect_ttl.Ns().Id(), redirect_ttl_bry, redirect_ttl.Anch_txt(), 1); } @Override public void Exec_commit_hook() { - provider.Txn_mgr().Txn_end_all_bgn_if_none(); + conn.Txn_mgr().Txn_end_all_bgn_if_none(); } @Override public void Exec_end_hook() { - provider.Txn_mgr().Txn_end_all(); + conn.Txn_mgr().Txn_end_all(); redirect_tbl.Create_indexes(usr_dlg); redirect_tbl.Update_trg_redirect_id(db_mgr.Fsys_mgr().Get_url(Xodb_file_tid.Tid_core), 4); } diff --git a/400_xowa/src/gplx/xowa/bldrs/wikis/redirects/Xob_redirect_tbl.java b/400_xowa/src/gplx/xowa/bldrs/wikis/redirects/Xob_redirect_tbl.java index c93bd2824..8bbe18991 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wikis/redirects/Xob_redirect_tbl.java +++ b/400_xowa/src/gplx/xowa/bldrs/wikis/redirects/Xob_redirect_tbl.java @@ -21,31 +21,31 @@ public class Xob_redirect_tbl { private Url_encoder encoder; private Db_stmt insert_stmt; public Xob_redirect_tbl(Io_url root_dir, Url_encoder encoder) { this.db_file = Xodb_db_file.init__wiki_redirect(root_dir); - this.provider = db_file.Provider(); + this.conn = db_file.Conn(); this.encoder = encoder; } public Xodb_db_file Db_file() {return db_file;} private Xodb_db_file db_file; - public Db_provider Provider() {return provider;} private Db_provider provider; - public Xob_redirect_tbl Create_table() {Sqlite_engine_.Tbl_create(provider, Tbl_name, Tbl_sql); return this;} + public Db_conn Conn() {return conn;} private Db_conn conn; + public Xob_redirect_tbl Create_table() {Sqlite_engine_.Tbl_create(conn, Tbl_name, Tbl_sql); return this;} public void Create_indexes(Gfo_usr_dlg usr_dlg) { - Sqlite_engine_.Idx_create(usr_dlg, provider, Xodb_db_file.Name__wiki_redirect, Idx_trg_id, Idx_trg_ttl); + Sqlite_engine_.Idx_create(usr_dlg, conn, Xodb_db_file.Name__wiki_redirect, Idx_trg_id, Idx_trg_ttl); } public void Update_trg_redirect_id(Io_url core_url, int max_redirected_depth) { - Sqlite_engine_.Db_attach(provider, "page_db", core_url.Raw()); // link database with page table - provider.Exec_sql(Sql_get_page_data); // fill in page_id, page_ns, page_is_redirect for trg_ttl; EX: Page_A has "#REDIRECT Page_B"; Page_B is in redirect tbl; find its id, ttl, redirect status + Sqlite_engine_.Db_attach(conn, "page_db", core_url.Raw()); // link database with page table + conn.Exec_sql(Sql_get_page_data); // fill in page_id, page_ns, page_is_redirect for trg_ttl; EX: Page_A has "#REDIRECT Page_B"; Page_B is in redirect tbl; find its id, ttl, redirect status for (int i = 0; i < max_redirected_depth; i++) { // loop to find redirected redirects; note that it is bounded by depth (to guard against circular redirects) - int affected = provider.Exec_sql(Sql_get_redirect_redirects); // find redirects that are also redirects + int affected = conn.Exec_sql(Sql_get_redirect_redirects); // find redirects that are also redirects if (affected == 0) break; // no more redirected redirects; stop - provider.Exec_sql(Sql_get_redirect_page_data); // get page data for redirects + conn.Exec_sql(Sql_get_redirect_page_data); // get page data for redirects } - Sqlite_engine_.Db_detach(provider, "page_db"); + Sqlite_engine_.Db_detach(conn, "page_db"); } - public void Update_src_redirect_id(Io_url core_url, Db_provider core_provider) { + public void Update_src_redirect_id(Io_url core_url, Db_conn core_provider) { core_provider.Exec_sql(Sql_ddl__page_redirect_id); // create page.page_redirect_id - Sqlite_engine_.Idx_create(provider, Idx_trg_src); - Sqlite_engine_.Db_attach(provider, "page_db", core_url.Raw()); // link database with page table - provider.Exec_sql(Sql_update_redirect_id); // update page_redirect_id - Sqlite_engine_.Db_detach(provider, "page_db"); + Sqlite_engine_.Idx_create(conn, Idx_trg_src); + Sqlite_engine_.Db_attach(conn, "page_db", core_url.Raw()); // link database with page table + conn.Exec_sql(Sql_update_redirect_id); // update page_redirect_id + Sqlite_engine_.Db_detach(conn, "page_db"); } public void Insert(int src_id, byte[] src_bry, Xoa_ttl trg_ttl) { byte[] redirect_ttl_bry = Xoa_ttl.Replace_spaces(trg_ttl.Page_db()); // NOTE: spaces can still exist b/c redirect is scraped from #REDIRECT which sometimes has a mix; EX: "A_b c" @@ -53,21 +53,21 @@ public class Xob_redirect_tbl { this.Insert(src_id, Xoa_ttl.Replace_spaces(src_bry), -1, trg_ttl.Ns().Id(), redirect_ttl_bry, trg_ttl.Anch_txt(), 1); } public void Insert(int src_id, byte[] src_ttl, int trg_id, int trg_ns, byte[] trg_ttl, byte[] trg_anchor, int count) { - if (insert_stmt == null) insert_stmt = Db_stmt_.new_insert_(provider, Tbl_name, Fld_src_id, Fld_src_ttl, Fld_trg_id, Fld_trg_ns, Fld_trg_ttl, Fld_trg_anchor, Fld_trg_is_redirect, Fld_redirect_count); + if (insert_stmt == null) insert_stmt = Db_stmt_.new_insert_(conn, Tbl_name, Fld_src_id, Fld_src_ttl, Fld_trg_id, Fld_trg_ns, Fld_trg_ttl, Fld_trg_anchor, Fld_trg_is_redirect, Fld_redirect_count); insert_stmt.Clear() - .Val_int_(src_id) - .Val_str_by_bry_(src_ttl) - .Val_int_(trg_id) - .Val_int_(trg_ns) - .Val_str_by_bry_(trg_ttl) - .Val_str_by_bry_(trg_anchor) - .Val_byte_((byte)1) - .Val_int_(count) + .Val_int(src_id) + .Val_bry_as_str(src_ttl) + .Val_int(trg_id) + .Val_int(trg_ns) + .Val_bry_as_str(trg_ttl) + .Val_bry_as_str(trg_anchor) + .Val_byte((byte)1) + .Val_int(count) .Exec_insert(); } public void Rls_all() { insert_stmt.Rls(); - provider.Conn_term(); + conn.Conn_term(); } public static final String Tbl_name = "redirect"; private static final String diff --git a/400_xowa/src/gplx/xowa/ctgs/Xoa_ctg_mgr.java b/400_xowa/src/gplx/xowa/ctgs/Xoa_ctg_mgr.java index b14bfa620..accdffedc 100644 --- a/400_xowa/src/gplx/xowa/ctgs/Xoa_ctg_mgr.java +++ b/400_xowa/src/gplx/xowa/ctgs/Xoa_ctg_mgr.java @@ -60,6 +60,6 @@ public class Xoa_ctg_mgr implements GfoInvkAble { } } public static final byte Version_null = Byte_.Zero, Version_1 = 1, Version_2 = 2; - public static final byte Tid_null = Byte_.MaxValue_127, Tid_subc = 0, Tid_file = 1, Tid_page = 2, Tid__max = 3; + public static final byte Tid_null = Byte_.Max_value_127, Tid_subc = 0, Tid_file = 1, Tid_page = 2, Tid__max = 3; public static final byte Hidden_n = Byte_.Zero, Hidden_y = (byte)1; } diff --git a/400_xowa/src/gplx/xowa/dbs/Xodb_file.java b/400_xowa/src/gplx/xowa/dbs/Xodb_file.java index 8f787321e..f9d8ae7d9 100644 --- a/400_xowa/src/gplx/xowa/dbs/Xodb_file.java +++ b/400_xowa/src/gplx/xowa/dbs/Xodb_file.java @@ -26,18 +26,18 @@ public class Xodb_file { public long File_len() {return file_len;} public Xodb_file File_len_add(int v) {file_len += v; return this;} private long file_len; public long File_max() {return file_max;} public Xodb_file File_max_(long v) {file_max = v; return this;} private long file_max; public byte Cmd_mode() {return cmd_mode;} public Xodb_file Cmd_mode_(byte v) {cmd_mode = v; return this;} private byte cmd_mode; - public Db_conn_info Connect() {return connect;} public Xodb_file Connect_(Db_conn_info v) {connect = v; return this;} private Db_conn_info connect; - public Db_provider Provider() { - if (provider == null) provider = Db_provider_pool._.Get_or_new(connect); - return provider; - } private Db_provider provider; - public void Provider_(Db_provider p) {provider = p;} + public Db_url Connect() {return connect;} public Xodb_file Connect_(Db_url v) {connect = v; return this;} private Db_url connect; + public Db_conn Conn() { + if (conn == null) conn = Db_conn_pool_old._.Get_or_new(connect); + return conn; + } private Db_conn conn; + public void Conn_(Db_conn p) {conn = p;} public void Rls() { - if (provider == null) return; + if (conn == null) return; try { - provider.Txn_mgr().Txn_end_all(); // close any open transactions - provider.Conn_term(); - } finally {provider = null;} + conn.Txn_mgr().Txn_end_all(); // close any open transactions + conn.Conn_term(); + } finally {conn = null;} } public static Xodb_file load_(int id, byte tid, String url) {return new Xodb_file(id, tid).Url_rel_(url).Cmd_mode_(Db_cmd_mode.Ignore);} public static Xodb_file make_(int id, byte tid, String url) {return new Xodb_file(id, tid).Url_rel_(url).Cmd_mode_(Db_cmd_mode.Create);} diff --git a/400_xowa/src/gplx/xowa/dbs/Xodb_fsys_mgr.java b/400_xowa/src/gplx/xowa/dbs/Xodb_fsys_mgr.java index 709786503..fafa3ef21 100644 --- a/400_xowa/src/gplx/xowa/dbs/Xodb_fsys_mgr.java +++ b/400_xowa/src/gplx/xowa/dbs/Xodb_fsys_mgr.java @@ -21,23 +21,23 @@ public class Xodb_fsys_mgr { private final Io_url src_dir; private final Io_url trg_dir; private final String wiki_name; public Xodb_fsys_mgr(Io_url src_dir, Io_url trg_dir, String wiki_name) {this.src_dir = src_dir; this.trg_dir = trg_dir; this.wiki_name = wiki_name;} public Xodb_file[] Files_ary() {return files_ary;} - public Db_provider Provider_core() {return provider_core;} private Db_provider provider_core; - public Db_provider Provider_page() {return provider_page;} private Db_provider provider_page; - public Db_provider Provider_ctg() {return provider_ctg;} public void Provider_ctg_(Xodb_file file) {provider_ctg = file.Provider();} private Db_provider provider_ctg; - public Db_provider Provider_wdata() {return provider_wdata;}public void Provider_wdata_(Xodb_file file) {provider_wdata = file.Provider();} private Db_provider provider_wdata; + public Db_conn Conn_core() {return provider_core;} private Db_conn provider_core; + public Db_conn Conn_page() {return provider_page;} private Db_conn provider_page; + public Db_conn Conn_ctg() {return provider_ctg;} public void Conn_ctg_(Xodb_file file) {provider_ctg = file.Conn();} private Db_conn provider_ctg; + public Db_conn Conn_wdata() {return provider_wdata;}public void Conn_wdata_(Xodb_file file) {provider_wdata = file.Conn();} private Db_conn provider_wdata; public int Tid_text_idx() {return tid_text_idx;} public Xodb_fsys_mgr Tid_text_idx_(int v) {tid_text_idx = v; return this;} private int tid_text_idx = File_id_core; public long Tid_text_max() {return tid_text_max;} private long tid_text_max = Heap_max_infinite; - public void Init_by_files(Db_provider p, Xodb_file[] v) { + public void Init_by_files(Db_conn p, Xodb_file[] v) { files_ary = v; files_ary_len = v.length; boolean category_provider_core_null = true; for (int i = 0; i < files_ary_len; i++) { Xodb_file file = files_ary[i]; Io_url url = trg_dir.GenSubFil(file.Url_rel()); // relative name only - file.Connect_(Db_conn_info_.sqlite_(url)).Url_(url); + file.Connect_(Db_url_.sqlite_(url)).Url_(url); switch (file.Tid()) { - case Xodb_file_tid.Tid_core : file.Provider_(p); Set_file_core(file); break; - case Xodb_file_tid.Tid_category : if (category_provider_core_null) {Provider_ctg_(file); category_provider_core_null = false;} break; - case Xodb_file_tid.Tid_wikidata : Provider_wdata_(file); break; + case Xodb_file_tid.Tid_core : file.Conn_(p); Set_file_core(file); break; + case Xodb_file_tid.Tid_category : if (category_provider_core_null) {Conn_ctg_(file); category_provider_core_null = false;} break; + case Xodb_file_tid.Tid_wikidata : Conn_wdata_(file); break; case Xodb_file_tid.Tid_text : Set_file_text(file); break; } } @@ -61,7 +61,7 @@ public class Xodb_fsys_mgr { if (text_max > 0) Set_file_text(Make(Xodb_file_tid.Tid_text).File_max_(text_max)); } - private void Set_file_core(Xodb_file file) {provider_core = provider_page = provider_ctg = provider_wdata = file.Provider();} + private void Set_file_core(Xodb_file file) {provider_core = provider_page = provider_ctg = provider_wdata = file.Conn();} private void Set_file_text(Xodb_file file) {tid_text_idx = file.Id(); tid_text_max = file.File_max();} public Io_url Get_url(byte file_tid) { Xodb_file file = Get_tid_root(file_tid); @@ -80,15 +80,15 @@ public class Xodb_fsys_mgr { for (int i = 0; i < files_ary_len; i++) { Xodb_file file = files_ary[i]; if (Byte_.In(file.Tid(), tids)) - Sqlite_engine_.Idx_create(usr_dlg, file.Provider(), Int_.Xto_str(file.Id()), idxs); + Sqlite_engine_.Idx_create(usr_dlg, file.Conn(), Int_.Xto_str(file.Id()), idxs); } } public Xodb_file Make(byte file_tid) { int file_idx = files_ary_len; Io_url url = Create_sqlite3(src_dir, trg_dir, wiki_name, file_idx); - Xodb_file rv = Xodb_file.make_(file_idx, file_tid, url.NameAndExt()).Connect_(Db_conn_info_.sqlite_(url)); + Xodb_file rv = Xodb_file.make_(file_idx, file_tid, url.NameAndExt()).Connect_(Db_url_.sqlite_(url)); rv.Url_(url); - Xodb_xowa_cfg_tbl.Insert_str(rv.Provider(), Cfg_grp_db_meta, "type_name", Xodb_file_tid.Xto_key(file_tid)); + Xodb_xowa_cfg_tbl.Insert_str(rv.Conn(), Cfg_grp_db_meta, "type_name", Xodb_file_tid.Xto_key(file_tid)); files_ary = (Xodb_file[])Array_.Resize(files_ary, files_ary_len + 1); files_ary[files_ary_len++] = rv; return rv; diff --git a/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_sql.java b/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_sql.java index 5b913a630..af6fe154b 100644 --- a/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_sql.java +++ b/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_sql.java @@ -56,20 +56,20 @@ public class Xodb_load_mgr_sql implements Xodb_load_mgr { public void Load_by_ids(Cancelable cancelable, ListAdp rv, int bgn, int end) {db_mgr.Tbl_page().Select_by_id_list(cancelable, false, rv, bgn, end);} public boolean Load_ctg_v1(Xoctg_view_ctg rv, byte[] ctg_bry) { int cat_page_id = db_mgr.Tbl_page().Select_id(Xow_ns_.Id_category, ctg_bry); if (cat_page_id == Xodb_mgr_sql.Page_id_null) return false; - Xodb_category_itm ctg = db_mgr.Tbl_category().Select(fsys_mgr.Provider_ctg(), cat_page_id); if (ctg == Xodb_category_itm.Null) return false; - Db_provider p = fsys_mgr.Get_by_idx(ctg.File_idx()).Provider(); + Xodb_category_itm ctg = db_mgr.Tbl_category().Select(fsys_mgr.Conn_ctg(), cat_page_id); if (ctg == Xodb_category_itm.Null) return false; + Db_conn p = fsys_mgr.Get_by_idx(ctg.File_idx()).Conn(); return db_mgr.Ctg_select_v1(rv, p, ctg); } public boolean Load_ctg_v2(Xoctg_data_ctg rv, byte[] ctg_bry) {throw Err_.not_implemented_();} public void Load_ctg_v2a(Xoctg_view_ctg rv, Xoctg_url ctg_url, byte[] ctg_ttl, int load_max) { int cat_page_id = db_mgr.Tbl_page().Select_id(Xow_ns_.Id_category, ctg_ttl); if (cat_page_id == Xodb_mgr_sql.Page_id_null) return; - Xodb_category_itm ctg = db_mgr.Tbl_category().Select(fsys_mgr.Provider_ctg(), cat_page_id); if (ctg == Xodb_category_itm.Null) return; - Db_provider p = fsys_mgr.Get_by_idx(ctg.File_idx()).Provider(); + Xodb_category_itm ctg = db_mgr.Tbl_category().Select(fsys_mgr.Conn_ctg(), cat_page_id); if (ctg == Xodb_category_itm.Null) return; + Db_conn p = fsys_mgr.Get_by_idx(ctg.File_idx()).Conn(); ListAdp list = ListAdp_.new_(); Load_ctg_v2a_db_retrieve(rv, ctg_url, cat_page_id, load_max, p, list); Load_ctg_v2a_ui_sift(rv, ctg, list); } - private void Load_ctg_v2a_db_retrieve(Xoctg_view_ctg rv, Xoctg_url ctg_url, int cat_page_id, int load_max, Db_provider p, ListAdp list) { + private void Load_ctg_v2a_db_retrieve(Xoctg_view_ctg rv, Xoctg_url ctg_url, int cat_page_id, int load_max, Db_conn p, ListAdp list) { int len = Xoa_ctg_mgr.Tid__max; for (byte i = Xoa_ctg_mgr.Tid_subc; i < len; i++) { boolean arg_is_from = ctg_url.Grp_fwds()[i] == Bool_.N_byte; @@ -86,7 +86,7 @@ public class Xodb_load_mgr_sql implements Xodb_load_mgr { private void Load_ctg_v2a_ui_sift(Xoctg_view_ctg rv, Xodb_category_itm ctg, ListAdp list) { int len = list.Count(); Xow_wiki wiki = this.db_mgr.Wiki(); - byte prv_tid = Byte_.MaxValue_127; + byte prv_tid = Byte_.Max_value_127; Xoctg_view_grp view_grp = null; for (int i = 0; i < len; i++) { Xodb_page db_page = (Xodb_page)list.FetchAt(i); @@ -109,16 +109,16 @@ public class Xodb_load_mgr_sql implements Xodb_load_mgr { view_grp.Total_(ctg.Count_by_tid(i)); } } - private Db_provider search_provider = null; + private Db_conn search_provider = null; private void Search_version_init() { if (search_provider == null) { Xodb_file search_file = db_mgr.Fsys_mgr().Get_tid_root(Xodb_file_tid.Tid_search); if (search_file == null) { - search_provider = Db_provider_.Null; + search_provider = Db_conn_.Null; search_version = gplx.xowa.specials.search.Xosrh_core.Version_1; } else { - search_provider = search_file.Provider(); + search_provider = search_file.Conn(); search_version = gplx.xowa.specials.search.Xosrh_core.Version_2; } } @@ -128,7 +128,7 @@ public class Xodb_load_mgr_sql implements Xodb_load_mgr { if (search_version == gplx.xowa.specials.search.Xosrh_core.Version_1) db_mgr.Tbl_page().Select_by_search(cancelable, rv, search, results_max); else { - Xodb_search_title_word_tbl.Select_by_word(cancelable, rv, db_mgr.Db_ctx(), search, results_max, db_mgr.Fsys_mgr().Get_tid_root(Xodb_file_tid.Tid_search).Provider()); + Xodb_search_title_word_tbl.Select_by_word(cancelable, rv, db_mgr.Db_ctx(), search, results_max, db_mgr.Fsys_mgr().Get_tid_root(Xodb_file_tid.Tid_search).Conn()); db_mgr.Tbl_page().Select_by_id_list(cancelable, true, rv); } } @@ -141,10 +141,10 @@ public class Xodb_load_mgr_sql implements Xodb_load_mgr { public int Load_ctg_count(byte[] ttl) { int page_id = db_mgr.Tbl_page().Select_id(Xow_ns_.Id_category, ttl); if (page_id == Xodb_mgr_sql.Page_id_null) return 0; // title not found; return 0; - return db_mgr.Tbl_category().Select(fsys_mgr.Provider_ctg(), page_id).Count_all(); + return db_mgr.Tbl_category().Select(fsys_mgr.Conn_ctg(), page_id).Count_all(); } - public byte[] Load_qid(byte[] wiki_alias, byte[] ns_num, byte[] ttl) {return db_mgr.Tbl_wdata_qids().Select_qid(fsys_mgr.Provider_wdata(), wiki_alias, ns_num, ttl);} - public int Load_pid(byte[] lang_key, byte[] pid_name) {return db_mgr.Tbl_wdata_pids().Select_pid(fsys_mgr.Provider_wdata(), lang_key, pid_name);} + public byte[] Load_qid(byte[] wiki_alias, byte[] ns_num, byte[] ttl) {return db_mgr.Tbl_wdata_qids().Select_qid(fsys_mgr.Conn_wdata(), wiki_alias, ns_num, ttl);} + public int Load_pid(byte[] lang_key, byte[] pid_name) {return db_mgr.Tbl_wdata_pids().Select_pid(fsys_mgr.Conn_wdata(), lang_key, pid_name);} public byte[] Find_random_ttl(Xow_ns ns) {return db_mgr.Tbl_page().Select_random(ns);} public void Clear() {} public Xodb_page[] Load_ctg_list(byte[][] ctg_ttls) { @@ -166,7 +166,7 @@ public class Xodb_load_mgr_sql implements Xodb_load_mgr { hash2.Add(page.Id_val(), page); } len = hash2.Count(); // must update len (!hash2.Has() may have skipped titles) - db_mgr.Tbl_category().Select_by_cat_id_in(Cancelable_.Never, hash2, fsys_mgr.Provider_ctg(), db_mgr.Db_ctx(), 0, len); + db_mgr.Tbl_category().Select_by_cat_id_in(Cancelable_.Never, hash2, fsys_mgr.Conn_ctg(), db_mgr.Db_ctx(), 0, len); return (Xodb_page[])hash.Xto_ary(Xodb_page.class); } } diff --git a/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_sql_tst.java b/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_sql_tst.java index 1d1aa6493..422a11f59 100644 --- a/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_sql_tst.java +++ b/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_sql_tst.java @@ -59,7 +59,7 @@ class Xodb_load_mgr_sql_fxt { public void Init_save_ctgs(Xodb_page[] ary) { int len = ary.length; Xodb_mgr_sql db_mgr = wiki.Db_mgr_as_sql(); - Db_provider p = db_mgr.Fsys_mgr().Provider_core(); + Db_conn p = db_mgr.Fsys_mgr().Conn_core(); p.Txn_mgr().Txn_bgn_if_none(); Db_stmt page_stmt = db_mgr.Tbl_page().Insert_stmt(p); Db_stmt category_stmt = db_mgr.Tbl_category().Insert_stmt(p); @@ -98,7 +98,7 @@ class Xodb_load_mgr_sql_fxt { public Xodb_load_mgr_sql_fxt Init_limit_(int v) {limit = v; return this;} private int limit = 3; // public void Init_ctg_insert(Xoctg_mok_ctg ctg) { // Xodb_mgr_sql db_mgr = wiki.Db_mgr_as_sql(); -// Db_provider p = db_mgr.Fsys_mgr().Core_provider(); +// Db_conn p = db_mgr.Fsys_mgr().Core_provider(); // p.Txn_mgr().Txn_bgn_if_none(); // Xodb_categorylinks_tbl ctg_tbl = db_mgr.Tbl_categorylinks(); // Db_stmt ctg_stmt = ctg_tbl.Insert_stmt(p); diff --git a/400_xowa/src/gplx/xowa/dbs/Xodb_mgr_sql.java b/400_xowa/src/gplx/xowa/dbs/Xodb_mgr_sql.java index 2ee5da795..57da9429c 100644 --- a/400_xowa/src/gplx/xowa/dbs/Xodb_mgr_sql.java +++ b/400_xowa/src/gplx/xowa/dbs/Xodb_mgr_sql.java @@ -18,6 +18,7 @@ along with this program. If not, see . package gplx.xowa.dbs; import gplx.*; import gplx.xowa.*; import gplx.dbs.*; import gplx.xowa.apps.*; import gplx.xowa.dbs.tbls.*; import gplx.xowa.ctgs.*; import gplx.xowa.hdumps.*; +import gplx.xowa2.wikis.data.tbls.*; public class Xodb_mgr_sql implements Xodb_mgr, GfoInvkAble { private boolean html_db_enabled; public Xodb_mgr_sql(Xow_wiki wiki) { @@ -49,7 +50,7 @@ public class Xodb_mgr_sql implements Xodb_mgr, GfoInvkAble { public Xodb_save_mgr Save_mgr() {return save_mgr;} private Xodb_save_mgr_sql save_mgr; public Xodb_hdump_mgr Hdump_mgr() {return hdump_mgr;} private Xodb_hdump_mgr hdump_mgr; public Xodb_xowa_cfg_tbl Tbl_xowa_cfg() {return tbl_cfg;} private Xodb_xowa_cfg_tbl tbl_cfg = new Xodb_xowa_cfg_tbl(); - public Xodb_xowa_ns_tbl Tbl_xowa_ns() {return tbl_ns;} private Xodb_xowa_ns_tbl tbl_ns = new Xodb_xowa_ns_tbl(); + public Xodata_ns_regy_tbl Tbl_xowa_ns() {return tbl_ns;} private Xodata_ns_regy_tbl tbl_ns = new Xodata_ns_regy_tbl(); public Xodb_xowa_db_tbl Tbl_xowa_db() {return tbl_db;} private Xodb_xowa_db_tbl tbl_db = new Xodb_xowa_db_tbl(); public Xodb_page_tbl Tbl_page() {return tbl_page;} private Xodb_page_tbl tbl_page; public Xodb_text_tbl Tbl_text() {return tbl_text;} private Xodb_text_tbl tbl_text; @@ -71,22 +72,22 @@ public class Xodb_mgr_sql implements Xodb_mgr, GfoInvkAble { Xoi_dump_mgr dump_mgr = wiki.App().Setup_mgr().Dump_mgr(); data_storage_format = dump_mgr.Data_storage_format(); fsys_mgr.Init_by_ns_map(wiki.Ns_mgr(), ns_map, dump_mgr.Db_text_max()); - Core_provider_(fsys_mgr.Provider_core()); + Core_provider_(fsys_mgr.Conn_core()); state = State_make; } - public void Init_load(Db_conn_info connect) { - Db_provider provider = Db_provider_pool._.Get_or_new(connect); - Xodb_file[] files = tbl_db.Select_all(provider); - fsys_mgr.Init_by_files(provider, files); - Core_provider_(provider); + public void Init_load(Db_url connect) { + Db_conn conn = Db_conn_pool_old._.Get_or_new(connect); + Xodb_file[] files = tbl_db.Select_all(conn); + fsys_mgr.Init_by_files(conn, files); + Core_provider_(conn); state = State_load; } - private void Core_provider_(Db_provider provider) { - tbl_cfg.Provider_(provider); - tbl_ns.Provider_(provider); - tbl_db.Provider_(provider); - tbl_page.Provider_(provider); - tbl_site_stats.Provider_(provider); + private void Core_provider_(Db_conn conn) { + tbl_cfg.Conn_(conn); + tbl_ns.Conn_(conn); + tbl_db.Conn_(conn); + tbl_page.Conn_(conn); + tbl_site_stats.Conn_(conn); } public void Page_create(Db_stmt page_stmt, Db_stmt text_stmt, int page_id, int ns_id, byte[] ttl_wo_ns, boolean redirect, DateAdp modified_on, byte[] text, int random_int, int file_idx) { int text_len = text.length; @@ -94,7 +95,7 @@ public class Xodb_mgr_sql implements Xodb_mgr, GfoInvkAble { tbl_page.Insert(page_stmt, page_id, ns_id, ttl_wo_ns, redirect, modified_on, text_len, random_int, file_idx, html_db_id); tbl_text.Insert(text_stmt, page_id, text, data_storage_format); } - public boolean Ctg_select_v1(Xoctg_view_ctg view_ctg, Db_provider ctg_provider, Xodb_category_itm ctg) { + public boolean Ctg_select_v1(Xoctg_view_ctg view_ctg, Db_conn ctg_provider, Xodb_category_itm ctg) { Db_qry_select qry = Db_qry_.select_().Cols_(Xodb_categorylinks_tbl.Fld_cl_from) .From_(Xodb_categorylinks_tbl.Tbl_name) .Where_(Db_crt_.eq_(Xodb_categorylinks_tbl.Fld_cl_to_id, ctg.Id())) @@ -167,12 +168,12 @@ public class Xodb_mgr_sql implements Xodb_mgr, GfoInvkAble { Xodb_file file = ary[i] ; if (file.Tid() != tid) continue; file.Rls(); - gplx.dbs.Db_conn_info__sqlite sqlite = (gplx.dbs.Db_conn_info__sqlite)file.Connect(); + gplx.dbs.Db_url__sqlite sqlite = (gplx.dbs.Db_url__sqlite)file.Connect(); Io_mgr._.DeleteFil_args(sqlite.Url()).MissingFails_off().Exec(); file.Cmd_mode_(Db_cmd_mode.Delete); } - tbl_db.Commit_all(fsys_mgr.Provider_core(), ary); - this.Init_load(fsys_mgr.Provider_core().Conn_info()); + tbl_db.Commit_all(fsys_mgr.Conn_core(), ary); + this.Init_load(fsys_mgr.Conn_core().Url()); } public static final String Grp_wiki_init = "wiki.init"; @@ -195,7 +196,7 @@ public class Xodb_mgr_sql implements Xodb_mgr, GfoInvkAble { Xodb_mgr_sql rv = db_mgr.Tid() == Xodb_mgr_txt.Tid_txt ? wiki.Db_mgr_create_as_sql() : wiki.Db_mgr_as_sql(); byte state = rv.State(); switch (state) { - case Xodb_mgr_sql.State_init: rv.Init_load(Db_conn_info_.sqlite_(Xodb_mgr_sql.Find_core_url(wiki))); break; // load + case Xodb_mgr_sql.State_init: rv.Init_load(Db_url_.sqlite_(Xodb_mgr_sql.Find_core_url(wiki))); break; // load case Xodb_mgr_sql.State_make: break; // noop; being made; don't load from db; case Xodb_mgr_sql.State_load: break; // noop; already loaded; default: throw Err_.unhandled(state); diff --git a/400_xowa/src/gplx/xowa/dbs/Xodb_save_mgr_sql.java b/400_xowa/src/gplx/xowa/dbs/Xodb_save_mgr_sql.java index 565f74233..9d80afb16 100644 --- a/400_xowa/src/gplx/xowa/dbs/Xodb_save_mgr_sql.java +++ b/400_xowa/src/gplx/xowa/dbs/Xodb_save_mgr_sql.java @@ -30,7 +30,7 @@ public class Xodb_save_mgr_sql implements Xodb_save_mgr { String page_id = db_mgr.Tbl_xowa_cfg().Select_val_or("db", "page.id_nxt", null); int page_id_int = -1; if (page_id == null) { - DataRdr rdr = db_mgr.Tbl_page().Provider().Exec_sql_as_rdr("SELECT (Max(page_id) + 1) AS max_page_id FROM page;"); + DataRdr rdr = db_mgr.Tbl_page().Conn().Exec_sql_as_rdr("SELECT (Max(page_id) + 1) AS max_page_id FROM page;"); if (rdr.MoveNextPeer()) { page_id = Int_.Xto_str(rdr.ReadInt("max_page_id")); page_id_int = Int_.parse_(page_id); @@ -44,8 +44,8 @@ public class Xodb_save_mgr_sql implements Xodb_save_mgr { Xodb_fsys_mgr fsys_mgr = db_mgr.Fsys_mgr(); int file_idx = fsys_mgr.Tid_text_idx(); boolean redirect = db_mgr.Wiki().Redirect_mgr().Is_redirect(text, text.length); - Db_stmt page_stmt = db_mgr.Tbl_page().Insert_stmt(fsys_mgr.Provider_page()); - Db_provider text_provider = db_mgr.Fsys_mgr().Get_by_idx(file_idx).Provider(); + Db_stmt page_stmt = db_mgr.Tbl_page().Insert_stmt(fsys_mgr.Conn_page()); + Db_conn text_provider = db_mgr.Fsys_mgr().Get_by_idx(file_idx).Conn(); Db_stmt text_stmt = db_mgr.Tbl_text().Insert_stmt(text_provider); text = zip_mgr.Zip(db_mgr.Data_storage_format(), text); try { @@ -72,10 +72,10 @@ public class Xodb_save_mgr_sql implements Xodb_save_mgr { if (redirect_changed) kv_ary[kv_idx++] = KeyVal_.new_("page_is_redirect", redirect_changed); if (modified_changed) kv_ary[kv_idx++] = KeyVal_.new_("page_touched", Xto_touched_str(modified)); qry = Db_qry_.update_common_("page", Db_crt_.eq_("page_id", page.Revision_data().Id()), kv_ary); - Db_provider provider = db_mgr.Fsys_mgr().Provider_core(); - provider.Txn_mgr().Txn_bgn_if_none(); - provider.Exec_qry(qry); - provider.Txn_mgr().Txn_end_all(); + Db_conn conn = db_mgr.Fsys_mgr().Conn_core(); + conn.Txn_mgr().Txn_bgn_if_none(); + conn.Exec_qry(qry); + conn.Txn_mgr().Txn_end_all(); } Xodb_page db_page = new Xodb_page(); db_mgr.Load_mgr().Load_by_id(db_page, page.Revision_data().Id()); @@ -88,12 +88,12 @@ public class Xodb_save_mgr_sql implements Xodb_save_mgr { , KeyVal_.new_("page_title", String_.new_utf8_(trg_ttl)) ); try { - db_mgr.Fsys_mgr().Provider_core().Exec_qry(qry); + db_mgr.Fsys_mgr().Conn_core().Exec_qry(qry); } catch (Exception exc) { if (String_.Has(Err_.Message_gplx_brief(exc), "columns page_namespace, page_random_int are not unique")) { // HACK: terrible hack, but moving pages across ns will break UNIQUE index - db_mgr.Fsys_mgr().Provider_core().Exec_sql("DROP INDEX page__name_random;"); // is UNIQUE by default - db_mgr.Fsys_mgr().Provider_core().Exec_sql("CREATE INDEX page__name_random ON page (page_namespace, page_random_int);"); - db_mgr.Fsys_mgr().Provider_core().Exec_qry(qry); + db_mgr.Fsys_mgr().Conn_core().Exec_sql("DROP INDEX page__name_random;"); // is UNIQUE by default + db_mgr.Fsys_mgr().Conn_core().Exec_sql("CREATE INDEX page__name_random ON page (page_namespace, page_random_int);"); + db_mgr.Fsys_mgr().Conn_core().Exec_qry(qry); } } } diff --git a/400_xowa/src/gplx/xowa/dbs/Xodb_upgrade_mgr.java b/400_xowa/src/gplx/xowa/dbs/Xodb_upgrade_mgr.java index 526055ec8..8590bb539 100644 --- a/400_xowa/src/gplx/xowa/dbs/Xodb_upgrade_mgr.java +++ b/400_xowa/src/gplx/xowa/dbs/Xodb_upgrade_mgr.java @@ -31,11 +31,11 @@ class Xodb_upgrade_mgr { } // class Xodb_upgrade_mgr_v0_6_2_0 { // public static void Upgrade(Xodb_mgr_sql db_mgr, KeyVal[] kv_ary) { -// Db_provider p = db_mgr.Fsys_mgr().Core_provider(); +// Db_conn p = db_mgr.Fsys_mgr().Core_provider(); // Fix_storage_format(p, db_mgr, kv_ary); // Fix_category_version(p, db_mgr); // } -// private static void Fix_storage_format(Db_provider p, Xodb_mgr_sql db_mgr, KeyVal[] kv_ary) { // storage_format saved incorrectly as int +// private static void Fix_storage_format(Db_conn p, Xodb_mgr_sql db_mgr, KeyVal[] kv_ary) { // storage_format saved incorrectly as int // int len = kv_ary.length; // String gfs_data_storage_format = Xoa_gfs_mgr.Build_code(Xow_wiki.Invk_db_mgr, Xodb_mgr_sql.Invk_data_storage_format); // for (int i = 0; i < len; i++) { @@ -50,7 +50,7 @@ class Xodb_upgrade_mgr { // } // } // } -// private static void Fix_category_version(Db_provider p, Xodb_mgr_sql db_mgr) { +// private static void Fix_category_version(Db_conn p, Xodb_mgr_sql db_mgr) { // Db_qry qry = Db_qry_.select_().From_(Xodb_categorylinks_tbl.Tbl_name).Cols_(Xodb_categorylinks_tbl.Fld_cl_type_id).Where_(Db_crt_.eq_(Xodb_categorylinks_tbl.Fld_cl_type_id, )); // Db_stmt stmt = Db_stmt_.Null; // DataRdr rdr = DataRdr_.Null; diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_category_tbl.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_category_tbl.java index 66ad22e76..d902c8130 100644 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_category_tbl.java +++ b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_category_tbl.java @@ -18,32 +18,32 @@ along with this program. If not, see . package gplx.xowa.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*; import gplx.dbs.*; public class Xodb_category_tbl { - public Db_stmt Update_stmt(Db_provider p) {return Db_stmt_.new_update_(p, Tbl_name, String_.Ary(Fld_cat_id), Fld_cat_hidden);} + public Db_stmt Update_stmt(Db_conn p) {return Db_stmt_.new_update_(p, Tbl_name, String_.Ary(Fld_cat_id), Fld_cat_hidden);} public void Update(Db_stmt stmt, int cat_id, byte cat_hidden) { stmt.Clear() - .Val_byte_(cat_hidden) - .Val_int_(cat_id) + .Val_byte(cat_hidden) + .Val_int(cat_id) .Exec_update() ; } - public Db_stmt Insert_stmt(Db_provider p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_cat_id, Fld_cat_pages, Fld_cat_subcats, Fld_cat_files, Fld_cat_hidden, Fld_cat_file_idx);} + public Db_stmt Insert_stmt(Db_conn p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_cat_id, Fld_cat_pages, Fld_cat_subcats, Fld_cat_files, Fld_cat_hidden, Fld_cat_file_idx);} public void Insert(Db_stmt stmt, int cat_id, int cat_pages, int cat_subcats, int cat_files, byte cat_hidden, int cat_file_idx) { stmt.Clear() - .Val_int_(cat_id) - .Val_int_(cat_pages) - .Val_int_(cat_subcats) - .Val_int_(cat_files) - .Val_byte_(cat_hidden) - .Val_int_(cat_file_idx) + .Val_int(cat_id) + .Val_int(cat_pages) + .Val_int(cat_subcats) + .Val_int(cat_files) + .Val_byte(cat_hidden) + .Val_int(cat_file_idx) .Exec_insert() ; } - public Xodb_category_itm Select(Db_provider p, int cat_page_id) { + public Xodb_category_itm Select(Db_conn p, int cat_page_id) { Db_stmt stmt = Db_stmt_.Null; DataRdr rdr = DataRdr_.Null; try { stmt = Db_stmt_.new_select_(p, Tbl_name, String_.Ary(Fld_cat_id)); - rdr = stmt.Val_int_(cat_page_id).Exec_select(); + rdr = stmt.Val_int(cat_page_id).Exec_select(); if (rdr.MoveNextPeer()) { return Xodb_category_itm.load_ ( cat_page_id @@ -57,7 +57,7 @@ public class Xodb_category_tbl { } finally {stmt.Rls(); rdr.Rls();} return Xodb_category_itm.Null; } - public void Select_by_cat_id_in(Cancelable cancelable, OrderedHash rv, Db_provider p, Xodb_ctx db_ctx, int bgn, int end) { + public void Select_by_cat_id_in(Cancelable cancelable, OrderedHash rv, Db_conn p, Xodb_ctx db_ctx, int bgn, int end) { Xodb_in_wkr_category_id wkr = new Xodb_in_wkr_category_id(); wkr.Init(rv); wkr.Select_in(p, cancelable, db_ctx, bgn, end); diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_categorylinks_tbl.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_categorylinks_tbl.java index 9b2411b19..c4048d67d 100644 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_categorylinks_tbl.java +++ b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_categorylinks_tbl.java @@ -18,15 +18,15 @@ along with this program. If not, see . package gplx.xowa.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*; import gplx.dbs.*; import gplx.xowa.ctgs.*; public class Xodb_categorylinks_tbl { - public void Delete_all(Db_provider p) {p.Exec_qry(Db_qry_.delete_tbl_(Tbl_name));} - public Db_stmt Insert_stmt(Db_provider p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_cl_from, Fld_cl_to_id, Fld_cl_sortkey, Fld_cl_timestamp, Fld_cl_type_id);} + public void Delete_all(Db_conn p) {p.Exec_qry(Db_qry_.delete_tbl_(Tbl_name));} + public Db_stmt Insert_stmt(Db_conn p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_cl_from, Fld_cl_to_id, Fld_cl_sortkey, Fld_cl_timestamp, Fld_cl_type_id);} public void Insert(Db_stmt stmt, int page_id, int ctg_page_id, byte[] sortkey, int timestamp, byte ctg_tid) { stmt.Clear() - .Val_int_(page_id) - .Val_int_(ctg_page_id) - .Val_str_(String_.new_utf8_(sortkey)) - .Val_int_(timestamp) - .Val_byte_(ctg_tid) + .Val_int(page_id) + .Val_int(ctg_page_id) + .Val_str(String_.new_utf8_(sortkey)) + .Val_int(timestamp) + .Val_byte(ctg_tid) .Exec_insert() ; } @@ -38,7 +38,7 @@ public class Xodb_categorylinks_tbl { } return ctg_grp; } - public int Select_by_type(Db_provider p, ListAdp list, int cat_page_id, byte arg_tid, byte[] arg_sortkey, boolean arg_is_from, int limit) { + public int Select_by_type(Db_conn p, ListAdp list, int cat_page_id, byte arg_tid, byte[] arg_sortkey, boolean arg_is_from, int limit) { String arg_sortkey_str = arg_sortkey == null ? "" : String_.new_utf8_(arg_sortkey); gplx.criterias.Criteria comp_crt = !arg_is_from ? Db_crt_.mte_(Fld_cl_sortkey, arg_sortkey_str) // from: sortkey >= 'val' @@ -51,8 +51,8 @@ public class Xodb_categorylinks_tbl { DataRdr rdr = DataRdr_.Null; int count = 0; try { - stmt = p.Prepare(qry); - rdr = stmt.Val_int_(cat_page_id).Val_byte_(arg_tid).Val_str_(arg_sortkey_str).Exec_select(); + stmt = p.New_stmt(qry); + rdr = stmt.Val_int(cat_page_id).Val_byte(arg_tid).Val_str(arg_sortkey_str).Exec_select(); while (rdr.MoveNextPeer()) { int itm_page_id = rdr.ReadInt(Fld_cl_from); byte[] itm_sortkey = rdr.ReadBryByStr(Fld_cl_sortkey); diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_in_wkr_base.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_in_wkr_base.java index 5a2fd4d55..f0f2466c0 100644 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_in_wkr_base.java +++ b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_in_wkr_base.java @@ -22,7 +22,7 @@ public abstract class Xodb_in_wkr_base { public abstract void Fill_stmt(Db_stmt stmt, int bgn, int end); public abstract Db_qry Build_qry(Xodb_ctx tbl_ctx, int bgn, int end); public abstract void Eval_rslts(Cancelable cancelable, Xodb_ctx db_ctx, DataRdr rdr); - public void Select_in(Db_provider provider, Cancelable cancelable, Xodb_ctx db_ctx, int full_bgn, int full_end) { + public void Select_in(Db_conn conn, Cancelable cancelable, Xodb_ctx db_ctx, int full_bgn, int full_end) { DataRdr rdr = DataRdr_.Null; Db_stmt stmt = Db_stmt_.Null; int interval = Interval(); @@ -30,7 +30,7 @@ public abstract class Xodb_in_wkr_base { int part_end = i + interval; if (part_end > full_end) part_end = full_end; try { - stmt = provider.Prepare(Build_qry(db_ctx, i, part_end)); + stmt = conn.New_stmt(Build_qry(db_ctx, i, part_end)); Fill_stmt(stmt, i, part_end); rdr = stmt.Exec_select(); Eval_rslts(cancelable, db_ctx, rdr); diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_in_wkr_page.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_in_wkr_page.java index 4e9a39ce8..03ac50d51 100644 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_in_wkr_page.java +++ b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_in_wkr_page.java @@ -29,7 +29,7 @@ class Xodb_in_wkr_page_id extends Xodb_in_wkr_page_base { @Override public void Fill_stmt(Db_stmt stmt, int bgn, int end) { for (int i = bgn; i < end; i++) { Xodb_page page = (Xodb_page)list.FetchAt(i); - stmt.Val_int_(page.Id()); + stmt.Val_int(page.Id()); } } @Override public Xodb_page Eval_rslts_key(Xodb_page rdr_page) {return (Xodb_page)hash.Fetch(rdr_page.Id_val());} @@ -50,8 +50,8 @@ class Xodb_in_wkr_page_title extends Xodb_in_wkr_page_base { @Override public void Fill_stmt(Db_stmt stmt, int bgn, int end) { for (int i = bgn; i < end; i++) { Xodb_page page = (Xodb_page)hash.FetchAt(i); - stmt.Val_int_(in_ns); - stmt.Val_str_by_bry_(page.Ttl_wo_ns()); + stmt.Val_int(in_ns); + stmt.Val_bry_as_str(page.Ttl_wo_ns()); } } @Override public Xodb_page Eval_rslts_key(Xodb_page rdr_page) {return (Xodb_page)hash.Fetch(rdr_page.Ttl_wo_ns());} @@ -72,8 +72,8 @@ class Xodb_in_wkr_page_title_ns extends Xodb_in_wkr_page_base { @Override public void Fill_stmt(Db_stmt stmt, int bgn, int end) { for (int i = bgn; i < end; i++) { Xodb_page page = (Xodb_page)hash.FetchAt(i); - stmt.Val_int_(page.Ns_id()); - stmt.Val_str_by_bry_(page.Ttl_wo_ns()); + stmt.Val_int(page.Ns_id()); + stmt.Val_bry_as_str(page.Ttl_wo_ns()); } } @Override public Xodb_page Eval_rslts_key(Xodb_page rdr_page) { @@ -131,7 +131,7 @@ class Xodb_in_wkr_category_id extends Xodb_in_wkr_base { @Override public void Fill_stmt(Db_stmt stmt, int bgn, int end) { for (int i = bgn; i < end; i++) { Xodb_page page = (Xodb_page)hash.FetchAt(i); - stmt.Val_int_(page.Id()); + stmt.Val_int(page.Id()); } } @Override public void Eval_rslts(Cancelable cancelable, Xodb_ctx db_ctx, DataRdr rdr) { diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_page_tbl.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_page_tbl.java index 11349e5e0..6ef98ec9c 100644 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_page_tbl.java +++ b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_page_tbl.java @@ -29,8 +29,8 @@ public class Xodb_page_tbl { // Db_rdr rdr = Db_rdr_.Null; // Db_stmt stmt = Db_stmt_.Null; // try { -// stmt = Db_stmt_.new_select_as_rdr(provider, Db_qry__select_in_tbl.new_(Tbl_name, String_.Ary(Fld_page_id), html_db_enabled ? Select_by_id_flds__hdump : Select_by_id_flds__basic)); -// rdr = stmt.Val_int_(page_id).Exec_select_as_rdr(); +// stmt = Db_stmt_.new_select_as_rdr(conn, Db_qry__select_in_tbl.new_(Tbl_name, String_.Ary(Fld_page_id), html_db_enabled ? Select_by_id_flds__hdump : Select_by_id_flds__basic)); +// rdr = stmt.Val_int(page_id).Exec_select_as_rdr(); // while (rdr.Move_next()) { // Read_page__all2(rv, rdr, html_db_enabled); // return true; @@ -44,17 +44,17 @@ public class Xodb_page_tbl { this.db_ctx = wiki.Db_mgr().Db_ctx(); } public void Html_db_enabled_(boolean v) {html_db_enabled = v;} private boolean html_db_enabled; - public Db_provider Provider() {return provider;} public void Provider_(Db_provider provider) {this.provider = provider;} private Db_provider provider; + public Db_conn Conn() {return conn;} public void Conn_(Db_conn conn) {this.conn = conn;} private Db_conn conn; public boolean Select_by_ttl(Xodb_page rv, Xow_ns ns, byte[] ttl) { Db_rdr rdr = Db_rdr_.Null; Db_stmt stmt = Db_stmt_.Null; try { - stmt = Db_stmt_.new_select_as_rdr(provider, Db_qry__select_in_tbl.new_(Tbl_name, String_.Ary(Fld_page_ns, Fld_page_title), html_db_enabled ? Select_by_id_flds__hdump : Select_by_id_flds__basic)); - rdr = stmt.Val_int_(ns.Id()).Val_str_(String_.new_utf8_(ttl)).Exec_select_as_rdr(); + stmt = Db_stmt_.new_select_as_rdr(conn, Db_qry__select_in_tbl.new_(Tbl_name, String_.Ary(Fld_page_ns, Fld_page_title), html_db_enabled ? Select_by_id_flds__hdump : Select_by_id_flds__basic)); + rdr = stmt.Val_int(ns.Id()).Val_str(String_.new_utf8_(ttl)).Exec_select_as_rdr(); if (rdr.Move_next()) { Read_page__all2(rv, rdr, html_db_enabled); return true; } - } finally {rdr.Close(); stmt.Rls();} + } finally {rdr.Rls(); stmt.Rls();} return false; } public static void Read_page__all2(Xodb_page page, Db_rdr rdr, boolean html_db_enabled) { @@ -74,9 +74,9 @@ public class Xodb_page_tbl { DataRdr rdr = DataRdr_.Null; Db_stmt stmt = Db_stmt_.Null; try { - stmt = Db_stmt_.new_select_(provider, Tbl_name, String_.Ary(Fld_page_id)); + stmt = Db_stmt_.new_select_(conn, Tbl_name, String_.Ary(Fld_page_id)); rdr = stmt - .Val_int_(page_id) + .Val_int(page_id) .Exec_select(); while (rdr.MoveNextPeer()) { Read_page__all(rv, rdr, html_db_enabled); @@ -85,32 +85,32 @@ public class Xodb_page_tbl { } finally {rdr.Rls(); stmt.Rls();} return false; } - public void Delete_all() {provider.Exec_qry(Db_qry_.delete_tbl_(Tbl_name));} - public Db_stmt Insert_stmt(Db_provider p) { + public void Delete_all() {conn.Exec_qry(Db_qry_.delete_tbl_(Tbl_name));} + public Db_stmt Insert_stmt(Db_conn p) { return Db_stmt_.new_insert_(p, Tbl_name, html_db_enabled ? Flds_insert__html_y : Flds_insert__html_n); } public void Insert(Db_stmt stmt, int page_id, int ns_id, byte[] ttl_wo_ns, boolean redirect, DateAdp modified_on, int page_len, int random_int, int file_idx, int html_db_id) { stmt.Clear() - .Val_int_(page_id) - .Val_int_(ns_id) - .Val_str_(String_.new_utf8_(ttl_wo_ns)) - .Val_byte_((byte)(redirect ? 1 : 0)) - .Val_str_(Xto_touched_str(modified_on)) - .Val_int_(page_len) - .Val_int_(random_int) - .Val_int_(file_idx); + .Val_int(page_id) + .Val_int(ns_id) + .Val_str(String_.new_utf8_(ttl_wo_ns)) + .Val_byte((byte)(redirect ? 1 : 0)) + .Val_str(Xto_touched_str(modified_on)) + .Val_int(page_len) + .Val_int(random_int) + .Val_int(file_idx); if (html_db_enabled) - stmt.Val_int_(html_db_id); + stmt.Val_int(html_db_id); stmt.Exec_insert(); } public int Select_id(int ns_id, byte[] ttl) { DataRdr rdr = DataRdr_.Null; Db_stmt stmt = Db_stmt_.Null; try { - stmt = Db_stmt_.new_select_(provider, Tbl_name, String_.Ary(Fld_page_ns, Fld_page_title), Fld_page_id); + stmt = Db_stmt_.new_select_(conn, Tbl_name, String_.Ary(Fld_page_ns, Fld_page_title), Fld_page_id); rdr = stmt - .Val_int_(ns_id) - .Val_str_by_bry_(ttl) + .Val_int(ns_id) + .Val_bry_as_str(ttl) .Exec_select(); while (rdr.MoveNextPeer()) { return rdr.ReadInt(Fld_page_id); @@ -118,7 +118,7 @@ public class Xodb_page_tbl { } finally {rdr.Rls(); stmt.Rls();} return Xodb_mgr_sql.Page_id_null; } - public DataRdr Select_all(Db_provider p) { + public DataRdr Select_all(Db_conn p) { Db_qry_select qry = Db_qry_select.new_().From_(Tbl_name).Cols_(Fld_page_id, Fld_page_title).OrderBy_asc_(Fld_page_id); return p.Exec_qry_as_rdr(qry); } @@ -130,7 +130,7 @@ public class Xodb_page_tbl { String[] cols = search_suggest ? Flds_select_idx : html_db_enabled ? Flds_select_all__html_y : Flds_select_all__html_n; int limit = fwd ? max_results + 1 : max_results; // + 1 to get next item Db_qry_select select = Db_qry_.select_cols_(Tbl_name, crt, cols).Limit_(limit).OrderBy_(Fld_page_title, fwd); - return select.Exec_qry_as_rdr(provider); + return select.Exec_qry_as_rdr(conn); } public void Load_ttls_for_all_pages(Cancelable cancelable, ListAdp rslt_list, Xodb_page rslt_nxt, Xodb_page rslt_prv, Int_obj_ref rslt_count, Xow_ns ns, byte[] key, int max_results, int min_page_len, int browse_len, boolean include_redirects, boolean fetch_prv_item) { DataRdr rdr = DataRdr_.Null; @@ -179,7 +179,7 @@ public class Xodb_page_tbl { Db_qry qry = Db_qry_sql.rdr_("SELECT page_id, page_namespace, page_title, page_len FROM page INDEXED BY page__title WHERE page_namespace = " + Int_.Xto_str(ns.Id()) + " AND page_title BETWEEN '" + search_bgn + "' AND '" + search_end + "' ORDER BY page_len DESC LIMIT " + Int_.Xto_str(max_results) + ";"); DataRdr rdr = DataRdr_.Null; try { - rdr = provider.Exec_qry_as_rdr(qry); + rdr = conn.Exec_qry_as_rdr(qry); while (rdr.MoveNextPeer()) { if (cancelable.Canceled()) return; Xodb_page page = new Xodb_page(); @@ -204,7 +204,7 @@ public class Xodb_page_tbl { } Xodb_in_wkr_page_id wkr = new Xodb_in_wkr_page_id(); wkr.Init(rv, hash); - wkr.Select_in(provider, cancelable, db_ctx, bgn, end); + wkr.Select_in(conn, cancelable, db_ctx, bgn, end); return true; } public byte[] Select_random(Xow_ns ns) {// ns should be ns_main @@ -213,10 +213,10 @@ public class Xodb_page_tbl { Db_stmt stmt = Db_stmt_.Null; byte[] rv = null; try { - stmt = Db_stmt_.new_select_(provider, Tbl_name, String_.Ary(Fld_page_ns, Fld_page_random_int), Fld_page_title); + stmt = Db_stmt_.new_select_(conn, Tbl_name, String_.Ary(Fld_page_ns, Fld_page_random_int), Fld_page_title); rdr = stmt - .Val_int_(ns.Id()) - .Val_int_(random_int) + .Val_int(ns.Id()) + .Val_int(random_int) .Exec_select(); if (rdr.MoveNextPeer()) { rv = rdr.ReadBryByStr(Fld_page_title); @@ -232,8 +232,8 @@ public class Xodb_page_tbl { Db_stmt stmt = Db_stmt_.Null; search = Bry_.Replace(search, Byte_ascii.Asterisk, Byte_ascii.Percent); try { - stmt = provider.Prepare(qry); - rdr = stmt.Clear().Val_int_(Xow_ns_.Id_main).Val_str_by_bry_(search).Exec_select(); + stmt = conn.New_stmt(qry); + rdr = stmt.Clear().Val_int(Xow_ns_.Id_main).Val_bry_as_str(search).Exec_select(); while (rdr.MoveNextPeer()) { if (cancelable.Canceled()) return; Xodb_page page = new Xodb_page(); @@ -251,21 +251,21 @@ public class Xodb_page_tbl { int increment_pos = rv[rv_len - 1] == Byte_ascii.Percent ? rv_len - 2 : rv_len - 1; // increment last char, unless it is %; if %, increment one before it return Bry_.Increment_last(rv, increment_pos); } - public Db_stmt Select_for_parse_all_stmt(Db_provider p, int limit, byte redirect) { + public Db_stmt Select_for_parse_all_stmt(Db_conn p, int limit, byte redirect) { Criteria crt = gplx.criterias.Criteria_.And_many(Db_crt_.eq_(Fld_page_ns, -1), Db_crt_.mt_(Fld_page_title, "")); if (redirect != Bool_.__byte) crt = gplx.criterias.Criteria_.And(crt, Db_crt_.eq_(Fld_page_is_redirect, redirect)); Db_qry_select qry = Db_qry_.select_().From_(Tbl_name).Cols_(html_db_enabled ? Flds_select_all__html_y : Flds_select_all__html_n) .Where_(crt) .Limit_(limit); - return p.Prepare(qry); + return p.New_stmt(qry); } public void Select_for_parse_all(Cancelable cancelable, OrderedHash rv, Db_stmt stmt, int ns, byte[] ttl, byte redirect) { String ttl_str = String_.new_utf8_(ttl); DataRdr rdr = DataRdr_.Null; try { - stmt.Clear().Val_int_(ns).Val_str_(ttl_str); - if (redirect != Bool_.__byte) stmt.Val_byte_(redirect); + stmt.Clear().Val_int(ns).Val_str(ttl_str); + if (redirect != Bool_.__byte) stmt.Val_byte(redirect); rdr = stmt.Exec_select(); while (rdr.MoveNextPeer()) { if (cancelable.Canceled()) return; @@ -279,17 +279,17 @@ public class Xodb_page_tbl { Xodb_in_wkr_page_title_ns wkr = new Xodb_in_wkr_page_title_ns(); wkr.Fill_idx_fields_only_(fill_idx_fields_only); wkr.Init(ns_mgr, rv); - wkr.Select_in(provider, cancelable, db_ctx, bgn, end); + wkr.Select_in(conn, cancelable, db_ctx, bgn, end); } public void Select_by_ttl_in(Cancelable cancelable, OrderedHash rv, int ns_id, int bgn, int end) { Xodb_in_wkr_page_title wkr = new Xodb_in_wkr_page_title(); wkr.Init(rv, ns_id); - wkr.Select_in(provider, cancelable, db_ctx, bgn, end); + wkr.Select_in(conn, cancelable, db_ctx, bgn, end); } public void Update_html_db_id(int page_id, int html_db_id) { if (!html_db_enabled) throw Err_.new_("html_db not enabled"); - Db_stmt stmt = Db_stmt_.new_update_(provider, Tbl_name, String_.Ary(Fld_page_id), Fld_page_html_db_id); - stmt.Val_int_(html_db_id).Val_int_(page_id).Exec_update(); + Db_stmt stmt = Db_stmt_.new_update_(conn, Tbl_name, String_.Ary(Fld_page_id), Fld_page_html_db_id); + stmt.Val_int(html_db_id).Val_int(page_id).Exec_update(); } private static final String Page_touched_fmt = "yyyyMMddHHmmss"; private static String Xto_touched_str(DateAdp v) {return v.XtoStr_fmt(Page_touched_fmt);} diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_search_title_page_tbl.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_search_title_page_tbl.java index ed44f6966..1bc73c66a 100644 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_search_title_page_tbl.java +++ b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_search_title_page_tbl.java @@ -18,14 +18,14 @@ along with this program. If not, see . package gplx.xowa.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*; import gplx.dbs.*; public class Xodb_search_title_page_tbl { - public static void Create_table(Db_provider p) {Sqlite_engine_.Tbl_create(p, Tbl_name, Tbl_sql);} - public static void Create_index_unique(Gfo_usr_dlg usr_dlg, Db_provider p) {Sqlite_engine_.Idx_create(usr_dlg, p, "search", Idx_main_unique);} - public static void Create_index_non_unique(Gfo_usr_dlg usr_dlg, Db_provider p) {Sqlite_engine_.Idx_create(usr_dlg, p, "search", Idx_main_non_unique);} - public static Db_stmt Insert_stmt(Db_provider p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_stp_word_id, Fld_stp_page_id);} + public static void Create_table(Db_conn p) {Sqlite_engine_.Tbl_create(p, Tbl_name, Tbl_sql);} + public static void Create_index_unique(Gfo_usr_dlg usr_dlg, Db_conn p) {Sqlite_engine_.Idx_create(usr_dlg, p, "search", Idx_main_unique);} + public static void Create_index_non_unique(Gfo_usr_dlg usr_dlg, Db_conn p) {Sqlite_engine_.Idx_create(usr_dlg, p, "search", Idx_main_non_unique);} + public static Db_stmt Insert_stmt(Db_conn p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_stp_word_id, Fld_stp_page_id);} public static void Insert(Db_stmt stmt, int word_id, int page_id) { stmt.Clear() - .Val_int_(word_id) - .Val_int_(page_id) + .Val_int(word_id) + .Val_int(page_id) .Exec_insert(); } public static final String Tbl_name = "search_title_page", Fld_stp_word_id = "stp_word_id", Fld_stp_page_id = "stp_page_id"; diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_search_title_word_tbl.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_search_title_word_tbl.java index 3822ea424..06895fa79 100644 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_search_title_word_tbl.java +++ b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_search_title_word_tbl.java @@ -18,16 +18,16 @@ along with this program. If not, see . package gplx.xowa.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*; import gplx.dbs.*; public class Xodb_search_title_word_tbl { - public static void Create_table(Db_provider p) {Sqlite_engine_.Tbl_create(p, Tbl_name, Tbl_sql);} - public static void Create_index(Gfo_usr_dlg usr_dlg, Db_provider p) {Sqlite_engine_.Idx_create(usr_dlg, p, "search", Indexes_main);} - public static Db_stmt Insert_stmt(Db_provider p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_stw_word_id, Fld_stw_word);} + public static void Create_table(Db_conn p) {Sqlite_engine_.Tbl_create(p, Tbl_name, Tbl_sql);} + public static void Create_index(Gfo_usr_dlg usr_dlg, Db_conn p) {Sqlite_engine_.Idx_create(usr_dlg, p, "search", Indexes_main);} + public static Db_stmt Insert_stmt(Db_conn p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_stw_word_id, Fld_stw_word);} public static void Insert(Db_stmt stmt, int word_id, byte[] word) { stmt.Clear() - .Val_int_(word_id) - .Val_str_by_bry_(word) + .Val_int(word_id) + .Val_bry_as_str(word) .Exec_insert(); } - public static void Select_by_word(Cancelable cancelable, ListAdp rv, Xodb_ctx db_ctx, byte[] search, int results_max, Db_provider p) { + public static void Select_by_word(Cancelable cancelable, ListAdp rv, Xodb_ctx db_ctx, byte[] search, int results_max, Db_conn p) { Db_qry_select qry = Db_qry_.select_() .Cols_(Xodb_search_title_word_tbl.Fld_stw_word_id) .From_(Xodb_search_title_word_tbl.Tbl_name, "w") @@ -82,7 +82,7 @@ class Xodb_in_wkr_search_title_id extends Xodb_in_wkr_base { @Override public void Fill_stmt(Db_stmt stmt, int bgn, int end) { for (int i = bgn; i < end; i++) { Int_obj_val word_id = (Int_obj_val)words.FetchAt(i); - stmt.Val_int_(word_id.Val()); + stmt.Val_int(word_id.Val()); } } @Override public void Eval_rslts(Cancelable cancelable, Xodb_ctx db_ctx, DataRdr rdr) { diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_site_stats_tbl.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_site_stats_tbl.java index 1231030de..ab667b96b 100644 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_site_stats_tbl.java +++ b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_site_stats_tbl.java @@ -18,15 +18,15 @@ along with this program. If not, see . package gplx.xowa.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*; import gplx.dbs.*; public class Xodb_site_stats_tbl { - public void Provider_(Db_provider provider) {this.provider = provider;} Db_provider provider; + public void Conn_(Db_conn conn) {this.conn = conn;} Db_conn conn; public void Update(int num_articles, int num_pages, int num_files) { Db_stmt stmt = Db_stmt_.Null; try { - stmt = Db_stmt_.new_update_(provider, Tbl_name, String_.Ary(Fld_ss_row_id), Fld_ss_good_articles, Fld_ss_total_pages, Fld_ss_images); - stmt.Val_int_(num_articles) - .Val_int_(num_pages) - .Val_int_(num_files) - .Val_int_(1) + stmt = Db_stmt_.new_update_(conn, Tbl_name, String_.Ary(Fld_ss_row_id), Fld_ss_good_articles, Fld_ss_total_pages, Fld_ss_images); + stmt.Val_int(num_articles) + .Val_int(num_pages) + .Val_int(num_files) + .Val_int(1) .Exec_update(); ; } finally {stmt.Rls();} @@ -36,7 +36,7 @@ public class Xodb_site_stats_tbl { DataRdr rdr = DataRdr_.Null; Db_stmt stmt = Db_stmt_.Null; try { - stmt = Db_stmt_.new_select_all_(provider, Tbl_name); + stmt = Db_stmt_.new_select_all_(conn, Tbl_name); rdr = stmt.Exec_select(); if (rdr.MoveNextPeer()) { stats.NumArticles_ (rdr.ReadInt(Fld_ss_good_articles)); diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_text_tbl.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_text_tbl.java index 8127b0e0c..ae662b95a 100644 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_text_tbl.java +++ b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_text_tbl.java @@ -19,25 +19,25 @@ package gplx.xowa.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa. import gplx.dbs.*; import gplx.ios.*; public class Xodb_text_tbl { public Xodb_text_tbl(Xodb_mgr_sql db_mgr) {this.db_mgr = db_mgr; zip_mgr = db_mgr.Wiki().App().Zip_mgr();} private Xodb_mgr_sql db_mgr; private Io_stream_zip_mgr zip_mgr; - public void Delete_all(Db_provider provider) {provider.Exec_qry(Db_qry_.delete_tbl_(Tbl_name));} - public Db_stmt Insert_stmt(Db_provider prov) {return Db_stmt_.new_insert_(prov, Tbl_name, Fld_page_id, Fld_old_text);} + public void Delete_all(Db_conn conn) {conn.Exec_qry(Db_qry_.delete_tbl_(Tbl_name));} + public Db_stmt Insert_stmt(Db_conn prov) {return Db_stmt_.new_insert_(prov, Tbl_name, Fld_page_id, Fld_old_text);} public void Insert(Db_stmt stmt, int page_id, byte[] text, byte storage_type) { - stmt.Clear().Val_int_(page_id).Val_bry_(text).Exec_insert(); + stmt.Clear().Val_int(page_id).Val_bry(text).Exec_insert(); } public void Update(int file_id, int page_id, byte[] text) { Db_stmt stmt = Db_stmt_.Null; try { - Db_provider provider = db_mgr.Fsys_mgr().Get_by_idx(file_id).Provider(); - stmt = Db_stmt_.new_update_(provider, Tbl_name, String_.Ary(Fld_page_id), Fld_old_text); - stmt.Val_bry_(text).Val_int_(page_id).Exec_update(); + Db_conn conn = db_mgr.Fsys_mgr().Get_by_idx(file_id).Conn(); + stmt = Db_stmt_.new_update_(conn, Tbl_name, String_.Ary(Fld_page_id), Fld_old_text); + stmt.Val_bry(text).Val_int(page_id).Exec_update(); } finally {stmt.Rls();} } public byte[] Select(int file_id, int page_id) { Db_stmt stmt = Db_stmt_.Null; try { - Db_provider provider = db_mgr.Fsys_mgr().Get_by_idx(file_id).Provider(); - stmt = Db_stmt_.new_select_(provider, Tbl_name, String_.Ary(Fld_page_id), Fld_old_text); - byte[] rv = (byte[])stmt.Val_int_(page_id).Exec_select_val(); + Db_conn conn = db_mgr.Fsys_mgr().Get_by_idx(file_id).Conn(); + stmt = Db_stmt_.new_select_(conn, Tbl_name, String_.Ary(Fld_page_id), Fld_old_text); + byte[] rv = (byte[])stmt.Val_int(page_id).Exec_select_val(); rv = zip_mgr.Unzip(db_mgr.Data_storage_format(), rv); return rv; } finally {stmt.Rls();} @@ -60,11 +60,11 @@ public class Xodb_text_tbl { if (cancelable.Canceled()) return; args_ary[i] = 0; } - stmt = Db_stmt_.new_select_in_(file.Provider(), Tbl_name, Fld_page_id, args_ary); + stmt = Db_stmt_.new_select_in_(file.Conn(), Tbl_name, Fld_page_id, args_ary); for (int i = 0; i < len; i++) { if (cancelable.Canceled()) return; Xodb_page page = (Xodb_page)pages.FetchAt(i); - stmt.Val_int_(page.Id()); + stmt.Val_int(page.Id()); } rdr = stmt.Exec_select(); while (rdr.MoveNextPeer()) { diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_wdata_pids_tbl.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_wdata_pids_tbl.java index da964a96c..4a9f2779d 100644 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_wdata_pids_tbl.java +++ b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_wdata_pids_tbl.java @@ -18,16 +18,16 @@ along with this program. If not, see . package gplx.xowa.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*; import gplx.dbs.*; import gplx.xowa.xtns.wdatas.*; public class Xodb_wdata_pids_tbl { - public void Purge(Db_provider p) {p.Exec_qry(Db_qry_.delete_tbl_(Tbl_name));} - public Db_stmt Insert_stmt(Db_provider p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_wp_src_lang, Fld_wp_src_ttl, Fld_wp_trg_ttl);} + public void Purge(Db_conn p) {p.Exec_qry(Db_qry_.delete_tbl_(Tbl_name));} + public Db_stmt Insert_stmt(Db_conn p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_wp_src_lang, Fld_wp_src_ttl, Fld_wp_trg_ttl);} public void Insert(Db_stmt stmt, byte[] src_lang, byte[] src_ttl, byte[] trg_ttl) { - stmt.Clear().Val_str_by_bry_(src_lang).Val_str_by_bry_(src_ttl).Val_str_by_bry_(trg_ttl).Exec_insert(); + stmt.Clear().Val_bry_as_str(src_lang).Val_bry_as_str(src_ttl).Val_bry_as_str(trg_ttl).Exec_insert(); } - public int Select_pid(Db_provider p, byte[] src_lang, byte[] src_ttl) { + public int Select_pid(Db_conn p, byte[] src_lang, byte[] src_ttl) { Db_stmt stmt = Db_stmt_.Null; try { stmt = Db_stmt_.new_select_(p, Tbl_name, String_.Ary(Fld_wp_src_lang, Fld_wp_src_ttl), Fld_wp_trg_ttl); - String pid_str = (String)stmt.Val_str_by_bry_(src_lang).Val_str_by_bry_(src_ttl).Exec_select_val(); + String pid_str = (String)stmt.Val_bry_as_str(src_lang).Val_bry_as_str(src_ttl).Exec_select_val(); if (pid_str == null) return Wdata_wiki_mgr.Pid_null; // occurs when pid exists, but does not have entry for language; see hu.w:Marco Polo argali; DATE: 2014-02-01 byte[] pid_bry = Bry_.new_utf8_(pid_str); return pid_bry == null ? Wdata_wiki_mgr.Pid_null : Bry_.Xto_int_or(pid_bry, 1, pid_bry.length, Wdata_wiki_mgr.Pid_null); diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_wdata_qids_tbl.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_wdata_qids_tbl.java index 7c9c053f6..b6ff6a239 100644 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_wdata_qids_tbl.java +++ b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_wdata_qids_tbl.java @@ -18,16 +18,16 @@ along with this program. If not, see . package gplx.xowa.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*; import gplx.dbs.*; public class Xodb_wdata_qids_tbl { - public void Purge(Db_provider p) {p.Exec_qry(Db_qry_.delete_tbl_(Tbl_name));} - public Db_stmt Insert_stmt(Db_provider p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_wq_src_wiki, Fld_wq_src_ns, Fld_wq_src_ttl, Fld_wq_trg_ttl);} + public void Purge(Db_conn p) {p.Exec_qry(Db_qry_.delete_tbl_(Tbl_name));} + public Db_stmt Insert_stmt(Db_conn p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_wq_src_wiki, Fld_wq_src_ns, Fld_wq_src_ttl, Fld_wq_trg_ttl);} public void Insert(Db_stmt stmt, byte[] src_wiki, int src_ns, byte[] src_ttl, byte[] trg_ttl) { - stmt.Clear().Val_str_by_bry_(src_wiki).Val_int_(src_ns).Val_str_by_bry_(src_ttl).Val_str_by_bry_(trg_ttl).Exec_insert(); + stmt.Clear().Val_bry_as_str(src_wiki).Val_int(src_ns).Val_bry_as_str(src_ttl).Val_bry_as_str(trg_ttl).Exec_insert(); } - public byte[] Select_qid(Db_provider p, byte[] src_wiki, byte[] src_ns, byte[] src_ttl) { + public byte[] Select_qid(Db_conn p, byte[] src_wiki, byte[] src_ns, byte[] src_ttl) { Db_stmt stmt = Db_stmt_.Null; try { stmt = Db_stmt_.new_select_(p, Tbl_name, String_.Ary(Fld_wq_src_wiki, Fld_wq_src_ns, Fld_wq_src_ttl), Fld_wq_trg_ttl); - String rv = (String)stmt.Val_str_by_bry_(src_wiki).Val_int_(Bry_.Xto_int(src_ns)).Val_str_by_bry_(src_ttl).Exec_select_val(); + String rv = (String)stmt.Val_bry_as_str(src_wiki).Val_int(Bry_.Xto_int(src_ns)).Val_bry_as_str(src_ttl).Exec_select_val(); return rv == null ? null : Bry_.new_utf8_(rv); } finally {stmt.Rls();} } diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_xowa_cfg_tbl.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_xowa_cfg_tbl.java index eed5313a5..6d645ba73 100644 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_xowa_cfg_tbl.java +++ b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_xowa_cfg_tbl.java @@ -18,17 +18,17 @@ along with this program. If not, see . package gplx.xowa.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*; import gplx.dbs.*; public class Xodb_xowa_cfg_tbl { - public Db_provider Provider() {return provider;} public Xodb_xowa_cfg_tbl Provider_(Db_provider provider) {this.provider = provider; return this;} Db_provider provider; + public Db_conn Conn() {return conn;} public Xodb_xowa_cfg_tbl Conn_(Db_conn conn) {this.conn = conn; return this;} Db_conn conn; private DataRdr Select(String grp) { Db_qry qry = Db_qry_.select_cols_(Tbl_name, Db_crt_.eq_(Fld_cfg_grp, grp), Fld_cfg_key, Fld_cfg_val); - return provider.Exec_qry_as_rdr(qry); + return conn.Exec_qry_as_rdr(qry); } public long Select_val_as_long_or(String grp, String key, long or) {return Long_.parse_or_(Select_val(grp, key), or);} public int Select_val_as_int(String grp, String key) {return Int_.parse_(Select_val(grp, key));} public String Select_val(String grp, String key) {return Select_val_or(grp, key, null);} public String Select_val_or(String grp, String key, String or) { Db_qry_select qry = Db_qry_.select_val_(Tbl_name, Fld_cfg_val, Where_grp_key(grp, key)); - String rv = (String)qry.ExecRdr_val(provider); + String rv = (String)qry.ExecRdr_val(conn); return rv == null ? or : rv; } public String Select_val_or_make(String grp, String key, String or) { @@ -57,15 +57,15 @@ public class Xodb_xowa_cfg_tbl { public void Delete(String grp, String key) { Db_stmt stmt = Db_stmt_.Null; try { - stmt = Db_stmt_.new_delete_(provider, Tbl_name, String_.Ary(Fld_cfg_grp, Fld_cfg_key)); - stmt.Val_str_(grp).Val_str_(key).Exec_delete(); + stmt = Db_stmt_.new_delete_(conn, Tbl_name, String_.Ary(Fld_cfg_grp, Fld_cfg_key)); + stmt.Val_str(grp).Val_str(key).Exec_delete(); } finally {stmt.Rls();} } public void Insert_byte(String grp, String key, byte val) {Insert_str(grp, key, Byte_.Xto_str(val));} public void Insert_int(String grp, String key, int val) {Insert_str(grp, key, Int_.Xto_str(val));} - public void Insert_str_by_bry(String grp, String key, byte[] val) {Insert_str(grp, key, String_.new_utf8_(val));} - public void Insert_str(String grp, String key, String val) {Insert_str(provider, grp, key, val);} - public static void Insert_str(Db_provider p, String grp, String key, String val) { + public void Insert_bry_as_str(String grp, String key, byte[] val) {Insert_str(grp, key, String_.new_utf8_(val));} + public void Insert_str(String grp, String key, String val) {Insert_str(conn, grp, key, val);} + public static void Insert_str(Db_conn p, String grp, String key, String val) { Db_qry qry = Db_qry_.insert_(Tbl_name) .Arg_(Fld_cfg_grp , grp) .Arg_(Fld_cfg_key , key) @@ -73,25 +73,25 @@ public class Xodb_xowa_cfg_tbl { ; p.Exec_qry(qry); } - public Db_stmt Update_stmt() {return Db_stmt_.new_update_(provider, Tbl_name, String_.Ary(Fld_cfg_grp, Fld_cfg_key), Fld_cfg_val);} + public Db_stmt Update_stmt() {return Db_stmt_.new_update_(conn, Tbl_name, String_.Ary(Fld_cfg_grp, Fld_cfg_key), Fld_cfg_val);} public void Update(Db_stmt stmt, String grp, String key, long val) {Update(stmt, grp, key, Long_.Xto_str(val));} public void Update(Db_stmt stmt, String grp, String key, int val) {Update(stmt, grp, key, Int_.Xto_str(val));} public void Update(Db_stmt stmt, String grp, String key, String val) { stmt.Clear() - .Val_str_(val) - .Val_str_(grp) - .Val_str_(key) + .Val_str(val) + .Val_str(grp) + .Val_str(key) .Exec_update(); } public void Update(String grp, String key, int val) {Update(grp, key, Int_.Xto_str(val));} public void Update(String grp, String key, String val) { Db_qry qry = Db_qry_.update_common_(Tbl_name, Where_grp_key(grp, key), KeyVal_.new_(Fld_cfg_val, val)); - provider.Exec_qry(qry); + conn.Exec_qry(qry); } private gplx.criterias.Criteria Where_grp_key(String grp, String key) {return Db_crt_.eqMany_(KeyVal_.new_(Fld_cfg_grp, grp), KeyVal_.new_(Fld_cfg_key, key));} public static final String Tbl_name = "xowa_cfg", Fld_cfg_grp = "cfg_grp", Fld_cfg_key = "cfg_key", Fld_cfg_val = "cfg_val"; - public static void Create_table(Db_provider p) {Sqlite_engine_.Tbl_create(p, Tbl_name, Tbl_sql);} - public static void Create_index(Db_provider p) {Sqlite_engine_.Idx_create(p, Idx_select);} + public static void Create_table(Db_conn p) {Sqlite_engine_.Tbl_create(p, Tbl_name, Tbl_sql);} + public static void Create_index(Db_conn p) {Sqlite_engine_.Idx_create(p, Idx_select);} private static final String Tbl_sql = String_.Concat_lines_nl ( "CREATE TABLE IF NOT EXISTS xowa_cfg" , "( cfg_grp varchar(1024) NOT NULL" diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_xowa_db_tbl.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_xowa_db_tbl.java index f948e035f..062202a8b 100644 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_xowa_db_tbl.java +++ b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_xowa_db_tbl.java @@ -18,21 +18,21 @@ along with this program. If not, see . package gplx.xowa.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*; import gplx.dbs.*; public class Xodb_xowa_db_tbl { - public void Provider_(Db_provider provider) {this.provider = provider;} Db_provider provider; - public void Update_url(Db_provider provider, int db_id, String db_url) { + public void Conn_(Db_conn conn) {this.conn = conn;} Db_conn conn; + public void Update_url(Db_conn conn, int db_id, String db_url) { Db_stmt stmt = Db_stmt_.Null; try { - stmt = Db_stmt_.new_update_(provider, Tbl_name, String_.Ary(Fld_db_id), Fld_db_url); + stmt = Db_stmt_.new_update_(conn, Tbl_name, String_.Ary(Fld_db_id), Fld_db_url); stmt.Clear() - .Val_str_(db_url) - .Val_int_(db_id) + .Val_str(db_url) + .Val_int(db_id) .Exec_update(); ; } finally {stmt.Rls();} } - public void Commit_all(Xodb_fsys_mgr db_fs) {this.Commit_all(db_fs.Provider_core(), db_fs.Files_ary());} - public void Commit_all(Db_provider provider, Xodb_file[] ary) { - stmt_bldr.Init(provider); + public void Commit_all(Xodb_fsys_mgr db_fs) {this.Commit_all(db_fs.Conn_core(), db_fs.Files_ary());} + public void Commit_all(Db_conn conn, Xodb_file[] ary) { + stmt_bldr.Init(conn); try { int len = ary.length; for (int i = 0; i < len; i++) @@ -43,20 +43,20 @@ public class Xodb_xowa_db_tbl { private void Commit_itm(Xodb_file itm) { Db_stmt stmt = stmt_bldr.Get(itm.Cmd_mode()); switch (itm.Cmd_mode()) { - case Db_cmd_mode.Create: stmt.Clear().Val_int_(itm.Id()) .Val_byte_(itm.Tid()).Val_str_(itm.Url_rel()).Exec_insert(); break; - case Db_cmd_mode.Update: stmt.Clear() .Val_byte_(itm.Tid()).Val_str_(itm.Url_rel()).Val_int_(itm.Id()).Exec_update(); break; - case Db_cmd_mode.Delete: stmt.Clear().Val_int_(itm.Id()).Exec_delete(); break; + case Db_cmd_mode.Create: stmt.Clear().Val_int(itm.Id()) .Val_byte(itm.Tid()).Val_str(itm.Url_rel()).Exec_insert(); break; + case Db_cmd_mode.Update: stmt.Clear() .Val_byte(itm.Tid()).Val_str(itm.Url_rel()).Val_int(itm.Id()).Exec_update(); break; + case Db_cmd_mode.Delete: stmt.Clear().Val_int(itm.Id()).Exec_delete(); break; case Db_cmd_mode.Ignore: break; default: throw Err_.unhandled(itm.Cmd_mode()); } itm.Cmd_mode_(Db_cmd_mode.Ignore); } - public Xodb_file[] Select_all(Db_provider provider) { + public Xodb_file[] Select_all(Db_conn conn) { DataRdr rdr = DataRdr_.Null; ListAdp list = ListAdp_.new_(); try { Db_qry qry = Db_qry_.select_tbl_(Tbl_name).OrderBy_asc_(Fld_db_id); - rdr = provider.Exec_qry_as_rdr(qry); + rdr = conn.Exec_qry_as_rdr(qry); while (rdr.MoveNextPeer()) { Xodb_file db = Xodb_file.load_(rdr.ReadInt(Fld_db_id), rdr.ReadByte(Fld_db_type), rdr.ReadStr(Fld_db_url)); list.Add(db); diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_xowa_ns_tbl.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_xowa_ns_tbl.java index e1be40c04..1130607b5 100644 --- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_xowa_ns_tbl.java +++ b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_xowa_ns_tbl.java @@ -18,20 +18,20 @@ along with this program. If not, see . package gplx.xowa.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*; import gplx.dbs.*; public class Xodb_xowa_ns_tbl { - public void Provider_(Db_provider provider) {this.provider = provider;} private Db_provider provider; + public void Conn_(Db_conn conn) {this.conn = conn;} private Db_conn conn; public void Insert(Xow_ns_mgr ns_mgr) { Db_stmt stmt = Db_stmt_.Null; try { - stmt = Db_stmt_.new_insert_(provider, Tbl_name, Fld_ns_id, Fld_ns_name, Fld_ns_case, Fld_ns_is_alias, Fld_ns_count); + stmt = Db_stmt_.new_insert_(conn, Tbl_name, Fld_ns_id, Fld_ns_name, Fld_ns_case, Fld_ns_is_alias, Fld_ns_count); int len = ns_mgr.Ids_len(); for (int i = 0; i < len; i++) { Xow_ns ns = ns_mgr.Ids_get_at(i); stmt.Clear() - .Val_int_(ns.Id()) - .Val_str_(ns.Name_str()) - .Val_byte_(ns.Case_match()) - .Val_bool_(ns.Is_alias()) - .Val_int_(ns.Count()) + .Val_int(ns.Id()) + .Val_str(ns.Name_str()) + .Val_byte(ns.Case_match()) + .Val_bool_as_byte(ns.Is_alias()) + .Val_int(ns.Count()) .Exec_insert(); ; } @@ -40,7 +40,7 @@ public class Xodb_xowa_ns_tbl { public void Select_all(Xow_ns_mgr ns_mgr) { Db_rdr rdr = Db_rdr_.Null; Db_stmt stmt = Db_stmt_.Null; try { - stmt = Db_stmt_.new_select_as_rdr(provider, Db_qry__select_in_tbl.new_(Tbl_name, Db_qry__select_in_tbl.Where_flds__all, Flds__all)); + stmt = Db_stmt_.new_select_as_rdr(conn, Db_qry__select_in_tbl.new_(Tbl_name, Db_qry__select_in_tbl.Where_flds__all, Flds__all)); rdr = stmt.Exec_select_as_rdr(); ns_mgr.Clear(); while (rdr.Move_next()) { @@ -56,14 +56,14 @@ public class Xodb_xowa_ns_tbl { if (ns_count > 0) ns.Exists_(true); // ns has article; mark it as exists, else Talk tab won't show; DATE:2013-12-04 } ns_mgr.Init(); - } finally {rdr.Close(); stmt.Rls();} + } finally {rdr.Rls(); stmt.Rls();} } public int Select_ns_count(int ns_id) { Db_qry_select qry = Db_qry_.select_val_(Tbl_name, Fld_ns_count, Db_crt_.eq_(Fld_ns_id, ns_id)); - return Int_.cast_(qry.ExecRdr_val(provider)); + return Int_.cast_(qry.ExecRdr_val(conn)); } public void Update_ns_count(int ns_id, int ns_count) { - provider.Exec_qry(Db_qry_.update_common_(Tbl_name + conn.Exec_qry(Db_qry_.update_common_(Tbl_name , Db_crt_.eq_(Fld_ns_id, ns_id) , KeyVal_.Ary ( KeyVal_.new_(Fld_ns_count, ns_count) diff --git a/400_xowa/src/gplx/xowa/files/Xof_doc_page.java b/400_xowa/src/gplx/xowa/files/Xof_doc_page.java index 694213808..226c42e8b 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_doc_page.java +++ b/400_xowa/src/gplx/xowa/files/Xof_doc_page.java @@ -16,10 +16,12 @@ 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.*; +import gplx.dbs.*; public class Xof_doc_page { public static final int Null = -1; public static boolean Null_y(int v) {return v == Null;} public static boolean Null_n(int v) {return v != Null;} - public static int Db_load_int(DataRdr rdr, String fld) {return rdr.ReadInt(fld);} + public static int Db_load_int(DataRdr rdr, String fld) {return rdr.ReadInt(fld);} + public static int Db_load_int(Db_rdr rdr, int ord) {return rdr.Read_int(ord);} public static int Db_save_int(int v) {return v;} } diff --git a/400_xowa/src/gplx/xowa/files/Xof_doc_thumb.java b/400_xowa/src/gplx/xowa/files/Xof_doc_thumb.java index 26e6e2b06..79e15ca26 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_doc_thumb.java +++ b/400_xowa/src/gplx/xowa/files/Xof_doc_thumb.java @@ -16,11 +16,13 @@ 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.*; +import gplx.dbs.*; public class Xof_doc_thumb { public static double Db_save_double(double v) {return v;} public static double Db_load_double(DataRdr rdr, String fld) {return rdr.ReadDouble(fld);} public static int Db_save_int(double v) {return (int)v;} - public static double Db_load_int(DataRdr rdr, String fld) {return rdr.ReadInt(fld);} + public static double Db_load_int(DataRdr rdr, String fld) {return rdr.ReadInt(fld);} + public static double Db_load_int(Db_rdr rdr, int ord) {return rdr.Read_int(ord);} public static int X_int(double v) {return (int)v;} public static String X_str(double v) {return Double_.Xto_str(v);} public static final double Null = -1; diff --git a/400_xowa/src/gplx/xowa/files/Xof_lnki_file_mgr.java b/400_xowa/src/gplx/xowa/files/Xof_lnki_file_mgr.java index c2049ac75..bcfec626a 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_lnki_file_mgr.java +++ b/400_xowa/src/gplx/xowa/files/Xof_lnki_file_mgr.java @@ -92,7 +92,7 @@ public class Xof_lnki_file_mgr { } } private void Hash_xfer_itms_add(byte[] key, Xof_fsdb_itm itm) { - if ( Bry_.Len_gt_0(key) // ignore null / empty itms; needed for redirects + if ( Bry_.Len_gt_0(key) // ignore null / empty itms; needed for redirects && !xfer_list.Has(key) // don't add if already there && orig_regy.Has(key) // add if found in orig_regy ) diff --git a/400_xowa/src/gplx/xowa/files/Xof_url_bldr.java b/400_xowa/src/gplx/xowa/files/Xof_url_bldr.java index 4bbc9b1b9..90d2cb012 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_url_bldr.java +++ b/400_xowa/src/gplx/xowa/files/Xof_url_bldr.java @@ -35,24 +35,42 @@ public class Xof_url_bldr { return this; } public Xof_url_bldr Init_for_src_file(byte mode, Xof_repo_itm repo, byte[] ttl, byte[] md5, Xof_ext ext, int file_w, double time, int page) { - this.wmf_dir_hive = Bool_.Y; this.file_is_thumb = mode == Xof_repo_itm.Mode_thumb; - this.dir_spr = repo.Dir_spr(); this.root = repo.Root(); this.ttl = repo.Gen_name_src(ttl); this.area = repo.Mode_names()[mode]; - this.md5 = md5; this.ext = ext; this.file_w = file_w; this.time = time; this.page = page; - this.wmf_protocol_is_file = repo.Tarball(); + this.wmf_dir_hive = Bool_.Y; this.wmf_protocol_is_file = repo.Tarball(); + this.dir_spr = repo.Dir_spr(); this.root = repo.Root(); this.area = repo.Mode_names()[mode]; + this.ttl = repo.Gen_name_src(ttl); this.md5 = md5; this.ext = ext; + this.file_is_thumb = mode == Xof_repo_itm.Mode_thumb; this.file_w = file_w; this.time = time; this.page = page; return this; } +// public Xof_url_bldr Init_for_trg_file(byte mode, Xof_repo_itm repo, byte[] ttl, byte[] md5, Xof_ext ext, int file_w, double time, int page) { +// this.dir_spr = repo.Dir_spr(); this.root = repo.Root(); this.wmf_dir_hive = Bool_.N; +// this.area = repo.Mode_names()[mode]; this.md5_dir_depth = repo.Dir_depth(); +// this.ttl = repo.Gen_name_trg(ttl, md5, ext); this.md5 = md5; this.ext = ext; +// this.file_is_thumb = mode == Xof_repo_itm.Mode_thumb; this.file_w = file_w; this.time = time; this.page = page; +// return this; +// } +// public Xof_url_bldr Init_for_trg_html(byte mode, Xof_repo_itm repo, byte[] ttl, byte[] md5, Xof_ext ext, int file_w, double time, int page) { +// this.dir_spr = Byte_ascii.Slash; this.root = repo.Root_http(); this.wmf_dir_hive = Bool_.N; +// this.area = repo.Mode_names()[mode]; this.md5_dir_depth = repo.Dir_depth(); +// this.ttl = repo.Gen_name_trg(ttl, md5, ext); this.md5 = md5; this.ext = ext; +// this.file_is_thumb = mode == Xof_repo_itm.Mode_thumb; this.file_w = file_w; this.time = time; this.page = page; +// return this; +// } public Xof_url_bldr Init_for_trg_file(byte mode, Xof_repo_itm repo, byte[] ttl, byte[] md5, Xof_ext ext, int file_w, double time, int page) { - this.wmf_dir_hive = Bool_.N; this.file_is_thumb = mode == Xof_repo_itm.Mode_thumb; - this.dir_spr = repo.Dir_spr(); this.root = repo.Root(); this.ttl = repo.Gen_name_trg(ttl, md5, ext); this.area = repo.Mode_names()[mode]; - this.md5 = md5; this.ext = ext; this.file_w = file_w; this.time = time; this.page = page; - this.md5_dir_depth = repo.Dir_depth(); - return this; + return Init(Bool_.N, Bool_.N, repo.Dir_spr(), repo.Root() + , repo.Mode_names()[mode], repo.Dir_depth(), repo.Gen_name_trg(ttl, md5, ext), md5, ext, mode, file_w, time, page); } public Xof_url_bldr Init_for_trg_html(byte mode, Xof_repo_itm repo, byte[] ttl, byte[] md5, Xof_ext ext, int file_w, double time, int page) { - this.wmf_dir_hive = Bool_.N; this.file_is_thumb = mode == Xof_repo_itm.Mode_thumb; - this.dir_spr = Byte_ascii.Slash; this.root = repo.Root_http(); this.ttl = repo.Gen_name_trg(ttl, md5, ext); this.area = repo.Mode_names()[mode]; - this.md5 = md5; this.ext = ext; this.file_w = file_w; this.time = time; this.page = page; - this.md5_dir_depth = repo.Dir_depth(); + return Init(Bool_.N, Bool_.N, Byte_ascii.Slash, repo.Root_http() + , repo.Mode_names()[mode], repo.Dir_depth(), repo.Gen_name_trg(ttl, md5, ext), md5, ext, mode, file_w, time, page); + } + public Xof_url_bldr Init(boolean wmf_dir_hive, boolean wmf_protocol_is_file, byte dir_spr + , byte[] root, byte[] area, int md5_dir_depth + , byte[] ttl, byte[] md5, Xof_ext ext + , byte file_mode, int file_w, double time, int page) { + this.wmf_dir_hive = wmf_dir_hive; this.wmf_protocol_is_file = wmf_protocol_is_file; this.dir_spr = dir_spr; + this.root = root; this.area = area; this.md5_dir_depth = md5_dir_depth; + this.ttl = ttl; this.md5 = md5; this.ext = ext; + this.file_is_thumb = file_mode == Xof_repo_itm.Mode_thumb; this.file_w = file_w; this.time = time; this.page = page; return this; } public byte[] Xto_bry() {Bld(); byte[] rv = bfr.Xto_bry_and_clear(); Clear(); return rv;} @@ -181,4 +199,5 @@ public class Xof_url_bldr { rv.time_dlm = Byte_ascii.Dash; return rv; } + public static final int Md5_dir_depth_2 = 2; } diff --git a/400_xowa/src/gplx/xowa/files/Xof_url_bldr_tst.java b/400_xowa/src/gplx/xowa/files/Xof_url_bldr_tst.java index 821630b0d..9327695bb 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_url_bldr_tst.java +++ b/400_xowa/src/gplx/xowa/files/Xof_url_bldr_tst.java @@ -28,6 +28,7 @@ public class Xof_url_bldr_tst { @Test public void Pdf_page_2() {fxt.Dir_spr_http_().Root_("http://test/").Md5_("ef").Ttl_("A.pdf").Page_(2).Expd_src_("http://test/thumb/e/ef/A.pdf/page2-0px-A.pdf.jpg").tst();} } class Xof_url_bldr_fxt { + private final Xof_url_bldr url_bldr = new Xof_url_bldr(); public Xof_url_bldr_fxt ini() {this.Clear(); return this;} public Xof_url_bldr_fxt Dir_spr_http_() {return Dir_spr_(Byte_ascii.Slash);} public Xof_url_bldr_fxt Dir_spr_fsys_wnt_() {return Dir_spr_(Byte_ascii.Backslash);} @@ -38,7 +39,6 @@ class Xof_url_bldr_fxt { public Xof_url_bldr_fxt Page_(int v) {page = v; return this;} private int page = Xof_doc_page.Null; public Xof_url_bldr_fxt Seek_(int v) {seek = v; return this;} private double seek = Xof_doc_thumb.Null; public Xof_url_bldr_fxt Expd_src_(String v) {expd_src = v; return this;} private String expd_src; - Xof_url_bldr url_bldr = new Xof_url_bldr(); private void Clear() { dir_spr = Byte_.Zero; ext = null; root = md5 = ttl = expd_src = null; seek = Xof_doc_thumb.Null; 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 90319c0c6..a415e5e5d 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_xfer_itm.java +++ b/400_xowa/src/gplx/xowa/files/Xof_xfer_itm.java @@ -55,10 +55,11 @@ public class Xof_xfer_itm implements Xof_file_itm { public byte[] Trg_repo_root() {return trg_repo_root;} private byte[] trg_repo_root = Bry_.Empty; // HACK: needed for hdump private byte[] Trg_html(byte mode_id, int width) {return url_bldr.Init_for_trg_html(mode_id, trg_repo, lnki_ttl, lnki_md5, lnki_ext, width, lnki_thumbtime, lnki_page).Xto_bry();} public Io_url Trg_file(byte mode_id, int width) {return url_bldr.Init_for_trg_file(mode_id, trg_repo, lnki_ttl, lnki_md5, lnki_ext, width, lnki_thumbtime, lnki_page).Xto_url();} + public byte Lnki_exec_tid() {return lnki_exec_tid;} public void Lnki_exec_tid_(byte v) {lnki_exec_tid = v;} private byte lnki_exec_tid = Xof_exec_tid.Tid_wiki_page; public Xof_url_bldr Url_bldr(){ return url_bldr;} public Xof_xfer_itm Url_bldr_(Xof_url_bldr v) {url_bldr = v; return this;} private Xof_url_bldr url_bldr = Xof_url_bldr.Temp; public Xof_xfer_itm Clear() { - lnki_type = Byte_.MaxValue_127; + lnki_type = Byte_.Max_value_127; lnki_w = lnki_h = file_w = orig_w = orig_h = html_w = html_h = gallery_mgr_h = Int_.Neg1; lnki_upright = Int_.Neg1; lnki_thumbtime = Xof_doc_thumb.Null; lnki_page = Xof_doc_page.Null; img_is_thumbable = false; 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 5e512a852..caba4a88e 100644 --- a/400_xowa/src/gplx/xowa/files/Xow_file_mgr.java +++ b/400_xowa/src/gplx/xowa/files/Xow_file_mgr.java @@ -16,7 +16,8 @@ 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.*; -import gplx.fsdb.*; import gplx.xowa.files.fsdb.*; +import gplx.dbs.*; import gplx.fsdb.*; import gplx.xowa.files.fsdb.*; +import gplx.xowa2.files.metas.*; public class Xow_file_mgr implements GfoInvkAble { private Xof_wkr_mgr wkr_mgr; public Xow_file_mgr(Xow_wiki wiki) { @@ -25,8 +26,12 @@ public class Xow_file_mgr implements GfoInvkAble { meta_mgr = new Xof_meta_mgr(wiki); fsdb_mgr = new Xof_fsdb_mgr_sql(wiki); wkr_mgr = new Xof_wkr_mgr(this); + Xof_file_meta_wkr__db_orig file_meta_wkr_as_db_orig = new Xof_file_meta_wkr__db_orig(); + file_meta_wkr_as_db_orig.Tbl().Conn_(Db_conn_pool.I.Get_or_new__sqlite(wiki.Fsys_mgr().File_dir().GenSubFil_nest("wiki.orig#00.sqlite3"))); + file_meta_wkr = file_meta_wkr_as_db_orig; } public Xow_wiki Wiki() {return wiki;} private Xow_wiki wiki; + public Xof_file_meta_wkr File_meta_wkr() {return file_meta_wkr;} public void File_meta_wkr_(Xof_file_meta_wkr v) {file_meta_wkr = v;} private Xof_file_meta_wkr file_meta_wkr; public byte Version() { if (version == Bool_.__byte) { Io_url file_dir = wiki.Fsys_mgr().File_dir(); @@ -52,7 +57,7 @@ public class Xow_file_mgr implements GfoInvkAble { : fsdb_mgr.Patch_upright() ; } - public static final byte Version_null = Byte_.MaxValue_127, Version_1 = 1, Version_2 = 2; + public static final byte Version_null = Byte_.Max_value_127, Version_1 = 1, Version_2 = 2; public Xow_repo_mgr Repo_mgr() {return repo_mgr;} private Xow_repo_mgr repo_mgr; public Xof_meta_mgr Meta_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(); diff --git a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr.java b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr.java index 46f558708..2d615a275 100644 --- a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr.java +++ b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr.java @@ -22,4 +22,5 @@ public interface Xof_bin_wkr extends GfoInvkAble { boolean Bin_wkr_resize(); void Bin_wkr_resize_(boolean v); gplx.ios.Io_stream_rdr Bin_wkr_get_as_rdr(ListAdp temp_files, Xof_fsdb_itm itm, boolean is_thumb, int w); boolean Bin_wkr_get_to_url(ListAdp temp_files, Xof_fsdb_itm itm, boolean is_thumb, int w, Io_url bin_url); + boolean Save_to_url(byte[] orig_repo, byte[] orig_ttl, byte[] orig_md5, Xof_ext orig_ext, boolean lnki_is_thumb, int file_w, double lnki_time, int lnki_page, Io_url file_url); } diff --git a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr_.java b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr_.java index 88c46c134..9481b695b 100644 --- a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr_.java +++ b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr_.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.files.bins; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; public class Xof_bin_wkr_ { public static final Xof_bin_wkr[] Ary_empty = new Xof_bin_wkr[0]; - public static final byte Tid_null = Byte_.MaxValue_127, Tid_noop = 1, Tid_not_found = 2 + public static final byte Tid_null = Byte_.Max_value_127, Tid_noop = 1, Tid_not_found = 2 , Tid_fsdb_wiki = 3, Tid_fsdb_regy = 4 , Tid_http_wmf = 5 , Tid_fsys_wmf = 6, Tid_fsys_xowa = 7 diff --git a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr_fsdb_regy.java b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr_fsdb_regy.java index 5b16d7dd7..75fa0bfca 100644 --- a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr_fsdb_regy.java +++ b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr_fsdb_regy.java @@ -19,7 +19,7 @@ package gplx.xowa.files.bins; import gplx.*; import gplx.xowa.*; import gplx.xow import gplx.ios.*; import gplx.xowa.files.fsdb.*; import gplx.dbs.*; public class Xof_bin_wkr_fsdb_regy implements Xof_bin_wkr { - private Io_url regy_url; private Db_provider provider; + private Io_url regy_url; private Db_conn conn; public Xof_bin_wkr_fsdb_regy() { } public boolean Bin_wkr_resize() {return bin_wkr_resize;} public void Bin_wkr_resize_(boolean v) {bin_wkr_resize = v;} private boolean bin_wkr_resize = false; @@ -27,10 +27,10 @@ public class Xof_bin_wkr_fsdb_regy implements Xof_bin_wkr { public void Init_by_wiki(Xow_wiki wiki) { if (regy_url == null) regy_url = wiki.App().Fsys_mgr().File_dir().GenSubFil("xowa.fsdb_regy.sqlite3"); if (!Io_mgr._.ExistsFil(regy_url)) throw Err_.new_fmt_("fsdb_regy does not exist: url={0}", regy_url.Raw()); - provider = Sqlite_engine_.Provider_load_or_make_(regy_url); + conn = Sqlite_engine_.Conn_load_or_make_(regy_url); } public void Rls() { - provider.Conn_term(); + conn.Conn_term(); } public Io_stream_rdr Bin_wkr_get_as_rdr(ListAdp temp_files, Xof_fsdb_itm itm, boolean is_thumb, int w) { return null; @@ -38,6 +38,7 @@ public class Xof_bin_wkr_fsdb_regy implements Xof_bin_wkr { public boolean Bin_wkr_get_to_url(ListAdp temp_files, Xof_fsdb_itm itm, boolean is_thumb, int w, Io_url bin_url) { return true; } + public boolean Save_to_url(byte[] orig_repo, byte[] orig_ttl, byte[] orig_md5, Xof_ext orig_ext, boolean lnki_is_thumb, int file_w, double lnki_time, int lnki_page, Io_url file_url) {return true;} public void Bin_wkr_get(Xof_fsdb_itm itm, boolean is_thumb, int w, Io_url bin_url) { // get entry; if not exists return null; // if exists, open up bin_db diff --git a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr_fsdb_sql.java b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr_fsdb_sql.java index 2c4045fc4..8c4b10b3d 100644 --- a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr_fsdb_sql.java +++ b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr_fsdb_sql.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.files.bins; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; -import gplx.dbs.*; import gplx.cache.*; import gplx.fsdb.*; import gplx.xowa.files.fsdb.*; +import gplx.dbs.*; import gplx.ios.*; import gplx.cache.*; import gplx.fsdb.*; import gplx.xowa.files.fsdb.*; public class Xof_bin_wkr_fsdb_sql implements Xof_bin_wkr, GfoInvkAble { private byte[] bin_bfr; private int bin_flush_when = Io_mgr.Len_mb; private Int_obj_ref tmp_itm_id = Int_obj_ref.neg1_(), tmp_bin_db_id = Int_obj_ref.neg1_(), tmp_mnt_id = Int_obj_ref.neg1_(); @@ -25,25 +25,31 @@ public class Xof_bin_wkr_fsdb_sql implements Xof_bin_wkr, GfoInvkAble { public byte Bin_wkr_tid() {return Xof_bin_wkr_.Tid_fsdb_wiki;} public boolean Bin_wkr_resize() {return bin_wkr_resize;} public void Bin_wkr_resize_(boolean v) {bin_wkr_resize = v;} private boolean bin_wkr_resize = false; public int Bin_bfr_len() {return bin_bfr_len;} public Xof_bin_wkr_fsdb_sql Bin_bfr_len_(int v) {bin_bfr_len = v; return this;} private int bin_bfr_len = 32; - public gplx.ios.Io_stream_rdr Bin_wkr_get_as_rdr(ListAdp temp_files, Xof_fsdb_itm itm, boolean is_thumb, int w) { + public Io_stream_rdr Bin_wkr_get_as_rdr(ListAdp temp_files, Xof_fsdb_itm itm, boolean is_thumb, int w) { Bin_wkr_get_ids(itm, is_thumb, w, tmp_itm_id, tmp_bin_db_id, tmp_mnt_id); int bin_db_id = tmp_bin_db_id.Val(); if (bin_db_id == Fsdb_bin_tbl.Null_db_bin_id) return gplx.ios.Io_stream_rdr_.Null; Fsdb_db_bin_fil bin_db = fsdb_mgr.Bin_db_get(tmp_mnt_id.Val(), bin_db_id); return bin_db.Get_as_rdr(tmp_itm_id.Val()); } public boolean Bin_wkr_get_to_url(ListAdp temp_files, Xof_fsdb_itm itm, boolean is_thumb, int w, Io_url bin_url) { + return Save_to_url(itm.Orig_wiki(), itm.Lnki_ttl(), itm.Lnki_md5(), itm.Lnki_ext(), is_thumb, w, itm.Lnki_thumbtime(), itm.Lnki_page(), bin_url); + } + public boolean Save_to_url(byte[] orig_repo, byte[] orig_ttl, byte[] orig_md5, Xof_ext orig_ext, boolean lnki_is_thumb, int file_w, double lnki_time, int lnki_page, Io_url file_url) { if (bin_bfr == null) bin_bfr = new byte[bin_bfr_len]; - Bin_wkr_get_ids(itm, is_thumb, w, tmp_itm_id, tmp_bin_db_id, tmp_mnt_id); + Bin_wkr_get_ids(orig_repo, orig_ttl, orig_ext.Id(), lnki_time, lnki_page, lnki_is_thumb, file_w, tmp_itm_id, tmp_bin_db_id, tmp_mnt_id); int bin_db_id = tmp_bin_db_id.Val(); if (bin_db_id == Fsdb_bin_tbl.Null_db_bin_id) return false; Fsdb_db_bin_fil bin_db = fsdb_mgr.Bin_db_get(tmp_mnt_id.Val(), bin_db_id); - return bin_db.Get_to_url(tmp_itm_id.Val(), bin_url, bin_bfr, bin_flush_when); + return bin_db.Get_to_url(tmp_itm_id.Val(), file_url, bin_bfr, bin_flush_when); } private void Bin_wkr_get_ids(Xof_fsdb_itm itm, boolean is_thumb, int w, Int_obj_ref tmp_itm_id, Int_obj_ref tmp_bin_db_id, Int_obj_ref tmp_mnt_id) { - byte[] dir = itm.Orig_wiki(), fil = itm.Lnki_ttl(); - double thumbtime = Xof_doc_thumb.Convert_to_fsdb_thumbtime(itm.Lnki_ext().Id(), itm.Lnki_thumbtime(), itm.Lnki_page()); + Bin_wkr_get_ids(itm.Orig_wiki(), itm.Lnki_ttl(), itm.Lnki_ext().Id(), itm.Lnki_thumbtime(), itm.Lnki_page(), is_thumb, w, tmp_itm_id, tmp_bin_db_id, tmp_mnt_id); + } + private void Bin_wkr_get_ids(byte[] orig_repo, byte[] orig_ttl, int orig_ext, double lnki_time, int lnki_page, boolean is_thumb, int w, Int_obj_ref tmp_itm_id, Int_obj_ref tmp_bin_db_id, Int_obj_ref tmp_mnt_id) { + byte[] dir = orig_repo, fil = orig_ttl; + double thumbtime = Xof_doc_thumb.Convert_to_fsdb_thumbtime(orig_ext, lnki_time, lnki_page); if (is_thumb) { Fsdb_xtn_thm_itm thm_itm = Fsdb_xtn_thm_itm.load_(); - Init_thm(itm, thm_itm, w); + Init_thm(orig_ext, w, lnki_time, lnki_page, thm_itm); boolean found = fsdb_mgr.Thm_select_bin(dir, fil, thm_itm); tmp_itm_id.Val_(thm_itm.Id()); tmp_bin_db_id.Val_(found ? thm_itm.Db_bin_id() : Fsdb_bin_tbl.Null_db_bin_id); @@ -56,17 +62,17 @@ public class Xof_bin_wkr_fsdb_sql implements Xof_bin_wkr, GfoInvkAble { tmp_mnt_id.Val_(fil_itm.Mnt_id()); } } + private void Init_thm(int src_ext_id, int src_w, double src_time, int src_page, Fsdb_xtn_thm_itm trg) { + trg.Owner().Ext_id_(src_ext_id); + trg.Width_(src_w); + trg.Thumbtime_(src_time); + trg.Page_(src_page); + } public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_db_dir_)) fsdb_mgr.Db_dir_(m.ReadIoUrl("v")); else if (ctx.Match(k, Invk_url_)) fsdb_mgr.Db_dir_(m.ReadIoUrl("v")); else return GfoInvkAble_.Rv_unhandled; return this; } private static final String Invk_db_dir_ = "db_dir_", Invk_url_ = "url_"; - private void Init_thm(Xof_fsdb_itm src, Fsdb_xtn_thm_itm trg, int w) { - trg.Owner().Ext_id_(src.Lnki_ext().Id()); - trg.Width_(w); - trg.Thumbtime_(src.Lnki_thumbtime()); - trg.Page_(src.Lnki_page()); - } } diff --git a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr_fsys_base.java b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr_fsys_base.java index 769ab0182..6731c9bf6 100644 --- a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr_fsys_base.java +++ b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr_fsys_base.java @@ -27,8 +27,11 @@ public abstract class Xof_bin_wkr_fsys_base implements Xof_bin_wkr, GfoInvkAble return (src_url == Io_url_.Null) ? gplx.ios.Io_stream_rdr_.Null : gplx.ios.Io_stream_rdr_.file_(src_url); } public boolean Bin_wkr_get_to_url(ListAdp temp_files, Xof_fsdb_itm itm, boolean is_thumb, int w, Io_url bin_url) { - byte mode = is_thumb ? Xof_repo_itm.Mode_thumb : Xof_repo_itm.Mode_orig; - Io_url src_url = this.Get_src_url(mode, String_.new_utf8_(itm.Orig_wiki()), itm.Lnki_ttl(), itm.Lnki_md5(), itm.Lnki_ext(), w, itm.Lnki_thumbtime(), itm.Lnki_page()); + return Save_to_url(itm.Orig_wiki(), itm.Lnki_ttl(), itm.Lnki_md5(), itm.Lnki_ext(), is_thumb, w, itm.Lnki_thumbtime(), itm.Lnki_page(), bin_url); + } + public boolean Save_to_url(byte[] orig_repo, byte[] orig_ttl, byte[] orig_md5, Xof_ext orig_ext, boolean lnki_is_thumb, int file_w, double lnki_time, int lnki_page, Io_url file_url) { + byte mode = lnki_is_thumb ? Xof_repo_itm.Mode_thumb : Xof_repo_itm.Mode_orig; + Io_url src_url = this.Get_src_url(mode, String_.new_utf8_(orig_repo), orig_ttl, orig_md5, orig_ext, file_w, lnki_time, lnki_page); if (src_url == Io_url_.Null) return false; byte[] bin = Io_mgr._.LoadFilBry(src_url); return bin != Io_mgr.LoadFilBry_fail; diff --git a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr_http_wmf.java b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr_http_wmf.java index 7f92664c1..c9654d65f 100644 --- a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr_http_wmf.java +++ b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr_http_wmf.java @@ -27,14 +27,17 @@ public class Xof_bin_wkr_http_wmf implements Xof_bin_wkr { } public byte Bin_wkr_tid() {return Xof_bin_wkr_.Tid_http_wmf;} public Io_stream_rdr Bin_wkr_get_as_rdr(ListAdp temp_files, Xof_fsdb_itm itm, boolean is_thumb, int w) { - Bin_wkr_get(itm, is_thumb, w, Io_url_.Null); + Bin_wkr_get(itm.Orig_wiki(), itm.Lnki_ttl(), itm.Lnki_md5(), itm.Lnki_ext(), is_thumb, w, itm.Lnki_thumbtime(), itm.Lnki_page(), Io_url_.Null); Io_stream_rdr rdr = download.Exec_as_rdr(); boolean rv = rdr.Len() != IoItmFil.Size_Invalid; // NOTE: use IoItmFil.Size_Invalid, not Io_stream_rdr_.Read_done; DATE:2014-06-21 if (!rv) Handle_error(); return rv ? rdr : Io_stream_rdr_.Null; } public boolean Bin_wkr_get_to_url(ListAdp temp_files, Xof_fsdb_itm itm, boolean is_thumb, int w, Io_url bin_url) { - Bin_wkr_get(itm, is_thumb, w, bin_url); + return Save_to_url(itm.Orig_wiki(), itm.Lnki_ttl(), itm.Lnki_md5(), itm.Lnki_ext(), is_thumb, w, itm.Lnki_thumbtime(), itm.Lnki_page(), bin_url); + } + public boolean Save_to_url(byte[] orig_repo, byte[] orig_ttl, byte[] orig_md5, Xof_ext orig_ext, boolean lnki_is_thumb, int file_w, double lnki_time, int lnki_page, Io_url file_url) { + Bin_wkr_get(orig_repo, orig_ttl, orig_md5, orig_ext, lnki_is_thumb, file_w, lnki_time, lnki_page, file_url); boolean rv = download.Exec(); if (!rv) Handle_error(); return rv; @@ -43,13 +46,13 @@ public class Xof_bin_wkr_http_wmf implements Xof_bin_wkr { if (fail_timeout > 0) ThreadAdp_.Sleep(fail_timeout); // as per WMF policy, pause 1 second for every cache miss; http://lists.wikimedia.org/pipermail/wikitech-l/2013-September/071948.html } - private void Bin_wkr_get(Xof_fsdb_itm itm, boolean is_thumb, int w, Io_url bin_url) { - byte mode = is_thumb ? Xof_repo_itm.Mode_thumb : Xof_repo_itm.Mode_orig; - Xof_repo_pair repo_itm = repo_mgr.Repos_get_by_wiki(itm.Orig_wiki()); - String queue_msg = String_.Format("downloading ~{0} of ~{1}: ~{2};", 0, 0, String_.new_utf8_(itm.Lnki_ttl())); + private void Bin_wkr_get(byte[] orig_repo, byte[] orig_ttl, byte[] orig_md5, Xof_ext orig_ext, boolean lnki_is_thumb, int file_w, double lnki_time, int lnki_page, Io_url file_url) { + byte mode = lnki_is_thumb ? Xof_repo_itm.Mode_thumb : Xof_repo_itm.Mode_orig; + Xof_repo_pair repo_itm = repo_mgr.Repos_get_by_wiki(orig_repo); + String queue_msg = String_.Format("downloading ~{0} of ~{1}: ~{2};", 0, 0, String_.new_utf8_(orig_ttl)); download.Prog_fmt_hdr_(queue_msg); - String src = url_bldr.Init_for_src_file(mode, repo_itm.Src(), itm.Lnki_ttl(), itm.Lnki_md5(), itm.Lnki_ext(), w, itm.Lnki_thumbtime(), itm.Lnki_page()).Xto_str(); - download.Init(src, bin_url); + String src = url_bldr.Init_for_src_file(mode, repo_itm.Src(), orig_ttl, orig_md5, orig_ext, file_w, lnki_time, lnki_page).Xto_str(); + download.Init(src, file_url); } public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_fail_timeout_)) fail_timeout = m.ReadInt("v"); diff --git a/400_xowa/src/gplx/xowa/files/cnvs/Xof_cnv_wkr_.java b/400_xowa/src/gplx/xowa/files/cnvs/Xof_cnv_wkr_.java index 3e81b6eb7..1189746de 100644 --- a/400_xowa/src/gplx/xowa/files/cnvs/Xof_cnv_wkr_.java +++ b/400_xowa/src/gplx/xowa/files/cnvs/Xof_cnv_wkr_.java @@ -17,5 +17,5 @@ along with this program. If not, see . */ package gplx.xowa.files.cnvs; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; public class Xof_cnv_wkr_ { - public static final byte Tid_null = Byte_.MaxValue_127, Tid_n = 0, Tid_y = 1; + public static final byte Tid_null = Byte_.Max_value_127, Tid_n = 0, Tid_y = 1; } diff --git a/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_itm.java b/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_itm.java index ab2f959d1..bbae49048 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_itm.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_itm.java @@ -101,4 +101,14 @@ public class Xof_fsdb_itm { public byte Rslt_bin() {return rslt_bin;} public Xof_fsdb_itm Rslt_bin_(byte v) {this.rslt_bin = v; return this;} private byte rslt_bin; public byte Rslt_cnv() {return rslt_cnv;} public Xof_fsdb_itm Rslt_cnv_(byte v) {this.rslt_cnv = v; return this;} private byte rslt_cnv; public boolean Rslt_fil_created() {return rslt_fil_created;} public Xof_fsdb_itm Rslt_fil_created_(boolean v) {rslt_fil_created = v; return this;} private boolean rslt_fil_created; + public static byte[] Bld_key_to_bry(Bry_bfr bfr, byte[] dir_name, byte[] fil_name, boolean fil_is_orig, int fil_w, double fil_thumbtime, int fil_page) { + bfr .Add(dir_name).Add_byte_pipe() + .Add(fil_name).Add_byte_pipe() + .Add_int_bool(fil_is_orig).Add_byte_pipe() + .Add_int_variable(fil_w).Add_byte_pipe() + .Add_double(fil_thumbtime).Add_byte_pipe() + .Add_int_variable(fil_page).Add_byte_pipe() + ; + return bfr.Xto_bry_and_clear(); + } } diff --git a/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr_mem.java b/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr_mem.java index e83bd0b09..862fffe48 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr_mem.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr_mem.java @@ -67,26 +67,25 @@ public class Xof_fsdb_mgr_mem implements Xof_fsdb_mgr, Xof_bin_wkr { public void Reg_insert(Xof_fsdb_itm fsdb_itm, byte repo_id, byte status) { byte[] fsdb_itm_ttl = fsdb_itm.Orig_ttl(); if (reg_hash.Has(fsdb_itm_ttl)) return; - Xof_wiki_orig_itm regy_itm = new Xof_wiki_orig_itm(); - regy_itm.Ttl_(fsdb_itm_ttl).Status_(status).Orig_repo_(repo_id).Orig_redirect_(fsdb_itm.Orig_redirect()).Orig_ext_(fsdb_itm.Lnki_ext().Id()).Orig_w_(fsdb_itm.Orig_w()).Orig_h_(fsdb_itm.Orig_h()); + Xof_orig_regy_itm regy_itm = new Xof_orig_regy_itm(fsdb_itm_ttl, status, repo_id, fsdb_itm.Orig_w(), fsdb_itm.Orig_h(), fsdb_itm.Lnki_ext().Id(), fsdb_itm.Orig_redirect()); reg_hash.Add(fsdb_itm_ttl, regy_itm); } public void Reg_select(Xoa_page page, byte exec_tid, ListAdp itms) { int itms_len = itms.Count(); for (int i = 0; i < itms_len; i++) { Xof_fsdb_itm itm = (Xof_fsdb_itm)itms.FetchAt(i); - Xof_wiki_orig_itm reg_itm = (Xof_wiki_orig_itm)reg_hash.Get_by_bry(itm.Lnki_ttl()); + Xof_orig_regy_itm reg_itm = (Xof_orig_regy_itm)reg_hash.Get_by_bry(itm.Lnki_ttl()); if (reg_itm == null) { itm.Rslt_reg_(Xof_wiki_orig_wkr_.Tid_missing_reg); continue; } - byte repo_id = reg_itm.Orig_repo(); + byte repo_id = reg_itm.Repo_tid(); if (repo_id <= Xof_repo_itm.Repo_local) { byte[] wiki = bin_mgr.Repo_mgr().Repos_get_at(repo_id).Trg().Wiki_key(); itm.Orig_wiki_(wiki); } itm.Orig_size_(reg_itm.Orig_w(), reg_itm.Orig_h()); - itm.Orig_repo_(reg_itm.Orig_repo()); + itm.Orig_repo_(reg_itm.Repo_tid()); if (Bry_.Len_gt_0(reg_itm.Orig_redirect())) itm.Init_by_redirect(reg_itm.Orig_redirect()); itm.Rslt_reg_(reg_itm.Status()); @@ -110,13 +109,13 @@ public class Xof_fsdb_mgr_mem implements Xof_fsdb_mgr, Xof_bin_wkr { ; } public boolean Bin_wkr_get_to_url(ListAdp temp_files, Xof_fsdb_itm itm, boolean is_thumb, int w, Io_url bin_url) { - byte[] wiki = itm.Orig_wiki(); - byte[] ttl = itm.Lnki_ttl(); - double thumbtime = itm.Lnki_thumbtime(); - byte[] key = Gen_key(is_thumb, itm.Lnki_ext(), wiki, ttl, w, thumbtime); + return Save_to_url(itm.Orig_wiki(), itm.Lnki_ttl(), itm.Lnki_md5(), itm.Lnki_ext(), is_thumb, w, itm.Lnki_thumbtime(), itm.Lnki_page(), bin_url); + } + public boolean Save_to_url(byte[] orig_repo, byte[] orig_ttl, byte[] orig_md5, Xof_ext orig_ext, boolean lnki_is_thumb, int file_w, double lnki_time, int lnki_page, Io_url file_url) { + byte[] key = Gen_key(lnki_is_thumb, orig_ext, orig_repo, orig_ttl, file_w, lnki_time); Fsdb_mem_itm mem_itm = (Fsdb_mem_itm)bin_hash.Get_by_bry(key); if (mem_itm == null) return false; - Io_mgr._.SaveFilBry(bin_url, mem_itm.Bin()); + Io_mgr._.SaveFilBry(file_url, mem_itm.Bin()); return true; } private byte[] Key_bld_fil(byte[] wiki, byte[] ttl) { diff --git a/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr_sql.java b/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr_sql.java index 96c19cb80..156db20af 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr_sql.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr_sql.java @@ -18,8 +18,9 @@ along with this program. If not, see . package gplx.xowa.files.fsdb; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.dbs.*; import gplx.fsdb.*; import gplx.xowa.files.wiki_orig.*; import gplx.xowa.files.bins.*; import gplx.xowa.files.qrys.*; import gplx.xowa.files.fsdb.caches.*; import gplx.xowa.files.fsdb.fs_roots.*; +import gplx.xowa2.files.*; public class Xof_fsdb_mgr_sql implements Xof_fsdb_mgr, GfoInvkAble { - private Db_provider img_regy_provider = null; + private Db_conn img_regy_provider = null; private Io_url app_file_dir; private Xof_url_bldr url_bldr = Xof_url_bldr.new_v2_(); public boolean Tid_is_mem() {return false;} @@ -94,6 +95,11 @@ public class Xof_fsdb_mgr_sql implements Xof_fsdb_mgr, GfoInvkAble { Reg_select_only(page, exec_tid, itms, hash); Xof_fsdb_mgr_._.Fsdb_search(this, app_file_dir, page, exec_tid, itms, bin_mgr.Repo_mgr(), url_bldr); } + public boolean Download(Xofv_file_itm itm) { +// if (qry_mgr.Find(itm.Lnki_exec_tid(), itm)) { +// bin_mgr.Find_to_url_as_bool + return true; + } public Fsdb_db_bin_fil Bin_db_get(int mnt_id, int bin_db_id) { return mnt_mgr.Bin_db_get(mnt_id, bin_db_id); } @@ -127,9 +133,9 @@ public class Xof_fsdb_mgr_sql implements Xof_fsdb_mgr, GfoInvkAble { img_regy_provider.Conn_term(); } public static Io_url Wiki_orig_url(Io_url root_dir) {return root_dir.GenSubFil("wiki.orig#00.sqlite3");} - public static Db_provider Wiki_orig_provider(Io_url root_dir) { + public static Db_conn Wiki_orig_provider(Io_url root_dir) { Bool_obj_ref created = Bool_obj_ref.n_(); - Db_provider rv = Sqlite_engine_.Provider_load_or_make_(Wiki_orig_url(root_dir), created); + Db_conn rv = Sqlite_engine_.Conn_load_or_make_(Wiki_orig_url(root_dir), created); if (created.Val()) Xof_wiki_orig_tbl.Create_table(rv); return rv; diff --git a/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_cfg_mgr.java b/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_cfg_mgr.java index dc081d1b7..0ec385527 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_cfg_mgr.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_cfg_mgr.java @@ -27,14 +27,14 @@ class Cache_cfg_mgr { public void Cache_len_add(long v) {cache_len += v;} public long Cache_min() {return cache_min;} public Cache_cfg_mgr Cache_min_(long v) {cache_min = v; return this;} private long cache_min = Io_mgr.Len_mb * 75; public long Cache_max() {return cache_max;} public Cache_cfg_mgr Cache_max_(long v) {cache_max = v; return this;} private long cache_max = Io_mgr.Len_mb * 100; - public void Db_init(Db_provider provider) { - cfg_tbl.Provider_(provider); + public void Db_init(Db_conn conn) { + cfg_tbl.Conn_(conn); next_id = cfg_tbl.Select_val_as_int(Cfg_grp, Cfg_key__next_id); cache_len = cfg_tbl.Select_val_as_int(Cfg_grp, Cfg_key__cache_len); cache_max = cfg_tbl.Select_val_as_int(Cfg_grp, Cfg_key__cache_max); } - public void Db_when_new(Db_provider provider) { - cfg_tbl.Provider_(provider); + public void Db_when_new(Db_conn conn) { + cfg_tbl.Conn_(conn); cfg_tbl.Insert_str(Cfg_grp, Cfg_key__next_id, Int_.Xto_str(1)); cfg_tbl.Insert_str(Cfg_grp, Cfg_key__cache_len, Long_.Xto_str(0)); cfg_tbl.Insert_str(Cfg_grp, Cfg_key__cache_min, Long_.Xto_str(cache_min)); diff --git a/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_dir_mgr.java b/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_dir_mgr.java index a8c017026..42b9b393f 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_dir_mgr.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_dir_mgr.java @@ -22,8 +22,8 @@ class Cache_dir_mgr { private OrderedHash name_hash = OrderedHash_.new_bry_(); private HashAdp id_hash = HashAdp_.new_(); private Cache_dir_tbl dir_tbl = new Cache_dir_tbl(); public Cache_dir_mgr(Cache_mgr v) {this.cache_mgr = v;} - public void Db_init(Db_provider p) {dir_tbl.Db_init(p);} - public void Db_when_new(Db_provider p) {dir_tbl.Db_when_new(p);} + public void Db_init(Db_conn p) {dir_tbl.Db_init(p);} + public void Db_when_new(Db_conn p) {dir_tbl.Db_when_new(p);} public void Db_save() { int len = name_hash.Count(); boolean err_seen = false; diff --git a/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_dir_tbl.java b/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_dir_tbl.java index 1196f1359..3fac45766 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_dir_tbl.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_dir_tbl.java @@ -18,18 +18,18 @@ along with this program. If not, see . package gplx.xowa.files.fsdb.caches; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.xowa.files.fsdb.*; import gplx.dbs.*; class Cache_dir_tbl { - private Db_provider provider; + private Db_conn conn; private Db_stmt select_stmt; private Db_stmt_bldr stmt_bldr; - public void Db_init(Db_provider provider) {this.provider = provider;} + public void Db_init(Db_conn conn) {this.conn = conn;} public String Db_save(Cache_dir_itm itm) { try { - if (stmt_bldr == null) stmt_bldr = new Db_stmt_bldr(Tbl_name, String_.Ary(Fld_dir_id), Fld_dir_name).Init(provider); + if (stmt_bldr == null) stmt_bldr = new Db_stmt_bldr(Tbl_name, String_.Ary(Fld_dir_id), Fld_dir_name).Init(conn); Db_stmt stmt = stmt_bldr.Get(itm.Cmd_mode()); switch (itm.Cmd_mode()) { - case Db_cmd_mode.Create: stmt.Clear().Val_int_(itm.Uid()).Val_str_by_bry_(itm.Dir_bry()).Exec_insert(); break; - case Db_cmd_mode.Update: stmt.Clear() .Val_str_by_bry_(itm.Dir_bry()).Val_int_(itm.Uid()).Exec_update(); break; - case Db_cmd_mode.Delete: stmt.Clear().Val_int_(itm.Uid()).Exec_delete(); break; + case Db_cmd_mode.Create: stmt.Clear().Val_int(itm.Uid()).Val_bry_as_str(itm.Dir_bry()).Exec_insert(); break; + case Db_cmd_mode.Update: stmt.Clear() .Val_bry_as_str(itm.Dir_bry()).Val_int(itm.Uid()).Exec_update(); break; + case Db_cmd_mode.Delete: stmt.Clear().Val_int(itm.Uid()).Exec_delete(); break; case Db_cmd_mode.Ignore: break; default: throw Err_.unhandled(itm.Cmd_mode()); } @@ -44,17 +44,17 @@ class Cache_dir_tbl { if (select_stmt != null) select_stmt.Rls(); if (stmt_bldr != null) stmt_bldr.Rls(); } - public void Db_when_new(Db_provider p) { + public void Db_when_new(Db_conn p) { Sqlite_engine_.Tbl_create(p, Tbl_name, Tbl_sql); Sqlite_engine_.Idx_create(p, Idx_name); } - public int Select_max_uid() {return Db_provider_.Select_fld0_as_int_or(provider, "SELECT Max(uid) AS MaxId FROM cache_dir;", -1);} + public int Select_max_uid() {return Db_conn_.Select_fld0_as_int_or(conn, "SELECT Max(uid) AS MaxId FROM cache_dir;", -1);} public Cache_dir_itm Select(byte[] name) { - if (select_stmt == null) select_stmt = Db_stmt_.new_select_(provider, Tbl_name, String_.Ary(Fld_dir_name)); + if (select_stmt == null) select_stmt = Db_stmt_.new_select_(conn, Tbl_name, String_.Ary(Fld_dir_name)); DataRdr rdr = DataRdr_.Null; try { rdr = select_stmt.Clear() - .Val_str_by_bry_(name) + .Val_bry_as_str(name) .Exec_select(); if (rdr.MoveNextPeer()) { return new Cache_dir_itm().Init_by_load(rdr); @@ -67,7 +67,7 @@ class Cache_dir_tbl { } public void Select_all(ListAdp list) { list.Clear(); - Db_stmt select_all_stmt = Db_stmt_.new_select_all_(provider, Tbl_name); + Db_stmt select_all_stmt = Db_stmt_.new_select_all_(conn, Tbl_name); DataRdr rdr = DataRdr_.Null; try { rdr = select_all_stmt.Exec_select(); diff --git a/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_fil_itm.java b/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_fil_itm.java index 22206ebe3..3b945c69a 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_fil_itm.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_fil_itm.java @@ -55,7 +55,7 @@ public class Cache_fil_itm implements CompareAble { cache_time = rdr.ReadLong(Cache_fil_tbl.Fld_cache_time); return this; } - public Cache_fil_itm Init_by_make(int uid, int dir_id, byte[] fil_name, boolean fil_is_orig, int fil_w, int fil_h, double fil_thumbtime, Xof_ext fil_ext, long fil_size) { + public Cache_fil_itm Init_by_make(int uid, int dir_id, byte[] fil_name, boolean fil_is_orig, int fil_w, int fil_h, double fil_thumbtime, Xof_ext fil_ext, long fil_size, int fil_page) { cmd_mode = Db_cmd_mode.Create; this.uid = uid; this.dir_id = dir_id; @@ -80,6 +80,16 @@ public class Cache_fil_itm implements CompareAble { ; return bfr.Xto_bry_and_clear(); } + public static byte[] Gen_hash_key_v2(Bry_bfr bfr, byte[] dir, byte[] ttl, boolean fil_is_orig, int fil_w, double thumbtime, int page) { + bfr .Add(dir).Add_byte_pipe() + .Add(ttl).Add_byte_pipe() + .Add_yn(fil_is_orig).Add_byte_pipe() + .Add_int_variable(fil_w).Add_byte_pipe() + .Add_double(Xof_doc_thumb.Db_save_double(thumbtime)) + .Add_int_variable(Xof_doc_page.Db_save_int(page)) + ; + return bfr.Xto_bry_and_clear(); + } public int compareTo(Object obj) {Cache_fil_itm comp = (Cache_fil_itm)obj; return -Long_.Compare(cache_time, comp.cache_time);} // - for DESC sort public static final Cache_fil_itm Null = new Cache_fil_itm(); public Cache_fil_itm() {} } diff --git a/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_fil_mgr.java b/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_fil_mgr.java index fc33dc803..077e72bd2 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_fil_mgr.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_fil_mgr.java @@ -24,8 +24,8 @@ class Cache_fil_mgr { private Cache_fil_tbl fil_tbl = new Cache_fil_tbl(); private Bry_bfr fil_key_bldr = Bry_bfr.reset_(255); public Cache_fil_mgr(Cache_mgr v) {this.cache_mgr = v;} - public void Db_init(Db_provider p) {fil_tbl.Db_init(p);} - public void Db_when_new(Db_provider p) {fil_tbl.Db_when_new(p);} + public void Db_init(Db_conn p) {fil_tbl.Db_init(p);} + public void Db_when_new(Db_conn p) {fil_tbl.Db_when_new(p);} public void Db_save() { int len = fil_hash.Count(); boolean err_seen = false; @@ -67,7 +67,7 @@ class Cache_fil_mgr { fil_itm = fil_tbl.Select(dir_id, fil_name, fil_is_orig, fil_w, fil_h, fil_thumbtime); if (fil_itm == Cache_fil_itm.Null) { // not in db int fil_id = cache_mgr.Next_id(); - fil_itm = new Cache_fil_itm().Init_by_make(fil_id, dir_id, fil_name, fil_is_orig, fil_w, fil_h, fil_thumbtime, fil_ext, fil_size); + fil_itm = new Cache_fil_itm().Init_by_make(fil_id, dir_id, fil_name, fil_is_orig, fil_w, fil_h, fil_thumbtime, fil_ext, fil_size, Xof_doc_page.Null); created.Val_(true); } fil_hash.Add(fil_key, fil_itm); @@ -86,7 +86,7 @@ class Cache_fil_mgr { long cur_size = 0, actl_size = 0; Xof_url_bldr url_bldr = new Xof_url_bldr(); ListAdp deleted = ListAdp_.new_(); - fil_tbl.Provider().Txn_mgr().Txn_bgn_if_none(); + fil_tbl.Conn().Txn_mgr().Txn_bgn_if_none(); long compress_to = cfg_mgr.Cache_min(); for (int i = 0; i < len; i++) { Cache_fil_itm itm = (Cache_fil_itm)fil_hash.FetchAt(i); @@ -116,7 +116,7 @@ class Cache_fil_mgr { catch (Exception e) { app.Usr_dlg().Warn_many("", "", "failed to compress cache: err=~{0}", Err_.Message_gplx_brief(e)); } - finally {fil_tbl.Provider().Txn_mgr().Txn_end_all();} + finally {fil_tbl.Conn().Txn_mgr().Txn_end_all();} } private void Fsys_delete(Xof_url_bldr url_bldr, Xoa_repo_mgr repo_mgr, Cache_dir_mgr dir_mgr, Cache_fil_itm itm) { byte mode_id = itm.Fil_is_orig() ? Xof_repo_itm.Mode_orig : Xof_repo_itm.Mode_thumb; diff --git a/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_fil_tbl.java b/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_fil_tbl.java index d34dfe5c8..3380c9536 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_fil_tbl.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_fil_tbl.java @@ -20,20 +20,20 @@ import gplx.dbs.*; class Cache_fil_tbl { private Db_stmt select_itm_stmt; private Db_stmt_bldr stmt_bldr; - public void Db_init(Db_provider p) {this.provider = p;} - public Db_provider Provider() {return provider;} private Db_provider provider; - public void Db_when_new(Db_provider p) { + public void Db_init(Db_conn p) {this.conn = p;} + public Db_conn Conn() {return conn;} private Db_conn conn; + public void Db_when_new(Db_conn p) { Sqlite_engine_.Tbl_create(p, Tbl_name, Tbl_sql); Sqlite_engine_.Idx_create(p, Idx_ttl); } public String Db_save(Cache_fil_itm itm) { try { - if (stmt_bldr == null) stmt_bldr = new Db_stmt_bldr(Tbl_name, String_.Ary(Fld_uid), Fld_dir_id, Fld_fil_name, Fld_fil_is_orig, Fld_fil_w, Fld_fil_h, Fld_fil_thumbtime, Fld_fil_ext, Fld_fil_size, Fld_cache_time).Init(provider); + if (stmt_bldr == null) stmt_bldr = new Db_stmt_bldr(Tbl_name, String_.Ary(Fld_uid), Fld_dir_id, Fld_fil_name, Fld_fil_is_orig, Fld_fil_w, Fld_fil_h, Fld_fil_thumbtime, Fld_fil_ext, Fld_fil_size, Fld_cache_time).Init(conn); Db_stmt stmt = stmt_bldr.Get(itm.Cmd_mode()); switch (itm.Cmd_mode()) { - case Db_cmd_mode.Create: stmt.Clear().Val_int_(itm.Uid()); Db_save_modify(stmt, itm); stmt.Exec_insert(); break; - case Db_cmd_mode.Update: stmt.Clear(); Db_save_modify(stmt, itm); stmt.Val_int_(itm.Uid()).Exec_update(); break; - case Db_cmd_mode.Delete: stmt.Clear().Val_int_(itm.Uid()); stmt.Exec_delete(); break; + case Db_cmd_mode.Create: stmt.Clear().Val_int(itm.Uid()); Db_save_modify(stmt, itm); stmt.Exec_insert(); break; + case Db_cmd_mode.Update: stmt.Clear(); Db_save_modify(stmt, itm); stmt.Val_int(itm.Uid()).Exec_update(); break; + case Db_cmd_mode.Delete: stmt.Clear().Val_int(itm.Uid()); stmt.Exec_delete(); break; case Db_cmd_mode.Ignore: break; default: throw Err_.unhandled(itm.Cmd_mode()); } @@ -45,33 +45,33 @@ class Cache_fil_tbl { } } private void Db_save_modify(Db_stmt stmt, Cache_fil_itm itm) { - stmt.Val_int_(itm.Dir_id()) - .Val_str_by_bry_(itm.Fil_name()) - .Val_byte_by_bool_(itm.Fil_is_orig()) - .Val_int_(itm.Fil_w()) - .Val_int_(itm.Fil_h()) - .Val_int_(Xof_doc_thumb.Db_save_int(itm.Fil_thumbtime())) - .Val_int_(itm.Fil_ext().Id()) - .Val_long_(itm.Fil_size()) - .Val_long_(itm.Cache_time()) + stmt.Val_int(itm.Dir_id()) + .Val_bry_as_str(itm.Fil_name()) + .Val_bool_as_byte(itm.Fil_is_orig()) + .Val_int(itm.Fil_w()) + .Val_int(itm.Fil_h()) + .Val_int(Xof_doc_thumb.Db_save_int(itm.Fil_thumbtime())) + .Val_int(itm.Fil_ext().Id()) + .Val_long(itm.Fil_size()) + .Val_long(itm.Cache_time()) ; } public void Db_term() { if (select_itm_stmt != null) select_itm_stmt.Rls(); if (stmt_bldr != null) stmt_bldr.Rls(); } - public int Select_max_uid() {return Db_provider_.Select_fld0_as_int_or(provider, "SELECT Max(uid) AS MaxId FROM cache_fil;", -1);} + public int Select_max_uid() {return Db_conn_.Select_fld0_as_int_or(conn, "SELECT Max(uid) AS MaxId FROM cache_fil;", -1);} public Cache_fil_itm Select(int dir_id, byte[] fil_name, boolean fil_is_orig, int fil_w, int fil_h, double fil_thumbtime) { - if (select_itm_stmt == null) select_itm_stmt = Db_stmt_.new_select_(provider, Tbl_name, String_.Ary(Fld_dir_id, Fld_fil_name, Fld_fil_is_orig, Fld_fil_w, Fld_fil_h, Fld_fil_thumbtime)); + if (select_itm_stmt == null) select_itm_stmt = Db_stmt_.new_select_(conn, Tbl_name, String_.Ary(Fld_dir_id, Fld_fil_name, Fld_fil_is_orig, Fld_fil_w, Fld_fil_h, Fld_fil_thumbtime)); DataRdr rdr = DataRdr_.Null; try { rdr = select_itm_stmt.Clear() - .Val_int_(dir_id) - .Val_str_by_bry_(fil_name) - .Val_byte_by_bool_(fil_is_orig) - .Val_int_(fil_w) - .Val_int_(fil_h) - .Val_int_(Xof_doc_thumb.Db_save_int(fil_thumbtime)) + .Val_int(dir_id) + .Val_bry_as_str(fil_name) + .Val_bool_as_byte(fil_is_orig) + .Val_int(fil_w) + .Val_int(fil_h) + .Val_int(Xof_doc_thumb.Db_save_int(fil_thumbtime)) .Exec_select(); if (rdr.MoveNextPeer()) return new Cache_fil_itm().Init_by_load(rdr); @@ -83,7 +83,7 @@ class Cache_fil_tbl { } public void Db_load(Bry_bfr fil_key_bldr, OrderedHash hash) { hash.Clear(); - Db_stmt select_all_stmt = Db_stmt_.new_select_all_(provider, Tbl_name); + Db_stmt select_all_stmt = Db_stmt_.new_select_all_(conn, Tbl_name); DataRdr rdr = DataRdr_.Null; try { rdr = select_all_stmt.Exec_select(); diff --git a/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_mgr.java b/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_mgr.java index f51d19e86..1ab935cde 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_mgr.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/caches/Cache_mgr.java @@ -17,6 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.files.fsdb.caches; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.xowa.files.fsdb.*; import gplx.dbs.*; import gplx.xowa.users.dbs.*; +import gplx.xowa2.files.*; public class Cache_mgr implements Xou_db_wkr, GfoInvkAble { private Cache_cfg_mgr cfg_mgr; private Cache_dir_mgr dir_mgr; @@ -34,18 +35,18 @@ public class Cache_mgr implements Xou_db_wkr, GfoInvkAble { public int Next_id() {return cfg_mgr.Next_id();} public void Next_id_(int v) {cfg_mgr.Next_id_(v);} public void Db_init(Xou_db_mgr data_mgr) { try { - Db_provider provider = data_mgr.Provider(); + Db_conn conn = data_mgr.Conn(); data_mgr.Wkr_reg(this); - cfg_mgr.Db_init(provider); - dir_mgr.Db_init(provider); - fil_mgr.Db_init(provider); + cfg_mgr.Db_init(conn); + dir_mgr.Db_init(conn); + fil_mgr.Db_init(conn); } catch (Exception e) {app.Usr_dlg().Warn_many("", "", "cache_mgr.init:fatal error: err=~{0}", Err_.Message_gplx_brief(e));} } public void Db_when_new(Xou_db_mgr data_mgr) { - Db_provider provider = data_mgr.Provider(); - cfg_mgr.Db_when_new(provider); - dir_mgr.Db_when_new(provider); - fil_mgr.Db_when_new(provider); + Db_conn conn = data_mgr.Conn(); + cfg_mgr.Db_when_new(conn); + dir_mgr.Db_when_new(conn); + fil_mgr.Db_when_new(conn); this.Db_save(data_mgr); } public void Db_save(Xou_db_mgr data_mgr) { @@ -71,6 +72,15 @@ public class Cache_mgr implements Xou_db_wkr, GfoInvkAble { cfg_mgr.Cache_len_add(bin_len); return fil_itm; } +// public Xou_cache_fil Get_or_new(byte[] dir, byte[] ttl, boolean is_orig, int w, double time, int page) { +// int dir_id = dir_mgr.Get_itm_by_name(dir).Uid(); +// Xou_cache_fil fil_itm = fil_mgr.Get_or_new(dir_id, ttl, is_orig, w, -1, time, ext, 0, created.Val_n_()); +// fil_itm.Cache_time_now_(); +// if (created.Val()) // increase cache_size if item is new; (don't increase if update); NOTE: not same as Db_cmd_mode.Created, b/c itm could be created, but not saved to db yet; EX: Page_1 has A.png; A.png marked Created; Page_2 has A.png; A.png still Created, but should increase cache_size +// cfg_mgr.Cache_len_add(bin_len); +//// return fil_itm; +// return null; +// } public void Compress_check() { if (cfg_mgr.Cache_len() > cfg_mgr.Cache_max()) fil_mgr.Compress(app, dir_mgr, cfg_mgr); diff --git a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_dir.java b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_dir.java index 9297b10a6..1e5b11a87 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_dir.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_dir.java @@ -22,10 +22,10 @@ class Fs_root_dir { private Gfo_usr_dlg usr_dlg; private Xof_img_wkr_query_img_size img_size_wkr; private Io_url url; private boolean recurse = true; private Orig_fil_mgr cache = new Orig_fil_mgr(), fs_fil_mgr; - private Db_provider_mkr provider_mkr; - private Db_provider provider; private Fsdb_cfg_tbl cfg_tbl; private Orig_fil_tbl fil_tbl; + private Db_conn_mkr provider_mkr; + private Db_conn conn; private Fsdb_cfg_tbl cfg_tbl; private Orig_fil_tbl fil_tbl; private int fil_id_next = 0; - public void Init(Io_url url, Db_provider_mkr provider_mkr, Fsdb_cfg_tbl cfg_tbl, Orig_fil_tbl fil_tbl, Gfo_usr_dlg usr_dlg, Xof_img_wkr_query_img_size img_size_wkr) { + public void Init(Io_url url, Db_conn_mkr provider_mkr, Fsdb_cfg_tbl cfg_tbl, Orig_fil_tbl fil_tbl, Gfo_usr_dlg usr_dlg, Xof_img_wkr_query_img_size img_size_wkr) { this.url = url; this.provider_mkr = provider_mkr; this.cfg_tbl = cfg_tbl; this.fil_tbl = fil_tbl; this.usr_dlg = usr_dlg; this.img_size_wkr = img_size_wkr; } @@ -42,7 +42,7 @@ class Fs_root_dir { return rv; } private Orig_fil_itm Get_from_db(byte[] lnki_ttl) { - if (provider == null) provider = Init_db_fil_mgr(); + if (conn == null) conn = Init_db_fil_mgr(); Orig_fil_itm rv = fil_tbl.Select_itm(lnki_ttl); if (rv == null) return Orig_fil_itm.Null; // not in db return rv; @@ -77,19 +77,19 @@ class Fs_root_dir { } return rv; } - private Db_provider Init_db_fil_mgr() { + private Db_conn Init_db_fil_mgr() { Io_url db_url = url.GenSubFil("^orig_regy.sqlite3"); Bool_obj_ref created_ref = Bool_obj_ref.n_(); - provider = provider_mkr.Load_or_make_(db_url, created_ref); + conn = provider_mkr.Load_or_make_(db_url, created_ref); boolean created = created_ref.Val(); - cfg_tbl.Ctor(provider, created); - fil_tbl.Ctor(provider, created); + cfg_tbl.Ctor(conn, created); + fil_tbl.Ctor(conn, created); if (created) cfg_tbl.Insert(Cfg_grp_root_dir, Cfg_key_fil_id_next, Int_.Xto_str(fil_id_next)); else { fil_id_next = cfg_tbl.Select_as_int_or_fail(Cfg_grp_root_dir, Cfg_key_fil_id_next); } - return provider; + return conn; } public void Rls() { cfg_tbl.Rls(); diff --git a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_dir_tst.java b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_dir_tst.java index 3014f5a92..8690f898d 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_dir_tst.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_dir_tst.java @@ -47,7 +47,7 @@ class Fs_root_dir_fxt { Fsdb_cfg_tbl cfg_tbl = Fsdb_cfg_tbl_.new_mem_(); orig_fil_tbl = new Orig_fil_tbl_mem(); Xof_img_wkr_query_img_size img_size_wkr = new Xof_img_wkr_query_img_size_test(); - root_dir.Init(url, Db_provider_mkr_.Mem_create_y, cfg_tbl, orig_fil_tbl, Gfo_usr_dlg_.Null, img_size_wkr); + root_dir.Init(url, Db_conn_mkr_.Mem_create_y, cfg_tbl, orig_fil_tbl, Gfo_usr_dlg_.Null, img_size_wkr); } public Orig_fil_mok itm_() {return new Orig_fil_mok();} public void Init_fs(String url, int w, int h) {Save_img(url, w, h);} diff --git a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_wkr_fsdb.java b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_wkr_fsdb.java index 024d14a7a..2e476bc75 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_wkr_fsdb.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Fs_root_wkr_fsdb.java @@ -62,7 +62,7 @@ public class Fs_root_wkr_fsdb { orig_dir_mgr_init(orig_dir); } private void orig_dir_mgr_init(Io_url orig_dir) { - orig_dir_mgr.Init(orig_dir, Db_provider_mkr_.Sqlite, Fsdb_cfg_tbl_.new_sql_(), new Orig_fil_tbl_sql(), wiki.App().Usr_dlg(), wiki.App().File_mgr().Img_mgr().Wkr_query_img_size()); + orig_dir_mgr.Init(orig_dir, Db_conn_mkr_.Sqlite, Fsdb_cfg_tbl_.new_sql_(), new Orig_fil_tbl_sql(), wiki.App().Usr_dlg(), wiki.App().File_mgr().Img_mgr().Wkr_query_img_size()); } public void Thumb_dir_(Io_url v) { thumb_dir = v; 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 74ebdf49d..75eb8e202 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,50 +18,50 @@ 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.*; interface Orig_fil_tbl extends RlsAble { - void Ctor(Db_provider provider, boolean created); + void Ctor(Db_conn conn, boolean created); Orig_fil_itm Select_itm(byte[] ttl); void Insert(Orig_fil_itm fil_itm); } class Orig_fil_tbl_mem implements Orig_fil_tbl { private Hash_adp_bry hash; - public void Ctor(Db_provider provider, boolean created) {hash = Hash_adp_bry.cs_();} // NOTE: cs_ b/c ttl-based + public void Ctor(Db_conn conn, boolean created) {hash = Hash_adp_bry.cs_();} // NOTE: cs_ b/c ttl-based public Orig_fil_itm Select_itm(byte[] ttl) {return (Orig_fil_itm)hash.Get_by_bry(ttl);} public void Insert(Orig_fil_itm fil_itm) {hash.Add(fil_itm.Fil_name(), fil_itm);} public void Rls() {} } class Orig_fil_tbl_sql implements Orig_fil_tbl { - private Db_provider provider; + private Db_conn conn; private Db_stmt stmt_select, stmt_insert; - public void Ctor(Db_provider provider, boolean created) { - this.provider = provider; - if (created) Create_table(provider); + public void Ctor(Db_conn conn, boolean created) { + this.conn = conn; + if (created) Create_table(conn); } public Orig_fil_itm Select_itm(byte[] ttl) { - if (stmt_select == null) stmt_select = provider.Prepare(Db_qry_.select_().From_(Tbl_name).Cols_all_().Where_(Db_crt_.eq_(Fld_fil_name, ""))); + if (stmt_select == null) stmt_select = conn.New_stmt(Db_qry_.select_().From_(Tbl_name).Cols_all_().Where_(Db_crt_.eq_(Fld_fil_name, ""))); Orig_fil_itm rv = Orig_fil_itm.Null; - DataRdr rdr = stmt_select.Clear().Val_bry_(ttl).Exec_select(); + DataRdr rdr = stmt_select.Clear().Val_bry(ttl).Exec_select(); if (rdr.MoveNextPeer()) rv = new Orig_fil_itm().Init_by_load(rdr); rdr.Rls(); return rv; } - private Db_stmt Insert_stmt() {return Db_stmt_.new_insert_(provider, Tbl_name, Fld_fil_uid, Fld_fil_name, Fld_fil_ext_id, Fld_fil_w, Fld_fil_h, Fld_fil_dir_url);} + private Db_stmt Insert_stmt() {return Db_stmt_.new_insert_(conn, Tbl_name, Fld_fil_uid, Fld_fil_name, Fld_fil_ext_id, Fld_fil_w, Fld_fil_h, Fld_fil_dir_url);} public void Insert(Orig_fil_itm fil_itm) { if (stmt_insert == null) stmt_insert = Insert_stmt(); stmt_insert.Clear() - .Val_int_(fil_itm.Fil_uid()) - .Val_str_by_bry_(fil_itm.Fil_name()) - .Val_int_(fil_itm.Fil_ext_id()) - .Val_int_(fil_itm.Fil_w()) - .Val_int_(fil_itm.Fil_h()) - .Val_str_by_bry_(fil_itm.Fil_dir_url()) + .Val_int(fil_itm.Fil_uid()) + .Val_bry_as_str(fil_itm.Fil_name()) + .Val_int(fil_itm.Fil_ext_id()) + .Val_int(fil_itm.Fil_w()) + .Val_int(fil_itm.Fil_h()) + .Val_bry_as_str(fil_itm.Fil_dir_url()) .Exec_insert(); } public void Rls() { stmt_select.Rls(); stmt_insert.Rls(); } - private void Create_table(Db_provider p) { + private void Create_table(Db_conn p) { Sqlite_engine_.Tbl_create(p, Tbl_name, Tbl_sql); Sqlite_engine_.Idx_create(p, Idx_main); } diff --git a/400_xowa/src/gplx/xowa/files/qrys/Xof_qry_wkr.java b/400_xowa/src/gplx/xowa/files/qrys/Xof_qry_wkr.java index e9616c581..70c3d743e 100644 --- a/400_xowa/src/gplx/xowa/files/qrys/Xof_qry_wkr.java +++ b/400_xowa/src/gplx/xowa/files/qrys/Xof_qry_wkr.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.files.qrys; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; -import gplx.xowa.files.fsdb.*; +import gplx.xowa.files.fsdb.*; import gplx.xowa.files.wiki_orig.*; public interface Xof_qry_wkr { byte Tid(); boolean Qry_file(Xof_fsdb_itm itm); diff --git a/400_xowa/src/gplx/xowa/files/qrys/Xof_qry_wkr_.java b/400_xowa/src/gplx/xowa/files/qrys/Xof_qry_wkr_.java index 4e7bd115b..4aea1b6a6 100644 --- a/400_xowa/src/gplx/xowa/files/qrys/Xof_qry_wkr_.java +++ b/400_xowa/src/gplx/xowa/files/qrys/Xof_qry_wkr_.java @@ -18,5 +18,5 @@ along with this program. If not, see . package gplx.xowa.files.qrys; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; public class Xof_qry_wkr_ { public static final Xof_qry_wkr[] Ary_empty = new Xof_qry_wkr[0]; - public static final byte Tid_null = Byte_.MaxValue_127, Tid_noop = 0, Tid_missing = 1, Tid_mock = 2, Tid_xowa_db = 3, Tid_xowa_reg = 4, Tid_wmf_api = 5, Tid_dir = 6; + public static final byte Tid_null = Byte_.Max_value_127, Tid_noop = 0, Tid_missing = 1, Tid_mock = 2, Tid_xowa_db = 3, Tid_xowa_reg = 4, Tid_wmf_api = 5, Tid_dir = 6; } diff --git a/400_xowa/src/gplx/xowa/files/qrys/Xof_qry_wkr_xowa_reg.java b/400_xowa/src/gplx/xowa/files/qrys/Xof_qry_wkr_xowa_reg.java index d3ee4a3d0..60293fcd7 100644 --- a/400_xowa/src/gplx/xowa/files/qrys/Xof_qry_wkr_xowa_reg.java +++ b/400_xowa/src/gplx/xowa/files/qrys/Xof_qry_wkr_xowa_reg.java @@ -18,13 +18,23 @@ along with this program. If not, see . package gplx.xowa.files.qrys; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.dbs.*; import gplx.xowa.dbs.tbls.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.files.wiki_orig.*; public class Xof_qry_wkr_xowa_reg implements Xof_qry_wkr { - private Db_provider provider; - public Xof_qry_wkr_xowa_reg(Db_provider p) {this.provider = p;} + private Db_conn conn; + public Xof_qry_wkr_xowa_reg(Db_conn p) {this.conn = p;} public byte Tid() {return Xof_qry_wkr_.Tid_xowa_reg;} + public boolean Qry_file(Xof_orig_regy_itm rv, byte[] lnki_ttl) { + Db_rdr rdr = Db_rdr_.Null; + try { + Db_stmt stmt = Db_stmt_.new_select_(conn, Xof_wiki_orig_tbl.Tbl_name, String_.Ary(Xof_wiki_orig_tbl.Fld_orig_ttl)); + rdr = stmt.Clear().Val_bry_as_str(lnki_ttl).Exec_select_as_rdr(); + if (!rdr.Move_next()) return false; // ttl not found; return false; + return true; + } + finally {rdr.Rls();} + } public boolean Qry_file(Xof_fsdb_itm itm) { DataRdr rdr = DataRdr_.Null; try { - rdr = Select(provider, itm.Lnki_ttl()); + rdr = Select(conn, itm.Lnki_ttl()); if (!rdr.MoveNextPeer()) return false; // NOTE: no need to set redirect; file_orig stores direct entries; EX: A.png with 20,30 redirects to B.png; file_orig stores B.png,20,30,A.png byte[] orig_redirect = rdr.ReadBryByStr(Xof_wiki_orig_tbl.Fld_orig_redirect); @@ -37,8 +47,8 @@ public class Xof_qry_wkr_xowa_reg implements Xof_qry_wkr { } finally {rdr.Rls();} } - private DataRdr Select(Db_provider p, byte[] ttl) { + private DataRdr Select(Db_conn p, byte[] ttl) { Db_stmt stmt = Db_stmt_.new_select_(p, Xof_wiki_orig_tbl.Tbl_name, String_.Ary(Xof_wiki_orig_tbl.Fld_orig_ttl)); - return stmt.Clear().Val_str_by_bry_(ttl).Exec_select(); + return stmt.Clear().Val_bry_as_str(ttl).Exec_select(); } } diff --git a/400_xowa/src/gplx/xowa/files/wiki_orig/Xof_orig_regy_itm.java b/400_xowa/src/gplx/xowa/files/wiki_orig/Xof_orig_regy_itm.java new file mode 100644 index 000000000..a9692207e --- /dev/null +++ b/400_xowa/src/gplx/xowa/files/wiki_orig/Xof_orig_regy_itm.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.xowa.files.wiki_orig; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; +import gplx.dbs.*; +public class Xof_orig_regy_itm { + public Xof_orig_regy_itm(byte[] ttl, byte status, byte repo_tid, int orig_w, int orig_h, int orig_ext, byte[] orig_redirect) { + this.ttl = ttl; this.status = status; + this.repo_tid = repo_tid; + this.orig_w = orig_w; this.orig_h = orig_h; this.orig_ext = orig_ext; this.orig_redirect = orig_redirect; + } + public byte[] Ttl() {return ttl;} private final byte[] ttl; + public byte Status() {return status;} private final byte status; + public byte Repo_tid() {return repo_tid;} private final byte repo_tid; + public int Orig_w() {return orig_w;} private final int orig_w; + public int Orig_h() {return orig_h;} private final int orig_h; + public int Orig_ext() {return orig_ext;} private final int orig_ext; + public byte[] Orig_redirect() {return orig_redirect;} private final byte[] orig_redirect; + public static Xof_orig_regy_itm load_(DataRdr rdr) { + Xof_orig_regy_itm rv = new Xof_orig_regy_itm + ( rdr.ReadBryByStr(Xof_wiki_orig_tbl.Fld_orig_ttl) + , rdr.ReadByte(Xof_wiki_orig_tbl.Fld_status) + , rdr.ReadByte(Xof_wiki_orig_tbl.Fld_orig_repo) + , rdr.ReadInt(Xof_wiki_orig_tbl.Fld_orig_w) + , rdr.ReadInt(Xof_wiki_orig_tbl.Fld_orig_h) + , rdr.ReadInt(Xof_wiki_orig_tbl.Fld_orig_ext) + , rdr.ReadBryByStr(Xof_wiki_orig_tbl.Fld_orig_redirect) + ); + return rv; + } + public static Xof_orig_regy_itm load_(Db_rdr rdr) { + Xof_orig_regy_itm rv = new Xof_orig_regy_itm + ( rdr.Read_bry_by_str(Xof_wiki_orig_tbl.Ord_orig_ttl) + , rdr.Read_byte(Xof_wiki_orig_tbl.Ord_status) + , rdr.Read_byte(Xof_wiki_orig_tbl.Ord_orig_repo) + , rdr.Read_int(Xof_wiki_orig_tbl.Ord_orig_w) + , rdr.Read_int(Xof_wiki_orig_tbl.Ord_orig_h) + , rdr.Read_int(Xof_wiki_orig_tbl.Ord_orig_ext) + , rdr.Read_bry_by_str(Xof_wiki_orig_tbl.Ord_orig_redirect) + ); + return rv; + } + public static final Xof_orig_regy_itm Null = null; +} diff --git a/400_xowa/src/gplx/xowa/files/wiki_orig/Xof_orig_regy_tbl.java b/400_xowa/src/gplx/xowa/files/wiki_orig/Xof_orig_regy_tbl.java new file mode 100644 index 000000000..8f999b5a9 --- /dev/null +++ b/400_xowa/src/gplx/xowa/files/wiki_orig/Xof_orig_regy_tbl.java @@ -0,0 +1,114 @@ +/* +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.wiki_orig; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; +import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.files.fsdb.*; +public class Xof_orig_regy_tbl implements Db_conn_itm { + public void Conn_term() {} + public Xof_orig_regy_tbl() { + Ctor_for_meta(); + } + public Db_conn Conn() {return conn;} public Xof_orig_regy_tbl Conn_(Db_conn v) {conn = v; conn.Itms_add(this); return this;} private Db_conn conn; +// public void Select_list(Cancelable cancelable, Xodb_ctx db_ctx, byte exec_tid, ListAdp itms, OrderedHash hash, Xof_url_bldr url_bldr, Xow_repo_mgr repo_mgr) { +// Xof_wiki_orig_tbl_in_wkr in_wkr = new Xof_wiki_orig_tbl_in_wkr(); +// in_wkr.Init(itms, hash); +// in_wkr.Select_in(p, cancelable, db_ctx, 0, itms.Count()); +// Xof_wiki_orig_tbl_evaluator.Rdr_done(exec_tid, itms, hash, url_bldr, repo_mgr); +// } + public boolean Select_itm_exists(byte[] ttl) {return Select_itm(ttl) != Xof_orig_regy_itm.Null;} + public Xof_orig_regy_itm Select_itm(byte[] ttl) { + Xof_orig_regy_itm rv = Xof_orig_regy_itm.Null; + Db_rdr rdr = Db_rdr_.Null; + try { + Db_stmt stmt = conn.New_stmt_select_all_where(tbl_name, Flds.Xto_str_ary(), Fld_orig_ttl); + rdr = stmt.Clear().Val_bry_as_str(ttl).Exec_select_as_rdr(); + if (rdr.Move_next()) + rv = Make_itm(rdr); + } + catch (Exception e) { + Tfds.WriteText(Err_.Message_gplx(e)); + } + finally {rdr.Rls();} + return rv; + } + public void Insert(byte repo, byte[] ttl, int ext, int w, int h, byte[] redirect) { + Db_stmt stmt = Db_stmt_.Null; + try { + stmt = conn.New_stmt_insert(tbl_name, Flds.Xto_str_ary()); + stmt.Clear() + .Val_byte(repo).Val_bry_as_str(ttl).Val_int(ext).Val_int(w).Val_int(h).Val_bry_as_str(redirect) + .Exec_insert(); + } finally {stmt.Rls();} + } + private String tbl_name = "file_orig_regy"; + private String Fld_orig_repo, Fld_orig_ttl, Fld_orig_ext, Fld_orig_w, Fld_orig_h, Fld_orig_redirect; + private final Db_meta_fld_list Flds = Db_meta_fld_list.new_(); + private void Ctor_for_meta() { + tbl_name = "wiki_orig"; + Fld_orig_repo = Flds.Add_byte("orig_repo"); + Fld_orig_ttl = Flds.Add_str("orig_ttl", 1024); + Fld_orig_ext = Flds.Add_int("orig_ext"); + Fld_orig_w = Flds.Add_int("orig_w"); + Fld_orig_h = Flds.Add_int("orig_h"); + Fld_orig_redirect = Flds.Add_str("orig_redirect", 1024); + } + public Db_meta_tbl new_meta() { + return Db_meta_tbl.new_(tbl_name, Flds.Xto_fld_ary() + , Db_meta_idx.new_unique(tbl_name, "key" , Fld_orig_ttl) + ); + } + private Xof_orig_regy_itm Make_itm(Db_rdr rdr) { + Xof_orig_regy_itm rv = new Xof_orig_regy_itm + ( rdr.Read_bry_by_str(Fld_orig_ttl) + , Xof_wiki_orig_wkr_.Tid_found_orig + , rdr.Read_byte(Fld_orig_repo) + , rdr.Read_int(Fld_orig_w) + , rdr.Read_int(Fld_orig_h) + , rdr.Read_int(Fld_orig_ext) + , rdr.Read_bry_by_str(Fld_orig_redirect) + ); + return rv; + } +} +abstract class Db_in_wkr__base { + public abstract int Interval(); + public abstract Db_qry Make_qry (Object db_ctx, int bgn, int end); + public abstract void Fill_stmt (Db_stmt stmt, int bgn, int end); + public abstract void Read_data (Cancelable cancelable, Object db_ctx, Db_rdr rdr); + public void Select_in(Cancelable cancelable, Object db_ctx, Db_conn conn, int full_bgn, int full_end) { + Db_rdr rdr = Db_rdr_.Null; + Db_stmt stmt = Db_stmt_.Null; + int part_len = Interval(); + for (int part_bgn = full_bgn; part_bgn < full_end; part_bgn += part_len) { + int part_end = part_bgn + part_len; + if (part_end > full_end) part_end = full_end; + try { + stmt = conn.New_stmt(Make_qry(db_ctx, part_bgn, part_end)); + Fill_stmt(stmt, part_bgn, part_end); + rdr = stmt.Exec_select_as_rdr(); + Read_data(cancelable, db_ctx, rdr); + } + finally {rdr.Rls(); stmt.Rls();} + } + } + public static Object[] In_ary(int len) { + Object[] rv = new Object[len]; + for (int i = 0; i < len; i++) + rv[i] = ""; + return rv; + } +} diff --git a/400_xowa/src/gplx/xowa/files/wiki_orig/Xof_wiki_orig_cmd.java b/400_xowa/src/gplx/xowa/files/wiki_orig/Xof_wiki_orig_cmd.java index 16dccc3c5..2df602689 100644 --- a/400_xowa/src/gplx/xowa/files/wiki_orig/Xof_wiki_orig_cmd.java +++ b/400_xowa/src/gplx/xowa/files/wiki_orig/Xof_wiki_orig_cmd.java @@ -18,25 +18,25 @@ along with this program. If not, see . package gplx.xowa.files.wiki_orig; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.dbs.*; import gplx.xowa.bldrs.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.files.qrys.*; import gplx.xowa.bldrs.oimgs.*; public class Xof_wiki_orig_cmd extends Xob_itm_basic_base implements Xob_cmd { - private Db_provider provider; + private Db_conn conn; public Xof_wiki_orig_cmd(Xob_bldr bldr, Xow_wiki wiki) {this.Cmd_ctor(bldr, wiki);} public String Cmd_key() {return KEY_oimg;} public static final String KEY_oimg = "file.wiki_orig"; public void Cmd_ini(Xob_bldr bldr) {} public void Cmd_bgn(Xob_bldr bldr) { wiki.Init_assert(); - provider = Xof_fsdb_mgr_sql.Wiki_orig_provider(wiki.App().Fsys_mgr().File_dir().GenSubDir(wiki.Domain_str())); + conn = Xof_fsdb_mgr_sql.Wiki_orig_provider(wiki.App().Fsys_mgr().File_dir().GenSubDir(wiki.Domain_str())); Io_url make_db_url = Xodb_db_file.init__file_make(wiki.Fsys_mgr().Root_dir()).Url(); - Sqlite_engine_.Db_attach(provider, "make_db", make_db_url.Raw()); + Sqlite_engine_.Db_attach(conn, "make_db", make_db_url.Raw()); } public void Cmd_run() {Exec();} public void Cmd_end() {} public void Cmd_print() {} private void Exec() { - usr_dlg.Prog_many("", "", "deleting wiki_orig"); provider.Exec_sql(Sql_delete_wiki_orig); // always delete wiki_orig, else will not pick up changed sizes / moved repos; DATE:2014-07-21 - usr_dlg.Prog_many("", "", "inserting xfer direct"); provider.Exec_sql(Sql_create_xfer_direct); - usr_dlg.Prog_many("", "", "inserting xfer redirect"); provider.Exec_sql(Sql_create_xfer_redirect); - usr_dlg.Prog_many("", "", "inserting orig direct"); provider.Exec_sql(Sql_create_orig_direct); - usr_dlg.Prog_many("", "", "inserting orig redirect"); provider.Exec_sql(Sql_create_orig_redirect); + usr_dlg.Prog_many("", "", "deleting wiki_orig"); conn.Exec_sql(Sql_delete_wiki_orig); // always delete wiki_orig, else will not pick up changed sizes / moved repos; DATE:2014-07-21 + usr_dlg.Prog_many("", "", "inserting xfer direct"); conn.Exec_sql(Sql_create_xfer_direct); + usr_dlg.Prog_many("", "", "inserting xfer redirect"); conn.Exec_sql(Sql_create_xfer_redirect); + usr_dlg.Prog_many("", "", "inserting orig direct"); conn.Exec_sql(Sql_create_orig_direct); + usr_dlg.Prog_many("", "", "inserting orig redirect"); conn.Exec_sql(Sql_create_orig_redirect); } private static final String Sql_delete_wiki_orig = "DELETE FROM wiki_orig;" diff --git a/400_xowa/src/gplx/xowa/files/wiki_orig/Xof_wiki_orig_tbl.java b/400_xowa/src/gplx/xowa/files/wiki_orig/Xof_wiki_orig_tbl.java index 665ed664d..b8f1414dd 100644 --- a/400_xowa/src/gplx/xowa/files/wiki_orig/Xof_wiki_orig_tbl.java +++ b/400_xowa/src/gplx/xowa/files/wiki_orig/Xof_wiki_orig_tbl.java @@ -18,46 +18,45 @@ along with this program. If not, see . package gplx.xowa.files.wiki_orig; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.files.fsdb.*; public class Xof_wiki_orig_tbl { - public static void Create_table(Db_provider p) { + public static void Create_table(Db_conn p) { Sqlite_engine_.Tbl_create(p, Tbl_name, Tbl_sql); Sqlite_engine_.Idx_create(p, Idx_key); } - public static void Select_list(Cancelable cancelable, Db_provider p, Xodb_ctx db_ctx, byte exec_tid, ListAdp itms, OrderedHash hash, Xof_url_bldr url_bldr, Xow_repo_mgr repo_mgr) { + public static void Select_list(Cancelable cancelable, Db_conn p, Xodb_ctx db_ctx, byte exec_tid, ListAdp itms, OrderedHash hash, Xof_url_bldr url_bldr, Xow_repo_mgr repo_mgr) { Xof_wiki_orig_tbl_in_wkr in_wkr = new Xof_wiki_orig_tbl_in_wkr(); in_wkr.Init(itms, hash); in_wkr.Select_in(p, cancelable, db_ctx, 0, itms.Count()); Xof_wiki_orig_tbl_evaluator.Rdr_done(exec_tid, itms, hash, url_bldr, repo_mgr); } - public static Xof_wiki_orig_itm Select_itm(Db_provider p, byte[] ttl) { - Xof_wiki_orig_itm rv = Xof_wiki_orig_itm.Null; + public static Xof_orig_regy_itm Select_itm(Db_conn p, byte[] ttl) { + Xof_orig_regy_itm rv = Xof_orig_regy_itm.Null; DataRdr rdr = Db_qry_.select_().From_(Tbl_name).Cols_all_().Where_(Db_crt_.eq_(String_.new_utf8_(ttl))).Exec_qry_as_rdr(p); - if (rdr.MoveNextPeer()) { - rv = Xof_wiki_orig_itm.load_(rdr); - } + if (rdr.MoveNextPeer()) + rv = Xof_orig_regy_itm.load_(rdr); rdr.Rls(); return rv; } - public static boolean Select_itm_exists(Db_provider p, byte[] ttl) { + public static boolean Select_itm_exists(Db_conn p, byte[] ttl) { Object o = Db_qry_.select_val_(Tbl_name, Fld_uid, Db_crt_.eq_(Fld_orig_ttl, String_.new_utf8_(ttl))).ExecRdr_val(p); return o != null; } - public static void Insert(Db_provider p, byte[] ttl, byte status, byte orig_repo, byte[] orig_redirect, int orig_ext, int orig_w, int orig_h) { + public static void Insert(Db_conn p, byte[] ttl, byte status, byte orig_repo, byte[] orig_redirect, int orig_ext, int orig_w, int orig_h) { Db_stmt stmt = Db_stmt_.Null; try { stmt = Xof_wiki_orig_tbl.Insert_stmt(p); Insert(stmt, ttl, status, orig_repo, orig_redirect, orig_ext, orig_w, orig_h); } finally {stmt.Rls();} } - public static Db_stmt Insert_stmt(Db_provider p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_orig_ttl, Fld_status, Fld_orig_repo, Fld_orig_ext, Fld_orig_w, Fld_orig_h, Fld_orig_redirect);} + public static Db_stmt Insert_stmt(Db_conn p) {return Db_stmt_.new_insert_(p, Tbl_name, Fld_orig_ttl, Fld_status, Fld_orig_repo, Fld_orig_ext, Fld_orig_w, Fld_orig_h, Fld_orig_redirect);} public static void Insert(Db_stmt stmt, byte[] ttl, byte status, byte orig_repo, byte[] orig_redirect, int orig_ext, int orig_w, int orig_h) { stmt.Clear() - .Val_str_by_bry_(ttl) - .Val_byte_(status) - .Val_byte_(orig_repo) - .Val_int_(orig_ext) - .Val_int_(orig_w) - .Val_int_(orig_h) - .Val_str_by_bry_(orig_redirect) + .Val_bry_as_str(ttl) + .Val_byte(status) + .Val_byte(orig_repo) + .Val_int(orig_ext) + .Val_int(orig_w) + .Val_int(orig_h) + .Val_bry_as_str(orig_redirect) .Exec_insert(); } public static final String Tbl_name = "wiki_orig" @@ -67,6 +66,7 @@ public class Xof_wiki_orig_tbl { private static final Db_idx_itm Idx_key = Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS wiki_orig__ttl ON wiki_orig (orig_ttl);") ; + public static final int Ord_uid = 0, Ord_orig_ttl = 1, Ord_status = 2, Ord_orig_repo = 3, Ord_orig_ext = 4, Ord_orig_w = 5, Ord_orig_h = 6, Ord_orig_redirect = 7; static final String Tbl_sql = String_.Concat_lines_nl ( "CREATE TABLE IF NOT EXISTS wiki_orig" , "( uid integer NOT NULL PRIMARY KEY AUTOINCREMENT" diff --git a/400_xowa/src/gplx/xowa/files/wiki_orig/Xof_wiki_orig_tbl_in_wkr.java b/400_xowa/src/gplx/xowa/files/wiki_orig/Xof_wiki_orig_tbl_in_wkr.java index 76ffd17bf..6af128215 100644 --- a/400_xowa/src/gplx/xowa/files/wiki_orig/Xof_wiki_orig_tbl_in_wkr.java +++ b/400_xowa/src/gplx/xowa/files/wiki_orig/Xof_wiki_orig_tbl_in_wkr.java @@ -34,13 +34,13 @@ class Xof_wiki_orig_tbl_in_wkr extends gplx.xowa.dbs.tbls.Xodb_in_wkr_base { @Override public void Fill_stmt(Db_stmt stmt, int bgn, int end) { for (int i = bgn; i < end; i++) { Xof_fsdb_itm itm = (Xof_fsdb_itm)itms_all.FetchAt(i); - stmt.Val_str_by_bry_(itm.Lnki_ttl()); + stmt.Val_bry_as_str(itm.Lnki_ttl()); } } @Override public void Eval_rslts(Cancelable cancelable, Xodb_ctx db_ctx, DataRdr rdr) { while (rdr.MoveNextPeer()) { if (cancelable.Canceled()) return; - Xof_wiki_orig_itm itm = Xof_wiki_orig_itm.load_(rdr); + Xof_orig_regy_itm itm = Xof_orig_regy_itm.load_(rdr); byte[] itm_ttl = itm.Ttl(); if (!itms_by_ttl.Has(itm_ttl)) // guard against dupes (shouldn't happen) itms_by_ttl.Add(itm_ttl, itm); @@ -55,12 +55,12 @@ class Xof_wiki_orig_tbl_evaluator { Xof_fsdb_itm fsdb_itm = (Xof_fsdb_itm)itms_all.FetchAt(i); byte[] fsdb_itm_ttl = fsdb_itm.Lnki_ttl(); fsdb_itm.Rslt_reg_(Xof_wiki_orig_wkr_.Tid_missing_reg); - Xof_wiki_orig_itm regy_itm = (Xof_wiki_orig_itm)itms_by_ttl.Fetch(fsdb_itm_ttl); if (regy_itm == null) continue; // not in reg; do full search + Xof_orig_regy_itm regy_itm = (Xof_orig_regy_itm)itms_by_ttl.Fetch(fsdb_itm_ttl); if (regy_itm == null) continue; // not in reg; do full search byte regy_itm_status = regy_itm.Status(); fsdb_itm.Lnki_ext_(Xof_ext_.new_by_id_(regy_itm.Orig_ext())); // overwrite ext_id with whatever's in file_orig; needed for ogg -> oga / ogv fsdb_itm.Rslt_reg_(regy_itm_status); if (regy_itm_status > Xof_wiki_orig_wkr_.Tid_found_orig) continue; // only ignore if marked missing; DATE:2014-02-01 - byte repo_id = regy_itm.Orig_repo(); + byte repo_id = regy_itm.Repo_tid(); Xof_repo_itm repo = null; if (repo_id <= Xof_repo_itm.Repo_local) { // bounds check fsdb_itm.Orig_repo_(repo_id); diff --git a/400_xowa/src/gplx/xowa/files/wiki_orig/Xof_wiki_orig_wkr_.java b/400_xowa/src/gplx/xowa/files/wiki_orig/Xof_wiki_orig_wkr_.java index 6b2e8177c..17395cf98 100644 --- a/400_xowa/src/gplx/xowa/files/wiki_orig/Xof_wiki_orig_wkr_.java +++ b/400_xowa/src/gplx/xowa/files/wiki_orig/Xof_wiki_orig_wkr_.java @@ -17,5 +17,5 @@ along with this program. If not, see . */ package gplx.xowa.files.wiki_orig; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; public class Xof_wiki_orig_wkr_ { - public static final byte Tid_null = Byte_.MaxValue_127, Tid_noop = 0, Tid_found_orig = 1, Tid_missing_reg = 2, Tid_missing_qry = 3, Tid_missing_bin = 4; + public static final byte Tid_null = Byte_.Max_value_127, Tid_noop = 0, Tid_found_orig = 1, Tid_missing_reg = 2, Tid_missing_qry = 3, Tid_missing_bin = 4; } diff --git a/400_xowa/src/gplx/xowa/gui/history/Xog_history_itm.java b/400_xowa/src/gplx/xowa/gui/history/Xog_history_itm.java index d3754bffd..f3487004e 100644 --- a/400_xowa/src/gplx/xowa/gui/history/Xog_history_itm.java +++ b/400_xowa/src/gplx/xowa/gui/history/Xog_history_itm.java @@ -37,6 +37,16 @@ public class Xog_history_itm { && redirect_force == comp.redirect_force ; } + public void Srl_save(Bry_bfr bfr) { + byte[] bmk_bry = Bry_.Replace(Bry_.new_utf8_(bmk_pos), Byte_ascii.Pipe, Byte_ascii.Tilde); // replace | with ~; EX: "0|1|2" -> "0~1~2" + bfr.Add(key).Add_byte_pipe().Add(bmk_bry).Add_byte_nl(); + } + public static Xog_history_itm Srl_load(byte[] raw) { + byte[][] atrs = Bry_.Split(raw, Byte_ascii.Pipe); + byte[] bmk_bry = atrs.length == 6 ? atrs[5] : Bry_.Empty; + bmk_bry = Bry_.Replace(bmk_bry, Byte_ascii.Tilde, Byte_ascii.Pipe); + return new Xog_history_itm(atrs[0], atrs[1], atrs[2], atrs[3], atrs[4] == Bool_.Y_bry, String_.new_ascii_(bmk_bry)); + } public static final String Html_doc_pos_toc = "top"; public static final Xog_history_itm Null = new Xog_history_itm(null, null, null, null, false, null); } diff --git a/400_xowa/src/gplx/xowa/gui/history/Xog_history_stack.java b/400_xowa/src/gplx/xowa/gui/history/Xog_history_stack.java index 7b25c987b..986531505 100644 --- a/400_xowa/src/gplx/xowa/gui/history/Xog_history_stack.java +++ b/400_xowa/src/gplx/xowa/gui/history/Xog_history_stack.java @@ -32,15 +32,15 @@ public class Xog_history_stack { } public Xog_history_itm Go_bwd() { if (list.Count() == 0) return Xog_history_itm.Null; + if (cur_pos == 0) return Xog_history_itm.Null; --cur_pos; - if (cur_pos < 0) cur_pos = 0; return this.Cur_itm(); } public Xog_history_itm Go_fwd() { int list_count = list.Count(); if (list_count == 0) return Xog_history_itm.Null; + if (cur_pos == list_count - 1) return Xog_history_itm.Null; ++cur_pos; - if (cur_pos == list_count) cur_pos = list_count - 1; return this.Cur_itm(); } private void Del_from(int from) { @@ -48,5 +48,22 @@ public class Xog_history_stack { if (from <= len - 1) list.Del_range(from, len - 1); } + public void Srl_save(Bry_bfr bfr) { + int len = list.Count(); + for (int i = 0; i < len; ++i) { + Xog_history_itm itm = (Xog_history_itm)list.FetchAt(i); + itm.Srl_save(bfr); + } + } + public void Srl_load(byte[] bry) { + list.Clear(); + byte[][] lines = Bry_.Split_lines(bry); + int len = lines.length; + for (int i = 0; i < len; ++i) { + byte[] line = lines[i]; + Xog_history_itm itm = Xog_history_itm.Srl_load(line); + this.Add(itm); + } + } public static final byte Nav_fwd = 1, Nav_bwd = 2, Nav_by_anchor = 3; } diff --git a/400_xowa/src/gplx/xowa/gui/history/Xog_history_stack_tst.java b/400_xowa/src/gplx/xowa/gui/history/Xog_history_stack_tst.java index 1a6c30d81..b0aecff20 100644 --- a/400_xowa/src/gplx/xowa/gui/history/Xog_history_stack_tst.java +++ b/400_xowa/src/gplx/xowa/gui/history/Xog_history_stack_tst.java @@ -28,7 +28,7 @@ public class Xog_history_stack_tst { @Test public void Add_3_bwd_add() {fxt.Exec_add_many("A", "B", "C").Exec_go_bwd().Exec_add_many("D").Test_len(3).Test_cur("D").Test_pos(2);} @Test public void Add_3_bwd_bwd_add() {fxt.Exec_add_many("A", "B", "C").Exec_go_bwd().Exec_go_bwd().Exec_add_many("D").Test_len(2).Test_cur("D").Test_pos(1);} @Test public void Add_dif_ns() {fxt.Exec_add_many("A", "Help:A").Test_cur("Help:A");} // PURPOSE.fix: page_stack was only differtiating by Page_db, not Full; EX: Unicode -> Category:Unicode - @Test public void Add_qargs() {// PURPOSE.fix: page_stack was only differtiating by qtxt args + @Test public void Add_qargs() {// PURPOSE.fix: page_stack was only differentiating by qtxt args fxt .Exec_add_one("Special:AllPages", "?from=A") .Exec_add_one("Special:AllPages", "?from=B") .Exec_add_many("B") diff --git a/400_xowa/src/gplx/xowa/gui/urls/Xog_url_wkr.java b/400_xowa/src/gplx/xowa/gui/urls/Xog_url_wkr.java index 5e6592f9d..fb4654142 100644 --- a/400_xowa/src/gplx/xowa/gui/urls/Xog_url_wkr.java +++ b/400_xowa/src/gplx/xowa/gui/urls/Xog_url_wkr.java @@ -140,7 +140,6 @@ public class Xog_url_wkr { if (tmp_ttl != null) page_bry = tmp_ttl.Full_db(); } - rv.Wiki_(wiki); rv.Wiki_bry_(wiki.Domain_bry()); // needed b/c url_parser.Parse(href) will result in wiki of "wiki" for "/wiki/Page" rv.Page_bry_(page_bry); rv.Anchor_bry_(anchor_bry); diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_launcher_tabs.java b/400_xowa/src/gplx/xowa/gui/views/Xog_launcher_tabs.java index 647448463..f3d6dd8bf 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_launcher_tabs.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_launcher_tabs.java @@ -58,8 +58,9 @@ class Xog_launcher_tabs { } } private void Launch_tab(Xog_win_itm win, Xow_wiki home_wiki, String launch_str) { - Xoa_url launch_url = Xoa_url_parser.Parse_from_url_bar(win.App(), home_wiki, launch_str); - Xow_wiki launch_wiki = launch_url.Wiki(); + Xoa_app app = win.App(); + Xoa_url launch_url = Xoa_url_parser.Parse_from_url_bar(app, home_wiki, launch_str); + Xow_wiki launch_wiki = app.Wiki_mgr().Get_by_key_or_null(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(Xoa_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/gui/views/Xog_tab_itm.java b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm.java index 616cbdca9..abeb37afd 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm.java @@ -107,7 +107,7 @@ public class Xog_tab_itm implements GfoInvkAble { app.Gui_mgr().Search_suggest_mgr().Cancel(); // cancel pending search_suggest calls app.Log_wtr().Queue_enabled_(true); usr_dlg.Clear(); - Xow_wiki wiki = url.Wiki(); + Xow_wiki wiki = app.Wiki_mgr().Get_by_key_or_null(url.Wiki_bry()); wiki.Init_assert(); // NOTE: assert wiki.Init before parsing; needed b/c lang (with lang-specific ns) is only loaded on init, and parse Xoa_ttl.parse_ will fail below; EX:pt.wikipedia.org/wiki/Wikipedia:P�gina principal Xoa_ttl ttl = Xoa_ttl.parse_(wiki, url.Page_bry()); if (ttl == null) {usr_dlg.Prog_one("", "", "title is invalid: ~{0}", String_.new_utf8_(url.Raw())); return;} @@ -145,7 +145,10 @@ public class Xog_tab_itm implements GfoInvkAble { if (page.Ttl().Anch_bgn() != Bry_.NotFound) page.Url().Anchor_bry_(page.Ttl().Anch_txt()); // NOTE: occurs when page is a redirect to an anchor; EX: w:Duck race -> Rubber duck#Races history_mgr.Add(page); Xog_tab_itm_read_mgr.Show_page(this, page, true); - if (app.Api_root().Usr().History().Enabled()) app.User().History_mgr().Add(page); + if (app.Api_root().Usr().History().Enabled()) { + app.User().History_mgr().Add(page); + app.User().Data_mgr().History_mgr().Update_async(app.Async_mgr(), ttl, url); + } usr_dlg.Prog_none("", "", "rendering html"); // win.Page__async__bgn(this); app.Thread_mgr().File_load_mgr().Add_at_end(new Load_files_wkr(this)).Run(); diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_win_itm.java b/400_xowa/src/gplx/xowa/gui/views/Xog_win_itm.java index acc0c22a0..f21557681 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_win_itm.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_win_itm.java @@ -247,6 +247,7 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj { Xow_wiki home_wiki = app.User().Wiki(); Xoa_ttl ttl = Xoa_ttl.parse_(home_wiki, Xoa_page_.Main_page_bry); // NOTE: must be Main_Page, not "" else Firefox Addon will fail; DATE:2014-03-13 Xoa_page new_page = Xoa_page.new_(home_wiki, ttl); + gplx.xowa.servers.Gxw_html_server.Assert_tab(app, new_page); // HACK: assert at least 1 tab for Firefox addon; DATE:2015-01-23 this.Active_page_(new_page); Xoa_url url = Xoa_url.blank_(); url = Xoa_url_parser.Parse_url(url, app, new_page.Wiki(), url_bry, 0, url_bry.length, true); @@ -257,14 +258,15 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj { public byte[] App__retrieve_by_href(String href, boolean output_html) {return App__retrieve_by_href(Xog_url_wkr.Exec_url(this, href), output_html);} // NOTE: used by drd private byte[] App__retrieve_by_href(Xoa_url url, boolean output_html) { if (url == null) return Bry_.new_ascii_("missing"); - Xoa_ttl ttl = Xoa_ttl.parse_(url.Wiki(), url.Page_bry()); - Xoa_page new_page = url.Wiki().GetPageByTtl(url, ttl); + Xow_wiki wiki = app.Wiki_mgr().Get_by_key_or_null(url.Wiki_bry()); + Xoa_ttl ttl = Xoa_ttl.parse_(wiki, url.Page_bry()); + Xoa_page new_page = wiki.GetPageByTtl(url, ttl); if (new_page.Missing()) {return Bry_.Empty;} Xog_tab_itm tab = tab_mgr.Active_tab(); tab.Page_(new_page); tab.History_mgr().Add(new_page); byte[] rv = output_html - ? url.Wiki().Html_mgr().Page_wtr_mgr().Gen(new_page, tab.View_mode()) + ? wiki.Html_mgr().Page_wtr_mgr().Gen(new_page, tab.View_mode()) : new_page.Data_raw() ; if (app.Shell().Fetch_page_exec_async()) diff --git a/400_xowa/src/gplx/xowa/hdumps/Xob_hdump_bldr.java b/400_xowa/src/gplx/xowa/hdumps/Xob_hdump_bldr.java index 736983df4..dd592c3e7 100644 --- a/400_xowa/src/gplx/xowa/hdumps/Xob_hdump_bldr.java +++ b/400_xowa/src/gplx/xowa/hdumps/Xob_hdump_bldr.java @@ -19,15 +19,15 @@ package gplx.xowa.hdumps; import gplx.*; import gplx.xowa.*; import gplx.dbs.*; import gplx.ios.*; import gplx.xowa.dbs.*; import gplx.xowa.dbs.tbls.*; import gplx.xowa.hdumps.saves.*; import gplx.xowa.hdumps.dbs.*; import gplx.xowa.hdumps.core.*; import gplx.xowa.html.hzips.*; public class Xob_hdump_bldr { private Xodb_fsys_mgr fsys_mgr; private Xodb_file core_db; private Xodb_xowa_db_tbl db_tbl; private Xodb_xowa_cfg_tbl cfg_tbl; private Db_stmt cfg_update_stmt; - private int hdump_db_id; private long hdump_db_size, hdump_db_max; private Db_provider hdump_db_provider; + private int hdump_db_id; private long hdump_db_size, hdump_db_max; private Db_conn hdump_db_provider; private Xodb_hdump_mgr hdump_mgr; private Hdump_save_mgr hdump_save_mgr; - public Xob_hdump_bldr(Xodb_mgr_sql db_mgr, Db_provider make_provider, long hdump_db_max) { + public Xob_hdump_bldr(Xodb_mgr_sql db_mgr, Db_conn make_provider, long hdump_db_max) { this.hdump_db_max = hdump_db_max; this.fsys_mgr = db_mgr.Fsys_mgr(); core_db = fsys_mgr.Get_tid_root(Xodb_file_tid.Tid_core); db_tbl = db_mgr.Tbl_xowa_db(); - cfg_tbl = new Xodb_xowa_cfg_tbl().Provider_(make_provider); cfg_update_stmt = cfg_tbl.Update_stmt(); - Xodb_hdump_mgr_setup.Assert_col__page_html_db_id(core_db.Provider(), cfg_tbl); + cfg_tbl = new Xodb_xowa_cfg_tbl().Conn_(make_provider); cfg_update_stmt = cfg_tbl.Update_stmt(); + Xodb_hdump_mgr_setup.Assert_col__page_html_db_id(core_db.Conn(), cfg_tbl); hdump_mgr = db_mgr.Hdump_mgr(); hdump_save_mgr = hdump_mgr.Save_mgr(); hdump_save_mgr.Hdump_stats_enable_y_(make_provider); } @@ -61,15 +61,15 @@ public class Xob_hdump_bldr { private void Db_init(Xodb_file db_file, long hdump_db_size) { this.hdump_db_id = db_file.Id(); this.hdump_db_size = hdump_db_size; - this.hdump_db_provider = db_file.Provider(); - this.hdump_save_mgr.Tbl().Provider_(hdump_db_provider); + this.hdump_db_provider = db_file.Conn(); + this.hdump_save_mgr.Tbl().Conn_(hdump_db_provider); } private static Xodb_file Db_make(Xodb_fsys_mgr fsys_mgr) { Xodb_file rv = fsys_mgr.Make(Xodb_file_tid.Tid_html); - rv.Provider().Exec_sql(Xodb_wiki_page_html_tbl.Tbl_sql); + rv.Conn().Exec_sql(Xodb_wiki_page_html_tbl.Tbl_sql); return rv; } - private static void Db_term(Xodb_file core_db_file, Db_provider hdump_db_provider, int hdump_db_id) { + private static void Db_term(Xodb_file core_db_file, Db_conn hdump_db_provider, int hdump_db_id) { hdump_db_provider.Txn_mgr().Txn_end_all(); // commit transactions Sqlite_engine_.Idx_create(hdump_db_provider, Xodb_wiki_page_html_tbl.Idx_core); // create index Sqlite_engine_.Db_attach(hdump_db_provider, "page_db", core_db_file.Url().Raw()); // update page_db.page with page_html_db_id @@ -77,7 +77,7 @@ public class Xob_hdump_bldr { hdump_db_provider.Exec_sql(String_.Format(Sql_update_page_html_db_id, hdump_db_id)); hdump_db_provider.Txn_mgr().Txn_end(); Sqlite_engine_.Db_detach(hdump_db_provider, "page_db"); - hdump_db_provider.Conn_term(); // release provider + hdump_db_provider.Conn_term(); // release conn } private static final String Cfg_grp_hdump_make = "hdump.make", Cfg_itm_hdump_size = "hdump.size"; private static final String Sql_update_page_html_db_id = String_.Concat_lines_nl_skip_last diff --git a/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr.java b/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr.java index d92158136..d589c6b30 100644 --- a/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr.java +++ b/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr.java @@ -18,6 +18,7 @@ along with this program. If not, see . package gplx.xowa.hdumps; import gplx.*; import gplx.xowa.*; import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.html.*; import gplx.xowa.gui.*; import gplx.xowa.hdumps.core.*; import gplx.xowa.hdumps.saves.*; import gplx.xowa.pages.*; import gplx.xowa.hdumps.loads.*; import gplx.xowa.hdumps.htmls.*; import gplx.xowa.hdumps.dbs.*; import gplx.xowa.html.hzips.*; +import gplx.xowa2.gui.*; public class Xodb_hdump_mgr { private Xodb_file hdump_db_file; private Xow_hzip_mgr hzip_mgr; public Xodb_hdump_mgr(Xow_wiki wiki) { @@ -39,8 +40,8 @@ public class Xodb_hdump_mgr { public int Html_db_id_default(int page_len) { return -1; } - public Db_provider Db_provider_by_page(int page_id) { - return text_tbl.Provider(); + public Db_conn Db_conn_by_page(int page_id) { + return text_tbl.Conn(); } public void Save_if_missing(Xoa_page page) { if (page.Revision_data().Html_db_id() == -1) Save(page); @@ -66,18 +67,18 @@ public class Xodb_hdump_mgr { hzip_mgr.Save(tmp_bfr, stats, page.Url().Xto_full_bry(), tmp_bfr.Xto_bry_and_clear()); page.Hdump_data().Body_(tmp_bfr.Xto_bry_and_clear()); hpg.Init(tmp_bfr, page); - } private Hdump_page hpg = new Hdump_page(); + } private Xog_page hpg = new Xog_page(); public void Load(Xow_wiki wiki, Xoa_page page, int html_db_id) { if (!Enabled_chk()) return; page.Root_(new Xop_root_tkn()); - Hdump_page hpg = new Hdump_page().Init(page.Revision_data().Id(), page.Url(), page.Ttl()); + Xog_page hpg = new Xog_page().Init(page.Revision_data().Id(), page.Url(), page.Ttl()); load_mgr.Load(hpg, wiki.Db_mgr_as_sql().Fsys_mgr(), html_db_id, page.Revision_data().Id(), page.Ttl()); Bry_bfr tmp_bfr = wiki.Utl_bry_bfr_mkr().Get_b512(); hzip_mgr.Load(tmp_bfr, page.Url().Xto_full_bry(), hpg.Page_body()); hpg.Page_body_(tmp_bfr.Mkr_rls().Xto_bry_and_clear()); Load_page(wiki, page, hpg); } - private void Load_page(Xow_wiki wiki, Xoa_page page, Hdump_page hpg) { + private void Load_page(Xow_wiki wiki, Xoa_page page, Xog_page hpg) { Bry_bfr tmp_bfr = wiki.Utl_bry_bfr_mkr().Get_m001(); html_mgr.Init_by_page(wiki.Domain_bry(), hpg).Write(tmp_bfr); page.Hdump_data().Body_(tmp_bfr.Xto_bry_and_clear()); diff --git a/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr__save_tst.java b/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr__save_tst.java index 0807aa312..b85b3dc8b 100644 --- a/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr__save_tst.java +++ b/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr__save_tst.java @@ -77,7 +77,7 @@ class Xodb_hdump_mgr__save_fxt extends Xodb_hdump_mgr__base_fxt { private ListAdp expd_rows = ListAdp_.new_(); @Override public void Clear_end() { hdump_mgr.Tbl_mem_(); - hdump_mgr.Text_tbl().Provider_(Xodb_wiki_page_html_tbl_mem.Null_provider); + hdump_mgr.Text_tbl().Conn_(Xodb_wiki_page_html_tbl_mem.Null_provider); init_redlinks = null; } public void Init_redlinks(int... uids) { diff --git a/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr__write_tst.java b/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr__write_tst.java index 2ac0466ef..acbe3b2c4 100644 --- a/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr__write_tst.java +++ b/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr__write_tst.java @@ -20,13 +20,13 @@ import org.junit.*; import gplx.xowa.files.*; import gplx.xowa.hdumps.core.*; import gplx.xowa.hdumps.dbs.*; import gplx.xowa.hdumps.pages.*; import gplx.xowa.xtns.hieros.*; import gplx.xowa.xtns.gallery.*; public class Xodb_hdump_mgr__write_tst { @Before public void init() {fxt.Clear();} private Xodb_hdump_mgr__write_fxt fxt = new Xodb_hdump_mgr__write_fxt(); - @Test public void Image_full() { - fxt.Expd_itms_xfers(fxt.Make_xfer("A.png", 0, 0, 0, Bool_.Y, Xof_ext_.Id_png)); - fxt.Test_write_all - ( "[[File:A.png|test_caption]]" - , "" - ); - } +// @Test public void Image_full() { +// fxt.Expd_itms_xfers(fxt.Make_xfer("A.png", 0, 0, 0, Bool_.Y, Xof_ext_.Id_png)); +// fxt.Test_write_all +// ( "[[File:A.png|test_caption]]" +// , "" +// ); +// } @Test public void Image_thumb() { // fxt.Expd_itms_xfers(fxt.Make_xfer("A.png", 0, 0, 0, Bool_.N, Xof_ext_.Id_png)); // fxt.Test_write_all diff --git a/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr_setup.java b/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr_setup.java index 5ac0df465..52a722a1c 100644 --- a/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr_setup.java +++ b/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr_setup.java @@ -23,33 +23,33 @@ public class Xodb_hdump_mgr_setup { Xodb_mgr_sql db_mgr_as_sql = wiki.Db_mgr_as_sql(); Xodb_file rv = db_mgr_as_sql.Fsys_mgr().Get_tid_root(Xodb_file_tid.Tid_html); if (rv == null) rv = Setup(db_mgr_as_sql); - hdump_mgr.Text_tbl().Provider_(rv.Provider()); + hdump_mgr.Text_tbl().Conn_(rv.Conn()); return rv; } private static Xodb_file Setup(Xodb_mgr_sql db_mgr) { Xodb_fsys_mgr fsys_mgr = db_mgr.Fsys_mgr(); - Assert_col__page_html_db_id(fsys_mgr.Provider_core(), db_mgr.Tbl_xowa_cfg()); + Assert_col__page_html_db_id(fsys_mgr.Conn_core(), db_mgr.Tbl_xowa_cfg()); Xodb_file html_db_file = Create_db(db_mgr, fsys_mgr); Create_idx(html_db_file); return html_db_file; } - public static void Assert_col__page_html_db_id(Db_provider core_provider, Xodb_xowa_cfg_tbl cfg_tbl) { + public static void Assert_col__page_html_db_id(Db_conn core_provider, Xodb_xowa_cfg_tbl cfg_tbl) { String val = cfg_tbl.Select_val_or(Xodb_fsys_mgr.Cfg_grp_db_meta, Cfg_itm_html_db_exists, "n"); if (String_.Eq(val, "y")) return; try { core_provider.Exec_sql(Sql_ddl__page_html_db_id); cfg_tbl.Insert_str(Xodb_fsys_mgr.Cfg_grp_db_meta, Cfg_itm_html_db_exists, "y"); - cfg_tbl.Provider().Txn_mgr().Txn_end_all_bgn_if_none(); - } catch (Exception e) {Gfo_usr_dlg_._.Warn_many("", "", "failed to update core: db=~{0} err=~{1}", core_provider.Conn_info().Str_raw(), Err_.Message_gplx(e));} + cfg_tbl.Conn().Txn_mgr().Txn_end_all_bgn_if_none(); + } catch (Exception e) {Gfo_usr_dlg_._.Warn_many("", "", "failed to update core: db=~{0} err=~{1}", core_provider.Url().Xto_raw(), Err_.Message_gplx(e));} } private static Xodb_file Create_db(Xodb_mgr_sql db_mgr, Xodb_fsys_mgr fsys_mgr) { Xodb_file html_db_file = fsys_mgr.Make(Xodb_file_tid.Tid_html); - html_db_file.Provider().Exec_sql(Xodb_wiki_page_html_tbl.Tbl_sql); - db_mgr.Tbl_xowa_db().Commit_all(fsys_mgr.Provider_core(), db_mgr.Fsys_mgr().Files_ary()); + html_db_file.Conn().Exec_sql(Xodb_wiki_page_html_tbl.Tbl_sql); + db_mgr.Tbl_xowa_db().Commit_all(fsys_mgr.Conn_core(), db_mgr.Fsys_mgr().Files_ary()); return html_db_file; } private static void Create_idx(Xodb_file html_db_file) { - Sqlite_engine_.Idx_create(html_db_file.Provider(), Xodb_wiki_page_html_tbl.Idx_core); + Sqlite_engine_.Idx_create(html_db_file.Conn(), Xodb_wiki_page_html_tbl.Idx_core); } private static final String Cfg_itm_html_db_exists = "html_db.exists"; public static final String diff --git a/400_xowa/src/gplx/xowa/hdumps/Xodbv_dbs_tbl.java b/400_xowa/src/gplx/xowa/hdumps/Xodbv_dbs_tbl.java index 68cd39241..26d469951 100644 --- a/400_xowa/src/gplx/xowa/hdumps/Xodbv_dbs_tbl.java +++ b/400_xowa/src/gplx/xowa/hdumps/Xodbv_dbs_tbl.java @@ -20,19 +20,19 @@ import gplx.dbs.*; import gplx.xowa.dbs.*; public class Xodbv_dbs_tbl { public static final String Tbl_name = "xowa_db", Fld_db_id = "db_id", Fld_db_type = "db_type", Fld_db_url = "db_url"; private static final String[] Flds__all = new String[] {Fld_db_id, Fld_db_type, Fld_db_url}; - public Xodb_file[] Select_all(Db_provider provider, Io_url wiki_root_dir) { + public Xodb_file[] Select_all(Db_conn conn, Io_url wiki_root_dir) { Db_rdr rdr = Db_rdr_.Null; ListAdp list = ListAdp_.new_(); try { Db_qry__select_in_tbl qry = Db_qry__select_in_tbl.new_(Tbl_name, Db_qry__select_in_tbl.Where_flds__all, Flds__all).Order_by_sql_(Fld_db_id); - Db_stmt stmt = Db_stmt_.new_select_as_rdr(provider, qry); + Db_stmt stmt = Db_stmt_.new_select_as_rdr(conn, qry); rdr = stmt.Exec_select_as_rdr(); while (rdr.Move_next()) { Xodb_file db = Xodb_file.load_(rdr.Read_int(0), rdr.Read_byte(1), rdr.Read_str(2)); db.Url_(wiki_root_dir.GenSubFil(db.Url_rel())); list.Add(db); } - } finally {rdr.Close();} + } finally {rdr.Rls();} Xodb_file[] rv = (Xodb_file[])list.Xto_ary(Xodb_file.class); Chk_sequential(rv); return rv; diff --git a/400_xowa/src/gplx/xowa/hdumps/Xodbv_page_tbl.java b/400_xowa/src/gplx/xowa/hdumps/Xodbv_page_tbl.java index d4278ccf9..ccf811f3a 100644 --- a/400_xowa/src/gplx/xowa/hdumps/Xodbv_page_tbl.java +++ b/400_xowa/src/gplx/xowa/hdumps/Xodbv_page_tbl.java @@ -18,28 +18,28 @@ along with this program. If not, see . package gplx.xowa.hdumps; import gplx.*; import gplx.xowa.*; import gplx.dbs.*; public class Xodbv_page_tbl { - public boolean Select_by_ttl(Xodb_page rv, Db_provider provider, Xow_ns ns, byte[] ttl) { + public boolean Select_by_ttl(Xodb_page rv, Db_conn conn, Xow_ns ns, byte[] ttl) { Db_rdr rdr = Db_rdr_.Null; Db_stmt stmt = Db_stmt_.Null; try { - stmt = Db_stmt_.new_select_as_rdr(provider, Db_qry__select_in_tbl.new_(Tbl_name, String_.Ary(Fld_page_ns, Fld_page_title), Select_by_id_flds__hdump)); - rdr = stmt.Val_int_(ns.Id()).Val_str_(String_.new_utf8_(ttl)).Exec_select_as_rdr(); + stmt = Db_stmt_.new_select_as_rdr(conn, Db_qry__select_in_tbl.new_(Tbl_name, String_.Ary(Fld_page_ns, Fld_page_title), Select_by_id_flds__hdump)); + rdr = stmt.Val_int(ns.Id()).Val_str(String_.new_utf8_(ttl)).Exec_select_as_rdr(); if (rdr.Move_next()) { Read_page__all(rv, rdr); return true; } - } finally {rdr.Close(); stmt.Rls();} + } finally {rdr.Rls(); stmt.Rls();} return false; } - public boolean Select_by_id(Xodb_page rv, Db_provider provider, int page_id) { + public boolean Select_by_id(Xodb_page rv, Db_conn conn, int page_id) { Db_rdr rdr = Db_rdr_.Null; Db_stmt stmt = Db_stmt_.Null; try { - stmt = Db_stmt_.new_select_as_rdr(provider, Db_qry__select_in_tbl.new_(Tbl_name, String_.Ary(Fld_page_id), Select_by_id_flds__hdump)); - rdr = stmt.Val_int_(page_id).Exec_select_as_rdr(); + stmt = Db_stmt_.new_select_as_rdr(conn, Db_qry__select_in_tbl.new_(Tbl_name, String_.Ary(Fld_page_id), Select_by_id_flds__hdump)); + rdr = stmt.Val_int(page_id).Exec_select_as_rdr(); if (rdr.Move_next()) { Read_page__all(rv, rdr); return true; } - } finally {rdr.Close(); stmt.Rls();} + } finally {rdr.Rls(); stmt.Rls();} return false; } public static void Read_page__all(Xodb_page page, Db_rdr rdr) { diff --git a/400_xowa/src/gplx/xowa/hdumps/Xowd_hdump_mgr.java b/400_xowa/src/gplx/xowa/hdumps/Xowd_hdump_mgr.java index 9bb41bb5e..868d44c62 100644 --- a/400_xowa/src/gplx/xowa/hdumps/Xowd_hdump_mgr.java +++ b/400_xowa/src/gplx/xowa/hdumps/Xowd_hdump_mgr.java @@ -18,8 +18,9 @@ along with this program. If not, see . package gplx.xowa.hdumps; import gplx.*; import gplx.xowa.*; import gplx.intl.*; import gplx.dbs.*; import gplx.xowa.html.hzips.*; import gplx.xowa.hdumps.core.*; import gplx.xowa.hdumps.loads.*; import gplx.xowa.hdumps.htmls.*; import gplx.xowa.apps.fsys.*; +import gplx.xowa2.apps.*; import gplx.xowa2.wikis.*; import gplx.xowa2.wikis.data.*; import gplx.xowa2.gui.*; public class Xowd_hdump_mgr { - private final Xoav_app app; private final Xowv_wiki wiki; private final Xowv_db_mgr wiki_db_mgr; + private final Xoav_app app; private final Xowv_wiki wiki; private final Xodata_db_mgr wiki_db_mgr; private Xodb_page dbpg = new Xodb_page(); private Hdump_load_mgr load_mgr = new Hdump_load_mgr(); private Hdump_html_body html_body = new Hdump_html_body(); @@ -27,22 +28,21 @@ public class Xowd_hdump_mgr { this.app = app; this.wiki = wiki; this.wiki_db_mgr = wiki.Db_mgr(); html_body.Init_by_app(app.Usr_dlg(), app.Fsys_mgr(), app.Utl_encoder_fsys()); } - public void Load(Hdump_page rv, byte[] ttl_bry) { - Xoa_ttl ttl = wiki.Ttl_parse(ttl_bry); - wiki_db_mgr.Tbl_mgr().Tbl__page().Select_by_ttl(dbpg, app.Db_mgr().Get(wiki_db_mgr.Key__core()), ttl.Ns(), ttl.Page_db()); + public void Get_by_ttl(Xog_page rv, Gfo_url url, Xoa_ttl ttl) { + wiki_db_mgr.Tbl_page_regy().Select_by_ttl(dbpg, ttl.Ns(), ttl.Page_db()); if (dbpg.Redirect_id() != -1) Select_by_id(rv, dbpg); if (dbpg.Html_db_id() == -1) return; // should return "not found" message - load_mgr.Load2(rv, app.Db_mgr().Get(wiki_db_mgr.Key_by_idx(dbpg.Html_db_id())), dbpg.Id(), ttl); + load_mgr.Load2(rv, Db_conn_pool.I.Get_or_new(wiki_db_mgr.Key_by_idx(dbpg.Html_db_id())), dbpg.Id(), ttl); Bry_bfr bfr = app.Utl_bfr_mkr().Get_m001(); html_body.Init_by_page(wiki.Domain_bry(), rv).Write(bfr); - wiki.Hzip_mgr().Load(bfr, ttl_bry, bfr.Xto_bry_and_clear()); + wiki.Hzip_mgr().Load(bfr, ttl.Page_db(), bfr.Xto_bry_and_clear()); rv.Page_body_(bfr.Mkr_rls().Xto_bry_and_clear()); } - private void Select_by_id(Hdump_page hpg, Xodb_page dbpg) { + private void Select_by_id(Xog_page hpg, Xodb_page dbpg) { int redirect_count = 0; while (redirect_count < 5) { int redirect_id = dbpg.Redirect_id(); - wiki_db_mgr.Tbl_mgr().Tbl__page().Select_by_id(dbpg, app.Db_mgr().Get(wiki_db_mgr.Key__core()), redirect_id); + wiki_db_mgr.Tbl_page_regy().Select_by_id(dbpg, redirect_id); if (redirect_id == -1) break; } } diff --git a/400_xowa/src/gplx/xowa/hdumps/core/Hdump_img_bldr.java b/400_xowa/src/gplx/xowa/hdumps/core/Hdump_img_bldr.java index 16ce7e1f5..c170d0296 100644 --- a/400_xowa/src/gplx/xowa/hdumps/core/Hdump_img_bldr.java +++ b/400_xowa/src/gplx/xowa/hdumps/core/Hdump_img_bldr.java @@ -17,6 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.hdumps.core; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; import gplx.dbs.*; import gplx.xowa.hdumps.dbs.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.oimgs.*; +import gplx.xowa2.gui.*; class Hdump_img_bldr_cmd extends Xob_itm_basic_base implements Xob_cmd { private Xodb_wiki_page_html_tbl text_tbl = new Xodb_wiki_page_html_tbl(); public Hdump_img_bldr_cmd(Xob_bldr bldr, Xow_wiki wiki) {this.Cmd_ctor(bldr, wiki);} @@ -28,8 +29,8 @@ class Hdump_img_bldr_cmd extends Xob_itm_basic_base implements Xob_cmd { public void Cmd_print() {} private void Exec_main() { Bry_bfr bfr = Bry_bfr.reset_(Io_mgr.Len_mb); - Db_provider provider = Xodb_db_file.init__file_make(wiki.Fsys_mgr().Root_dir()).Provider(); - Db_stmt stmt = Db_stmt_.new_select_as_rdr(provider, Sql_select); + Db_conn conn = Xodb_db_file.init__file_make(wiki.Fsys_mgr().Root_dir()).Conn(); + Db_stmt stmt = Db_stmt_.new_select_as_rdr(conn, Sql_select); Db_rdr rdr = stmt.Exec_select_as_rdr(); int cur_page_id = -1; while (rdr.Move_next()) { @@ -80,9 +81,9 @@ interface Page_async_cmd { void Exec(); } class Page_async_cmd__img implements Page_async_cmd { - private Hdump_page hpg; + private Xog_page hpg; private ListAdp missing = ListAdp_.new_(); - public Page_async_cmd__img(Hdump_page hpg) {this.hpg = hpg;} + public Page_async_cmd__img(Xog_page hpg) {this.hpg = hpg;} public void Prep() { int len = hpg.Img_count(); Hdump_data_img__base[] ary = hpg.Img_itms(); diff --git a/400_xowa/src/gplx/xowa/hdumps/core/Xob_lnki_regy_mgr.java b/400_xowa/src/gplx/xowa/hdumps/core/Xob_lnki_regy_mgr.java index 459c894c4..77adadda8 100644 --- a/400_xowa/src/gplx/xowa/hdumps/core/Xob_lnki_regy_mgr.java +++ b/400_xowa/src/gplx/xowa/hdumps/core/Xob_lnki_regy_mgr.java @@ -23,7 +23,7 @@ class Redlink_regy_mgr { private Rl_dump_tbl dump_tbl = new Rl_dump_tbl(); private Db_stmt dump_insert; private int itm_count, itm_max = 10000000; public void Init_by_wiki(Xodb_db_file make) { - dump_insert = dump_tbl.Insert_stmt(make.Provider()); + dump_insert = dump_tbl.Insert_stmt(make.Conn()); } public void Page_bgn(int page_id) {this.page_id = page_id;} private int page_id; public void Add(int uid, int ns_id, byte[] ttl) { @@ -108,7 +108,7 @@ class Redlink_wkr { while (!rdr.Pos_is_eos()) { int page_id = rdr.Read_int_to_comma(); int html_uid = rdr.Read_int_to_semic(); - stmt.Val_int_(page_id).Val_int_(html_uid).Val_int_(lnki_id).Exec_insert(); + stmt.Val_int(page_id).Val_int(html_uid).Val_int(lnki_id).Exec_insert(); } } } @@ -181,9 +181,9 @@ ORDER BY page_id, html_uid ; */ class Rl_dump_tbl { - public Db_stmt Insert_stmt(Db_provider provider) {return Db_stmt_.new_insert_(provider, Tbl_name, Fld_lnki_ns, Fld_lnki_ttl, Fld_page_ids);} + public Db_stmt Insert_stmt(Db_conn conn) {return Db_stmt_.new_insert_(conn, Tbl_name, Fld_lnki_ns, Fld_lnki_ttl, Fld_page_ids);} public void Insert(Db_stmt stmt, int lnki_ns, byte[] lnki_ttl, byte[] page_ids) { - stmt.Val_int_(lnki_ns).Val_str_by_bry_(lnki_ttl).Val_bry_(page_ids).Exec_insert(); + stmt.Val_int(lnki_ns).Val_bry_as_str(lnki_ttl).Val_bry(page_ids).Exec_insert(); } public static final String Tbl_name = "rl_dump", Fld_lnki_ns = "lnki_ns", Fld_lnki_ttl = "lnki_ttl", Fld_page_ids = "page_ids"; public static final String Tbl_sql = String_.Concat_lines_crlf_skipLast diff --git a/400_xowa/src/gplx/xowa/hdumps/dbs/Xodb_wiki_page_html_tbl.java b/400_xowa/src/gplx/xowa/hdumps/dbs/Xodb_wiki_page_html_tbl.java index 4768262d8..56e228c82 100644 --- a/400_xowa/src/gplx/xowa/hdumps/dbs/Xodb_wiki_page_html_tbl.java +++ b/400_xowa/src/gplx/xowa/hdumps/dbs/Xodb_wiki_page_html_tbl.java @@ -24,25 +24,25 @@ public class Xodb_wiki_page_html_tbl { this.zip_mgr = wiki.App().Zip_mgr(); } public byte Zip_tid() {return zip_tid;} public void Zip_tid_(byte v) {zip_tid = v;} private byte zip_tid = Io_stream_.Tid_gzip; - public Db_provider Provider() {return provider;} public Xodb_wiki_page_html_tbl Provider_(Db_provider v) {this.Rls_all(); provider = v; return this;} private Db_provider provider; + public Db_conn Conn() {return conn;} public Xodb_wiki_page_html_tbl Conn_(Db_conn v) {this.Rls_all(); conn = v; return this;} private Db_conn conn; @gplx.Virtual public int Insert(int page_id, int tid, byte[] data) { - if (stmt_insert == null) stmt_insert = Db_stmt_.new_insert_(provider, Tbl_name, Flds__all); + if (stmt_insert == null) stmt_insert = Db_stmt_.new_insert_(conn, Tbl_name, Flds__all); try { data = zip_mgr.Zip(zip_tid, data); - stmt_insert.Clear().Val_int_(page_id).Val_int_(tid).Val_bry_(data).Exec_insert(); + stmt_insert.Clear().Val_int(page_id).Val_int(tid).Val_bry(data).Exec_insert(); return data.length; } catch (Exception exc) {stmt_insert = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail } @gplx.Virtual public void Delete(int page_id) { - if (stmt_delete == null) stmt_delete = Db_stmt_.new_delete_(provider, Tbl_name, Fld_page_id); - try {stmt_delete.Clear().Val_int_(page_id).Exec_delete();} + if (stmt_delete == null) stmt_delete = Db_stmt_.new_delete_(conn, Tbl_name, Fld_page_id); + try {stmt_delete.Clear().Val_int(page_id).Exec_delete();} catch (Exception exc) {stmt_delete = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail } @gplx.Virtual public void Select_by_page(ListAdp rv, int page_id) { - if (stmt_select == null) stmt_select = Db_stmt_.new_select_as_rdr(provider, Db_qry__select_in_tbl.new_(Tbl_name, String_.Ary(Fld_page_id), Flds__all)); + if (stmt_select == null) stmt_select = Db_stmt_.new_select_as_rdr(conn, Db_qry__select_in_tbl.new_(Tbl_name, String_.Ary(Fld_page_id), Flds__all)); try { - Db_rdr rdr = stmt_select.Clear().Val_int_(page_id).Exec_select_as_rdr(); + Db_rdr rdr = stmt_select.Clear().Val_int(page_id).Exec_select_as_rdr(); while (rdr.Move_next()) { Xodb_wiki_page_html_row row = new Xodb_wiki_page_html_row ( rdr.Read_int(0) @@ -51,7 +51,7 @@ public class Xodb_wiki_page_html_tbl { ); rv.Add(row); } - rdr.Close(); + rdr.Rls(); } catch (Exception exc) {stmt_select = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail } @@ -59,7 +59,7 @@ public class Xodb_wiki_page_html_tbl { if (stmt_select != null) {stmt_select.Rls(); stmt_select = null;} if (stmt_insert != null) {stmt_insert.Rls(); stmt_insert = null;} if (stmt_delete != null) {stmt_delete.Rls(); stmt_delete = null;} - provider = null; + conn = null; } public static final String Tbl_name = "wiki_page_html", Fld_page_id = "page_id", Fld_html_tid = "html_tid", Fld_html_data = "html_data"; private static final String[] Flds__all = new String[] {Fld_page_id, Fld_html_tid, Fld_html_data}; diff --git a/400_xowa/src/gplx/xowa/hdumps/dbs/Xodb_wiki_page_html_tbl_mem.java b/400_xowa/src/gplx/xowa/hdumps/dbs/Xodb_wiki_page_html_tbl_mem.java index a9ab0a3b2..c7fc91fa3 100644 --- a/400_xowa/src/gplx/xowa/hdumps/dbs/Xodb_wiki_page_html_tbl_mem.java +++ b/400_xowa/src/gplx/xowa/hdumps/dbs/Xodb_wiki_page_html_tbl_mem.java @@ -41,5 +41,5 @@ public class Xodb_wiki_page_html_tbl_mem extends Xodb_wiki_page_html_tbl { priv } return rv; } - public static final Db_provider Null_provider = null; + public static final Db_conn Null_provider = null; } diff --git a/400_xowa/src/gplx/xowa/hdumps/htmls/Hdump_html_body.java b/400_xowa/src/gplx/xowa/hdumps/htmls/Hdump_html_body.java index 21f2558ad..f10fd634d 100644 --- a/400_xowa/src/gplx/xowa/hdumps/htmls/Hdump_html_body.java +++ b/400_xowa/src/gplx/xowa/hdumps/htmls/Hdump_html_body.java @@ -17,10 +17,11 @@ along with this program. If not, see . */ package gplx.xowa.hdumps.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; import gplx.core.brys.*; import gplx.core.btries.*; import gplx.html.*; import gplx.xowa.html.*; import gplx.xowa.files.*; -import gplx.xowa.apps.fsys.*; import gplx.xowa.hdumps.core.*; import gplx.xowa.html.lnkis.*; import gplx.xowa.xtns.gallery.*; +import gplx.xowa.apps.fsys.*; import gplx.xowa.hdumps.core.*; import gplx.xowa.html.lnkis.*; import gplx.xowa.xtns.gallery.*; +import gplx.xowa2.gui.*; public class Hdump_html_body { private Bry_bfr tmp_bfr = Bry_bfr.reset_(255); private Bry_rdr bry_rdr = new Bry_rdr(); private Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_._; - private Hdump_page hpg; private Xoh_cfg_file cfg_file; private Xof_url_bldr url_bldr = Xof_url_bldr.new_v2_(); private Xoh_file_html_fmtr__base html_fmtr; + private Xog_page hpg; private Xoh_cfg_file cfg_file; private Xof_url_bldr url_bldr = Xof_url_bldr.new_v2_(); private Xoh_file_html_fmtr__base html_fmtr; private byte[] root_dir, file_dir, file_dir_comm, file_dir_wiki, hiero_img_dir; public Hdump_html_body Init_by_app(Gfo_usr_dlg usr_dlg, Xoa_fsys_mgr fsys_mgr, Url_encoder fsys_encoder) { this.usr_dlg = usr_dlg; @@ -31,7 +32,7 @@ public class Hdump_html_body { this.html_fmtr = Xoh_file_html_fmtr__hdump.Base; return this; } - public Hdump_html_body Init_by_page(byte[] domain_bry, Hdump_page hpg) { + public Hdump_html_body Init_by_page(byte[] domain_bry, Xog_page hpg) { this.hpg = hpg; file_dir_comm = tmp_bfr.Add(file_dir).Add(Xow_wiki_.Domain_commons_bry).Add_byte_slash().Xto_bry_and_clear(); file_dir_wiki = tmp_bfr.Add(file_dir).Add(domain_bry).Add_byte_slash().Xto_bry_and_clear(); @@ -61,7 +62,7 @@ public class Hdump_html_body { } if (rng_bgn != -1) bfr.Add_mid(src, rng_bgn, len); } - private int Write_data(Bry_bfr bfr, Xoh_file_html_fmtr__base fmtr, Hdump_page hpg, byte[] src, Hdump_data_img__base[] imgs, int imgs_len, int uid_bgn, Hdump_html_fmtr_itm itm) { + private int Write_data(Bry_bfr bfr, Xoh_file_html_fmtr__base fmtr, Xog_page hpg, byte[] src, Hdump_data_img__base[] imgs, int imgs_len, int uid_bgn, Hdump_html_fmtr_itm itm) { bry_rdr.Pos_(uid_bgn); int uid = itm.Subst_end_byte() == Byte_ascii.Nil ? -1 : bry_rdr.Read_int_to(itm.Subst_end_byte()); int uid_end = bry_rdr.Pos(); // set uid_end after subst_end @@ -126,7 +127,7 @@ public class Hdump_html_body { } return rv; } - private int Write_redlink(Bry_bfr bfr, Hdump_page hpg, int uid, int rv) { + private int Write_redlink(Bry_bfr bfr, Xog_page hpg, int uid, int rv) { int[] redlink_uids = hpg.Redlink_uids(); if (redlink_uids == null) return rv; int redlink_uid_max = redlink_uids.length; if (uid < redlink_uid_max && redlink_uids[uid] == 1) diff --git a/400_xowa/src/gplx/xowa/hdumps/htmls/Hdump_html_mgr_tst.java b/400_xowa/src/gplx/xowa/hdumps/htmls/Hdump_html_mgr_tst.java index e9a817eb0..28c35c41a 100644 --- a/400_xowa/src/gplx/xowa/hdumps/htmls/Hdump_html_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/hdumps/htmls/Hdump_html_mgr_tst.java @@ -17,6 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.hdumps.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; import org.junit.*; import gplx.xowa.hdumps.core.*; import gplx.xowa.hdumps.dbs.*; import gplx.xowa.files.*; +import gplx.xowa2.gui.*; public class Hdump_html_mgr_tst { @Before public void init() { fxt.Clear(); @@ -105,7 +106,7 @@ class Hdump_html_mgr_fxt { private Bry_bfr bfr = Bry_bfr.reset_(255); private ListAdp img_list = ListAdp_.new_(); private Xow_wiki wiki; - public Hdump_page Hpg() {return hpg;} private Hdump_page hpg = new Hdump_page(); + public Xog_page Hpg() {return hpg;} private Xog_page hpg = new Xog_page(); public void Clear() { Xoa_app app = Xoa_app_fxt.app_(); wiki = Xoa_app_fxt.wiki_tst_(app); diff --git a/400_xowa/src/gplx/xowa/hdumps/loads/Hdump_load_mgr.java b/400_xowa/src/gplx/xowa/hdumps/loads/Hdump_load_mgr.java index 73c4cb817..a3ac7094a 100644 --- a/400_xowa/src/gplx/xowa/hdumps/loads/Hdump_load_mgr.java +++ b/400_xowa/src/gplx/xowa/hdumps/loads/Hdump_load_mgr.java @@ -18,21 +18,22 @@ along with this program. If not, see . package gplx.xowa.hdumps.loads; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; import gplx.core.brys.*; import gplx.core.btries.*; import gplx.dbs.*; import gplx.ios.*; import gplx.xowa.dbs.*; import gplx.xowa.pages.*; import gplx.xowa.hdumps.core.*; import gplx.xowa.hdumps.dbs.*; import gplx.xowa.hdumps.pages.*; import gplx.xowa.pages.skins.*; import gplx.xowa.hdumps.srls.*; +import gplx.xowa2.gui.*; public class Hdump_load_mgr { private Xodb_wiki_page_html_tbl text_tbl = new Xodb_wiki_page_html_tbl(); private Bry_rdr rdr = new Bry_rdr(); private ListAdp tmp_rows = ListAdp_.new_(), img_itms = ListAdp_.new_(); public Hdump_load_mgr() {} public void Zip_tid_(byte v) {text_tbl.Zip_tid_(v);} - public void Load2(Hdump_page hpg, Db_provider provider, int page_id, Xoa_ttl page_ttl) { - text_tbl.Provider_(provider).Select_by_page(tmp_rows, page_id); + public void Load2(Xog_page hpg, Db_conn conn, int page_id, Xoa_ttl page_ttl) { + text_tbl.Conn_(conn).Select_by_page(tmp_rows, page_id); Load_rows(hpg, page_id, Xoa_url.blank_(), page_ttl, tmp_rows); } - public void Load(Hdump_page hpg, Xodb_fsys_mgr db_fsys_mgr, int html_db_id, int page_id, Xoa_ttl page_ttl) { - Db_provider provider = db_fsys_mgr.Get_by_idx(html_db_id).Provider(); - text_tbl.Provider_(provider).Select_by_page(tmp_rows, page_id); + public void Load(Xog_page hpg, Xodb_fsys_mgr db_fsys_mgr, int html_db_id, int page_id, Xoa_ttl page_ttl) { + Db_conn conn = db_fsys_mgr.Get_by_idx(html_db_id).Conn(); + text_tbl.Conn_(conn).Select_by_page(tmp_rows, page_id); Load_rows(hpg, page_id, hpg.Page_url(), page_ttl, tmp_rows); } - public void Load_rows(Hdump_page hpg, int page_id, Xoa_url page_url, Xoa_ttl page_ttl, ListAdp rows) { + public void Load_rows(Xog_page hpg, int page_id, Xoa_url page_url, Xoa_ttl page_ttl, ListAdp rows) { hpg.Init(page_id, page_url, page_ttl); img_itms.Clear(); int len = rows.Count(); @@ -45,7 +46,7 @@ public class Hdump_load_mgr { } rows.Clear(); } private Hpg_srl_mgr srl_mgr = Hpg_srl_mgr._i_; - public void Load_data(Hdump_page hpg, Xodb_wiki_page_html_row row) { + public void Load_data(Xog_page hpg, Xodb_wiki_page_html_row row) { rdr.Src_(row.Data()); while (!rdr.Pos_is_eos()) { int tid = rdr.Read_int_to_pipe(); @@ -78,14 +79,14 @@ public class Hdump_load_mgr { rdr.Pos_add_one(); img_itms.Add(img_itm); } - public void Load_data_redlink(Hdump_page hpg) { + public void Load_data_redlink(Xog_page hpg) { int len = rdr.Read_int_to_pipe(); int[] redlink_uids = new int[len]; for (int i = 0; i < len; ++i) redlink_uids[i] = rdr.Read_int_to_pipe(); hpg.Redlink_uids_(redlink_uids); } - public void Load_data_gallery(Hdump_page hpg) { + public void Load_data_gallery(Xog_page hpg) { int uid = rdr.Read_int_to_pipe(); int box_max = rdr.Read_int_to_pipe(); hpg.Gly_itms().Add(uid, new Hdump_data_gallery(uid, box_max)); diff --git a/400_xowa/src/gplx/xowa/hdumps/loads/Hdump_load_mgr_tst.java b/400_xowa/src/gplx/xowa/hdumps/loads/Hdump_load_mgr_tst.java index ddc5b6b32..8dcbe0713 100644 --- a/400_xowa/src/gplx/xowa/hdumps/loads/Hdump_load_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/hdumps/loads/Hdump_load_mgr_tst.java @@ -17,6 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.hdumps.loads; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; import org.junit.*; import gplx.xowa.files.*; import gplx.xowa.hdumps.dbs.*; import gplx.xowa.hdumps.core.*; import gplx.xowa.hdumps.saves.*; import gplx.xowa.hdumps.pages.*; import gplx.xowa.dbs.*; +import gplx.xowa2.gui.*; public class Hdump_load_mgr_tst { @Before public void init() {fxt.Clear();} private Hdump_load_mgr_fxt fxt = new Hdump_load_mgr_fxt(); // @Test public void Body() { @@ -44,7 +45,7 @@ public class Hdump_load_mgr_tst { } class Hdump_load_mgr_fxt { private Hdump_load_mgr load_mgr; - private Hdump_page hpg = new Hdump_page(); + private Xog_page hpg = new Xog_page(); private ListAdp init_rows = ListAdp_.new_(); private String expd_body, expd_display_ttl, expd_content_sub, expd_sidebar_div; private ListAdp expd_imgs = ListAdp_.new_(); diff --git a/400_xowa/src/gplx/xowa/hdumps/loads/Hdump_page_body_srl.java b/400_xowa/src/gplx/xowa/hdumps/loads/Hdump_page_body_srl.java index 4fead4441..c08937acd 100644 --- a/400_xowa/src/gplx/xowa/hdumps/loads/Hdump_page_body_srl.java +++ b/400_xowa/src/gplx/xowa/hdumps/loads/Hdump_page_body_srl.java @@ -18,6 +18,7 @@ along with this program. If not, see . package gplx.xowa.hdumps.loads; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; import gplx.core.brys.*; import gplx.xowa.pages.*; import gplx.xowa.hdumps.core.*; import gplx.xowa.hdumps.pages.*; import gplx.xowa.pages.skins.*; import gplx.xowa.html.modules.*; +import gplx.xowa2.gui.*; public class Hdump_page_body_srl { private static final Bry_bfr tmp_bfr = Bry_bfr.reset_(255); public static void Save(Bry_bfr bfr, Xoa_page page) { @@ -39,14 +40,14 @@ public class Hdump_page_body_srl { Save_html_modules__itm(tmp_bfr, module_mgr.Itm_hiero().Enabled()); Save_data(bfr, Tid_html_module, tmp_bfr.Xto_bry_and_clear()); } - public static void Load_html_modules(Hdump_page hpg, byte[] src, int bgn, int end) { + public static void Load_html_modules(Xog_page hpg, byte[] src, int bgn, int end) { Hdump_module_mgr module_mgr = hpg.Module_mgr(); module_mgr.Math_exists_ (src[bgn + 0] == Byte_ascii.Ltr_y); module_mgr.Imap_exists_ (src[bgn + 2] == Byte_ascii.Ltr_y); module_mgr.Gallery_packed_exists_ (src[bgn + 4] == Byte_ascii.Ltr_y); module_mgr.Hiero_exists_ (src[bgn + 6] == Byte_ascii.Ltr_y); } - public static void Load_html_modules(Xoh_module_mgr page_module_mgr, Hdump_page hpg) { + public static void Load_html_modules(Xoh_module_mgr page_module_mgr, Xog_page hpg) { Hdump_module_mgr dump_module_mgr = hpg.Module_mgr(); page_module_mgr.Itm_mathjax().Enabled_ (dump_module_mgr.Math_exists()); page_module_mgr.Itm_popups().Bind_hover_area_ (dump_module_mgr.Imap_exists()); @@ -80,7 +81,7 @@ public class Hdump_page_body_srl { bfr.Add(data); } } - public static void Load(Hdump_page hpg, Bry_rdr rdr, byte[] src) { + public static void Load(Xog_page hpg, Bry_rdr rdr, byte[] src) { rdr.Src_(src); Load_body_meta(hpg, rdr); while (!rdr.Pos_is_eos()) { @@ -102,7 +103,7 @@ public class Hdump_page_body_srl { } } } private static final byte[] Sect_lhs = Bry_.new_ascii_(""); - private static void Load_body_meta(Hdump_page hpg, Bry_rdr rdr) { + private static void Load_body_meta(Xog_page hpg, Bry_rdr rdr) { hpg.Version_id_(rdr.Read_int_to_pipe()); hpg.Img_count_(rdr.Read_int_to_nl()); } diff --git a/400_xowa/src/gplx/xowa/hdumps/saves/Hdump_save_mgr.java b/400_xowa/src/gplx/xowa/hdumps/saves/Hdump_save_mgr.java index a0237217a..bd2c833d6 100644 --- a/400_xowa/src/gplx/xowa/hdumps/saves/Hdump_save_mgr.java +++ b/400_xowa/src/gplx/xowa/hdumps/saves/Hdump_save_mgr.java @@ -18,6 +18,7 @@ along with this program. If not, see . package gplx.xowa.hdumps.saves; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; import gplx.dbs.*; import gplx.xowa.files.*; import gplx.xowa.hdumps.dbs.*; import gplx.xowa.hdumps.srls.*; import gplx.xowa.html.hzips.*; import gplx.xowa.hdumps.core.*; import gplx.xowa.hdumps.pages.*; import gplx.xowa.pages.*; import gplx.xowa.pages.skins.*; import gplx.xowa.hdumps.loads.*; +import gplx.xowa2.gui.*; public class Hdump_save_mgr { private Bry_bfr tmp_bfr = Bry_bfr.reset_(1 * Io_mgr.Len_mb); private Xow_hzip_stats hzip_stats = new Xow_hzip_stats(); public Xodb_wiki_page_html_tbl Tbl() {return text_tbl;} public void Tbl_(Xodb_wiki_page_html_tbl v) {text_tbl = v;} private Xodb_wiki_page_html_tbl text_tbl; @@ -26,7 +27,7 @@ public class Hdump_save_mgr { text_tbl.Delete(page_id); this.Insert(page, hzip_stats); } - public void Hdump_stats_enable_y_(Db_provider p) {hdump_stats_tbl = new Hdump_stats_tbl().Provider_(p).Create_tbl();} private Hdump_stats_tbl hdump_stats_tbl; + public void Hdump_stats_enable_y_(Db_conn p) {hdump_stats_tbl = new Hdump_stats_tbl().Conn_(p).Create_tbl();} private Hdump_stats_tbl hdump_stats_tbl; public void Insert(Xoa_page page, Xow_hzip_stats hzip_stats) { int page_id = page.Revision_data().Id(); Insert_body(page, hzip_stats, page_id); @@ -42,7 +43,7 @@ public class Hdump_save_mgr { int insert_len = text_tbl.Insert(page_id, Xodb_wiki_page_html_row.Tid_page, body_bry); if (hdump_stats_tbl != null) hdump_stats_tbl.Insert(hpg, hzip_stats, page.Root().Root_src().length, body_bry.length, insert_len); return insert_len; - } private Hpg_srl_mgr srl_mgr = Hpg_srl_mgr._i_; private Hdump_page hpg = new Hdump_page(); + } private Hpg_srl_mgr srl_mgr = Hpg_srl_mgr._i_; private Xog_page hpg = new Xog_page(); public static byte[] Write_imgs(Bry_bfr bfr, ListAdp imgs) { int len = imgs.Count(); if (len == 0) return null; // no images; exit early, else will write blank String for (int i = 0; i < len; ++i) { diff --git a/400_xowa/src/gplx/xowa/hdumps/saves/Hdump_stats_tbl.java b/400_xowa/src/gplx/xowa/hdumps/saves/Hdump_stats_tbl.java index bdc0a6756..ef2da9f70 100644 --- a/400_xowa/src/gplx/xowa/hdumps/saves/Hdump_stats_tbl.java +++ b/400_xowa/src/gplx/xowa/hdumps/saves/Hdump_stats_tbl.java @@ -17,11 +17,12 @@ along with this program. If not, see . */ package gplx.xowa.hdumps.saves; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; import gplx.dbs.*; import gplx.xowa.hdumps.core.*; import gplx.xowa.html.hzips.*; +import gplx.xowa2.gui.*; class Hdump_stats_tbl { private Db_stmt stmt_insert; - public Db_provider Provider() {return provider;} public Hdump_stats_tbl Provider_(Db_provider v) {this.Rls_all(); provider = v; return this;} private Db_provider provider; - public Hdump_stats_tbl Create_tbl() {Sqlite_engine_.Tbl_create_and_delete(provider, Tbl_name, Tbl_sql); return this;} - public void Insert(Hdump_page hpg, Xow_hzip_stats hzip, int wtxt_len, int row_orig_len, int row_zip_len) { + public Db_conn Conn() {return conn;} public Hdump_stats_tbl Conn_(Db_conn v) {this.Rls_all(); conn = v; return this;} private Db_conn conn; + public Hdump_stats_tbl Create_tbl() {Sqlite_engine_.Tbl_create_and_delete(conn, Tbl_name, Tbl_sql); return this;} + public void Insert(Xog_page hpg, Xow_hzip_stats hzip, int wtxt_len, int row_orig_len, int row_zip_len) { Hdump_module_mgr js_mgr = hpg.Module_mgr(); Insert ( hpg.Page_id(), wtxt_len, row_orig_len, row_zip_len @@ -43,23 +44,23 @@ class Hdump_stats_tbl { , int hdr_1, int hdr_2, int hdr_3, int hdr_4, int hdr_5, int hdr_6 , int img_full ) { - if (stmt_insert == null) stmt_insert = Db_stmt_.new_insert_(provider, Tbl_name, Flds__all); + if (stmt_insert == null) stmt_insert = Db_stmt_.new_insert_(conn, Tbl_name, Flds__all); try { stmt_insert.Clear() - .Val_int_(page_id).Val_int_(wtxt_len).Val_int_(row_orig_len).Val_int_(row_zip_len) - .Val_int_(body_len).Val_int_(display_ttl_len).Val_int_(content_sub_len).Val_int_(sidebar_div_len) - .Val_byte_by_bool_(js_math).Val_byte_by_bool_(js_imap).Val_byte_by_bool_(js_packed).Val_byte_by_bool_(js_hiero) - .Val_int_(a_rhs).Val_int_(lnki_text_n).Val_int_(lnki_text_y) - .Val_int_(lnke_txt).Val_int_(lnke_brk_text_n).Val_int_(lnke_brk_text_y) - .Val_int_(hdr_1).Val_int_(hdr_2).Val_int_(hdr_3).Val_int_(hdr_4).Val_int_(hdr_5).Val_int_(hdr_6) - .Val_int_(img_full) + .Val_int(page_id).Val_int(wtxt_len).Val_int(row_orig_len).Val_int(row_zip_len) + .Val_int(body_len).Val_int(display_ttl_len).Val_int(content_sub_len).Val_int(sidebar_div_len) + .Val_bool_as_byte(js_math).Val_bool_as_byte(js_imap).Val_bool_as_byte(js_packed).Val_bool_as_byte(js_hiero) + .Val_int(a_rhs).Val_int(lnki_text_n).Val_int(lnki_text_y) + .Val_int(lnke_txt).Val_int(lnke_brk_text_n).Val_int(lnke_brk_text_y) + .Val_int(hdr_1).Val_int(hdr_2).Val_int(hdr_3).Val_int(hdr_4).Val_int(hdr_5).Val_int(hdr_6) + .Val_int(img_full) .Exec_insert(); } catch (Exception exc) {stmt_insert = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail } public void Rls_all() { if (stmt_insert != null) {stmt_insert.Rls(); stmt_insert = null;} - provider = null; + conn = null; } public static final String Tbl_name = "hdump_stats" , Fld_page_id = "page_id", Fld_wtxt_len = "wtxt_len", Fld_row_orig_len = "row_orig_len", Fld_row_zip_len = "row_zip_len" @@ -67,7 +68,7 @@ class Hdump_stats_tbl { , Fld_js_math = "js_math", Fld_js_imap = "js_imap", Fld_js_packed = "js_packed", Fld_js_hiero = "js_hiero" , Fld_a_rhs = "a_rhs", Fld_lnki_text_n = "lnki_text_n", Fld_lnki_text_y = "lnki_text_y" , Fld_lnke_txt = "lnke_txt", Fld_lnke_brk_text_n = "lnke_brk_text_n", Fld_lnke_brk_text_y = "lnke_brk_text_y" - , Fld_hdr_1 = "hdr_1", Fld_hdr_2 = "hdr_2", Fld_hdr_3 = "hdr_3", Fld_hdr_4 = "hdr_", Fld_hdr_5 = "hdr_", Fld_hdr_6 = "hdr_6" + , Fld_hdr_1 = "hdr_1", Fld_hdr_2 = "hdr_2", Fld_hdr_3 = "hdr_3", Fld_hdr_4 = "hdr_4", Fld_hdr_5 = "hdr_5", Fld_hdr_6 = "hdr_6" , Fld_img_full = "img_full" ; private static final String[] Flds__all = new String[] diff --git a/400_xowa/src/gplx/xowa/hdumps/srls/Hpg_srl_itm.java b/400_xowa/src/gplx/xowa/hdumps/srls/Hpg_srl_itm.java index 2159ce640..bc41fc56f 100644 --- a/400_xowa/src/gplx/xowa/hdumps/srls/Hpg_srl_itm.java +++ b/400_xowa/src/gplx/xowa/hdumps/srls/Hpg_srl_itm.java @@ -17,8 +17,9 @@ along with this program. If not, see . */ package gplx.xowa.hdumps.srls; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; import gplx.xowa.hdumps.core.*; +import gplx.xowa2.gui.*; public interface Hpg_srl_itm { byte Tid(); - int Load(Hdump_page hpg, byte[] bry, int bry_len, int itm_bgn, Int_obj_ref count_ref); - void Save(Hdump_page hpg, Bry_bfr bfr); + int Load(Xog_page hpg, byte[] bry, int bry_len, int itm_bgn, Int_obj_ref count_ref); + void Save(Xog_page hpg, Bry_bfr bfr); } diff --git a/400_xowa/src/gplx/xowa/hdumps/srls/Hpg_srl_itm_.java b/400_xowa/src/gplx/xowa/hdumps/srls/Hpg_srl_itm_.java index a1a09b10b..69361acdc 100644 --- a/400_xowa/src/gplx/xowa/hdumps/srls/Hpg_srl_itm_.java +++ b/400_xowa/src/gplx/xowa/hdumps/srls/Hpg_srl_itm_.java @@ -17,6 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.hdumps.srls; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; import gplx.xowa.hdumps.core.*; +import gplx.xowa2.gui.*; public class Hpg_srl_itm_ { public static final byte // SERIALIZED Tid_body = 0 @@ -79,7 +80,7 @@ public class Hpg_srl_itm_ { abstract class Hpg_srl_itm__blob_base implements Hpg_srl_itm { public abstract byte Tid(); public void Save_tid_n_() {save_tid = false;} private boolean save_tid = true; - public void Save(Hdump_page hpg, Bry_bfr bfr) { + public void Save(Xog_page hpg, Bry_bfr bfr) { byte[] bry = Save_itm(hpg); if (bry == null) return; int len = bry.length; if (len == 0) return; if (save_tid) // body won't save tid @@ -87,7 +88,7 @@ abstract class Hpg_srl_itm__blob_base implements Hpg_srl_itm { Hpg_srl_itm_.Save_bin_int_abrv(bfr, len); bfr.Add(bry); } - public int Load(Hdump_page hpg, byte[] bry, int bry_len, int itm_bgn, Int_obj_ref count_ref) { + public int Load(Xog_page hpg, byte[] bry, int bry_len, int itm_bgn, Int_obj_ref count_ref) { int itm_len = Hpg_srl_itm_.Load_bin_int_abrv(bry, bry_len, itm_bgn, count_ref); if (itm_len == -1) throw Err_.new_("bry_itm has invalid len: page={0} tid={1}", hpg.Page_id(), this.Tid()); int data_bgn = itm_bgn + count_ref.Val(); if (itm_len == 0) return data_bgn; @@ -96,46 +97,46 @@ abstract class Hpg_srl_itm__blob_base implements Hpg_srl_itm { this.Load_itm(hpg, itm_data); return data_end - itm_bgn; } - public abstract void Load_itm(Hdump_page hpg, byte[] data); - public abstract byte[] Save_itm(Hdump_page hpg); + public abstract void Load_itm(Xog_page hpg, byte[] data); + public abstract byte[] Save_itm(Xog_page hpg); } class Hpg_srl_itm__body extends Hpg_srl_itm__blob_base { public Hpg_srl_itm__body() {this.Save_tid_n_();} @Override public byte Tid() {return Hpg_srl_itm_.Tid_body;} - @Override public byte[] Save_itm(Hdump_page hpg) {return hpg.Page_body();} - @Override public void Load_itm(Hdump_page hpg, byte[] data) {hpg.Page_body_(data);} + @Override public byte[] Save_itm(Xog_page hpg) {return hpg.Page_body();} + @Override public void Load_itm(Xog_page hpg, byte[] data) {hpg.Page_body_(data);} } class Hpg_srl_itm__display_ttl extends Hpg_srl_itm__blob_base { @Override public byte Tid() {return Hpg_srl_itm_.Tid_display_ttl;} - @Override public byte[] Save_itm(Hdump_page hpg) {return hpg.Display_ttl();} - @Override public void Load_itm(Hdump_page hpg, byte[] data) {hpg.Display_ttl_(data);} + @Override public byte[] Save_itm(Xog_page hpg) {return hpg.Display_ttl();} + @Override public void Load_itm(Xog_page hpg, byte[] data) {hpg.Display_ttl_(data);} } class Hpg_srl_itm__content_sub extends Hpg_srl_itm__blob_base { @Override public byte Tid() {return Hpg_srl_itm_.Tid_content_sub;} - @Override public byte[] Save_itm(Hdump_page hpg) {return hpg.Content_sub();} - @Override public void Load_itm(Hdump_page hpg, byte[] data) {hpg.Content_sub_(data);} + @Override public byte[] Save_itm(Xog_page hpg) {return hpg.Content_sub();} + @Override public void Load_itm(Xog_page hpg, byte[] data) {hpg.Content_sub_(data);} } class Hpg_srl_itm__sidebar_div extends Hpg_srl_itm__blob_base { @Override public byte Tid() {return Hpg_srl_itm_.Tid_sidebar_div;} - @Override public byte[] Save_itm(Hdump_page hpg) {return hpg.Sidebar_div();} - @Override public void Load_itm(Hdump_page hpg, byte[] data) {hpg.Sidebar_div_(data);} + @Override public byte[] Save_itm(Xog_page hpg) {return hpg.Sidebar_div();} + @Override public void Load_itm(Xog_page hpg, byte[] data) {hpg.Sidebar_div_(data);} } class Hpg_srl_itm__html_module implements Hpg_srl_itm { public byte Tid() {return Hpg_srl_itm_.Tid_html_module;} - public int Load(Hdump_page hpg, byte[] bry, int bry_len, int itm_bgn, Int_obj_ref count_ref) { + public int Load(Xog_page hpg, byte[] bry, int bry_len, int itm_bgn, Int_obj_ref count_ref) { itm_bgn += 2; // skip bin_int_abrv of [1, 0] byte flag = bry[itm_bgn]; hpg.Module_mgr().Init(Enm_.Has_byte(flag, Tid_math), Enm_.Has_byte(flag, Tid_imap), Enm_.Has_byte(flag, Tid_packed), Enm_.Has_byte(flag, Tid_hiero)); return 3; } - public void Save(Hdump_page hpg, Bry_bfr bfr) { + public void Save(Xog_page hpg, Bry_bfr bfr) { byte flag = Calc_flag(hpg); if (flag == 0) return; bfr.Add_byte(this.Tid()); Hpg_srl_itm_.Save_bin_int_abrv(bfr, 1); bfr.Add_byte(flag); } - private static byte Calc_flag(Hdump_page hpg) { + private static byte Calc_flag(Xog_page hpg) { Hdump_module_mgr module_mgr = hpg.Module_mgr(); return Calc_flag(module_mgr.Math_exists(), module_mgr.Imap_exists(), module_mgr.Gallery_packed_exists(), module_mgr.Hiero_exists()); } diff --git a/400_xowa/src/gplx/xowa/hdumps/srls/Hpg_srl_itm_tst.java b/400_xowa/src/gplx/xowa/hdumps/srls/Hpg_srl_itm_tst.java index 90ac638dc..119e07743 100644 --- a/400_xowa/src/gplx/xowa/hdumps/srls/Hpg_srl_itm_tst.java +++ b/400_xowa/src/gplx/xowa/hdumps/srls/Hpg_srl_itm_tst.java @@ -17,6 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.hdumps.srls; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; import org.junit.*; import gplx.xowa.hdumps.core.*; +import gplx.xowa2.gui.*; public class Hpg_srl_itm_tst { @Before public void init() {fxt.Clear();} private Hpg_srl_itm_fxt fxt = new Hpg_srl_itm_fxt(); @Test public void Body() { @@ -48,11 +49,11 @@ class Hpg_srl_itm_fxt { return new Hpg_srl_itm_mok(Hpg_srl_itm_.Tid_html_module, new byte[] {Hpg_srl_itm__html_module.Calc_flag(v[0], v[1], v[2], v[3])}); } public void Test_page(Hdump_page_mok hpg_mok, Hpg_srl_itm_mok... expd_itms) { - Hdump_page hpg = hpg_mok.Xto_hdump_page(); + Xog_page hpg = hpg_mok.Xto_hdump_page(); Hpg_srl_mgr._i_.Save(hpg, bfr); byte[] actl = bfr.Xto_bry_and_clear(); Tfds.Eq_ary(Hpg_srl_itm_mok.Xto_bry(bfr, expd_itms), actl); - Hdump_page actl_hpg = new Hdump_page(); + Xog_page actl_hpg = new Xog_page(); Hpg_srl_mgr._i_.Load(actl_hpg, actl); Hpg_srl_mgr._i_.Save(hpg, bfr); Tfds.Eq_ary(actl, bfr.Xto_bry_and_clear()); @@ -64,8 +65,8 @@ class Hdump_page_mok { public byte[] Display_ttl() {return display_ttl;} public Hdump_page_mok Display_ttl_(String v) {display_ttl = Bry_.new_utf8_(v); return this;} private byte[] display_ttl; public byte[] Content_sub() {return content_sub;} public Hdump_page_mok Content_sub_(String v) {content_sub = Bry_.new_utf8_(v); return this;} private byte[] content_sub; public byte[] Sidebar_div() {return sidebar_div;} public Hdump_page_mok Sidebar_div_(String v) {sidebar_div = Bry_.new_utf8_(v); return this;} private byte[] sidebar_div; - public Hdump_page Xto_hdump_page() { - Hdump_page rv = new Hdump_page(); + public Xog_page Xto_hdump_page() { + Xog_page rv = new Xog_page(); rv.Page_body_(body); Hdump_module_mgr mod_mgr = rv.Module_mgr(); if (html_modules != null) { diff --git a/400_xowa/src/gplx/xowa/hdumps/srls/Hpg_srl_mgr.java b/400_xowa/src/gplx/xowa/hdumps/srls/Hpg_srl_mgr.java index e0d4c4967..a1a3e1576 100644 --- a/400_xowa/src/gplx/xowa/hdumps/srls/Hpg_srl_mgr.java +++ b/400_xowa/src/gplx/xowa/hdumps/srls/Hpg_srl_mgr.java @@ -17,12 +17,13 @@ along with this program. If not, see . */ package gplx.xowa.hdumps.srls; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; import gplx.xowa.hdumps.core.*; +import gplx.xowa2.gui.*; public class Hpg_srl_mgr { private Int_obj_ref count_ref = Int_obj_ref.zero_(); public Hpg_srl_mgr(Hpg_srl_itm[] itm_ary) {this.itm_ary = itm_ary;} public Hpg_srl_itm Itm_body() {return itm_body;} private final Hpg_srl_itm itm_body = new Hpg_srl_itm__body(); public Hpg_srl_itm[] Itm_ary() {return itm_ary;} private final Hpg_srl_itm[] itm_ary; - public void Load(Hdump_page hpg, byte[] bry) { + public void Load(Xog_page hpg, byte[] bry) { if (bry == null) return; int bry_len = bry.length; if (bry_len == 0) return; int pos = itm_body.Load(hpg, bry, bry_len, 0, count_ref); // assume every page has a body; saves 1 byte by not specifying tid for body @@ -32,7 +33,7 @@ public class Hpg_srl_mgr { pos += itm_parser.Load(hpg, bry, bry_len, pos + 1, count_ref) + 1; // +1 to skip tid } } - public void Save(Hdump_page hpg, Bry_bfr bfr) { + public void Save(Xog_page hpg, Bry_bfr bfr) { for (Hpg_srl_itm itm : itm_ary) itm.Save(hpg, bfr); } diff --git a/400_xowa/src/gplx/xowa/html/Xoh_html_wtr.java b/400_xowa/src/gplx/xowa/html/Xoh_html_wtr.java index 3ae6ce434..d8357477e 100644 --- a/400_xowa/src/gplx/xowa/html/Xoh_html_wtr.java +++ b/400_xowa/src/gplx/xowa/html/Xoh_html_wtr.java @@ -623,7 +623,7 @@ class Xoh_display_ttl_wtr { , Msg_style_restricted = Bry_.new_ascii_(" style='/* attempt to bypass $wgRestrictDisplayTitle */'") ; private Btrie_slim_mgr style_trie = Btrie_slim_mgr.ci_ascii_() - .Add_str_byte__many(Byte_.int_(0), "display", "user-select", "visibility"); // if ( preg_match( '/(display|user-select|visibility)\s*:/i', $decoded['style'] ) ) { + .Add_str_byte__many(Byte_.By_int(0), "display", "user-select", "visibility"); // if ( preg_match( '/(display|user-select|visibility)\s*:/i', $decoded['style'] ) ) { public boolean Is_style_restricted(Bry_bfr bfr, Xoh_wtr_ctx hctx, byte[] src, Xop_xatr_itm atr, byte[] atr_key) { if (atr_key != null && Bry_.Eq(atr_key, Atr_key_style) diff --git a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_dict.java b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_dict.java index 9a7f43b2a..947147d1e 100644 --- a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_dict.java +++ b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_dict.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.html.hzips; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; class Xow_hzip_dict {// SERIALIZED - public static final byte Escape = Byte_.int_(255); + public static final byte Escape = Byte_.By_int(255); public static final byte[] Escape_bry = Bry_.ints_(255); public static final byte Tid_a_rhs = 0 diff --git a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__anchor.java b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__anchor.java index a70e61a2d..4f7b3e80e 100644 --- a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__anchor.java +++ b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__anchor.java @@ -19,7 +19,7 @@ package gplx.xowa.html.hzips; import gplx.*; import gplx.xowa.*; import gplx.xow import gplx.core.brys.*; import gplx.html.*; import gplx.xowa.apps.ttls.*; import gplx.xowa.hdumps.srls.*; public class Xow_hzip_itm__anchor { private Xow_hzip_mgr hzip_mgr; private Xoa_ttl_parser ttl_parser; private Byte_obj_ref xtid_ref = Byte_obj_ref.zero_(); - // private Bry_rdr bry_rdr = new Bry_rdr(); + private Bry_rdr bry_rdr = new Bry_rdr(); public Xow_hzip_itm__anchor(Xow_hzip_mgr hzip_mgr, Xoa_ttl_parser ttl_parser) {this.hzip_mgr = hzip_mgr; this.ttl_parser = ttl_parser;} public int Save_a_rhs(Bry_bfr bfr, Xow_hzip_stats stats, byte[] src, int src_len, int bgn, int pos) { bfr.Add(Xow_hzip_dict.Bry_a_rhs); @@ -39,19 +39,21 @@ public class Xow_hzip_itm__anchor { default: return hzip_mgr.Warn_by_pos("a.xtid_unknown", bgn, pos); } } + private static int[] Save_img_full_pow = new int[] {0, 1, 2}; private int Save_img_full(Bry_bfr bfr, Xow_hzip_stats stats, byte[] src, int src_len, int bgn, int pos) { -// tmp_bfr.Add_str_ascii(a_cls == Xoh_lnki_consts.Tid_a_cls_none ? "0|" : "1|"); // a_cls : "" || image -// tmp_bfr.Add_str_ascii(a_rel == Xoh_lnki_consts.Tid_a_rel_none ? "0|" : "1|"); // a_rel : "" || nofollow -// tmp_bfr.Add_int_fixed(img_cls, 1).Add_byte_pipe(); // img_cls : "" || thumbborder || thumbimage || other -// tmp_bfr.Add_safe(img_cls_other).Add_byte_pipe(); // img_cls_other : "" || {other} -// tmp_bfr.Add_int_variable(uid).Add_byte_pipe(); -// Html_utl.Escape_html_to_bfr(tmp_bfr, img_alt, 0, img_alt.length, Bool_.N, Bool_.N, Bool_.N, Bool_.N, Bool_.Y); - return Xow_hzip_mgr.Unhandled; -// int xatrs_bgn = Bry_finder.Move_fwd(src, Find_img_xatrs, pos, src_len); if (xatrs_bgn == Bry_finder.Not_found) return hzip_mgr.Warn_by_pos_add_dflt("a.img_xatrs_missing", bgn, pos); -// byte a_cls = src[xatrs_bgn ] - Byte_ascii.Num_0; -// byte a_rel = src[xatrs_bgn + 2] - Byte_ascii.Num_0; -// byte img_rel = src[xatrs_bgn + 4] - Byte_ascii.Num_0; -// byte meta = img_cls + Enm_.Add_byte(2, img_rel); + bfr.Add(Xow_hzip_dict.Bry_img_full); + int xatrs_bgn = Bry_finder.Move_fwd(src, Find_img_xatrs, pos, src_len); if (xatrs_bgn == Bry_finder.Not_found) return hzip_mgr.Warn_by_pos_add_dflt("a.img_xatrs_missing", bgn, pos); + bry_rdr.Src_(src).Pos_(xatrs_bgn); + int a_cls = bry_rdr.Read_int_to_pipe(); + int a_rel = bry_rdr.Read_int_to_pipe(); + int img_rel = bry_rdr.Read_int_to_pipe(); + byte meta = (byte)Bit_.Shift_lhs_to_int(Save_img_full_pow, a_cls, a_rel, img_rel); + bfr.Add_byte(meta); // meta + Hpg_srl_itm_.Save_bin_int_abrv(bfr, bry_rdr.Read_int_to_pipe()); // uid + bfr.Add(bry_rdr.Read_bry_to_pipe()).Add_byte_pipe(); // img_cls_other + bfr.Add(bry_rdr.Read_bry_to_apos()); // alt + bfr.Add_byte(Xow_hzip_dict.Escape); + return bry_rdr.Pos() + 2; // +2=/> } public int Save_lnki(Bry_bfr bfr, Xow_hzip_stats stats, byte[] src, int src_len, int bgn, int pos, boolean caption) { int ttl_bgn = Bry_finder.Find_fwd(src, Find_href_wiki_bry, pos, src_len); if (ttl_bgn == Bry_finder.Not_found) return Xow_hzip_mgr.Unhandled;//hzip_mgr.Warn_by_pos_add_dflt("a.ttl_bgn_missing", bgn, pos); @@ -156,17 +158,22 @@ public class Xow_hzip_itm__anchor { return rv; } public void Html_plain(Bry_bfr bfr, Xop_lnki_tkn lnki) { - bfr.Add_str(lnki.Caption_exists() ? "") -// , Find_img_xatrs = Bry_.new_ascii_("xatrs='") + , Find_img_xatrs = Bry_.new_ascii_("xatrs='") ; private static final int Find_href_wiki_len = Find_href_wiki_bry.length , Find_href_len = Find_href_bry.length , Find_a_rhs_bgn_len = Find_a_rhs_bgn_bry.length ; -} +} diff --git a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__anchor_tst.java b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__anchor_tst.java index b76f2ebf7..95871365b 100644 --- a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__anchor_tst.java +++ b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__anchor_tst.java @@ -72,12 +72,15 @@ public class Xow_hzip_itm__anchor_tst { fxt.Test_save(brys, "[123]"); fxt.Test_load(brys, "[123]"); } - @Test public void Html_ttl() { + @Test public void Html_lnki_ttl() { fxt.Test_html("[[A]]", "A"); } - @Test public void Html_capt() { + @Test public void Html_lnki_capt() { fxt.Test_html("[[A|a]]", "a"); } + @Test public void Html_lnki_trail() { + fxt.Test_html("[[A]]b", "Ab"); + } @Test public void Html_lnke_txt() { fxt.Test_html("http://a.org", "http://a.org"); } diff --git a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__file_tst.java b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__file_tst.java index 205d4465b..91ae25d1e 100644 --- a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__file_tst.java +++ b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__file_tst.java @@ -19,9 +19,9 @@ package gplx.xowa.html.hzips; import gplx.*; import gplx.xowa.*; import gplx.xow import org.junit.*; import gplx.xowa.html.*; import gplx.xowa.hdumps.srls.*; public class Xow_hzip_itm__file_tst { @Before public void init() {fxt.Clear();} private Xow_hzip_mgr_fxt fxt = new Xow_hzip_mgr_fxt(); - @Test public void Srl_img_full() { -// byte[][] brys = Bry_.Ary(Xow_hzip_dict.Bry_img_full, Bry_.ints_(2), Bry_.new_ascii_("A"), Xow_hzip_dict.Escape_bry); -// fxt.Test_save(brys, "A"); -// fxt.Test_load(brys, "A"); + @Test public void Srl_lnki_img_full() { + byte[][] brys = Bry_.Ary(Xow_hzip_dict.Bry_img_full, Bry_.ints_(7), Bry_.ints_(12, 0), Bry_.new_ascii_("cls_other"), Bry_.new_ascii_("|caption_other"), Xow_hzip_dict.Escape_bry); + fxt.Test_save(brys, ""); +// fxt.Test_load(brys, "a_1Aa_2"); } } diff --git a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__header_tst.java b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__header_tst.java index 6055b7c41..617aed6c6 100644 --- a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__header_tst.java +++ b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__header_tst.java @@ -19,12 +19,20 @@ package gplx.xowa.html.hzips; import gplx.*; import gplx.xowa.*; import gplx.xow import org.junit.*; import gplx.xowa.html.*; import gplx.xowa.hdumps.srls.*; public class Xow_hzip_itm__header_tst { @Before public void init() {fxt.Clear();} private Xow_hzip_mgr_fxt fxt = new Xow_hzip_mgr_fxt(); - @Test public void Srl_hdr() { + @Test public void Srl_basic() { byte[][] brys = Bry_.Ary(Xow_hzip_dict.Bry_hdr_lhs, Bry_.ints_(2), Bry_.new_ascii_("A"), Xow_hzip_dict.Escape_bry); fxt.Test_save(brys, "

A

"); fxt.Test_load(brys, "

A

"); } - @Test public void Html_hdr() { + @Test public void Html_basic() { fxt.Test_html("==A==", "

A

\n"); } + @Test public void Srl_anchor() { + byte[][] brys = Bry_.Ary(Xow_hzip_dict.Bry_hdr_lhs, Bry_.ints_(2), Bry_.new_ascii_("A b c"), Xow_hzip_dict.Escape_bry); + fxt.Test_save(brys, "

A b c

"); +// fxt.Test_load(brys, "

A b c

"); + } + @Test public void Html_anchor() { + fxt.Test_html("==A [[b]] c==", "

A b c

\n"); + } } diff --git a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_xtid.java b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_xtid.java index 09a932eb0..73e54dcf6 100644 --- a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_xtid.java +++ b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_xtid.java @@ -21,7 +21,7 @@ class Xow_hzip_xtid { int xtid_bgn = pos + Len_xtid; if (!Bry_.Match(src, pos, xtid_bgn, Bry_xtid)) return Xow_hzip_mgr.Unhandled; // next atr should be "xtid='" int xtid_end = Bry_finder.Find_fwd(src, Byte_ascii.Apos, xtid_bgn); if (xtid_end == Bry_finder.Not_found) return hzip_mgr.Warn_by_pos_add_dflt("xtid_end_missing", bgn, xtid_bgn); Object xtid_obj = Xtids.Get_by_mid(src, xtid_bgn, xtid_end); if (xtid_obj == null) return hzip_mgr.Warn_by_pos("a.xtid_invalid", xtid_bgn, xtid_end); - xtid_ref.Val_(xtid_obj == null ? Byte_.MinValue : ((Byte_obj_val)xtid_obj).Val()); + xtid_ref.Val_(xtid_obj == null ? Byte_.Min_value : ((Byte_obj_val)xtid_obj).Val()); return xtid_end; } private static final byte[] diff --git a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_html_fmtr__hdump.java b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_html_fmtr__hdump.java index eec9b8d3c..b2fba9f09 100644 --- a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_html_fmtr__hdump.java +++ b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_html_fmtr__hdump.java @@ -24,18 +24,18 @@ public class Xoh_file_html_fmtr__hdump extends Xoh_file_html_fmtr__base { // public override void Html_full_media(Bry_bfr tmp_bfr, byte[] a_href, byte[] a_title, Bry_fmtr_arg html) { // fmtr_full_media.Bld_bfr_many(tmp_bfr, a_href, a_title, html); // } - @Override public void Html_full_img(Bry_bfr tmp_bfr, Xoh_wtr_ctx hctx, Xoa_page page, Xof_xfer_itm xfer_itm, int uid - , byte[] a_href, byte a_cls, byte a_rel, byte[] a_title, byte[] a_xowa_title - , int img_w, int img_h, byte[] img_src, byte[] img_alt, byte img_cls, byte[] img_cls_other) { - tmp_bfr.Add_str_ascii(""); - } +// public override void Html_full_img(Bry_bfr tmp_bfr, Xoh_wtr_ctx hctx, Xoa_page page, Xof_xfer_itm xfer_itm, int uid +// , byte[] a_href, byte a_cls, byte a_rel, byte[] a_title, byte[] a_xowa_title +// , int img_w, int img_h, byte[] img_src, byte[] img_alt, byte img_cls, byte[] img_cls_other) { +// tmp_bfr.Add_str_ascii(""); +// } @Override public void Html_thumb_core(Bry_bfr bfr, int uid, byte[] div1_halign, int div2_width, byte[] div2_content) { tmp_bfr.Add(Hdump_html_consts.Key_img_style); tmp_bfr.Add_int_variable(uid); diff --git a/400_xowa/src/gplx/xowa/langs/grammars/Xol_grammar_.java b/400_xowa/src/gplx/xowa/langs/grammars/Xol_grammar_.java index 1380bc706..89df032dd 100644 --- a/400_xowa/src/gplx/xowa/langs/grammars/Xol_grammar_.java +++ b/400_xowa/src/gplx/xowa/langs/grammars/Xol_grammar_.java @@ -19,7 +19,7 @@ package gplx.xowa.langs.grammars; import gplx.*; import gplx.xowa.*; import gplx import gplx.core.btries.*; public class Xol_grammar_ { public static final byte Tid__max = 9; - public static final byte Tid_genitive = 0, Tid_elative = 1, Tid_partitive = 2, Tid_illative = 3, Tid_inessive = 4, Tid_accusative = 5, Tid_instrumental = 6, Tid_prepositional = 7, Tid_dative = 8, Tid_unknown = Byte_.MaxValue_127; + public static final byte Tid_genitive = 0, Tid_elative = 1, Tid_partitive = 2, Tid_illative = 3, Tid_inessive = 4, Tid_accusative = 5, Tid_instrumental = 6, Tid_prepositional = 7, Tid_dative = 8, Tid_unknown = Byte_.Max_value_127; private static final Btrie_slim_mgr Tid_trie = Btrie_slim_mgr.ci_ascii_() // NOTE:ci.ascii:MW kwds .Add_str_byte("genitive", Tid_genitive) .Add_str_byte("elative", Tid_elative) diff --git a/400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_trie.java b/400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_trie.java index 6456537c7..e3686e3d1 100644 --- a/400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_trie.java +++ b/400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_trie.java @@ -29,6 +29,7 @@ public class Xop_amp_trie { , Bry_xowa_asterisk = Bry_.new_ascii_("&xowa_asterisk;") , Bry_xowa_space = Bry_.new_ascii_("&xowa_space;") , Bry_xowa_nl = Bry_.new_ascii_("&xowa_nl;") + , Bry_xowa_dash = Bry_.new_ascii_("&xowa_dash;") ; public static final Btrie_slim_mgr _ = new_(); Xop_amp_trie() {} private static Btrie_slim_mgr new_() {// REF.MW: Sanitizer|$wgHtmlEntities; NOTE:added apos @@ -43,6 +44,7 @@ public class Xop_amp_trie { Reg_name(rv, Bool_.Y, 42, Bry_xowa_asterisk); Reg_name(rv, Bool_.Y, 32, Bry_xowa_space); Reg_name(rv, Bool_.Y, 10, Bry_xowa_nl); + Reg_name(rv, Bool_.Y, 45, Bry_xowa_dash); Reg_name(rv, Bool_.N, 39, "'"); Reg_name(rv, Bool_.N, 193, "Á"); Reg_name(rv, Bool_.N, 225, "á"); diff --git a/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr.java b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr.java index 8a2151c2f..d47c4bf82 100644 --- a/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr.java @@ -33,7 +33,10 @@ public class Xop_lnke_wkr implements Xop_ctx_wkr { public static final byte[] Bry_xowa_protocol = Bry_.new_ascii_(Str_xowa_protocol); public int MakeTkn_bgn(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, int bgn_pos, int cur_pos, byte[] protocol, byte proto_tid, byte lnke_type) { boolean lnke_type_brack = (lnke_type == Xop_lnke_tkn.Lnke_typ_brack); - if (!lnke_type_brack && !Valid_text_lnke(ctx, src, src_len, bgn_pos, cur_pos)) return ctx.Lxr_make_txt_(cur_pos); + if ( !lnke_type_brack // lnke doesn't have "["; EX: "ttl:" + && !Valid_text_lnke(ctx, src, src_len, bgn_pos, cur_pos) // tkn is part of work; EX: " ttl:" vs "attl:" + ) + return ctx.Lxr_make_txt_(cur_pos - 1); // -1 to ignore ":" in making text colon; needed to process ":" for list like "; attl: b" PAGE:de.w:Mord_(Deutschland)#Besonders_verwerfliche_Begehungsweise; DATE:2015-01-09 if (ctx.Stack_get_typ(Xop_tkn_itm_.Tid_lnke) != null) return ctx.Lxr_make_txt_(cur_pos); // no nested lnke; return cur lnke as text; EX: "[irc://a irc://b]" -> "irc:b" if (proto_tid == Xoo_protocol_itm.Tid_xowa) return Make_tkn_xowa(ctx, tkn_mkr, root, src, src_len, bgn_pos, cur_pos, protocol, proto_tid, lnke_type); diff --git a/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_text_tst.java b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_text_tst.java index d1c1eddfd..0732f8791 100644 --- a/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_text_tst.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_text_tst.java @@ -37,6 +37,16 @@ public class Xop_lnke_wkr_text_tst { fxt.Test_parse_page_wiki_str("ätel:a" , "ätel:a"); fxt.Test_parse_page_wiki_str("€tel:a" , "€" + expd_lnke_html); } + @Test public void Invalid_lnki_and_list_dt_dd() { // PURPOSE: invalid lnke should still allow processing of ":" in list
; PAGE:de.w:Mord_(Deutschland)#Besonders_verwerfliche_Begehungsweise DATE:2015-01-08 + fxt.Test_parse_page_wiki_str("; atel: b" , String_.Concat_lines_nl_skip_last + ( "
" + , "
atel" + , "
" + , "
b" + , "
" + , "
" + )); + } @Test public void Xnde() {// NOTE: compare to Brace_lt fxt.Test_parse_page_wiki("irc://a" , fxt.tkn_xnde_(0, 20).Subs_ diff --git a/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_basic_tbl.java b/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_basic_tbl.java index ac8ff84b6..b2740b63f 100644 --- a/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_basic_tbl.java +++ b/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_basic_tbl.java @@ -19,23 +19,23 @@ package gplx.xowa.parsers.logs; import gplx.*; import gplx.xowa.*; import gplx.x import gplx.dbs.*; public class Xop_log_basic_tbl { private Db_stmt stmt_insert; - public Xop_log_basic_tbl(Db_provider provider){this.provider = provider; this.Create_table();} - public Db_provider Provider() {return provider;} private Db_provider provider; - private void Create_table() {Sqlite_engine_.Tbl_create(provider, Tbl_name, Tbl_sql);} - public void Delete() {provider.Exec_qry(Db_qry_delete.new_all_(Tbl_name));} + public Xop_log_basic_tbl(Db_conn conn){this.conn = conn; this.Create_table();} + public Db_conn Conn() {return conn;} private Db_conn conn; + private void Create_table() {Sqlite_engine_.Tbl_create(conn, Tbl_name, Tbl_sql);} + public void Delete() {conn.Exec_qry(Db_qry_delete.new_all_(Tbl_name));} public void Insert(int log_tid, String log_msg, int log_time, int page_id, String page_ttl, int args_len, String args_str, int src_len, String src_str) { - if (stmt_insert == null) stmt_insert = Db_stmt_.new_insert_(provider, Tbl_name, Fld_log_tid, Fld_log_msg, Fld_log_time, Fld_page_id, Fld_page_ttl, Fld_args_len, Fld_args_str, Fld_src_len, Fld_src_str); + if (stmt_insert == null) stmt_insert = Db_stmt_.new_insert_(conn, Tbl_name, Fld_log_tid, Fld_log_msg, Fld_log_time, Fld_page_id, Fld_page_ttl, Fld_args_len, Fld_args_str, Fld_src_len, Fld_src_str); try { stmt_insert.Clear() - .Val_int_(log_tid) - .Val_str_(log_msg) - .Val_int_(log_time) - .Val_int_(page_id) - .Val_str_(page_ttl) - .Val_int_(args_len) - .Val_str_(args_str) - .Val_int_(src_len) - .Val_str_(src_str) + .Val_int(log_tid) + .Val_str(log_msg) + .Val_int(log_time) + .Val_int(page_id) + .Val_str(page_ttl) + .Val_int(args_len) + .Val_str(args_str) + .Val_int(src_len) + .Val_str(src_str) .Exec_insert(); } catch (Exception exc) {stmt_insert = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail } diff --git a/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_invoke_wkr.java b/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_invoke_wkr.java index c3830d1cf..bf6375174 100644 --- a/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_invoke_wkr.java +++ b/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_invoke_wkr.java @@ -19,19 +19,19 @@ package gplx.xowa.parsers.logs; import gplx.*; import gplx.xowa.*; import gplx.x import gplx.dbs.*; import gplx.xowa.bldrs.oimgs.*; import gplx.xowa.parsers.logs.*; public class Xop_log_invoke_wkr implements GfoInvkAble { private Xop_log_mgr log_mgr; - private Db_provider provider; private Db_stmt stmt; + private Db_conn conn; private Db_stmt stmt; private boolean log_enabled = true; private Hash_adp_bry exclude_mod_names = Hash_adp_bry.cs_(); - public Xop_log_invoke_wkr(Xop_log_mgr log_mgr, Db_provider provider) { + public Xop_log_invoke_wkr(Xop_log_mgr log_mgr, Db_conn conn) { this.log_mgr = log_mgr; - this.provider = provider; + this.conn = conn; if (log_enabled) { - Xop_log_invoke_tbl.Create_table(provider); - stmt = Xop_log_invoke_tbl.Insert_stmt(provider); + Xop_log_invoke_tbl.Create_table(conn); + stmt = Xop_log_invoke_tbl.Insert_stmt(conn); } } public void Init_reset() { - Xop_log_invoke_tbl.Delete(provider); + Xop_log_invoke_tbl.Delete(conn); } public boolean Eval_bgn(Xoa_page page, byte[] mod_name, byte[] fnc_name) {return !exclude_mod_names.Has(mod_name);} public void Eval_end(Xoa_page page, byte[] mod_name, byte[] fnc_name, long invoke_time_bgn) { @@ -56,15 +56,15 @@ public class Xop_log_invoke_wkr implements GfoInvkAble { } private static final String Invk_exclude_mod_names_add = "exclude_mod_names_add", Invk_log_enabled_ = "log_enabled_"; } class Xop_log_invoke_tbl { - public static void Create_table(Db_provider provider) {Sqlite_engine_.Tbl_create(provider, Tbl_name, Tbl_sql);} - public static void Delete(Db_provider provider) {provider.Exec_qry(Db_qry_delete.new_all_(Tbl_name));} - public static Db_stmt Insert_stmt(Db_provider provider) {return Db_stmt_.new_insert_(provider, Tbl_name, Fld_invk_page_ttl, Fld_invk_mod_name, Fld_invk_fnc_name, Fld_invk_eval_time);} + public static void Create_table(Db_conn conn) {Sqlite_engine_.Tbl_create(conn, Tbl_name, Tbl_sql);} + public static void Delete(Db_conn conn) {conn.Exec_qry(Db_qry_delete.new_all_(Tbl_name));} + public static Db_stmt Insert_stmt(Db_conn conn) {return Db_stmt_.new_insert_(conn, Tbl_name, Fld_invk_page_ttl, Fld_invk_mod_name, Fld_invk_fnc_name, Fld_invk_eval_time);} public static void Insert(Db_stmt stmt, byte[] page_ttl, byte[] mod_name, byte[] fnc_name, int eval_time) { stmt.Clear() - .Val_str_by_bry_(page_ttl) - .Val_str_by_bry_(mod_name) - .Val_str_by_bry_(fnc_name) - .Val_int_(eval_time) + .Val_bry_as_str(page_ttl) + .Val_bry_as_str(mod_name) + .Val_bry_as_str(fnc_name) + .Val_int(eval_time) .Exec_insert(); } public static final String Tbl_name = "log_invoke_temp", Fld_invk_page_ttl = "invk_page_ttl", Fld_invk_mod_name = "invk_mod_name", Fld_invk_fnc_name = "invk_fnc_name", Fld_invk_eval_time = "invk_eval_time"; diff --git a/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_mgr.java b/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_mgr.java index 4995ba43f..a117ac094 100644 --- a/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_mgr.java +++ b/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_mgr.java @@ -18,48 +18,48 @@ along with this program. If not, see . package gplx.xowa.parsers.logs; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import gplx.dbs.*; import gplx.xowa.bldrs.oimgs.*; public class Xop_log_mgr implements GfoInvkAble { - private Db_provider provider; + private Db_conn conn; private Xoa_app app; private Xop_log_basic_tbl log_tbl; private int exec_count = 0, commit_interval = 1000; public Xop_log_mgr(Xoa_app app) {this.app = app;} public Io_url Log_dir() {return log_dir;} public Xop_log_mgr Log_dir_(Io_url v) { log_dir = v; -// if (provider != null) { // COMMENTED: need to implement a provider.Renew() -// provider.Rls(); // invalidate provider; note that during build other cmds will bind Provider which will place temp.log in /temp/ dir instead of /wiki/ dir; DATE:2014-04-16 +// if (conn != null) { // COMMENTED: need to implement a conn.Renew() +// conn.Rls(); // invalidate conn; note that during build other cmds will bind Conn which will place temp.log in /temp/ dir instead of /wiki/ dir; DATE:2014-04-16 // } return this; } private Io_url log_dir; - private Db_provider Provider() { - if (provider == null) { + private Db_conn Conn() { + if (conn == null) { if (log_dir == null) log_dir = app.User().Fsys_mgr().App_temp_dir(); Xodb_db_file db_file = Xodb_db_file.init__temp_log(log_dir); - provider = db_file.Provider(); + conn = db_file.Conn(); } - return provider; + return conn; } - public Xop_log_invoke_wkr Make_wkr_invoke() {return new Xop_log_invoke_wkr(this, this.Provider());} - public Xop_log_property_wkr Make_wkr_property() {return new Xop_log_property_wkr(this, this.Provider());} + public Xop_log_invoke_wkr Make_wkr_invoke() {return new Xop_log_invoke_wkr(this, this.Conn());} + public Xop_log_property_wkr Make_wkr_property() {return new Xop_log_property_wkr(this, this.Conn());} public Xop_log_basic_wkr Make_wkr() { if (log_tbl == null) { - log_tbl = new Xop_log_basic_tbl(this.Provider()); - provider.Txn_mgr().Txn_bgn_if_none(); + log_tbl = new Xop_log_basic_tbl(this.Conn()); + conn.Txn_mgr().Txn_bgn_if_none(); } return new Xop_log_basic_wkr(this, log_tbl); } public void Commit_chk() { ++exec_count; if ((exec_count % commit_interval) == 0) - provider.Txn_mgr().Txn_end_all_bgn_if_none(); + conn.Txn_mgr().Txn_end_all_bgn_if_none(); } public void Delete_all() { log_tbl.Delete(); } - public void Txn_bgn() {provider.Txn_mgr().Txn_bgn_if_none();} - public void Txn_end() {provider.Txn_mgr().Txn_end_all();} + public void Txn_bgn() {conn.Txn_mgr().Txn_bgn_if_none();} + public void Txn_end() {conn.Txn_mgr().Txn_end_all();} public void Rls() { if (log_tbl != null) log_tbl.Rls(); - if (provider != null) {provider.Conn_term(); provider = null;} + if (conn != null) {conn.Conn_term(); conn = null;} } public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_commit_interval_)) commit_interval = m.ReadInt("v"); diff --git a/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_property_wkr.java b/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_property_wkr.java index 2f4ce690b..dd3de174c 100644 --- a/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_property_wkr.java +++ b/400_xowa/src/gplx/xowa/parsers/logs/Xop_log_property_wkr.java @@ -18,20 +18,20 @@ along with this program. If not, see . package gplx.xowa.parsers.logs; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import gplx.dbs.*; import gplx.xowa.bldrs.oimgs.*; public class Xop_log_property_wkr implements GfoInvkAble { - private Xop_log_mgr log_mgr; private Db_provider provider; private Db_stmt stmt; + private Xop_log_mgr log_mgr; private Db_conn conn; private Db_stmt stmt; private boolean log_enabled = true; private boolean include_all = true; private Hash_adp_bry include_props = Hash_adp_bry.cs_(); - public Xop_log_property_wkr(Xop_log_mgr log_mgr, Db_provider provider) { + public Xop_log_property_wkr(Xop_log_mgr log_mgr, Db_conn conn) { this.log_mgr = log_mgr; - this.provider = provider; + this.conn = conn; if (log_enabled) { - Xob_log_property_temp_tbl.Create_table(provider); - stmt = Xob_log_property_temp_tbl.Insert_stmt(provider); + Xob_log_property_temp_tbl.Create_table(conn); + stmt = Xob_log_property_temp_tbl.Insert_stmt(conn); } } public void Init_reset() { - Xob_log_property_temp_tbl.Delete(provider); + Xob_log_property_temp_tbl.Delete(conn); } public boolean Eval_bgn(Xoa_page page, byte[] prop) {return include_all || include_props.Has(prop);} public void Eval_end(Xoa_page page, byte[] prop, long invoke_time_bgn) { @@ -57,14 +57,14 @@ public class Xop_log_property_wkr implements GfoInvkAble { } private static final String Invk_include_props_add = "include_props_add", Invk_log_enabled_ = "log_enabled_"; } class Xob_log_property_temp_tbl { - public static void Create_table(Db_provider provider) {Sqlite_engine_.Tbl_create(provider, Tbl_name, Tbl_sql);} - public static void Delete(Db_provider provider) {provider.Exec_qry(Db_qry_delete.new_all_(Tbl_name));} - public static Db_stmt Insert_stmt(Db_provider provider) {return Db_stmt_.new_insert_(provider, Tbl_name, Fld_prop_page_ttl, Fld_prop_prop_name, Fld_prop_eval_time);} + public static void Create_table(Db_conn conn) {Sqlite_engine_.Tbl_create(conn, Tbl_name, Tbl_sql);} + public static void Delete(Db_conn conn) {conn.Exec_qry(Db_qry_delete.new_all_(Tbl_name));} + public static Db_stmt Insert_stmt(Db_conn conn) {return Db_stmt_.new_insert_(conn, Tbl_name, Fld_prop_page_ttl, Fld_prop_prop_name, Fld_prop_eval_time);} public static void Insert(Db_stmt stmt, byte[] page_ttl, byte[] prop_name, int eval_time) { stmt.Clear() - .Val_str_by_bry_(page_ttl) - .Val_str_by_bry_(prop_name) - .Val_int_(eval_time) + .Val_bry_as_str(page_ttl) + .Val_bry_as_str(prop_name) + .Val_int(eval_time) .Exec_insert(); } public static final String Tbl_name = "log_property_temp", Fld_prop_page_ttl = "prop_page_ttl", Fld_prop_prop_name = "prop_prop_name", Fld_prop_eval_time = "prop_eval_time"; diff --git a/400_xowa/src/gplx/xowa/parsers/paras/Xop_para_wkr.java b/400_xowa/src/gplx/xowa/parsers/paras/Xop_para_wkr.java index de8846d35..5582c065c 100644 --- a/400_xowa/src/gplx/xowa/parsers/paras/Xop_para_wkr.java +++ b/400_xowa/src/gplx/xowa/parsers/paras/Xop_para_wkr.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.parsers.paras; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; -import gplx.xowa.parsers.tblws.*; +import gplx.xowa.parsers.tblws.*; import gplx.core.btries.*; public class Xop_para_wkr implements Xop_ctx_wkr { private boolean para_enabled; private byte cur_mode; @@ -157,7 +157,8 @@ public class Xop_para_wkr implements Xop_ctx_wkr { } public int Process_pre(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, int bgn_pos, int cur_pos, int txt_pos) { Dd_clear(ctx); - Object o = ctx.App().Utl_trie_tblw_ws().Match_bgn(src, txt_pos, src_len); + Btrie_slim_mgr tblw_ws_trie = ctx.App().Utl_trie_tblw_ws(); + Object o = tblw_ws_trie.Match_bgn(src, txt_pos, src_len); if (o != null) { // tblw_ws found Xop_tblw_ws_itm ws_itm = (Xop_tblw_ws_itm)o; byte tblw_type = ws_itm.Tblw_type(); @@ -170,9 +171,18 @@ public class Xop_para_wkr implements Xop_ctx_wkr { } break; case Xop_tblw_ws_itm.Type_xnde: - if (bgn_pos != Xop_parser_.Doc_bgn_bos) - ctx.Para().Process_nl(ctx, root, src, bgn_pos, cur_pos); - return ctx.Xnde().Make_tkn(ctx, tkn_mkr, root, src, src_len, txt_pos, txt_pos + 1); + int nxt_pos = tblw_ws_trie.Match_pos(); + if (nxt_pos < src_len) { // bounds check + switch (src[nxt_pos]) { // check that next char is "end" of xnde name; guard against false matches like "" )); } + @Test public void False_match_xnde() { // PURPOSE: "\s" being evaluted as "\s"; PAGE:de.v:Via_Jutlandica/Gpx DATE:2014-11-29 + fxt.Init_para_y_(); + fxt.Test_html_wiki_str(String_.Concat_lines_nl + ( "" + , " " + ), String_.Concat_lines_nl + ( "" + , "
<trk>"
+		, "
" + )); + } } diff --git a/400_xowa/src/gplx/xowa/parsers/tmpls/Nowiki_escape_itm.java b/400_xowa/src/gplx/xowa/parsers/tmpls/Nowiki_escape_itm.java index 5714d4815..996e8d5d9 100644 --- a/400_xowa/src/gplx/xowa/parsers/tmpls/Nowiki_escape_itm.java +++ b/400_xowa/src/gplx/xowa/parsers/tmpls/Nowiki_escape_itm.java @@ -51,10 +51,11 @@ public class Nowiki_escape_itm { trie_new_itm(rv, Byte_ascii.Brack_bgn_bry , Xop_amp_trie.Bry_xowa_brack_bgn); trie_new_itm(rv, Byte_ascii.Brack_end_bry , Xop_amp_trie.Bry_xowa_brack_end); // PAGE:en.w: Tall_poppy_syndrome DATE:2014-07-23 trie_new_itm(rv, Byte_ascii.Pipe_bry , Xop_amp_trie.Bry_xowa_pipe); - trie_new_itm(rv, Byte_ascii.Apos_bry , Xop_amp_trie.Bry_xowa_apos); // NOTE: for backward compatibility, use ' note that amp_wkr will turn ' -> ' but ' -> '; DATE:2014-07-03 + trie_new_itm(rv, Byte_ascii.Apos_bry , Xop_amp_trie.Bry_xowa_apos); // NOTE: for backward compatibility, use ' note that amp_wkr will turn ' -> ' but ' -> '; DATE:2014-07-03 trie_new_itm(rv, Byte_ascii.Colon_bry , Xop_amp_trie.Bry_xowa_colon); trie_new_itm(rv, Byte_ascii.Underline_bry , Xop_amp_trie.Bry_xowa_underline); trie_new_itm(rv, Byte_ascii.Asterisk_bry , Xop_amp_trie.Bry_xowa_asterisk); + trie_new_itm(rv, Byte_ascii.Dash_bry , Xop_amp_trie.Bry_xowa_dash); // needed to handle "|-"; PAGE:de.w:Liste_von_Vereinen_und_Vereinigungen_von_Gl�ubigen_(r�misch-katholische_Kirche) DATE:2015-01-08 trie_new_itm(rv, Byte_ascii.Space_bry , Xop_amp_trie.Bry_xowa_space); trie_new_itm(rv, Byte_ascii.NewLine_bry , Xop_amp_trie.Bry_xowa_nl); trie_new_itm(rv, Pre_bry , Pre_bry); diff --git a/400_xowa/src/gplx/xowa/servers/Gxw_html_server.java b/400_xowa/src/gplx/xowa/servers/Gxw_html_server.java index 771545fa9..69c75faf3 100644 --- a/400_xowa/src/gplx/xowa/servers/Gxw_html_server.java +++ b/400_xowa/src/gplx/xowa/servers/Gxw_html_server.java @@ -92,4 +92,8 @@ public class Gxw_html_server implements Gxw_html { mem_kit.New_html_impl_prototype_(new Gxw_html_server(app.Usr_dlg(), wtr)); // NOTE: set prototype before calling Kit_ app.Gui_mgr().Kit_(mem_kit); } + public static void Assert_tab(Xoa_app app, Xoa_page page) { + if (app.Gui_mgr().Browser_win().Active_tab() == null) // no active tab + app.Gui_mgr().Browser_win().Tab_mgr().Tabs_new_init(page); // create at least one active tab; DATE:2014-07-30 + } } diff --git a/400_xowa/src/gplx/xowa/servers/http/Http_server_mgr.java b/400_xowa/src/gplx/xowa/servers/http/Http_server_mgr.java index fe89963b7..85ae5e895 100644 --- a/400_xowa/src/gplx/xowa/servers/http/Http_server_mgr.java +++ b/400_xowa/src/gplx/xowa/servers/http/Http_server_mgr.java @@ -78,8 +78,7 @@ public class Http_server_mgr implements GfoInvkAble { Xoa_url page_url = app.Url_parser().Parse(page_ttl); // get the url (needed for query args) Xoa_ttl ttl = Xoa_ttl.parse_(wiki, page_ttl); // get the ttl Xoa_page page = wiki.GetPageByTtl(page_url, ttl); // get page and parse it - if (app.Gui_mgr().Browser_win().Active_tab() == null) // no active tab - app.Gui_mgr().Browser_win().Tab_mgr().Tabs_new_init(page); // create at least one active tab; DATE:2014-07-30 + Gxw_html_server.Assert_tab(app, page); // HACK: assert at least 1 tab app.Gui_mgr().Browser_win().Active_page_(page); // HACK: init gui_mgr's page for output (which server ordinarily doesn't need) if (page.Missing()) { // if page does not exist, replace with message; else null_ref error; DATE:2014-03-08 page.Data_raw_(Bry_.new_ascii_("'''Page not found.'''")); diff --git a/400_xowa/src/gplx/xowa/servers/tcp/Xosrv_server.java b/400_xowa/src/gplx/xowa/servers/tcp/Xosrv_server.java index 0996a7b32..707e7ca58 100644 --- a/400_xowa/src/gplx/xowa/servers/tcp/Xosrv_server.java +++ b/400_xowa/src/gplx/xowa/servers/tcp/Xosrv_server.java @@ -65,7 +65,7 @@ public class Xosrv_server implements GfoInvkAble { } private String Exec_cmd(String msg_text) { Object rv_obj = app.Gfs_mgr().Run_str(msg_text); - String rv = ClassAdp_.Eq_typeSafe(rv_obj, String_.ClassOf) ? (String)rv_obj : Object_.Xto_str_strict_or_null(rv_obj); + String rv = ClassAdp_.Eq_typeSafe(rv_obj, String_.Cls_ref_type) ? (String)rv_obj : Object_.Xto_str_strict_or_null(rv_obj); return rv; } public String Exec_js(byte[] sender, byte[] msg_text) { diff --git a/400_xowa/src/gplx/xowa/setup/maints/Wmf_latest_itm.java b/400_xowa/src/gplx/xowa/setup/maints/Wmf_latest_itm.java new file mode 100644 index 000000000..4393ae9ca --- /dev/null +++ b/400_xowa/src/gplx/xowa/setup/maints/Wmf_latest_itm.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.xowa.setup.maints; import gplx.*; import gplx.xowa.*; import gplx.xowa.setup.*; +public class Wmf_latest_itm { + public Wmf_latest_itm(byte[] name, DateAdp date, long size) { + this.name = name; this.date = date; this.size = size; + } + public byte[] Name() {return name;} private final byte[] name; + public DateAdp Date() {return date;} private final DateAdp date; + public long Size() {return size;} private final long size; +} \ No newline at end of file diff --git a/400_xowa/src/gplx/xowa/setup/maints/Wmf_latest_parser.java b/400_xowa/src/gplx/xowa/setup/maints/Wmf_latest_parser.java new file mode 100644 index 000000000..c9fa9b911 --- /dev/null +++ b/400_xowa/src/gplx/xowa/setup/maints/Wmf_latest_parser.java @@ -0,0 +1,65 @@ +/* +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.setup.maints; import gplx.*; import gplx.xowa.*; import gplx.xowa.setup.*; +import gplx.core.btries.*; import gplx.ios.*; +public class Wmf_latest_parser { + private OrderedHash hash = OrderedHash_.new_bry_(); + public int Count() {return hash.Count();} + public Wmf_latest_itm Get_at(int i) {return (Wmf_latest_itm)hash.FetchAt(i);} + public Wmf_latest_itm Get_by(byte[] k) {return (Wmf_latest_itm)hash.Fetch(k);} + public Wmf_latest_itm[] Xto_ary() {return (Wmf_latest_itm[])hash.Xto_ary(Wmf_latest_itm.class);} + public void Parse(byte[] src) { + hash.Clear(); + Bry_bfr tmp_bfr = Bry_bfr.reset_(255); + byte[] name_bgn_bry = Bry_.new_ascii_(""); + byte[] size_bgn_bry = Bry_.new_ascii_(""); + Btrie_slim_mgr date_trie = Btrie_slim_mgr.cs_() + .Add_bry("Jan", "01").Add_bry("Feb", "02").Add_bry("Mar", "03").Add_bry("Apr", "04").Add_bry("May", "05").Add_bry("Jun", "06") + .Add_bry("Jul", "07").Add_bry("Aug", "08").Add_bry("Sep", "09").Add_bry("Oct", "10").Add_bry("Nov", "11").Add_bry("Dec", "12") + ; + Btrie_slim_mgr size_trie = Btrie_slim_mgr.cs_() + .Add_bry("B", " B").Add_bry("K", " KB").Add_bry("M", " MB").Add_bry("G", " GB"); + byte[] date_or = Bry_.new_ascii_("1970-01-01"); + byte[] size_or = Bry_.new_ascii_("0 B"); + int size_end = 0; int src_len = src.length; + while (true) { + int name_bgn = Bry_finder.Move_fwd(src, name_bgn_bry, size_end, src_len); if (name_bgn == Bry_finder.Not_found) break; + int name_end = Bry_finder.Find_fwd(src, Byte_ascii.Quote, name_bgn, src_len); + byte[] name = Bry_.Mid(src, name_bgn, name_end); + int date_bgn = Bry_finder.Move_fwd(src, date_bgn_bry, name_end, src_len); if (date_bgn == Bry_finder.Not_found) {Gfo_usr_dlg_._.Warn_many("", "", "date_bgn not found"); break;} + int date_end = Bry_finder.Find_fwd(src, Byte_ascii.Lt, date_bgn, src_len); + byte[] date_bry = Bry_.Mid(src, date_bgn, date_end); + DateAdp date = DateAdp_.parse_fmt(String_.new_ascii_(Replace_or(tmp_bfr, date_trie, date_bry, 5, date_or)), "yyyy-MM-dd hh:mm:ss"); + int size_bgn = Bry_finder.Move_fwd(src, size_bgn_bry, date_end, src_len); if (size_bgn == Bry_finder.Not_found) {Gfo_usr_dlg_._.Warn_many("", "", "size_bgn not found"); break;} + size_end = Bry_finder.Find_fwd(src, Byte_ascii.Lt, size_bgn, src_len); + byte[] size_bry = Bry_.Mid(src, size_bgn, size_end); + long size = Io_size_.parse_or_(String_.new_ascii_(Replace_or(tmp_bfr, size_trie, size_bry, size_bry.length - 1, size_or)), 0); + Wmf_latest_itm itm = new Wmf_latest_itm(name, date, size); + hash.Add(name, itm); + } + } + private static byte[] Replace_or(Bry_bfr tmp_bfr, Btrie_slim_mgr trie, byte[] src, int pos, byte[] or) { + int src_len = src.length; + Object o = trie.Match_bgn(src, pos, src_len); if (o == null) return or; + tmp_bfr.Add_mid(src, 0, pos); + tmp_bfr.Add((byte[])o); + tmp_bfr.Add_mid(src, trie.Match_pos(), src_len); + return tmp_bfr.Xto_bry_and_clear(); + } +} diff --git a/400_xowa/src/gplx/xowa/setup/maints/Wmf_latest_parser_tst.java b/400_xowa/src/gplx/xowa/setup/maints/Wmf_latest_parser_tst.java new file mode 100644 index 000000000..b0239029a --- /dev/null +++ b/400_xowa/src/gplx/xowa/setup/maints/Wmf_latest_parser_tst.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.xowa.setup.maints; import gplx.*; import gplx.xowa.*; import gplx.xowa.setup.*; +import org.junit.*; import gplx.ios.*; +public class Wmf_latest_parser_tst { + @Before public void init() {fxt.Clear();} private Wmf_latest_parser_fxt fxt = new Wmf_latest_parser_fxt(); + @Test public void Parse() { + fxt.Test_parse + ( "enwiki-latest-pages-articles.xml.bz22014-Dec-10 06:53:2010.7Gapplication/x-bzip" + , fxt.itm("enwiki-latest-pages-articles.xml.bz2", "2014-12-10 06:53:20", "10.7 GB") + ); + } +// @Test public void Smoke() { +// Wmf_latest_parser parser = new Wmf_latest_parser(); +// parser.Parse(Io_mgr._.LoadFilBry("C:\\wmf_latest.html")); +// Tfds.Write(String_.Concat_lines_nl(Wmf_latest_parser_fxt.Xto_str_ary(parser.Xto_ary()))); +// } +} +class Wmf_latest_parser_fxt { + public void Clear() {} + private Wmf_latest_parser parser = new Wmf_latest_parser(); + public Wmf_latest_itm itm(String name, String date, String size) {return new Wmf_latest_itm(Bry_.new_ascii_(name), DateAdp_.parse_iso8561(date), Io_size_.parse_or_(size, 0));} + public void Test_parse(String raw, Wmf_latest_itm... expd) { + parser.Parse(Bry_.new_ascii_(raw)); + Wmf_latest_itm[] actl = parser.Xto_ary(); + Tfds.Eq_str_lines(String_.Concat_lines_nl(Xto_str_ary(expd)), String_.Concat_lines_nl(Xto_str_ary(actl))); + } + public static String[] Xto_str_ary(Wmf_latest_itm[] ary) { + int len = ary.length; + String[] rv = new String[len]; + for (int i = 0; i < len; i++) + rv[i] = Xto_str(ary[i]); + return rv; + } + public static String Xto_str(Wmf_latest_itm itm) { + return String_.Concat_with_str("\n", String_.new_ascii_(itm.Name()), itm.Date().XtoStr_fmt_iso_8561(), Io_size_.Xto_str(itm.Size())); + } +} diff --git a/400_xowa/src/gplx/xowa/specials/Xows_mgr.java b/400_xowa/src/gplx/xowa/specials/Xows_mgr.java index 4e1abfecb..44e213604 100644 --- a/400_xowa/src/gplx/xowa/specials/Xows_mgr.java +++ b/400_xowa/src/gplx/xowa/specials/Xows_mgr.java @@ -19,8 +19,9 @@ package gplx.xowa.specials; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.history.*; import gplx.xowa.specials.*; import gplx.xowa.specials.allPages.*; import gplx.xowa.specials.search.*; import gplx.xowa.specials.nearby.*; import gplx.xowa.specials.randoms.*; import gplx.xowa.specials.statistics.*; import gplx.xowa.xtns.translates.*; import gplx.xowa.specials.movePage.*; -import gplx.xowa.specials.xowa.system_data.*; import gplx.xowa.specials.xowa.default_tab.*; import gplx.xowa.specials.xowa.popup_history.*; +import gplx.xowa.specials.xowa.system_data.*; import gplx.xowa.specials.xowa.default_tab.*; import gplx.xowa.specials.xowa.popup_history.*; import gplx.xowa.specials.xowa.file_browsers.*; import gplx.xowa.xtns.wdatas.specials.*; +import gplx.xowa.users.data.*; public class Xows_mgr { private Hash_adp_bry hash; public Xows_mgr(Xow_wiki wiki, Xol_lang lang) { @@ -30,19 +31,21 @@ public class Xows_mgr { page_random = new Xows_page_random(wiki); Evt_lang_changed(wiki.Lang()); } - public Xows_page_allpages Page_allpages() {return page_allpages;} private Xows_page_allpages page_allpages; - public Xosrh_core Page_search() {return page_search;} private Xosrh_core page_search; - public Xows_page_random Page_random() {return page_random;} private Xows_page_random page_random; - public Xop_randomRootPage_page Page_randomRootPage() {return page_randomRootPage;} private Xop_randomRootPage_page page_randomRootPage = new Xop_randomRootPage_page(); - public Xou_history_html Page_history() {return page_history;} private Xou_history_html page_history = new Xou_history_html(); - public Nearby_mgr Page_nearby() {return page_nearby;} Nearby_mgr page_nearby = new Nearby_mgr(); - public Xop_mylanguage_page Page_mylanguage() {return page_mylanguage;} private Xop_mylanguage_page page_mylanguage = new Xop_mylanguage_page(); - public Wdata_itemByTitle_page Page_itemByTitle() {return page_itemByTitle;} Wdata_itemByTitle_page page_itemByTitle = new Wdata_itemByTitle_page(); - public Xop_statistics_page Page_statistics() {return page_statistics;} private Xop_statistics_page page_statistics = new Xop_statistics_page(); - public Move_page Page_movePage() {return page_movePage;} private Move_page page_movePage = new Move_page(); - public System_data_page Page_system_data() {return page_system_data;} private System_data_page page_system_data = new System_data_page(); - public Default_tab_page Page_default_tab() {return page_default_tab;} private Default_tab_page page_default_tab = new Default_tab_page(); - public Popup_history_page Page_popup_history() {return page_popup_history;} private Popup_history_page page_popup_history = new Popup_history_page(); + public Xows_page_allpages Page_allpages() {return page_allpages;} private final Xows_page_allpages page_allpages; + public Xosrh_core Page_search() {return page_search;} private final Xosrh_core page_search; + public Xows_page_random Page_random() {return page_random;} private final Xows_page_random page_random; + public Xop_randomRootPage_page Page_randomRootPage() {return page_randomRootPage;} private final Xop_randomRootPage_page page_randomRootPage = new Xop_randomRootPage_page(); + public Xou_history_html Page_history() {return page_history;} private final Xou_history_html page_history = new Xou_history_html(); + public Xoud_history_special Page_history2() {return page_history2;} private final Xoud_history_special page_history2 = new Xoud_history_special(); + public Nearby_mgr Page_nearby() {return page_nearby;} private final Nearby_mgr page_nearby = new Nearby_mgr(); + public Xop_mylanguage_page Page_mylanguage() {return page_mylanguage;} private final Xop_mylanguage_page page_mylanguage = new Xop_mylanguage_page(); + public Wdata_itemByTitle_page Page_itemByTitle() {return page_itemByTitle;} private final Wdata_itemByTitle_page page_itemByTitle = new Wdata_itemByTitle_page(); + public Xop_statistics_page Page_statistics() {return page_statistics;} private final Xop_statistics_page page_statistics = new Xop_statistics_page(); + public Move_page Page_movePage() {return page_movePage;} private final Move_page page_movePage = new Move_page(); + public System_data_page Page_system_data() {return page_system_data;} private final System_data_page page_system_data = new System_data_page(); + public Default_tab_page Page_default_tab() {return page_default_tab;} private final Default_tab_page page_default_tab = new Default_tab_page(); + public Popup_history_page Page_popup_history() {return page_popup_history;} private final Popup_history_page page_popup_history = new Popup_history_page(); + public Xosp_fbrow_special Page_file_browser() {return page_file_browser;} private final Xosp_fbrow_special page_file_browser = new Xosp_fbrow_special(); public void Evt_lang_changed(Xol_lang lang) { hash.Clear(); hash.Add_str_obj("search" , page_search); @@ -52,6 +55,7 @@ public class Xows_mgr { hash.Add_str_obj("randompage" , page_random); hash.Add_str_obj("randomrootpage" , page_randomRootPage); hash.Add_bry_obj(Xou_history_mgr.Ttl_name , page_history); + hash.Add_bry_obj(Xoud_history_special.Ttl_name , page_history2); hash.Add_bry_obj(Nearby_mgr.Ttl_name , page_nearby); hash.Add_str_obj("mylanguage" , page_mylanguage); hash.Add_str_obj("itembytitle" , page_itemByTitle); @@ -60,6 +64,7 @@ public class Xows_mgr { hash.Add_str_obj("XowaSystemData" , page_system_data); hash.Add_str_obj(Default_tab_page.Ttl_name_str , page_default_tab); hash.Add_bry_obj(Popup_history_page.Ttl_name_bry , page_popup_history); + hash.Add_bry_obj(Xosp_fbrow_special.Ttl_name_bry , page_file_browser); } public void Special_gen(Xoa_url calling_url, Xoa_page page, Xow_wiki wiki, Xoa_ttl ttl) { int slash_pos = Bry_finder.Find_fwd(ttl.Page_txt_wo_qargs(), Xoa_ttl.Subpage_spr); // check for slash diff --git a/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xoa_url_arg_mgr.java b/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xoa_url_arg_mgr.java new file mode 100644 index 000000000..a30c223ee --- /dev/null +++ b/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xoa_url_arg_mgr.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.xowa.specials.xowa.file_browsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.xowa.*; +class Xoa_url_arg_mgr { + private final Hash_adp_bry hash = Hash_adp_bry.cs_(); + private final Xoa_url_enum_mgr enm_mgr; + public Xoa_url_arg_mgr(Xoa_url_enum_mgr enm_mgr) {this.enm_mgr = enm_mgr;} + public void Init(Gfo_url_arg[] args) { + hash.Clear(); + int len = args.length; + for (int i = 0; i < len; ++i) { + Gfo_url_arg arg = args[i]; + hash.Add_bry_obj(arg.Key_bry(), arg); + } + } + public int Read_enm_or_neg1(byte[] key) { + Xoa_url_enum_itm enm = enm_mgr.Get(key); if (enm == null) return -1; + Gfo_url_arg arg = (Gfo_url_arg)hash.Get_by_bry(key); if (arg == null) return -1; + return enm.Get_as_int_or(arg.Val_bry(), -1); + } + public byte[] Read_bry_or_empty(byte[] key) {return Read_bry_or(key, Bry_.Empty);} + public byte[] Read_bry_or_null(byte[] key) {return Read_bry_or(key, null);} + public byte[] Read_bry_or(byte[] key, byte[] or) { + Gfo_url_arg arg = (Gfo_url_arg)hash.Get_by_bry(key); + return arg == null ? or : arg.Val_bry(); + } + public String Read_str_or_null(String key) {return Read_str_or_null(Bry_.new_utf8_(key));} + public String Read_str_or_null(byte[] key) { + Gfo_url_arg arg = (Gfo_url_arg)hash.Get_by_bry(key); + return arg == null ? null : String_.new_utf8_(arg.Val_bry()); + } +} +class Xoa_url_enum_mgr { + private final Hash_adp_bry hash = Hash_adp_bry.cs_(); + public Xoa_url_enum_mgr(Xoa_url_enum_itm... ary) { + int len = ary.length; + for (int i = 0; i < len; ++i) { + Xoa_url_enum_itm itm = ary[i]; + hash.Add_bry_obj(itm.Key(), itm); + } + } + public Xoa_url_enum_itm Get(byte[] key) {return (Xoa_url_enum_itm)hash.Get_by_bry(key);} +} +class Xoa_url_enum_itm { + private final Hash_adp_bry hash = Hash_adp_bry.cs_(); + public Xoa_url_enum_itm(byte[] key) {this.key = key;} + public byte[] Key() {return key;} private final byte[] key; + public Xoa_url_enum_itm Add(String key, int val) { + hash.Add_bry_obj(Bry_.new_utf8_(key), Int_obj_val.new_(val)); + return this; + } + public int Get_as_int_or(byte[] val, int or) { + Int_obj_val rv = (Int_obj_val)hash.Get_by_bry(val); + return rv == null ? or : rv.Val(); + } +} diff --git a/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_cmd__base.java b/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_cmd__base.java new file mode 100644 index 000000000..72e869f39 --- /dev/null +++ b/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_cmd__base.java @@ -0,0 +1,216 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.specials.xowa.file_browsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.xowa.*; +import gplx.ios.*; import gplx.xowa2.apps.*; import gplx.xowa2.wikis.*; +interface Xosp_fbrow_cmd { + Xosp_fbrow_cmd Make_new(); + Xosp_fbrow_rslt Write_html(Xoa_url_arg_mgr arg_mgr, GfoInvkAble select_invkable); +} +abstract class Xosp_fbrow_cmd__base implements Xosp_fbrow_cmd { + public abstract Xosp_fbrow_cmd Make_new(); + public Xosp_fbrow_rslt Write_html(Xoa_url_arg_mgr arg_mgr, GfoInvkAble select_invkable) { + // app.I18n_mgr_Get_txt_many("xowa.specials.file_browsers.errs.unknown_path", url.Raw()); + Url_encoder encoder = Url_encoder.new_html_href_mw_(); + Xosp_fbrow_html html_wtr = new Xosp_fbrow_html(encoder); + Bry_bfr tmp_bfr = Bry_bfr.reset_(255); + String selected_str = arg_mgr.Read_str_or_null("selected"); + if (selected_str == null) { + String path_str = arg_mgr.Read_str_or_null("path"); if (path_str == null) return Xosp_fbrow_rslt.err_("url has unknown path"); + // if (Op_sys.Cur().Tid_is_wnt()) path_str = String_.Replace(path_str, "/", "\\"); + Io_url path_url = Io_url_.new_any_(path_str); + IoItmDir dir = Io_mgr._.QueryDir_args(path_url).DirInclude_(true).ExecAsDir(); + dir.SubDirs().Sort(); dir.SubFils().Sort(); + Xosp_fbrow_data_dir dir_itm = Xosp_fbrow_data_dir.new_(dir); + Process_itms(dir_itm); + String url_enc = String_.Replace(path_url.Raw(), "\\", "\\\\"); + byte[] cmd_src = this.Cmd_src(); + byte[] cmd_row = Html_body_cmd_row.Bld_bry_many(tmp_bfr, url_enc, cmd_src, this.Cmd_gui()); + html_wtr.Write(tmp_bfr, cmd_src, cmd_row, dir_itm); + return new Xosp_fbrow_rslt(Html_head_default, tmp_bfr.Xto_bry_and_clear()); + } + else + return Write_html_selected(arg_mgr, selected_str, select_invkable); + } + private void Process_itms(Xosp_fbrow_data_dir dir_itm) { + int len = dir_itm.Count(); + for (int i = 0; i < len; ++i) { + Xosp_fbrow_data_sub itm = dir_itm.Get_at(i); + this.Process_itm(itm); + } + } + protected abstract byte[] Cmd_src(); + protected abstract String Cmd_gui(); + protected abstract Xosp_fbrow_rslt Write_html_selected(Xoa_url_arg_mgr arg_mgr, String selected, GfoInvkAble select_invkable); + protected abstract void Process_itm(Xosp_fbrow_data_sub itm); + private static final byte[] Html_head_default = Bry_.new_ascii_(String_.Concat_lines_nl_skip_last + ( " " + , " " + )) + ; + private static final Bry_fmtr Html_body_cmd_row = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last + ( "" + , " " + , " " + , " " + , " " + , " " + , " " + , "
~{cmd_gui}" + , "
" + , " " + , " " + ), "url_enc", "cmd_src", "cmd_gui") + ; +} +class Xosp_fbrow_html implements Bry_fmtr_arg { + private final Url_encoder encoder; private Xosp_fbrow_data_dir dir; private byte[] cmd_src; + public Xosp_fbrow_html(Url_encoder encoder) {this.encoder = encoder;} + public void Write(Bry_bfr bfr, byte[] cmd_src, byte[] cmd_row, Xosp_fbrow_data_dir dir) { + this.dir = dir; this.cmd_src = cmd_src; + // app.I18n_mgr_Get_txt_none("xowa.specials.file_browsers.html.hdr.name"); + // i18n.Get_txt_none("html.hdrs.name"); + fmtr_hdr.Bld_bfr_many(bfr + , cmd_src, cmd_row + , "name", "size", "modified" + , dir.Url().Raw(), String_.Replace(dir.Url().Raw(), "\\", "\\\\"), encoder.Encode_str(dir.Url().OwnerDir().Raw()) + , this + ); + } + public void XferAry(Bry_bfr bfr, int idx) { + int len = dir.Count(); + for (int i = 0; i < len; ++i) { + Xosp_fbrow_data_sub itm = (Xosp_fbrow_data_sub)dir.Get_at(i); + String selected_html = itm.Selectable() ? ("") : "   "; + if (itm.Tid_is_dir()) + fmtr_row_dir.Bld_bfr_many(bfr, selected_html, encoder.Encode_str(itm.Url().Raw()), itm.Url().NameOnly(), cmd_src); + else { + fmtr_row_fil.Bld_bfr_many(bfr, selected_html, encoder.Encode_str(itm.Url().Raw()), itm.Url().NameAndExt() + , Io_size_.Xto_str(itm.Size(), 1, "#,###", " ", Bool_.Y), itm.Modified().XtoStr_fmt_yyyy_MM_dd_HH_mm_ss()); + } + } + } + private static Bry_fmtr + fmtr_hdr = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last + ( "~{cmd_row}" + , " " + , " " + , " " + , " " + , " " + , " " + , "
~{dir_url_raw}" + , "
" + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " ~{itms}" + , "
~{hdr_name}~{hdr_size}~{hdr_modified}
..
" + , "
" + ), "cmd_src", "cmd_row", "hdr_name", "hdr_size", "hdr_modified", "dir_url_raw", "dir_url_enc", "owner_url_enc", "itms" + ) + , fmtr_row_dir = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last + ( "" + , " " + , " ~{selected_html}" + , " ~{name}" + , " " + , " " + , " " + ), "selected_html", "path_enc", "name", "cmd_src" + ) + , fmtr_row_fil = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last + ( "" + , " " + , " ~{selected_html}" + , " ~{name}" + , " ~{size}" + , " ~{modified}" + , " " + ), "selected_html", "path_enc", "name", "size", "modified" + ); +} +class Xosp_fbrow_cmd__err implements Xosp_fbrow_cmd { + public Xosp_fbrow_cmd Make_new() {return this;} + public Xosp_fbrow_rslt Write_html(Xoa_url_arg_mgr arg_mgr, GfoInvkAble select_invkable) {return Rslt;} + private static final Xosp_fbrow_rslt Rslt = new Xosp_fbrow_rslt(Bry_.Empty, Bry_.new_utf8_("url has unknown cmd")); + public static final Xosp_fbrow_cmd__err I = new Xosp_fbrow_cmd__err(); Xosp_fbrow_cmd__err() {} +} +class Xosp_fbrow_cmd__wiki_add extends Xosp_fbrow_cmd__base { + @Override protected byte[] Cmd_src() {return Regy_key;} + @Override protected String Cmd_gui() {return "import";} + @Override public Xosp_fbrow_cmd Make_new() {return new Xosp_fbrow_cmd__wiki_add();} + @Override protected void Process_itm(Xosp_fbrow_data_sub itm) { + byte[] url_bry = itm.Url().RawBry(); + if (!Bry_.HasAtEnd(url_bry, Ext_sqlite3_000)) itm.Selectable_(false); + } + @Override protected Xosp_fbrow_rslt Write_html_selected(Xoa_url_arg_mgr arg_mgr, String selected, GfoInvkAble select_invkable) { + String[] wikis = String_.Split(selected, ";"); + String path_str = arg_mgr.Read_str_or_null("path"); + Xowv_wiki wiki = (Xowv_wiki)GfoInvkAble_.InvkCmd_val(select_invkable, Xoav_wiki_mgr.Invk_import_by_fil, path_str + wikis[0]); + Bry_bfr bfr = Bry_bfr.reset_(255); + done_fmtr.Bld_bfr_many(bfr, wiki.Domain_str()); + return new Xosp_fbrow_rslt(Bry_.Empty, bfr.Xto_bry_and_clear()); + } + private static final Bry_fmtr done_fmtr = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last + ( "~{domain} Main Page" + ) + , "domain"); + private static final byte[] Ext_sqlite3_000 = Bry_.new_ascii_(".000.sqlite3"); + public static final byte[] Regy_key = Bry_.new_ascii_("xowa.wiki.add"); + public static final Xosp_fbrow_cmd__wiki_add I = new Xosp_fbrow_cmd__wiki_add(); +} +class Xosp_fbrow_cmd__root_set extends Xosp_fbrow_cmd__base { + @Override protected byte[] Cmd_src() {return Regy_key;} + @Override protected String Cmd_gui() {return "set root dir";} + @Override public Xosp_fbrow_cmd Make_new() {return new Xosp_fbrow_cmd__root_set();} + @Override protected void Process_itm(Xosp_fbrow_data_sub itm) { + if (itm.Url().Type_fil()) itm.Selectable_(false); + } + @Override protected Xosp_fbrow_rslt Write_html_selected(Xoa_url_arg_mgr arg_mgr, String selected, GfoInvkAble select_invkable) { + return new Xosp_fbrow_rslt(Bry_.Empty, Bry_.new_utf8_(selected)); + } + public static final byte[] Regy_key = Bry_.new_ascii_("xowa.fsys.root_"); + public static final Xosp_fbrow_cmd__root_set I = new Xosp_fbrow_cmd__root_set(); +} diff --git a/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_data_dir.java b/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_data_dir.java new file mode 100644 index 000000000..4fbbecbe4 --- /dev/null +++ b/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_data_dir.java @@ -0,0 +1,61 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.specials.xowa.file_browsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.xowa.*; +import gplx.ios.*; +class Xosp_fbrow_data_dir { + private final OrderedHash hash = OrderedHash_.new_(); + public Xosp_fbrow_data_dir(Io_url url) {this.url = url;} + public Io_url Url() {return url;} private final Io_url url; + public int Count() {return hash.Count();} + public Xosp_fbrow_data_sub Get_at(int i) {return (Xosp_fbrow_data_sub)hash.FetchAt(i);} + public void Add(Xosp_fbrow_data_sub itm) {hash.Add(itm.Url().NameAndExt(), itm);} + public static Xosp_fbrow_data_dir new_(IoItmDir owner) { + Xosp_fbrow_data_dir rv = new Xosp_fbrow_data_dir(owner.Url()); + new_subs(rv, Bool_.Y, owner.SubDirs()); + new_subs(rv, Bool_.N, owner.SubFils()); + return rv; + } + private static void new_subs(Xosp_fbrow_data_dir owner, boolean dir, IoItmList itms) { + int len = itms.Count(); + for (int i = 0; i < len; ++i) { + IoItm_base src = (IoItm_base)itms.FetchAt(i); + Io_url src_url = src.Url(); + if (String_.HasAtBgn(src_url.NameAndExt(), ".")) continue; // ignore hidden "." files; NameAndExt() b/c ".ext" has NameOnly of ""; EX: "/dir/.hidden" + Xosp_fbrow_data_sub trg = null; + if (dir) + trg = new Xosp_fbrow_data_sub(src_url, -1, null); + else { + IoItmFil fil = (IoItmFil)src; + trg = new Xosp_fbrow_data_sub(src_url, fil.Size(), fil.ModifiedTime()); + } + owner.Add(trg); + } + } +} +class Xosp_fbrow_data_sub { + public Xosp_fbrow_data_sub(Io_url url, long size, DateAdp modified) { + this.url = url; this.size = size; this.modified = modified; + this.tid_is_dir = url.Type_dir(); + } + public boolean Selectable() {return selectable;} public void Selectable_(boolean v) {selectable = v;} private boolean selectable = true; + public String Selectable_style() {return selectable ? "" : "none";} + public boolean Tid_is_dir() {return tid_is_dir;} private final boolean tid_is_dir; + public Io_url Url() {return url;} private final Io_url url; + public long Size() {return size;} private final long size; + public DateAdp Modified() {return modified;} private final DateAdp modified; +} diff --git a/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_rslt.java b/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_rslt.java new file mode 100644 index 000000000..42570406c --- /dev/null +++ b/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_rslt.java @@ -0,0 +1,24 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.specials.xowa.file_browsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.xowa.*; +public class Xosp_fbrow_rslt { + public Xosp_fbrow_rslt(byte[] html_head, byte[] html_body) {this.html_head = html_head; this.html_body = html_body;} + public byte[] Html_head() {return html_head;} private final byte[] html_head; + public byte[] Html_body() {return html_body;} private final byte[] html_body; + public static Xosp_fbrow_rslt err_(String msg) {return new Xosp_fbrow_rslt(Bry_.Empty, Bry_.new_utf8_(msg));} +} diff --git a/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_special.java b/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_special.java new file mode 100644 index 000000000..e03841395 --- /dev/null +++ b/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_special.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.specials.xowa.file_browsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.xowa.*; +import gplx.xowa.specials.*; import gplx.ios.*; +public class Xosp_fbrow_special implements Xows_page { + private static final Xoa_url_arg_mgr url_args = new Xoa_url_arg_mgr(null); + public void Special_gen(Xoa_url url, Xoa_page page, Xow_wiki wiki, Xoa_ttl ttl) { + Xosp_fbrow_rslt rslt = Gen(url.Args(), GfoInvkAble_.Null); + page.Html_data().Html_restricted_n_(); + page.Html_data().Custom_head_end_concat(rslt.Html_head()); + page.Data_raw_(rslt.Html_body()); + } + public static Xosp_fbrow_rslt Gen(Gfo_url_arg[] args, GfoInvkAble select_invkable) { + url_args.Init(args); + byte[] cmd_bry = url_args.Read_bry_or_empty(Arg_cmd); + Xosp_fbrow_cmd cmd = (Xosp_fbrow_cmd)cmd_regy.Get_by_bry(cmd_bry); if (cmd == null) cmd = Xosp_fbrow_cmd__err.I; + return cmd.Make_new().Write_html(url_args, select_invkable); + } + private static final byte[] Arg_cmd = Bry_.new_ascii_("cmd"); + private static final Hash_adp_bry cmd_regy = Hash_adp_bry.cs_() + .Add_bry_obj(Xosp_fbrow_cmd__wiki_add.Regy_key, Xosp_fbrow_cmd__wiki_add.I) + .Add_bry_obj(Xosp_fbrow_cmd__root_set.Regy_key, Xosp_fbrow_cmd__root_set.I) + ; + public static final byte[] Ttl_name_bry = Bry_.new_ascii_("XowaFileBrowser"); +} diff --git a/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_special_tst.java b/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_special_tst.java new file mode 100644 index 000000000..720f0eeaf --- /dev/null +++ b/400_xowa/src/gplx/xowa/specials/xowa/file_browsers/Xosp_fbrow_special_tst.java @@ -0,0 +1,145 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.specials.xowa.file_browsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.xowa.*; +import org.junit.*; import gplx.ios.*; +public class Xosp_fbrow_special_tst { + @Before public void init() {fxt.Clear();} private Xosp_fbrow_special_fxt fxt = new Xosp_fbrow_special_fxt(); + @Test public void Basic() { + fxt.Init_dir(fxt.Make_dir()); + fxt.Test_nav("mem/root/dir/", String_.Concat_lines_nl_skip_last + ( "" + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , "
" + , " " + , " " + , " " + , " " + , "
import" + , "
" + , "
mem/root/dir/" + , "
" + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , " " + , "
namesizemodified
..
   a
   b
   1.txt1 KB2001-01-01 00:00:00
   2.txt1 KB2004-01-02 00:00:00
3.000.sqlite31 KB2004-01-03 00:00:00
" + , "
" + )); + } +} +class Io_itm_bldr { + public IoItmDir Root(Io_url url, IoItm_base... subs) { + IoItmDir rv = IoItmDir_.top_(url); + Init_dir(rv, url.NameAndExt(), subs); + return rv; + } + public IoItmDir Dir(String name, IoItm_base... subs) { + IoItmDir rv = IoItmDir_.sub_(name); + Init_dir(rv, name, subs); + return rv; + } + public IoItmFil Fil(String name, int size, String date) {return IoItmFil_.sub_(name, size, DateAdp_.parse_iso8561(date));} + private void Init_dir(IoItmDir rv, String name, IoItm_base... subs) { + int len = subs.length; + for (int i = 0; i < len; ++i) { + IoItm_base sub = subs[i]; + IoItmList sub_list = sub.Type_fil() ? rv.SubFils() : rv.SubDirs(); + sub.OwnerDir_set(rv); + sub_list.Add(sub); + } + } +} +class Xosp_fbrow_special_fxt { + private Io_itm_bldr bldr = new Io_itm_bldr(); + public void Clear() {} + public IoItmDir Make_dir() { + return bldr.Root(Io_url_.mem_dir_("mem/root/dir/") + , bldr.Dir("a" + , bldr.Fil("a1.txt", 11, "2011-01-01") + , bldr.Fil("a2.txt", 12, "2011-01-02") + , bldr.Fil("a3.txt", 13, "2011-01-03") + ) + , bldr.Dir("b" + , bldr.Fil("b1.txt", 21, "2011-02-01") + , bldr.Fil("b2.txt", 22, "2011-02-02") + , bldr.Fil("b3.txt", 23, "2011-02-03") + ) + , bldr.Fil("1.txt", 1, "2001-01-01") + , bldr.Fil("2.txt", 2, "2004-01-02") + , bldr.Fil("3.000.sqlite3", 3, "2004-01-03") + ); + } + public void Init_dir(IoItmDir dir) { + IoItmDir_.Make(dir); + } + public void Test_nav(String path, String expd) { + Xoa_url_arg_mgr args_mgr = new Xoa_url_arg_mgr(null); + Xoa_url url = Xoa_url.new_(Bry_.Empty, Bry_.Empty).Args_(Gfo_url_arg.Ary("cmd", "xowa.wiki.add", "mode", "view", "path", path)); + args_mgr.Init(url.Args()); + Xosp_fbrow_cmd__wiki_add cmd = new Xosp_fbrow_cmd__wiki_add(); + byte[] actl = cmd.Write_html(args_mgr, GfoInvkAble_.Null).Html_body(); + Tfds.Eq_str_lines(expd, String_.new_utf8_(actl)); + } +} diff --git a/400_xowa/src/gplx/xowa/specials/xowa/system_data/System_data_page.java b/400_xowa/src/gplx/xowa/specials/xowa/system_data/System_data_page.java index 8706aeb47..e3a2bed2e 100644 --- a/400_xowa/src/gplx/xowa/specials/xowa/system_data/System_data_page.java +++ b/400_xowa/src/gplx/xowa/specials/xowa/system_data/System_data_page.java @@ -44,7 +44,6 @@ public class System_data_page implements Xows_page { private static final byte[] Arg_type = Bry_.new_ascii_("type"); private static final byte Type_log_session = 1, Type_cfg_app = 2, Type_cfg_lang = 3, Type_cfg_user = 4, Type_cfg_custom = 5, Type_usr_history = 6; - private static final Hash_adp_bry type_hash = Hash_adp_bry.cs_() .Add_str_byte("log_session" , Type_log_session) .Add_str_byte("cfg_app" , Type_cfg_app) diff --git a/400_xowa/src/gplx/xowa/users/Xou_user.java b/400_xowa/src/gplx/xowa/users/Xou_user.java index aa21e1e0a..4d26991b8 100644 --- a/400_xowa/src/gplx/xowa/users/Xou_user.java +++ b/400_xowa/src/gplx/xowa/users/Xou_user.java @@ -17,6 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.users; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.xwikis.*; import gplx.xowa.users.dbs.*; import gplx.xowa.users.history.*; import gplx.xowa.xtns.scribunto.*; +import gplx.xowa.users.data.*; public class Xou_user implements GfoEvMgrOwner, GfoInvkAble { public Xou_user(Xoa_app app, Io_url user_dir) { this.evMgr = GfoEvMgr.new_(this); @@ -33,6 +34,7 @@ public class Xou_user implements GfoEvMgrOwner, GfoInvkAble { public byte[] Key_bry() {return key_bry;} private byte[] key_bry; public void Key_str_(String v) {this.key_str = v; this.key_bry = Bry_.new_utf8_(v);} public GfoEvMgr EvMgr() {return evMgr;} private final GfoEvMgr evMgr; + public Xoud_data_mgr Data_mgr() {return data_mgr;} private Xoud_data_mgr data_mgr = new Xoud_data_mgr(); public Xol_lang Lang() {if (lang == null) {lang = app.Lang_mgr().Get_by_key_or_new(app.Sys_cfg().Lang()); lang.Init_by_load();} return lang;} private Xol_lang lang; public void Lang_(Xol_lang v) { lang = v; @@ -58,6 +60,7 @@ public class Xou_user implements GfoEvMgrOwner, GfoInvkAble { if (!Env_.Mode_testing()) { db_mgr.App_init(); this.Available_from_fsys(); + // data_mgr.Init_by_app(app); } } public void App_term() { diff --git a/400_xowa/src/gplx/xowa/users/Xou_user_.java b/400_xowa/src/gplx/xowa/users/Xou_user_.java index 3db99a8e3..58a71fde0 100644 --- a/400_xowa/src/gplx/xowa/users/Xou_user_.java +++ b/400_xowa/src/gplx/xowa/users/Xou_user_.java @@ -37,17 +37,17 @@ class Xou_user_ { home_wiki.Db_mgr().Save_mgr().Data_create(Xoa_ttl.parse_(home_wiki, Bry_.new_ascii_("Data:Bookmarks")), Bry_.new_ascii_(Bookmarks_text)); } public static final String User_system_cfg_text = String_.Concat_lines_nl - ( "app.scripts.txns.get('user.prefs.general').version_('" + Xoa_app_.Version + "').bgn();" - , "app.files.download.enabled_('n');" - , "app.files.math.enabled_('y');" - , "app.files.math.renderer_('mathjax');" - , "app.scripts.txns.get('user.prefs.general').end();\n" - ); + ( "app.scripts.txns.get('user.prefs.general').version_('" + Xoa_app_.Version + "').bgn();" + , "app.files.download.enabled_('y');" // default to true; DATE:2015-01-05 + , "app.files.math.enabled_('y');" + , "app.files.math.renderer_('mathjax');" + , "app.scripts.txns.get('user.prefs.general').end();\n" + ); public static final String Bookmarks_text = String_.Concat_lines_nl - ( "Bookmarks are added automatically to the bottom of the page. All other text is not modified." - , "" - , "Please delete bookmarks by editing this page." - ); + ( "Bookmarks are added automatically to the bottom of the page. All other text is not modified." + , "" + , "Please delete bookmarks by editing this page." + ); private static Xow_ns_mgr ns_home_(Xol_case_mgr case_mgr) { Xow_ns_mgr rv = new Xow_ns_mgr(case_mgr); rv = rv.Add_new(-2, "Media").Add_new(-1, "Special").Add_new(0, "").Add_new(1, "Talk").Add_new(2, "User").Add_new(3, "User talk").Add_new(4, "Wikipedia").Add_new(5, "Wikipedia talk") diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_bmk_row.java b/400_xowa/src/gplx/xowa/users/data/Xoud_bmk_row.java new file mode 100644 index 000000000..f5fc02e10 --- /dev/null +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_bmk_row.java @@ -0,0 +1,31 @@ +/* +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.users.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*; +public class Xoud_bmk_row { + public Xoud_bmk_row(int bmk_id, int bmk_sort, String bmk_wiki, String bmk_page, String bmk_qarg, String bmk_wtxt, DateAdp bmk_time, int bmk_count) { + this.bmk_id = bmk_id; this.bmk_sort = bmk_sort; this.bmk_wiki = bmk_wiki; this.bmk_page = bmk_page; this.bmk_qarg = bmk_qarg; this.bmk_wtxt = bmk_wtxt; this.bmk_time = bmk_time; this.bmk_count = bmk_count; + } + public int Bmk_id() {return bmk_id;} private final int bmk_id; + public int Bmk_sort() {return bmk_sort;} private final int bmk_sort; + public String Bmk_wiki() {return bmk_wiki;} private final String bmk_wiki; + public String Bmk_page() {return bmk_page;} private final String bmk_page; + public String Bmk_qarg() {return bmk_qarg;} private final String bmk_qarg; + public String Bmk_wtxt() {return bmk_wtxt;} private final String bmk_wtxt; + public DateAdp Bmk_time() {return bmk_time;} private final DateAdp bmk_time; + public int Bmk_count() {return bmk_count;} private final int bmk_count; +} diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_bmk_tbl.java b/400_xowa/src/gplx/xowa/users/data/Xoud_bmk_tbl.java new file mode 100644 index 000000000..9f52589af --- /dev/null +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_bmk_tbl.java @@ -0,0 +1,80 @@ +/* +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.users.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*; +import gplx.dbs.*; +public class Xoud_bmk_tbl { + private Db_stmt stmt_select, stmt_insert, stmt_delete; + public Db_conn Conn() {return conn;} public Xoud_bmk_tbl Conn_(Db_conn v) {this.Rls_all(); conn = v; return this;} private Db_conn conn; + @gplx.Virtual public void Insert(int sort, String wiki, String page, String qarg, String wtxt, DateAdp time, int count) { + if (stmt_insert == null) stmt_insert = Db_stmt_.new_insert_(conn, Tbl_name, Flds__all); + try { + stmt_insert.Clear().Val_int(sort).Val_str(wiki).Val_str(page).Val_str(qarg).Val_str(wtxt).Val_str(time.XtoStr_fmt_iso_8561()).Val_int(count).Exec_insert(); + } + catch (Exception exc) {stmt_insert = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail + } + @gplx.Virtual public void Delete(int id) { + if (stmt_delete == null) stmt_delete = Db_stmt_.new_delete_(conn, Tbl_name, Fld_bmk_id); + try {stmt_delete.Clear().Val_int(id).Exec_delete();} + catch (Exception exc) {stmt_delete = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail + } + @gplx.Virtual public void Select_all(ListAdp rv) { + if (stmt_select == null) stmt_select = Db_stmt_.new_select_as_rdr(conn, Db_qry__select_in_tbl.new_(Tbl_name, null, Flds__all)); + try { + Db_rdr rdr = stmt_select.Clear().Exec_select_as_rdr(); + while (rdr.Move_next()) { + Xoud_bmk_row row = Make_row(rdr); + rv.Add(row); + } + rdr.Rls(); + } + catch (Exception exc) {stmt_select = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail + } + private Xoud_bmk_row Make_row(Db_rdr rdr) { + return new Xoud_bmk_row + ( rdr.Read_int(0) + , rdr.Read_int(1) + , rdr.Read_str(2) + , rdr.Read_str(3) + , rdr.Read_str(4) + , rdr.Read_str(5) + , rdr.Read_date_by_str(6) + , rdr.Read_int(7) + ); + } + public void Rls_all() { + if (stmt_select != null) {stmt_select.Rls(); stmt_select = null;} + if (stmt_insert != null) {stmt_insert.Rls(); stmt_insert = null;} + if (stmt_delete != null) {stmt_delete.Rls(); stmt_delete = null;} + conn = null; + } + public static final String Tbl_name = "cfg_bmk", Fld_bmk_id = "bmk_id", Fld_bmk_count = "bmk_count", Fld_bmk_sort = "bmk_sort" + , Fld_bmk_time = "bmk_time", Fld_bmk_wiki = "bmk_wiki", Fld_bmk_page = "bmk_page", Fld_bmk_qarg = "bmk_qarg", Fld_bmk_wtxt = "bmk_wtxt"; + public static final String[] Flds__all = new String[] {Fld_bmk_id, Fld_bmk_sort, Fld_bmk_wiki, Fld_bmk_page, Fld_bmk_qarg, Fld_bmk_wtxt, Fld_bmk_time, Fld_bmk_count}; + public static final String Tbl_sql = String_.Concat_lines_nl + ( "CREATE TABLE cfg_bmk" + , "( bmk_id integer NOT NULL PRIMARY KEY AUTOINCREMENT" + , ", bmk_sort integer NOT NULL" + , ", bmk_wiki nvarchar(255) NOT NULL" + , ", bmk_page nvarchar(255) NOT NULL" + , ", bmk_qarg nvarchar(255) NOT NULL" + , ", bmk_wtxt nvarchar(255) NOT NULL" + , ", bmk_time nvarchar(20) NOT NULL" + , ", bmk_count integer NOT NULL" + , ");" + ); +} diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_data_mgr.java b/400_xowa/src/gplx/xowa/users/data/Xoud_data_mgr.java new file mode 100644 index 000000000..274734eaa --- /dev/null +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_data_mgr.java @@ -0,0 +1,39 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.users.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*; +import gplx.threads.*; import gplx.dbs.*; import gplx.dbs.schemas.updates.*; import gplx.dbs.schemas.*; +import gplx.xowa2.users.data.*; +public class Xoud_data_mgr { + private Gfdb_db_base user_db = new Gfdb_db_base(); + public Xoud_regy_mgr Regy_mgr() {return regy_mgr;} private final Xoud_regy_mgr regy_mgr = new Xoud_regy_mgr(); + public Xoud_history_mgr History_mgr() {return history_mgr;} private final Xoud_history_mgr history_mgr = new Xoud_history_mgr(); + public Xoud_site_mgr Site_mgr() {return site_mgr;} private final Xoud_site_mgr site_mgr = new Xoud_site_mgr(); + public void Init_by_boot(Db_conn user_db_provider) { + user_db.Schema().Loader_(Schema_loader_mgr_.Sqlite); + Init_user_db_changes(user_db.Schema().Updater()); + user_db.Init(user_db_provider); + regy_mgr.Init(user_db_provider); + site_mgr.Init(user_db_provider); + history_mgr.History_tbl().Conn_(user_db_provider); + } + private void Init_user_db_changes(Schema_update_mgr updater) { + updater.Add(Schema_update_cmd_.Make_tbl_create(Xoud_regy_tbl.Tbl_name , Xoud_regy_tbl.Tbl_sql , Xoud_regy_tbl.Idx_core)); + updater.Add(Schema_update_cmd_.Make_tbl_create(Xoud_history_tbl.Tbl_name, Xoud_history_tbl.Tbl_sql , Xoud_history_tbl.Idx_core)); + updater.Add(Schema_update_cmd_.Make_tbl_create(Xoud_site_tbl.Tbl_name , Xoud_site_tbl.Tbl_sql)); + } +} diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_history_mgr.java b/400_xowa/src/gplx/xowa/users/data/Xoud_history_mgr.java new file mode 100644 index 000000000..1c636f532 --- /dev/null +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_history_mgr.java @@ -0,0 +1,52 @@ +/* +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.users.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*; +import gplx.threads.*; +public class Xoud_history_mgr implements GfoInvkAble { + public Xoud_history_tbl History_tbl() {return history_tbl;} private final Xoud_history_tbl history_tbl = new Xoud_history_tbl(); + public void Update_async(Gfo_async_mgr async_mgr, Xoa_ttl ttl, Xoa_url url) { +// if (Skip_history(ttl)) return; +// async_mgr.Queue(this, Invk_update, "wiki", String_.new_utf8_(url.Wiki_bry()), "page", String_.new_utf8_(url.Page_bry()), "qarg", String_.new_utf8_(url.Args_all_as_bry())); + } + private void Update(String wiki, String page, String qarg) { + Xoud_history_row row = history_tbl.Select_by_page(wiki, page, qarg); + DateAdp time = DateAdp_.Now(); + if (row == null) + history_tbl.Insert(wiki, page, qarg, time, 1); + else + history_tbl.Update(wiki, page, qarg, time, row.History_count() + 1); + } + public void Select(ListAdp rv, int top) { + history_tbl.Select_by_top(rv, top); + } + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk_update)) Update(m.ReadStr("wiki"), m.ReadStr("page"), m.ReadStr("qarg")); + else return GfoInvkAble_.Rv_unhandled; + return this; + } private static final String Invk_update = "update"; + public static boolean Skip_history(Xoa_ttl ttl) { + byte[] page_db = ttl.Page_db(); + return ( ttl.Ns().Id_special() + && ( Bry_.Eq(page_db, gplx.xowa.users.history.Xou_history_mgr.Ttl_name) // do not add XowaPageHistory to history + || Bry_.Eq(page_db, gplx.xowa.specials.xowa.popup_history.Popup_history_page.Ttl_name_bry) + || Bry_.Eq(page_db, gplx.xowa.specials.xowa.default_tab.Default_tab_page.Ttl_name_bry) + || Bry_.Eq(page_db, Xoud_history_special.Ttl_name) + ) + ); + } +} diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_history_row.java b/400_xowa/src/gplx/xowa/users/data/Xoud_history_row.java new file mode 100644 index 000000000..7835c2b41 --- /dev/null +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_history_row.java @@ -0,0 +1,32 @@ +/* +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.users.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*; +public class Xoud_history_row { + public Xoud_history_row(String history_wiki, String history_page, String history_qarg, DateAdp history_time, int history_count) { + this.history_wiki = history_wiki; + this.history_page = history_page; + this.history_qarg = history_qarg; + this.history_time = history_time; + this.history_count = history_count; + } + public String History_wiki() {return history_wiki;} private final String history_wiki; + public String History_page() {return history_page;} private final String history_page; + public String History_qarg() {return history_qarg;} private final String history_qarg; + public DateAdp History_time() {return history_time;} private final DateAdp history_time; + public int History_count() {return history_count;} private final int history_count; +} diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_history_special.java b/400_xowa/src/gplx/xowa/users/data/Xoud_history_special.java new file mode 100644 index 000000000..3120b26b6 --- /dev/null +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_history_special.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.xowa.users.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*; +import gplx.xowa.specials.*; +public class Xoud_history_special implements Bry_fmtr_arg, Xows_page { + private ListAdp rows = ListAdp_.new_(); + public void Special_gen(Xoa_url calling_url, Xoa_page page, Xow_wiki wiki, Xoa_ttl ttl) { + Xoa_app app = wiki.App(); + Xoud_history_mgr mgr = app.User().Data_mgr().History_mgr(); + mgr.Select(rows, 100); + Bry_bfr bfr = app.Utl_bry_bfr_mkr().Get_m001(); + html_grp.Bld_bfr_many(bfr, this); + page.Data_raw_(bfr.Mkr_rls().Xto_bry_and_clear()); + } + public void XferAry(Bry_bfr bfr, int idx) { + int len = rows.Count(); + for (int i = 0; i < len; i++) { + Xoud_history_row row = (Xoud_history_row)rows.FetchAt(i); + html_itm.Bld_bfr_many(bfr, row.History_wiki(), row.History_page(), row.History_count(), row.History_time().XtoStr_fmt_yyyy_MM_dd_HH_mm()); + } + } + private static Bry_fmtr html_grp = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last + ( "" + , " " + , " " + , " " + , " " + , " " + , " ~{itms}" + , "
pagewikiviewstime
" + ), "itms" + ); + private static Bry_fmtr html_itm = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last + ( "" + , " " + , " [[~{itm_wiki}:~{itm_page}|~{itm_page}]]" + , " ~{itm_wiki}" + , " ~{itm_count}" + , " ~{itm_last}" + , " " + ), "itm_wiki", "itm_page", "itm_count", "itm_last" + ); + public static final byte[] Ttl_name = Bry_.new_ascii_("XowaHistory"); +} diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_history_tbl.java b/400_xowa/src/gplx/xowa/users/data/Xoud_history_tbl.java new file mode 100644 index 000000000..53291940c --- /dev/null +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_history_tbl.java @@ -0,0 +1,99 @@ +/* +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.users.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*; +import gplx.dbs.*; import gplx.dbs.schemas.*; import gplx.dbs.schemas.updates.*; +public class Xoud_history_tbl { + private Db_stmt stmt_select_by_page, stmt_select_by_top, stmt_insert, stmt_update, stmt_delete; + public Db_conn Conn() {return conn;} public Xoud_history_tbl Conn_(Db_conn v) {this.Rls_all(); conn = v; return this;} private Db_conn conn; + @gplx.Virtual public void Insert(String wiki, String page, String qarg, DateAdp time, int count) { + if (stmt_insert == null) stmt_insert = Db_stmt_.new_insert_(conn, Tbl_name, Flds__all); + try { + stmt_insert.Clear().Val_str(wiki).Val_str(page).Val_str(qarg).Val_str(time.XtoStr_fmt_iso_8561()).Val_int(count).Exec_insert(); + } + catch (Exception exc) {stmt_insert = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail + } + @gplx.Virtual public void Update(String wiki, String page, String qarg, DateAdp time, int count) { + if (stmt_update == null) stmt_update = Db_stmt_.new_update_(conn, Tbl_name, String_.Ary(Fld_history_wiki, Fld_history_page, Fld_history_qarg), String_.Ary(Fld_history_time, Fld_history_count)); + try { + stmt_update.Clear().Val_str(time.XtoStr_fmt_iso_8561()).Val_int(count).Val_str(wiki).Val_str(page).Val_str(qarg).Exec_update(); + } + catch (Exception exc) {stmt_update = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail + } + @gplx.Virtual public void Delete(String wiki, String page, String qarg) { + if (stmt_delete == null) stmt_delete = Db_stmt_.new_delete_(conn, Tbl_name, Fld_history_wiki, Fld_history_page, Fld_history_qarg); + try {stmt_delete.Clear().Val_str(wiki).Val_str(page).Val_str(qarg).Exec_delete();} + catch (Exception exc) {stmt_delete = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail + } + @gplx.Virtual public Xoud_history_row Select_by_page(String wiki, String page, String qarg) { + if (stmt_select_by_page == null) stmt_select_by_page = Db_stmt_.new_select_as_rdr(conn, Db_qry__select_in_tbl.new_(Tbl_name, String_.Ary(Fld_history_wiki, Fld_history_page, Fld_history_qarg), Flds__all)); + try { + Db_rdr rdr = stmt_select_by_page.Clear().Val_str(wiki).Val_str(page).Val_str(qarg).Exec_select_as_rdr(); + Xoud_history_row rv = null; + if (rdr.Move_next()) + rv = Make_row(rdr); + rdr.Rls(); + return rv; + } + catch (Exception exc) {stmt_select_by_page = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail + } + @gplx.Virtual public void Select_by_top(ListAdp rv, int count) { + Db_qry__select_in_tbl qry = new Db_qry__select_in_tbl(Tbl_name, Flds__all, null, null, null, Fld_history_time + " DESC", " LIMIT " + Int_.Xto_str(count)); + stmt_select_by_top = Db_stmt_.new_select_as_rdr(conn, qry); + try { + Db_rdr rdr = stmt_select_by_top.Clear().Exec_select_as_rdr(); + rv.Clear(); + while (rdr.Move_next()) { + Xoud_history_row row = Make_row(rdr); + rv.Add(row); + } + rdr.Rls(); + } + catch (Exception exc) {stmt_select_by_top = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail + } + private Xoud_history_row Make_row(Db_rdr rdr) { + return new Xoud_history_row + ( rdr.Read_str(0) + , rdr.Read_str(1) + , rdr.Read_str(2) + , rdr.Read_date_by_str(3) + , rdr.Read_int(4) + ); + } + public void Rls_all() { + if (stmt_select_by_page != null) {stmt_select_by_page.Rls(); stmt_select_by_page = null;} + if (stmt_select_by_top != null) {stmt_select_by_top.Rls(); stmt_select_by_top = null;} + if (stmt_insert != null) {stmt_insert.Rls(); stmt_insert = null;} + if (stmt_update != null) {stmt_update.Rls(); stmt_update = null;} + if (stmt_delete != null) {stmt_delete.Rls(); stmt_delete = null;} + conn = null; + } + public static final String Tbl_name = "user_history", Fld_history_wiki = "history_wiki", Fld_history_page = "history_page", Fld_history_qarg = "history_qarg" + , Fld_history_time = "history_time", Fld_history_count = "history_count" + ; + private static final String[] Flds__all = new String[] {Fld_history_wiki, Fld_history_page, Fld_history_qarg, Fld_history_time, Fld_history_count}; + public static final String Tbl_sql = String_.Concat_lines_nl + ( "CREATE TABLE user_history" + , "( history_wiki nvarchar(255) NOT NULL" + , ", history_page nvarchar(255) NOT NULL" + , ", history_qarg nvarchar(255) NOT NULL" + , ", history_time nvarchar(20) NOT NULL" + , ", history_count integer NOT NULL" + , ");" + ); + public static final Db_idx_itm Idx_core = Db_idx_itm.sql_("CREATE UNIQUE INDEX user_history_core ON user_history (history_wiki, history_page, history_qarg);"); +} diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_regy_mgr.java b/400_xowa/src/gplx/xowa/users/data/Xoud_regy_mgr.java new file mode 100644 index 000000000..33274c939 --- /dev/null +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_regy_mgr.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.xowa.users.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*; +import gplx.dbs.*; +public class Xoud_regy_mgr { + private Xoud_regy_tbl regy_tbl = new Xoud_regy_tbl(); + public void Init(Db_conn conn) { + regy_tbl.Conn_(conn); + } + public byte[] Select_bry_or(String key, byte[] or) {return Select_bry_or("", key, or);} + public byte[] Select_bry_or(String grp, String key, byte[] or) { + String rv = regy_tbl.Select_val(grp, key); + return rv == null ? or : Bry_.new_utf8_(rv); + } + public byte[] Assert_bry_or(String key, byte[] or) {return Assert_bry_or("", key, or);} + public byte[] Assert_bry_or(String grp, String key, byte[] or) { + String rv = regy_tbl.Select_val(grp, key); + if (rv == null) { + Insert_bry(grp, key, or); + return or; + } + else + return Bry_.new_utf8_(rv); + } + public void Update_bry(String key, byte[] val) {Update_bry("", key, val);} + public void Update_bry(String grp, String key, byte[] val) {regy_tbl.Update(grp, key, String_.new_utf8_(val));} + public void Insert_bry(String key, byte[] val) {Insert_bry("", key, val);} + public void Insert_bry(String grp, String key, byte[] val) {regy_tbl.Insert(grp, key, String_.new_utf8_(val));} + public int Next_id(String tbl) { + String grp = "xowa." + tbl, key = "next_id"; + int next_id = Int_.parse_or_(regy_tbl.Select_val(grp, key), 1); // EX: xowa.cfg_history|next_id|1 + String new_val = Int_.Xto_str(next_id + 1); + if (next_id == 1) + regy_tbl.Insert(grp, key, new_val); + else + regy_tbl.Update(grp, key, new_val); + return next_id; + } +} diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_regy_row.java b/400_xowa/src/gplx/xowa/users/data/Xoud_regy_row.java new file mode 100644 index 000000000..1bfcccbc3 --- /dev/null +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_regy_row.java @@ -0,0 +1,24 @@ +/* +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.users.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*; +public class Xoud_regy_row { + public Xoud_regy_row(String cfg_grp, String cfg_key, String cfg_val) {this.cfg_grp = cfg_grp; this.cfg_key = cfg_key; this.cfg_val = cfg_val;} + public String Cfg_grp() {return cfg_grp;} private final String cfg_grp; + public String Cfg_key() {return cfg_key;} private final String cfg_key; + public String Cfg_val() {return cfg_val;} private final String cfg_val; +} diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_regy_tbl.java b/400_xowa/src/gplx/xowa/users/data/Xoud_regy_tbl.java new file mode 100644 index 000000000..e521b4ca3 --- /dev/null +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_regy_tbl.java @@ -0,0 +1,87 @@ +/* +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.users.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*; +import gplx.dbs.*; import gplx.dbs.schemas.*; import gplx.dbs.schemas.updates.*; +public class Xoud_regy_tbl { + private Db_stmt stmt_select_grp, stmt_select_key, stmt_insert, stmt_update, stmt_delete; + public Db_conn Conn() {return conn;} public Xoud_regy_tbl Conn_(Db_conn v) {this.Rls_all(); conn = v; return this;} private Db_conn conn; + @gplx.Virtual public void Insert(String grp, String key, String val) { + if (stmt_insert == null) stmt_insert = Db_stmt_.new_insert_(conn, Tbl_name, Flds__all); + try {stmt_insert.Clear().Val_str(grp).Val_str(key).Val_str(val).Exec_insert();} + catch (Exception exc) {stmt_insert = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail + } + @gplx.Virtual public void Update(String grp, String key, String val) { + if (stmt_update == null) stmt_update = Db_stmt_.new_update_(conn, Tbl_name, String_.Ary(Fld_regy_grp, Fld_regy_key), Fld_regy_val); + try {stmt_update.Clear().Val_str(val).Val_str(grp).Val_str(key).Exec_update();} + catch (Exception exc) {stmt_update = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail + } + @gplx.Virtual public void Delete(String grp, String key) { + if (stmt_delete == null) stmt_delete = Db_stmt_.new_delete_(conn, Tbl_name, Fld_regy_grp, Fld_regy_key); + try {stmt_delete.Clear().Val_str(grp).Val_str(key).Exec_delete();} + catch (Exception exc) {stmt_delete = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail + } + @gplx.Virtual public void Select_by_grp(ListAdp rv, String grp) { + if (stmt_select_grp == null) stmt_select_grp = Db_stmt_.new_select_as_rdr(conn, Db_qry__select_in_tbl.new_(Tbl_name, String_.Ary(Fld_regy_grp), Flds__all)); + try { + Db_rdr rdr = stmt_select_grp.Clear().Val_str(grp).Exec_select_as_rdr(); + while (rdr.Move_next()) { + Xoud_regy_row row = Make_row(rdr); + rv.Add(row); + } + rdr.Rls(); + } + catch (Exception exc) {stmt_select_grp = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail + } + @gplx.Virtual public String Select_val(String grp, String key) { + if (stmt_select_key == null) stmt_select_key = Db_stmt_.new_select_as_rdr(conn, Db_qry__select_in_tbl.new_(Tbl_name, String_.Ary(Fld_regy_grp, Fld_regy_key), Flds__all)); + try { + Db_rdr rdr = stmt_select_key.Clear().Val_str(grp).Val_str(key).Exec_select_as_rdr(); + String rv = null; + if (rdr.Move_next()) + rv = rdr.Read_str(2); + rdr.Rls(); + return rv; + } + catch (Exception exc) {stmt_select_key = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail + } + private Xoud_regy_row Make_row(Db_rdr rdr) { + return new Xoud_regy_row + ( rdr.Read_str(0) + , rdr.Read_str(1) + , rdr.Read_str(2) + ); + } + public void Rls_all() { + if (stmt_select_grp != null) {stmt_select_grp.Rls(); stmt_select_grp = null;} + if (stmt_select_key != null) {stmt_select_key.Rls(); stmt_select_key = null;} + if (stmt_insert != null) {stmt_insert.Rls(); stmt_insert = null;} + if (stmt_update != null) {stmt_update.Rls(); stmt_update = null;} + if (stmt_delete != null) {stmt_delete.Rls(); stmt_delete = null;} + conn = null; + } + public static final String Tbl_name = "user_regy", Fld_regy_grp = "regy_grp", Fld_regy_key = "regy_key", Fld_regy_val = "regy_val"; + private static final String[] Flds__all = new String[] {Fld_regy_grp, Fld_regy_key, Fld_regy_val}; + public static final Db_idx_itm Idx_core = Db_idx_itm.sql_("CREATE UNIQUE INDEX user_regy_core ON user_regy (regy_grp, regy_key);"); + public static final String Tbl_sql = String_.Concat_lines_nl + ( "CREATE TABLE user_regy" + , "( regy_grp nvarchar(255) NOT NULL -- EX: xowa.schema.site" + , ", regy_key nvarchar(255) NOT NULL -- EX: next_id" + , ", regy_val nvarchar(255) NOT NULL -- EX: 1" + , ");" + ); +} diff --git a/400_xowa/src/gplx/xowa/users/dbs/Xou_db_mgr.java b/400_xowa/src/gplx/xowa/users/dbs/Xou_db_mgr.java index 5d5a19feb..ba6fa87b2 100644 --- a/400_xowa/src/gplx/xowa/users/dbs/Xou_db_mgr.java +++ b/400_xowa/src/gplx/xowa/users/dbs/Xou_db_mgr.java @@ -24,17 +24,17 @@ public class Xou_db_mgr { private Xou_db_xtn_mgr xtn_mgr = new Xou_db_xtn_mgr(); private ListAdp wkr_list = ListAdp_.new_(); public Xou_db_mgr(Xoa_app app) {this.app = app;} - public Db_provider Provider() {return provider;} private Db_provider provider; + public Db_conn Conn() {return conn;} private Db_conn conn; public void App_init() { db_url = app.User().Fsys_mgr().Root_dir().OwnerDir().GenSubFil_ary("xowa.user.", app.User().Key_str(), ".sqlite3"); Bool_obj_ref created_ref = Bool_obj_ref.n_(); - provider = Sqlite_engine_.Provider_load_or_make_(db_url, created_ref); + conn = Sqlite_engine_.Conn_load_or_make_(db_url, created_ref); if (created_ref.Val()) { - xtn_mgr.Db_when_new(provider); - Xodb_xowa_cfg_tbl.Create_table(provider); - Xodb_xowa_cfg_tbl.Create_index(provider); + xtn_mgr.Db_when_new(conn); + Xodb_xowa_cfg_tbl.Create_table(conn); + Xodb_xowa_cfg_tbl.Create_index(conn); } - xtn_mgr.Db_init(provider); + xtn_mgr.Db_init(conn); } public void App_save() { try { @@ -50,15 +50,15 @@ public class Xou_db_mgr { } public void App_term() { try { - app.Usr_dlg().Note_many("", "", "user_db.shut_down.bgn: ~{0}", provider.Conn_info().Str_raw()); + app.Usr_dlg().Note_many("", "", "user_db.shut_down.bgn: ~{0}", conn.Url().Xto_raw()); this.App_save(); int wkr_len = wkr_list.Count(); for (int i = 0; i < wkr_len; i++) { Xou_db_wkr wkr = (Xou_db_wkr)wkr_list.FetchAt(i); wkr.Db_term(this); } - provider.Txn_mgr().Txn_end_all(); - provider.Conn_term(); + conn.Txn_mgr().Txn_end_all(); + conn.Conn_term(); app.Usr_dlg().Note_many("", "", "user_db.shut_down.end"); } catch (Exception e) { @@ -71,7 +71,7 @@ public class Xou_db_mgr { xtn_mgr.Xtn_add(wkr.Xtn_key(), wkr.Xtn_version()); // NOTE: xowa_xtn sometimes empty; add xtn before loading; if error below then xtn still added; DATE:2013-12-29 wkr.Db_when_new(this); xtn_mgr.Db_save(); // always save... - provider.Txn_mgr().Txn_end_all_bgn_if_none(); // ... and commit, b/c HTTP_Server never formally exits; DATE:2014-03-06 + conn.Txn_mgr().Txn_end_all_bgn_if_none(); // ... and commit, b/c HTTP_Server never formally exits; DATE:2014-03-06 } } } diff --git a/400_xowa/src/gplx/xowa/users/dbs/Xou_db_xtn_mgr.java b/400_xowa/src/gplx/xowa/users/dbs/Xou_db_xtn_mgr.java index 0f8c70cd3..b097ac137 100644 --- a/400_xowa/src/gplx/xowa/users/dbs/Xou_db_xtn_mgr.java +++ b/400_xowa/src/gplx/xowa/users/dbs/Xou_db_xtn_mgr.java @@ -20,12 +20,12 @@ import gplx.dbs.*; class Xou_db_xtn_mgr { private Xou_db_xtn_tbl xtn_tbl = new Xou_db_xtn_tbl(); private OrderedHash xtn_hash = OrderedHash_.new_(); - public void Db_init(Db_provider provider) { - xtn_tbl.Db_init(provider); + public void Db_init(Db_conn conn) { + xtn_tbl.Db_init(conn); xtn_tbl.Select_all(xtn_hash); } - public void Db_when_new(Db_provider provider) { - xtn_tbl.Db_when_new(provider); + public void Db_when_new(Db_conn conn) { + xtn_tbl.Db_when_new(conn); } public void Db_save() { int len = xtn_hash.Count(); diff --git a/400_xowa/src/gplx/xowa/users/dbs/Xou_db_xtn_tbl.java b/400_xowa/src/gplx/xowa/users/dbs/Xou_db_xtn_tbl.java index 26926aebf..359bd6e3d 100644 --- a/400_xowa/src/gplx/xowa/users/dbs/Xou_db_xtn_tbl.java +++ b/400_xowa/src/gplx/xowa/users/dbs/Xou_db_xtn_tbl.java @@ -18,16 +18,16 @@ along with this program. If not, see . package gplx.xowa.users.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*; import gplx.dbs.*; class Xou_db_xtn_tbl { - private Db_provider provider; + private Db_conn conn; private Db_stmt_bldr stmt_bldr; - public void Db_init(Db_provider provider) {this.provider = provider;} + public void Db_init(Db_conn conn) {this.conn = conn;} public void Db_save(Xou_db_xtn_itm itm) { - if (stmt_bldr == null) stmt_bldr = new Db_stmt_bldr(Tbl_name, String_.Ary(Fld_xtn_key), Fld_xtn_version).Init(provider); + if (stmt_bldr == null) stmt_bldr = new Db_stmt_bldr(Tbl_name, String_.Ary(Fld_xtn_key), Fld_xtn_version).Init(conn); Db_stmt stmt = stmt_bldr.Get(itm.Cmd_mode()); switch (itm.Cmd_mode()) { - case Db_cmd_mode.Create: stmt.Clear().Val_str_(itm.Key()).Val_str_(itm.Version()).Exec_insert(); break; - case Db_cmd_mode.Update: stmt.Clear() .Val_str_(itm.Version()).Val_str_(itm.Key()).Exec_update(); break; - case Db_cmd_mode.Delete: stmt.Clear().Val_str_(itm.Key()).Exec_delete(); break; + case Db_cmd_mode.Create: stmt.Clear().Val_str(itm.Key()).Val_str(itm.Version()).Exec_insert(); break; + case Db_cmd_mode.Update: stmt.Clear() .Val_str(itm.Version()).Val_str(itm.Key()).Exec_update(); break; + case Db_cmd_mode.Delete: stmt.Clear().Val_str(itm.Key()).Exec_delete(); break; case Db_cmd_mode.Ignore: break; default: throw Err_.unhandled(itm.Cmd_mode()); } @@ -36,15 +36,15 @@ class Xou_db_xtn_tbl { public void Db_term() { if (stmt_bldr != null) stmt_bldr.Rls(); } - public void Db_when_new(Db_provider provider) { - Sqlite_engine_.Tbl_create(provider, Tbl_name, Tbl_sql); - Sqlite_engine_.Idx_create(provider, Idx_key); + public void Db_when_new(Db_conn conn) { + Sqlite_engine_.Tbl_create(conn, Tbl_name, Tbl_sql); + Sqlite_engine_.Idx_create(conn, Idx_key); } public void Select_all(OrderedHash list) { list.Clear(); DataRdr rdr = DataRdr_.Null; try { - rdr = Db_qry_.select_tbl_(Tbl_name).Exec_qry_as_rdr(provider); + rdr = Db_qry_.select_tbl_(Tbl_name).Exec_qry_as_rdr(conn); while (rdr.MoveNextPeer()) { Xou_db_xtn_itm itm = new Xou_db_xtn_itm(); itm.Init_by_load(rdr); diff --git a/400_xowa/src/gplx/xowa/users/history/Xou_history_mgr.java b/400_xowa/src/gplx/xowa/users/history/Xou_history_mgr.java index 604d24b7b..36a4168d4 100644 --- a/400_xowa/src/gplx/xowa/users/history/Xou_history_mgr.java +++ b/400_xowa/src/gplx/xowa/users/history/Xou_history_mgr.java @@ -56,14 +56,8 @@ public class Xou_history_mgr implements GfoInvkAble { Add(url, ttl, page_ttl); } public void Add(Xoa_url url, Xoa_ttl ttl, byte[] page_ttl) { + if (gplx.xowa.users.data.Xoud_history_mgr.Skip_history(ttl)) return; if (!load_chk) Load(); - byte[] page_db = ttl.Page_db(); - if ( ttl.Ns().Id_special() - && ( Bry_.Eq(page_db, Xou_history_mgr.Ttl_name) // do not add XowaPageHistory to history - || Bry_.Eq(page_db, gplx.xowa.specials.xowa.popup_history.Popup_history_page.Ttl_name_bry) - || Bry_.Eq(page_db, gplx.xowa.specials.xowa.default_tab.Default_tab_page.Ttl_name_bry) - ) - ) return; byte[] key = Xou_history_itm.key_(url.Wiki_bry(), page_ttl); Xou_history_itm itm = (Xou_history_itm)itms.Fetch(key); if (itm == null) { diff --git a/400_xowa/src/gplx/xowa/wikis/Xow_wiki_domain_.java b/400_xowa/src/gplx/xowa/wikis/Xow_wiki_domain_.java index 042f4f0f7..92816256b 100644 --- a/400_xowa/src/gplx/xowa/wikis/Xow_wiki_domain_.java +++ b/400_xowa/src/gplx/xowa/wikis/Xow_wiki_domain_.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.wikis; import gplx.*; import gplx.xowa.*; public class Xow_wiki_domain_ { public static byte[] Key_by_tid(byte tid) {return Key__ary[tid];} - public static final byte Tid_by_key_null = Byte_.MaxValue_127; + public static final byte Tid_by_key_null = Byte_.Max_value_127; public static byte Tid_by_key(byte[] key) { Object o = key_hash.Get_by_bry(key); return o == null ? Tid_by_key_null : ((Byte_obj_val)o).Val(); diff --git a/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_xwiki_mgr.java b/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_xwiki_mgr.java index 9ba68898f..da1c7bf28 100644 --- a/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_xwiki_mgr.java +++ b/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_xwiki_mgr.java @@ -17,10 +17,12 @@ along with this program. If not, see . */ package gplx.xowa.wikis.xwikis; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; public class Xow_xwiki_mgr implements GfoInvkAble { - private Xow_xwiki_mgr_srl srl; + private Xow_wiki wiki; private Xow_xwiki_mgr_srl srl; public Xow_xwiki_mgr() {} // FIXME: current placeholder for viewer - public Xow_xwiki_mgr(Xow_wiki wiki) {this.wiki = wiki; srl = new Xow_xwiki_mgr_srl(this);} - public Xow_wiki Wiki() {return wiki;} private Xow_wiki wiki; + public Xow_xwiki_mgr(Xow_wiki wiki, Gfo_url_parser url_parser, byte cur_wiki_tid) { + this.wiki = wiki; + srl = new Xow_xwiki_mgr_srl(this, url_parser, cur_wiki_tid); + } public Xow_lang_mgr Lang_mgr() {return lang_mgr;} private Xow_lang_mgr lang_mgr = Xow_lang_mgr.dflt_(); public int Len() {return list.Count();} private OrderedHash list = OrderedHash_.new_bry_(); private Hash_adp_bry hash = Hash_adp_bry.ci_ascii_(); // ASCII:lang_code public void Clear() {hash.Clear(); list.Clear();} diff --git a/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_xwiki_mgr_srl.java b/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_xwiki_mgr_srl.java index f4dd3c17b..7534a9c65 100644 --- a/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_xwiki_mgr_srl.java +++ b/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_xwiki_mgr_srl.java @@ -18,14 +18,11 @@ along with this program. If not, see . package gplx.xowa.wikis.xwikis; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.srls.dsvs.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.xwikis.*; class Xow_xwiki_mgr_srl extends Dsv_wkr_base { - private Xow_xwiki_mgr mgr; private Xow_wiki wiki; private byte[] key, url_fmt, name; - private Gfo_url tmp_url; private Gfo_url_parser url_parser; - public Xow_xwiki_mgr_srl(Xow_xwiki_mgr mgr) { - this.mgr = mgr; - this.wiki = mgr.Wiki(); - this.tmp_url = new Gfo_url(); - this.url_parser = wiki.App().Url_parser().Url_parser(); + private final Xow_xwiki_mgr mgr; + private final Gfo_url_parser url_parser; private final byte cur_wiki_tid; private final Gfo_url tmp_url = new Gfo_url(); private final Bry_bfr tmp_bfr = Bry_bfr.reset_(255); + public Xow_xwiki_mgr_srl(Xow_xwiki_mgr mgr, Gfo_url_parser url_parser, byte cur_wiki_tid) { + this.mgr = mgr; this.url_parser = url_parser; this.cur_wiki_tid = cur_wiki_tid; } @Override public Dsv_fld_parser[] Fld_parsers() {return new Dsv_fld_parser[] {Dsv_fld_parser_.Bry_parser, Dsv_fld_parser_.Bry_parser, Dsv_fld_parser_.Bry_parser};} @Override public boolean Write_bry(Dsv_tbl_parser parser, int fld_idx, byte[] src, int bgn, int end) { @@ -37,9 +34,7 @@ class Xow_xwiki_mgr_srl extends Dsv_wkr_base { } } @Override public void Commit_itm(Dsv_tbl_parser parser, int pos) { - Xow_xwiki_itm itm = Xow_xwiki_itm_.new_mw_(tmp_bfr, url_parser, tmp_url, key, url_fmt, name, mgr.Wiki().Domain_tid()); + Xow_xwiki_itm itm = Xow_xwiki_itm_.new_mw_(tmp_bfr, url_parser, tmp_url, key, url_fmt, name, cur_wiki_tid); mgr.Add_itm(itm); } - @Override public void Load_by_bry_bgn() {tmp_bfr = wiki.Utl_bry_bfr_mkr().Get_b128();} private Bry_bfr tmp_bfr; - @Override public void Load_by_bry_end() {tmp_bfr.Mkr_rls();} } diff --git a/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_itm_keys.java b/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_itm_keys.java index b72f0c413..92272e0bb 100644 --- a/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_itm_keys.java +++ b/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_itm_keys.java @@ -35,7 +35,7 @@ class Dpl_itm_keys { } } public static final byte - Key_null = Byte_.MaxValue_127 + Key_null = Byte_.Max_value_127 , Key_category = 1 , Key_notcategory = 2 , Key_ns = 3 diff --git a/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_redirect.java b/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_redirect.java index 7c8d555e9..9741ebcde 100644 --- a/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_redirect.java +++ b/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_redirect.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.xtns.dynamicPageList; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; class Dpl_redirect { - public static final byte Tid_exclude = 0, Tid_include = 1, Tid_only = 2, Tid_unknown = Byte_.MaxValue_127; + public static final byte Tid_exclude = 0, Tid_include = 1, Tid_only = 2, Tid_unknown = Byte_.Max_value_127; public static byte Parse(byte[] bry) { byte key = Dpl_itm_keys.Parse(bry, Dpl_redirect.Tid_exclude); // NOTE: exclude is default value. switch (key) { diff --git a/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_xnde_tst.java b/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_xnde_tst.java index 274734feb..7f2743f4c 100644 --- a/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_xnde_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_xnde_tst.java @@ -167,6 +167,12 @@ public class Dpl_xnde_tst { , "" ), fxt.Ul(Itm_html_null, "B", "A")); } + @Test public void Err_page_ns_doesnt_exist() {// PURPOSE: check that is not enabled if wiki does not have Page / Index ns; PAGE:fr.w:Wikipedia:Le_Bistro/novembre_2006 DATE:2014-11-28 + fxt.Wiki().Ns_mgr_(Xow_ns_mgr_.default_(gplx.xowa.langs.cases.Xol_case_mgr_.Ascii())); + fxt.Wiki().Cfg_parser().Xtns().Itm_pages().Reset(); // must reset to clear cached valid ns_page from previous tests + fxt.Fxt().Test_parse_page_wiki_str("category=a", "No pages meet these criteria."); + fxt.Wiki().Cfg_parser().Xtns().Itm_pages().Reset(); // must reset to clear cached invalid ns_page for next tests + } private static final String Itm_html_null = null; } class Dpl_page_mok { @@ -185,8 +191,13 @@ class Dpl_xnde_fxt { fxt.App().Usr_dlg().Ui_wkr().Clear(); fxt.Wiki().Hive_mgr().Clear(); fxt.Wiki().Db_mgr().Save_mgr().Clear(); // NOTE: must clear to reset next_id to 0; Ctg_create assumes clean slate from 0 + fxt.Wiki().Xtn_mgr().Xtn_proofread().Enabled_y_(); + fxt.Wiki().Db_mgr().Load_mgr().Clear(); // must clear; otherwise fails b/c files get deleted, but wiki.data_mgr caches the Xowd_regy_mgr (the .reg file) in memory; + fxt.Wiki().Ns_mgr().Add_new(Xowc_xtn_pages.Ns_page_id_default, "Page").Add_new(Xowc_xtn_pages.Ns_index_id_default, "Index").Init(); Io_mgr._.InitEngine_mem(); } + public Xow_wiki Wiki() {return fxt.Wiki();} + public Xop_fxt Fxt() {return fxt;} public void Warns(String... v) {warns = v;} private String[] warns; public void Page_create(String page) {fxt.Init_page_create(page);} public void Ctg_create(String ctg, String... ttls) { diff --git a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser.java b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser.java index 6b689332a..94b7a2421 100644 --- a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser.java +++ b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser.java @@ -181,12 +181,15 @@ class Imap_parser { int img_bgn = Bry_finder.Trim_fwd_space_tab(src, itm_bgn, itm_end); // trim ws int img_end = Parse_img__get_img_end(itm_end, src_end); imap_img_src = Bry_.Add(Xop_tkn_.Lnki_bgn, Bry_.Mid(src, img_bgn, img_end), Xop_tkn_.Lnki_end); - Xop_lnki_tkn lnki_tkn = (Xop_lnki_tkn)Parse_link(imap_img_src); + Xop_tkn_itm tkn_itm = Parse_link(imap_img_src); // NOTE: need to parse before imap_root.Data_mid() below imap_img_src = imap_root.Data_mid(); // need to re-set src to pick up templates; EX: File:A.png|thumb|{{Test_template}}\n; PAGE:en.w:Kilauea; DATE:2014-07-27 Xop_lnki_logger file_wkr = wiki_ctx.Lnki().File_wkr(); // NOTE: do not do imap_ctx.Lnki(); imap_ctx is brand new - if (lnki_tkn == null) + if ( tkn_itm == null // no lnki or lnke + || tkn_itm.Tkn_tid() != Xop_tkn_itm_.Tid_lnki // no lnki; occurs with badly constructed maps; PAGE:en.w:Demography_of_the_United_Kingdom DATE:2015-01-22 + ) imap_ctx.Wiki().App().Usr_dlg().Warn_many("", "", "image_map failed to find lnki; page=~{0} imageMap=~{1}", String_.new_utf8_(imap_ctx.Cur_page().Ttl().Full_txt()), String_.new_utf8_(imap_img_src)); else { + Xop_lnki_tkn lnki_tkn = (Xop_lnki_tkn)tkn_itm; imap_img = new Imap_itm_img(lnki_tkn); lnki_tkn.Lnki_file_wkr_(imap); wiki_ctx.Cur_page().Lnki_list().Add(lnki_tkn); diff --git a/400_xowa/src/gplx/xowa/xtns/pfuncs/exprs/Pfunc_expr_ops.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/exprs/Pfunc_expr_ops.java index ef39e25bb..75fbbe8af 100644 --- a/400_xowa/src/gplx/xowa/xtns/pfuncs/exprs/Pfunc_expr_ops.java +++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/exprs/Pfunc_expr_ops.java @@ -60,7 +60,7 @@ class Num_tkn implements Expr_tkn { public String Val_str() {return String_.new_utf8_(val_ary);} public Num_tkn(int val_int) { this.val_int = val_int; - this.val_ary = new byte[] {Byte_.int_(val_int + Byte_ascii.Num_0)}; + this.val_ary = new byte[] {Byte_.By_int(val_int + Byte_ascii.Num_0)}; } int val_int; } class Dot_tkn implements Expr_tkn { diff --git a/400_xowa/src/gplx/xowa/xtns/pfuncs/ifs/Pfunc_ifexist_mgr.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/ifs/Pfunc_ifexist_mgr.java index c5caa524a..d2606344a 100644 --- a/400_xowa/src/gplx/xowa/xtns/pfuncs/ifs/Pfunc_ifexist_mgr.java +++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/ifs/Pfunc_ifexist_mgr.java @@ -65,7 +65,7 @@ public class Pfunc_ifexist_mgr { } else { if (!env_is_testing) - wiki.File_mgr().Fsdb_mgr().Init_by_wiki__add_bin_wkrs(wiki); // NOTE: must init Fsdb_mgr (else provider == null), and with bin_wkrs (else no images will ever load); DATE:2014-09-21 + wiki.File_mgr().Fsdb_mgr().Init_by_wiki__add_bin_wkrs(wiki); // NOTE: must init Fsdb_mgr (else conn == null), and with bin_wkrs (else no images will ever load); DATE:2014-09-21 return wiki.File_mgr().Exists(ttl_bry); // less-accurate test using either (1) orig_wiki table in local wiki (v2) or (2) meta_db_mgr (v1) } } diff --git a/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_filepath.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_filepath.java index c75e80361..865f17b08 100644 --- a/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_filepath.java +++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_filepath.java @@ -30,7 +30,7 @@ public class Pfunc_filepath extends Pf_func_base { if (page.Missing()) return; // page not found in commons; exit; byte[] ttl_bry = page.Ttl().Page_url(); Xofw_file_finder_rslt tmp_rslt = wiki.File_mgr().Repo_mgr().Page_finder_locate(ttl_bry); - if (tmp_rslt .Repo_idx() == Byte_.MaxValue_127) return; + if (tmp_rslt .Repo_idx() == Byte_.Max_value_127) return; Xof_repo_itm trg_repo = wiki.File_mgr().Repo_mgr().Repos_get_at(tmp_rslt.Repo_idx()).Trg(); xfer_itm.Set__ttl(ttl_bry, Bry_.Empty); // redirect is empty b/c Get_page does all redirect lookups byte[] url = url_bldr.Init_for_trg_html(Xof_repo_itm.Mode_orig, trg_repo, ttl_bry, xfer_itm.Lnki_md5(), xfer_itm.Lnki_ext(), Xof_img_size.Size_null_deprecated, Xof_doc_thumb.Null, Xof_doc_page.Null).Xto_bry(); diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/Scrib_invoke_func_fxt.java b/400_xowa/src/gplx/xowa/xtns/scribunto/Scrib_invoke_func_fxt.java index 64c60b29f..b8dad72c4 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/Scrib_invoke_func_fxt.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/Scrib_invoke_func_fxt.java @@ -181,10 +181,10 @@ class Scrib_lua_rsp_bldr { } private void Bld_obj(Bry_bfr bfr, Object v) { Class v_type = v.getClass(); - if (Object_.Eq(v_type, Int_.ClassOf)) Bld_int(bfr, Int_.cast_(v)); - else if (Object_.Eq(v_type, String_.ClassOf)) Bld_str(bfr, String_.cast_(v)); - else if (Object_.Eq(v_type, Bool_.ClassOf)) Bld_bool(bfr, Bool_.cast_(v)); - else if (Object_.Eq(v_type, Double_.ClassOf)) Bld_double(bfr, Double_.cast_(v)); + if (Object_.Eq(v_type, Int_.Cls_ref_type)) Bld_int(bfr, Int_.cast_(v)); + else if (Object_.Eq(v_type, String_.Cls_ref_type)) Bld_str(bfr, String_.cast_(v)); + else if (Object_.Eq(v_type, Bool_.Cls_ref_type)) Bld_bool(bfr, Bool_.cast_(v)); + else if (Object_.Eq(v_type, Double_.Cls_ref_type)) Bld_double(bfr, Double_.cast_(v)); else if (Object_.Eq(v_type, KeyVal[].class)) Bld_kv_ary(bfr, (KeyVal[])v); else if (Object_.Eq(v_type, Scrib_lua_proc.class)) Bld_fnc(bfr, (Scrib_lua_proc)v); else throw Err_.unhandled(ClassAdp_.NameOf_obj(v)); diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/engines/luaj/Luaj_value.java b/400_xowa/src/gplx/xowa/xtns/scribunto/engines/luaj/Luaj_value.java index 3e47e919d..ddc05e8b3 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/engines/luaj/Luaj_value.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/engines/luaj/Luaj_value.java @@ -86,10 +86,10 @@ class Luaj_value_ { public static LuaValue X_obj_to_val(Luaj_server server, Object o) { if (o == null) return LuaValue.NIL; Class c = ClassAdp_.ClassOf_obj(o); - if (Object_.Eq(c, Bool_.ClassOf)) return LuaValue.valueOf((Boolean)o); - else if (Object_.Eq(c, Int_.ClassOf)) return LuaValue.valueOf((Integer)o); - else if (Object_.Eq(c, Double_.ClassOf)) return LuaValue.valueOf((Double)o); - else if (Object_.Eq(c, String.class)) return LuaValue.valueOf((String)o); + if (Object_.Eq(c, Bool_.Cls_ref_type)) return LuaValue.valueOf((Boolean)o); + else if (Object_.Eq(c, Int_.Cls_ref_type)) return LuaValue.valueOf((Integer)o); + else if (Object_.Eq(c, Double_.Cls_ref_type)) return LuaValue.valueOf((Double)o); + else if (Object_.Eq(c, String_.Cls_ref_type)) return LuaValue.valueOf((String)o); else if (Object_.Eq(c, byte[].class)) return LuaValue.valueOf(String_.new_utf8_((byte[])o)); else if (Object_.Eq(c, KeyVal.class)) return X_kv_ary_to_tbl(server, (KeyVal)o); else if (Object_.Eq(c, KeyVal[].class)) return X_kv_ary_to_tbl(server, (KeyVal[])o); diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/engines/process/Process_send_wtr.java b/400_xowa/src/gplx/xowa/xtns/scribunto/engines/process/Process_send_wtr.java index 147e2edb1..b96cf2e93 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/engines/process/Process_send_wtr.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/engines/process/Process_send_wtr.java @@ -82,9 +82,9 @@ public class Process_send_wtr { public boolean Encode_obj(Bry_bfr bfr, Object o) { if (o == null) {bfr.Add(CONST_nil); return true;} Class c = ClassAdp_.ClassOf_obj(o); - if (Object_.Eq(c, Bool_.ClassOf)) Encode_bool(bfr, Bool_.cast_(o)); - else if (Object_.Eq(c, Int_.ClassOf)) Encode_int(bfr, Int_.cast_(o)); - else if (Object_.Eq(c, Double_.ClassOf)) {if (!Encode_double(bfr, Double_.cast_(o))) return false;} + if (Object_.Eq(c, Bool_.Cls_ref_type)) Encode_bool(bfr, Bool_.cast_(o)); + else if (Object_.Eq(c, Int_.Cls_ref_type)) Encode_int(bfr, Int_.cast_(o)); + else if (Object_.Eq(c, Double_.Cls_ref_type)) {if (!Encode_double(bfr, Double_.cast_(o))) return false;} else if (Object_.Eq(c, String.class)) {if (!Encode_str(bfr, (String)o)) return false;} else if (Object_.Eq(c, byte[].class)) {if (!Encode_str(bfr, (byte[])o)) return false;} // NOTE: not in Scribunto; added here for PERF of not re-creating a String Object else if (Object_.Eq(c, Scrib_lua_proc.class)) {if (!Encode_prc(bfr, (Scrib_lua_proc)o)) return false;} diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/engines/process/Process_server_mock.java b/400_xowa/src/gplx/xowa/xtns/scribunto/engines/process/Process_server_mock.java index 4efeccee1..c2ccf6358 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/engines/process/Process_server_mock.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/engines/process/Process_server_mock.java @@ -74,7 +74,7 @@ class Process_server_mock_rcvd_val implements Process_server_mock_rcvd { boolean kv_val_is_array = ClassAdp_.Eq(kv_val_type, KeyVal[].class); if (print_key && !kv_val_is_array) bfr.Add_str(kv.Key()).Add_byte(Byte_ascii.Colon); - if (ClassAdp_.Eq(kv_val_type, Bool_.ClassOf)) + if (ClassAdp_.Eq(kv_val_type, Bool_.Cls_ref_type)) bfr.Add(Bool_.cast_(kv_val) ? gplx.json.Json_itm_.Const_true : gplx.json.Json_itm_.Const_false); else if (kv_val_is_array) { KeyVal[] sub = (KeyVal[])kv_val; diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_mw.java b/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_mw.java index cc5042361..f1e76c1ea 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_mw.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_mw.java @@ -45,6 +45,7 @@ public class Scrib_lib_mw implements Scrib_lib { public boolean Procs_exec(int key, Scrib_proc_args args, Scrib_proc_rslt rslt) { switch (key) { case Proc_loadPackage: return LoadPackage(args, rslt); + case Proc_loadPHPLibrary: return LoadPHPLibrary(args, rslt); case Proc_frameExists: return FrameExists(args, rslt); case Proc_parentFrameExists: return ParentFrameExists(args, rslt); case Proc_getExpandedArgument: return GetExpandedArgument(args, rslt); @@ -61,15 +62,15 @@ public class Scrib_lib_mw implements Scrib_lib { } } public static final int - Proc_loadPackage = 0 - , Proc_frameExists = 1, Proc_parentFrameExists = 2 - , Proc_getExpandedArgument = 3, Proc_getAllExpandedArguments = 4 - , Proc_expandTemplate = 5, Proc_preprocess = 6, Proc_callParserFunction = 7 - , Proc_incrementExpensiveFunctionCount = 8, Proc_isSubsting = 9 - , Proc_newChildFrame = 10, Proc_getFrameTitle = 11, Proc_setTTL = 12 + Proc_loadPackage = 0, Proc_loadPHPLibrary = 1 + , Proc_frameExists = 2, Proc_parentFrameExists = 3 + , Proc_getExpandedArgument = 4, Proc_getAllExpandedArguments = 5 + , Proc_expandTemplate = 6, Proc_preprocess = 7, Proc_callParserFunction = 8 + , Proc_incrementExpensiveFunctionCount = 9, Proc_isSubsting = 10 + , Proc_newChildFrame = 11, Proc_getFrameTitle = 12, Proc_setTTL = 13 ; public static final String - Invk_loadPackage = "loadPackage" + Invk_loadPackage = "loadPackage", Invk_loadPHPLibrary = "loadPHPLibrary" , Invk_frameExists = "frameExists", Invk_parentFrameExists = "parentFrameExists" , Invk_getExpandedArgument = "getExpandedArgument", Invk_getAllExpandedArguments = "getAllExpandedArguments" , Invk_expandTemplate = "expandTemplate", Invk_preprocess = "preprocess", Invk_callParserFunction = "callParserFunction" @@ -77,7 +78,7 @@ public class Scrib_lib_mw implements Scrib_lib { , Invk_newChildFrame = "newChildFrame", Invk_getFrameTitle = "getFrameTitle", Invk_setTTL = "setTTL" ; private static final String[] Proc_names = String_.Ary - ( Invk_loadPackage + ( Invk_loadPackage, Invk_loadPHPLibrary , Invk_frameExists, Invk_parentFrameExists , Invk_getExpandedArgument, Invk_getAllExpandedArguments , Invk_expandTemplate, Invk_preprocess, Invk_callParserFunction @@ -96,6 +97,9 @@ public class Scrib_lib_mw implements Scrib_lib { Scrib_lua_mod mod = new Scrib_lua_mod(core, mod_name); return rslt.Init_obj(mod.LoadString(String_.new_utf8_(page.Data_raw()))); } + public boolean LoadPHPLibrary(Scrib_proc_args args, Scrib_proc_rslt rslt) { // NOTE: noop; Scribunto uses this to load the Scribunto_*Library classses (EX: Scribunto_TitleLibrary); DATE:2015-01-21 + return rslt.Init_obj(null); + } public boolean GetExpandedArgument(Scrib_proc_args args, Scrib_proc_rslt rslt) { String frame_id = args.Pull_str(0); Xot_invk frame = Scrib_frame_.Get_frame(core, frame_id); @@ -323,11 +327,11 @@ public class Scrib_lib_mw implements Scrib_lib { public boolean IsSubsting(Scrib_proc_args args, Scrib_proc_rslt rslt) { boolean is_substing = false; Xot_invk current_frame = core.Frame_current(); - if (current_frame != null && Xot_defn_.Tid_is_subst(current_frame.Defn_tid())) // check current frame first + if (current_frame != null && Xot_defn_.Tid_is_substing(current_frame.Defn_tid())) // check current frame first is_substing = true; else { // check owner frame next Xot_invk parent_frame = core.Frame_parent(); - if (parent_frame != null && Xot_defn_.Tid_is_subst(parent_frame.Defn_tid())) + if (parent_frame != null && Xot_defn_.Tid_is_substing(parent_frame.Defn_tid())) is_substing = true; } return rslt.Init_obj(is_substing); diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_mw__lib_tst.java b/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_mw__lib_tst.java index ebbc8fe91..00faaed75 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_mw__lib_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_mw__lib_tst.java @@ -83,4 +83,7 @@ public class Scrib_lib_mw__lib_tst { fxt.Test_scrib_proc_empty(lib, Scrib_lib_mw.Invk_setTTL, Object_.Ary(123)); Tfds.Eq(123, fxt.Core().Frame_current().Frame_lifetime()); } + @Test public void LoadPHPLibrary() { + fxt.Test_scrib_proc_str(lib, Scrib_lib_mw.Invk_loadPHPLibrary, Object_.Ary("mock_library") , Scrib_invoke_func_fxt.Null_rslt); + } } \ No newline at end of file diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_site.java b/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_site.java index 56c81c44d..598a085fa 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_site.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_site.java @@ -16,6 +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.xtns.scribunto.lib; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.scribunto.*; +import gplx.xowa.wikis.xwikis.*; public class Scrib_lib_site implements Scrib_lib { public Scrib_lib_site(Scrib_core core) {this.core = core;} private Scrib_core core; public Scrib_lua_mod Mod() {return mod;} private Scrib_lua_mod mod; @@ -33,13 +34,14 @@ public class Scrib_lib_site implements Scrib_lib { case Proc_pagesInCategory: return PagesInCategory(args, rslt); case Proc_pagesInNs: return PagesInNs(args, rslt); case Proc_usersInGroup: return UsersInGroup(args, rslt); + case Proc_interwikiMap: return InterwikiMap(args, rslt); case Proc_init_site_for_wiki: return Init_site_for_wiki(args, rslt); default: throw Err_.unhandled(key); } } - private static final int Proc_getNsIndex = 0, Proc_pagesInCategory = 1, Proc_pagesInNs = 2, Proc_usersInGroup = 3, Proc_init_site_for_wiki = 4; - public static final String Invk_getNsIndex = "getNsIndex", Invk_pagesInCategory = "pagesInCategory", Invk_pagesInNs = "pagesInName"+"space", Invk_usersInGroup = "usersInGroup", Invk_init_site_for_wiki = "init_site_for_wiki"; - private static final String[] Proc_names = String_.Ary(Invk_getNsIndex, Invk_pagesInCategory, Invk_pagesInNs, Invk_usersInGroup, Invk_init_site_for_wiki); + private static final int Proc_getNsIndex = 0, Proc_pagesInCategory = 1, Proc_pagesInNs = 2, Proc_usersInGroup = 3, Proc_interwikiMap = 4, Proc_init_site_for_wiki = 5; + public static final String Invk_getNsIndex = "getNsIndex", Invk_pagesInCategory = "pagesInCategory", Invk_pagesInNs = "pagesInName"+"space", Invk_usersInGroup = "usersInGroup", Invk_interwikiMap = "interwikiMap", Invk_init_site_for_wiki = "init_site_for_wiki"; + private static final String[] Proc_names = String_.Ary(Invk_getNsIndex, Invk_pagesInCategory, Invk_pagesInNs, Invk_usersInGroup, Invk_interwikiMap, Invk_init_site_for_wiki); public boolean GetNsIndex(Scrib_proc_args args, Scrib_proc_rslt rslt) { byte[] ns_name = args.Pull_bry(0); Object ns_obj = core.Wiki().Ns_mgr().Names_get_or_null(ns_name, 0, ns_name.length); @@ -61,6 +63,49 @@ public class Scrib_lib_site implements Scrib_lib { // byte[] grp_name = args.Pull_bry(0); return rslt.Init_obj(0); } + public boolean InterwikiMap(Scrib_proc_args args, Scrib_proc_rslt rslt) { + String filter = args.Cast_str_or_null(0); + int local = -1; + if (String_.Eq(filter, "local")) + local = 1; + else if (String_.Eq(filter, "!local")) + local = 0; + else if (filter != null) + throw Err_.new_fmt_("bad argument #1 to 'interwikiMap' (unknown filter '$filter')"); + // TODO: cache interwikimap results + Xow_xwiki_mgr xwiki_mgr = core.Wiki().Xwiki_mgr(); + int xwiki_len = xwiki_mgr.Len(); + KeyVal[][] rv = new KeyVal[xwiki_len][]; + for (int i = 0; i < xwiki_len; ++i) { + Xow_xwiki_itm itm = xwiki_mgr.Get_at(i); + boolean itm_is_local = itm.Offline(); + if (local == 1 && !itm_is_local) continue; + if (local == 0 && itm_is_local) continue; + String prefix = itm.Key_str(); + rv[i] = InterwikiMap_itm(itm, prefix, itm_is_local); + } + return rslt.Init_obj(rv); + } + private KeyVal[] InterwikiMap_itm(Xow_xwiki_itm itm, String prefix, boolean itm_is_local) { + boolean is_extralanguage_link = false; + int rv_len = 7; + if (is_extralanguage_link) rv_len += 2; + String url = String_.new_utf8_(itm.Domain()); + boolean url_is_relative = String_.HasAtBgn(url, "//"); + KeyVal[] rv = new KeyVal[rv_len]; + rv[ 0] = KeyVal_.new_("prefix" , prefix); + rv[ 1] = KeyVal_.new_("url" , url); // wfExpandUrl( $row['iw_url'], PROTO_RELATIVE ), + rv[ 2] = KeyVal_.new_("isProtocolRelative" , url_is_relative); // substr( $row['iw_url'], 0, 2 ) === '//', + rv[ 3] = KeyVal_.new_("isLocal" , itm_is_local); // isset( $row['iw_local'] ) && $row['iw_local'] == '1', + rv[ 4] = KeyVal_.new_("isTranscludable" , Bool_.N); // isset( $row['iw_trans'] ) && $row['iw_trans'] == '1', + rv[ 5] = KeyVal_.new_("isCurrentWiki" , Bool_.N); // in_array( $prefix, $wgLocalInterwikis ), + rv[ 6] = KeyVal_.new_("isExtraLanguageLink" , is_extralanguage_link); // in_array( $prefix, $wgExtraInterlanguageLinkPrefixes ), + if (is_extralanguage_link) { + rv[7] = KeyVal_.new_("displayText" , "displayText_TODO"); // $displayText = wfMessage( "interlanguage-link-$prefix" ); if ( !$displayText->isDisabled() ) ... + rv[7] = KeyVal_.new_("tooltip" , "tooltip_TODO"); // $tooltip = wfMessage( "interlanguage-link-sitename-$prefix" ); + } + return rv; + } public void Notify_wiki_changed() {if (notify_wiki_changed_fnc != null) core.Interpreter().CallFunction(notify_wiki_changed_fnc.Id(), KeyVal_.Ary_empty);} public boolean Init_site_for_wiki(Scrib_proc_args args, Scrib_proc_rslt rslt) { Xow_wiki wiki = core.Wiki(); diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_text.java b/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_text.java index 743d97f42..fbd28a0ea 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_text.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_text.java @@ -31,15 +31,19 @@ public class Scrib_lib_text implements Scrib_lib { public boolean Procs_exec(int key, Scrib_proc_args args, Scrib_proc_rslt rslt) { switch (key) { case Proc_unstrip: return Unstrip(args, rslt); + case Proc_unstripNoWiki: return UnstripNoWiki(args, rslt); + case Proc_killMarkers: return KillMarkers(args, rslt); case Proc_getEntityTable: return GetEntityTable(args, rslt); case Proc_init_text_for_wiki: return Init_text_for_wiki(args, rslt); default: throw Err_.unhandled(key); } } - private static final int Proc_unstrip = 0, Proc_getEntityTable = 1, Proc_init_text_for_wiki = 2; - public static final String Invk_unstrip = "unstrip", Invk_getEntityTable = "getEntityTable", Invk_init_text_for_wiki = "init_text_for_wiki"; - private static final String[] Proc_names = String_.Ary(Invk_unstrip, Invk_getEntityTable, Invk_init_text_for_wiki); - public boolean Unstrip(Scrib_proc_args args, Scrib_proc_rslt rslt) {return rslt.Init_obj(args.Pull_str(0));} + private static final int Proc_unstrip = 0, Proc_unstripNoWiki = 1, Proc_killMarkers = 2, Proc_getEntityTable = 3, Proc_init_text_for_wiki = 4; + public static final String Invk_unstrip = "unstrip", Invk_unstripNoWiki = "unstripNoWiki", Invk_killMarkers = "killMarkers", Invk_getEntityTable = "getEntityTable", Invk_init_text_for_wiki = "init_text_for_wiki"; + private static final String[] Proc_names = String_.Ary(Invk_unstrip, Invk_unstripNoWiki, Invk_killMarkers, Invk_getEntityTable, Invk_init_text_for_wiki); + public boolean Unstrip(Scrib_proc_args args, Scrib_proc_rslt rslt) {return rslt.Init_obj(args.Pull_str(0));} // NOTE: XOWA does not use MediaWiki strip markers; just return original; DATE:2015-01-20 + public boolean UnstripNoWiki(Scrib_proc_args args, Scrib_proc_rslt rslt) {return rslt.Init_obj(args.Pull_str(0));} // NOTE: XOWA does not use MediaWiki strip markers; just return original; DATE:2015-01-20 + public boolean KillMarkers(Scrib_proc_args args, Scrib_proc_rslt rslt) {return rslt.Init_obj(args.Pull_str(0));} // NOTE: XOWA does not use MediaWiki strip markers; just return original; DATE:2015-01-20 public boolean GetEntityTable(Scrib_proc_args args, Scrib_proc_rslt rslt) { if (Html_entity_ == null) Html_entity_ = Scrib_lib_text_html_entities.new_(); return rslt.Init_obj(Html_entity_); diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_title.java b/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_title.java index bf3e9896d..314129e31 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_title.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_title.java @@ -17,6 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.xtns.scribunto.lib; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.scribunto.*; import gplx.xowa.wikis.caches.*; import gplx.xowa.xtns.pfuncs.ttls.*; import gplx.xowa.wikis.xwikis.*; +import gplx.xowa2.files.commons.*; import gplx.xowa2.files.metas.*; public class Scrib_lib_title implements Scrib_lib { public Scrib_lib_title(Scrib_core core) {this.core = core;} private Scrib_core core; public Scrib_lua_mod Mod() {return mod;} private Scrib_lua_mod mod; @@ -35,22 +36,23 @@ public class Scrib_lib_title implements Scrib_lib { switch (key) { case Proc_newTitle: return NewTitle(args, rslt); case Proc_makeTitle: return MakeTitle(args, rslt); + case Proc_getExpensiveData: return GetExpensiveData(args, rslt); case Proc_getUrl: return GetUrl(args, rslt); case Proc_getContent: return GetContent(args, rslt); - case Proc_fileExists: return FileExists(args, rslt); + case Proc_getFileInfo: return GetFileInfo(args, rslt); case Proc_getCurrentTitle: return GetCurrentTitle(args, rslt); case Proc_protectionLevels: return ProtectionLevels(args, rslt); case Proc_cascadingProtection: return CascadingProtection(args, rslt); default: throw Err_.unhandled(key); } } - private static final int Proc_newTitle = 0, Proc_makeTitle = 1, Proc_getUrl = 2, Proc_getContent = 3, Proc_fileExists = 4, Proc_getCurrentTitle = 5, Proc_protectionLevels = 6, Proc_cascadingProtection = 7; + private static final int Proc_newTitle = 0, Proc_makeTitle = 1, Proc_getExpensiveData = 2, Proc_getUrl = 3, Proc_getContent = 4, Proc_getFileInfo = 5, Proc_getCurrentTitle = 6, Proc_protectionLevels = 7, Proc_cascadingProtection = 8; public static final String - Invk_newTitle = "newTitle", Invk_makeTitle = "makeTitle" - , Invk_getUrl = "getUrl", Invk_getContent = "getContent", Invk_fileExists = "fileExists", Invk_getCurrentTitle = "getCurrentTitle" + Invk_newTitle = "newTitle", Invk_getExpensiveData = "getExpensiveData", Invk_makeTitle = "makeTitle" + , Invk_getUrl = "getUrl", Invk_getContent = "getContent", Invk_getFileInfo = "getFileInfo", Invk_getCurrentTitle = "getCurrentTitle" , Invk_protectionLevels = "protectionLevels", Invk_cascadingProtection = "cascadingProtection" ; - private static final String[] Proc_names = String_.Ary(Invk_newTitle, Invk_makeTitle, Invk_getUrl, Invk_getContent, Invk_fileExists, Invk_getCurrentTitle, Invk_protectionLevels, Invk_cascadingProtection); + private static final String[] Proc_names = String_.Ary(Invk_newTitle, Invk_makeTitle, Invk_getExpensiveData, Invk_getUrl, Invk_getContent, Invk_getFileInfo, Invk_getCurrentTitle, Invk_protectionLevels, Invk_cascadingProtection); public boolean NewTitle(Scrib_proc_args args, Scrib_proc_rslt rslt) { byte[] ttl_bry = args.Pull_bry(0); Object ns_obj = args.Cast_obj_or_null(1); @@ -65,7 +67,7 @@ public class Scrib_lib_title implements Scrib_lib { } Xoa_ttl ttl = Xoa_ttl.parse_(core.Wiki(), ttl_bry); if (ttl == null) return rslt.Init_obj(null); // invalid title; exit; matches MW logic - return rslt.Init_obj(Xto_kv_ary(ttl)); + return rslt.Init_obj(GetInexpensiveTitleData(ttl)); } public void Notify_page_changed() {if (notify_page_changed_fnc != null) core.Interpreter().CallFunction(notify_page_changed_fnc.Id(), KeyVal_.Ary_empty);} public boolean GetUrl(Scrib_proc_args args, Scrib_proc_rslt rslt) { @@ -120,19 +122,51 @@ public class Scrib_lib_title implements Scrib_lib { if (anchor_str != null) tmp_bfr.Add_byte(Byte_ascii.Hash).Add_str(anchor_str); Xoa_ttl ttl = Xoa_ttl.parse_(wiki, tmp_bfr.Mkr_rls().Xto_bry_and_clear()); if (ttl == null) return rslt.Init_obj(null); // invalid title; exit; - return rslt.Init_obj(Xto_kv_ary(ttl)); + return rslt.Init_obj(GetInexpensiveTitleData(ttl)); } - public boolean FileExists(Scrib_proc_args args, Scrib_proc_rslt rslt) { + public boolean GetExpensiveData(Scrib_proc_args args, Scrib_proc_rslt rslt) { + byte[] ttl_bry = args.Pull_bry(0); + Xoa_ttl ttl = Xoa_ttl.parse_(core.Wiki(), ttl_bry); + if (ttl == Xoa_ttl.Null) return rslt.Init_null(); + // TODO: MW does extra logic here to cache ttl in ttl cache to avoid extra title lookups + boolean ttl_exists = false, ttl_redirect = false; int ttl_id = 0; + synchronized (tmp_db_page) { + ttl_exists = core.Wiki().Db_mgr().Load_mgr().Load_by_ttl(tmp_db_page, ttl.Ns(), ttl.Page_db()); + } + if (ttl_exists) { + ttl_redirect = tmp_db_page.Type_redirect(); + ttl_id = tmp_db_page.Id(); + } + KeyVal[] rv = new KeyVal[4]; + rv[ 0] = KeyVal_.new_("isRedirect" , ttl_redirect); // title.isRedirect + rv[ 1] = KeyVal_.new_("id" , ttl_id); // $title->getArticleID(), + rv[ 2] = KeyVal_.new_("contentModel" , Key_wikitexet); // $title->getContentModel(); see Defines.php and CONTENT_MODEL_ + rv[ 3] = KeyVal_.new_("exists" , ttl_exists); // $ret['id'] > 0; TODO: if Special: check regy of implemented pages + return rslt.Init_obj(rv); + } + public boolean GetFileInfo(Scrib_proc_args args, Scrib_proc_rslt rslt) { byte[] ttl_bry = args.Pull_bry(0); Xow_wiki wiki = core.Wiki(); Xoa_ttl ttl = Xoa_ttl.parse_(wiki, ttl_bry); if ( ttl == null || !ttl.Ns().Id_file_or_media() - ) return rslt.Init_obj(false); + ) return rslt.Init_obj(GetFileInfo_absent); if (ttl.Ns().Id_media()) ttl = Xoa_ttl.parse_(wiki, Xow_ns_.Id_file, ttl.Page_db()); // if [[Media:]] change to [[File:]]; theoretically, this should be changed in Get_page, but not sure if I want to put this logic that low; DATE:2014-01-07 - Xoa_page file_page = Pfunc_filepath.Load_page(wiki, ttl); - return rslt.Init_obj(!file_page.Missing()); + // Xoa_page file_page = Pfunc_filepath.Load_page(wiki, ttl); // EXPENSIVE + // boolean exists = !file_page.Missing(); + // if (!exists) return rslt.Init_obj(KeyVal_.Ary(KeyVal_.new_("exists", false))); // NOTE: do not reinstate; will exit early if commons is not installed; DATE:2015-01-25; NOTE: Media objects are often flagged as absent in offline mode + // NOTE: MW registers image if deleted; XOWA doesn't register b/c needs width / height also, not just image name + Xof_file_meta_itm itm = wiki.File_mgr().File_meta_wkr().Get_or_null(ttl.Page_db()); + if (itm == null) return rslt.Init_obj(GetFileInfo_absent); + KeyVal[] rv = KeyVal_.Ary + ( KeyVal_.new_("exists" , true) + , KeyVal_.new_("width" , itm.W()) + , KeyVal_.new_("height" , itm.H()) + , KeyVal_.new_("pages" , null) // TODO: get pages info + ); + return rslt.Init_obj(rv); } + private static final KeyVal[] GetFileInfo_absent = KeyVal_.Ary(KeyVal_.new_("exists", false)); public boolean GetContent(Scrib_proc_args args, Scrib_proc_rslt rslt) { byte[] ttl_bry = args.Pull_bry(0); Xow_wiki wiki = core.Wiki(); @@ -151,7 +185,7 @@ public class Scrib_lib_title implements Scrib_lib { return rv == null ? rslt.Init_obj(null) : rslt.Init_obj(String_.new_utf8_(rv)); } public boolean GetCurrentTitle(Scrib_proc_args args, Scrib_proc_rslt rslt) { - return rslt.Init_obj(Xto_kv_ary(core.Page().Ttl())); + return rslt.Init_obj(GetInexpensiveTitleData(core.Page().Ttl())); } public boolean ProtectionLevels(Scrib_proc_args args, Scrib_proc_rslt rslt) { // byte[] ttl_bry = args.Pull_bry(0); @@ -166,35 +200,27 @@ public class Scrib_lib_title implements Scrib_lib { return rslt.Init_obj(CascadingProtection_rv); } public static final KeyVal[] CascadingProtection_rv = KeyVal_.Ary(KeyVal_.new_("sources", Bool_.N), KeyVal_.new_("restrictions", KeyVal_.Ary_empty)); - private KeyVal[] Xto_kv_ary(Xoa_ttl ttl) { + private KeyVal[] GetInexpensiveTitleData(Xoa_ttl ttl) { Xow_ns ns = ttl.Ns(); - boolean ttl_exists = core.Wiki().Db_mgr().Load_mgr().Load_by_ttl(tmp_db_page, ttl.Ns(), ttl.Page_db()); - boolean ttl_redirect = false; int ttl_id = 0; - if (ttl_exists) { - ttl_redirect = tmp_db_page.Type_redirect(); - ttl_id = tmp_db_page.Id(); - } - boolean ttl_file_or_media = ns.Id_file_or_media(); - int rv_len = ttl_file_or_media ? 11 : 12; + boolean ns_file_or_media = ns.Id_file_or_media(), ns_special = ns.Id_special(); + int rv_len = 7, rv_idx = 7; + if (ns_special) ++rv_len; + if (!ns_file_or_media) ++rv_len; Xow_xwiki_itm xwiki_itm = ttl.Wik_itm(); String xwiki_str = xwiki_itm == null ? "" : xwiki_itm.Key_str(); KeyVal[] rv = new KeyVal[rv_len]; rv[ 0] = KeyVal_.new_("isLocal" , true); // title.isLocal; NOTE: always true; passing "http:" also returns true; not sure how to handle "Interwiki::fetch( $this->mInterwiki )->isLocal()" - rv[ 1] = KeyVal_.new_("isRedirect" , ttl_redirect); // title.isRedirect - rv[ 2] = KeyVal_.new_("interwiki" , xwiki_str); // $title->getInterwiki(), - rv[ 3] = KeyVal_.new_("namespace" , ns.Id()); // $ns, - rv[ 4] = KeyVal_.new_("nsText" , ns.Name_str()); // $title->getNsText(), - rv[ 5] = KeyVal_.new_("text" , ttl.Page_txt()); // $title->getText(), - rv[ 6] = KeyVal_.new_("id" , ttl_id); // $title->getArticleID(), - rv[ 7] = KeyVal_.new_("fragment" , ttl.Anch_txt()); // $title->getFragment(), - rv[ 8] = KeyVal_.new_("contentModel" , Xoa_content_model.Key_wikitexet); // $title->getContentModel(); see Defines.php and CONTENT_MODEL_ - rv[ 9] = KeyVal_.new_("thePartialUrl" , ttl.Page_db()); // $title->getPartialUrl(), - rv[10] = KeyVal_.new_("exists" , ttl_exists); // $ret['id'] > 0; TODO: if Special: check regy of implemented pages - if (!ttl_file_or_media) - rv[11] = KeyVal_.new_("fileExists" , false); // REF.MW: if ( $ns !== NS_FILE && $ns !== NS_MEDIA ) $ret['fileExists'] = false; + rv[ 1] = KeyVal_.new_("interwiki" , xwiki_str); // $title->getInterwiki(), + rv[ 2] = KeyVal_.new_("namespace" , ns.Id()); // $ns, + rv[ 3] = KeyVal_.new_("nsText" , ns.Name_str()); // $title->getNsText(), + rv[ 4] = KeyVal_.new_("text" , ttl.Page_txt()); // $title->getText(), + rv[ 5] = KeyVal_.new_("fragment" , ttl.Anch_txt()); // $title->getFragment(), + rv[ 6] = KeyVal_.new_("thePartialUrl" , ttl.Page_db()); // $title->getPartialUrl(), + if (ns_special) + rv[rv_idx++] = KeyVal_.new_("exists" , false); // TODO: lookup specials + if (!ns_file_or_media) + rv[rv_idx++] = KeyVal_.new_("file" , false); // REF.MW: if ( $ns !== NS_FILE && $ns !== NS_MEDIA ) $ret['file'] = false; return rv; } private static final Xodb_page tmp_db_page = Xodb_page.tmp_(); -} -class Xoa_content_model { public static final String Key_wikitexet = "wikitext"; } diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_title_tst.java b/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_title_tst.java index a1e652135..f03ad19fd 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_title_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_title_tst.java @@ -17,14 +17,15 @@ along with this program. If not, see . */ package gplx.xowa.xtns.scribunto.lib; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.scribunto.*; import org.junit.*; +import gplx.dbs.*; import gplx.xowa2.files.commons.*; import gplx.xowa2.wikis.data.tbls.*; import gplx.xowa2.files.metas.*; import gplx.xowa.files.wiki_orig.*; public class Scrib_lib_title_tst { @Before public void init() { fxt.Clear_for_lib(); lib = fxt.Core().Lib_title().Init(); } private Scrib_invoke_func_fxt fxt = new Scrib_invoke_func_fxt(); private Scrib_lib lib; @Test public void NewTitle() { - fxt.Test_scrib_proc_str_ary(lib, Scrib_lib_title.Invk_newTitle, Object_.Ary("Page_0") , ttl_data_(0 , "", "Page 0", "", "", "Page_0")); - fxt.Test_scrib_proc_str_ary(lib, Scrib_lib_title.Invk_newTitle, Object_.Ary("A", "Template") , ttl_data_(10 , "Template", "A")); + fxt.Test_scrib_proc_str_ary(lib, Scrib_lib_title.Invk_newTitle, Object_.Ary("Page_0") , ttl_fast(0 , "", "Page 0", "", "", "Page_0")); + fxt.Test_scrib_proc_str_ary(lib, Scrib_lib_title.Invk_newTitle, Object_.Ary("A", "Template") , ttl_fast(10 , "Template", "A")); fxt.Test_scrib_proc_str_ary(lib, Scrib_lib_title.Invk_newTitle, Object_.Ary("a[b") , Scrib_invoke_func_fxt.Null_rslt_ary); // invalid } @Test public void GetUrl() { @@ -38,29 +39,39 @@ public class Scrib_lib_title_tst { fxt.Test_scrib_proc_str(lib, Scrib_lib_title.Invk_getUrl, Object_.Ary("Main_Page", "canonicalUrl", KeyVal_.Ary(KeyVal_.new_("action", "edit"), KeyVal_.new_("preload", "b"))), "http://en.wikipedia.org/wiki/Main_Page?action=edit&preload=b"); } @Test public void MakeTitle() { - fxt.Test_scrib_proc_str_ary(lib, Scrib_lib_title.Invk_makeTitle, Object_.Ary("Module", "A") , ttl_data_(828, "Module", "A")); - fxt.Test_scrib_proc_str_ary(lib, Scrib_lib_title.Invk_makeTitle, Object_.Ary(828, "A") , ttl_data_(828, "Module", "A")); - fxt.Test_scrib_proc_str_ary(lib, Scrib_lib_title.Invk_makeTitle, Object_.Ary("Template", "A", "b") , ttl_data_(10, "Template", "A", "b")); + fxt.Test_scrib_proc_str_ary(lib, Scrib_lib_title.Invk_makeTitle, Object_.Ary("Module", "A") , ttl_fast(828, "Module", "A")); + fxt.Test_scrib_proc_str_ary(lib, Scrib_lib_title.Invk_makeTitle, Object_.Ary(828, "A") , ttl_fast(828, "Module", "A")); + fxt.Test_scrib_proc_str_ary(lib, Scrib_lib_title.Invk_makeTitle, Object_.Ary("Template", "A", "b") , ttl_fast(10, "Template", "A", "b")); fxt.Parser_fxt().Wiki().Xwiki_mgr().Add_full("fr", "fr.wikipedia.org"); - fxt.Test_scrib_proc_str_ary(lib, Scrib_lib_title.Invk_makeTitle, Object_.Ary("Template", "A", "b", "fr") , ttl_data_(0, "", "Template:A", "b", "fr")); + fxt.Test_scrib_proc_str_ary(lib, Scrib_lib_title.Invk_makeTitle, Object_.Ary("Template", "A", "b", "fr") , ttl_fast(0, "", "Template:A", "b", "fr")); fxt.Parser_fxt().Init_log_(Xop_ttl_log.Invalid_char); fxt.Test_scrib_proc_str_ary(lib, Scrib_lib_title.Invk_makeTitle, Object_.Ary("Template", "a[b"), Scrib_invoke_func_fxt.Null_rslt_ary); // PURPOSE: handle bad MakeTitle cmds; PAGE:en.w:Disney; DATE:2013-10-15 } - @Test public void FileExists() { - fxt.Test_scrib_proc_bool(lib, Scrib_lib_title.Invk_fileExists, Object_.Ary("A") , false); - fxt.Test_scrib_proc_bool(lib, Scrib_lib_title.Invk_fileExists, Object_.Ary("Template:A") , false); - fxt.Test_scrib_proc_bool(lib, Scrib_lib_title.Invk_fileExists, Object_.Ary("File:A.png") , false); - fxt.Parser_fxt().Init_page_create("File:A.png"); - fxt.Test_scrib_proc_bool(lib, Scrib_lib_title.Invk_fileExists, Object_.Ary("File:A.png") , true); + @Test public void GetExpensiveData_absent() { + fxt.Test_scrib_proc_str_ary(lib, Scrib_lib_title.Invk_getExpensiveData, Object_.Ary("A") , ttl_slow(Bool_.N, 0, Bool_.N)); } - @Test public void FileExists_commons() { // PURPOSE: check that Scribunto FileExists calls filepath.FileExists; DATE:2014-01-07 + @Test public void GetExpensiveData_exists() { + fxt.Parser_fxt().Init_page_create("A"); + fxt.Test_scrib_proc_str_ary(lib, Scrib_lib_title.Invk_getExpensiveData, Object_.Ary("A") , ttl_slow(Bool_.Y, 0, Bool_.N)); + } + @Test public void GetFileInfo() { + fxt.Test_scrib_proc_str_ary(lib, Scrib_lib_title.Invk_getFileInfo, Object_.Ary("A") , file_info_absent()); + fxt.Test_scrib_proc_str_ary(lib, Scrib_lib_title.Invk_getFileInfo, Object_.Ary("Template:A") , file_info_absent()); + fxt.Test_scrib_proc_str_ary(lib, Scrib_lib_title.Invk_getFileInfo, Object_.Ary("File:A.png") , file_info_absent()); + fxt.Parser_fxt().Init_page_create("File:A.png"); + Init_file_wiki_orig(fxt.Core().Wiki(), "A.png", 220, 200); + fxt.Test_scrib_proc_str_ary(lib, Scrib_lib_title.Invk_getFileInfo, Object_.Ary("File:A.png") , file_info_exists("A.png", 220, 200)); + } + @Test public void GetFileInfo_commons() { // PURPOSE: check that Scribunto GetFileInfo calls filepath.FileExists; DATE:2014-01-07 Xow_wiki commons_wiki = fxt.Parser_fxt().Wiki().App().Wiki_mgr().Get_by_key_or_make(Xow_wiki_.Domain_commons_bry).Init_assert(); + Init_file_wiki_orig(fxt.Core().Wiki(), "A.png", 220, 200); fxt.Parser_fxt().Init_page_create(commons_wiki, "File:A.png", "text_is_blank"); - fxt.Test_scrib_proc_bool(lib, Scrib_lib_title.Invk_fileExists, Object_.Ary("File:A.png") , true); + fxt.Test_scrib_proc_str_ary(lib, Scrib_lib_title.Invk_getFileInfo, Object_.Ary("File:A.png") , file_info_exists("A.png", 220, 200)); } - @Test public void FileExists_media() { // PURPOSE: [[Media:]] ns should find entries in [[File:]]; DATE:2014-01-07 + @Test public void GetFileInfo_media() { // PURPOSE: [[Media:]] ns should find entries in [[File:]]; DATE:2014-01-07 + Init_file_wiki_orig(fxt.Core().Wiki(), "A.png", 220, 200); fxt.Parser_fxt().Init_page_create("File:A.png"); - fxt.Test_scrib_proc_bool(lib, Scrib_lib_title.Invk_fileExists, Object_.Ary("Media:A.png") , true); + fxt.Test_scrib_proc_str_ary(lib, Scrib_lib_title.Invk_getFileInfo, Object_.Ary("Media:A.png") , file_info_exists("A.png", 220, 200)); } @Test public void GetContent() { fxt.Test_scrib_proc_str(lib, Scrib_lib_title.Invk_getContent, Object_.Ary("A") , Scrib_invoke_func_fxt.Null_rslt); @@ -78,24 +89,62 @@ public class Scrib_lib_title_tst { @Test public void CascadingProtection() { fxt.Test_scrib_proc_obj(lib, Scrib_lib_title.Invk_cascadingProtection, Object_.Ary("A") , Scrib_lib_title.CascadingProtection_rv); } - private static String ttl_data_(int ns_id, String ns_str, String ttl) {return ttl_data_(ns_id, ns_str, ttl, "", "", ttl);} - private static String ttl_data_(int ns_id, String ns_str, String ttl, String anchor) {return ttl_data_(ns_id, ns_str, ttl, anchor, "", ttl);} - private static String ttl_data_(int ns_id, String ns_str, String ttl, String anchor, String xwiki) {return ttl_data_(ns_id, ns_str, ttl, anchor, xwiki, ttl);} - private static String ttl_data_(int ns_id, String ns_str, String ttl, String anchor, String xwiki, String partial_url) { + private static void Init_file_wiki_orig(Xow_wiki wiki, String ttl_str, int w, int h) { + String url_str = "test/file/en.wikipedia.org/orig_regy"; + Db_conn_pool.I.Set_mem(url_str, new Xof_orig_regy_tbl().new_meta()); + Db_url db_url = Db_url_.mem_(url_str); + Xof_file_meta_wkr__db_orig wkr = (Xof_file_meta_wkr__db_orig)wiki.File_mgr().File_meta_wkr(); + Xof_orig_regy_tbl tbl = wkr.Tbl(); + tbl.Conn_(Db_conn_pool.I.Get_or_new(db_url)); + byte[] ttl_bry = Bry_.new_utf8_(ttl_str); + tbl.Insert(Xof_repo_itm.Repo_remote, ttl_bry, Xof_ext_.new_by_ttl_(ttl_bry).Id(), w, h, Bry_.Empty); + } +// private static void Init_page_regy(Xow_wiki wiki, String ttl, int id, boolean is_redirect) { +// String url_str = "test/en.wikipedia.org/wiki_page_regy"; +// Db_meta_tbl meta = new Xow_page_regy_tbl().new_meta(); +// Db_conn_pool.I.Set_mem(url_str, meta); +// Db_url url = Db_url_.mem_(url_str); +// Xow_page_regy_tbl tbl = new Xow_page_regy_tbl(Bool_.N, url); +// tbl.Insert(id, ns_id, Bry_.new_utf8_(ttl), is_redirect, modified_on, page_len, random_int, text_db_id, html_db_id); +// } + private static String ttl_fast(int ns_id, String ns_str, String ttl) {return ttl_fast(ns_id, ns_str, ttl, "", "", ttl);} + private static String ttl_fast(int ns_id, String ns_str, String ttl, String anchor) {return ttl_fast(ns_id, ns_str, ttl, anchor, "", ttl);} + private static String ttl_fast(int ns_id, String ns_str, String ttl, String anchor, String xwiki) {return ttl_fast(ns_id, ns_str, ttl, anchor, xwiki, ttl);} + private static String ttl_fast(int ns_id, String ns_str, String ttl, String anchor, String xwiki, String partial_url) { return String_.Concat_lines_nl_skip_last ( "1=" , " isLocal=true" - , " isRedirect=false" , " interwiki=" + xwiki , " namespace=" + Int_.Xto_str(ns_id) , " nsText=" + ns_str , " text=" + ttl - , " id=0" , " fragment=" + anchor - , " contentModel=wikitext" , " thePartialUrl=" + partial_url + , " file=false" + ); + } + private static String ttl_slow(boolean exists, int ttl_id, boolean redirect) { + return String_.Concat_lines_nl_skip_last + ( "1=" + , " isRedirect=" + Bool_.Xto_str_lower(redirect) + , " id=" + Int_.Xto_str(ttl_id) + , " contentModel=" + Scrib_lib_title.Key_wikitexet + , " exists=" + Bool_.Xto_str_lower(exists) + ); + } + private static String file_info_absent() { + return String_.Concat_lines_nl_skip_last + ( "1=" , " exists=false" - , " fileExists=false" + ); + } + private static String file_info_exists(String ttl, int w, int h) { + return String_.Concat_lines_nl_skip_last + ( "1=" + , " exists=true" + , " width=" + Int_.Xto_str(w) + , " height=" + Int_.Xto_str(h) + , " pages=<>" ); } } diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_ustring.java b/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_ustring.java index e4875e9c7..509c6f39f 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_ustring.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_ustring.java @@ -95,7 +95,8 @@ public class Scrib_lib_ustring implements Scrib_lib { return bgn; } public boolean Match(Scrib_proc_args args, Scrib_proc_rslt rslt) { - String text = args.Cast_str_or_null(0); if (text == null) return rslt.Init_many_list(ListAdp_.Null); // if no text is passed, do not fail; return empty; EX:d:changed; DATE:2014-02-06 + String text = args.Xstr_str_or_null(0); // Module can pass raw ints; PAGE:en.w:Budget_of_the_European_Union; DATE:2015-01-22 + if (text == null) return rslt.Init_many_list(ListAdp_.Null); // if no text is passed, do not fail; return empty; EX:d:changed; DATE:2014-02-06 String regx = regx_converter.Parse(args.Cast_bry_or_null(1), Scrib_regx_converter.Anchor_G); int bgn = args.Cast_int_or(2, 1); bgn = Bgn_adjust(text, bgn); @@ -182,10 +183,14 @@ class Scrib_lib_ustring_gsub_mgr { } private void Identify_repl(Object repl_obj) { Class repl_type = repl_obj.getClass(); - if (Object_.Eq(repl_type, String.class)) { + if (Object_.Eq(repl_type, String_.Cls_ref_type)) { tmp_repl_tid = Repl_tid_string; tmp_repl_bry = Bry_.new_utf8_((String)repl_obj); } + else if (Object_.Eq(repl_type, Int_.Cls_ref_type)) { // NOTE:@replace sometimes int; PAGE:en.d:λύω; DATE:2014-09-02 + tmp_repl_tid = Repl_tid_string; + tmp_repl_bry = Bry_.new_utf8_(Int_.Xto_str(Int_.cast_(repl_obj))); + } else if (Object_.Eq(repl_type, KeyVal[].class)) { tmp_repl_tid = Repl_tid_table; KeyVal[] repl_tbl = (KeyVal[])repl_obj; @@ -204,10 +209,6 @@ class Scrib_lib_ustring_gsub_mgr { tmp_repl_tid = Repl_tid_luacbk; repl_func = (Scrib_lua_proc)repl_obj; } - else if (Object_.Eq(repl_type, Int_.ClassOf)) { // NOTE:@replace sometimes int; PAGE:en.d:λύω; DATE:2014-09-02 - tmp_repl_tid = Repl_tid_string; - tmp_repl_bry = Bry_.new_utf8_(Int_.Xto_str(Int_.cast_(repl_obj))); - } else throw Err_.unhandled(ClassAdp_.NameOf_type(repl_type)); } private String Exec_repl(byte repl_tid, byte[] repl_bry, String text, String regx, int limit) { diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_ustring__lib_tst.java b/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_ustring__lib_tst.java index 26306de3f..9b8bca2f1 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_ustring__lib_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_ustring__lib_tst.java @@ -48,6 +48,7 @@ public class Scrib_lib_ustring__lib_tst { Exec_match("aaa" , "a" , 1, "a"); // should return 1st match not many Exec_match("aaa" , "(a)" , 1, "a;a;a"); // should return all matches Exec_match("a b" , "%S" , 1, "a"); // %S was returning every match instead of 1st; PAGE:en.w:Bertrand_Russell; DATE:2014-04-02 + Exec_match(1 , "a" , 1, String_.Null_mark); // Module can pass raw ints; PAGE:en.w:Budget_of_the_European_Union; DATE:2015-01-22 } @Test public void Match_args_out_of_order() { fxt.Test_scrib_proc_empty(lib, Scrib_lib_ustring.Invk_match, KeyVal_.Ary(KeyVal_.int_(2, "[a]"))); @@ -119,7 +120,7 @@ public class Scrib_lib_ustring__lib_tst { private void Exec_find(String text, String regx, int bgn, boolean plain, String expd) { fxt.Test_scrib_proc_kv_vals(lib, Scrib_lib_ustring.Invk_find, Scrib_kv_utl_.base1_many_(text, regx, bgn, plain), expd); } - private void Exec_match(String text, String regx, int bgn, String expd) { + private void Exec_match(Object text, String regx, int bgn, String expd) { fxt.Test_scrib_proc_kv_vals(lib, Scrib_lib_ustring.Invk_match, Scrib_kv_utl_.base1_many_(text, regx, bgn), expd); } private void Exec_gsub_regx(String text, Object regx, int limit, Object repl, String expd) {Exec_gsub(text, regx, limit, repl, expd);} diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_wikibase_srl.java b/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_wikibase_srl.java index 6c9a7c753..519c5ccf4 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_wikibase_srl.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_wikibase_srl.java @@ -59,7 +59,7 @@ class Scrib_lib_wikibase_srl { } return rv; } - private static KeyVal Srl_sitelinks_badges(byte[][] badges, int base_adj) { + private static KeyVal Srl_sitelinks_badges(byte[][] badges, int base_adj) { // DATE:2014-11-13 if (badges == null) badges = Bry_.Ary_empty; // null badges -> badges:[] int len = badges.length; KeyVal[] kvs = len == 0 ? KeyVal_.Ary_empty : new KeyVal[len]; diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_regx_converter.java b/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_regx_converter.java index 528022c51..b4e6904ab 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_regx_converter.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_regx_converter.java @@ -22,6 +22,7 @@ public class Scrib_regx_converter { public String Regx() {return regx;} private String regx; public ListAdp Capt_list() {return capt_list;} public KeyVal[] Capt_ary() {return capt_list.Count() == 0 ? null : (KeyVal[])capt_list.Xto_ary(KeyVal.class);} + private Bry_fmtr fmtr_balanced; private Bry_bfr bfr_balanced; public String Parse(byte[] src, byte[] anchor) { int len = src.length; boolean q_flag = false; @@ -68,33 +69,29 @@ public class Scrib_regx_converter { else { byte nxt = src[i]; switch (nxt) { - case Byte_ascii.Ltr_b: + case Byte_ascii.Ltr_b: // EX: "%b()" i += 2; if (i >= len) throw Err_.new_("malformed pattern (missing arguments to \'%b\')"); - byte digit_0 = src[i - 1]; - byte digit_1 = src[i]; - if (digit_0 == digit_1) { // $bfr .= "{$d1}[^$d1]*$d1"; + byte char_0 = src[i - 1]; + byte char_1 = src[i]; + if (char_0 == char_1) { // same char: easier regex; REF.MW: $bfr .= "{$d1}[^$d1]*$d1"; bfr.Add(Bry_bf0_seg_0); - Regx_quote(bfr, digit_0); + Regx_quote(bfr, char_0); bfr.Add(Bry_bf0_seg_1); - Regx_quote(bfr, digit_0); + Regx_quote(bfr, char_0); bfr.Add(Bry_bf0_seg_2); - Regx_quote(bfr, digit_0); + Regx_quote(bfr, char_0); } - else { // $bfr .= "(?$d1(?:(?>[^$d1$d2]+)|(?>b$bct))*$d2)"; - ++bct; - bfr.Add(Bry_bf1_seg_0); - bfr.Add_int_variable(bct); - bfr.Add(Bry_bf1_seg_1); - Regx_quote(bfr, digit_0); - bfr.Add(Bry_bf1_seg_2); - Regx_quote(bfr, digit_0); - Regx_quote(bfr, digit_1); - bfr.Add(Bry_bf1_seg_3); - bfr.Add_int_variable(bct); - bfr.Add(Bry_bf1_seg_4); - Regx_quote(bfr, digit_1); - bfr.Add(Bry_bf1_seg_5); + else { // diff char: harder regex; REF.MW: $bfr .= "(?$d1(?:(?>[^$d1$d2]+)|(?P>b$bct))*$d2)"; + if (fmtr_balanced == null) { + fmtr_balanced = Bry_fmtr.new_("(?\\~{1}(?:(?>[^\\~{1}\\~{2}]*)|\\~{1}([^\\~{1}\\~{2}]*|\\~{1}[^\\~{1}\\~{2}]*\\~{2})*\\~{2})*\\~{2})", "0", "1", "2"); // NOTE: complicated regex; represents 3 level depth of balanced parens; 4+ won't work; EX:(3(2(1)2)3) PAGE:en.w:Electricity_sector_in_Switzerland DATE:2015-01-23 + bfr_balanced = Bry_bfr.reset_(255); + } + synchronized (fmtr_balanced) { + ++bct; + fmtr_balanced.Bld_bfr(bfr_balanced, Int_.Xto_bry(bct), Byte_.Ary(char_0), Byte_.Ary(char_1)); + bfr.Add(bfr_balanced.Xto_bry_and_clear()); + } } break; 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: @@ -219,13 +216,8 @@ public class Scrib_regx_converter { private static final byte[] Bry_pow_escaped = Bry_.new_ascii_("\\^") , Bry_dollar_literal = Bry_.new_ascii_("$"), Bry_dollar_escaped = Bry_.new_ascii_("\\$") , Bry_bf0_seg_0 = Bry_.new_ascii_("{"), Bry_bf0_seg_1 = Bry_.new_ascii_("}[^"), Bry_bf0_seg_2 = Bry_.new_ascii_("]*") - , Bry_bf1_seg_0 = Bry_.new_ascii_("(?") - , Bry_bf1_seg_2 = Bry_.new_ascii_("(?:(?>[^"), Bry_bf1_seg_3 = Bry_.new_ascii_("]+)|(?>b") // NOTE: PHP uses "]+)|(?P>b", but Java does not support P (named pattern); DATE:2013-12-20 - , Bry_bf1_seg_4 = Bry_.new_ascii_("))*"), Bry_bf1_seg_5 = Bry_.new_ascii_(")") , Bry_bf2_seg_0 = Bry_.new_ascii_("\\")//, Bry_bf2_seg_1 = Bry_.new_ascii_("") , Bry_regx_dash = Bry_.new_ascii_("*?") // was *? - //, Bry_grp_bgn = Bry_.new_ascii_("(?. */ package gplx.xowa.xtns.scribunto.lib; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.scribunto.*; import org.junit.*; +import gplx.texts.*; public class Scrib_regx_converter_tst { @Before public void init() {fxt.Clear();} private Scrib_regx_converter_fxt fxt = new Scrib_regx_converter_fxt(); @Test public void Basic() {fxt.Test_parse("abc012ABC" , "abc012ABC");} @@ -29,7 +30,7 @@ public class Scrib_regx_converter_tst { @Test public void Percent_has() {fxt.Test_parse("%a" , "\\p{L}");} @Test public void Percent_na() {fxt.Test_parse("%y" , "y");} @Test public void Percent_b00() {fxt.Test_parse("%b00" , "{0}[^0]*0");} - @Test public void Percent_b01() {fxt.Test_parse("%b01" , "(?0(?:(?>[^01]+)|(?>b1))*1)");} + @Test public void Percent_b01() {fxt.Test_parse("%b01" , "(?\\0(?:(?>[^\\0\\1]*)|\\0([^\\0\\1]*|\\0[^\\0\\1]*\\1)*\\1)*\\1)");} // @Test public void Percent_num() {fxt.Test_parse("()%1" , "(?)\\g{m1}");} @Test public void Percent_text() {fxt.Test_parse("%e" , "e");} @Test public void Brack_pow() {fxt.Test_parse("[^a]" , "[^a]");} @@ -41,15 +42,27 @@ public class Scrib_regx_converter_tst { @Test public void Null_not() {fxt.Test_parse("%Z" , "[^\\x00]");} @Test public void Backslash() {fxt.Test_parse("\\" , "\\\\");} // PURPOSE: make sure \ is preg_quote'd; DATE:2014-01-06 @Test public void Ex_url() {fxt.Test_parse("^%s*(.-)%s*$" , "\\G\\s*(.*?)\\s*$");} + @Test public void Balanced() { + fxt.Test_replace("a(1)c" , "%b()", "b", "abc"); + fxt.Test_replace("a(2(1)2)c" , "%b()", "b", "abc"); + fxt.Test_replace("a(3(2(1)2)3)c" , "%b()", "b", "abc"); + fxt.Test_replace("a(4(3(2(1)2)3)4)c" , "%b()", "b", "a(4b4)c"); + } } class Scrib_regx_converter_fxt { + private Scrib_regx_converter under; public void Clear() { if (under == null) { under = new Scrib_regx_converter(); } - } private Scrib_regx_converter under; + } public void Test_parse(String raw, String expd) { under.Parse(Bry_.new_utf8_(raw), Scrib_regx_converter.Anchor_G); Tfds.Eq(expd, under.Regx()); } + public void Test_replace(String text, String find, String replace, String expd) { + String regex_str = under.Parse(Bry_.new_utf8_(find), Scrib_regx_converter.Anchor_G); + String actl = RegxAdp_.Replace(text, regex_str, replace); + Tfds.Eq(expd, actl); + } } \ No newline at end of file diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_dict_rank.java b/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_dict_rank.java index 3f9550e3f..b98958216 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_dict_rank.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_dict_rank.java @@ -21,7 +21,7 @@ public class Wdata_dict_rank { Tid_preferred = 2 , Tid_normal = 1 , Tid_deprecated = 0 - , Tid_unknown = Byte_.MaxValue_127 + , Tid_unknown = Byte_.Max_value_127 ; public static final String Str_preferred = "preferred" diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_dict_utl.java b/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_dict_utl.java index 49cac30b8..ea97f8c8b 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_dict_utl.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_dict_utl.java @@ -25,5 +25,5 @@ public class Wdata_dict_utl { } return ((Byte_obj_val)rv_obj).Val(); } - public static final byte Tid_invalid = Byte_.MaxValue_127; + public static final byte Tid_invalid = Byte_.Max_value_127; } diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_db_cmd.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_db_cmd.java index 9fdc8b8a6..58bb693db 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_db_cmd.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_db_cmd.java @@ -27,19 +27,19 @@ public class Xob_wdata_db_cmd extends Xob_dump_mgr_base implements Xob_cmd { @Override public String Cmd_key() {return KEY_oimg;} public static final String KEY_oimg = "wiki.wdata_db"; @Override public byte Init_redirect() {return Bool_.N_byte;} // json will never be found in a redirect @Override public int[] Init_ns_ary() {return Int_.Ary(Xow_ns_.Id_main, Wdata_wiki_mgr.Ns_property);} - @Override protected void Init_reset(Db_provider p) { + @Override protected void Init_reset(Db_conn p) { p.Exec_sql("DELETE FROM " + gplx.xowa.dbs.tbls.Xodb_xowa_cfg_tbl.Tbl_name); } - @Override protected Db_provider Init_db_file() { + @Override protected Db_conn Init_db_file() { Xodb_db_file tbl_file = Xodb_db_file.init_(wiki.Fsys_mgr().Root_dir(), "wdata_db.sqlite3"); - Db_provider provider = tbl_file.Provider(); - tbl_mgr.Init(provider); - return provider; + Db_conn conn = tbl_file.Conn(); + tbl_mgr.Init(conn); + return conn; } @Override protected void Cmd_bgn_end() { wdata_mgr = bldr.App().Wiki_mgr().Wdata_mgr(); json_parser = wdata_mgr.Jdoc_parser(); - tbl_mgr.Provider().Txn_mgr().Txn_bgn_if_none(); + tbl_mgr.Conn().Txn_mgr().Txn_bgn_if_none(); } @Override public void Exec_pg_itm_hook(Xow_ns ns, Xodb_page page, byte[] page_src) { Json_doc jdoc = json_parser.Parse(page_src); if (jdoc == null) return; // not a json document @@ -47,7 +47,7 @@ public class Xob_wdata_db_cmd extends Xob_dump_mgr_base implements Xob_cmd { tbl_mgr.Exec_insert_by_wdoc(lang_key, wdata_mgr, page.Id(), wdoc); } @Override public void Exec_commit_hook() { - tbl_mgr.Provider().Txn_mgr().Txn_end_all_bgn_if_none(); + tbl_mgr.Conn().Txn_mgr().Txn_end_all_bgn_if_none(); } @Override public void Exec_end_hook() { tbl_mgr.Term(usr_dlg); @@ -59,7 +59,7 @@ class Wdata_tbl_mgr { tbls = new Wdata_tbl_base[] {label_tbl, alias_tbl, description_tbl, link_tbl, claim_tbl, claim_time_tbl, claim_geo_tbl}; tbls_len = tbls.length; } - public Db_provider Provider() {return provider;} private Db_provider provider; + public Db_conn Conn() {return conn;} private Db_conn conn; public Wdata_label_tbl Label_tbl() {return label_tbl;} private Wdata_label_tbl label_tbl = new Wdata_label_tbl(); public Wdata_alias_tbl Alias_tbl() {return alias_tbl;} private Wdata_alias_tbl alias_tbl = new Wdata_alias_tbl(); public Wdata_description_tbl Description_tbl() {return description_tbl;} private Wdata_description_tbl description_tbl = new Wdata_description_tbl(); @@ -67,19 +67,19 @@ class Wdata_tbl_mgr { public Wdata_claim_tbl Claim_tbl() {return claim_tbl;} private Wdata_claim_tbl claim_tbl = new Wdata_claim_tbl(); public Wdata_claim_time_tbl Claim_time_tbl() {return claim_time_tbl;} private Wdata_claim_time_tbl claim_time_tbl = new Wdata_claim_time_tbl(); public Wdata_claim_geo_tbl Claim_geo_tbl() {return claim_geo_tbl;} private Wdata_claim_geo_tbl claim_geo_tbl = new Wdata_claim_geo_tbl(); - public void Init(Db_provider provider) { - this.provider = provider; + public void Init(Db_conn conn) { + this.conn = conn; for (int i = 0; i < tbls_len; i++) - tbls[i].Init(provider); + tbls[i].Init(conn); } public void Exec_insert_by_wdoc(byte[] lang_key, Wdata_wiki_mgr wdata_mgr, int page_id, Wdata_doc wdoc) { for (int i = 0; i < tbls_len; i++) tbls[i].Exec_insert_by_wdoc(lang_key, wdata_mgr, page_id, wdoc); } public void Term(Gfo_usr_dlg usr_dlg) { - provider.Txn_mgr().Txn_end_all(); + conn.Txn_mgr().Txn_end_all(); for (int i = 0; i < tbls_len; i++) - tbls[i].Make_idxs(usr_dlg, provider); + tbls[i].Make_idxs(usr_dlg, conn); } } abstract class Wdata_tbl_base { @@ -88,24 +88,24 @@ abstract class Wdata_tbl_base { public abstract Db_idx_itm[] Idx_ary(); public abstract String[] Fld_ary(); @gplx.Virtual public void Exec_insert_by_wdoc(byte[] lang_key, Wdata_wiki_mgr wdata_mgr, int page_id, Wdata_doc wdoc) {} - public void Make_tbl(Db_provider p) {Sqlite_engine_.Tbl_create(p, this.Tbl_name(), this.Tbl_create_sql());} - public void Make_idxs(Gfo_usr_dlg usr_dlg, Db_provider p) { + public void Make_tbl(Db_conn p) {Sqlite_engine_.Tbl_create(p, this.Tbl_name(), this.Tbl_create_sql());} + public void Make_idxs(Gfo_usr_dlg usr_dlg, Db_conn p) { Sqlite_engine_.Idx_create(usr_dlg, p, this.Tbl_name(), this.Idx_ary()); } - public Db_stmt Make_insert_stmt(Db_provider p) {return Db_stmt_.new_insert_(p, this.Tbl_name(), this.Fld_ary());} + public Db_stmt Make_insert_stmt(Db_conn p) {return Db_stmt_.new_insert_(p, this.Tbl_name(), this.Fld_ary());} public Db_stmt Insert_stmt() {return insert_stmt;} private Db_stmt insert_stmt; - public void Init(Db_provider provider) { - this.Make_tbl(provider); - insert_stmt = this.Make_insert_stmt(provider); + public void Init(Db_conn conn) { + this.Make_tbl(conn); + insert_stmt = this.Make_insert_stmt(conn); } public static void Exec_insert_kvs(Db_stmt stmt, int page_id, OrderedHash hash) { int len = hash.Count(); for (int i = 0; i < len; i++) { Json_itm_kv kv = (Json_itm_kv)hash.FetchAt(i); stmt.Clear() - .Val_int_(page_id) - .Val_str_by_bry_(kv.Key().Data_bry()) - .Val_str_by_bry_(kv.Val().Data_bry()) + .Val_int(page_id) + .Val_bry_as_str(kv.Key().Data_bry()) + .Val_bry_as_str(kv.Val().Data_bry()) .Exec_insert(); } } @@ -157,9 +157,9 @@ class Wdata_alias_tbl extends Wdata_tbl_base { val = ((Json_itm_kv)val_itm).Val().Data_bry(); } insert_stmt.Clear() - .Val_int_(page_id) - .Val_str_by_bry_(key) - .Val_str_by_bry_(val) + .Val_int(page_id) + .Val_bry_as_str(key) + .Val_bry_as_str(val) .Exec_insert(); } } @@ -212,9 +212,9 @@ class Wdata_link_tbl extends Wdata_tbl_base { val = val_name_kv.Val().Data_bry(); } insert_stmt.Clear() - .Val_int_(page_id) - .Val_str_by_bry_(key) - .Val_str_by_bry_(val) + .Val_int(page_id) + .Val_bry_as_str(key) + .Val_bry_as_str(val) .Exec_insert(); } } @@ -269,17 +269,17 @@ class Wdata_claim_tbl extends Wdata_tbl_base { if (val_text == null) val_text = Bry_.Empty; if (guid == null) guid = Bry_.Empty; this.Insert_stmt().Clear() - .Val_int_(claim_id) - .Val_int_(page_id) - .Val_int_(prop_id) - .Val_byte_(val_tid) - .Val_byte_(entity_tid) - .Val_int_(entity_id) - .Val_str_by_bry_(val_text) - .Val_str_by_bry_(guid) - .Val_int_(rank) - .Val_int_(ref_count) - .Val_int_(qual_count) + .Val_int(claim_id) + .Val_int(page_id) + .Val_int(prop_id) + .Val_byte(val_tid) + .Val_byte(entity_tid) + .Val_int(entity_id) + .Val_bry_as_str(val_text) + .Val_bry_as_str(guid) + .Val_int(rank) + .Val_int(ref_count) + .Val_int(qual_count) .Exec_insert(); } private static final String Fld_claim_id = "claim_id", Fld_page_id = "page_id", Fld_prop_id = "prop_id", Fld_val_tid = "val_tid", Fld_entity_tid = "entity_tid", Fld_entity_id = "entity_id", Fld_val_text = "val_text" @@ -309,13 +309,13 @@ class Wdata_claim_time_tbl extends Wdata_tbl_base { @Override public String[] Fld_ary() {return new String[] {Fld_claim_id, Fld_time_val, Fld_time_tz, Fld_time_before, Fld_time_after, Fld_time_precision, Fld_time_model};} public void Insert(Db_stmt stmt, int claim_id, byte[] time_val, int tz, int before, int after, int precision, byte[] model) { stmt.Clear() - .Val_int_(claim_id) - .Val_str_by_bry_(time_val) - .Val_int_(tz) - .Val_int_(before) - .Val_int_(after) - .Val_int_(precision) - .Val_str_by_bry_(model) + .Val_int(claim_id) + .Val_bry_as_str(time_val) + .Val_int(tz) + .Val_int(before) + .Val_int(after) + .Val_int(precision) + .Val_bry_as_str(model) .Exec_insert(); } private static final String Fld_claim_id = "claim_id", Fld_time_val = "time_val", Fld_time_tz = "time_tz", Fld_time_before = "time_before", Fld_time_after = "time_after", Fld_time_precision = "time_precision", Fld_time_model = "time_model"; @@ -341,12 +341,12 @@ class Wdata_claim_geo_tbl extends Wdata_tbl_base { } public void Insert(Db_stmt stmt, int claim_id, double latitude, double longitude, byte[] altitude, double precision, byte[] globe) { stmt.Clear() - .Val_int_(claim_id) - .Val_double_(latitude) - .Val_double_(longitude) - .Val_str_by_bry_(altitude) - .Val_double_(precision) - .Val_str_by_bry_(globe) + .Val_int(claim_id) + .Val_double(latitude) + .Val_double(longitude) + .Val_bry_as_str(altitude) + .Val_double(precision) + .Val_bry_as_str(globe) .Exec_insert(); } @Override public String[] Fld_ary() {return new String[] {Fld_claim_id, Fld_geo_latitude, Fld_geo_longitude, Fld_geo_altitude, Fld_geo_precision, Fld_geo_globe};} @@ -394,9 +394,9 @@ class Wdata_qual_tbl extends Wdata_tbl_base { @Override public String[] Fld_ary() {return new String[] {Fld_qual_id, Fld_page_id, Fld_val_text};} public void Insert(Db_stmt stmt, int qual_id, int page_id, byte[] val_text) { stmt.Clear() - .Val_int_(qual_id) - .Val_int_(page_id) - .Val_str_by_bry_(val_text) + .Val_int(qual_id) + .Val_int(page_id) + .Val_bry_as_str(val_text) .Exec_insert(); } private static final String Fld_qual_id = "qual_id", Fld_page_id = "page_id", Fld_val_text = "val_text"; diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_pid_sql.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_pid_sql.java index 1f27b7eff..1844c290e 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_pid_sql.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_pid_sql.java @@ -18,20 +18,20 @@ along with this program. If not, see . package gplx.xowa.xtns.wdatas.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wdatas.*; import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.dbs.tbls.*; public class Xob_wdata_pid_sql extends Xob_wdata_pid_base { - Xodb_mgr_sql db_mgr; Xodb_wdata_pids_tbl tbl; Db_stmt stmt; Db_provider provider; + Xodb_mgr_sql db_mgr; Xodb_wdata_pids_tbl tbl; Db_stmt stmt; Db_conn conn; @Override public String Wkr_key() {return KEY;} public static final String KEY = "import.sql.wdata.pid"; @Override public void Pid_bgn() { db_mgr = wiki.Db_mgr_as_sql(); tbl = db_mgr.Tbl_wdata_pids(); - provider = db_mgr.Fsys_mgr().Provider_wdata(); - stmt = tbl.Insert_stmt(provider); - provider.Txn_mgr().Txn_bgn_if_none(); + conn = db_mgr.Fsys_mgr().Conn_wdata(); + stmt = tbl.Insert_stmt(conn); + conn.Txn_mgr().Txn_bgn_if_none(); } @Override public void Pid_add(byte[] lang_key, byte[] ttl, byte[] pid) { tbl.Insert(stmt, lang_key, ttl, pid); } @Override public void Pid_end() { - provider.Txn_mgr().Txn_end_all(); + conn.Txn_mgr().Txn_end_all(); stmt.Rls(); db_mgr.Fsys_mgr().Index_create(wiki.App().Usr_dlg(), Byte_.Ary(Xodb_file_tid.Tid_core, Xodb_file_tid.Tid_wikidata), Index_wdata_pids); } diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_sql.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_sql.java index c9f5b4dc4..d00e3660d 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_sql.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_sql.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.xtns.wdatas.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wdatas.*; import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.dbs.tbls.*; public class Xob_wdata_qid_sql extends Xob_wdata_qid_base { - Xodb_mgr_sql db_mgr; Xodb_wdata_qids_tbl tbl; Db_stmt stmt; Db_provider provider; + Xodb_mgr_sql db_mgr; Xodb_wdata_qids_tbl tbl; Db_stmt stmt; Db_conn conn; @Override public String Wkr_key() {return KEY;} public static final String KEY = "import.sql.wdata.qid"; @Override public void Qid_bgn() { db_mgr = wiki.Db_mgr_as_sql(); @@ -26,17 +26,17 @@ public class Xob_wdata_qid_sql extends Xob_wdata_qid_base { long wikidata_max = wiki.App().Setup_mgr().Dump_mgr().Db_wikidata_max(); if (wikidata_max > 0) { Xodb_file wdata_file = db_mgr.Fsys_mgr().Make(Xodb_file_tid.Tid_wikidata); - db_mgr.Fsys_mgr().Provider_wdata_(wdata_file); + db_mgr.Fsys_mgr().Conn_wdata_(wdata_file); } - provider = db_mgr.Fsys_mgr().Provider_wdata(); - stmt = tbl.Insert_stmt(provider); - provider.Txn_mgr().Txn_bgn_if_none(); + conn = db_mgr.Fsys_mgr().Conn_wdata(); + stmt = tbl.Insert_stmt(conn); + conn.Txn_mgr().Txn_bgn_if_none(); } @Override public void Qid_add(byte[] wiki_key, Xow_ns ns, byte[] ttl, byte[] qid) { tbl.Insert(stmt, wiki_key, ns.Id(), ttl, qid); } @Override public void Qid_end() { - provider.Txn_mgr().Txn_end_all(); + conn.Txn_mgr().Txn_end_all(); stmt.Rls(); db_mgr.Fsys_mgr().Index_create(wiki.App().Usr_dlg(), Byte_.Ary(Xodb_file_tid.Tid_core, Xodb_file_tid.Tid_wikidata), Index_wdata_qids); } diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/parsers/Wdata_claims_parser_v2.java b/400_xowa/src/gplx/xowa/xtns/wdatas/parsers/Wdata_claims_parser_v2.java index 745081f7c..8a2bc2c3d 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/parsers/Wdata_claims_parser_v2.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/parsers/Wdata_claims_parser_v2.java @@ -112,7 +112,7 @@ class Wdata_claims_parser_v2 { public Wdata_claim_itm_core Parse_mainsnak(byte[] qid, Json_itm_nde nde, int pid) { int len = nde.Subs_len(); Hash_adp_bry dict = Wdata_dict_mainsnak.Dict; - byte snak_tid = Byte_.MaxValue_127; + byte snak_tid = Byte_.Max_value_127; for (int i = 0; i < len; ++i) { Json_itm_kv sub = Json_itm_kv.cast_(nde.Subs_get_at(i)); byte tid = Wdata_dict_utl.Get_tid_or_invalid(qid, dict, sub.Key().Data_bry()); if (tid == Wdata_dict_utl.Tid_invalid) continue; diff --git a/400_xowa/src/gplx/xowa2/apps/Xoav_app.java b/400_xowa/src/gplx/xowa2/apps/Xoav_app.java new file mode 100644 index 000000000..4018f7f07 --- /dev/null +++ b/400_xowa/src/gplx/xowa2/apps/Xoav_app.java @@ -0,0 +1,42 @@ +/* +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.xowa2.apps; import gplx.*; import gplx.xowa2.*; +import gplx.dbs.*; import gplx.xowa.apps.fsys.*; import gplx.xowa.parsers.amps.*; import gplx.xowa.langs.cases.*; import gplx.intl.*; import gplx.xowa.users.data.*; +import gplx.xowa2.apps.urls.*; import gplx.xowa2.users.*; +public class Xoav_app { + public Xoav_app() { + this.fsys_mgr = new Xoa_fsys_mgr(); + this.wiki_mgr = new Xoav_wiki_mgr(this, utl_case_mgr); + this.utl_msg_log = Gfo_msg_log.Test(); + } + public Xoa_fsys_mgr Fsys_mgr() {return fsys_mgr;} private Xoa_fsys_mgr fsys_mgr; + public Xoav_wiki_mgr Wiki_mgr() {return wiki_mgr;} private final Xoav_wiki_mgr wiki_mgr; + public Xoud_data_mgr User_data_mgr() {return user_data_mgr;} private Xoud_data_mgr user_data_mgr = new Xoud_data_mgr(); + + public Gfo_usr_dlg Usr_dlg() {return usr_dlg;} public void Usr_dlg_(Gfo_usr_dlg v) {usr_dlg = v;} private Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_.Null; + public Bry_bfr_mkr Utl_bfr_mkr() {return utl_bfr_mkr;} private Bry_bfr_mkr utl_bfr_mkr = new Bry_bfr_mkr(); + public Xop_amp_mgr Utl_amp_mgr() {return utl_amp_mgr;} private Xop_amp_mgr utl_amp_mgr = new Xop_amp_mgr(); + public Xol_case_mgr Utl_case_mgr() {return utl_case_mgr;} private Xol_case_mgr utl_case_mgr = Xol_case_mgr_.Utf8(); + public Url_encoder Utl_encoder_fsys() {return utl_encoder_fsys;} private Url_encoder utl_encoder_fsys = Url_encoder.new_fsys_lnx_(); + public Gfo_msg_log Utl_msg_log() {return utl_msg_log;} private Gfo_msg_log utl_msg_log; + public Xoav_url_parser Utl_url_parser_xo() {return utl_url_parser_xo;} private Xoav_url_parser utl_url_parser_xo = new Xoav_url_parser(); + public Gfo_url_parser Utl_url_parser_gfo() {return utl_url_parser_gfo;} private final Gfo_url_parser utl_url_parser_gfo = new Gfo_url_parser(); + public void Init_by_boot(String plat_name, Io_url root_dir) { + fsys_mgr.Init_by_boot(plat_name, root_dir); + } +} diff --git a/400_xowa/src/gplx/xowa2/apps/Xoav_wiki_mgr.java b/400_xowa/src/gplx/xowa2/apps/Xoav_wiki_mgr.java new file mode 100644 index 000000000..0a1b44fc2 --- /dev/null +++ b/400_xowa/src/gplx/xowa2/apps/Xoav_wiki_mgr.java @@ -0,0 +1,62 @@ +/* +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.xowa2.apps; import gplx.*; import gplx.xowa2.*; +import gplx.xowa.langs.cases.*; import gplx.xowa.users.data.*; +import gplx.xowa2.wikis.*; import gplx.xowa2.users.data.*; +public class Xoav_wiki_mgr implements GfoInvkAble { + private final Xoav_app app; private final OrderedHash hash = OrderedHash_.new_bry_(); + public Xoav_wiki_mgr(Xoav_app app, Xol_case_mgr case_mgr) {this.app = app;} + public Xowv_wiki Get_by_domain(byte[] domain) { + Xowv_wiki rv = (Xowv_wiki)hash.Fetch(domain); + return rv.Init_assert(); + } + public Xowv_wiki Import_by_fil(Io_url fil) { + Io_url wiki_dir = fil.OwnerDir(); + Xowv_wiki rv = Load(String_.Replace(fil.NameOnly(), ".000", ""), wiki_dir); + app.User_data_mgr().Site_mgr().Import(rv.Domain_str(), rv.Domain_str(), wiki_dir.Raw(), ""); + return rv; + } + public void Load_by_user_data() { + Xoud_site_row[] ary = app.User_data_mgr().Site_mgr().Get_all(); + int len = ary.length; + for (int i = 0; i < len; ++i) { + Xoud_site_row itm = ary[i]; + Load(itm.Domain(), Io_url_.new_dir_(itm.Path())); + } + } + public Xowv_wiki Load_by_fil(Io_url fil) {return Load(String_.Replace(fil.NameOnly(), ".000", ""), fil.OwnerDir());} + public void Load_by_dir(Io_url wiki_root_dir) { + Io_url[] wiki_dirs = Io_mgr._.QueryDir_args(wiki_root_dir).DirOnly_().ExecAsUrlAry(); + for (Io_url wiki_dir : wiki_dirs) { + String wiki_dir_url = wiki_dir.Raw(); + if (String_.HasAtBgn(wiki_dir_url, "#")) continue; + Load(wiki_dir.NameOnly(), wiki_dir); + } + } + private Xowv_wiki Load(String domain_str, Io_url wiki_dir) { + byte[] domain_bry = Bry_.new_utf8_(domain_str); + Xowv_wiki wiki = new Xowv_wiki(app, domain_bry, wiki_dir); + hash.AddReplace(domain_bry, wiki); + return 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"))); + else return GfoInvkAble_.Rv_unhandled; + } + public static final String Invk_import_by_fil = "import_by_fil"; +} diff --git a/400_xowa/src/gplx/xowa2/apps/urls/Xoav_url.java b/400_xowa/src/gplx/xowa2/apps/urls/Xoav_url.java new file mode 100644 index 000000000..b04a3b298 --- /dev/null +++ b/400_xowa/src/gplx/xowa2/apps/urls/Xoav_url.java @@ -0,0 +1,25 @@ +/* +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.xowa2.apps.urls; import gplx.*; import gplx.xowa2.*; import gplx.xowa2.apps.*; +public class Xoav_url { + public byte[] Wiki_bry() {return wiki_bry;} public void Wiki_bry_(byte[] v) {wiki_bry = v;} private byte[] wiki_bry; + public byte[] Page_bry() {return page_bry;} public void Page_bry_(byte[] v) {page_bry = v;} private byte[] page_bry; + public byte[] Anch_bry() {return anch_bry;} public void Anch_bry_(byte[] v) {anch_bry = v;} private byte[] anch_bry; + public byte[] Qarg_bry() {return qarg_bry;} public void Qarg_bry_(byte[] v) {qarg_bry = v;} private byte[] qarg_bry; + public void Clear() {wiki_bry = page_bry = null;} +} diff --git a/400_xowa/src/gplx/xowa2/apps/urls/Xoav_url_parser.java b/400_xowa/src/gplx/xowa2/apps/urls/Xoav_url_parser.java new file mode 100644 index 000000000..52429a05a --- /dev/null +++ b/400_xowa/src/gplx/xowa2/apps/urls/Xoav_url_parser.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.xowa2.apps.urls; import gplx.*; import gplx.xowa2.*; import gplx.xowa2.apps.*; +public class Xoav_url_parser { + private static final byte[] Bry_site = Bry_.new_ascii_("/site/"), Bry_wiki = Bry_.new_ascii_("/wiki/"); + public void Parse_xo_href(Xoav_url rv, byte[] src, byte[] cur_wiki_bry) { + rv.Clear(); + int pos = 0; + int src_len = src.length; + if (Bry_.HasAtBgn(src, Bry_site, pos, src_len)) + pos = Parse_wiki(rv, src, src_len, pos); + else + rv.Wiki_bry_(cur_wiki_bry); + if (Bry_.HasAtBgn(src, Bry_wiki, pos, src_len)) pos = Parse_page(rv, src, src_len, pos); + } + private int Parse_wiki(Xoav_url rv, byte[] src, int src_len, int pos) { + int wiki_bgn = pos + Bry_site.length; + int wiki_end = Bry_finder.Find_fwd(src, Byte_ascii.Slash, wiki_bgn, src_len); if (wiki_end == Bry_.NotFound) throw Err_.new_fmt_("could not find wiki_end; src={0}", String_.new_utf8_(src)); + rv.Wiki_bry_(Bry_.Mid(src, wiki_bgn, wiki_end)); + return wiki_end; + } + private int Parse_page(Xoav_url rv, byte[] src, int src_len, int pos) { + int page_bgn = pos + Bry_wiki.length; + int page_end = src_len; + rv.Page_bry_(Bry_.Mid(src, page_bgn, page_end)); + return page_end; + } +} diff --git a/400_xowa/src/gplx/xowa2/apps/urls/Xoav_url_parser_tst.java b/400_xowa/src/gplx/xowa2/apps/urls/Xoav_url_parser_tst.java new file mode 100644 index 000000000..6e770093a --- /dev/null +++ b/400_xowa/src/gplx/xowa2/apps/urls/Xoav_url_parser_tst.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.xowa2.apps.urls; import gplx.*; import gplx.xowa2.*; import gplx.xowa2.apps.*; +import org.junit.*; +public class Xoav_url_parser_tst { + @Before public void init() {fxt.Clear();} private final Xoav_url_parser_fxt fxt = new Xoav_url_parser_fxt(); + @Test public void Page() { + fxt.Exec_parse_xo_href("/wiki/Earth").Test_wiki("en.wikipedia.org").Test_page("Earth"); + } + @Test public void Site() { + fxt.Exec_parse_xo_href("/site/en.wikipedia.org/wiki/Earth").Test_wiki("en.wikipedia.org").Test_page("Earth"); + } +} +class Xoav_url_parser_fxt { + private Xoav_url_parser url_parser = new Xoav_url_parser(); private Xoav_url url = new Xoav_url(); + public void Clear() { + cur_wiki = Bry_.new_utf8_("en.wikipedia.org"); + url.Clear(); + } + public Xoav_url_parser_fxt Init_cur_wiki(String v) {cur_wiki = Bry_.new_utf8_(v); return this;} private byte[] cur_wiki; + public Xoav_url_parser_fxt Test_wiki(String v) {Tfds.Eq_bry(Bry_.new_utf8_(v), url.Wiki_bry()); return this;} + public Xoav_url_parser_fxt Test_page(String v) {Tfds.Eq_bry(Bry_.new_utf8_(v), url.Page_bry()); return this;} + public Xoav_url_parser_fxt Exec_parse_xo_href(String src_str) { + byte[] src_bry = Bry_.new_utf8_(src_str); + url_parser.Parse_xo_href(url, src_bry, cur_wiki); + return this; + } +} diff --git a/400_xowa/src/gplx/xowa2/files/Xof_fsdb_mgr.java b/400_xowa/src/gplx/xowa2/files/Xof_fsdb_mgr.java new file mode 100644 index 000000000..e5214bed7 --- /dev/null +++ b/400_xowa/src/gplx/xowa2/files/Xof_fsdb_mgr.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.xowa2.files; import gplx.*; import gplx.xowa2.*; +public interface Xof_fsdb_mgr { + boolean Download(Xofv_file_itm itm); +} diff --git a/400_xowa/src/gplx/xowa2/files/Xof_orig_mgr.java b/400_xowa/src/gplx/xowa2/files/Xof_orig_mgr.java new file mode 100644 index 000000000..5237ee014 --- /dev/null +++ b/400_xowa/src/gplx/xowa2/files/Xof_orig_mgr.java @@ -0,0 +1,22 @@ +/* +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.xowa2.files; import gplx.*; import gplx.xowa2.*; +import gplx.xowa.files.wiki_orig.*; +public interface Xof_orig_mgr { + Xof_orig_regy_itm Get_by_ttl(byte[] ttl); +} diff --git a/400_xowa/src/gplx/xowa2/files/Xofv_file_itm.java b/400_xowa/src/gplx/xowa2/files/Xofv_file_itm.java new file mode 100644 index 000000000..f2df1c016 --- /dev/null +++ b/400_xowa/src/gplx/xowa2/files/Xofv_file_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.xowa2.files; import gplx.*; import gplx.xowa2.*; +import gplx.xowa.*; import gplx.xowa.files.*; import gplx.xowa.files.wiki_orig.*; +public class Xofv_file_itm { + Xofv_file_itm(byte[] file_repo, byte[] file_ttl, byte[] file_md5, Xof_ext file_ext, Io_url file_url, int html_uid, int html_w, int html_h, byte lnki_exec_tid, boolean lnki_is_orig, double lnki_time, int lnki_page) { + this.file_repo = file_repo; this.file_ttl = file_ttl; this.file_md5 = file_md5; this.file_ext = file_ext; this.file_url = file_url; + this.html_uid = html_uid; this.html_w = html_w; this.html_h = html_h; + this.lnki_exec_tid = lnki_exec_tid; this.lnki_is_orig = lnki_is_orig; this.lnki_time = lnki_time; this.lnki_page = lnki_page; + } + public byte[] File_repo() {return file_repo;} private final byte[] file_repo; + public byte[] File_ttl() {return file_ttl;} private final byte[] file_ttl; + public byte[] File_md5() {return file_md5;} private final byte[] file_md5; + public Xof_ext File_ext() {return file_ext;} private final Xof_ext file_ext; + public Io_url File_url() {return file_url;} private final Io_url file_url; + public long File_size() {return file_size;} public void File_size_(long v) {file_size = v;} private long file_size; + public int Html_uid() {return html_uid;} private final int html_uid; + public int Html_w() {return html_w;} private final int html_w; + public int Html_h() {return html_h;} private final int html_h; + public byte Lnki_exec_tid() {return lnki_exec_tid;} private final byte lnki_exec_tid; + public boolean Lnki_is_orig() {return lnki_is_orig;} private final boolean lnki_is_orig; + public double Lnki_time() {return lnki_time;} private final double lnki_time; + public int Lnki_page() {return lnki_page;} private final int lnki_page; + public static Xofv_file_itm new_(Xof_xfer_itm xfer, Xof_orig_regy_itm orig, Xofv_repo_mgr repo_mgr, Xof_img_size img_size, Xof_url_bldr url_bldr) { + Xofv_repo_itm repo = repo_mgr.Get_by_tid(orig.Repo_tid()); + byte[] file_repo = repo.Key(); + byte[] file_ttl = orig.Orig_redirect(); if (file_ttl == null) file_ttl = orig.Ttl(); + byte[] file_md5 = Xof_xfer_itm_.Md5_(file_ttl); + Xof_ext file_ext = Xof_ext_.new_by_ttl_(file_ttl); + byte lnki_exec_tid = xfer.Lnki_exec_tid(); + boolean lnki_is_orig = xfer.Img_is_orig(); + double lnki_time = xfer.Lnki_thumbtime(); + int lnki_page = xfer.Lnki_page(); + int html_uid = xfer.Html_uid(); + img_size.Html_size_calc + ( xfer.Lnki_exec_tid(), xfer.Lnki_w(), xfer.Lnki_h(), xfer.Lnki_type(), Xof_patch_upright_tid_.Tid_all, xfer.Lnki_upright() + , file_ext.Id(), orig.Orig_w(), orig.Orig_h(), Xof_img_size.Thumb_width_img); + int html_w = img_size.Html_w(); + int html_h = img_size.Html_h(); + byte repo_mode = 0; byte[] repo_dir_sub = null; + if (xfer.Img_is_orig()) { + repo_mode = Xof_repo_itm.Mode_orig; + repo_dir_sub = repo.Dir_sub_orig(); + } + else { + repo_mode = Xof_repo_itm.Mode_thumb; + repo_dir_sub = repo.Dir_sub_thumb(); + } + url_bldr.Init(Bool_.N, Bool_.N, repo.Dir_spr(), repo.Dir_root(), repo_dir_sub, Xof_url_bldr.Md5_dir_depth_2 + , file_ttl, file_md5, file_ext, repo_mode + , html_w, lnki_time, lnki_page + ); + Io_url file_url = url_bldr.Xto_url(); + return new Xofv_file_itm(file_repo, file_ttl, file_md5, file_ext, file_url, html_uid, html_w, html_h, lnki_exec_tid, lnki_is_orig, lnki_time, lnki_page); + } +} diff --git a/400_xowa/src/gplx/xowa2/files/Xofv_file_itm_list.java b/400_xowa/src/gplx/xowa2/files/Xofv_file_itm_list.java new file mode 100644 index 000000000..ff78e125e --- /dev/null +++ b/400_xowa/src/gplx/xowa2/files/Xofv_file_itm_list.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.xowa2.files; import gplx.*; import gplx.xowa2.*; +import gplx.xowa.*; import gplx.xowa.files.*; import gplx.xowa.files.fsdb.*; +class Xofv_file_itm_list { + private final ListAdp list = ListAdp_.new_(); + public void Add(Xofv_file_itm file_itm) { + synchronized (list) {list.Add(file_itm);} + } + public Xofv_file_itm Pop_at_or_null(int i) { + synchronized (list) { + if (i >= list.Count()) return null; + Xofv_file_itm rv = (Xofv_file_itm)list.FetchAt(i); + list.DelAt(i); + return rv; + } + } +} +class Xop_xfer_itm_hash { // thread-safe + private final OrderedHash hash = OrderedHash_.new_(); + public int Count() { + synchronized (hash) {return hash.Count();} + } + public void Clear() { + synchronized (hash) {hash.Clear();} + } + public void Add(Xof_xfer_itm xfer_itm) { + synchronized (hash) {hash.Add_if_new(xfer_itm.Lnki_ttl(), xfer_itm);} + } + public Xof_xfer_itm Get_at_or_null(int i) { + synchronized (hash) { + return i < hash.Count() ? (Xof_xfer_itm)hash.FetchAt(i) : null; + } + } + public void Del(byte[] lnki_ttl) { + synchronized (hash) {hash.Del(lnki_ttl);} + } + public Xof_xfer_itm Pop_at_or_null(int i) { + synchronized (hash) { + if (i >= hash.Count()) return null; + Xof_xfer_itm rv = (Xof_xfer_itm)hash.FetchAt(i); + hash.Del(rv.Lnki_ttl()); + return rv; + } + } +} +interface Xog_html_gui { + void Update(int id, String src, int w, int h); +} diff --git a/400_xowa/src/gplx/xowa2/files/Xofv_file_mgr.java b/400_xowa/src/gplx/xowa2/files/Xofv_file_mgr.java new file mode 100644 index 000000000..d6f2049e3 --- /dev/null +++ b/400_xowa/src/gplx/xowa2/files/Xofv_file_mgr.java @@ -0,0 +1,65 @@ +/* +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.xowa2.files; import gplx.*; import gplx.xowa2.*; +import gplx.xowa.*; import gplx.xowa.files.*; import gplx.xowa.files.wiki_orig.*; +public class Xofv_file_mgr { + private final Xop_xfer_itm_hash lnki_hash = new Xop_xfer_itm_hash(); + private final Xofv_file_itm_list html_list = new Xofv_file_itm_list(); + private final Xof_url_bldr url_bldr = Xof_url_bldr.new_v2_(); private final Xof_img_size img_size = new Xof_img_size(); + public Xofv_file_mgr(byte[] wiki_bry) {this.wiki_bry = wiki_bry;} + public byte[] Wiki_bry() {return wiki_bry;} private final byte[] wiki_bry; + public Xofv_repo_mgr Repo_mgr() {return repo_mgr;} private final Xofv_repo_mgr repo_mgr = new Xofv_repo_mgr(); + public Xof_orig_mgr Orig_mgr() {return orig_mgr;} public Xofv_file_mgr Orig_mgr_(Xof_orig_mgr v) {orig_mgr = v; return this;} private Xof_orig_mgr orig_mgr; + public Xof_fsdb_mgr Fsdb_mgr() {return fsdb_mgr;} public Xofv_file_mgr Fsdb_mgr_(Xof_fsdb_mgr v) {fsdb_mgr = v; return this;} private Xof_fsdb_mgr fsdb_mgr; + public Xou_cache_mgr Cache_mgr() {return cache_mgr;} public Xofv_file_mgr Cache_mgr_(Xou_cache_mgr v) {cache_mgr = v; return this;} private Xou_cache_mgr cache_mgr; + public void Clear() {lnki_hash.Clear();} + public void Reg(Xof_xfer_itm xfer_itm) {lnki_hash.Add(xfer_itm);} + public void Process_lnki() { + while (true) { + Xof_xfer_itm xfer = lnki_hash.Pop_at_or_null(0); if (xfer == null) break; // no more items; stop + Xof_orig_regy_itm orig = orig_mgr.Get_by_ttl(xfer.Lnki_ttl()); + if (orig == null) { + Gfo_usr_dlg_._.Warn_many("", "", "orig not found for lnki; lnki_ttl=~{0}", xfer.Lnki_ttl()); + continue; + } + boolean fsdb_download = true; // default download to true + Xofv_file_itm itm = Xofv_file_itm.new_(xfer, orig, repo_mgr, img_size, url_bldr); + Xou_cache_fil cache_fil = cache_mgr.Fil__get_or_null(itm.File_repo(), itm.File_ttl(), itm.Lnki_is_orig(), itm.Html_w(), itm.Lnki_time(), itm.Lnki_page()); + if (cache_fil != null) { + if (Io_mgr._.ExistsFil(itm.File_url())) + fsdb_download = false; // cache exists and itm exists; don't download file + } + if (fsdb_download) { + if (!fsdb_mgr.Download(itm)) { + Gfo_usr_dlg_._.Warn_many("", "", "itm not found in fsdb; lnki_ttl=~{0}", xfer.Lnki_ttl()); + continue; + } + } + if (cache_fil == null) + cache_fil = new Xou_cache_fil(1, 1, itm.File_repo(), itm.File_ttl(), Xof_ext_.new_by_ttl_(itm.File_ttl()).Id(), itm.Lnki_is_orig(), itm.Html_w(), itm.Html_w(), itm.Lnki_time(), itm.Lnki_page(), itm.File_size(), 0); + cache_mgr.Fil__update(cache_fil); + html_list.Add(itm); + } + } + @gplx.Internal protected void Process_html(Xog_html_gui html_gui) { + while (true) { + Xofv_file_itm itm = html_list.Pop_at_or_null(0); if (itm == null) break; + html_gui.Update(itm.Html_uid(), itm.File_url().To_http_file_str(), itm.Html_w(), itm.Html_h()); + } + } +} diff --git a/400_xowa/src/gplx/xowa2/files/Xofv_file_mgr_tst.java b/400_xowa/src/gplx/xowa2/files/Xofv_file_mgr_tst.java new file mode 100644 index 000000000..13043e327 --- /dev/null +++ b/400_xowa/src/gplx/xowa2/files/Xofv_file_mgr_tst.java @@ -0,0 +1,322 @@ +/* +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.xowa2.files; import gplx.*; import gplx.xowa2.*; +import org.junit.*; +import gplx.xowa.*; import gplx.xowa.files.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.files.fsdb.caches.*; import gplx.xowa.files.wiki_orig.*; +import gplx.xowa2.apps.*; import gplx.xowa2.wikis.*; +public class Xofv_file_mgr_tst { + @Before public void init() {fxt.Clear();} private Xofv_file_mgr_fxt fxt = new Xofv_file_mgr_fxt(); + @Test public void Thumb() { + fxt .Init_orig_add(fxt.Mkr_orig().Init_comm("A.png", 440, 400)) + .Init_fsdb_add(fxt.Mkr_fsdb().Init_comm_thum("A.png", 220, 200)) + .Init_xfer_add(fxt.Mkr_xfer().Init_thumb(0, "A.png", 220, 200)) + .Exec_process_lnki() + .Test_html_get(fxt.Mkr_html().Init(0, "file:///mem/xowa/file/comm/thumb/7/0/A.png/220px.png", 220, 200)) + .Test_fsys_get("mem/xowa/file/comm/thumb/7/0/A.png/220px.png") + .Test_fsdb_download(1); + ; + } + @Test public void Orig() { + fxt .Init_orig_add(fxt.Mkr_orig().Init_comm("A.png", 440, 400)) + .Init_fsdb_add(fxt.Mkr_fsdb().Init_comm_orig("A.png", 440, 400)) + .Init_xfer_add(fxt.Mkr_xfer().Init_none(0, "A.png")) + .Exec_process_lnki() + .Test_html_get(fxt.Mkr_html().Init(0, "file:///mem/xowa/file/comm/orig/7/0/A.png", 440, 400)) + .Test_fsys_get("mem/xowa/file/comm/orig/7/0/A.png") + .Test_fsdb_download(1); + ; + } + @Test public void Img_size() { // PURPOSE: test integration of Xof_img_size + fxt .Init_orig_add(fxt.Mkr_orig().Init_comm("A.png", 440, 400)) + .Init_fsdb_add(fxt.Mkr_fsdb().Init_comm_thum("A.png", 110, 100)) + .Init_xfer_add(fxt.Mkr_xfer().Init_thumb(0, "A.png", Xof_img_size.Null, Xof_img_size.Null).Upright_(.5f)) + .Exec_process_lnki() + .Test_html_get(fxt.Mkr_html().Init(0, "file:///mem/xowa/file/comm/thumb/7/0/A.png/110px.png", 110, 100)) + .Test_fsys_get("mem/xowa/file/comm/thumb/7/0/A.png/110px.png") + .Test_fsdb_download(1); + ; + } + @Test public void Orig_mgr() { // PURPOSE: test integration of Orig_mgr + fxt .Init_orig_add(fxt.Mkr_orig().Init_comm_redirect("B.jpg", "A.png", 440, 400)) // B.jpg redirects to A.png + .Init_fsdb_add(fxt.Mkr_fsdb().Init_comm_thum("A.png", 220, 200)) + .Init_xfer_add(fxt.Mkr_xfer().Init_thumb(0, "B.jpg", 220, 200)) + .Exec_process_lnki() + .Test_html_get(fxt.Mkr_html().Init(0, "file:///mem/xowa/file/comm/thumb/7/0/A.png/220px.png", 220, 200)) + .Test_fsys_get("mem/xowa/file/comm/thumb/7/0/A.png/220px.png") + .Test_fsdb_download(1); + ; + } + @Test public void Cache_exists() { + fxt .Init_orig_add(fxt.Mkr_orig().Init_comm("A.png", 440, 400)) + .Init_fsdb_add(fxt.Mkr_fsdb().Init_comm_thum("A.png", 220, 200)) + .Init_xfer_add(fxt.Mkr_xfer().Init_thumb(0, "A.png", 220, 200)) + .Init_cache_add(fxt.Mkr_cache().Init("comm", "A.png", Bool_.N, 220)) // add to cache + .Init_fsys_add("mem/xowa/file/comm/thumb/7/0/A.png/220px.png") // copy file to fsys + .Exec_process_lnki() + .Test_fsdb_download(0) // skip download + ; + } + @Test public void Cache_absent() { + fxt .Init_orig_add(fxt.Mkr_orig().Init_comm("A.png", 440, 400)) + .Init_fsdb_add(fxt.Mkr_fsdb().Init_comm_thum("A.png", 220, 200)) + .Init_xfer_add(fxt.Mkr_xfer().Init_thumb(0, "A.png", 220, 200)) + .Init_cache_add(fxt.Mkr_cache().Init("commons", "A.png", Bool_.N, 220)) // add to cache + .Exec_process_lnki() + .Test_fsdb_download(1) // do download + ; + } +} +class Xofv_file_mgr_fxt { + private Xofv_file_mgr file_mgr; + private final Xof_orig_mgr__test orig_mgr = new Xof_orig_mgr__test(); private final Xou_cache_mgr__test cache_mgr = new Xou_cache_mgr__test(); + private final Xof_fsdb_mgr__test fsdb_mgr = new Xof_fsdb_mgr__test(); private final Xog_html_gui__test html_gui = new Xog_html_gui__test(); + public Xof_xfer_mkr Mkr_xfer() {return mkr_xfer;} private final Xof_xfer_mkr mkr_xfer = new Xof_xfer_mkr(); + public Xofv_orig_mkr Mkr_orig() {return mkr_orig;} private final Xofv_orig_mkr mkr_orig = new Xofv_orig_mkr(); + public Xof_fsdb_mkr Mkr_fsdb() {return mkr_fsdb;} private final Xof_fsdb_mkr mkr_fsdb = new Xof_fsdb_mkr(); + public Xog_html_rsc_mkr Mkr_html() {return mkr_html;} private final Xog_html_rsc_mkr mkr_html = new Xog_html_rsc_mkr(); + public Xou_cache_mgr_itm_mkr Mkr_cache() {return mkr_cache;} private final Xou_cache_mgr_itm_mkr mkr_cache = new Xou_cache_mgr_itm_mkr(); + public void Clear() { + file_mgr = new Xofv_file_mgr(Bry_.new_ascii_("enwiki")); + orig_mgr.Clear(); + cache_mgr.Clear(); + fsdb_mgr.Clear(); + html_gui.Clear(); + file_mgr.Orig_mgr_(orig_mgr).Cache_mgr_(cache_mgr).Fsdb_mgr_(fsdb_mgr); + Clear_repos(); + } + private void Clear_repos() { + Xofv_repo_mgr repo_mgr = file_mgr.Repo_mgr(); + Io_url root_dir = Io_url_.mem_dir_("mem/xowa/file/"); + Xofv_repo_itm repo_comm = Xofv_repo_itm.new_trg_fsys(Xofv_repo_itm.Tid_val_comm, Bry_.new_ascii_("comm"), root_dir.GenSubDir("comm")); + Xofv_repo_itm repo_wiki = Xofv_repo_itm.new_trg_fsys(Xofv_repo_itm.Tid_val_wiki, Bry_.new_ascii_("wiki"), root_dir.GenSubDir("wiki")); + repo_mgr.Add(repo_comm).Add(repo_wiki); + mkr_orig.Setup_repos(repo_comm, repo_wiki); + mkr_fsdb.Setup_repos(Bry_.new_ascii_("comm"), Bry_.new_ascii_("wiki")); + } + public Xofv_file_mgr_fxt Init_xfer_add(Xof_xfer_mkr mkr) {file_mgr.Reg(mkr.Make()); return this;} + public Xofv_file_mgr_fxt Init_orig_add(Xofv_orig_mkr mkr) {orig_mgr.Add(mkr.Make()); return this;} + public Xofv_file_mgr_fxt Init_fsdb_add(Xof_fsdb_mkr mkr) {fsdb_mgr.Add(mkr.Make()); return this;} + public Xofv_file_mgr_fxt Init_cache_add(Xou_cache_mgr_itm_mkr mkr) {cache_mgr.Fil__update(mkr.Make()); return this;} + public Xofv_file_mgr_fxt Init_fsys_add(String s) {Io_mgr._.SaveFilStr(s, ""); return this;} + public Xofv_file_mgr_fxt Exec_process_lnki() {file_mgr.Process_lnki(); return this;} + public Xofv_file_mgr_fxt Test_fsys_get(String path) { + Tfds.Eq_true(Io_mgr._.ExistsFil(Io_url_.mem_fil_(path)), "fsys: " + path); + return this; + } + public Xofv_file_mgr_fxt Test_html_get(Xog_html_rsc_mkr mkr) { + file_mgr.Process_html(html_gui); + Xog_html_rsc expd = mkr.Make(); + Xog_html_rsc actl = html_gui.Get_by_id(expd.Uid()); + Bry_bfr bfr = Bry_bfr.reset_(255); + Tfds.Eq_str_lines(Xog_html_rsc_mkr.Xto_str(bfr, expd), Xog_html_rsc_mkr.Xto_str(bfr, actl)); + return this; + } + public Xofv_file_mgr_fxt Test_fsdb_download(int expd) { + Tfds.Eq(expd, fsdb_mgr.Download_count()); + return this; + } +} +class Xog_html_rsc_mkr { + private int uid; private String src; private int html_w, html_h; + public Xog_html_rsc_mkr Init(int uid, String src, int html_w, int html_h) {this.uid = uid; this.src = src; this.html_w = html_w; this.html_h = html_h; return this;} + private void Reset() {} + public Xog_html_rsc Make() { + Xog_html_rsc rv = new Xog_html_rsc(uid, src, html_w, html_h); + this.Reset(); + return rv; + } + public static String Xto_str(Bry_bfr bfr, Xog_html_rsc itm) { + if (itm == null) return ""; + bfr .Add_int_variable(itm.Uid()).Add_byte_nl() + .Add_str_utf8(itm.Src()).Add_byte_nl() + .Add_int_variable(itm.Html_w()).Add_byte_nl() + .Add_int_variable(itm.Html_h()).Add_byte_nl() + ; + return bfr.Xto_str_and_clear(); + } +} +class Xof_xfer_mkr { + private byte[] ttl_bry; private byte lnki_type; private int xfer_w, xfer_h; private int uid; + private byte[] redirect_bry; private double upright, thumbtime; private int page; + public Xof_xfer_mkr() {this.Reset();} + public Xof_xfer_mkr Upright_(double v) {upright = v; return this;} + private void Reset() { + redirect_bry = Bry_.Empty; + upright = Xop_lnki_tkn.Upright_null; + thumbtime = Xof_doc_thumb.Null; + page = Xof_doc_page.Null; + } + public Xof_xfer_mkr Init_thumb(int uid, String ttl_str, int xfer_w, int xfer_h) { + this.lnki_type = Xop_lnki_type.Id_thumb; + this.uid = uid; this.ttl_bry = Bry_.new_utf8_(ttl_str); this.xfer_w = xfer_w; this.xfer_h = xfer_h; + return this; + } + public Xof_xfer_mkr Init_none(int uid, String ttl_str) { + this.lnki_type = Xop_lnki_type.Id_none; + this.uid = uid; this.ttl_bry = Bry_.new_utf8_(ttl_str); this.xfer_w = Xof_img_size.Null; this.xfer_h = Xof_img_size.Null; + return this; + } + public Xof_xfer_itm Make() { + Xof_xfer_itm rv = new Xof_xfer_itm(); + rv.Init_by_lnki(ttl_bry, redirect_bry, lnki_type, xfer_w, xfer_h, upright, thumbtime, page); + rv.Set__html_uid_tid(uid, Xof_html_elem.Tid_img); + this.Reset(); + return rv; + } +} +class Xofv_orig_mkr { + private byte[] ttl_bry; private int ext, orig_w, orig_h; private Xofv_repo_itm repo; + private byte[] redirect_bry; + private Xofv_repo_itm repo_comm, repo_wiki; + public Xofv_orig_mkr() {this.Reset();} + private void Reset() { + redirect_bry = null; + } + public void Setup_repos(Xofv_repo_itm repo_comm, Xofv_repo_itm repo_wiki) {this.repo_comm = repo_comm; this.repo_wiki = repo_wiki;} + public Xofv_orig_mkr Init_comm_redirect(String src, String trg, int orig_w, int orig_h) {return Init(Bool_.Y, src, trg, orig_w, orig_h);} + public Xofv_orig_mkr Init_comm(String ttl_str, int orig_w, int orig_h) {return Init(Bool_.Y, ttl_str, null, orig_w, orig_h);} + public Xofv_orig_mkr Init_wiki(String ttl_str, int orig_w, int orig_h) {return Init(Bool_.N, ttl_str, null, orig_w, orig_h);} + private Xofv_orig_mkr Init(boolean repo_is_comm, String ttl_str, String redirect_str, int orig_w, int orig_h) { + repo = repo_is_comm ? repo_comm : repo_wiki; + this.ttl_bry = Bry_.new_utf8_(ttl_str); this.orig_w = orig_w; this.orig_h = orig_h; + this.redirect_bry = redirect_str == null ? null : Bry_.new_utf8_(redirect_str); + this.ext = Xof_ext_.new_by_ttl_(ttl_bry).Id(); + return this; + } + public Xof_orig_regy_itm Make() { + Xof_orig_regy_itm rv = new Xof_orig_regy_itm(ttl_bry, Xof_wiki_orig_wkr_.Tid_null, repo.Tid(), orig_w, orig_h, ext, redirect_bry); + this.Reset(); + return rv; + } +} +class Xof_fsdb_mkr { + private byte[] repo_comm, repo_wiki, repo; + private boolean file_is_orig; + private byte[] ttl_bry; private byte lnki_type; private Xof_ext ext; private byte[] md5; private int file_w, file_h; + private double upright, thumbtime; private int page; + public Xof_fsdb_mkr() {this.Reset();} + public void Setup_repos(byte[] repo_comm, byte[] repo_wiki) {this.repo_comm = repo_comm; this.repo_wiki = repo_wiki;} + private void Reset() { + upright = Xop_lnki_tkn.Upright_null; + thumbtime = Xof_doc_thumb.Null; + page = Xof_doc_page.Null; + } + public Xof_fsdb_mkr Init_comm_thum(String ttl_str, int file_w, int file_h) {return Init(Bool_.Y, Bool_.N, ttl_str, file_w, file_h);} + public Xof_fsdb_mkr Init_comm_orig(String ttl_str, int file_w, int file_h) {return Init(Bool_.Y, Bool_.Y, ttl_str, file_w, file_h);} + public Xof_fsdb_mkr Init(boolean repo_is_commons, boolean file_is_orig, String ttl_str, int file_w, int file_h) { + this.file_is_orig = file_is_orig; this.lnki_type = file_is_orig ? Xop_lnki_type.Id_none : Xop_lnki_type.Id_thumb; + this.repo = repo_is_commons ? repo_comm : repo_wiki; + this.ttl_bry = Bry_.new_utf8_(ttl_str); this.ext = Xof_ext_.new_by_ttl_(ttl_bry); this.md5 = Xof_xfer_itm_.Md5_(ttl_bry); + this.file_w = file_w; this.file_h = file_h; + return this; + } + public Xof_fsdb_itm Make() { + Xof_fsdb_itm rv = new Xof_fsdb_itm(); + rv.Init_by_lnki(ttl_bry, ext, md5, lnki_type, file_w, file_h, Xof_patch_upright_tid_.Tid_all, upright, thumbtime, page); + rv.Orig_wiki_(repo); + rv.File_is_orig_(file_is_orig); + this.Reset(); + return rv; + } +} +class Xou_cache_mgr_itm_mkr { + private byte[] dir; private byte[] ttl; private boolean is_orig; private int w; private double time; private int page; + public Xou_cache_mgr_itm_mkr() {this.Reset();} + private void Reset() { + this.time = Xof_doc_thumb.Null; + this.page = Xof_doc_page.Null; + } + public Xou_cache_mgr_itm_mkr Init(String dir_str, String ttl_str, boolean is_orig, int w) { + this.dir = Bry_.new_utf8_(dir_str); + this.ttl = Bry_.new_utf8_(ttl_str); + this.is_orig = is_orig; + this.w = w; + return this; + } + public Xou_cache_fil Make() { + Xou_cache_fil rv = new Xou_cache_fil(1, 1, dir, ttl, Xof_ext_.new_by_ttl_(ttl).Id(), is_orig, w, 200, time, page, 1, 0); + this.Reset(); + return rv; + } +} +class Xof_orig_mgr__test implements Xof_orig_mgr { + private Hash_adp_bry hash = Hash_adp_bry.cs_(); + public void Add(Xof_orig_regy_itm itm) { + hash.Add_bry_obj(itm.Ttl(), itm); + } + public void Clear() {hash.Clear();} + public Xof_orig_regy_itm Get_by_ttl(byte[] ttl) {return (Xof_orig_regy_itm)hash.Get_by_bry(ttl);} +} +class Xou_cache_mgr__test implements Xou_cache_mgr { + private Hash_adp_bry hash = Hash_adp_bry.cs_(); private Bry_bfr tmp_bfr = Bry_bfr.reset_(255); + public void Clear() {hash.Clear();} + public Xou_cache_fil Fil__get_or_null(byte[] dir_name, byte[] fil_name, boolean doc_is_orig, int doc_w, double doc_time, int doc_page) { + byte[] key = Xou_cache_fil.Key_bld(tmp_bfr, dir_name, fil_name, doc_is_orig, doc_w, doc_time, doc_page); + return (Xou_cache_fil)hash.Get_by_bry(key); + } + public void Dir__clear() {} + public void Dir__add(Xou_cache_dir dir) {} + public byte[] Dir__get_by_id(int id) {return null;} + public void Fil__update(Xou_cache_fil fil) { + byte[] key = fil.Key(tmp_bfr); + hash.AddReplace(key, fil); + } +} +class Xof_fsdb_mgr__test implements Xof_fsdb_mgr { + private Hash_adp_bry hash = Hash_adp_bry.cs_(); + private Bry_bfr tmp_bfr = Bry_bfr.reset_(255); + private int download_count; + public Xof_fsdb_mgr__test() {this.Clear();} + public int Download_count() {return download_count;} + public void Add(Xof_fsdb_itm itm) { + byte[] key = Xof_fsdb_itm.Bld_key_to_bry(tmp_bfr, itm.Orig_wiki(), itm.Lnki_ttl(), itm.File_is_orig(), itm.Lnki_w(), itm.Lnki_thumbtime(), itm.Lnki_page()); +// Tfds.Write("add:" + String_.new_utf8_(key)); + hash.Add(key, itm); + } + public void Clear() { + download_count = 0; + Io_mgr._.InitEngine_mem(); + hash.Clear(); + } + public boolean Download(Xofv_file_itm itm) { + byte[] key = Xof_fsdb_itm.Bld_key_to_bry(tmp_bfr, itm.File_repo(), itm.File_ttl(), itm.Lnki_is_orig(), itm.Html_w(), itm.Lnki_time(), itm.Lnki_page()); +// Tfds.Write("down:" + String_.new_utf8_(key)); + if (!hash.Has(key)) { + return false; + } + Io_mgr._.SaveFilStr(itm.File_url(), ""); + ++download_count; + return true; + } +} +class Xog_html_gui__test implements Xog_html_gui { + private HashAdp hash = HashAdp_.new_(); + public void Clear() {hash.Clear();} + public Xog_html_rsc Get_by_id(int v) {return (Xog_html_rsc)hash.Fetch(Int_obj_ref.new_(v));} + public void Update(int id, String src, int w, int h) { + Xog_html_rsc rsc = new Xog_html_rsc(id, src, w, h); + hash.Add(Int_obj_ref.new_(id), rsc); + } +} +class Xog_html_rsc { + public Xog_html_rsc(int uid, String src, int html_w, int html_h) {this.uid = uid; this.src = src; this.html_w = html_w; this.html_h = html_h;} + public int Uid() {return uid;} private final int uid; + public String Src() {return src;} private final String src; + public int Html_w() {return html_w;} private final int html_w; + public int Html_h() {return html_h;} private final int html_h; +} diff --git a/400_xowa/src/gplx/xowa2/files/Xofv_repo_itm.java b/400_xowa/src/gplx/xowa2/files/Xofv_repo_itm.java new file mode 100644 index 000000000..600d3ec60 --- /dev/null +++ b/400_xowa/src/gplx/xowa2/files/Xofv_repo_itm.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.xowa2.files; import gplx.*; import gplx.xowa2.*; +public class Xofv_repo_itm { + Xofv_repo_itm(byte tid, byte[] key, byte dir_spr, byte[] dir_root, byte[] dir_sub_orig, byte[] dir_sub_thumb) { + this.tid = tid; this.key = key; this.dir_spr = dir_spr; this.dir_root = dir_root; this.dir_sub_orig = dir_sub_orig; this.dir_sub_thumb = dir_sub_thumb; + } + public byte Tid() {return tid;} private final byte tid; + public byte[] Key() {return key;} private final byte[] key; + public byte Dir_spr() {return dir_spr;} private final byte dir_spr; + public byte[] Dir_root() {return dir_root;} private final byte[] dir_root; + public byte[] Dir_sub_orig() {return dir_sub_orig;} private final byte[] dir_sub_orig; + public byte[] Dir_sub_thumb() {return dir_sub_thumb;} private final byte[] dir_sub_thumb; + public static Xofv_repo_itm new_trg_fsys(byte tid, byte[] key, Io_url root) { + return new Xofv_repo_itm(tid, key, root.Info().DirSpr_byte(), Bry_.new_utf8_(root.Raw()), Dir_sub_orig_dflt, Dir_sub_thumb_dflt); + } + public static final byte Tid_val_comm = 0, Tid_val_wiki = 1; + private static final byte[] Dir_sub_orig_dflt = Bry_.new_ascii_("orig"), Dir_sub_thumb_dflt = Bry_.new_ascii_("thumb"); + public static final int Id_temp = 0; +} diff --git a/400_xowa/src/gplx/xowa2/files/Xofv_repo_mgr.java b/400_xowa/src/gplx/xowa2/files/Xofv_repo_mgr.java new file mode 100644 index 000000000..974db2452 --- /dev/null +++ b/400_xowa/src/gplx/xowa2/files/Xofv_repo_mgr.java @@ -0,0 +1,33 @@ +/* +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.xowa2.files; import gplx.*; import gplx.xowa2.*; +public class Xofv_repo_mgr { + private final Hash_adp_bry key_regy = Hash_adp_bry.cs_(); + private final HashAdp tid_regy = HashAdp_.new_(); private final Byte_obj_ref tid_key = Byte_obj_ref.zero_(); + public Xofv_repo_mgr Add(Xofv_repo_itm itm) { + key_regy.Add(itm.Key(), itm); + tid_regy.Add(Byte_obj_ref.new_(itm.Tid()), itm); + return this; + } + public Xofv_repo_itm Get_by_key(byte[] key) { + return (Xofv_repo_itm)key_regy.Fetch(key); + } + public Xofv_repo_itm Get_by_tid(byte tid) { + return (Xofv_repo_itm)tid_regy.Fetch(tid_key.Val_(tid)); + } +} \ No newline at end of file diff --git a/400_xowa/src/gplx/xowa2/files/Xou_cache_dir.java b/400_xowa/src/gplx/xowa2/files/Xou_cache_dir.java new file mode 100644 index 000000000..470667358 --- /dev/null +++ b/400_xowa/src/gplx/xowa2/files/Xou_cache_dir.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.xowa2.files; import gplx.*; import gplx.xowa2.*; +import gplx.xowa.files.*; +public class Xou_cache_dir { + public Xou_cache_dir(int dir_id, byte[] dir_name) { + this.dir_id = dir_id; this.dir_name = dir_name; + } + public int Dir_id() {return dir_id;} private final int dir_id; + public byte[] Dir_name() {return dir_name;} private final byte[] dir_name; + public byte Cmd_mode() {return cmd_mode;} public void Cmd_mode_(byte v) {cmd_mode = v;} private byte cmd_mode = gplx.dbs.Db_cmd_mode.Ignore; +} diff --git a/400_xowa/src/gplx/xowa2/files/Xou_cache_dir_tbl.java b/400_xowa/src/gplx/xowa2/files/Xou_cache_dir_tbl.java new file mode 100644 index 000000000..d1cafc56f --- /dev/null +++ b/400_xowa/src/gplx/xowa2/files/Xou_cache_dir_tbl.java @@ -0,0 +1,72 @@ +/* +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.xowa2.files; import gplx.*; import gplx.xowa2.*; +import gplx.dbs.*; import gplx.xowa.files.*; +class Xou_cache_dir_tbl { + private Db_conn conn; private Db_stmt_bldr stmt_bldr; + public void Init(Db_conn conn) {this.conn = conn;} + public void Select_all(Xou_cache_mgr cache_mgr) { + Db_stmt stmt = Db_stmt_.new_select_as_rdr(conn, Db_qry__select_in_tbl.new_(Tbl_name, String_.Ary_empty, Flds_all)); + Db_rdr rdr = Db_rdr_.Null; + try { + rdr = stmt.Clear().Exec_select_as_rdr(); + while (rdr.Move_next()) { + Xou_cache_dir dir = Make(rdr); + cache_mgr.Dir__add(dir); + } + } + catch (Exception e) {stmt = null; throw Db_stmt_.err_(e, Tbl_name, "Select_by_key");} + finally {rdr.Rls();} + } + public String Commit(Xou_cache_dir itm) { + try { + if (stmt_bldr == null) stmt_bldr = new Db_stmt_bldr(Tbl_name, String_.Ary(Fld_dir_id), Fld_dir_name).Init(conn); + Db_stmt stmt = stmt_bldr.Get(itm.Cmd_mode()); + switch (itm.Cmd_mode()) { + case Db_cmd_mode.Create: stmt.Clear().Val_int(itm.Dir_id()); Commit_stmt_args(stmt, itm); stmt.Exec_insert(); break; + case Db_cmd_mode.Update: stmt.Clear(); Commit_stmt_args(stmt, itm); stmt.Val_int(itm.Dir_id()).Exec_update(); break; + case Db_cmd_mode.Delete: stmt.Clear().Val_int(itm.Dir_id()); stmt.Exec_delete(); break; + case Db_cmd_mode.Ignore: break; + default: throw Err_.unhandled(itm.Cmd_mode()); + } + itm.Cmd_mode_(Db_cmd_mode.Ignore); + return null; + } catch (Exception e) { + stmt_bldr = null; // null out bldr, else bad stmt will lead to other failures + return Err_.Message_gplx_brief(e); + } + } + private void Commit_stmt_args(Db_stmt stmt, Xou_cache_dir itm) { + stmt.Val_bry_as_str(itm.Dir_name()); + } + private Xou_cache_dir Make(Db_rdr rdr) { + return new Xou_cache_dir + ( rdr.Read_int(Ord_dir_id) + , rdr.Read_bry_by_str(Ord_dir_name) + ); + } +// private static final String Tbl_sql = String_.Concat_lines_nl +// ( "CREATE TABLE user_cache_dir" +// , "( dir_id integer NOT NULL PRIMARY KEY AUTOINCREMENT" +// , ", dir_name varchar(255) NOT NULL" +// , ");" +// ); + public static final String Tbl_name = "user_cache_dir", Fld_dir_id = "dir_id", Fld_dir_name = "fil_name"; + private static final String[] Flds_all = new String[] {Fld_dir_id, Fld_dir_name}; + private static final int Ord_dir_id = 0, Ord_dir_name = 1; +} diff --git a/400_xowa/src/gplx/xowa2/files/Xou_cache_fil.java b/400_xowa/src/gplx/xowa2/files/Xou_cache_fil.java new file mode 100644 index 000000000..9918e8118 --- /dev/null +++ b/400_xowa/src/gplx/xowa2/files/Xou_cache_fil.java @@ -0,0 +1,52 @@ +/* +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.xowa2.files; import gplx.*; import gplx.xowa2.*; +import gplx.xowa.files.*; +public class Xou_cache_fil { + public Xou_cache_fil(int uid, int dir_id, byte[] dir_name, byte[] fil_name, int fil_ext, boolean fil_is_orig, int fil_w, int fil_h, double fil_time, int fil_page, long fil_size, long fil_view_time) { + this.uid = uid; + this.dir_id = dir_id; this.dir_name = dir_name; + this.fil_name = fil_name; this.fil_ext = fil_ext; this.fil_is_orig = fil_is_orig; + this.fil_w = fil_w; this.fil_h = fil_h; this.fil_time = fil_time; this.fil_page = fil_page; + this.fil_size = fil_size; this.fil_view_time = fil_view_time; + } + public int Dir_id() {return dir_id;} private final int dir_id; + public byte[] Dir_name() {return dir_name;} private final byte[] dir_name; + public byte[] Fil_name() {return fil_name;} private final byte[] fil_name; + public int Fil_ext() {return fil_ext;} private final int fil_ext; + public boolean Fil_is_orig() {return fil_is_orig;} private final boolean fil_is_orig; + public int Fil_w() {return fil_w;} private final int fil_w; + public int Fil_h() {return fil_h;} private final int fil_h; + public double Fil_time() {return fil_time;} private final double fil_time; + public int Fil_page() {return fil_page;} private final int fil_page; + public long Fil_size() {return fil_size;} private final long fil_size; + public long Fil_view_time() {return fil_view_time;} public void Fil_view_time_(long v) {fil_view_time = v;} private long fil_view_time; + public int Uid() {return uid;} public void Uid_(int v) {uid = v;} private int uid; + public byte Cmd_mode() {return cmd_mode;} public void Cmd_mode_(byte v) {cmd_mode = v;} private byte cmd_mode = gplx.dbs.Db_cmd_mode.Ignore; + public byte[] Key(Bry_bfr bfr) {return Key_bld(bfr, dir_name, fil_name, fil_is_orig, fil_w, fil_time, fil_page);} + public static byte[] Key_bld(Bry_bfr bfr, byte[] dir_name, byte[] fil_name, boolean fil_is_orig, int fil_w, double fil_time, int fil_page) { + bfr .Add(dir_name).Add_byte_pipe() + .Add(fil_name).Add_byte_pipe() + .Add_yn(fil_is_orig).Add_byte_pipe() + .Add_int_variable(fil_w).Add_byte_pipe() + .Add_double(Xof_doc_thumb.Db_save_double(fil_time)) + .Add_int_variable(Xof_doc_page.Db_save_int(fil_page)) + ; + return bfr.Xto_bry_and_clear(); + } +} diff --git a/400_xowa/src/gplx/xowa2/files/Xou_cache_fil_tbl.java b/400_xowa/src/gplx/xowa2/files/Xou_cache_fil_tbl.java new file mode 100644 index 000000000..82999a444 --- /dev/null +++ b/400_xowa/src/gplx/xowa2/files/Xou_cache_fil_tbl.java @@ -0,0 +1,117 @@ +/* +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.xowa2.files; import gplx.*; import gplx.xowa2.*; +import gplx.dbs.*; import gplx.xowa.files.*; +class Xou_cache_fil_tbl { + private Db_conn conn; private Db_stmt_bldr stmt_bldr; + public void Init(Db_conn conn) {this.conn = conn;} + public Xou_cache_fil Select_by_key(Xou_cache_mgr cache_mgr, int dir_id, byte[] fil_name, boolean fil_is_orig, int fil_w, double fil_time, int fil_page) { + String[] flds_where = String_.Ary(Fld_dir_id, Fld_fil_name, Fld_fil_is_orig, Fld_fil_w, Fld_fil_time, Fld_fil_page); + Db_stmt stmt = Db_stmt_.new_select_as_rdr(conn, Db_qry__select_in_tbl.new_(Tbl_name, flds_where, Flds_all)); + Db_rdr rdr = Db_rdr_.Null; + try { + rdr = stmt.Clear() + .Val_int(dir_id) + .Val_bry_as_str(fil_name) + .Val_bool_as_byte(fil_is_orig) + .Val_int(fil_w) + .Val_int(Xof_doc_thumb.Db_save_int(fil_time)) + .Val_int(Xof_doc_page.Db_save_int(fil_page)) + .Exec_select_as_rdr() + ; + return rdr.Move_next() ? Make(cache_mgr, rdr) : null; + } + catch (Exception e) {stmt = null; throw Db_stmt_.err_(e, Tbl_name, "Select_by_key");} + finally {rdr.Rls();} + } + public String Commit(Xou_cache_fil itm) { + try { + if (stmt_bldr == null) stmt_bldr = new Db_stmt_bldr(Tbl_name, String_.Ary(Fld_uid), Fld_dir_id, Fld_fil_name, Fld_fil_ext, Fld_fil_is_orig, Fld_fil_w, Fld_fil_h, Fld_fil_time, Fld_fil_page, Fld_fil_size, Fld_fil_view_time).Init(conn); + Db_stmt stmt = stmt_bldr.Get(itm.Cmd_mode()); + switch (itm.Cmd_mode()) { + case Db_cmd_mode.Create: stmt.Clear().Val_int(itm.Uid()); Commit_stmt_args(stmt, itm); stmt.Exec_insert(); break; + case Db_cmd_mode.Update: stmt.Clear(); Commit_stmt_args(stmt, itm); stmt.Val_int(itm.Uid()).Exec_update(); break; + case Db_cmd_mode.Delete: stmt.Clear().Val_int(itm.Uid()); stmt.Exec_delete(); break; + case Db_cmd_mode.Ignore: break; + default: throw Err_.unhandled(itm.Cmd_mode()); + } + itm.Cmd_mode_(Db_cmd_mode.Ignore); + return null; + } catch (Exception e) { + stmt_bldr = null; // null out bldr, else bad stmt will lead to other failures + return Err_.Message_gplx_brief(e); + } + } + private void Commit_stmt_args(Db_stmt stmt, Xou_cache_fil itm) { + stmt.Val_int(itm.Dir_id()) + .Val_bry_as_str(itm.Fil_name()) + .Val_int(itm.Fil_ext()) + .Val_bool_as_byte(itm.Fil_is_orig()) + .Val_int(itm.Fil_w()) + .Val_int(itm.Fil_h()) + .Val_int(Xof_doc_thumb.Db_save_int(itm.Fil_time())) + .Val_int(Xof_doc_page.Db_save_int(itm.Fil_page())) + .Val_long(itm.Fil_size()) + .Val_long(itm.Fil_view_time()) + ; + } + private Xou_cache_fil Make(Xou_cache_mgr cache_mgr, Db_rdr rdr) { + int dir_id = rdr.Read_int(Ord_dir_id); + return new Xou_cache_fil + ( rdr.Read_int(Ord_uid) + , dir_id + , cache_mgr.Dir__get_by_id(dir_id) + , rdr.Read_bry_by_str(Ord_fil_name) + , rdr.Read_int(Ord_fil_ext) + , rdr.Read_bool_by_byte(Ord_fil_is_orig) + , rdr.Read_int(Ord_fil_w) + , rdr.Read_int(Ord_fil_h) + , Xof_doc_thumb.Db_load_int(rdr, Ord_fil_time) + , Xof_doc_page.Db_load_int(rdr, Ord_fil_page) + , rdr.Read_long(Ord_fil_size) + , rdr.Read_long(Ord_fil_view_time) + ); + } +// private static final String Tbl_sql = String_.Concat_lines_nl +// ( "CREATE TABLE user_cache_fil" +// , "( uid integer NOT NULL PRIMARY KEY AUTOINCREMENT" +// , ", dir_id integer NOT NULL" +// , ", fil_name varchar(255) NOT NULL" +// , ", fil_ext integer NOT NULL" +// , ", fil_is_orig tinyint NOT NULL" +// , ", fil_w integer NOT NULL" +// , ", fil_h integer NOT NULL" +// , ", fil_time integer NOT NULL" +// , ", fil_page integer NOT NULL" +// , ", fil_size bigint NOT NULL" +// , ", fil_view_time bigint NOT NULL" +// , ");" +// ); +// private static final Db_idx_itm +// Idx_key = Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS user_cache_fil__key ON user_cache_fil (dir_id, file_name, fil_is_orig, fil_w, fil_time, fil_page);") +// ; + public static final String Tbl_name = "user_cache_fil" + , Fld_uid = "uid", Fld_dir_id = "dir_id", Fld_fil_name = "fil_name", Fld_fil_ext = "fil_ext", Fld_fil_is_orig = "fil_is_orig" + , Fld_fil_w = "fil_w", Fld_fil_h = "fil_h", Fld_fil_time = "fil_time", Fld_fil_page = "fil_page" + , Fld_fil_size = "fil_size", Fld_fil_view_time = "fil_view_time" + ; + private static final String[] Flds_all = new String[] {Fld_uid, Fld_dir_id, Fld_fil_name, Fld_fil_ext, Fld_fil_is_orig, Fld_fil_w, Fld_fil_h, Fld_fil_time, Fld_fil_page, Fld_fil_size, Fld_fil_view_time}; + private static final int Ord_uid = 0, Ord_dir_id = 1, Ord_fil_name = 2, Ord_fil_ext = 3, Ord_fil_is_orig = 4, Ord_fil_w = 5, Ord_fil_h = 5 + , Ord_fil_time = 6, Ord_fil_page = 7, Ord_fil_size = 9, Ord_fil_view_time = 10 + ; +} diff --git a/400_xowa/src/gplx/xowa2/files/Xou_cache_mgr.java b/400_xowa/src/gplx/xowa2/files/Xou_cache_mgr.java new file mode 100644 index 000000000..1dcc306ed --- /dev/null +++ b/400_xowa/src/gplx/xowa2/files/Xou_cache_mgr.java @@ -0,0 +1,75 @@ +/* +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.xowa2.files; import gplx.*; import gplx.xowa2.*; +import gplx.dbs.*; import gplx.xowa.files.fsdb.caches.*; +public interface Xou_cache_mgr { + Xou_cache_fil Fil__get_or_null(byte[] dir_name, byte[] fil_name, boolean fil_is_orig, int fil_w, double fil_time, int fil_page); + void Fil__update(Xou_cache_fil fil); + void Dir__clear(); + void Dir__add(Xou_cache_dir dir); + byte[] Dir__get_by_id(int id); +} +class Xou_cache_mgr__basic implements Xou_cache_mgr { + private final HashAdp dir_id_regy = HashAdp_.new_(); private final Int_obj_ref dir_id_regy_key = Int_obj_ref.neg1_(); + private final Hash_adp_bry dir_name_regy = Hash_adp_bry.cs_(); + private final OrderedHash fil_regy = OrderedHash_.new_bry_(); + private final Xou_cache_fil_tbl fil_tbl = new Xou_cache_fil_tbl(); + private final Xou_cache_dir_tbl dir_tbl = new Xou_cache_dir_tbl(); + private final Bry_bfr tmp_bfr = Bry_bfr.reset_(255); + public void Init() { + dir_tbl.Select_all(this); + } + public void Dir__clear() {dir_id_regy.Clear();} + public void Dir__add(Xou_cache_dir dir) { + dir_id_regy.Add(Int_obj_ref.new_(dir.Dir_id()), dir); + dir_name_regy.Add(dir.Dir_name(), dir); + } + public byte[] Dir__get_by_id(int id) { + Xou_cache_dir rv = (Xou_cache_dir)dir_id_regy.Fetch(dir_id_regy_key.Val_(id)); + return rv == null ? null : rv.Dir_name(); + } + public int Dir__get_by_name(byte[] name) { + Xou_cache_dir rv = (Xou_cache_dir)dir_name_regy.Get_by_bry(name); + return rv == null ? -1 : rv.Dir_id(); + } + public void Fil__update(Xou_cache_fil fil) { + if (fil.Cmd_mode() == Db_cmd_mode.Create) { + byte[] key = fil.Key(tmp_bfr); + fil_regy.Add(key, fil); // add to cache + } + fil_tbl.Commit(fil); + byte[] dir_name = fil.Dir_name(); + if (Dir__get_by_name(dir_name) == -1) { // not in dir_cache + Xou_cache_dir dir = new Xou_cache_dir(Fixme, dir_name); + this.Dir__add(dir); + dir_tbl.Commit(dir); + } + } + public Xou_cache_fil Fil__get_or_null(byte[] dir_name, byte[] fil_name, boolean fil_is_orig, int fil_w, double fil_time, int fil_page) { + byte[] key = Xou_cache_fil.Key_bld(tmp_bfr, dir_name, fil_name, fil_is_orig, fil_w, fil_time, fil_page); + Xou_cache_fil rv = (Xou_cache_fil)fil_regy.Fetch(key); + if (rv == null) { // not in mem + int dir_id = Dir__get_by_name(dir_name); + rv = fil_tbl.Select_by_key(this, dir_id, fil_name, fil_is_orig, fil_w, fil_time, fil_page); + if (rv != null) // found in db + fil_regy.Add(key, rv); // add to cache + } + return rv; + } + public static final int Fixme = -1; +} diff --git a/400_xowa/src/gplx/xowa2/files/commons/Xof_commons_image_itm.java b/400_xowa/src/gplx/xowa2/files/commons/Xof_commons_image_itm.java new file mode 100644 index 000000000..98e866f74 --- /dev/null +++ b/400_xowa/src/gplx/xowa2/files/commons/Xof_commons_image_itm.java @@ -0,0 +1,32 @@ +/* +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.xowa2.files.commons; import gplx.*; import gplx.xowa2.*; import gplx.xowa2.files.*; +public class Xof_commons_image_itm { + public Xof_commons_image_itm(String name, String media_type, String minor_mime, int size, int width, int height, int bits, int ext_id, String timestamp) { + this.name = name; this.media_type = media_type; this.minor_mime = minor_mime; this.size = size; this.width = width; this.height = height; this.bits = bits; this.ext_id = ext_id; this.timestamp = timestamp; + } + public String Name() {return name;} private final String name; + public String Media_type() {return media_type;} private final String media_type; + public String Minor_mime() {return minor_mime;} private final String minor_mime; + public int Size() {return size;} private final int size; + public int Width() {return width;} private final int width; + public int Height() {return height;} private final int height; + public int Bits() {return bits;} private final int bits; + public int Ext_id() {return ext_id;} private final int ext_id; + public String Timestamp() {return timestamp;} private final String timestamp; +} diff --git a/400_xowa/src/gplx/xowa2/files/commons/Xof_commons_image_tbl.java b/400_xowa/src/gplx/xowa2/files/commons/Xof_commons_image_tbl.java new file mode 100644 index 000000000..1aa5e9e7c --- /dev/null +++ b/400_xowa/src/gplx/xowa2/files/commons/Xof_commons_image_tbl.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.xowa2.files.commons; import gplx.*; import gplx.xowa2.*; import gplx.xowa2.files.*; +import gplx.dbs.*; +public class Xof_commons_image_tbl implements Db_conn_itm { + private Db_stmt stmt_insert, stmt_select_itm; + public Db_conn Conn() {return conn;} public void Conn_(Db_conn v) {conn = Db_conn_.Reg_itm(this, conn, v);} private Db_conn conn; + public void Conn_term() { + stmt_insert = Db_stmt_.Rls(stmt_insert); + stmt_select_itm = Db_stmt_.Rls(stmt_select_itm); + } + public void Insert(String ttl, String media_type, String minor_mime, int size, int w, int h, int bits, int ext_id, String img_timestamp) { + if (stmt_insert == null) stmt_insert = conn.New_stmt_insert(Tbl_name, Flds.Xto_str_ary()); + stmt_insert.Clear() + .Val_str(ttl).Val_str(media_type).Val_str(minor_mime) + .Val_int(size).Val_int(w).Val_int(h).Val_int(bits).Val_int(ext_id).Val_str(img_timestamp) + .Exec_insert(); + } + public Xof_commons_image_itm Select(byte[] ttl) { + Db_stmt stmt = conn.New_stmt_select_all_where(Tbl_name, Flds.Xto_str_ary(), Fld_img_name); + Db_rdr rdr = Db_rdr_.Null; + try { + rdr = stmt.Clear().Val_bry_as_str(ttl).Exec_select_as_rdr(); + if (!rdr.Move_next()) return null; + return new Xof_commons_image_itm + ( rdr.Read_str(Fld_img_name) + , rdr.Read_str(Fld_img_media_type) + , rdr.Read_str(Fld_img_minor_mime) + , rdr.Read_int(Fld_img_size) + , rdr.Read_int(Fld_img_width) + , rdr.Read_int(Fld_img_height) + , rdr.Read_int(Fld_img_bits) + , rdr.Read_int(Fld_img_ext_id) + , rdr.Read_str(Fld_img_timestamp) + ); + } 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 + 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')" + , Fld_img_minor_mime = Flds.Add_str("img_minor_mime", 255) // DEFAULT 'unknown'" + , Fld_img_size = Flds.Add_int("img_size") // int(8) unsigned + , Fld_img_width = Flds.Add_int("img_width") // int(5) + , Fld_img_height = Flds.Add_int("img_height") // int(5) + , Fld_img_bits = Flds.Add_short("img_bits") // int(3) + , 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.Xto_fld_ary() + , Db_meta_idx.new_normal(Tbl_name, "name", Fld_img_name, Fld_img_timestamp) + ); + } +} diff --git a/400_xowa/src/gplx/xowa2/files/metas/Xof_file_meta_itm.java b/400_xowa/src/gplx/xowa2/files/metas/Xof_file_meta_itm.java new file mode 100644 index 000000000..a2af4cf00 --- /dev/null +++ b/400_xowa/src/gplx/xowa2/files/metas/Xof_file_meta_itm.java @@ -0,0 +1,25 @@ +/* +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.xowa2.files.metas; import gplx.*; import gplx.xowa2.*; import gplx.xowa2.files.*; +public class Xof_file_meta_itm { + public Xof_file_meta_itm(boolean repo_is_commons, byte[] ttl, int w, int h) {this.repo_is_commons = repo_is_commons; this.ttl = ttl; this.w = w; this.h = h;} + public boolean Repo_is_commons() {return repo_is_commons;} private final boolean repo_is_commons; + public byte[] Ttl() {return ttl;} private final byte[] ttl; + public int W() {return w;} private final int w; + public int H() {return h;} private final int h; +} diff --git a/400_xowa/src/gplx/xowa2/files/metas/Xof_file_meta_wkr.java b/400_xowa/src/gplx/xowa2/files/metas/Xof_file_meta_wkr.java new file mode 100644 index 000000000..881da0e8c --- /dev/null +++ b/400_xowa/src/gplx/xowa2/files/metas/Xof_file_meta_wkr.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.xowa2.files.metas; import gplx.*; import gplx.xowa2.*; import gplx.xowa2.files.*; +public interface Xof_file_meta_wkr { + Xof_file_meta_itm Get_or_null(byte[] ttl); +} diff --git a/400_xowa/src/gplx/xowa2/files/metas/Xof_file_meta_wkr__db_image.java b/400_xowa/src/gplx/xowa2/files/metas/Xof_file_meta_wkr__db_image.java new file mode 100644 index 000000000..c2df65d89 --- /dev/null +++ b/400_xowa/src/gplx/xowa2/files/metas/Xof_file_meta_wkr__db_image.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.xowa2.files.metas; import gplx.*; import gplx.xowa2.*; import gplx.xowa2.files.*; +import gplx.dbs.*; import gplx.xowa.files.wiki_orig.*; +import gplx.xowa2.files.commons.*; +public class Xof_file_meta_wkr__db_image implements Xof_file_meta_wkr { + private final Xof_commons_image_tbl tbl_wiki = new Xof_commons_image_tbl(), tbl_comm = new Xof_commons_image_tbl(); + public Xof_file_meta_wkr__db_image(Db_conn conn_wiki, Db_conn conn_comm) { + tbl_wiki.Conn_(conn_wiki); + tbl_comm.Conn_(conn_comm); + } + public Xof_file_meta_itm Get_or_null(byte[] ttl) { + Xof_commons_image_itm itm = tbl_wiki.Select(ttl); + boolean repo_is_commons = false; + if (itm == null) { + itm = tbl_comm.Select(ttl); + if (itm == null) return null; + repo_is_commons = true; + } + return new Xof_file_meta_itm(repo_is_commons, ttl, itm.Width(), itm.Height()); + } +} diff --git a/400_xowa/src/gplx/xowa2/files/metas/Xof_file_meta_wkr__db_orig.java b/400_xowa/src/gplx/xowa2/files/metas/Xof_file_meta_wkr__db_orig.java new file mode 100644 index 000000000..cadb2bffb --- /dev/null +++ b/400_xowa/src/gplx/xowa2/files/metas/Xof_file_meta_wkr__db_orig.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.xowa2.files.metas; import gplx.*; import gplx.xowa2.*; import gplx.xowa2.files.*; +import gplx.dbs.*; +import gplx.xowa.*; import gplx.xowa.files.wiki_orig.*; +public class Xof_file_meta_wkr__db_orig implements Xof_file_meta_wkr { + public Xof_orig_regy_tbl Tbl() {return tbl;} private final Xof_orig_regy_tbl tbl = new Xof_orig_regy_tbl(); + public Xof_file_meta_itm Get_or_null(byte[] ttl) { + Xof_orig_regy_itm itm = tbl.Select_itm(ttl); + if (itm == null) return null; + return new Xof_file_meta_itm(itm.Repo_tid() == Xof_repo_itm.Repo_remote, ttl, itm.Orig_w(), itm.Orig_h()); + } +} diff --git a/400_xowa/src/gplx/xowa2/gui/Xog_page.java b/400_xowa/src/gplx/xowa2/gui/Xog_page.java new file mode 100644 index 000000000..df7493f2a --- /dev/null +++ b/400_xowa/src/gplx/xowa2/gui/Xog_page.java @@ -0,0 +1,68 @@ +/* +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.xowa2.gui; import gplx.*; import gplx.xowa2.*; +import gplx.xowa.*; import gplx.xowa.hdumps.core.*; import gplx.xowa.pages.*; import gplx.xowa.pages.skins.*; +public class Xog_page { + public boolean Exists() {return exists;} public Xog_page Exists_n_() {exists = false; return this;} private boolean exists = true; + public int Page_id() {return page_id;} private int page_id; + public Xoa_url Page_url() {return page_url;} private Xoa_url page_url; + public Xoa_ttl Page_ttl() {return page_ttl;} private Xoa_ttl page_ttl; + public int Version_id() {return version_id;} public void Version_id_(int v) {version_id = v;} private int version_id; + public int Img_count() {return img_count;} public void Img_count_(int v) {img_count = v;} private int img_count; + public Hdump_module_mgr Module_mgr() {return module_mgr;} private Hdump_module_mgr module_mgr = new Hdump_module_mgr(); + public byte[] Html_head_xtn() {return html_head_xtn;} public void Html_head_xtn_(byte[] v) {html_head_xtn = v;} private byte[] html_head_xtn = Bry_.Empty; + public byte[] Page_body() {return page_body;} public void Page_body_(byte[] v) {this.page_body = v;} private byte[] page_body; + public byte[] Display_ttl() {return display_ttl;} public void Display_ttl_(byte[] v) {this.display_ttl = v;} private byte[] display_ttl; + public byte[] Content_sub() {return content_sub;} public void Content_sub_(byte[] v) {this.content_sub = v;} private byte[] content_sub; + public byte[] Sidebar_div() {return sidebar_div;} public void Sidebar_div_(byte[] v) {this.sidebar_div = v;} private byte[] sidebar_div; + public int[] Redlink_uids() {return redlink_uids;} public void Redlink_uids_(int[] v) {redlink_uids = v;} private int[] redlink_uids; + public Hdump_data_img__base[] Img_itms() {return img_itms;} public void Img_itms_(Hdump_data_img__base[] v) {this.img_itms = v;} private Hdump_data_img__base[] img_itms; + public OrderedHash Gly_itms() {return gly_itms;} private OrderedHash gly_itms = OrderedHash_.new_(); + public Xog_page Init(int page_id, Xoa_url page_url, Xoa_ttl page_ttl) { + this.page_id = page_id; this.page_url = page_url; this.page_ttl = page_ttl; + content_sub = sidebar_div = Bry_.Empty; + display_ttl = null; + img_itms = Hdump_data_img__base.Ary_empty; + module_mgr.Clear(); + gly_itms.Clear(); + return this; + } + public void Init(Bry_bfr tmp_bfr, Xoa_page page) { + page_id = page.Revision_data().Id(); + page_body = page.Hdump_data().Body(); + Xopg_html_data html_data = page.Html_data(); + gplx.xowa.html.modules.Xoh_module_mgr mod_mgr = html_data.Module_mgr(); + module_mgr.Init(mod_mgr.Itm_mathjax().Enabled(), mod_mgr.Itm_popups().Bind_hover_area(), mod_mgr.Itm_gallery().Enabled(), mod_mgr.Itm_hiero().Enabled()); + display_ttl = html_data.Display_ttl(); + content_sub = html_data.Content_sub(); + sidebar_div = Save_sidebars(tmp_bfr, page, html_data); + } + private static byte[] Save_sidebars(Bry_bfr tmp_bfr, Xoa_page page, Xopg_html_data html_data) { + Xopg_xtn_skin_mgr mgr = html_data.Xtn_skin_mgr(); + int len = mgr.Count(); + boolean sidebar_exists = false; + for (int i = 0; i < len; ++i) { + Xopg_xtn_skin_itm itm = mgr.Get_at(i); + if (itm.Tid() == Xopg_xtn_skin_itm_tid.Tid_sidebar) { + sidebar_exists = true; + itm.Write(tmp_bfr, page); + } + } + return sidebar_exists ? tmp_bfr.Xto_bry_and_clear() : null; + } +} diff --git a/400_xowa/src/gplx/xowa2/gui/Xogv_tab_base.java b/400_xowa/src/gplx/xowa2/gui/Xogv_tab_base.java new file mode 100644 index 000000000..3f63894fa --- /dev/null +++ b/400_xowa/src/gplx/xowa2/gui/Xogv_tab_base.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.xowa2.gui; import gplx.*; import gplx.xowa2.*; +import gplx.xowa.*; +import gplx.xowa.hdumps.core.*; import gplx.xowa.gui.history.*; +import gplx.xowa2.apps.*; import gplx.xowa2.wikis.*; import gplx.xowa2.gui.*; import gplx.xowa2.apps.urls.*; +public abstract class Xogv_tab_base { + private Xog_history_stack history_stack = new Xog_history_stack(); private Gfo_url_parser url_parser; + private Xoav_wiki_mgr wiki_mgr; + public void Ctor(Xoav_wiki_mgr wiki_mgr, Gfo_url_parser url_parser) {this.wiki_mgr = wiki_mgr; this.url_parser = url_parser;} + public Xog_history_itm Cur_itm() {return history_stack.Cur_itm();} + public Xog_page Go_to(byte[] page) {return Go_to(history_stack.Cur_itm().Wiki(), page, Bry_.Empty, Bry_.Empty, false, "");} + public Xog_page Go_to(byte[] wiki, byte[] page) {return Go_to(wiki, page, Bry_.Empty, Bry_.Empty, false, "");} + public Xog_page Go_to(byte[] wiki, byte[] page, byte[] anch, byte[] qarg, boolean redirect_force, String bmk_pos) { + Xog_history_itm old_itm = this.Cur_itm(); + Xog_history_itm new_itm = new Xog_history_itm(wiki, page, anch, qarg, redirect_force, bmk_pos); + history_stack.Add(new_itm); + return Fetch_page_and_show(old_itm, new_itm); + } + public Xog_page Go_bwd() {return Go_by_dir(Bool_.Y);} + public Xog_page Go_fwd() {return Go_by_dir(Bool_.N);} + private Xog_page Go_by_dir(boolean bwd) { + Xog_history_itm old_itm = this.Cur_itm(); + Xog_history_itm new_itm = bwd ? history_stack.Go_bwd() : history_stack.Go_fwd(); + return Fetch_page_and_show(old_itm, new_itm); + } + private Xog_page Fetch_page_and_show(Xog_history_itm old_itm, Xog_history_itm new_itm) { + if (new_itm == Xog_history_itm.Null) return new Xog_page().Exists_n_(); + Xog_page new_hpg = Fetch_page(new_itm.Wiki(), new_itm.Page(), new_itm.Qarg()); + Show_page(old_itm, new_itm, new_hpg); + return new_hpg; + } + private Xog_page Fetch_page(byte[] wiki_domain, byte[] page_bry, byte[] qarg_bry) { + Xowv_wiki wiki = wiki_mgr.Get_by_domain(wiki_domain).Init_assert(); + 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)); + Xog_page rv = new Xog_page(); + wiki.Pages_get(rv, url, ttl); + return rv; + } + public void Srl_save(Bry_bfr bfr) {history_stack.Srl_save(bfr);} + public void Srl_load(byte[] raw) {history_stack.Srl_load(raw);} + protected abstract void Show_page(Xog_history_itm old_itm, Xog_history_itm new_itm, Xog_page new_hpg); +} diff --git a/400_xowa/src/gplx/xowa2/users/data/Xoud_site_mgr.java b/400_xowa/src/gplx/xowa2/users/data/Xoud_site_mgr.java new file mode 100644 index 000000000..f90baa4d9 --- /dev/null +++ b/400_xowa/src/gplx/xowa2/users/data/Xoud_site_mgr.java @@ -0,0 +1,42 @@ +/* +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.xowa2.users.data; import gplx.*; import gplx.xowa2.*; import gplx.xowa2.users.*; +import gplx.dbs.*; +public class Xoud_site_mgr { + private Xoud_site_tbl regy_tbl = new Xoud_site_tbl(); + public void Init(Db_conn conn) { + regy_tbl.Conn_(conn); + } + public Xoud_site_row[] Get_all() {return regy_tbl.Select_all();} + public void Import(String domain, String name, String path, String xtn) { // insert or update wiki + Xoud_site_row[] ary = regy_tbl.Select_by_domain(domain); + int len = ary.length, update_id = -1, priority = 0; + for (int i = 0; i < len; ++i) { + Xoud_site_row itm = ary[i]; + if (priority <= itm.Priority()) priority = itm.Priority() + 1; + if (String_.Eq(path, itm.Path())) { // same domain and same path; change insert to update; + update_id = itm.Id(); + break; + } + } + if (update_id == -1) + regy_tbl.Insert(priority, domain, name, path, xtn); + else + regy_tbl.Update(update_id, priority, domain, name, path, xtn); + } +} diff --git a/400_xowa/src/gplx/xowa2/users/data/Xoud_site_row.java b/400_xowa/src/gplx/xowa2/users/data/Xoud_site_row.java new file mode 100644 index 000000000..210d22132 --- /dev/null +++ b/400_xowa/src/gplx/xowa2/users/data/Xoud_site_row.java @@ -0,0 +1,29 @@ +/* +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.xowa2.users.data; import gplx.*; import gplx.xowa2.*; import gplx.xowa2.users.*; +public class Xoud_site_row { + public Xoud_site_row(int id, int priority, String domain, String name, String path, String xtn) { + this.id = id; this.priority = priority; this.domain = domain; this.name = name; this.path = path; this.xtn = xtn; + } + public int Id() {return id;} private final int id; + public int Priority() {return priority;} private final int priority; + public String Domain() {return domain;} private final String domain; + public String Name() {return name;} private final String name; + public String Path() {return path;} private final String path; + public String Xtn() {return xtn;} private String xtn; +} diff --git a/400_xowa/src/gplx/xowa2/users/data/Xoud_site_tbl.java b/400_xowa/src/gplx/xowa2/users/data/Xoud_site_tbl.java new file mode 100644 index 000000000..6abddbacc --- /dev/null +++ b/400_xowa/src/gplx/xowa2/users/data/Xoud_site_tbl.java @@ -0,0 +1,93 @@ +/* +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.xowa2.users.data; import gplx.*; import gplx.xowa2.*; import gplx.xowa2.users.*; +import gplx.dbs.*; +public class Xoud_site_tbl { + public Db_conn Conn() {return conn;} public Xoud_site_tbl Conn_(Db_conn v) {this.Rls_all(); conn = v; return this;} private Db_conn conn; + @gplx.Virtual public void Insert(int priority, String domain, String name, String path, String xtn) { + String[] flds = new String[] {Fld_site_priority, Fld_site_domain, Fld_site_name, Fld_site_path, Fld_site_xtn}; + Db_stmt stmt = Db_stmt_.new_insert_(conn, Tbl_name, flds); + try {stmt.Val_int(priority).Val_str(domain).Val_str(name).Val_str(path).Val_str(xtn).Exec_insert();} + catch (Exception exc) {throw Db_stmt_.err_(exc, stmt, "Insert");} + } + @gplx.Virtual public void Update(int id, int priority, String domain, String name, String path, String xtn) { + String[] flds = new String[] {Fld_site_priority, Fld_site_domain, Fld_site_name, Fld_site_path, Fld_site_xtn}; + Db_stmt stmt = Db_stmt_.new_update_(conn, Tbl_name, String_.Ary(Fld_site_id), flds); + try {stmt.Val_int(priority).Val_str(domain).Val_str(name).Val_str(path).Val_str(xtn).Val_int(id).Exec_insert();} + catch (Exception exc) {throw Db_stmt_.err_(exc, stmt, "Update");} + } + @gplx.Virtual public void Delete(int id) { + Db_stmt stmt = Db_stmt_.new_delete_(conn, Tbl_name, Fld_site_id); + try {stmt.Val_int(id).Exec_delete();} + catch (Exception exc) {throw Db_stmt_.err_(exc, stmt, "Delete");} + } + @gplx.Virtual public Xoud_site_row[] Select_all() { + ListAdp rv = ListAdp_.new_(); + Db_stmt stmt = Db_stmt_.new_select_as_rdr(conn, Db_qry__select_in_tbl.new_(Tbl_name, null, Flds__all)); + try { + Db_rdr rdr = stmt.Exec_select_as_rdr(); + while (rdr.Move_next()) { + Xoud_site_row row = Make_row(rdr); + rv.Add(row); + } + rdr.Rls(); + return (Xoud_site_row[])rv.Xto_ary_and_clear(Xoud_site_row.class); + } + catch (Exception exc) {throw Db_stmt_.err_(exc, stmt, "Select_all");} + } + public Xoud_site_row[] Select_by_domain(String domain) { + ListAdp rv = ListAdp_.new_(); + Db_stmt stmt = Db_stmt_.Null; Db_rdr rdr = Db_rdr_.Null; + try { + stmt = Db_stmt_.new_select_as_rdr(conn, Db_qry__select_in_tbl.new_(Tbl_name, String_.Ary(Fld_site_domain), Flds__all)); + rdr = stmt.Val_str(domain).Exec_select_as_rdr(); + while (rdr.Move_next()) { + Xoud_site_row row = Make_row(rdr); + rv.Add(row); + } + rdr.Rls(); + return (Xoud_site_row[])rv.Xto_ary_and_clear(Xoud_site_row.class); + } + catch (Exception exc) {throw Db_stmt_.err_(exc, stmt, "Select_by_domain");} + finally {rdr.Rls(); stmt.Rls();} + } + private Xoud_site_row Make_row(Db_rdr rdr) { + return new Xoud_site_row + ( rdr.Read_int(0) + , rdr.Read_int(1) + , rdr.Read_str(2) + , rdr.Read_str(3) + , rdr.Read_str(4) + , rdr.Read_str(5) + ); + } + public void Rls_all() {conn = null;} + public static final String Tbl_name = "user_site_regy", Fld_site_id = "site_id", Fld_site_priority = "site_priority", Fld_site_domain = "site_domain" + , Fld_site_name = "site_name", Fld_site_path = "site_path", Fld_site_xtn = "site_xtn"; + private static final String[] Flds__all = new String[] {Fld_site_id, Fld_site_priority, Fld_site_domain, Fld_site_name, Fld_site_path, Fld_site_xtn}; + public static final String Tbl_sql = String_.Concat_lines_nl + ( "CREATE TABLE user_site_regy" + , "( site_id integer NOT NULL PRIMARY KEY AUTOINCREMENT" + , ", site_priority integer NOT NULL -- EX: 0=default; 1+ is order if 0 is unavailable" + , ", site_domain nvarchar(255) NOT NULL -- EX: en.wikipedia.org; NOTE: no protocol (https:)" + , ", site_name nvarchar(255) NOT NULL -- EX: English Wikipedia" + , ", site_path nvarchar(255) NOT NULL -- EX: ~{xowa_root}/wiki/en.wikipedia.org/" + , ", site_xtn text NOT NULL" + , ");" + ); +} diff --git a/400_xowa/src/gplx/xowa2/wikis/Xowv_wiki.java b/400_xowa/src/gplx/xowa2/wikis/Xowv_wiki.java new file mode 100644 index 000000000..d60b178a6 --- /dev/null +++ b/400_xowa/src/gplx/xowa2/wikis/Xowv_wiki.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.xowa2.wikis; import gplx.*; import gplx.xowa2.*; +import gplx.xowa.*; import gplx.xowa.wikis.xwikis.*; import gplx.xowa.langs.cases.*; import gplx.xowa.apps.ttls.*; import gplx.xowa.html.hzips.*; +import gplx.xowa.dbs.tbls.*; import gplx.dbs.*; import gplx.xowa.hdumps.*; +import gplx.xowa2.apps.*; import gplx.xowa2.wikis.specials.*; import gplx.xowa2.wikis.data.*; import gplx.xowa2.wikis.data.tbls.*; import gplx.xowa2.gui.*; +public class Xowv_wiki implements Xoa_ttl_parser { + public Xowv_wiki(Xoav_app app, byte[] domain_bry, Io_url wiki_root_dir) { + this.app = app; + this.domain_bry = domain_bry; this.domain_str = String_.new_utf8_(domain_bry); + this.ns_mgr = Xow_ns_mgr_.default_(app.Utl_case_mgr()); // new Xow_ns_mgr(app.Utl_case_mgr()); // FIXME + this.db_mgr = new Xodata_db_mgr(Bool_.Y, domain_str, wiki_root_dir); + this.hdump_mgr = new Xowd_hdump_mgr(app, this); + this.xwiki_mgr = new Xow_xwiki_mgr(); + this.hzip_mgr = new Xow_hzip_mgr(app.Usr_dlg(), this); + this.special_mgr = new Xosp_special_mgr(this); + } + public byte[] Domain_bry() {return domain_bry;} private final byte[] domain_bry; + public String Domain_str() {return domain_str;} private final String domain_str; + public Xow_ns_mgr Ns_mgr() {return ns_mgr;} private final Xow_ns_mgr ns_mgr; + public Xoav_app App() {return app;} private final Xoav_app app; + public Xosp_special_mgr Special_mgr() {return special_mgr;} private Xosp_special_mgr special_mgr; + public Xodata_db_mgr Db_mgr() {return db_mgr;} private final Xodata_db_mgr db_mgr; + public Xowd_hdump_mgr Hdump_mgr() {return hdump_mgr;} private final Xowd_hdump_mgr hdump_mgr; + public Xow_hzip_mgr Hzip_mgr() {return hzip_mgr;} private Xow_hzip_mgr hzip_mgr; + public Xow_xwiki_mgr Xwiki_mgr() {return xwiki_mgr;} private Xow_xwiki_mgr xwiki_mgr; + private boolean init_done = false; + public Xowv_wiki Init_assert() { + if (init_done) return this; + init_done = true; + if (String_.Eq(domain_str, "xowa")) return this; + Db_conn core_conn = Db_conn_pool.I.Get_or_new(db_mgr.Key__core()); + Xodata_ns_regy_tbl ns_tbl = db_mgr.Tbl__ns(); + ns_tbl.Conn_(core_conn); + ns_tbl.Select_all(ns_mgr); + db_mgr.Init_by_conn(core_conn); + return this; + } + public void Pages_get(Xog_page rv, Gfo_url url, Xoa_ttl ttl) { + if (ttl.Ns().Id_special()) + special_mgr.Get_by_ttl(rv, url, ttl); + else + hdump_mgr.Get_by_ttl(rv, url, ttl); + } + public Xoa_ttl Ttl_parse(byte[] ttl) {return Xoa_ttl.parse(app.Utl_bfr_mkr(), app.Utl_amp_mgr(), app.Utl_case_mgr(), xwiki_mgr, ns_mgr, app.Utl_msg_log(), ttl, 0, ttl.length);} + public Xoa_ttl Ttl_parse(int ns_id, byte[] ttl) { + Xow_ns ns = ns_mgr.Ids_get_or_null(ns_id); + byte[] raw = Bry_.Add(ns.Name_db_w_colon(), ttl); + return Xoa_ttl.parse(app.Utl_bfr_mkr(), app.Utl_amp_mgr(), app.Utl_case_mgr(), xwiki_mgr, ns_mgr, app.Utl_msg_log(), raw, 0, raw.length); + } +} diff --git a/400_xowa/src/gplx/xowa2/wikis/data/Xodata_db_mgr.java b/400_xowa/src/gplx/xowa2/wikis/data/Xodata_db_mgr.java new file mode 100644 index 000000000..30a1171f5 --- /dev/null +++ b/400_xowa/src/gplx/xowa2/wikis/data/Xodata_db_mgr.java @@ -0,0 +1,52 @@ +/* +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.xowa2.wikis.data; import gplx.*; import gplx.xowa2.*; import gplx.xowa2.wikis.*; +import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa2.wikis.data.tbls.*; +public class Xodata_db_mgr { + private Io_url wiki_root_dir; + public Xodata_db_mgr(boolean version_is_1, String domain_str, Io_url wiki_root_dir) { + this.wiki_root_dir = wiki_root_dir; + this.key__core = Xodata_db_mgr.Db_key__core__default(this, domain_str, wiki_root_dir); + this.tbl_page_regy = new Xow_page_regy_tbl(version_is_1, key__core); + } + public Xow_page_regy_tbl Tbl_page_regy() {return tbl_page_regy;} private final Xow_page_regy_tbl tbl_page_regy; + public Xodata_ns_regy_tbl Tbl__ns() {return tbl__ns;} private final Xodata_ns_regy_tbl tbl__ns = new Xodata_ns_regy_tbl(); + public Xodata_db_tbl Tbl__dbs_new() {return new Xodata_db_tbl();} + private Xodb_file[] db_files; private Db_url[] db_keys; private int db_keys_len; + public Db_url Key__core() {return key__core;} private Db_url key__core; + public Db_url Key_by_idx(int idx) {if (!Int_.Between(idx, 0, db_keys_len)) throw Err_.new_("database does not exist: idx={0}", idx); return db_keys[idx];} + public void Init_by_conn(Db_conn conn) { + db_files = Tbl__dbs_new().Select_all(conn, wiki_root_dir); + db_keys = Db_keys_make(db_files); + db_keys_len = db_keys.length; + } + private static Db_url Db_key__core__default(Xodata_db_mgr db_mgr, String domain_str, Io_url wiki_root_dir) { + Io_url core_db_url = wiki_root_dir.GenSubFil_ary(domain_str, ".000.sqlite3"); + return Db_url__sqlite.load_(core_db_url); + } + private static Db_url[] Db_keys_make(Xodb_file[] ary) { + int len = ary.length; + Db_url[] rv = new Db_url[len]; + for (int i = 0; i < len; ++i) { + Xodb_file itm = ary[i]; + Io_url itm_url = itm.Url(); + rv[i] = Db_url_.sqlite_(itm_url); + } + return rv; + } +} diff --git a/400_xowa/src/gplx/xowa2/wikis/data/tbls/Xodata_db_tbl.java b/400_xowa/src/gplx/xowa2/wikis/data/tbls/Xodata_db_tbl.java new file mode 100644 index 000000000..a6f869a44 --- /dev/null +++ b/400_xowa/src/gplx/xowa2/wikis/data/tbls/Xodata_db_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.xowa2.wikis.data.tbls; import gplx.*; import gplx.xowa2.*; import gplx.xowa2.wikis.*; import gplx.xowa2.wikis.data.*; +import gplx.dbs.*; import gplx.xowa.dbs.*; +public class Xodata_db_tbl { + public static final String Tbl_name = "xowa_db", Fld_db_id = "db_id", Fld_db_type = "db_type", Fld_db_url = "db_url"; + private static final String[] Flds__all = new String[] {Fld_db_id, Fld_db_type, Fld_db_url}; + public Xodb_file[] Select_all(Db_conn conn, Io_url wiki_root_dir) { + Db_rdr rdr = Db_rdr_.Null; + ListAdp list = ListAdp_.new_(); + try { + Db_qry__select_in_tbl qry = Db_qry__select_in_tbl.new_(Tbl_name, Db_qry__select_in_tbl.Where_flds__all, Flds__all).Order_by_sql_(Fld_db_id); + Db_stmt stmt = Db_stmt_.new_select_as_rdr(conn, qry); + rdr = stmt.Exec_select_as_rdr(); + while (rdr.Move_next()) { + Xodb_file db = Xodb_file.load_(rdr.Read_int(0), rdr.Read_byte(1), rdr.Read_str(2)); + db.Url_(wiki_root_dir.GenSubFil(db.Url_rel())); + list.Add(db); + } + } finally {rdr.Rls();} + Xodb_file[] rv = (Xodb_file[])list.Xto_ary(Xodb_file.class); + Chk_sequential(rv); + return rv; + } + private void Chk_sequential(Xodb_file[] ary) { + int len = ary.length; + int expd_id = 0; + for (int i = 0; i < len; i++) { + Xodb_file itm = ary[i]; + int actl_id = itm.Id(); + if (expd_id != actl_id) throw Err_.new_fmt_("database ids are not sequential; expd={0} actl={1}", expd_id, actl_id); + ++expd_id; + } + } + //Db_stmt_bldr stmt_bldr = new Db_stmt_bldr(Tbl_name, String_.Ary(Fld_db_id), Fld_db_type, Fld_db_url); +} diff --git a/400_xowa/src/gplx/xowa2/wikis/data/tbls/Xodata_ns_regy_tbl.java b/400_xowa/src/gplx/xowa2/wikis/data/tbls/Xodata_ns_regy_tbl.java new file mode 100644 index 000000000..9a07b6e9f --- /dev/null +++ b/400_xowa/src/gplx/xowa2/wikis/data/tbls/Xodata_ns_regy_tbl.java @@ -0,0 +1,76 @@ +/* +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.xowa2.wikis.data.tbls; import gplx.*; import gplx.xowa2.*; import gplx.xowa2.wikis.*; import gplx.xowa2.wikis.data.*; +import gplx.dbs.*; import gplx.xowa.*; +public class Xodata_ns_regy_tbl { + public void Conn_(Db_conn conn) {this.conn = conn;} private Db_conn conn; + public void Insert(Xow_ns_mgr ns_mgr) { + Db_stmt stmt = Db_stmt_.Null; + try { + stmt = Db_stmt_.new_insert_(conn, Tbl_name, Fld_ns_id, Fld_ns_name, Fld_ns_case, Fld_ns_is_alias, Fld_ns_count); + int len = ns_mgr.Ids_len(); + for (int i = 0; i < len; i++) { + Xow_ns ns = ns_mgr.Ids_get_at(i); + stmt.Clear() + .Val_int(ns.Id()) + .Val_str(ns.Name_str()) + .Val_byte(ns.Case_match()) + .Val_bool_as_byte(ns.Is_alias()) + .Val_int(ns.Count()) + .Exec_insert(); + ; + } + } finally {stmt.Rls();} + } + public void Select_all(Xow_ns_mgr ns_mgr) { + Db_rdr rdr = Db_rdr_.Null; Db_stmt stmt = Db_stmt_.Null; + try { + stmt = Db_stmt_.new_select_as_rdr(conn, Db_qry__select_in_tbl.new_(Tbl_name, Db_qry__select_in_tbl.Where_flds__all, Flds__all)); + rdr = stmt.Exec_select_as_rdr(); + ns_mgr.Clear(); + while (rdr.Move_next()) { + int ns_id = rdr.Read_int(0); + byte[] ns_name = rdr.Read_bry_by_str(1); + byte ns_case_match = rdr.Read_byte(2); + int ns_count = rdr.Read_int(3); + boolean ns_is_alias = rdr.Read_byte(4) == Bool_.Y_byte; + ns_mgr.Add_new(ns_id, ns_name, ns_case_match, ns_is_alias); + if (ns_id < 0) continue; // don't load counts for Special / Media + Xow_ns ns = ns_mgr.Ids_get_or_null(ns_id); + ns.Count_(ns_count); + if (ns_count > 0) ns.Exists_(true); // ns has article; mark it as exists, else Talk tab won't show; DATE:2013-12-04 + } + ns_mgr.Init(); + } finally {rdr.Rls(); stmt.Rls();} + } + public int Select_ns_count(int ns_id) { + Db_qry_select qry = Db_qry_.select_val_(Tbl_name, Fld_ns_count, Db_crt_.eq_(Fld_ns_id, ns_id)); + return Int_.cast_(qry.ExecRdr_val(conn)); + } + public void Update_ns_count(int ns_id, int ns_count) { + conn.Exec_qry(Db_qry_.update_common_(Tbl_name + , Db_crt_.eq_(Fld_ns_id, ns_id) + , KeyVal_.Ary + ( KeyVal_.new_(Fld_ns_count, ns_count) + ))); + } + public static final String Tbl_name = "xowa_ns" + , Fld_ns_id = "ns_id", Fld_ns_name = "ns_name", Fld_ns_case = "ns_case", Fld_ns_count = "ns_count", Fld_ns_is_alias = "ns_is_alias" + ; + private static final String[] Flds__all = new String[] {Fld_ns_id, Fld_ns_name, Fld_ns_case, Fld_ns_count, Fld_ns_is_alias}; +} diff --git a/400_xowa/src/gplx/xowa2/wikis/data/tbls/Xow_ns_regy_tbl.java b/400_xowa/src/gplx/xowa2/wikis/data/tbls/Xow_ns_regy_tbl.java new file mode 100644 index 000000000..bfd247dfd --- /dev/null +++ b/400_xowa/src/gplx/xowa2/wikis/data/tbls/Xow_ns_regy_tbl.java @@ -0,0 +1,78 @@ +/* +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.xowa2.wikis.data.tbls; import gplx.*; import gplx.xowa2.*; import gplx.xowa2.wikis.*; import gplx.xowa2.wikis.data.*; +import gplx.dbs.*; import gplx.xowa.*; +public class Xow_ns_regy_tbl implements Db_conn_itm { + public Xow_ns_regy_tbl() {Ctor_for_meta();} + public void Conn_term() {} + public Db_conn Conn() {return conn;} public Xow_ns_regy_tbl Conn_(Db_conn v) {conn = Db_conn_.Reg_itm(this, conn, v); return this;} private Db_conn conn; + public void Insert(Xow_ns_mgr ns_mgr) { + Db_stmt stmt = Db_stmt_.Null; + try { + stmt = conn.New_stmt_insert(tbl_name, Flds.Xto_str_ary()); + int len = ns_mgr.Ids_len(); + for (int i = 0; i < len; i++) { + Xow_ns ns = ns_mgr.Ids_get_at(i); + stmt.Clear().Val_int(ns.Id()).Val_str(ns.Name_str()).Val_byte(ns.Case_match()).Val_bool_as_byte(ns.Is_alias()).Val_int(ns.Count()) + .Exec_insert(); + } + } finally {stmt.Rls();} + } + public void Select_all(Xow_ns_mgr ns_mgr) { + Db_rdr rdr = Db_rdr_.Null; Db_stmt stmt = Db_stmt_.Null; + try { + stmt = conn.New_stmt_select_all_where(tbl_name, Flds.Xto_str_ary(), Db_qry__select_in_tbl.Where_flds__all); + rdr = stmt.Exec_select_as_rdr(); + ns_mgr.Clear(); + while (rdr.Move_next()) { + int ns_id = rdr.Read_int(Fld_ns_id); + byte[] ns_name = rdr.Read_bry_by_str(Fld_ns_name); + byte ns_case_match = rdr.Read_byte(Fld_ns_case); + int ns_count = rdr.Read_int(Fld_ns_count); + boolean ns_is_alias = rdr.Read_bool_by_byte(Fld_ns_is_alias); + ns_mgr.Add_new(ns_id, ns_name, ns_case_match, ns_is_alias); + if (ns_id < 0) continue; // don't load counts for Special / Media + Xow_ns ns = ns_mgr.Ids_get_or_null(ns_id); + ns.Count_(ns_count); + if (ns_count > 0) ns.Exists_(true); // ns has article; mark it as exists, else Talk tab won't show; DATE:2013-12-04 + } + ns_mgr.Init(); + } finally {rdr.Rls(); stmt.Rls();} + } +// public int Select_ns_count(int ns_id) { +// Db_qry_select qry = conn.New_stmt_select_all_where(tbl_name, String_.Ary(Fld_ns_count), Db_crt_.eq_(Fld_ns_id, ns_id)); +// return Int_.cast_(qry.ExecRdr_val(conn)); +// } + public void Update_ns_count(int ns_id, int ns_count) { + Db_stmt stmt = conn.New_stmt_update(tbl_name, String_.Ary(Fld_ns_id), Fld_ns_count); + stmt.Clear().Val_int(ns_count).Val_int(ns_id).Exec_update(); + } + private String tbl_name = "wiki_ns_regy"; + private Db_meta_fld_list Flds = new Db_meta_fld_list(); + private String Fld_ns_id, Fld_ns_name, Fld_ns_case, Fld_ns_is_alias, Fld_ns_count; + private void Ctor_for_meta() { + Fld_ns_id = Flds.Add_int_pkey("ns_id"); + Fld_ns_name = Flds.Add_str("ns_name", 255); + Fld_ns_case = Flds.Add_byte("ns_case"); + Fld_ns_is_alias = Flds.Add_bool("ns_is_alias"); + Fld_ns_count = Flds.Add_int("ns_count"); + } + public Db_meta_tbl Meta_tbl() { + return Db_meta_tbl.new_(tbl_name, Flds.Xto_fld_ary()); + } +} diff --git a/400_xowa/src/gplx/xowa2/wikis/data/tbls/Xow_page_regy_tbl.java b/400_xowa/src/gplx/xowa2/wikis/data/tbls/Xow_page_regy_tbl.java new file mode 100644 index 000000000..6e21a849c --- /dev/null +++ b/400_xowa/src/gplx/xowa2/wikis/data/tbls/Xow_page_regy_tbl.java @@ -0,0 +1,116 @@ +/* +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.xowa2.wikis.data.tbls; import gplx.*; import gplx.xowa2.*; import gplx.xowa2.wikis.*; import gplx.xowa2.wikis.data.*; +import gplx.dbs.*; import gplx.xowa.*; +public class Xow_page_regy_tbl implements Db_conn_itm { + private final Db_conn conn; private Db_stmt stmt_select_by_ttl, stmt_select_by_id, stmt_insert; + public Xow_page_regy_tbl(boolean version_is_1, Db_url url) { + conn = Db_conn_pool.I.Get_or_new(url); + conn.Itms_add(this); + Ctor_for_meta(version_is_1); + } + public void Conn_term() { + if (stmt_select_by_ttl != null) {stmt_select_by_ttl.Rls(); stmt_select_by_ttl = null;} + if (stmt_select_by_id != null) {stmt_select_by_id.Rls(); stmt_select_by_id = null;} + if (stmt_insert != null) {stmt_insert.Rls(); stmt_insert = null;} + } + public boolean Select_by_ttl(Xodb_page rv, Xow_ns ns, byte[] ttl) { + Db_rdr rdr = Db_rdr_.Null; + try { + if (stmt_select_by_ttl == null) stmt_select_by_ttl = conn.New_stmt_select_all_where(tbl_name, Flds.Xto_str_ary(), Fld_page_ns, Fld_page_title); + rdr = stmt_select_by_ttl.Clear().Val_int(ns.Id()).Val_str(String_.new_utf8_(ttl)).Exec_select_as_rdr(); + if (rdr.Move_next()) { + Read_page__all(rv, rdr); + return true; + } + } + catch (Exception exc) {stmt_select_by_ttl = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail + finally {rdr.Rls();} + return false; + } + public boolean Select_by_id(Xodb_page rv, int page_id) { + Db_rdr rdr = Db_rdr_.Null; + try { + if (stmt_select_by_id == null) stmt_select_by_id = conn.New_stmt_select_all_where(tbl_name, Flds_select(), Fld_page_id); + rdr = stmt_select_by_id.Clear().Val_int(page_id).Exec_select_as_rdr(); + if (rdr.Move_next()) { + Read_page__all(rv, rdr); + return true; + } + } + catch (Exception exc) {stmt_select_by_id = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail + finally {rdr.Rls();} + return false; + } + public void Insert(int page_id, int ns_id, byte[] ttl_wo_ns, boolean page_is_redirect, DateAdp modified_on, int page_len, int random_int, int file_idx, int html_db_id) { + try { + if (stmt_insert == null) stmt_insert = conn.New_stmt_insert(tbl_name, Flds.Xto_str_ary()); + stmt_insert.Clear() + .Val_int(page_id) + .Val_int(ns_id) + .Val_str(String_.new_utf8_(ttl_wo_ns)) + .Val_byte((byte)(page_is_redirect ? 1 : 0)) + .Val_str(modified_on.XtoStr_fmt(Page_touched_fmt)) + .Val_int(page_len) + .Val_int(random_int) + .Val_int(file_idx) + .Exec_insert(); + } + catch (Exception exc) {stmt_select_by_ttl = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail + finally {} + } + private void Read_page__all(Xodb_page page, Db_rdr rdr) { + page.Id_ (rdr.Read_int(Fld_page_id)); + page.Ns_id_ (rdr.Read_int(Fld_page_ns)); + page.Ttl_wo_ns_ (rdr.Read_bry_by_str(Fld_page_title)); + page.Modified_on_ (DateAdp_.parse_fmt(rdr.Read_str(Fld_page_touched), Page_touched_fmt)); + page.Type_redirect_ (rdr.Read_bool_by_byte(Fld_page_is_redirect)); + page.Text_len_ (rdr.Read_int(Fld_page_len)); + page.Text_db_id_ (rdr.Read_int(Fld_page_text_db_id)); + page.Html_db_id_ (rdr.Read_int(Fld_page_html_db_id)); + page.Redirect_id_ (rdr.Read_int(Fld_page_redirect_id)); + } + private static final String Page_touched_fmt = "yyyyMMddHHmmss"; + private String tbl_name = "wiki_page_regy"; + private String Fld_page_id, Fld_page_ns, Fld_page_title, Fld_page_is_redirect, Fld_page_touched, Fld_page_len, Fld_page_random_int, Fld_page_text_db_id, Fld_page_html_db_id, Fld_page_redirect_id; + private final Db_meta_fld_list Flds = Db_meta_fld_list.new_(); + private void Ctor_for_meta(boolean version_is_1) { + String page_text_db_id_key = "page_text_db_id"; + if (version_is_1) { + tbl_name = "page"; + page_text_db_id_key = "page_file_idx"; + } + Fld_page_id = Flds.Add_int_pkey("page_id"); // int(10); unsigned -- MW:same + Fld_page_ns = Flds.Add_int("page_namespace"); // int(11); -- MW:same + Fld_page_title = Flds.Add_str("page_title", 255); // varbinary(255); -- MW:blob + Fld_page_is_redirect = Flds.Add_int("page_is_redirect"); // tinyint(3); -- MW:same + Fld_page_touched = Flds.Add_str("page_touched", 14); // binary(14); -- MW:blob; NOTE: should be revision!rev_timestamp, but needs extra join + Fld_page_len = Flds.Add_int("page_len"); // int(10); unsigned -- MW:same except NULL REF: WikiPage.php!updateRevisionOn;" + Fld_page_random_int = Flds.Add_int("page_random_int"); // MW:XOWA + Fld_page_text_db_id = Flds.Add_int(page_text_db_id_key); // MW:XOWA + Fld_page_html_db_id = Flds.Add_int("page_html_db_id"); // MW:XOWA + Fld_page_redirect_id = Flds.Add_int("page_redirect_id"); // MW:XOWA + } + private String[] Flds_select() {return String_.Ary(Fld_page_id, Fld_page_ns, Fld_page_title, Fld_page_touched, Fld_page_is_redirect, Fld_page_len, Fld_page_text_db_id, Fld_page_html_db_id, Fld_page_redirect_id);} + public Db_meta_tbl new_meta() { + return Db_meta_tbl.new_(tbl_name, Flds.Xto_fld_ary() + , Db_meta_idx.new_normal(tbl_name, "title" , Fld_page_ns, Fld_page_title, Fld_page_id, Fld_page_len, Fld_page_is_redirect) + , Db_meta_idx.new_normal(tbl_name, "random" , Fld_page_ns, Fld_page_random_int) + ); + } +} diff --git a/400_xowa/src/gplx/xowa2/wikis/specials/Xosp_special_mgr.java b/400_xowa/src/gplx/xowa2/wikis/specials/Xosp_special_mgr.java new file mode 100644 index 000000000..ca28ed4e0 --- /dev/null +++ b/400_xowa/src/gplx/xowa2/wikis/specials/Xosp_special_mgr.java @@ -0,0 +1,30 @@ +/* +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.xowa2.wikis.specials; import gplx.*; import gplx.xowa2.*; import gplx.xowa2.wikis.*; +import gplx.xowa.*; import gplx.xowa2.gui.*; +import gplx.xowa.specials.xowa.file_browsers.*; +public class Xosp_special_mgr { + private final Xowv_wiki wiki; + public Xosp_special_mgr(Xowv_wiki wiki) {this.wiki = wiki;} + public void Get_by_ttl(Xog_page rv, Gfo_url url, Xoa_ttl ttl) { + Xosp_fbrow_rslt rslt = Xosp_fbrow_special.Gen(url.Args(), wiki.App().Wiki_mgr()); + rv.Init(-1, null, ttl); + rv.Page_body_(rslt.Html_body()); + rv.Html_head_xtn_(rslt.Html_head()); + } +} diff --git a/400_xowa/src_060_utl/gplx/Gfo_url_arg.java b/400_xowa/src_060_utl/gplx/Gfo_url_arg.java index 8cdbe9504..deff3203d 100644 --- a/400_xowa/src_060_utl/gplx/Gfo_url_arg.java +++ b/400_xowa/src_060_utl/gplx/Gfo_url_arg.java @@ -25,4 +25,17 @@ public class Gfo_url_arg { public static Gfo_url_arg new_key_(String key) { return new Gfo_url_arg(Bry_.new_utf8_(key), Bry_.Empty); } + public static Gfo_url_arg[] Ary(String... kvs) { + int len = kvs.length; + Gfo_url_arg[] rv = new Gfo_url_arg[len / 2]; + String key = null; + for (int i = 0; i < len; ++i) { + String s = kvs[i]; + if (i % 2 == 0) + key = s; + else + rv[i / 2] = new Gfo_url_arg(Bry_.new_utf8_(key), Bry_.new_utf8_(s)); + } + return rv; + } } diff --git a/400_xowa/src_060_utl/gplx/Gfo_url_parser.java b/400_xowa/src_060_utl/gplx/Gfo_url_parser.java index d4a93dec4..f4800ef6d 100644 --- a/400_xowa/src_060_utl/gplx/Gfo_url_parser.java +++ b/400_xowa/src_060_utl/gplx/Gfo_url_parser.java @@ -60,6 +60,7 @@ public class Gfo_url_parser { slash_pos = Bry_.Trim_end_pos(src, slash_pos); site_data.Atrs_set(rel, pos, slash_pos); } + public Gfo_url Parse(byte[] src) {Gfo_url rv = new Gfo_url(); this.Parse(rv, src, 0, src.length); return rv;} public boolean Parse(Gfo_url url, byte[] src, int bgn, int end) { this.url = url; url.Ini_(src); @@ -265,6 +266,14 @@ public class Gfo_url_parser { url.Args_bgn_(bgn - 1); // NOTE: bgn is 1st char after ?; -1 to place at ? url.Args_((Gfo_url_arg[])args.Xto_ary(Gfo_url_arg.class)); } + private void Args_add(byte[] src, int key_bgn, int key_end, int val_bgn, int val_end) { + encoder.Decode(src, key_bgn, key_end, tmp_bfr, false); + byte[] key = tmp_bfr.Xto_bry_and_clear(); + encoder.Decode(src, val_bgn, val_end, tmp_bfr, false); + byte[] val = tmp_bfr.Xto_bry_and_clear(); + Gfo_url_arg arg = new Gfo_url_arg(key, val); + args.Add(arg); + } private void Site_set(byte[] src, int bgn, int end, int dot_count, int dot_pos_0, int dot_pos_1) { encoder.Decode(src, bgn, end, tmp_bfr, false); url.Site_(tmp_bfr.Xto_bry_and_clear()); @@ -298,14 +307,6 @@ public class Gfo_url_parser { encoder.Decode(src, bgn, end, tmp_bfr, false); url.Anchor_(tmp_bfr.Xto_bry_and_clear()); } - private void Args_add(byte[] src, int key_bgn, int key_end, int val_bgn, int val_end) { - encoder.Decode(src, key_bgn, key_end, tmp_bfr, false); - byte[] key = tmp_bfr.Xto_bry_and_clear(); - encoder.Decode(src, val_bgn, val_end, tmp_bfr, false); - byte[] val = tmp_bfr.Xto_bry_and_clear(); - Gfo_url_arg arg = new Gfo_url_arg(key, val); - args.Add(arg); - } private static final Bry_bfr tmp_bfr = Bry_bfr.reset_(500); public static final byte[] Bry_double_slash = new byte[] {Byte_ascii.Slash, Byte_ascii.Slash}; } diff --git a/400_xowa/src_060_utl/gplx/Gfo_usr_dlg_base.java b/400_xowa/src_060_utl/gplx/Gfo_usr_dlg_base.java index b61cd7c9c..b5b97c5dd 100644 --- a/400_xowa/src_060_utl/gplx/Gfo_usr_dlg_base.java +++ b/400_xowa/src_060_utl/gplx/Gfo_usr_dlg_base.java @@ -17,6 +17,8 @@ along with this program. If not, see . */ package gplx; public class Gfo_usr_dlg_base implements Gfo_usr_dlg { + private Bry_fmtr tmp_fmtr = Bry_fmtr.tmp_().Fail_when_invalid_escapes_(false); // do not fail b/c msgs may contain excerpt of random text; EX:[[User:A|~A~]] DATE:2014-11-28 + private Bry_bfr tmp_bfr = Bry_bfr.new_(); public Gfo_usr_dlg_ui Ui_wkr() {return ui_wkr;} public void Ui_wkr_(Gfo_usr_dlg_ui v) {ui_wkr = v;} Gfo_usr_dlg_ui ui_wkr = Gfo_usr_dlg_ui_.Null; public Gfo_log_wtr Log_wtr() {return log_wtr;} public void Log_wtr_(Gfo_log_wtr v) {log_wtr = v;} Gfo_log_wtr log_wtr; @gplx.Virtual public void Clear() {ui_wkr.Clear();} @@ -41,15 +43,15 @@ public class Gfo_usr_dlg_base implements Gfo_usr_dlg { log_wtr.Log_err(Err_.Message_gplx(rv)); return rv; } - String Bld_msg_many(String grp_key, String msg_key, String fmt, Object[] args) { + private String Bld_msg_many(String grp_key, String msg_key, String fmt, Object[] args) { tmp_fmtr.Fmt_(fmt).Bld_bfr_many(tmp_bfr, args); return tmp_bfr.Xto_str_and_clear(); - } private Bry_fmtr tmp_fmtr = Bry_fmtr.tmp_(); Bry_bfr tmp_bfr = Bry_bfr.new_(); - String Bld_msg_one(String grp_key, String msg_key, String fmt, Object val) { + } + private String Bld_msg_one(String grp_key, String msg_key, String fmt, Object val) { tmp_fmtr.Fmt_(fmt).Bld_bfr_one(tmp_bfr, val); return tmp_bfr.Xto_str_and_clear(); } - String Bld_msg_none(String grp_key, String msg_key, String fmt) { + private String Bld_msg_none(String grp_key, String msg_key, String fmt) { return fmt; } private void Ui_wkr_parse(String s) { diff --git a/400_xowa/src_120_wiki/gplx/xowa/Xow_wiki.java b/400_xowa/src_120_wiki/gplx/xowa/Xow_wiki.java index 6bb6a6c51..7d9a99a20 100644 --- a/400_xowa/src_120_wiki/gplx/xowa/Xow_wiki.java +++ b/400_xowa/src_120_wiki/gplx/xowa/Xow_wiki.java @@ -42,7 +42,7 @@ public class Xow_wiki implements GfoInvkAble, Xoa_ttl_parser { Pf_func_.Reg(lang.Func_regy(), lang); special_mgr = new Xows_mgr(this, lang); stats = new Xow_wiki_stats(this); - xwiki_mgr = new Xow_xwiki_mgr(this); + xwiki_mgr = new Xow_xwiki_mgr(this, app.Url_parser().Url_parser(), domain_tid); xwiki_mgr.Add_full(domain_bry, domain_bry); // add full name to xwiki_mgr; needed for lookup in home ns; EX: [[en.wikipedia.org:Earth]] html_mgr = new Xow_html_mgr(this); sys_cfg = new Xow_sys_cfg(this); @@ -227,7 +227,7 @@ public class Xow_wiki implements GfoInvkAble, Xoa_ttl_parser { Io_url sqlite_url = Xodb_mgr_sql.Find_core_url(this); if (sqlite_url != null) { Xodb_mgr_sql db_mgr_sql = this.Db_mgr_create_as_sql(); - db_mgr_sql.Init_load(gplx.dbs.Db_conn_info_.sqlite_(sqlite_url)); + db_mgr_sql.Init_load(gplx.dbs.Db_url_.sqlite_(sqlite_url)); db_mgr_sql.Html_db_enabled_(hdump_enabled); } if (!Xob_import_marker.Check(this)) {app.Wiki_mgr().Del(domain_bry); init_needed = false; return;} // NOTE: must call after Db_mgr_create_as_sql(); also, must delete wiki from mgr; DATE:2014-08-24 diff --git a/400_xowa/src_140_lang/gplx/xowa/Xol_msg_itm.java b/400_xowa/src_140_lang/gplx/xowa/Xol_msg_itm.java index a5e316e6b..6484c0676 100644 --- a/400_xowa/src_140_lang/gplx/xowa/Xol_msg_itm.java +++ b/400_xowa/src_140_lang/gplx/xowa/Xol_msg_itm.java @@ -30,14 +30,19 @@ public class Xol_msg_itm { } public boolean Dirty() {return dirty;} public Xol_msg_itm Dirty_(boolean v) {dirty = v; return this;} private boolean dirty; public byte[] Fmt(Bry_bfr bfr, Object... args) { - tmp_fmtr.Fmt_(val); - tmp_fmtr.Bld_bfr_many(bfr, args); - return bfr.Xto_bry_and_clear(); - } static Bry_fmtr tmp_fmtr = Bry_fmtr.tmp_(); + synchronized (tmp_fmtr) { + tmp_fmtr.Fmt_(val); + tmp_fmtr.Bld_bfr_many(bfr, args); + return bfr.Xto_bry_and_clear(); + } + } public byte[] Fmt_tmp(Bry_bfr bfr, byte[] tmp_val, Object... args) { - tmp_fmtr.Fmt_(tmp_val); - tmp_fmtr.Bld_bfr_many(bfr, args); - return bfr.Xto_bry_and_clear(); + synchronized (tmp_fmtr) { + tmp_fmtr.Fmt_(tmp_val); + tmp_fmtr.Bld_bfr_many(bfr, args); + return bfr.Xto_bry_and_clear(); + } } public static final byte Src_null = 0, Src_lang = 1, Src_wiki = 2, Src_missing = 3; + private static Bry_fmtr tmp_fmtr = Bry_fmtr.tmp_(); } diff --git a/400_xowa/src_160_file/gplx/xowa/Xoaf_download_mgr.java b/400_xowa/src_160_file/gplx/xowa/Xoaf_download_mgr.java index ed21a7493..0423142fb 100644 --- a/400_xowa/src_160_file/gplx/xowa/Xoaf_download_mgr.java +++ b/400_xowa/src_160_file/gplx/xowa/Xoaf_download_mgr.java @@ -27,7 +27,7 @@ public class Xoaf_download_mgr implements GfoInvkAble { enabled = v; File_download_enable(app, v); return this; - } private boolean enabled; + } private boolean enabled = true; // default to true; DATE:2015-01-05 public Xof_download_wkr Download_wkr() {return download_wkr;} public Xoaf_download_mgr Download_wkr_(Xof_download_wkr v) {download_wkr = v; return this;} private Xof_download_wkr download_wkr; public Xof_img_wkr_api_size_base Api_size_wkr() {return api_size_wkr;} public Xoaf_download_mgr Api_size_wkr_(Xof_img_wkr_api_size_base v) {api_size_wkr = v; return this;} private Xof_img_wkr_api_size_base api_size_wkr = new Xof_img_wkr_api_size_base_wmf(); public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { diff --git a/400_xowa/src_160_file/gplx/xowa/Xof_file_mgr.java b/400_xowa/src_160_file/gplx/xowa/Xof_file_mgr.java index 5e8e67619..fce4f0ac2 100644 --- a/400_xowa/src_160_file/gplx/xowa/Xof_file_mgr.java +++ b/400_xowa/src_160_file/gplx/xowa/Xof_file_mgr.java @@ -18,6 +18,7 @@ along with this program. If not, see . package gplx.xowa; import gplx.*; import gplx.xowa.xtns.math.*; import gplx.xowa.files.fsdb.caches.*; +import gplx.dbs.*; import gplx.xowa2.files.commons.*; public class Xof_file_mgr implements GfoInvkAble { public void Init_app(Xoa_app app, Gfo_usr_dlg usr_dlg) { this.app = app; diff --git a/400_xowa/src_160_file/gplx/xowa/Xof_repo_itm.java b/400_xowa/src_160_file/gplx/xowa/Xof_repo_itm.java index d59f00c0e..dfb77921c 100644 --- a/400_xowa/src_160_file/gplx/xowa/Xof_repo_itm.java +++ b/400_xowa/src_160_file/gplx/xowa/Xof_repo_itm.java @@ -18,8 +18,8 @@ along with this program. If not, see . package gplx.xowa; import gplx.*; import gplx.core.btries.*; public class Xof_repo_itm implements GfoInvkAble { - public Xof_repo_itm(Xoa_repo_mgr mgr, byte[] key) {this.mgr = mgr; this.key = key;} private Xoa_repo_mgr mgr; - public byte[] Key() {return key;} private byte[] key; + public Xof_repo_itm(Xoa_repo_mgr mgr, byte[] key) {this.mgr = mgr; this.key = key;} private final Xoa_repo_mgr mgr; + public byte[] Key() {return key;} private final byte[] key; public boolean Wmf_fsys() {return wmf_fsys;} public Xof_repo_itm Wmf_fsys_(boolean v) {wmf_fsys = v; return this;} private boolean wmf_fsys; public boolean Wmf_api() {return wmf_api;} public Xof_repo_itm Wmf_api_(boolean v) {wmf_api = v; return this;} private boolean wmf_api; public boolean Tarball() {return tarball;} public Xof_repo_itm Tarball_(boolean v) {tarball = v; return this;} private boolean tarball; @@ -87,16 +87,7 @@ public class Xof_repo_itm implements GfoInvkAble { } byte[] rv = tmp_bfr.Xto_bry_and_clear(); return rv; - } private Bry_bfr tmp_bfr = Bry_bfr.reset_(300); Btrie_slim_mgr trie = trie_make(); - private static Btrie_slim_mgr trie_make() { - Btrie_slim_mgr rv = Btrie_slim_mgr.cs_(); - byte[] invalid = Op_sys.Wnt.Fsys_invalid_chars(); - byte[] underline = new byte[] {Byte_ascii.Underline}; - int len = invalid.length; - for (int i = 0; i < len; i++) - rv.Add_obj(new byte[] {invalid[i]}, underline); - return rv; - } + } private final Bry_bfr tmp_bfr = Bry_bfr.reset_(300); public byte[] Gen_name_trg(byte[] bry, byte[] md5, Xof_ext ext) { byte[] rv = Gen_name_src(bry); byte[] ext_bry = ext.Ext(); @@ -123,7 +114,17 @@ public class Xof_repo_itm implements GfoInvkAble { } private static final String Invk_owner = "owner", Invk_fsys_ = "fsys_", Invk_ext_rules_ = "ext_rules_", Invk_primary_ = "primary_", Invk_wmf_api_ = "wmf_api_", Invk_tarball_ = "tarball_"; public Xof_repo_itm Ext_rules_(byte[] ext_rules_key) {ext_rules = mgr.App().File_mgr().Ext_rules().Get_or_new(ext_rules_key); return this;} public static final int Thumb_default_null = -1; - public static final byte Mode_orig = 0, Mode_thumb = 1, Mode_nil = Byte_.MaxValue_127; - public static final byte Repo_remote = 0, Repo_local = 1, Repo_unknown = 126, Repo_null = Byte_.MaxValue_127; + public static final byte Mode_orig = 0, Mode_thumb = 1, Mode_nil = Byte_.Max_value_127; + public static final byte Repo_remote = 0, Repo_local = 1, Repo_unknown = 126, Repo_null = Byte_.Max_value_127; public static final int Dir_depth_null = -1, Dir_depth_wmf = 2, Dir_depth_xowa = 4; + private static final Btrie_slim_mgr trie = trie_make(); + private static Btrie_slim_mgr trie_make() { + Btrie_slim_mgr rv = Btrie_slim_mgr.cs_(); + byte[] invalid = Op_sys.Wnt.Fsys_invalid_chars(); + byte[] underline = new byte[] {Byte_ascii.Underline}; + int len = invalid.length; + for (int i = 0; i < len; i++) + rv.Add_obj(new byte[] {invalid[i]}, underline); + return rv; + } } diff --git a/400_xowa/src_160_file/gplx/xowa/Xofo_lnki_parser_tst.java b/400_xowa/src_160_file/gplx/xowa/Xofo_lnki_parser_tst.java index 5e684c1be..0b5552ea5 100644 --- a/400_xowa/src_160_file/gplx/xowa/Xofo_lnki_parser_tst.java +++ b/400_xowa/src_160_file/gplx/xowa/Xofo_lnki_parser_tst.java @@ -50,7 +50,7 @@ class Xofo_lnki_parser_fxt { } class Xofo_lnki_chkr implements Tst_chkr { public Class TypeOf() {return Xofo_lnki.class;} - public Xofo_lnki_chkr Lnki_type_(byte v) {lnki_type = v; return this;} private byte lnki_type = Byte_.MaxValue_127; + public Xofo_lnki_chkr Lnki_type_(byte v) {lnki_type = v; return this;} private byte lnki_type = Byte_.Max_value_127; public Xofo_lnki_chkr Lnki_w_(int v) {lnki_w = v; return this;} private int lnki_w = -1; public Xofo_lnki_chkr Lnki_h_(int v) {lnki_h = v; return this;} private int lnki_h = -1; public Xofo_lnki_chkr Lnki_upright_(double v) {lnki_upright = v; return this;} double lnki_upright = -1; @@ -58,7 +58,7 @@ class Xofo_lnki_chkr implements Tst_chkr { public int Chk(Tst_mgr mgr, String path, Object actl_obj) { Xofo_lnki actl = (Xofo_lnki)actl_obj; int rv = 0; - rv += mgr.Tst_val(lnki_type == Byte_.MaxValue_127, path, "lnki_type", lnki_type, actl.Lnki_type()); + rv += mgr.Tst_val(lnki_type == Byte_.Max_value_127, path, "lnki_type", lnki_type, actl.Lnki_type()); rv += mgr.Tst_val(lnki_w == -1, path, "lnki_w", lnki_w, actl.Lnki_w()); rv += mgr.Tst_val(lnki_h == -1, path, "lnki_h", lnki_h, actl.Lnki_h()); rv += mgr.Tst_val(lnki_upright == -1, path, "lnki_upright", lnki_upright, actl.Lnki_upright()); diff --git a/400_xowa/src_160_file/gplx/xowa/Xofw_file_finder_rslt.java b/400_xowa/src_160_file/gplx/xowa/Xofw_file_finder_rslt.java index 98d7afc2c..627de3d87 100644 --- a/400_xowa/src_160_file/gplx/xowa/Xofw_file_finder_rslt.java +++ b/400_xowa/src_160_file/gplx/xowa/Xofw_file_finder_rslt.java @@ -22,7 +22,7 @@ public class Xofw_file_finder_rslt { public int Repo_idx() {return repo_idx;} private int repo_idx; public byte[] Repo_wiki_key() {return repo_wiki_key;} private byte[] repo_wiki_key; public void Init(byte[] ttl) { - this.ttl = ttl; redirect = Xop_redirect_mgr.Redirect_null_bry; repo_wiki_key = null; repo_idx = Byte_.MaxValue_127; + this.ttl = ttl; redirect = Xop_redirect_mgr.Redirect_null_bry; repo_wiki_key = null; repo_idx = Byte_.Max_value_127; } public void Done(int repo_idx, byte[] repo_wiki_key, byte[] redirect) { this.repo_idx = repo_idx; this.repo_wiki_key = repo_wiki_key; this.redirect = redirect; diff --git a/400_xowa/src_161_meta/gplx/xowa/Xof_meta_itm.java b/400_xowa/src_161_meta/gplx/xowa/Xof_meta_itm.java index b9d1c98f2..676339490 100644 --- a/400_xowa/src_161_meta/gplx/xowa/Xof_meta_itm.java +++ b/400_xowa/src_161_meta/gplx/xowa/Xof_meta_itm.java @@ -124,7 +124,7 @@ public class Xof_meta_itm { private void Dirty() {if (owner_fil != null) owner_fil.Dirty_();} public void Save(Gfo_fld_wtr wtr) { wtr.Write_bry_escape_fld(ttl); - byte vrtl_repo_byte = Byte_.MaxValue_127; + byte vrtl_repo_byte = Byte_.Max_value_127; switch (vrtl_repo) { case Repo_unknown: vrtl_repo_byte = Byte_ascii.Ltr_z; break; case Repo_same: vrtl_repo_byte = Byte_ascii.Ltr_y; break; @@ -177,7 +177,7 @@ public class Xof_meta_itm { Tid_main = 0 , Tid_ptr = 1 , Tid_vrtl = 2 - , Tid_null = Byte_.MaxValue_127 + , Tid_null = Byte_.Max_value_127 ; public static final byte[] Ptr_ttl_null = Bry_.Empty; } diff --git a/400_xowa/src_162_xfer/gplx/xowa/Xow_repo_mgr.java b/400_xowa/src_162_xfer/gplx/xowa/Xow_repo_mgr.java index adee5255b..02e749293 100644 --- a/400_xowa/src_162_xfer/gplx/xowa/Xow_repo_mgr.java +++ b/400_xowa/src_162_xfer/gplx/xowa/Xow_repo_mgr.java @@ -139,7 +139,7 @@ public class Xow_repo_mgr implements GfoInvkAble { } public Xofw_file_finder_rslt Page_finder_locate(byte[] ttl_bry) {page_finder.Locate(tmp_rslt, repos, ttl_bry); return tmp_rslt;} byte Xfer_by_meta__find_file(byte[] ttl_bry, Xof_meta_itm meta_itm, byte[] cur_wiki_key) { - byte new_tid = Byte_.MaxValue_127; + byte new_tid = Byte_.Max_value_127; boolean found = page_finder.Locate(tmp_rslt, repos, ttl_bry); if (found) { if (Bry_.Eq(cur_wiki_key, tmp_rslt.Repo_wiki_key())) { // itm is in same repo as cur wiki diff --git a/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_tst.java b/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_tst.java index c239e0be4..4f76d89c3 100644 --- a/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_tst.java +++ b/400_xowa/src_240_install/gplx/xowa/Xoi_cmd_wiki_tst.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa; import gplx.*; import org.junit.*; -import gplx.brys.*; import gplx.threads.*; import gplx.xowa.wikis.*; +import gplx.brys.*; import gplx.threads.*; import gplx.xowa.wikis.*; import gplx.xowa.setup.maints.*; public class Xoi_cmd_wiki_tst { @Test public void Run() { // Bld_import_list(Wikis); @@ -26,45 +26,84 @@ public class Xoi_cmd_wiki_tst { public void Bld_import_list(String... ary) { int ary_len = ary.length; Bry_bfr bfr = Bry_bfr.reset_(255); - Bry_fmtr_arg_time time_fmtr = new Bry_fmtr_arg_time(); + Wmf_latest_parser parser = new Wmf_latest_parser(); Xob_dump_file dump_file = new Xob_dump_file(); - for (int i = 0; i < ary_len; i++) { - String itm = ary[i]; - dump_file.Ctor(itm, "latest", Xow_wiki_alias.Key_pages_articles); - int count = 0; - while (count++ < 10) { - dump_file.Server_url_(Xob_dump_file_.Server_wmf); - if (dump_file.Connect()) break; - Tfds.WriteText(String_.Format("retrying: {0} {1}\n", count, dump_file.File_modified())); - ThreadAdp_.Sleep(2000); // wait for connection to reset - } - if (count == 10) { - Tfds.WriteText(String_.Format("failed: {0}\n", dump_file.File_url())); - continue; - } - else - Tfds.WriteText(String_.Format("passed: {0}\n", itm)); - bfr.Add_str(itm).Add_byte_pipe(); - bfr.Add_str(dump_file.File_url()).Add_byte_pipe(); - bfr.Add(Xow_wiki_domain_.Key_by_tid(dump_file.Wiki_type().Wiki_tid())).Add_byte_pipe(); -// Xol_lang_itm lang_itm = Xol_lang_itm_.Get_by_key(wiki_type.Lang_key()); -// if (lang_itm == null) lang_itm = Xol_lang_itm_.Get_by_key(Xol_lang_.Key_en); // commons, species, meta, etc will have no lang -// bfr.Add(lang_itm.Local_name()).Add_byte_pipe(); -// bfr.Add(lang_itm.Canonical_name()).Add_byte_pipe(); - long src_size = dump_file.File_len(); - bfr.Add_long_variable(src_size).Add_byte_pipe(); - bfr.Add_str(gplx.ios.Io_size_.Xto_str(src_size)).Add_byte_pipe(); - time_fmtr.Seconds_(Math_.Div_safe_as_long(src_size, 1000000)).XferAry(bfr, 0); - bfr.Add_byte_pipe(); - bfr.Add_str(dump_file.File_modified().XtoStr_fmt_yyyy_MM_dd_HH_mm()); - bfr.Add_byte_pipe(); -// bfr.Add_str(String_.ConcatWith_any(",", (Object[])dump_file.Dump_available_dates())); -// bfr.Add_byte_pipe(); - bfr.Add_str(dump_file.Dump_date()); - bfr.Add_byte_nl(); - } + Bry_fmtr_arg_time time_fmtr = new Bry_fmtr_arg_time(); + for (int i = 0; i < ary_len; i++) + Bld_import_list_itm2(bfr, parser, dump_file, time_fmtr, ary, i); Io_mgr._.SaveFilStr("C:\\temp.txt", bfr.Xto_str()); } + private void Bld_import_list_itm2(Bry_bfr bfr, Wmf_latest_parser parser, Xob_dump_file dump_file, Bry_fmtr_arg_time time_fmtr, String[] ary, int i) { + String domain_str = ary[i]; + byte[] domain_bry = Bry_.new_ascii_(domain_str); + Xow_wiki_domain domain_itm = Xow_wiki_domain_.parse_by_domain(domain_bry); + byte[] wmf_key_bry = Bry_.Replace(Xow_wiki_alias.Build_alias(domain_itm), Byte_ascii.Dash, Byte_ascii.Underline); + String wmf_key = String_.new_utf8_(wmf_key_bry); + String url = "http://dumps.wikimedia.org/" + wmf_key + "/latest"; + byte[] latest_html = null; + for (int j = 0; j < 5; ++j) { + latest_html = Io_mgr._.DownloadFil_args("", Io_url_.Null).Exec_as_bry(url); + if (latest_html != null) break; + Tfds.Write("fail|" + url); + if (j == 4) return; + } + Tfds.Write("pass|" + url); + parser.Parse(latest_html); + dump_file.Ctor(domain_str, "latest", Xow_wiki_alias.Key_pages_articles); + dump_file.Server_url_(Xob_dump_file_.Server_wmf); + byte[] pages_articles_key = Bry_.new_ascii_(wmf_key + "-latest-pages-articles.xml.bz2"); + Wmf_latest_itm latest_itm = parser.Get_by(pages_articles_key); + bfr.Add(domain_bry).Add_byte_pipe(); + bfr.Add_str(dump_file.File_url()).Add_byte_pipe(); + bfr.Add(Xow_wiki_domain_.Key_by_tid(domain_itm.Wiki_tid())).Add_byte_pipe(); + long src_size = latest_itm.Size(); + bfr.Add_long_variable(src_size).Add_byte_pipe(); + bfr.Add_str(gplx.ios.Io_size_.Xto_str(src_size)).Add_byte_pipe(); + time_fmtr.Seconds_(Math_.Div_safe_as_long(src_size, 1000000)).XferAry(bfr, 0); + bfr.Add_byte_pipe(); + bfr.Add_str(latest_itm.Date().XtoStr_fmt_yyyy_MM_dd_HH_mm()); + bfr.Add_byte_pipe(); + bfr.Add_str(dump_file.Dump_date()); + bfr.Add_byte_nl(); + } + /* + private void Bld_import_list_itm(Bry_bfr bfr, Xob_dump_file dump_file, Bry_fmtr_arg_time time_fmtr, String[] ary, int i) { + String itm = ary[i]; + dump_file.Ctor(itm, "latest", Xow_wiki_alias.Key_pages_articles); + int count = 0; + while (count++ < 1) { + dump_file.Server_url_(Xob_dump_file_.Server_wmf); + if (dump_file.Connect()) break; + Tfds.WriteText(String_.Format("retrying: {0} {1}\n", count, dump_file.File_modified())); + ThreadAdp_.Sleep(15000); // wait for connection to reset + } + if (count == 10) { + Tfds.WriteText(String_.Format("failed: {0}\n", dump_file.File_url())); + return; + } + else + Tfds.WriteText(String_.Format("passed: {0}\n", itm)); + bfr.Add_str(itm).Add_byte_pipe(); + bfr.Add_str(dump_file.File_url()).Add_byte_pipe(); + bfr.Add(Xow_wiki_domain_.Key_by_tid(dump_file.Wiki_type().Wiki_tid())).Add_byte_pipe(); +// Xol_lang_itm lang_itm = Xol_lang_itm_.Get_by_key(wiki_type.Lang_key()); +// if (lang_itm == null) lang_itm = Xol_lang_itm_.Get_by_key(Xol_lang_.Key_en); // commons, species, meta, etc will have no lang +// bfr.Add(lang_itm.Local_name()).Add_byte_pipe(); +// bfr.Add(lang_itm.Canonical_name()).Add_byte_pipe(); + long src_size = dump_file.File_len(); + bfr.Add_long_variable(src_size).Add_byte_pipe(); + bfr.Add_str(gplx.ios.Io_size_.Xto_str(src_size)).Add_byte_pipe(); + time_fmtr.Seconds_(Math_.Div_safe_as_long(src_size, 1000000)).XferAry(bfr, 0); + bfr.Add_byte_pipe(); + bfr.Add_str(dump_file.File_modified().XtoStr_fmt_yyyy_MM_dd_HH_mm()); + bfr.Add_byte_pipe(); +// bfr.Add_str(String_.ConcatWith_any(",", (Object[])dump_file.Dump_available_dates())); +// bfr.Add_byte_pipe(); + bfr.Add_str(dump_file.Dump_date()); + bfr.Add_byte_nl(); + ThreadAdp_.Sleep(1000); + } + */ public void Bld_cfg_files(String... ary) { Bry_bfr bfr = Bry_bfr.reset_(255); gplx.xowa.bldrs.wiki_cfgs.Xoi_wiki_props_api api = new gplx.xowa.bldrs.wiki_cfgs.Xoi_wiki_props_api(); @@ -86,813 +125,816 @@ public class Xoi_cmd_wiki_tst { Io_mgr._.SaveFilStr("C:\\xowa_build_cfg.gfs", bfr.Xto_str()); } public static String[] Wikis = new String[] -{ "simple.wikipedia.org" -}; -//{ "aa.wikipedia.org" -//, "aa.wikibooks.org" -//, "aa.wiktionary.org" -//, "ab.wikipedia.org" -//, "ab.wiktionary.org" -//, "ace.wikipedia.org" -//, "af.wikipedia.org" -//, "af.wikibooks.org" -//, "af.wikiquote.org" -//, "af.wiktionary.org" -//, "ak.wikipedia.org" -//, "ak.wikibooks.org" -//, "ak.wiktionary.org" -//, "als.wikipedia.org" -//, "als.wikibooks.org" -//, "als.wikiquote.org" -//, "als.wiktionary.org" -//, "am.wikipedia.org" -//, "am.wikiquote.org" -//, "am.wiktionary.org" -//, "ang.wikipedia.org" -//, "ang.wikibooks.org" -//, "ang.wikiquote.org" -//, "ang.wikisource.org" -//, "ang.wiktionary.org" -//, "an.wikipedia.org" -//, "an.wiktionary.org" -//, "arc.wikipedia.org" -//, "ar.wikipedia.org" -//, "ar.wikibooks.org" -//, "ar.wikinews.org" -//, "ar.wikiquote.org" -//, "ar.wikisource.org" -//, "ar.wikiversity.org" -//, "ar.wiktionary.org" -//, "arz.wikipedia.org" -//, "ast.wikipedia.org" -//, "ast.wikibooks.org" -//, "ast.wikiquote.org" -//, "ast.wiktionary.org" -//, "as.wikipedia.org" -//, "as.wikibooks.org" -//, "as.wikisource.org" -//, "as.wiktionary.org" -//, "av.wikipedia.org" -//, "av.wiktionary.org" -//, "ay.wikipedia.org" -//, "ay.wikibooks.org" -//, "ay.wiktionary.org" -//, "az.wikipedia.org" -//, "az.wikibooks.org" -//, "az.wikiquote.org" -//, "az.wikisource.org" -//, "az.wiktionary.org" -//, "bar.wikipedia.org" -//, "bat-smg.wikipedia.org" -//, "ba.wikipedia.org" -//, "ba.wikibooks.org" -//, "bcl.wikipedia.org" -//, "be-x-old.wikipedia.org" -//, "be.wikipedia.org" -//, "be.wikibooks.org" -//, "be.wikiquote.org" -//, "be.wikisource.org" -//, "be.wiktionary.org" -//, "bg.wikipedia.org" -//, "bg.wikibooks.org" -//, "bg.wikinews.org" -//, "bg.wikiquote.org" -//, "bg.wikisource.org" -//, "bg.wiktionary.org" -//, "bh.wikipedia.org" -//, "bh.wiktionary.org" -//, "bi.wikipedia.org" -//, "bi.wikibooks.org" -//, "bi.wiktionary.org" -//, "bjn.wikipedia.org" -//, "bm.wikipedia.org" -//, "bm.wikibooks.org" -//, "bm.wikiquote.org" -//, "bm.wiktionary.org" -//, "bn.wikipedia.org" -//, "bn.wikibooks.org" -//, "bn.wikisource.org" -//, "bn.wiktionary.org" -//, "bo.wikipedia.org" -//, "bo.wikibooks.org" -//, "bo.wiktionary.org" -//, "bpy.wikipedia.org" -//, "br.wikipedia.org" -//, "br.wikiquote.org" -//, "br.wikisource.org" -//, "br.wiktionary.org" -//, "bs.wikipedia.org" -//, "bs.wikibooks.org" -//, "bs.wikinews.org" -//, "bs.wikiquote.org" -//, "bs.wikisource.org" -//, "bs.wiktionary.org" -//, "bug.wikipedia.org" -//, "bxr.wikipedia.org" -//, "ca.wikipedia.org" -//, "ca.wikibooks.org" -//, "ca.wikinews.org" -//, "ca.wikiquote.org" -//, "ca.wikisource.org" -//, "ca.wiktionary.org" -//, "cbk-zam.wikipedia.org" -//, "cdo.wikipedia.org" -//, "ceb.wikipedia.org" -//, "ce.wikipedia.org" -//, "cho.wikipedia.org" -//, "chr.wikipedia.org" -//, "chr.wiktionary.org" -//, "ch.wikipedia.org" -//, "ch.wikibooks.org" -//, "ch.wiktionary.org" -//, "chy.wikipedia.org" -//, "ckb.wikipedia.org" -//, "commons.wikimedia.org" -//, "co.wikipedia.org" -//, "co.wikibooks.org" -//, "co.wikiquote.org" -//, "co.wiktionary.org" -//, "crh.wikipedia.org" -//, "cr.wikipedia.org" -//, "cr.wikiquote.org" -//, "cr.wiktionary.org" -//, "csb.wikipedia.org" -//, "csb.wiktionary.org" -//, "cs.wikipedia.org" -//, "cs.wikibooks.org" -//, "cs.wikinews.org" -//, "cs.wikiquote.org" -//, "cs.wikisource.org" -//, "cs.wikiversity.org" -//, "cs.wiktionary.org" -//, "cu.wikipedia.org" -//, "cv.wikipedia.org" -//, "cv.wikibooks.org" -//, "cy.wikipedia.org" -//, "cy.wikibooks.org" -//, "cy.wikiquote.org" -//, "cy.wikisource.org" -//, "cy.wiktionary.org" -//, "da.wikipedia.org" -//, "da.wikibooks.org" -//, "da.wikiquote.org" -//, "da.wikisource.org" -//, "da.wiktionary.org" -//, "de.wikipedia.org" -//, "de.wikibooks.org" -//, "de.wikinews.org" -//, "de.wikiquote.org" -//, "de.wikisource.org" -//, "de.wikiversity.org" -//, "de.wikivoyage.org" -//, "de.wiktionary.org" -//, "diq.wikipedia.org" -//, "dsb.wikipedia.org" -//, "dv.wikipedia.org" -//, "dv.wiktionary.org" -//, "dz.wikipedia.org" -//, "dz.wiktionary.org" -//, "ee.wikipedia.org" -//, "el.wikipedia.org" -//, "el.wikibooks.org" -//, "el.wikinews.org" -//, "el.wikiquote.org" -//, "el.wikisource.org" -//, "el.wikiversity.org" -//, "el.wikivoyage.org" -//, "el.wiktionary.org" -//, "eml.wikipedia.org" -//, "en.wikipedia.org" -//, "en.wikibooks.org" -//, "en.wikinews.org" -//, "en.wikiquote.org" -//, "en.wikisource.org" -//, "en.wikiversity.org" -//, "en.wikivoyage.org" -//, "en.wiktionary.org" -//, "eo.wikipedia.org" -//, "eo.wikibooks.org" -//, "eo.wikinews.org" -//, "eo.wikiquote.org" -//, "eo.wikisource.org" -//, "eo.wiktionary.org" -//, "es.wikipedia.org" -//, "es.wikibooks.org" -//, "es.wikinews.org" -//, "es.wikiquote.org" -//, "es.wikisource.org" -//, "es.wikiversity.org" -//, "es.wikivoyage.org" -//, "es.wiktionary.org" -//, "et.wikipedia.org" -//, "et.wikibooks.org" -//, "et.wikiquote.org" -//, "et.wikisource.org" -//, "et.wiktionary.org" -//, "eu.wikipedia.org" -//, "eu.wikibooks.org" -//, "eu.wikiquote.org" -//, "eu.wiktionary.org" -//, "ext.wikipedia.org" -//, "fa.wikipedia.org" -//, "fa.wikibooks.org" -//, "fa.wikinews.org" -//, "fa.wikiquote.org" -//, "fa.wikisource.org" -//, "fa.wiktionary.org" -//, "ff.wikipedia.org" -//, "fiu-vro.wikipedia.org" -//, "fi.wikipedia.org" -//, "fi.wikibooks.org" -//, "fi.wikinews.org" -//, "fi.wikiquote.org" -//, "fi.wikisource.org" -//, "fi.wikiversity.org" -//, "fi.wiktionary.org" -//, "fj.wikipedia.org" -//, "fj.wiktionary.org" -//, "wikimediafoundation.org" -//, "fo.wikipedia.org" -//, "fo.wikisource.org" -//, "fo.wiktionary.org" -//, "frp.wikipedia.org" -//, "frr.wikipedia.org" -//, "fr.wikipedia.org" -//, "fr.wikibooks.org" -//, "fr.wikinews.org" -//, "fr.wikiquote.org" -//, "fr.wikisource.org" -//, "fr.wikiversity.org" -//, "fr.wikivoyage.org" -//, "fr.wiktionary.org" -//, "fur.wikipedia.org" -//, "fy.wikipedia.org" -//, "fy.wikibooks.org" -//, "fy.wiktionary.org" -//, "gag.wikipedia.org" -//, "gan.wikipedia.org" -//, "ga.wikipedia.org" -//, "ga.wikibooks.org" -//, "ga.wikiquote.org" -//, "ga.wiktionary.org" -//, "gd.wikipedia.org" -//, "gd.wiktionary.org" -//, "glk.wikipedia.org" -//, "gl.wikipedia.org" -//, "gl.wikibooks.org" -//, "gl.wikiquote.org" -//, "gl.wikisource.org" -//, "gl.wiktionary.org" -//, "gn.wikipedia.org" -//, "gn.wikibooks.org" -//, "gn.wiktionary.org" -//, "got.wikipedia.org" -//, "got.wikibooks.org" -//, "gu.wikipedia.org" -//, "gu.wikibooks.org" -//, "gu.wikiquote.org" -//, "gu.wikisource.org" -//, "gu.wiktionary.org" -//, "gv.wikipedia.org" -//, "gv.wiktionary.org" -//, "hak.wikipedia.org" -//, "ha.wikipedia.org" -//, "ha.wiktionary.org" -//, "haw.wikipedia.org" -//, "he.wikipedia.org" -//, "he.wikibooks.org" -//, "he.wikinews.org" -//, "he.wikiquote.org" -//, "he.wikisource.org" -//, "he.wikivoyage.org" -//, "he.wiktionary.org" -//, "hif.wikipedia.org" -//, "hi.wikipedia.org" -//, "hi.wikibooks.org" -//, "hi.wikiquote.org" -//, "hi.wiktionary.org" -//, "ho.wikipedia.org" -//, "hr.wikipedia.org" -//, "hr.wikibooks.org" -//, "hr.wikiquote.org" -//, "hr.wikisource.org" -//, "hr.wiktionary.org" -//, "hsb.wikipedia.org" -//, "hsb.wiktionary.org" -//, "ht.wikipedia.org" -//, "ht.wikisource.org" -//, "hu.wikipedia.org" -//, "hu.wikibooks.org" -//, "hu.wikinews.org" -//, "hu.wikiquote.org" -//, "hu.wikisource.org" -//, "hu.wiktionary.org" -//, "hy.wikipedia.org" -//, "hy.wikibooks.org" -//, "hy.wikiquote.org" -//, "hy.wikisource.org" -//, "hy.wiktionary.org" -//, "hz.wikipedia.org" -//, "ia.wikipedia.org" -//, "ia.wikibooks.org" -//, "ia.wiktionary.org" -//, "id.wikipedia.org" -//, "id.wikibooks.org" -//, "id.wikiquote.org" -//, "id.wikisource.org" -//, "id.wiktionary.org" -//, "ie.wikipedia.org" -//, "ie.wikibooks.org" -//, "ie.wiktionary.org" -//, "ig.wikipedia.org" -//, "ii.wikipedia.org" -//, "ik.wikipedia.org" -//, "ik.wiktionary.org" -//, "ilo.wikipedia.org" -//, "incubator.wikimedia.org" -//, "io.wikipedia.org" -//, "io.wiktionary.org" -//, "is.wikipedia.org" -//, "is.wikibooks.org" -//, "is.wikiquote.org" -//, "is.wikisource.org" -//, "is.wiktionary.org" -//, "it.wikipedia.org" -//, "it.wikibooks.org" -//, "it.wikinews.org" -//, "it.wikiquote.org" -//, "it.wikisource.org" -//, "it.wikiversity.org" -//, "it.wikivoyage.org" -//, "it.wiktionary.org" -//, "iu.wikipedia.org" -//, "iu.wiktionary.org" -//, "ja.wikipedia.org" -//, "ja.wikibooks.org" -//, "ja.wikinews.org" -//, "ja.wikiquote.org" -//, "ja.wikisource.org" -//, "ja.wikiversity.org" -//, "ja.wiktionary.org" -//, "jbo.wikipedia.org" -//, "jbo.wiktionary.org" -//, "jv.wikipedia.org" -//, "jv.wiktionary.org" -//, "kaa.wikipedia.org" -//, "kab.wikipedia.org" -//, "ka.wikipedia.org" -//, "ka.wikibooks.org" -//, "ka.wikiquote.org" -//, "ka.wiktionary.org" -//, "kbd.wikipedia.org" -//, "kg.wikipedia.org" -//, "ki.wikipedia.org" -//, "kj.wikipedia.org" -//, "kk.wikipedia.org" -//, "kk.wikibooks.org" -//, "kk.wikiquote.org" -//, "kk.wiktionary.org" -//, "kl.wikipedia.org" -//, "kl.wiktionary.org" -//, "km.wikipedia.org" -//, "km.wikibooks.org" -//, "km.wiktionary.org" -//, "kn.wikipedia.org" -//, "kn.wikibooks.org" -//, "kn.wikiquote.org" -//, "kn.wikisource.org" -//, "kn.wiktionary.org" -//, "koi.wikipedia.org" -//, "ko.wikipedia.org" -//, "ko.wikibooks.org" -//, "ko.wikinews.org" -//, "ko.wikiquote.org" -//, "ko.wikisource.org" -//, "ko.wikiversity.org" -//, "ko.wiktionary.org" -//, "krc.wikipedia.org" -//, "kr.wikipedia.org" -//, "kr.wikiquote.org" -//, "ksh.wikipedia.org" -//, "ks.wikipedia.org" -//, "ks.wikibooks.org" -//, "ks.wikiquote.org" -//, "ks.wiktionary.org" -//, "ku.wikipedia.org" -//, "ku.wikibooks.org" -//, "ku.wikiquote.org" -//, "ku.wiktionary.org" -//, "kv.wikipedia.org" -//, "kw.wikipedia.org" -//, "kw.wikiquote.org" -//, "kw.wiktionary.org" -//, "ky.wikipedia.org" -//, "ky.wikibooks.org" -//, "ky.wikiquote.org" -//, "ky.wiktionary.org" -//, "lad.wikipedia.org" -//, "la.wikipedia.org" -//, "la.wikibooks.org" -//, "la.wikiquote.org" -//, "la.wikisource.org" -//, "la.wiktionary.org" -//, "lbe.wikipedia.org" -//, "lb.wikipedia.org" -//, "lb.wikibooks.org" -//, "lb.wikiquote.org" -//, "lb.wiktionary.org" -//, "lez.wikipedia.org" -//, "lg.wikipedia.org" -//, "lij.wikipedia.org" -//, "li.wikipedia.org" -//, "li.wikibooks.org" -//, "li.wikiquote.org" -//, "li.wikisource.org" -//, "li.wiktionary.org" -//, "lmo.wikipedia.org" -//, "ln.wikipedia.org" -//, "ln.wikibooks.org" -//, "ln.wiktionary.org" -//, "lo.wikipedia.org" -//, "lo.wiktionary.org" -//, "ltg.wikipedia.org" -//, "lt.wikipedia.org" -//, "lt.wikibooks.org" -//, "lt.wikiquote.org" -//, "lt.wikisource.org" -//, "lt.wiktionary.org" -//, "lv.wikipedia.org" -//, "lv.wikibooks.org" -//, "lv.wiktionary.org" -//, "map-bms.wikipedia.org" -//, "mdf.wikipedia.org" -//, "www.mediawiki.org" -//, "meta.wikimedia.org" -//, "mg.wikipedia.org" -//, "mg.wikibooks.org" -//, "mg.wiktionary.org" -//, "mhr.wikipedia.org" -//, "mh.wikipedia.org" -//, "mh.wiktionary.org" -//, "min.wikipedia.org" -//, "mi.wikipedia.org" -//, "mi.wikibooks.org" -//, "mi.wiktionary.org" -//, "mk.wikipedia.org" -//, "mk.wikibooks.org" -//, "mk.wikisource.org" -//, "mk.wiktionary.org" -//, "ml.wikipedia.org" -//, "ml.wikibooks.org" -//, "ml.wikiquote.org" -//, "ml.wikisource.org" -//, "ml.wiktionary.org" -//, "mn.wikipedia.org" -//, "mn.wikibooks.org" -//, "mn.wiktionary.org" -//, "mo.wikipedia.org" -//, "mo.wiktionary.org" -//, "mrj.wikipedia.org" -//, "mr.wikipedia.org" -//, "mr.wikibooks.org" -//, "mr.wikiquote.org" -//, "mr.wikisource.org" -//, "mr.wiktionary.org" -//, "ms.wikipedia.org" -//, "ms.wikibooks.org" -//, "ms.wiktionary.org" -//, "mt.wikipedia.org" -//, "mt.wiktionary.org" -//, "mus.wikipedia.org" -//, "mwl.wikipedia.org" -//, "myv.wikipedia.org" -//, "my.wikipedia.org" -//, "my.wikibooks.org" -//, "my.wiktionary.org" -//, "mzn.wikipedia.org" -//, "nah.wikipedia.org" -//, "nah.wikibooks.org" -//, "nah.wiktionary.org" -//, "nap.wikipedia.org" -//, "na.wikipedia.org" -//, "na.wikibooks.org" -//, "na.wikiquote.org" -//, "na.wiktionary.org" -//, "nds-nl.wikipedia.org" -//, "nds.wikipedia.org" -//, "nds.wikibooks.org" -//, "nds.wikiquote.org" -//, "nds.wiktionary.org" -//, "ne.wikipedia.org" -//, "ne.wikibooks.org" -//, "ne.wiktionary.org" -//, "new.wikipedia.org" -//, "ng.wikipedia.org" -//, "nl.wikipedia.org" -//, "nl.wikibooks.org" -//, "nl.wikinews.org" -//, "nl.wikiquote.org" -//, "nl.wikisource.org" -//, "nl.wikivoyage.org" -//, "nl.wiktionary.org" -//, "nn.wikipedia.org" -//, "nn.wikiquote.org" -//, "nn.wiktionary.org" -//, "nov.wikipedia.org" -//, "no.wikipedia.org" -//, "no.wikibooks.org" -//, "no.wikinews.org" -//, "no.wikiquote.org" -//, "no.wikisource.org" -//, "no.wiktionary.org" -//, "nrm.wikipedia.org" -//, "nso.wikipedia.org" -//, "nv.wikipedia.org" -//, "ny.wikipedia.org" -//, "oc.wikipedia.org" -//, "oc.wikibooks.org" -//, "oc.wiktionary.org" -//, "om.wikipedia.org" -//, "om.wiktionary.org" -//, "or.wikipedia.org" -//, "or.wiktionary.org" -//, "os.wikipedia.org" -//, "pag.wikipedia.org" -//, "pam.wikipedia.org" -//, "pap.wikipedia.org" -//, "pa.wikipedia.org" -//, "pa.wikibooks.org" -//, "pa.wiktionary.org" -//, "pcd.wikipedia.org" -//, "pdc.wikipedia.org" -//, "pfl.wikipedia.org" -//, "pih.wikipedia.org" -//, "pi.wikipedia.org" -//, "pi.wiktionary.org" -//, "pl.wikipedia.org" -//, "pl.wikibooks.org" -//, "pl.wikinews.org" -//, "pl.wikiquote.org" -//, "pl.wikisource.org" -//, "pl.wikivoyage.org" -//, "pl.wiktionary.org" -//, "pms.wikipedia.org" -//, "pnb.wikipedia.org" -//, "pnb.wiktionary.org" -//, "pnt.wikipedia.org" -//, "ps.wikipedia.org" -//, "ps.wikibooks.org" -//, "ps.wiktionary.org" -//, "pt.wikipedia.org" -//, "pt.wikibooks.org" -//, "pt.wikinews.org" -//, "pt.wikiquote.org" -//, "pt.wikisource.org" -//, "pt.wikiversity.org" -//, "pt.wikivoyage.org" -//, "pt.wiktionary.org" -//, "qu.wikipedia.org" -//, "qu.wikibooks.org" -//, "qu.wikiquote.org" -//, "qu.wiktionary.org" -//, "rm.wikipedia.org" -//, "rm.wikibooks.org" -//, "rm.wiktionary.org" -//, "rmy.wikipedia.org" -//, "rn.wikipedia.org" -//, "rn.wiktionary.org" -//, "roa-rup.wikipedia.org" -//, "roa-rup.wiktionary.org" -//, "roa-tara.wikipedia.org" -//, "ro.wikipedia.org" -//, "ro.wikibooks.org" -//, "ro.wikinews.org" -//, "ro.wikiquote.org" -//, "ro.wikisource.org" -//, "ro.wikivoyage.org" -//, "ro.wiktionary.org" -//, "rue.wikipedia.org" -//, "ru.wikipedia.org" -//, "ru.wikibooks.org" -//, "ru.wikinews.org" -//, "ru.wikiquote.org" -//, "ru.wikisource.org" -//, "ru.wikiversity.org" -//, "ru.wikivoyage.org" -//, "ru.wiktionary.org" -//, "rw.wikipedia.org" -//, "rw.wiktionary.org" -//, "sah.wikipedia.org" -//, "sah.wikisource.org" -//, "sa.wikipedia.org" -//, "sa.wikibooks.org" -//, "sa.wikiquote.org" -//, "sa.wikisource.org" -//, "sa.wiktionary.org" -//, "scn.wikipedia.org" -//, "scn.wiktionary.org" -//, "sco.wikipedia.org" -//, "sc.wikipedia.org" -//, "sc.wiktionary.org" -//, "sd.wikipedia.org" -//, "sd.wikinews.org" -//, "sd.wiktionary.org" -//, "se.wikipedia.org" -//, "se.wikibooks.org" -//, "sg.wikipedia.org" -//, "sg.wiktionary.org" -//, "sh.wikipedia.org" -//, "sh.wiktionary.org" -//, "simple.wikipedia.org" -//, "simple.wikibooks.org" -//, "simple.wikiquote.org" -//, "simple.wiktionary.org" -//, "si.wikipedia.org" -//, "si.wikibooks.org" -//, "si.wiktionary.org" -//, "sk.wikipedia.org" -//, "sk.wikibooks.org" -//, "sk.wikiquote.org" -//, "sk.wikisource.org" -//, "sk.wiktionary.org" -//, "sl.wikipedia.org" -//, "sl.wikibooks.org" -//, "sl.wikiquote.org" -//, "sl.wikisource.org" -//, "sl.wikiversity.org" -//, "sl.wiktionary.org" -//, "sm.wikipedia.org" -//, "sm.wiktionary.org" -//, "sn.wikipedia.org" -//, "sn.wiktionary.org" -//, "so.wikipedia.org" -//, "so.wiktionary.org" -//, "species.wikimedia.org" -//, "sq.wikipedia.org" -//, "sq.wikibooks.org" -//, "sq.wikinews.org" -//, "sq.wikiquote.org" -//, "sq.wiktionary.org" -//, "srn.wikipedia.org" -//, "sr.wikipedia.org" -//, "sr.wikibooks.org" -//, "sr.wikinews.org" -//, "sr.wikiquote.org" -//, "sr.wikisource.org" -//, "sr.wiktionary.org" -//, "ss.wikipedia.org" -//, "ss.wiktionary.org" -//, "stq.wikipedia.org" -//, "st.wikipedia.org" -//, "st.wiktionary.org" -//, "su.wikipedia.org" -//, "su.wikibooks.org" -//, "su.wikiquote.org" -//, "su.wiktionary.org" -//, "sv.wikipedia.org" -//, "sv.wikibooks.org" -//, "sv.wikinews.org" -//, "sv.wikiquote.org" -//, "sv.wikisource.org" -//, "sv.wikiversity.org" -//, "sv.wikivoyage.org" -//, "sv.wiktionary.org" -//, "sw.wikipedia.org" -//, "sw.wikibooks.org" -//, "sw.wiktionary.org" -//, "szl.wikipedia.org" -//, "ta.wikipedia.org" -//, "ta.wikibooks.org" -//, "ta.wikinews.org" -//, "ta.wikiquote.org" -//, "ta.wikisource.org" -//, "ta.wiktionary.org" -//, "tet.wikipedia.org" -//, "te.wikipedia.org" -//, "te.wikibooks.org" -//, "te.wikiquote.org" -//, "te.wikisource.org" -//, "te.wiktionary.org" -//, "tg.wikipedia.org" -//, "tg.wikibooks.org" -//, "tg.wiktionary.org" -//, "th.wikipedia.org" -//, "th.wikibooks.org" -//, "th.wikinews.org" -//, "th.wikiquote.org" -//, "th.wikisource.org" -//, "th.wiktionary.org" -//, "ti.wikipedia.org" -//, "ti.wiktionary.org" -//, "tk.wikipedia.org" -//, "tk.wikibooks.org" -//, "tk.wikiquote.org" -//, "tk.wiktionary.org" -//, "tl.wikipedia.org" -//, "tl.wikibooks.org" -//, "tl.wiktionary.org" -//, "tn.wikipedia.org" -//, "tn.wiktionary.org" -//, "to.wikipedia.org" -//, "to.wiktionary.org" -//, "tpi.wikipedia.org" -//, "tpi.wiktionary.org" -//, "tr.wikipedia.org" -//, "tr.wikibooks.org" -//, "tr.wikinews.org" -//, "tr.wikiquote.org" -//, "tr.wikisource.org" -//, "tr.wiktionary.org" -//, "ts.wikipedia.org" -//, "ts.wiktionary.org" -//, "tt.wikipedia.org" -//, "tt.wikibooks.org" -//, "tt.wikiquote.org" -//, "tt.wiktionary.org" -//, "tum.wikipedia.org" -//, "tw.wikipedia.org" -//, "tw.wiktionary.org" -//, "tyv.wikipedia.org" -//, "ty.wikipedia.org" -//, "udm.wikipedia.org" -//, "ug.wikipedia.org" -//, "ug.wikibooks.org" -//, "ug.wikiquote.org" -//, "ug.wiktionary.org" -//, "uk.wikipedia.org" -//, "uk.wikibooks.org" -//, "uk.wikinews.org" -//, "uk.wikiquote.org" -//, "uk.wikisource.org" -//, "uk.wikivoyage.org" -//, "uk.wiktionary.org" -//, "ur.wikipedia.org" -//, "ur.wikibooks.org" -//, "ur.wikiquote.org" -//, "ur.wiktionary.org" -//, "uz.wikipedia.org" -//, "uz.wikibooks.org" -//, "uz.wikiquote.org" -//, "uz.wiktionary.org" -//, "vec.wikipedia.org" -//, "vec.wikisource.org" -//, "vec.wiktionary.org" -//, "vep.wikipedia.org" -//, "ve.wikipedia.org" -//, "vi.wikipedia.org" -//, "vi.wikibooks.org" -//, "vi.wikiquote.org" -//, "vi.wikisource.org" -//, "vi.wikivoyage.org" -//, "vi.wiktionary.org" -//, "vls.wikipedia.org" -//, "vo.wikipedia.org" -//, "vo.wikibooks.org" -//, "vo.wikiquote.org" -//, "vo.wiktionary.org" -//, "war.wikipedia.org" -//, "wa.wikipedia.org" -//, "wa.wikibooks.org" -//, "wa.wiktionary.org" -//, "www.wikidata.org" -//, "wo.wikipedia.org" -//, "wo.wikiquote.org" -//, "wo.wiktionary.org" -//, "wuu.wikipedia.org" -//, "xal.wikipedia.org" -//, "xh.wikipedia.org" -//, "xh.wikibooks.org" -//, "xh.wiktionary.org" -//, "xmf.wikipedia.org" -//, "yi.wikipedia.org" -//, "yi.wikisource.org" -//, "yi.wiktionary.org" -//, "yo.wikipedia.org" -//, "yo.wikibooks.org" -//, "yo.wiktionary.org" -//, "za.wikipedia.org" -//, "za.wikibooks.org" -//, "za.wikiquote.org" -//, "za.wiktionary.org" -//, "zea.wikipedia.org" -//, "zh-classical.wikipedia.org" -//, "zh-min-nan.wikipedia.org" -//, "zh-min-nan.wikibooks.org" -//, "zh-min-nan.wikiquote.org" -//, "zh-min-nan.wikisource.org" -//, "zh-min-nan.wiktionary.org" -//, "zh-yue.wikipedia.org" -//, "zh.wikipedia.org" -//, "zh.wikibooks.org" -//, "zh.wikinews.org" -//, "zh.wikiquote.org" -//, "zh.wikisource.org" -//, "zh.wikivoyage.org" -//, "zh.wiktionary.org" -//, "zu.wikipedia.org" -//, "zu.wikibooks.org" -//, "zu.wiktionary.org" +//{ "simple.wikipedia.org" //}; +{ "aa.wikibooks.org" +, "aa.wikipedia.org" +, "aa.wiktionary.org" +, "ab.wikipedia.org" +, "ab.wiktionary.org" +, "ace.wikipedia.org" +, "af.wikibooks.org" +, "af.wikipedia.org" +, "af.wikiquote.org" +, "af.wiktionary.org" +, "ak.wikibooks.org" +, "ak.wikipedia.org" +, "ak.wiktionary.org" +, "als.wikibooks.org" +, "als.wikipedia.org" +, "als.wikiquote.org" +, "als.wiktionary.org" +, "am.wikipedia.org" +, "am.wikiquote.org" +, "am.wiktionary.org" +, "an.wikipedia.org" +, "an.wiktionary.org" +, "ang.wikibooks.org" +, "ang.wikipedia.org" +, "ang.wikiquote.org" +, "ang.wikisource.org" +, "ang.wiktionary.org" +, "ar.wikibooks.org" +, "ar.wikinews.org" +, "ar.wikipedia.org" +, "ar.wikiquote.org" +, "ar.wikisource.org" +, "ar.wikiversity.org" +, "ar.wiktionary.org" +, "arc.wikipedia.org" +, "arz.wikipedia.org" +, "as.wikibooks.org" +, "as.wikipedia.org" +, "as.wikisource.org" +, "as.wiktionary.org" +, "ast.wikibooks.org" +, "ast.wikipedia.org" +, "ast.wikiquote.org" +, "ast.wiktionary.org" +, "av.wikipedia.org" +, "av.wiktionary.org" +, "ay.wikibooks.org" +, "ay.wikipedia.org" +, "ay.wiktionary.org" +, "az.wikibooks.org" +, "az.wikipedia.org" +, "az.wikiquote.org" +, "az.wikisource.org" +, "az.wiktionary.org" +, "ba.wikibooks.org" +, "ba.wikipedia.org" +, "bar.wikipedia.org" +, "bat-smg.wikipedia.org" +, "bcl.wikipedia.org" +, "be-x-old.wikipedia.org" +, "be.wikibooks.org" +, "be.wikipedia.org" +, "be.wikiquote.org" +, "be.wikisource.org" +, "be.wiktionary.org" +, "bg.wikibooks.org" +, "bg.wikinews.org" +, "bg.wikipedia.org" +, "bg.wikiquote.org" +, "bg.wikisource.org" +, "bg.wiktionary.org" +, "bh.wikipedia.org" +, "bh.wiktionary.org" +, "bi.wikibooks.org" +, "bi.wikipedia.org" +, "bi.wiktionary.org" +, "bjn.wikipedia.org" +, "bm.wikibooks.org" +, "bm.wikipedia.org" +, "bm.wikiquote.org" +, "bm.wiktionary.org" +, "bn.wikibooks.org" +, "bn.wikipedia.org" +, "bn.wikisource.org" +, "bn.wiktionary.org" +, "bo.wikibooks.org" +, "bo.wikipedia.org" +, "bo.wiktionary.org" +, "bpy.wikipedia.org" +, "br.wikipedia.org" +, "br.wikiquote.org" +, "br.wikisource.org" +, "br.wiktionary.org" +, "bs.wikibooks.org" +, "bs.wikinews.org" +, "bs.wikipedia.org" +, "bs.wikiquote.org" +, "bs.wikisource.org" +, "bs.wiktionary.org" +, "bug.wikipedia.org" +, "bxr.wikipedia.org" +, "ca.wikibooks.org" +, "ca.wikinews.org" +, "ca.wikipedia.org" +, "ca.wikiquote.org" +, "ca.wikisource.org" +, "ca.wiktionary.org" +, "cbk-zam.wikipedia.org" +, "cdo.wikipedia.org" +, "ce.wikipedia.org" +, "ceb.wikipedia.org" +, "ch.wikibooks.org" +, "ch.wikipedia.org" +, "ch.wiktionary.org" +, "cho.wikipedia.org" +, "chr.wikipedia.org" +, "chr.wiktionary.org" +, "chy.wikipedia.org" +, "ckb.wikipedia.org" +, "co.wikibooks.org" +, "co.wikipedia.org" +, "co.wikiquote.org" +, "co.wiktionary.org" +, "commons.wikimedia.org" +, "cr.wikipedia.org" +, "cr.wikiquote.org" +, "cr.wiktionary.org" +, "crh.wikipedia.org" +, "cs.wikibooks.org" +, "cs.wikinews.org" +, "cs.wikipedia.org" +, "cs.wikiquote.org" +, "cs.wikisource.org" +, "cs.wikiversity.org" +, "cs.wiktionary.org" +, "csb.wikipedia.org" +, "csb.wiktionary.org" +, "cu.wikipedia.org" +, "cv.wikibooks.org" +, "cv.wikipedia.org" +, "cy.wikibooks.org" +, "cy.wikipedia.org" +, "cy.wikiquote.org" +, "cy.wikisource.org" +, "cy.wiktionary.org" +, "da.wikibooks.org" +, "da.wikipedia.org" +, "da.wikiquote.org" +, "da.wikisource.org" +, "da.wiktionary.org" +, "de.wikibooks.org" +, "de.wikinews.org" +, "de.wikipedia.org" +, "de.wikiquote.org" +, "de.wikisource.org" +, "de.wikiversity.org" +, "de.wikivoyage.org" +, "de.wiktionary.org" +, "diq.wikipedia.org" +, "dsb.wikipedia.org" +, "dv.wikipedia.org" +, "dv.wiktionary.org" +, "dz.wikipedia.org" +, "dz.wiktionary.org" +, "ee.wikipedia.org" +, "el.wikibooks.org" +, "el.wikinews.org" +, "el.wikipedia.org" +, "el.wikiquote.org" +, "el.wikisource.org" +, "el.wikiversity.org" +, "el.wikivoyage.org" +, "el.wiktionary.org" +, "eml.wikipedia.org" +, "en.wikibooks.org" +, "en.wikinews.org" +, "en.wikipedia.org" +, "en.wikiquote.org" +, "en.wikisource.org" +, "en.wikiversity.org" +, "en.wikivoyage.org" +, "en.wiktionary.org" +, "eo.wikibooks.org" +, "eo.wikinews.org" +, "eo.wikipedia.org" +, "eo.wikiquote.org" +, "eo.wikisource.org" +, "eo.wiktionary.org" +, "es.wikibooks.org" +, "es.wikinews.org" +, "es.wikipedia.org" +, "es.wikiquote.org" +, "es.wikisource.org" +, "es.wikiversity.org" +, "es.wikivoyage.org" +, "es.wiktionary.org" +, "et.wikibooks.org" +, "et.wikipedia.org" +, "et.wikiquote.org" +, "et.wikisource.org" +, "et.wiktionary.org" +, "eu.wikibooks.org" +, "eu.wikipedia.org" +, "eu.wikiquote.org" +, "eu.wiktionary.org" +, "ext.wikipedia.org" +, "fa.wikibooks.org" +, "fa.wikinews.org" +, "fa.wikipedia.org" +, "fa.wikiquote.org" +, "fa.wikisource.org" +, "fa.wikivoyage.org" +, "fa.wiktionary.org" +, "ff.wikipedia.org" +, "fi.wikibooks.org" +, "fi.wikinews.org" +, "fi.wikipedia.org" +, "fi.wikiquote.org" +, "fi.wikisource.org" +, "fi.wikiversity.org" +, "fi.wiktionary.org" +, "fiu-vro.wikipedia.org" +, "fj.wikipedia.org" +, "fj.wiktionary.org" +, "fo.wikipedia.org" +, "fo.wikisource.org" +, "fo.wiktionary.org" +, "fr.wikibooks.org" +, "fr.wikinews.org" +, "fr.wikipedia.org" +, "fr.wikiquote.org" +, "fr.wikisource.org" +, "fr.wikiversity.org" +, "fr.wikivoyage.org" +, "fr.wiktionary.org" +, "frp.wikipedia.org" +, "frr.wikipedia.org" +, "fur.wikipedia.org" +, "fy.wikibooks.org" +, "fy.wikipedia.org" +, "fy.wiktionary.org" +, "ga.wikibooks.org" +, "ga.wikipedia.org" +, "ga.wikiquote.org" +, "ga.wiktionary.org" +, "gag.wikipedia.org" +, "gan.wikipedia.org" +, "gd.wikipedia.org" +, "gd.wiktionary.org" +, "gl.wikibooks.org" +, "gl.wikipedia.org" +, "gl.wikiquote.org" +, "gl.wikisource.org" +, "gl.wiktionary.org" +, "glk.wikipedia.org" +, "gn.wikibooks.org" +, "gn.wikipedia.org" +, "gn.wiktionary.org" +, "got.wikibooks.org" +, "got.wikipedia.org" +, "gu.wikibooks.org" +, "gu.wikipedia.org" +, "gu.wikiquote.org" +, "gu.wikisource.org" +, "gu.wiktionary.org" +, "gv.wikipedia.org" +, "gv.wiktionary.org" +, "ha.wikipedia.org" +, "ha.wiktionary.org" +, "hak.wikipedia.org" +, "haw.wikipedia.org" +, "he.wikibooks.org" +, "he.wikinews.org" +, "he.wikipedia.org" +, "he.wikiquote.org" +, "he.wikisource.org" +, "he.wikivoyage.org" +, "he.wiktionary.org" +, "hi.wikibooks.org" +, "hi.wikipedia.org" +, "hi.wikiquote.org" +, "hi.wiktionary.org" +, "hif.wikipedia.org" +, "ho.wikipedia.org" +, "hr.wikibooks.org" +, "hr.wikipedia.org" +, "hr.wikiquote.org" +, "hr.wikisource.org" +, "hr.wiktionary.org" +, "hsb.wikipedia.org" +, "hsb.wiktionary.org" +, "ht.wikipedia.org" +, "ht.wikisource.org" +, "hu.wikibooks.org" +, "hu.wikinews.org" +, "hu.wikipedia.org" +, "hu.wikiquote.org" +, "hu.wikisource.org" +, "hu.wiktionary.org" +, "hy.wikibooks.org" +, "hy.wikipedia.org" +, "hy.wikiquote.org" +, "hy.wikisource.org" +, "hy.wiktionary.org" +, "hz.wikipedia.org" +, "ia.wikibooks.org" +, "ia.wikipedia.org" +, "ia.wiktionary.org" +, "id.wikibooks.org" +, "id.wikipedia.org" +, "id.wikiquote.org" +, "id.wikisource.org" +, "id.wiktionary.org" +, "ie.wikibooks.org" +, "ie.wikipedia.org" +, "ie.wiktionary.org" +, "ig.wikipedia.org" +, "ii.wikipedia.org" +, "ik.wikipedia.org" +, "ik.wiktionary.org" +, "ilo.wikipedia.org" +, "incubator.wikimedia.org" +, "io.wikipedia.org" +, "io.wiktionary.org" +, "is.wikibooks.org" +, "is.wikipedia.org" +, "is.wikiquote.org" +, "is.wikisource.org" +, "is.wiktionary.org" +, "it.wikibooks.org" +, "it.wikinews.org" +, "it.wikipedia.org" +, "it.wikiquote.org" +, "it.wikisource.org" +, "it.wikiversity.org" +, "it.wikivoyage.org" +, "it.wiktionary.org" +, "iu.wikipedia.org" +, "iu.wiktionary.org" +, "ja.wikibooks.org" +, "ja.wikinews.org" +, "ja.wikipedia.org" +, "ja.wikiquote.org" +, "ja.wikisource.org" +, "ja.wikiversity.org" +, "ja.wiktionary.org" +, "jbo.wikipedia.org" +, "jbo.wiktionary.org" +, "jv.wikipedia.org" +, "jv.wiktionary.org" +, "ka.wikibooks.org" +, "ka.wikipedia.org" +, "ka.wikiquote.org" +, "ka.wiktionary.org" +, "kaa.wikipedia.org" +, "kab.wikipedia.org" +, "kbd.wikipedia.org" +, "kg.wikipedia.org" +, "ki.wikipedia.org" +, "kj.wikipedia.org" +, "kk.wikibooks.org" +, "kk.wikipedia.org" +, "kk.wikiquote.org" +, "kk.wiktionary.org" +, "kl.wikipedia.org" +, "kl.wiktionary.org" +, "km.wikibooks.org" +, "km.wikipedia.org" +, "km.wiktionary.org" +, "kn.wikibooks.org" +, "kn.wikipedia.org" +, "kn.wikiquote.org" +, "kn.wikisource.org" +, "kn.wiktionary.org" +, "ko.wikibooks.org" +, "ko.wikinews.org" +, "ko.wikipedia.org" +, "ko.wikiquote.org" +, "ko.wikisource.org" +, "ko.wikiversity.org" +, "ko.wiktionary.org" +, "koi.wikipedia.org" +, "kr.wikipedia.org" +, "kr.wikiquote.org" +, "krc.wikipedia.org" +, "ks.wikibooks.org" +, "ks.wikipedia.org" +, "ks.wikiquote.org" +, "ks.wiktionary.org" +, "ksh.wikipedia.org" +, "ku.wikibooks.org" +, "ku.wikipedia.org" +, "ku.wikiquote.org" +, "ku.wiktionary.org" +, "kv.wikipedia.org" +, "kw.wikipedia.org" +, "kw.wikiquote.org" +, "kw.wiktionary.org" +, "ky.wikibooks.org" +, "ky.wikipedia.org" +, "ky.wikiquote.org" +, "ky.wiktionary.org" +, "la.wikibooks.org" +, "la.wikipedia.org" +, "la.wikiquote.org" +, "la.wikisource.org" +, "la.wiktionary.org" +, "lad.wikipedia.org" +, "lb.wikibooks.org" +, "lb.wikipedia.org" +, "lb.wikiquote.org" +, "lb.wiktionary.org" +, "lbe.wikipedia.org" +, "lez.wikipedia.org" +, "lg.wikipedia.org" +, "li.wikibooks.org" +, "li.wikipedia.org" +, "li.wikiquote.org" +, "li.wikisource.org" +, "li.wiktionary.org" +, "lij.wikipedia.org" +, "lmo.wikipedia.org" +, "ln.wikibooks.org" +, "ln.wikipedia.org" +, "ln.wiktionary.org" +, "lo.wikipedia.org" +, "lo.wiktionary.org" +, "lt.wikibooks.org" +, "lt.wikipedia.org" +, "lt.wikiquote.org" +, "lt.wikisource.org" +, "lt.wiktionary.org" +, "ltg.wikipedia.org" +, "lv.wikibooks.org" +, "lv.wikipedia.org" +, "lv.wiktionary.org" +, "mai.wikipedia.org" +, "map-bms.wikipedia.org" +, "mdf.wikipedia.org" +, "meta.wikimedia.org" +, "mg.wikibooks.org" +, "mg.wikipedia.org" +, "mg.wiktionary.org" +, "mh.wikipedia.org" +, "mh.wiktionary.org" +, "mhr.wikipedia.org" +, "mi.wikibooks.org" +, "mi.wikipedia.org" +, "mi.wiktionary.org" +, "min.wikipedia.org" +, "mk.wikibooks.org" +, "mk.wikipedia.org" +, "mk.wikisource.org" +, "mk.wiktionary.org" +, "ml.wikibooks.org" +, "ml.wikipedia.org" +, "ml.wikiquote.org" +, "ml.wikisource.org" +, "ml.wiktionary.org" +, "mn.wikibooks.org" +, "mn.wikipedia.org" +, "mn.wiktionary.org" +, "mo.wikipedia.org" +, "mo.wiktionary.org" +, "mr.wikibooks.org" +, "mr.wikipedia.org" +, "mr.wikiquote.org" +, "mr.wikisource.org" +, "mr.wiktionary.org" +, "mrj.wikipedia.org" +, "ms.wikibooks.org" +, "ms.wikipedia.org" +, "ms.wiktionary.org" +, "mt.wikipedia.org" +, "mt.wiktionary.org" +, "mus.wikipedia.org" +, "mwl.wikipedia.org" +, "my.wikibooks.org" +, "my.wikipedia.org" +, "my.wiktionary.org" +, "myv.wikipedia.org" +, "mzn.wikipedia.org" +, "na.wikibooks.org" +, "na.wikipedia.org" +, "na.wikiquote.org" +, "na.wiktionary.org" +, "nah.wikibooks.org" +, "nah.wikipedia.org" +, "nah.wiktionary.org" +, "nap.wikipedia.org" +, "nds-nl.wikipedia.org" +, "nds.wikibooks.org" +, "nds.wikipedia.org" +, "nds.wikiquote.org" +, "nds.wiktionary.org" +, "ne.wikibooks.org" +, "ne.wikipedia.org" +, "ne.wiktionary.org" +, "new.wikipedia.org" +, "ng.wikipedia.org" +, "nl.wikibooks.org" +, "nl.wikinews.org" +, "nl.wikipedia.org" +, "nl.wikiquote.org" +, "nl.wikisource.org" +, "nl.wikivoyage.org" +, "nl.wiktionary.org" +, "nn.wikipedia.org" +, "nn.wikiquote.org" +, "nn.wiktionary.org" +, "no.wikibooks.org" +, "no.wikinews.org" +, "no.wikipedia.org" +, "no.wikiquote.org" +, "no.wikisource.org" +, "no.wiktionary.org" +, "nov.wikipedia.org" +, "nrm.wikipedia.org" +, "nso.wikipedia.org" +, "nv.wikipedia.org" +, "ny.wikipedia.org" +, "oc.wikibooks.org" +, "oc.wikipedia.org" +, "oc.wiktionary.org" +, "om.wikipedia.org" +, "om.wiktionary.org" +, "or.wikipedia.org" +, "or.wikisource.org" +, "or.wiktionary.org" +, "os.wikipedia.org" +, "pa.wikibooks.org" +, "pa.wikipedia.org" +, "pa.wiktionary.org" +, "pag.wikipedia.org" +, "pam.wikipedia.org" +, "pap.wikipedia.org" +, "pcd.wikipedia.org" +, "pdc.wikipedia.org" +, "pfl.wikipedia.org" +, "pi.wikipedia.org" +, "pi.wiktionary.org" +, "pih.wikipedia.org" +, "pl.wikibooks.org" +, "pl.wikinews.org" +, "pl.wikipedia.org" +, "pl.wikiquote.org" +, "pl.wikisource.org" +, "pl.wikivoyage.org" +, "pl.wiktionary.org" +, "pms.wikipedia.org" +, "pnb.wikipedia.org" +, "pnb.wiktionary.org" +, "pnt.wikipedia.org" +, "ps.wikibooks.org" +, "ps.wikipedia.org" +, "ps.wiktionary.org" +, "pt.wikibooks.org" +, "pt.wikinews.org" +, "pt.wikipedia.org" +, "pt.wikiquote.org" +, "pt.wikisource.org" +, "pt.wikiversity.org" +, "pt.wikivoyage.org" +, "pt.wiktionary.org" +, "qu.wikibooks.org" +, "qu.wikipedia.org" +, "qu.wikiquote.org" +, "qu.wiktionary.org" +, "rm.wikibooks.org" +, "rm.wikipedia.org" +, "rm.wiktionary.org" +, "rmy.wikipedia.org" +, "rn.wikipedia.org" +, "rn.wiktionary.org" +, "ro.wikibooks.org" +, "ro.wikinews.org" +, "ro.wikipedia.org" +, "ro.wikiquote.org" +, "ro.wikisource.org" +, "ro.wikivoyage.org" +, "ro.wiktionary.org" +, "roa-rup.wikipedia.org" +, "roa-rup.wiktionary.org" +, "roa-tara.wikipedia.org" +, "ru.wikibooks.org" +, "ru.wikinews.org" +, "ru.wikipedia.org" +, "ru.wikiquote.org" +, "ru.wikisource.org" +, "ru.wikiversity.org" +, "ru.wikivoyage.org" +, "ru.wiktionary.org" +, "rue.wikipedia.org" +, "rw.wikipedia.org" +, "rw.wiktionary.org" +, "sa.wikibooks.org" +, "sa.wikipedia.org" +, "sa.wikiquote.org" +, "sa.wikisource.org" +, "sa.wiktionary.org" +, "sah.wikipedia.org" +, "sah.wikisource.org" +, "sc.wikipedia.org" +, "sc.wiktionary.org" +, "scn.wikipedia.org" +, "scn.wiktionary.org" +, "sco.wikipedia.org" +, "sd.wikinews.org" +, "sd.wikipedia.org" +, "sd.wiktionary.org" +, "se.wikibooks.org" +, "se.wikipedia.org" +, "sg.wikipedia.org" +, "sg.wiktionary.org" +, "sh.wikipedia.org" +, "sh.wiktionary.org" +, "si.wikibooks.org" +, "si.wikipedia.org" +, "si.wiktionary.org" +, "simple.wikibooks.org" +, "simple.wikipedia.org" +, "simple.wikiquote.org" +, "simple.wiktionary.org" +, "sk.wikibooks.org" +, "sk.wikipedia.org" +, "sk.wikiquote.org" +, "sk.wikisource.org" +, "sk.wiktionary.org" +, "sl.wikibooks.org" +, "sl.wikipedia.org" +, "sl.wikiquote.org" +, "sl.wikisource.org" +, "sl.wikiversity.org" +, "sl.wiktionary.org" +, "sm.wikipedia.org" +, "sm.wiktionary.org" +, "sn.wikipedia.org" +, "sn.wiktionary.org" +, "so.wikipedia.org" +, "so.wiktionary.org" +, "species.wikimedia.org" +, "sq.wikibooks.org" +, "sq.wikinews.org" +, "sq.wikipedia.org" +, "sq.wikiquote.org" +, "sq.wiktionary.org" +, "sr.wikibooks.org" +, "sr.wikinews.org" +, "sr.wikipedia.org" +, "sr.wikiquote.org" +, "sr.wikisource.org" +, "sr.wiktionary.org" +, "srn.wikipedia.org" +, "ss.wikipedia.org" +, "ss.wiktionary.org" +, "st.wikipedia.org" +, "st.wiktionary.org" +, "stq.wikipedia.org" +, "su.wikibooks.org" +, "su.wikipedia.org" +, "su.wikiquote.org" +, "su.wiktionary.org" +, "sv.wikibooks.org" +, "sv.wikinews.org" +, "sv.wikipedia.org" +, "sv.wikiquote.org" +, "sv.wikisource.org" +, "sv.wikiversity.org" +, "sv.wikivoyage.org" +, "sv.wiktionary.org" +, "sw.wikibooks.org" +, "sw.wikipedia.org" +, "sw.wiktionary.org" +, "szl.wikipedia.org" +, "ta.wikibooks.org" +, "ta.wikinews.org" +, "ta.wikipedia.org" +, "ta.wikiquote.org" +, "ta.wikisource.org" +, "ta.wiktionary.org" +, "te.wikibooks.org" +, "te.wikipedia.org" +, "te.wikiquote.org" +, "te.wikisource.org" +, "te.wiktionary.org" +, "tet.wikipedia.org" +, "tg.wikibooks.org" +, "tg.wikipedia.org" +, "tg.wiktionary.org" +, "th.wikibooks.org" +, "th.wikinews.org" +, "th.wikipedia.org" +, "th.wikiquote.org" +, "th.wikisource.org" +, "th.wiktionary.org" +, "ti.wikipedia.org" +, "ti.wiktionary.org" +, "tk.wikibooks.org" +, "tk.wikipedia.org" +, "tk.wikiquote.org" +, "tk.wiktionary.org" +, "tl.wikibooks.org" +, "tl.wikipedia.org" +, "tl.wiktionary.org" +, "tn.wikipedia.org" +, "tn.wiktionary.org" +, "to.wikipedia.org" +, "to.wiktionary.org" +, "tpi.wikipedia.org" +, "tpi.wiktionary.org" +, "tr.wikibooks.org" +, "tr.wikinews.org" +, "tr.wikipedia.org" +, "tr.wikiquote.org" +, "tr.wikisource.org" +, "tr.wiktionary.org" +, "ts.wikipedia.org" +, "ts.wiktionary.org" +, "tt.wikibooks.org" +, "tt.wikipedia.org" +, "tt.wikiquote.org" +, "tt.wiktionary.org" +, "tum.wikipedia.org" +, "tw.wikipedia.org" +, "tw.wiktionary.org" +, "ty.wikipedia.org" +, "tyv.wikipedia.org" +, "udm.wikipedia.org" +, "ug.wikibooks.org" +, "ug.wikipedia.org" +, "ug.wikiquote.org" +, "ug.wiktionary.org" +, "uk.wikibooks.org" +, "uk.wikinews.org" +, "uk.wikipedia.org" +, "uk.wikiquote.org" +, "uk.wikisource.org" +, "uk.wikivoyage.org" +, "uk.wiktionary.org" +, "ur.wikibooks.org" +, "ur.wikipedia.org" +, "ur.wikiquote.org" +, "ur.wiktionary.org" +, "uz.wikibooks.org" +, "uz.wikipedia.org" +, "uz.wikiquote.org" +, "uz.wiktionary.org" +, "ve.wikipedia.org" +, "vec.wikipedia.org" +, "vec.wikisource.org" +, "vec.wiktionary.org" +, "vep.wikipedia.org" +, "vi.wikibooks.org" +, "vi.wikipedia.org" +, "vi.wikiquote.org" +, "vi.wikisource.org" +, "vi.wikivoyage.org" +, "vi.wiktionary.org" +, "vls.wikipedia.org" +, "vo.wikibooks.org" +, "vo.wikipedia.org" +, "vo.wikiquote.org" +, "vo.wiktionary.org" +, "wa.wikibooks.org" +, "wa.wikipedia.org" +, "wa.wiktionary.org" +, "war.wikipedia.org" +, "wikimediafoundation.org" +, "wo.wikipedia.org" +, "wo.wikiquote.org" +, "wo.wiktionary.org" +, "wuu.wikipedia.org" +, "www.mediawiki.org" +, "www.wikidata.org" +, "xal.wikipedia.org" +, "xh.wikibooks.org" +, "xh.wikipedia.org" +, "xh.wiktionary.org" +, "xmf.wikipedia.org" +, "yi.wikipedia.org" +, "yi.wikisource.org" +, "yi.wiktionary.org" +, "yo.wikibooks.org" +, "yo.wikipedia.org" +, "yo.wiktionary.org" +, "za.wikibooks.org" +, "za.wikipedia.org" +, "za.wikiquote.org" +, "za.wiktionary.org" +, "zea.wikipedia.org" +, "zh-classical.wikipedia.org" +, "zh-min-nan.wikibooks.org" +, "zh-min-nan.wikipedia.org" +, "zh-min-nan.wikiquote.org" +, "zh-min-nan.wikisource.org" +, "zh-min-nan.wiktionary.org" +, "zh-yue.wikipedia.org" +, "zh.wikibooks.org" +, "zh.wikinews.org" +, "zh.wikipedia.org" +, "zh.wikiquote.org" +, "zh.wikisource.org" +, "zh.wikivoyage.org" +, "zh.wiktionary.org" +, "zu.wikibooks.org" +, "zu.wikipedia.org" +, "zu.wiktionary.org" +}; } //, "als.wikisource.org" //, "als.wikinews.org" diff --git a/400_xowa/src_240_install/gplx/xowa/Xow_cfg_wiki_core.java b/400_xowa/src_240_install/gplx/xowa/Xow_cfg_wiki_core.java index 761a982e0..c87f46916 100644 --- a/400_xowa/src_240_install/gplx/xowa/Xow_cfg_wiki_core.java +++ b/400_xowa/src_240_install/gplx/xowa/Xow_cfg_wiki_core.java @@ -50,7 +50,7 @@ public class Xow_cfg_wiki_core { } public static void Load_ns_(Xow_ns_mgr ns_mgr, byte[] src) {// 10|1|Template int len = src.length; int pos = 0, fld_bgn = 0, fld_idx = 0, row_bgn = 0; - int cur_id = Int_.MinValue; byte cur_case_match = Byte_.MaxValue_127; byte[] cur_name = Bry_.Empty; + int cur_id = Int_.MinValue; byte cur_case_match = Byte_.Max_value_127; byte[] cur_name = Bry_.Empty; Xol_csv_parser csv_parser = Xol_csv_parser._; while (true) { boolean last = pos == len; @@ -59,7 +59,7 @@ public class Xow_cfg_wiki_core { case Byte_ascii.Pipe: switch (fld_idx) { case 0: cur_id = Bry_.Xto_int_or(src, fld_bgn, pos, Int_.MinValue); if (cur_id == Int_.MinValue) throw Err_mgr._.fmt_(GRP_KEY, "fail.load.id", "failed to load id: ~{0}", String_.new_utf8_(src, fld_bgn, pos)); break; - case 1: cur_case_match = Bry_.Xto_byte_by_int(src, fld_bgn, pos, Byte_.MaxValue_127); if (cur_id == Byte_.MaxValue_127) throw Err_mgr._.fmt_(GRP_KEY, "fail.load.case_match", "failed to load match: ~{0}", String_.new_utf8_(src, fld_bgn, pos)); break; + case 1: cur_case_match = Bry_.Xto_byte_by_int(src, fld_bgn, pos, Byte_.Max_value_127); if (cur_id == Byte_.Max_value_127) throw Err_mgr._.fmt_(GRP_KEY, "fail.load.case_match", "failed to load match: ~{0}", String_.new_utf8_(src, fld_bgn, pos)); break; default: throw Err_.unhandled(fld_idx); } fld_bgn = pos + 1; @@ -70,7 +70,7 @@ public class Xow_cfg_wiki_core { cur_name = csv_parser.Load(src, fld_bgn, pos); ns_mgr.Add_new(cur_id, cur_name, cur_case_match, false); } - cur_id = Int_.MinValue; cur_case_match = Byte_.MaxValue_127; + cur_id = Int_.MinValue; cur_case_match = Byte_.Max_value_127; fld_bgn = pos + 1; fld_idx = 0; row_bgn = fld_bgn; diff --git a/400_xowa/src_310_url/gplx/xowa/Xoa_url.java b/400_xowa/src_310_url/gplx/xowa/Xoa_url.java index b34d832fe..38e7f9667 100644 --- a/400_xowa/src_310_url/gplx/xowa/Xoa_url.java +++ b/400_xowa/src_310_url/gplx/xowa/Xoa_url.java @@ -20,7 +20,8 @@ public class Xoa_url { public byte[] Raw() {return raw;} public Xoa_url Raw_(byte[] v) {raw = v; return this;} private byte[] raw = Bry_.Empty; public byte[] Wiki_bry() {return wiki_bry;} public Xoa_url Wiki_bry_(byte[] v) {wiki_bry = v; return this;} private byte[] wiki_bry; public byte[] Page_bry() {return page_bry;} public Xoa_url Page_bry_(byte[] v) {page_bry = v; return this;} private byte[] page_bry; - public Xow_wiki Wiki() {return wiki;} public Xoa_url Wiki_(Xow_wiki v) {wiki = v; return this;} private Xow_wiki wiki; + public byte[] Anchor_bry() {return anchor_bry;} public Xoa_url Anchor_bry_(byte[] v) {anchor_bry = v; return this;} private byte[] anchor_bry = null; + public String Anchor_str() {return anchor_bry == null ? null : String_.new_utf8_(anchor_bry);} public Gfo_url_arg[] Args() {return args;} public Xoa_url Args_(Gfo_url_arg[] v) {args = v; return this;} private Gfo_url_arg[] args = Gfo_url_arg.Ary_empty; public byte Protocol_tid() {return protocol_tid;} public Xoa_url Protocol_tid_(byte v) {protocol_tid = v; return this;} private byte protocol_tid; public byte[] Protocol_bry() {return protocol_bry;} public Xoa_url Protocol_bry_(byte[] v) {protocol_bry = v; return this;} private byte[] protocol_bry; @@ -34,8 +35,6 @@ public class Xoa_url { else return Bry_.Mid(raw, page_bgn, raw_len);// else take everything after "/wiki/"; } - public byte[] Anchor_bry() {return anchor_bry;} public Xoa_url Anchor_bry_(byte[] v) {anchor_bry = v; return this;} private byte[] anchor_bry = null; - public String Anchor_str() {return anchor_bry == null ? null : String_.new_utf8_(anchor_bry);} public byte[] Use_lang() {return use_lang;} public Xoa_url Use_lang_(byte[] v) {use_lang = v; return this;} private byte[] use_lang; public boolean Redirect_force() {return redirect_force;} public Xoa_url Redirect_force_(boolean v) {redirect_force = v; return this;} private boolean redirect_force; public boolean Search_fulltext() {return search_fulltext;} public Xoa_url Search_fulltext_(boolean v) {search_fulltext = v; return this;} private boolean search_fulltext; @@ -62,19 +61,6 @@ public class Xoa_url { } return false; } - public void Args_fill(OrderedHash trg_args) { - int trg_len = trg_args.Count(); - for (int i = 0; i < trg_len; i++) { - Gfo_url_arg trg_arg = (Gfo_url_arg)trg_args.FetchAt(i); - trg_arg.Val_bry_(null); - } - int src_len = args.length; - for (int i = 0; i < src_len; i++) { - Gfo_url_arg src_arg = args[i]; - Gfo_url_arg trg_arg = (Gfo_url_arg)trg_args.Fetch(src_arg.Key_bry()); - if (trg_arg != null) trg_arg.Val_bry_(src_arg.Val_bry()); - } - } public byte[] Args_all_as_bry() { int args_len = args.length; if (args_len == 0) return Bry_.Empty; diff --git a/400_xowa/src_310_url/gplx/xowa/Xoa_url_arg_hash.java b/400_xowa/src_310_url/gplx/xowa/Xoa_url_arg_hash.java index 121fd2f36..82255d18d 100644 --- a/400_xowa/src_310_url/gplx/xowa/Xoa_url_arg_hash.java +++ b/400_xowa/src_310_url/gplx/xowa/Xoa_url_arg_hash.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa; import gplx.*; public class Xoa_url_arg_hash { - OrderedHash hash = OrderedHash_.new_bry_(); + private OrderedHash hash = OrderedHash_.new_bry_(); public Gfo_url_arg Get_arg(byte[] key) {return (Gfo_url_arg)hash.Fetch(key);} public int Get_val_int_or(byte[] key, int or) { byte[] val_bry = Get_val_bry_or(key, null); if (val_bry == null) return or; diff --git a/400_xowa/src_310_url/gplx/xowa/Xoa_url_parser.java b/400_xowa/src_310_url/gplx/xowa/Xoa_url_parser.java index 3f4da7e7d..f7cc8e7d6 100644 --- a/400_xowa/src_310_url/gplx/xowa/Xoa_url_parser.java +++ b/400_xowa/src_310_url/gplx/xowa/Xoa_url_parser.java @@ -220,7 +220,6 @@ public class Xoa_url_parser { page_bry = ttl.Page_txt(); } } - rv.Wiki_(wiki); rv.Wiki_bry_(wiki.Domain_bry()); rv.Page_bry_(page_bry); return rv; @@ -260,7 +259,6 @@ public class Xoa_url_parser { Xoa_url rv = Xoa_url_parser.Parse_url(app, wiki, bry, 0, bry.length, true); if (app.Wiki_mgr().Wiki_regy().Url_is_invalid_domain(rv)) { // handle lang_code entered; EX: "war" should redirect to "war" article in current wiki, not war.wikipedia.org; DATE:2014-02-07 rv.Page_bry_(rv.Wiki_bry()); - rv.Wiki_(wiki); rv.Wiki_bry_(wiki.Domain_bry()); } return rv; diff --git a/400_xowa/src_400_parser/gplx/xowa/Xop_lnki_tkn_chkr.java b/400_xowa/src_400_parser/gplx/xowa/Xop_lnki_tkn_chkr.java index 0a472035c..0df0752c5 100644 --- a/400_xowa/src_400_parser/gplx/xowa/Xop_lnki_tkn_chkr.java +++ b/400_xowa/src_400_parser/gplx/xowa/Xop_lnki_tkn_chkr.java @@ -21,11 +21,11 @@ public class Xop_lnki_tkn_chkr extends Xop_tkn_chkr_base { @Override public Class TypeOf() {return Xop_lnki_tkn.class;} @Override public byte Tkn_tid() {return Xop_tkn_itm_.Tid_lnki;} public int Ns_id() {return nsId;} public Xop_lnki_tkn_chkr Ns_id_(int v) {nsId = v; return this;} private int nsId = Int_.MinValue; - public byte ImgType() {return imgType;} public Xop_lnki_tkn_chkr ImgType_(byte v) {imgType = v; return this;} private byte imgType = Byte_.MaxValue_127; + public byte ImgType() {return imgType;} public Xop_lnki_tkn_chkr ImgType_(byte v) {imgType = v; return this;} private byte imgType = Byte_.Max_value_127; public int Width() {return width;} public Xop_lnki_tkn_chkr Width_(int v) {width = v; return this;} private int width = Int_.MinValue; public int Height() {return height;} public Xop_lnki_tkn_chkr Height_(int v) {height = v; return this;} private int height = Int_.MinValue; - public byte HAlign() {return hAlign;} public Xop_lnki_tkn_chkr HAlign_(byte v) {hAlign = v; return this;} private byte hAlign = Byte_.MaxValue_127; - public byte VAlign() {return vAlign;} public Xop_lnki_tkn_chkr VAlign_(byte v) {vAlign = v; return this;} private byte vAlign = Byte_.MaxValue_127; + public byte HAlign() {return hAlign;} public Xop_lnki_tkn_chkr HAlign_(byte v) {hAlign = v; return this;} private byte hAlign = Byte_.Max_value_127; + public byte VAlign() {return vAlign;} public Xop_lnki_tkn_chkr VAlign_(byte v) {vAlign = v; return this;} private byte vAlign = Byte_.Max_value_127; public byte Border() {return border;} public Xop_lnki_tkn_chkr Border_(byte v) {border = v; return this;} private byte border = Bool_.__byte; public double Upright() {return upright;} public Xop_lnki_tkn_chkr Upright_(double v) {upright = v; return this;} double upright = Xop_lnki_tkn.Upright_null; public int Thumbtime() {return thumbtime;} public Xop_lnki_tkn_chkr Thumbtime_(int v) {thumbtime = v; return this;} int thumbtime = Xof_doc_thumb.Null_as_int; @@ -39,11 +39,11 @@ public class Xop_lnki_tkn_chkr extends Xop_tkn_chkr_base { @Override public int Chk_hook(Tst_mgr mgr, String path, Object actl_obj, int err) { Xop_lnki_tkn actl = (Xop_lnki_tkn)actl_obj; err += mgr.Tst_val(nsId == Int_.MinValue, path, "nsId", nsId, actl.Ns_id()); - err += mgr.Tst_val(imgType == Byte_.MaxValue_127, path, "imgType", imgType, actl.Lnki_type()); + err += mgr.Tst_val(imgType == Byte_.Max_value_127, path, "imgType", imgType, actl.Lnki_type()); err += mgr.Tst_val(width == Int_.MinValue, path, "width", width, actl.Lnki_w()); err += mgr.Tst_val(height == Int_.MinValue, path, "height", height, actl.Lnki_h()); - err += mgr.Tst_val(hAlign == Byte_.MaxValue_127, path, "halign", hAlign, actl.Align_h()); - err += mgr.Tst_val(vAlign == Byte_.MaxValue_127, path, "valign", vAlign, actl.Align_v()); + err += mgr.Tst_val(hAlign == Byte_.Max_value_127, path, "halign", hAlign, actl.Align_h()); + err += mgr.Tst_val(vAlign == Byte_.Max_value_127, path, "valign", vAlign, actl.Align_v()); err += mgr.Tst_val(border == Bool_.__byte, path, "border", border, actl.Border()); err += mgr.Tst_val(tail_bgn == String_.Pos_neg1, path, "tail_bgn", tail_bgn, actl.Tail_bgn()); err += mgr.Tst_val(tail_end == String_.Pos_neg1, path, "tail_end", tail_end, actl.Tail_end()); diff --git a/400_xowa/src_400_parser/gplx/xowa/Xop_tkn_chkr_base.java b/400_xowa/src_400_parser/gplx/xowa/Xop_tkn_chkr_base.java index a72ef09c3..69164a4d1 100644 --- a/400_xowa/src_400_parser/gplx/xowa/Xop_tkn_chkr_base.java +++ b/400_xowa/src_400_parser/gplx/xowa/Xop_tkn_chkr_base.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa; import gplx.*; public class Xop_tkn_chkr_base implements Tst_chkr { @gplx.Virtual public Class TypeOf() {return Xop_tkn_itm.class;} - @gplx.Virtual public byte Tkn_tid() {return Byte_.MaxValue_127;} + @gplx.Virtual public byte Tkn_tid() {return Byte_.Max_value_127;} public Xop_tkn_chkr_base TypeId_dynamic(int v) {typeId = Xop_tkn_itm_.Tid__names[v]; return this;} private String typeId = null; public int Src_bgn() {return src_bgn;} private int src_bgn = -1; public int Src_end() {return src_end;} private int src_end = -1; diff --git a/400_xowa/src_400_parser/gplx/xowa/Xop_xnde_tkn_chkr.java b/400_xowa/src_400_parser/gplx/xowa/Xop_xnde_tkn_chkr.java index 1d156e587..53be25355 100644 --- a/400_xowa/src_400_parser/gplx/xowa/Xop_xnde_tkn_chkr.java +++ b/400_xowa/src_400_parser/gplx/xowa/Xop_xnde_tkn_chkr.java @@ -42,12 +42,12 @@ public class Xop_xnde_tkn_chkr extends Xop_tkn_chkr_base { class Xop_para_tkn_chkr extends Xop_tkn_chkr_base { @Override public Class TypeOf() {return Xop_para_tkn.class;} @Override public byte Tkn_tid() {return Xop_tkn_itm_.Tid_para;} - public byte Para_end() {return para_end;} public Xop_para_tkn_chkr Para_end_(byte v) {para_end = v; return this;} private byte para_end = Byte_.MaxValue_127; - public byte Para_bgn() {return para_bgn;} public Xop_para_tkn_chkr Para_bgn_(byte v) {para_bgn = v; return this;} private byte para_bgn = Byte_.MaxValue_127; + public byte Para_end() {return para_end;} public Xop_para_tkn_chkr Para_end_(byte v) {para_end = v; return this;} private byte para_end = Byte_.Max_value_127; + public byte Para_bgn() {return para_bgn;} public Xop_para_tkn_chkr Para_bgn_(byte v) {para_bgn = v; return this;} private byte para_bgn = Byte_.Max_value_127; @Override public int Chk_hook(Tst_mgr mgr, String path, Object actl_obj, int err) { Xop_para_tkn actl = (Xop_para_tkn)actl_obj; - err += mgr.Tst_val(para_end == Byte_.MaxValue_127, path, "para_end", para_end, actl.Para_end()); - err += mgr.Tst_val(para_bgn == Byte_.MaxValue_127, path, "para_bgn", para_bgn, actl.Para_bgn()); + err += mgr.Tst_val(para_end == Byte_.Max_value_127, path, "para_end", para_end, actl.Para_end()); + err += mgr.Tst_val(para_bgn == Byte_.Max_value_127, path, "para_bgn", para_bgn, actl.Para_bgn()); return err; } } diff --git a/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_tkn.java b/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_tkn.java index 59f2aef92..3242e95f1 100644 --- a/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_tkn.java +++ b/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_tkn.java @@ -26,7 +26,7 @@ public class Xop_lnki_tkn extends Xop_tkn_itm_base { public int Tail_end() {return tail_end;} public Xop_lnki_tkn Tail_end_(int v) {tail_end = v; return this;} private int tail_end = -1; public byte Border() {return border;} public Xop_lnki_tkn Border_(byte v) {border = v; return this;} private byte border = Bool_.__byte; public byte Align_h() {return align_h;} public Xop_lnki_tkn Align_h_(byte v) {if (align_h == Xop_lnki_align_h.Null) align_h = v; return this;} private byte align_h = Xop_lnki_align_h.Null; - public byte Align_v() {return align_v;} public Xop_lnki_tkn Align_v_(byte v) {align_v = v; return this;} private byte align_v = Byte_.MaxValue_127; + public byte Align_v() {return align_v;} public Xop_lnki_tkn Align_v_(byte v) {align_v = v; return this;} private byte align_v = Byte_.Max_value_127; public int Lnki_w() {return lnki_w;} public Xop_lnki_tkn Lnki_w_(int v) {lnki_w = v; return this;} int lnki_w = Width_null; public int Lnki_h() {return lnki_h;} public Xop_lnki_tkn Lnki_h_(int v) {lnki_h = v; return this;} int lnki_h = Height_null; public byte[] Lnki_cls() {return lnki_cls;} public void Lnki_cls_(byte[] v) {lnki_cls = v;} private byte[] lnki_cls; diff --git a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_tkn.java b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_tkn.java index 6e6370d7f..712f598aa 100644 --- a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_tkn.java +++ b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_tkn.java @@ -105,7 +105,7 @@ public class Xop_xnde_tkn extends Xop_tkn_itm_base implements Xop_tblw_tkn { for (int i = 0; i < subs_len; i++) // always evaluate subs; handle {{{1}}}; DATE:2014-03-03 this.Subs_get(i).Tmpl_evaluate(ctx, src, caller, bfr); bfr.Add_mid(src, tag_close_bgn, tag_close_end); // write tag_end - if (tag_close_bgn == Int_.MinValue) {// xtn is unclosed; add a else rest of page will be gobbled; DATE:2014-11-13 + if (tag_close_bgn == Int_.MinValue) {// xtn is unclosed; add a else rest of page will be gobbled; PAGE:en.w:Provinces_and_territories_of_Canada DATE:2014-11-13 bfr.Add(tag.XtnEndTag()); bfr.Add(Byte_ascii.Gt_bry); } diff --git a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr.java b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr.java index 26a446488..6c34a7e9a 100644 --- a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr.java +++ b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr.java @@ -105,7 +105,7 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { if (ctx.Parse_tid() == Xop_parser_.Parse_tid_page_wiki) { if (ctx_cur_tid_is_tblw_atr_owner) // unknown_tag is occurring inside tblw element (EX: {| style='margin:1em should auto-close; PAGE:en.b:Textbook_of_Psychiatry/Alcoholism_and_Psychoactive_Substance_Use_Disorders DATE:2014-09-05 fxt.Test_html_full_str("abc", "abc"); } + @Test public void Xtn_template() { // PURPOSE: dangling xtns within templates should be auto-closed inside template, not in calling page; PAGE:en.w:Provinces_and_territories_of_Canada DATE:2014-11-13 + fxt.Init_page_create("Template:A", "A"); + fxt.Test_parse_page_all_str(String_.Concat_lines_nl_skip_last + ( "{{A}}" + , " b" // poem should not extend to " b" + ), String_.Concat_lines_nl_skip_last + ( "
" + , "

" + , "A" + , "

" + , "
" // poem ends here + , " b" + )); + } } diff --git a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__nowiki_tst.java b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__nowiki_tst.java index 9a16d7d76..49e80f687 100644 --- a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__nowiki_tst.java +++ b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__nowiki_tst.java @@ -122,4 +122,23 @@ public class Xop_xnde_wkr__nowiki_tst { ( "[[[A]]]" , "[A]"); // was showing up as [[[A]]] } + @Test public void Tblw_tr() { // PURPOSE: dash should be escaped in nowiki PAGE:de.w:Liste_von_Vereinen_und_Vereinigungen_von_Gläubigen_(römisch-katholische_Kirche) DATE:2015-01-08 + fxt.Test_parse_page_all_str(String_.Concat_lines_nl_skip_last + ( "{|" + , "|-" + , "|a" + , "|-" // do not treat as "|-" + , "|}" + ), String_.Concat_lines_nl_skip_last + ( "" + , " " + , " " + , " " + , " " + , "
a" + , " -" // "|" creates ; "-" is rendered literally + , "
" + , "" + )); + } } diff --git a/400_xowa/src_500_tmpl/gplx/xowa/Xot_defn_.java b/400_xowa/src_500_tmpl/gplx/xowa/Xot_defn_.java index 8aae9139c..98055059d 100644 --- a/400_xowa/src_500_tmpl/gplx/xowa/Xot_defn_.java +++ b/400_xowa/src_500_tmpl/gplx/xowa/Xot_defn_.java @@ -28,9 +28,9 @@ public class Xot_defn_ { , Tid_msg = Xol_kwd_grp_.Id_msg , Tid_msgnw = Xol_kwd_grp_.Id_msgnw ; - public static boolean Tid_is_subst(byte v) { + public static boolean Tid_is_substing(byte v) { switch (v) { - case Tid_subst: case Tid_safesubst: return true; + case Tid_subst: return true; // NOTE: safesubst should not return true, else stack overflow; PAGE:en.w:Wikipedia:WikiProject_Celtic_history_and_culture DATE:2015-01-02 default: return false; } } diff --git a/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_mock.java b/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_mock.java index 4c28648fa..0497036d4 100644 --- a/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_mock.java +++ b/400_xowa/src_500_tmpl/gplx/xowa/Xot_invk_mock.java @@ -67,9 +67,9 @@ public class Xot_invk_mock implements Xot_invk { String kv_key_str = kv.Key(); Object kv_key_obj = kv.Key_as_obj(); Arg_nde_tkn_mock nde_tkn = null; - if (ClassAdp_.Eq_typeSafe(kv_key_obj, Int_.ClassOf)) // key is int; EX: 1 => val + if (ClassAdp_.Eq_typeSafe(kv_key_obj, Int_.Cls_ref_type)) // key is int; EX: 1 => val nde_tkn = new Arg_nde_tkn_mock(null, kv.Val_to_str_or_empty()); // add w/o key - else if (ClassAdp_.Eq_typeSafe(kv.Val(), Bool_.ClassOf)) { // val is boolean; EX: key => true || key => false + else if (ClassAdp_.Eq_typeSafe(kv.Val(), Bool_.Cls_ref_type)) { // val is boolean; EX: key => true || key => false boolean kv_val_bool = Bool_.cast_(kv.Val()); if (kv_val_bool) nde_tkn = new Arg_nde_tkn_mock(kv_key_str, "1"); // true => 1 (PHP behavior)