geolite 0.0.13

open source geocode solution
use std::time::Instant;

use crate::osm_pbf_file::{listing, osm_pbf_file, source};

pub fn command_handler_optimize_delete_intermediary_data(data_path: &str, sqlite_path: &str) -> bool {
  crate::interfaces::cli::require_sqlite(sqlite_path);
  let start = Instant::now();
  let mut deleted = 0u32;
  {
    let conn = crate::database::open_write(sqlite_path);
    if crate::admin_level::repository::count_with_geometry(&conn) == 0 {
      eprintln!("\x1b[1;31merror\x1b[0m: admin_levels is empty — run extract first");
      return false;
    }
    if crate::admin_level_hierarchy::repository::count(&conn) == 0 {
      eprintln!("\x1b[1;31merror\x1b[0m: admin_levels_hierarchy is empty — run index first");
      return false;
    }
    let file = osm_pbf_file::open(Some(&conn), data_path);
    let listing::local(files) = file.list(source::local, None, false) else {
      unreachable!("a local listing is always local");
    };
    for local in files {
      let path = local.path.to_string_lossy().into_owned();
      if !path.ends_with(".osm.pbf") {
        continue;
      }
      let name = local
        .path
        .file_name()
        .and_then(|n| n.to_str())
        .unwrap_or_default()
        .to_string();
      let bytes = file.delete(&path);
      deleted += 1;
      println!("\x1b[1;32mdeleted\x1b[0m {name}  {}", super::fmt_size(bytes));
    }
  }
  let bytes = crate::database::remove_osm_data_files(sqlite_path);
  deleted += 1;
  println!(
    "\x1b[1;32mdeleted\x1b[0m osm_data.sqlite3  {}",
    super::fmt_size(bytes)
  );
  let total = start.elapsed().as_secs_f64();
  println!("\x1b[1;32mdeleted\x1b[0m {deleted} tables in {total:.1}s");
  true
}