connection.rs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. use crate::db::Db;
  2. use std::collections::BTreeMap;
  3. use std::net::SocketAddr;
  4. use std::sync::{Arc, RwLock};
  5. pub struct Connections {
  6. connections: RwLock<BTreeMap<u128, Arc<Connection>>>,
  7. counter: RwLock<u128>,
  8. }
  9. impl Connections {
  10. pub fn new() -> Self {
  11. Self {
  12. counter: RwLock::new(0),
  13. connections: RwLock::new(BTreeMap::new()),
  14. }
  15. }
  16. pub fn remove(self: Arc<Connections>, conn: Arc<Connection>) {
  17. let id = conn.id();
  18. self.connections.write().unwrap().remove(&id);
  19. }
  20. pub fn new_connection(
  21. self: &Arc<Connections>,
  22. db: Arc<Db>,
  23. addr: SocketAddr,
  24. ) -> Arc<Connection> {
  25. let mut id = self.counter.write().unwrap();
  26. let conn = Arc::new(Connection {
  27. id: *id,
  28. db,
  29. addr,
  30. connections: self.clone(),
  31. current_db: 0,
  32. name: RwLock::new(None),
  33. });
  34. self.connections.write().unwrap().insert(*id, conn.clone());
  35. *id += 1;
  36. conn
  37. }
  38. pub fn iter(&self, f: &mut dyn FnMut(Arc<Connection>)) {
  39. for (_, value) in self.connections.read().unwrap().iter() {
  40. f(value.clone())
  41. }
  42. }
  43. }
  44. pub struct Connection {
  45. id: u128,
  46. db: Arc<Db>,
  47. current_db: u32,
  48. connections: Arc<Connections>,
  49. addr: SocketAddr,
  50. name: RwLock<Option<String>>,
  51. }
  52. impl Connection {
  53. pub fn db(&self) -> &Db {
  54. &self.db
  55. }
  56. pub fn id(&self) -> u128 {
  57. self.id
  58. }
  59. pub fn destroy(self: Arc<Connection>) {
  60. self.connections.clone().remove(self);
  61. }
  62. pub fn all_connections(&self) -> Arc<Connections> {
  63. self.connections.clone()
  64. }
  65. pub fn name(&self) -> Option<String> {
  66. self.name.read().unwrap().clone()
  67. }
  68. pub fn set_name(&self, name: String) {
  69. let mut r = self.name.write().unwrap();
  70. *r = Some(name);
  71. }
  72. #[allow(dead_code)]
  73. pub fn current_db(&self) -> u32 {
  74. self.current_db
  75. }
  76. pub fn info(&self) -> String {
  77. format!(
  78. "id={} addr={} name={:?} db={}\r\n",
  79. self.id,
  80. self.addr,
  81. self.name.read().unwrap(),
  82. self.current_db
  83. )
  84. }
  85. }