Compare commits
	
		
			1 Commits
		
	
	
		
			master
			...
			test_selec
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						
						
							
						
						eda704d2f1
	
				 | 
					
					
						
							
								
								
									
										56
									
								
								src/main.rs
									
									
									
									
									
								
							
							
						
						
									
										56
									
								
								src/main.rs
									
									
									
									
									
								
							@@ -2,6 +2,7 @@
 | 
			
		||||
extern crate rocket;
 | 
			
		||||
 | 
			
		||||
use rocket::fs::FileServer;
 | 
			
		||||
use rocket::futures::FutureExt;
 | 
			
		||||
use rocket::response::Redirect;
 | 
			
		||||
use rocket::State;
 | 
			
		||||
use rocket_dyn_templates::tera;
 | 
			
		||||
@@ -86,28 +87,45 @@ async fn show_question_details(
 | 
			
		||||
    cache: &TemplateCache,
 | 
			
		||||
    id: usize,
 | 
			
		||||
) -> Template {
 | 
			
		||||
    if let Some(value) = cache.get(&id) {
 | 
			
		||||
        return value.render(template_name);
 | 
			
		||||
    }
 | 
			
		||||
    let cache_cloned = cache.clone();
 | 
			
		||||
 | 
			
		||||
    match get_question(&data.db, id).await {
 | 
			
		||||
        Ok(question) => {
 | 
			
		||||
            let mut context = tera::to_value(question).expect("question serialize");
 | 
			
		||||
            if context.is_object() {
 | 
			
		||||
                let next_id = random_question_id(&data.database_distribution);
 | 
			
		||||
                context["next"] = tera::to_value(next_id).expect("question id serialize");
 | 
			
		||||
    let from_cache = rocket::tokio::spawn(async move { cache_cloned.get(&id) }).fuse();
 | 
			
		||||
    let from_db = async move {
 | 
			
		||||
        match get_question(&data.db, id).await {
 | 
			
		||||
            Ok(question) => {
 | 
			
		||||
                let mut context = tera::to_value(question).expect("question serialize");
 | 
			
		||||
                if context.is_object() {
 | 
			
		||||
                    let next_id = random_question_id(&data.database_distribution);
 | 
			
		||||
                    context["next"] = tera::to_value(next_id).expect("question id serialize");
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                let value = ArcTemplateData::new(context);
 | 
			
		||||
                let result = value.render(template_name);
 | 
			
		||||
                cache.insert(id, value);
 | 
			
		||||
 | 
			
		||||
                result
 | 
			
		||||
            }
 | 
			
		||||
            Err(_) => {
 | 
			
		||||
                use std::collections::HashMap;
 | 
			
		||||
                let context: HashMap<String, String> = HashMap::new();
 | 
			
		||||
                Template::render("404", context)
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            let value = ArcTemplateData::new(context);
 | 
			
		||||
            let result = value.render(template_name);
 | 
			
		||||
            cache.insert(id, value);
 | 
			
		||||
 | 
			
		||||
            result
 | 
			
		||||
        }
 | 
			
		||||
        Err(_) => {
 | 
			
		||||
            use std::collections::HashMap;
 | 
			
		||||
            let context: HashMap<String, String> = HashMap::new();
 | 
			
		||||
            Template::render("404", context)
 | 
			
		||||
    }
 | 
			
		||||
    .fuse();
 | 
			
		||||
 | 
			
		||||
    loop {
 | 
			
		||||
        rocket::tokio::select! {
 | 
			
		||||
            biased;
 | 
			
		||||
 | 
			
		||||
            Ok(Some(template)) = from_cache => {
 | 
			
		||||
                println!("from cache");
 | 
			
		||||
                break template.render(template_name)
 | 
			
		||||
            },
 | 
			
		||||
            template = from_db => {
 | 
			
		||||
                println!("from db");
 | 
			
		||||
                break template
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user