aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs
index 66a011f..8265941 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -9,6 +9,7 @@ use clap::Parser;
use client::GeClient;
use futures_util::{StreamExt, stream::FuturesUnordered};
use glam::{DMat4, DVec3};
+use log::info;
use mesh::{convert_mesh, decode_normal_table};
use std::{f32::consts::PI, path::PathBuf, pin::Pin, sync::Arc};
use tokio::sync::Semaphore;
@@ -36,6 +37,7 @@ struct Args {
#[derive(Parser)]
enum Action {
Cache { level: usize },
+ CacheMetadata { level: usize },
Export { level: usize },
CacheFsToDb,
}
@@ -68,6 +70,20 @@ async fn main() -> Result<()> {
)
.await?;
}
+ Action::CacheMetadata { level } => {
+ let c = GeClient::new(16, cache).await?;
+ let entry = c.planetoid_metdata().await?;
+ let epoch = entry.root_node_metadata.unwrap().bulk_metadata_epoch();
+ let count = cache_metadata(
+ Arc::new(c),
+ Arc::new(Semaphore::new(args.par_limit * 3 / 2)),
+ "".to_string(),
+ epoch,
+ level,
+ )
+ .await?;
+ info!("There are {count} nodes at level {level}");
+ }
Action::Export { level } => {
let c = GeClient::new(16, cache).await?;
let entry = c.planetoid_metdata().await?;
@@ -197,6 +213,44 @@ fn cache_all(
})
}
+fn cache_metadata(
+ c: Arc<GeClient>,
+ par: Arc<Semaphore>,
+ path: String,
+ epoch: u32,
+ level: usize,
+) -> Pin<Box<dyn Future<Output = Result<u64>>>> {
+ Box::pin(async move {
+ let _permit = par.acquire().await?;
+ let bulk = c.bulk_metadata(&path, epoch).await?;
+
+ let mut fu = FuturesUnordered::new();
+
+ let mut node_count = 0;
+
+ for node_meta in &bulk.node_metadata {
+ let (cpath, flags) = unpack_path_and_id(node_meta.path_and_flags());
+ node_count += 1;
+ if cpath.len() == 4 && flags.has_metadata && cpath.len() + path.len() < level {
+ let abspath = format!("{path}{cpath}");
+ fu.push(cache_metadata(
+ c.clone(),
+ par.clone(),
+ abspath,
+ epoch,
+ level,
+ ));
+ }
+ }
+ drop(_permit);
+
+ while let Some(res) = fu.next().await {
+ node_count += res?;
+ }
+ Ok(node_count)
+ })
+}
+
#[derive(Debug, Clone, Copy)]
pub struct Flags {
has_node: bool,