net_pool/
pools.rs

1use crate::{Address, Pool};
2use std::collections::HashMap;
3use std::sync::{Arc, RwLock};
4
5/// 管理多个连接池
6/// 每个连接池靠id来识别, id为*时代表适用于所有
7pub struct Pools<P> {
8    pools: Arc<RwLock<HashMap<String, Arc<P>>>>,
9}
10
11impl<P: Pool> Pools<P> {
12    pub fn new() -> Self {
13        Self {
14            pools: Arc::new(RwLock::new(HashMap::new())),
15        }
16    }
17
18    /// 添加连接池
19    pub fn add_pool(&self, pool: P) -> Option<Arc<P>> {
20        self.add_arc_pool(Arc::new(pool))
21    }
22
23    /// 添加连接池
24    pub fn add_arc_pool(&self, pool: Arc<P>) -> Option<Arc<P>> {
25        let mut wg = self.pools.write().unwrap();
26        let id = pool.get_id();
27        wg.insert(id.to_string(), pool)
28    }
29
30    /// 移除连接池
31    pub fn remove_pool(&self, id: &str) -> Option<Arc<P>> {
32        let mut wg = self.pools.write().unwrap();
33        wg.remove(id)
34    }
35
36    /// 添加后端地址
37    pub fn add_backend(&self, name: &str, id: Option<u32>, addr: Address) -> bool {
38        match self.get_pool(name) {
39            None => false,
40            Some(p) => {
41                p.add_backend(id, addr);
42                true
43            }
44        }
45    }
46
47    /// 移除后端地址
48    pub fn remove_backend(&self, name: &str, addr: &Address) -> bool {
49        match self.get_pool(name) {
50            None => false,
51            Some(p) => p.remove_backend(addr),
52        }
53    }
54
55    /// 获取连接池
56    pub fn get_pool(&self, name: &str) -> Option<Arc<P>> {
57        let g = self.pools.read().unwrap();
58        match g.get(name) {
59            Some(p) => Some(p.clone()),
60            None => g.get("*").map(|p| p.clone()),
61        }
62    }
63}
64
65impl<P> Clone for Pools<P> {
66    fn clone(&self) -> Self {
67        Self {
68            pools: self.pools.clone(),
69        }
70    }
71}