This is an automated email from the ASF dual-hosted git repository.
hsluoyz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/casbin-sqlx-adapter.git
The following commit(s) were added to refs/heads/master by this push:
new 05da536 feat: upgrade sqlx to 0.9 and split runtime/TLS features
(#111)
05da536 is described below
commit 05da536b752b69f9bff9230143375805726eb4cc
Author: Nivek Huang <[email protected]>
AuthorDate: Mon Aug 3 01:53:28 2026 +0800
feat: upgrade sqlx to 0.9 and split runtime/TLS features (#111)
---
...6dbc0e78f2a23eff67925322bdd3646d063d710584.json | 64 +++++++++++--
...2ff25faae78671d69c8935d2a2d57c0f9d1e91e832.json | 64 +++++++++++--
Cargo.toml | 38 ++++----
README.md | 17 +++-
src/adapter.rs | 104 ++++++++++-----------
5 files changed, 200 insertions(+), 87 deletions(-)
diff --git
a/.sqlx/query-3ae7e28de7cb8896086c186dbc0e78f2a23eff67925322bdd3646d063d710584.json
b/.sqlx/query-3ae7e28de7cb8896086c186dbc0e78f2a23eff67925322bdd3646d063d710584.json
index 6f82475..1640026 100644
---
a/.sqlx/query-3ae7e28de7cb8896086c186dbc0e78f2a23eff67925322bdd3646d063d710584.json
+++
b/.sqlx/query-3ae7e28de7cb8896086c186dbc0e78f2a23eff67925322bdd3646d063d710584.json
@@ -6,42 +6,90 @@
{
"ordinal": 0,
"name": "id",
- "type_info": "Int4"
+ "type_info": "Int4",
+ "origin": {
+ "Table": {
+ "table": "casbin_rule",
+ "name": "id"
+ }
+ }
},
{
"ordinal": 1,
"name": "ptype",
- "type_info": "Varchar"
+ "type_info": "Varchar",
+ "origin": {
+ "Table": {
+ "table": "casbin_rule",
+ "name": "ptype"
+ }
+ }
},
{
"ordinal": 2,
"name": "v0",
- "type_info": "Varchar"
+ "type_info": "Varchar",
+ "origin": {
+ "Table": {
+ "table": "casbin_rule",
+ "name": "v0"
+ }
+ }
},
{
"ordinal": 3,
"name": "v1",
- "type_info": "Varchar"
+ "type_info": "Varchar",
+ "origin": {
+ "Table": {
+ "table": "casbin_rule",
+ "name": "v1"
+ }
+ }
},
{
"ordinal": 4,
"name": "v2",
- "type_info": "Varchar"
+ "type_info": "Varchar",
+ "origin": {
+ "Table": {
+ "table": "casbin_rule",
+ "name": "v2"
+ }
+ }
},
{
"ordinal": 5,
"name": "v3",
- "type_info": "Varchar"
+ "type_info": "Varchar",
+ "origin": {
+ "Table": {
+ "table": "casbin_rule",
+ "name": "v3"
+ }
+ }
},
{
"ordinal": 6,
"name": "v4",
- "type_info": "Varchar"
+ "type_info": "Varchar",
+ "origin": {
+ "Table": {
+ "table": "casbin_rule",
+ "name": "v4"
+ }
+ }
},
{
"ordinal": 7,
"name": "v5",
- "type_info": "Varchar"
+ "type_info": "Varchar",
+ "origin": {
+ "Table": {
+ "table": "casbin_rule",
+ "name": "v5"
+ }
+ }
}
],
"parameters": {
diff --git
a/.sqlx/query-530d3f59ba6d986d3354242ff25faae78671d69c8935d2a2d57c0f9d1e91e832.json
b/.sqlx/query-530d3f59ba6d986d3354242ff25faae78671d69c8935d2a2d57c0f9d1e91e832.json
index d0df28a..1de61b2 100644
---
a/.sqlx/query-530d3f59ba6d986d3354242ff25faae78671d69c8935d2a2d57c0f9d1e91e832.json
+++
b/.sqlx/query-530d3f59ba6d986d3354242ff25faae78671d69c8935d2a2d57c0f9d1e91e832.json
@@ -6,42 +6,90 @@
{
"ordinal": 0,
"name": "id",
- "type_info": "Int4"
+ "type_info": "Int4",
+ "origin": {
+ "Table": {
+ "table": "casbin_rule",
+ "name": "id"
+ }
+ }
},
{
"ordinal": 1,
"name": "ptype",
- "type_info": "Varchar"
+ "type_info": "Varchar",
+ "origin": {
+ "Table": {
+ "table": "casbin_rule",
+ "name": "ptype"
+ }
+ }
},
{
"ordinal": 2,
"name": "v0",
- "type_info": "Varchar"
+ "type_info": "Varchar",
+ "origin": {
+ "Table": {
+ "table": "casbin_rule",
+ "name": "v0"
+ }
+ }
},
{
"ordinal": 3,
"name": "v1",
- "type_info": "Varchar"
+ "type_info": "Varchar",
+ "origin": {
+ "Table": {
+ "table": "casbin_rule",
+ "name": "v1"
+ }
+ }
},
{
"ordinal": 4,
"name": "v2",
- "type_info": "Varchar"
+ "type_info": "Varchar",
+ "origin": {
+ "Table": {
+ "table": "casbin_rule",
+ "name": "v2"
+ }
+ }
},
{
"ordinal": 5,
"name": "v3",
- "type_info": "Varchar"
+ "type_info": "Varchar",
+ "origin": {
+ "Table": {
+ "table": "casbin_rule",
+ "name": "v3"
+ }
+ }
},
{
"ordinal": 6,
"name": "v4",
- "type_info": "Varchar"
+ "type_info": "Varchar",
+ "origin": {
+ "Table": {
+ "table": "casbin_rule",
+ "name": "v4"
+ }
+ }
},
{
"ordinal": 7,
"name": "v5",
- "type_info": "Varchar"
+ "type_info": "Varchar",
+ "origin": {
+ "Table": {
+ "table": "casbin_rule",
+ "name": "v5"
+ }
+ }
}
],
"parameters": {
diff --git a/Cargo.toml b/Cargo.toml
index 22b5b17..4b3d96e 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,20 +1,20 @@
[package]
name = "sqlx-adapter"
version = "1.8.0"
-authors = ["Eason Chai <[email protected]>","Cheng JIANG
<[email protected]>"]
+authors = [
+ "Eason Chai <[email protected]>",
+ "Cheng JIANG <[email protected]>",
+]
edition = "2018"
license = "Apache-2.0"
description = "Sqlx adapter for casbin-rs"
-homepage= "https://casbin.apache.org"
-readme= "README.md"
+homepage = "https://casbin.apache.org"
+readme = "README.md"
[dependencies]
casbin = { version = "2.1.0", default-features = false }
-sqlx = { version = "0.8", default-features = false, features = [ "macros" ] }
+sqlx = { version = "0.9", default-features = false, features = ["macros"] }
async-trait = "0.1.51"
-dotenvy = { version = "0.15.0", default-features = false }
-tokio = { version = "1.10.0", default-features = false, optional = true }
-async-std = { version = "1.9.0", default-features = false, optional = true }
[features]
default = ["postgres", "runtime-tokio-native-tls"]
@@ -26,21 +26,27 @@ sqlite = ["sqlx/sqlite"]
# async runtime
# async-std
-runtime-async-std-native-tls = ["casbin/runtime-async-std",
"sqlx/runtime-async-std-native-tls"]
-runtime-async-std-rustls = ["casbin/runtime-async-std",
"sqlx/runtime-async-std-rustls"]
-# tokio
+runtime-async-std = ["casbin/runtime-async-std", "sqlx/runtime-async-std"]
runtime-tokio = ["casbin/runtime-tokio", "sqlx/runtime-tokio"]
-runtime-tokio-native-tls = ["casbin/runtime-tokio",
"sqlx/runtime-tokio-native-tls"]
-runtime-tokio-rustls = ["casbin/runtime-tokio", "sqlx/runtime-tokio-rustls"]
+
+# TLS
+tls-native-tls = ["sqlx/tls-native-tls"]
+tls-rustls = ["sqlx/tls-rustls"]
+
+# Backward-compatible runtime/TLS aliases
+runtime-async-std-native-tls = ["runtime-async-std", "tls-native-tls"]
+runtime-async-std-rustls = ["runtime-async-std", "tls-rustls"]
+runtime-tokio-native-tls = ["runtime-tokio", "tls-native-tls"]
+runtime-tokio-rustls = ["runtime-tokio", "tls-rustls"]
[dev-dependencies]
-async-std = { version = "1.9.0", features = [ "attributes" ] }
-tokio = { version = "1.10.0", features = [ "full" ] }
+async-std = { version = "1.9.0", features = ["attributes"] }
+tokio = { version = "1.10.0", features = ["full"] }
[profile.release]
codegen-units = 1
-lto = true
-opt-level = 3
+lto = true
+opt-level = 3
[profile.dev]
split-debuginfo = "packed"
diff --git a/README.md b/README.md
index c2d16b8..45c0a31 100644
--- a/README.md
+++ b/README.md
@@ -29,21 +29,21 @@ Add the following to `Cargo.toml`:
For MySQL:
```toml
-sqlx-adapter = { version = "1.8.0", default-features = false, features =
["mysql", "runtime-tokio-native-tls"]}
+sqlx-adapter = { version = "1.8.0", default-features = false, features =
["mysql", "runtime-tokio", "tls-native-tls"]}
tokio = { version = "1.1.1", features = ["macros"] }
```
For PostgreSQL:
```toml
-sqlx-adapter = { version = "1.8.0", default-features = false, features =
["postgres", "runtime-tokio-native-tls"]}
+sqlx-adapter = { version = "1.8.0", default-features = false, features =
["postgres", "runtime-tokio", "tls-native-tls"]}
tokio = { version = "1.1.1", features = ["macros"] }
```
For SQLite:
```toml
-sqlx-adapter = { version = "1.8.0", default-features = false, features =
["sqlite", "runtime-tokio-native-tls"]}
+sqlx-adapter = { version = "1.8.0", default-features = false, features =
["sqlite", "runtime-tokio", "tls-native-tls"]}
tokio = { version = "1.1.1", features = ["macros"] }
```
@@ -198,5 +198,16 @@ async fn main() -> Result<()> {
- `postgres`
- `mysql`
- `sqlite`
+- `runtime-tokio`
+- `runtime-async-std`
+- `tls-native-tls`
+- `tls-rustls`
+
+The legacy combined runtime/TLS features remain available as
backward-compatible aliases:
+
+- `runtime-tokio-native-tls`
+- `runtime-tokio-rustls`
+- `runtime-async-std-native-tls`
+- `runtime-async-std-rustls`
*Attention*: `postgres`, `mysql`, `sqlite` are mutual exclusive which means
that you can only activate one of them.
diff --git a/src/adapter.rs b/src/adapter.rs
index 68d08e8..299b169 100644
--- a/src/adapter.rs
+++ b/src/adapter.rs
@@ -1,6 +1,5 @@
use async_trait::async_trait;
use casbin::{error::AdapterError, Adapter, Error as CasbinError, Filter,
Model, Result};
-use dotenvy::dotenv;
use std::sync::{
atomic::{AtomicBool, Ordering},
Arc,
@@ -27,8 +26,6 @@ pub struct SqlxAdapter {
impl<'a> SqlxAdapter {
pub async fn new<U: Into<String>>(url: U, pool_size: u32) -> Result<Self> {
- dotenv().ok();
-
#[cfg(feature = "postgres")]
let pool = PgPoolOptions::new()
.max_connections(pool_size)
@@ -275,17 +272,21 @@ mod tests {
v.into_iter().map(|x| x.to_owned()).collect()
}
- #[cfg_attr(
- any(
- feature = "runtime-async-std-native-tls",
- feature = "runtime-async-std-rustls"
- ),
- async_std::test
- )]
- #[cfg_attr(
- any(feature = "runtime-tokio-native-tls", feature =
"runtime-tokio-rustls"),
- tokio::test(flavor = "multi_thread")
- )]
+ fn test_database_url() -> String {
+ #[cfg(feature = "postgres")]
+ let default_url =
"postgres://casbin_rs:casbin_rs@localhost:5432/casbin";
+
+ #[cfg(feature = "mysql")]
+ let default_url = "mysql://casbin_rs:casbin_rs@localhost:3306/casbin";
+
+ #[cfg(feature = "sqlite")]
+ let default_url = "sqlite:casbin.db";
+
+ std::env::var("DATABASE_URL").unwrap_or_else(|_|
default_url.to_owned())
+ }
+
+ #[cfg_attr(feature = "runtime-async-std", async_std::test)]
+ #[cfg_attr(feature = "runtime-tokio", tokio::test(flavor =
"multi_thread"))]
async fn test_create() {
use casbin::prelude::*;
@@ -296,38 +297,25 @@ mod tests {
let adapter = {
#[cfg(feature = "postgres")]
{
-
SqlxAdapter::new("postgres://casbin_rs:casbin_rs@localhost:5432/casbin", 8)
- .await
- .unwrap()
+ SqlxAdapter::new(test_database_url(), 8).await.unwrap()
}
#[cfg(feature = "mysql")]
{
-
SqlxAdapter::new("mysql://casbin_rs:casbin_rs@localhost:3306/casbin", 8)
- .await
- .unwrap()
+ SqlxAdapter::new(test_database_url(), 8).await.unwrap()
}
#[cfg(feature = "sqlite")]
{
- SqlxAdapter::new("sqlite:casbin.db", 8).await.unwrap()
+ SqlxAdapter::new(test_database_url(), 8).await.unwrap()
}
};
assert!(Enforcer::new(m, adapter).await.is_ok());
}
- #[cfg_attr(
- any(
- feature = "runtime-async-std-native-tls",
- feature = "runtime-async-std-rustls"
- ),
- async_std::test
- )]
- #[cfg_attr(
- any(feature = "runtime-tokio-native-tls", feature =
"runtime-tokio-rustls"),
- tokio::test(flavor = "multi_thread")
- )]
+ #[cfg_attr(feature = "runtime-async-std", async_std::test)]
+ #[cfg_attr(feature = "runtime-tokio", tokio::test(flavor =
"multi_thread"))]
async fn test_create_with_pool() {
use casbin::prelude::*;
@@ -337,27 +325,30 @@ mod tests {
let pool = {
#[cfg(feature = "postgres")]
{
+ let url = test_database_url();
PgPoolOptions::new()
.max_connections(8)
-
.connect("postgres://casbin_rs:casbin_rs@localhost:5432/casbin")
+ .connect(&url)
.await
.unwrap()
}
#[cfg(feature = "mysql")]
{
+ let url = test_database_url();
MySqlPoolOptions::new()
.max_connections(8)
-
.connect("mysql://casbin_rs:casbin_rs@localhost:3306/casbin")
+ .connect(&url)
.await
.unwrap()
}
#[cfg(feature = "sqlite")]
{
+ let url = test_database_url();
SqlitePoolOptions::new()
.max_connections(8)
- .connect("sqlite:casbin.db")
+ .connect(&url)
.await
.unwrap()
}
@@ -368,17 +359,8 @@ mod tests {
assert!(Enforcer::new(m, adapter).await.is_ok());
}
- #[cfg_attr(
- any(
- feature = "runtime-async-std-native-tls",
- feature = "runtime-async-std-rustls"
- ),
- async_std::test
- )]
- #[cfg_attr(
- any(feature = "runtime-tokio-native-tls", feature =
"runtime-tokio-rustls"),
- tokio::test(flavor = "multi_thread")
- )]
+ #[cfg_attr(feature = "runtime-async-std", async_std::test)]
+ #[cfg_attr(feature = "runtime-tokio", tokio::test(flavor =
"multi_thread"))]
async fn test_adapter() {
use casbin::prelude::*;
@@ -389,29 +371,47 @@ mod tests {
.unwrap();
let mut e = Enforcer::new(m, file_adapter).await.unwrap();
+ #[cfg(feature = "postgres")]
+ let postgres_pool = {
+ let url = test_database_url();
+ PgPoolOptions::new()
+ .max_connections(8)
+ .connect(&url)
+ .await
+ .unwrap()
+ };
let mut adapter = {
#[cfg(feature = "postgres")]
{
-
SqlxAdapter::new("postgres://casbin_rs:casbin_rs@localhost:5432/casbin", 8)
+ SqlxAdapter::new_with_pool(postgres_pool.clone())
.await
.unwrap()
}
#[cfg(feature = "mysql")]
{
-
SqlxAdapter::new("mysql://casbin_rs:casbin_rs@localhost:3306/casbin", 8)
- .await
- .unwrap()
+ SqlxAdapter::new(test_database_url(), 8).await.unwrap()
}
#[cfg(feature = "sqlite")]
{
- SqlxAdapter::new("sqlite:casbin.db", 8).await.unwrap()
+ SqlxAdapter::new(test_database_url(), 8).await.unwrap()
}
};
assert!(adapter.save_policy(e.get_mut_model()).await.is_ok());
+ #[cfg(feature = "postgres")]
+ {
+ let model = DefaultModel::from_file("examples/rbac_model.conf")
+ .await
+ .unwrap();
+ let reloaded_adapter =
SqlxAdapter::new_with_pool(postgres_pool).await.unwrap();
+ let reloaded = Enforcer::new(model,
reloaded_adapter).await.unwrap();
+
+ assert!(reloaded.enforce(("alice", "data1", "read")).unwrap());
+ }
+
assert!(adapter
.remove_policy("", "p", to_owned(vec!["alice", "data1", "read"]))
.await
@@ -564,7 +564,7 @@ mod tests {
.remove_filtered_policy("", "g", 0, to_owned(vec!["carol"]),)
.await
.unwrap());
- assert_eq!(vec![String::new(); 0], e.get_roles_for_user("carol",
None));
+ assert_eq!(Vec::<String>::new(), e.get_roles_for_user("carol", None));
// GitHub issue: https://github.com/apache/casbin-sqlx-adapter/pull/90
// add policies:
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]