pub struct PostgresSessionStore { /* private fields */ }
Expand description
sqlx postgres session store for async-sessions
use async_sqlx_session::PostgresSessionStore;
use async_session::{Session, SessionStore};
use std::time::Duration;
let store = PostgresSessionStore::new(&std::env::var("PG_TEST_DB_URL").unwrap()).await?;
store.migrate().await?;
store.spawn_cleanup_task(Duration::from_secs(60 * 60));
let mut session = Session::new();
session.insert("key", vec![1,2,3]);
let cookie_value = store.store_session(session).await?.unwrap();
let session = store.load_session(cookie_value).await?.unwrap();
assert_eq!(session.get::<Vec<i8>>("key").unwrap(), vec![1,2,3]);
Implementations§
Source§impl PostgresSessionStore
impl PostgresSessionStore
Sourcepub fn from_client(client: PgPool) -> Self
pub fn from_client(client: PgPool) -> Self
constructs a new PostgresSessionStore from an existing
sqlx::PgPool. the default table name for this session
store will be “async_sessions”. To override this, chain this
with with_table_name
.
let pool = sqlx::PgPool::connect(&std::env::var("PG_TEST_DB_URL").unwrap()).await.unwrap();
let store = PostgresSessionStore::from_client(pool)
.with_table_name("custom_table_name");
store.migrate().await;
Sourcepub async fn new(database_url: &str) -> Result<Self>
pub async fn new(database_url: &str) -> Result<Self>
Constructs a new PostgresSessionStore from a postgres://
database url. The default table name for this session store
will be “async_sessions”. To override this, either chain with
with_table_name
or use
new_with_table_name
let store = PostgresSessionStore::new(&std::env::var("PG_TEST_DB_URL").unwrap()).await?;
store.migrate().await;
Sourcepub async fn new_with_table_name(
database_url: &str,
table_name: &str,
) -> Result<Self>
pub async fn new_with_table_name( database_url: &str, table_name: &str, ) -> Result<Self>
constructs a new PostgresSessionStore from a postgres:// url. the
default table name for this session store will be
“async_sessions”. To override this, either chain with
with_table_name
or
use
new_with_table_name
let store = PostgresSessionStore::new_with_table_name(&std::env::var("PG_TEST_DB_URL").unwrap(), "custom_table_name").await?;
store.migrate().await;
Sourcepub fn with_table_name(self, table_name: impl AsRef<str>) -> Self
pub fn with_table_name(self, table_name: impl AsRef<str>) -> Self
Chainable method to add a custom table name. This will panic
if the table name is not [a-zA-Z0-9_-]+
.
let store = PostgresSessionStore::new(&std::env::var("PG_TEST_DB_URL").unwrap()).await?
.with_table_name("custom_name");
store.migrate().await;
let store = PostgresSessionStore::new(&std::env::var("PG_TEST_DB_URL").unwrap()).await?
.with_table_name("johnny (); drop users;");
Sourcepub async fn migrate(&self) -> Result<()>
pub async fn migrate(&self) -> Result<()>
Creates a session table if it does not already exist. If it does, this will noop, making it safe to call repeatedly on store initialization. In the future, this may make exactly-once modifications to the schema of the session table on breaking releases.
let store = PostgresSessionStore::new(&std::env::var("PG_TEST_DB_URL").unwrap()).await?;
store.migrate().await?;
store.store_session(Session::new()).await?;
store.migrate().await?; // calling it a second time is safe
assert_eq!(store.count().await?, 1);
Sourcepub fn spawn_cleanup_task(&self, period: Duration) -> JoinHandle<()>
pub fn spawn_cleanup_task(&self, period: Duration) -> JoinHandle<()>
Spawns an async_std::task that clears out stale (expired) sessions on a periodic basis. Only available with the async_std feature enabled.
let store = PostgresSessionStore::new(&std::env::var("PG_TEST_DB_URL").unwrap()).await?;
store.migrate().await?;
store.spawn_cleanup_task(Duration::from_secs(1));
let mut session = Session::new();
session.expire_in(Duration::from_secs(0));
store.store_session(session).await?;
assert_eq!(store.count().await?, 1);
async_std::task::sleep(Duration::from_secs(2)).await;
assert_eq!(store.count().await?, 0);
Sourcepub async fn cleanup(&self) -> Result<()>
pub async fn cleanup(&self) -> Result<()>
Performs a one-time cleanup task that clears out stale (expired) sessions. You may want to call this from cron.
let store = PostgresSessionStore::new(&std::env::var("PG_TEST_DB_URL").unwrap()).await?;
store.migrate().await?;
let mut session = Session::new();
session.set_expiry(Utc::now() - Duration::seconds(5));
store.store_session(session).await?;
assert_eq!(store.count().await?, 1);
store.cleanup().await?;
assert_eq!(store.count().await?, 0);
Sourcepub async fn count(&self) -> Result<i64>
pub async fn count(&self) -> Result<i64>
retrieves the number of sessions currently stored, including expired sessions
let store = PostgresSessionStore::new(&std::env::var("PG_TEST_DB_URL").unwrap()).await?;
store.migrate().await?;
assert_eq!(store.count().await?, 0);
store.store_session(Session::new()).await?;
assert_eq!(store.count().await?, 1);
Trait Implementations§
Source§impl Clone for PostgresSessionStore
impl Clone for PostgresSessionStore
Source§fn clone(&self) -> PostgresSessionStore
fn clone(&self) -> PostgresSessionStore
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl Debug for PostgresSessionStore
impl Debug for PostgresSessionStore
Source§impl SessionStore for PostgresSessionStore
impl SessionStore for PostgresSessionStore
Source§fn load_session<'life0, 'async_trait>(
&'life0 self,
cookie_value: String,
) -> Pin<Box<dyn Future<Output = Result<Option<Session>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn load_session<'life0, 'async_trait>(
&'life0 self,
cookie_value: String,
) -> Pin<Box<dyn Future<Output = Result<Option<Session>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Source§fn store_session<'life0, 'async_trait>(
&'life0 self,
session: Session,
) -> Pin<Box<dyn Future<Output = Result<Option<String>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
fn store_session<'life0, 'async_trait>(
&'life0 self,
session: Session,
) -> Pin<Box<dyn Future<Output = Result<Option<String>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
Auto Trait Implementations§
impl Freeze for PostgresSessionStore
impl !RefUnwindSafe for PostgresSessionStore
impl Send for PostgresSessionStore
impl Sync for PostgresSessionStore
impl Unpin for PostgresSessionStore
impl !UnwindSafe for PostgresSessionStore
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more