1extern crate self as hydracache_sqlx;
53
54mod error;
55mod query_ext;
56
57pub use error::{Result, SqlxCacheError};
58pub use hydracache_db::{
59 CacheEntity, DbCache, DbCacheError, DbQuery, HydraCacheEntity, QueryCachePolicy,
60 Result as DbResult,
61};
62pub use query_ext::SqlxQueryExt;
63
64pub type SqlxCache<C = hydracache::PostcardCodec> = DbCache<C>;
66
67pub type SqlxQuery<T, C = hydracache::PostcardCodec> = DbQuery<T, C>;
69
70pub use sqlx;
75
76#[cfg(test)]
77mod tests {
78 use hydracache::HydraCache;
79 use serde::{Deserialize, Serialize};
80 use sqlx::postgres::PgPoolOptions;
81
82 use crate::{DbCache, QueryCachePolicy, SqlxCache, SqlxQueryExt};
83
84 #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
85 struct User {
86 id: u64,
87 }
88
89 #[tokio::test]
90 async fn sqlx_cache_alias_matches_database_cache_api() {
91 let query = SqlxCache::new(HydraCache::local().build(), "sqlx")
92 .cached::<User>()
93 .key("user:1");
94
95 assert_eq!(query.physical_key(), Some("sqlx:user:1".to_owned()));
96 }
97
98 #[tokio::test]
99 async fn db_cache_reexport_is_available_from_sqlx_crate() {
100 let query = DbCache::new(HydraCache::local().build(), "db")
101 .cached::<User>()
102 .key("user:1");
103
104 assert_eq!(query.physical_key(), Some("db:user:1".to_owned()));
105 }
106
107 #[tokio::test]
108 async fn query_cache_policy_reexport_is_available_from_sqlx_crate() {
109 let policy = QueryCachePolicy::new().key("user:1").tag("user:1");
110 let query = DbCache::new(HydraCache::local().build(), "db").cached_with::<User>(policy);
111
112 assert_eq!(query.physical_key(), Some("db:user:1".to_owned()));
113 assert_eq!(query.tags_value(), &["user:1".to_owned()]);
114 }
115
116 #[tokio::test]
117 async fn sqlx_helper_missing_key_returns_sqlx_cache_error() {
118 let pool = PgPoolOptions::new()
119 .connect_lazy("postgres://postgres:postgres@localhost/postgres")
120 .unwrap();
121
122 let result = DbCache::new(HydraCache::local().build(), "db")
123 .cached::<(i64,)>()
124 .fetch_one(pool, sqlx::query_as("select 1"))
125 .await;
126
127 let error = result.unwrap_err();
128 assert_eq!(
129 error.to_string(),
130 "database cached operation `db:unnamed` is missing an explicit cache key"
131 );
132 }
133
134 #[tokio::test]
135 async fn sqlx_cache_error_wraps_db_cache_errors() {
136 let error = hydracache_db::DbCacheError::MissingKey {
137 operation: "load-user".to_owned(),
138 };
139 let error = crate::SqlxCacheError::from(error);
140
141 assert_eq!(
142 error.to_string(),
143 "database cached operation `load-user` is missing an explicit cache key"
144 );
145 }
146}