private void Make_trg_bin_file(boolean try_nth, Xodb_tbl_oimg_xfer_itm fsdb, long src_rdr_len) {
   boolean is_solo = trg_mnt_itm.Db_mgr().File__solo_file();
   boolean make = true, use_txn = !is_solo; // solo file; should never open txn
   if (trg_bin_fil != null && use_txn) // pre-existing bin_file;
   trg_bin_fil.Conn().Txn_end(); // close txn before making new db
   int tier_id = fsdb.Lnki_tier_id();
   Xob_bin_db_itm nth_bin_db = bin_db_mgr.Get_nth_by_tier(tier_id);
   if (try_nth) { // try_nth is true; occurs for new runs or changed tier
     if (nth_bin_db.Id() != -1 // nth exists;
         && nth_bin_db.Db_len() + src_rdr_len < trg_bin_db_max) { // if src_rdr_len exceeds
       make = false; // do not make; use existing
     }
   }
   if (make) { // no nth; make it;
     int ns_id = bin_db_mgr.Get_ns_id(tier_id);
     int pt_id = bin_db_mgr.Increment_pt_id(nth_bin_db);
     String new_bin_db_name = bin_db_mgr.Gen_name(wiki.Domain_str(), ns_id, pt_id);
     this.trg_bin_fil = trg_mnt_itm.Bin_mgr().Dbs__make(new_bin_db_name);
     if (!trg_mnt_itm.Db_mgr().File__solo_file()) {
       Fsdb_db_file trg_bin_db =
           trg_mnt_itm.Db_mgr()
               .File__bin_file__at(trg_mnt_itm.Id(), trg_bin_fil.Id(), new_bin_db_name);
       if (!bin_db_mgr.Schema_is_1())
         Fsdb_db_mgr__v2_bldr.Make_cfg_data(
             wiki,
             trg_atr_fil.Url_rel(),
             trg_bin_db,
             Xow_db_file_.Tid__file_data,
             trg_bin_fil.Id() + List_adp_.Base1);
     }
   } else { // nth available; use it
     this.trg_bin_fil = trg_mnt_itm.Bin_mgr().Dbs__get_at(nth_bin_db.Id());
     trg_bin_fil.Bin_len_(nth_bin_db.Db_len());
   }
   if (use_txn) trg_bin_fil.Conn().Txn_bgn("bldr__fsdb_make__trg_bin_fil");
 }
 @Override
 public void Cmd_run() {
   Init_bldr_bmks();
   this.time_bgn = System_.Ticks();
   int total_pending = Xob_xfer_regy_tbl.Select_total_pending(bldr_conn);
   // if (total_pending > 250000 && src_bin_mgr__fsdb_version == null)
   usr_dlg.Note_many("", "", "total pending: ~{0}", total_pending);
   List_adp list = List_adp_.New();
   boolean loop = true;
   while (loop) {
     byte rslt = Select_fsdb_itms(list);
     switch (rslt) {
       case Select_rv_stop:
         if (bin_db_mgr.Tier_id_is_last(tier_id_val)) loop = false;
         else {
           ++tier_id_val;
           page_id_val = 0;
           continue;
         }
         break;
       case Select_rv_next_page:
         ++page_id_val;
         lnki_id_val = 0;
         continue;
       case Select_rv_process:
         break;
     }
     if (!loop) break; // no more ttls found
     int len = list.Count();
     usr_dlg.Prog_many("", "", "fetched pages: ~{0}", len);
     for (int i = 0; i < len; ++i) {
       Xodb_tbl_oimg_xfer_itm fsdb = (Xodb_tbl_oimg_xfer_itm) list.Get_at(i);
       Download_itm(fsdb);
       if (exit_now
           || exec_count >= exec_count_max
           || exec_fail >= exec_fail_max
           || page_id_val >= page_id_end) {
         this.Txn_sav();
         return;
       }
     }
   }
   exec_done = true;
 }
 private void Download_exec(Xodb_tbl_oimg_xfer_itm fsdb) {
   Io_stream_rdr src_rdr = src_bin_mgr.Find_as_rdr(Xof_exec_tid.Tid_wiki_page, fsdb);
   try {
     if (src_rdr == Io_stream_rdr_.Noop) { // download failed
       ++exec_fail;
       usr_dlg.Warn_many(
           "",
           "",
           "failed: ttl=~{0}",
           String_.Format("[[File:{0}|{1}px]]", fsdb.Orig_ttl(), fsdb.Html_w()));
       Print_progress(fsdb);
     } else { // download passed
       long src_rdr_len = src_rdr.Len();
       int lnki_tier_id = fsdb.Lnki_tier_id();
       if (src_rdr_len > download_size_max && !Int_.In(lnki_tier_id, download_keep_tier_ids)) {
         usr_dlg.Warn_many(
             "",
             "",
             "skipped; ttl=~{0} w=~{1} size=~{2} tier=~{3}",
             fsdb.Orig_ttl(),
             fsdb.Lnki_w(),
             src_rdr_len,
             lnki_tier_id);
         return;
       }
       if (trg_bin_fil == null) // no trg_bin_fil
       Make_trg_bin_file(Bool_.Y, fsdb, src_rdr_len);
       else if (trg_bin_fil.Bin_len() + src_rdr_len
           > trg_bin_db_max) // or trg_bin_fil is out of space
       Make_trg_bin_file(Bool_.N, fsdb, src_rdr_len);
       else if (prv_lnki_tier_id != lnki_tier_id) { // or tier has changed
         if (prv_lnki_tier_id != -1 && !bin_db_mgr.Schema_is_1()) // do not increment dbs for v1
         Make_trg_bin_file(Bool_.Y, fsdb, src_rdr_len);
         prv_lnki_tier_id = lnki_tier_id;
       }
       trg_bin_updater.Save_bin(trg_mnt_itm, trg_atr_fil, trg_bin_fil, fsdb, src_rdr, src_rdr_len);
     }
   } finally {
     src_rdr.Rls();
   }
 }
 @Override
 public void Cmd_bgn(Xob_bldr bldr) {
   wiki.Init_assert();
   this.poll_interval = poll_mgr.Poll_interval();
   this.bin_db_mgr = new Xob_bin_db_mgr(ns_ids);
   // src_bin_mgr
   if (src_bin_mgr__fsdb_version != null) {
     this.src_fsdb_wkr = Xof_bin_wkr__fsdb_sql.new_(wiki.File__mnt_mgr());
     src_bin_mgr.Wkrs__add(src_fsdb_wkr);
     src_fsdb_wkr.Mnt_mgr().Ctor_by_load(new_src_bin_db_mgr(wiki, src_bin_mgr__fsdb_version));
     src_fsdb_wkr.Mnt_mgr()
         .Mnts__get_main()
         .Txn_bgn(); // NOTE: txn on atr speeds up from 50 -> 300; DATE:2015-03-21
     if (src_bin_mgr__fsdb_skip_wkrs != null) {
       src_fsdb_wkr.Skip_mgr_init(
           src_fsdb_wkr.Mnt_mgr().Mnts__get_main().Cfg_mgr(), src_bin_mgr__fsdb_skip_wkrs);
     }
     if (src_bin_mgr__cache_enabled) {
       usr_dlg.Prog_many("", "", "src_bin_mgr.cache.bgn");
       src_fsdb_wkr.Mnt_mgr().Mnts__get_main().Atr_mgr().Db__core().Fil_cache_enabled_y_();
       usr_dlg.Prog_many("", "", "src_bin_mgr.cache.end");
     }
   }
   if (src_bin_mgr__wmf_enabled) {
     Xof_bin_wkr__http_wmf wmf_wkr = Xof_bin_wkr__http_wmf.new_(wiki);
     src_bin_mgr.Wkrs__add(wmf_wkr);
     wmf_wkr.Fail_timeout_(
         0); // 1000; NOTE: set Fail_timeout here; DATE:2014-06-21; NOTE: do not put in ctor, or
     // else will be 1st wkr; DATE:2014-06-28
   }
   // trg_mnt_itm
   this.trg_bin_db_max = app.Api_root().Bldr().Wiki().Import().File_db_max();
   Io_url trg_file_dir_v1 =
       String_.Eq(trg_bin_mgr__fsdb_version, "v1")
           ? wiki.Fsys_mgr().File_dir().GenNewNameOnly(wiki.Domain_str() + "-prv")
           : wiki.Fsys_mgr().File_dir(); // NOTE: convoluted way of setting trg to -prv if
   // trg_bin_mgr__fsdb_version_v1 is set; otherwise set to
   // "en.wikipedia.org" which will noop; DATE:2015-12-02
   Fsdb_db_mgr trg_db_mgr =
       Fsdb_db_mgr_.new_detect(wiki, wiki.Fsys_mgr().Root_dir(), trg_file_dir_v1);
   if (trg_db_mgr == null) trg_db_mgr = Fsdb_db_mgr__v2_bldr.Get_or_make(wiki, Bool_.Y);
   Fsm_mnt_mgr trg_mnt_mgr = new Fsm_mnt_mgr();
   trg_mnt_mgr.Ctor_by_load(trg_db_mgr);
   trg_mnt_mgr.Mnts__get_insert_idx_(
       Fsm_mnt_mgr
           .Mnt_idx_main); // NOTE: do not delete; mnt_mgr default to Mnt_idx_user; DATE:2014-04-25
   this.trg_mnt_itm = trg_mnt_mgr.Mnts__get_insert();
   Fsm_mnt_mgr.Patch(
       trg_mnt_itm.Cfg_mgr()
           .Tbl()); // NOTE: always patch again; fsdb_make may be run separately without lnki_temp;
   // DATE:2014-04-26
   this.trg_atr_fil = trg_mnt_itm.Atr_mgr().Db__core();
   this.trg_cfg_mgr = trg_mnt_itm.Cfg_mgr();
   bin_db_mgr.Init_by_mnt_mgr(trg_mnt_mgr);
   trg_atr_fil.Conn().Txn_bgn("bldr__fsdb_make__trg_atr_fil");
   if (!trg_atr_fil.Conn()
       .Eq(trg_cfg_mgr.Tbl().Conn())) // need to create txn for v1; DATE:2015-07-04
   trg_cfg_mgr.Tbl().Conn().Txn_bgn("bldr__fsdb_make__trg_cfg_fil");
   // bldr_db
   Xob_db_file bldr_db = Xob_db_file.New__file_make(wiki.Fsys_mgr().Root_dir());
   this.bldr_conn = bldr_db.Conn();
   this.bldr_cfg_tbl = bldr_db.Tbl__cfg(); // NOTE: cfg and atr is in same db; use it
   bldr_cfg_tbl.Conn().Txn_bgn("bldr__fsdb_make__bldr_cfg_tbl");
 }