Create a new session and return its ID
(
&self,
username: String,
roles: Vec<String>,
permissions: SessionPermissionCache,
)
| 108 | |
| 109 | /// Create a new session and return its ID |
| 110 | pub fn create_session( |
| 111 | &self, |
| 112 | username: String, |
| 113 | roles: Vec<String>, |
| 114 | permissions: SessionPermissionCache, |
| 115 | ) -> Result<String, String> { |
| 116 | let user_session = UserSession::new( |
| 117 | username, |
| 118 | roles, |
| 119 | permissions, |
| 120 | self.transaction_manager.clone(), |
| 121 | ); |
| 122 | |
| 123 | let session_id = user_session.session_id.clone(); |
| 124 | let session_arc = Arc::new(RwLock::new(user_session)); |
| 125 | |
| 126 | // Use partitioned lock for reduced contention |
| 127 | let partition_idx = self.partition_index(&session_id); |
| 128 | let mut partition = self.sessions[partition_idx] |
| 129 | .write() |
| 130 | .map_err(|_| "Failed to acquire partition write lock")?; |
| 131 | partition.insert(session_id.clone(), session_arc); |
| 132 | |
| 133 | Ok(session_id) |
| 134 | } |
| 135 | |
| 136 | /// Get a session by ID |
| 137 | pub fn get_session(&self, session_id: &str) -> Option<Arc<RwLock<UserSession>>> { |
no test coverage detected