1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
use crate::files::FileService; use dbui_core::project::ProjectSummary; use dbui_core::{Error, Project, Result}; use dbui_database::conn::ConnectionPool; use std::collections::HashMap; use std::sync::Arc; #[derive(Debug)] pub struct ProjectService { files: Arc<FileService>, log: slog::Logger, pools: HashMap<String, Arc<ConnectionPool>> } impl ProjectService { pub fn new(files: Arc<FileService>, logger: &slog::Logger) -> ProjectService { ProjectService { files, log: logger.new(slog::o!("service" => "project")), pools: HashMap::new() } } pub fn keys(&self) -> Result<Vec<String>> { Ok(self.files.list_json("projects")?) } pub fn get_all_projects(&self) -> Result<Vec<Project>> { self.keys()?.iter().map(|k| self.get_project(k)).collect() } pub fn get_project_summary(&self, key: &str) -> Result<ProjectSummary> { self.files.read_json(&format!("projects/{}", key)) } pub fn get_project(&self, key: &str) -> Result<Project> { let summ: ProjectSummary = self.get_project_summary(key)?; Ok(Project::new(key.into(), summ.name, summ.connection_params)) } pub fn set_project(&self, p: &Project) -> Result<()> { self.files.write_json(p.to_summary(), &format!("project/{}.json", p.key())) } pub fn open_connection(&mut self, key: String) -> Result<postgres::Client> { match self.pools.get(&key) { Some(pool) => pool.open(), None => { let pool = ConnectionPool::new(self.get_project(&key)?.connection_params())?; match self.pools.insert(key.clone(), Arc::new(pool)) { Some(_) => (), None => () }; match self.pools.get(&key) { Some(pool) => pool.open(), None => Err(Error::from("Can't find newly-inserted pool")) } } } } }