You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@casbin.apache.org by hs...@apache.org on 2026/08/05 03:11:57 UTC
(casbin-sqlx-adapter) 04/04: fix: drop compile-time query macros so builds no longer need a database
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
commit 8134e41642fcee44c50c968b1cbea0c1bf64c5b5
Author: Yang Luo <hs...@gmail.com>
AuthorDate: Wed Aug 5 10:55:32 2026 +0800
fix: drop compile-time query macros so builds no longer need a database
---
.github/workflows/ci.yml | 10 +-
...724d3bcfe5f968b31500e8c8cf97fe16814bc04164.json | 20 -
...79a12766573c91b2775a086c65bc9a5fdc91300bb0.json | 17 -
...82e9f36247a328db780a48da47c9402e1d3ebd80c9.json | 12 -
...bf9cf44610fb79a1b9330730c65953f0c1b88c2a53.json | 20 -
...6dbc0e78f2a23eff67925322bdd3646d063d710584.json | 110 --
...d3bc5806b4c78b7aa2a9609c4eccb941c7dff7b107.json | 12 -
...bb3b47cb75a999041a3eb6a8f8177bebfa3c30d56f.json | 16 -
...f6a45b89853785c32a5f83cb0b25609329c760428a.json | 19 -
...2ff25faae78671d69c8935d2a2d57c0f9d1e91e832.json | 123 --
...c1a45226ba97993ede9988a4c57d58bd066500a119.json | 20 -
...5ccab21e00c42a3fad8082cf15c2af88cd8388f41b.json | 18 -
...4fbf1b37d46c5a2f4202e1b8dce1f66a65069beb0b.json | 15 -
README.md | 8 +-
src/actions.rs | 1222 +++++---------------
15 files changed, 320 insertions(+), 1322 deletions(-)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 9dd1a0d..4b6e7c0 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -30,8 +30,14 @@ jobs:
- name: Cargo Fmt Check
run: cargo fmt --all -- --check
- - name: Cargo Build
- run: cargo build
+ # Runs before any database is set up and with no DATABASE_URL, so it
+ # proves downstream crates can build the adapter offline for every driver.
+ - name: Cargo Build (offline, no database)
+ run: |
+ cargo build
+ cargo build --no-default-features --features postgres,runtime-tokio-native-tls
+ cargo build --no-default-features --features mysql,runtime-tokio-native-tls
+ cargo build --no-default-features --features sqlite,runtime-tokio-native-tls
- name: Setup PostgreSQL & MySQL & SQLite (for ubuntu)
if: matrix.os == 'ubuntu-latest'
diff --git a/.sqlx/query-1cabd2f674da323da9e0da724d3bcfe5f968b31500e8c8cf97fe16814bc04164.json b/.sqlx/query-1cabd2f674da323da9e0da724d3bcfe5f968b31500e8c8cf97fe16814bc04164.json
deleted file mode 100644
index eb3a84f..0000000
--- a/.sqlx/query-1cabd2f674da323da9e0da724d3bcfe5f968b31500e8c8cf97fe16814bc04164.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "db_name": "PostgreSQL",
- "query": "INSERT INTO casbin_rule ( ptype, v0, v1, v2, v3, v4, v5 )\n VALUES ( $1, $2, $3, $4, $5, $6, $7 )",
- "describe": {
- "columns": [],
- "parameters": {
- "Left": [
- "Varchar",
- "Varchar",
- "Varchar",
- "Varchar",
- "Varchar",
- "Varchar",
- "Varchar"
- ]
- },
- "nullable": []
- },
- "hash": "1cabd2f674da323da9e0da724d3bcfe5f968b31500e8c8cf97fe16814bc04164"
-}
diff --git a/.sqlx/query-1f299262f01a2c9d2ee94079a12766573c91b2775a086c65bc9a5fdc91300bb0.json b/.sqlx/query-1f299262f01a2c9d2ee94079a12766573c91b2775a086c65bc9a5fdc91300bb0.json
deleted file mode 100644
index 1ea12e3..0000000
--- a/.sqlx/query-1f299262f01a2c9d2ee94079a12766573c91b2775a086c65bc9a5fdc91300bb0.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "db_name": "PostgreSQL",
- "query": "DELETE FROM casbin_rule WHERE\n ptype = $1 AND\n (v3 is NULL OR v3 = COALESCE($2,v3)) AND\n (v4 is NULL OR v4 = COALESCE($3,v4)) AND\n (v5 is NULL OR v5 = COALESCE($4,v5))",
- "describe": {
- "columns": [],
- "parameters": {
- "Left": [
- "Text",
- "Varchar",
- "Varchar",
- "Varchar"
- ]
- },
- "nullable": []
- },
- "hash": "1f299262f01a2c9d2ee94079a12766573c91b2775a086c65bc9a5fdc91300bb0"
-}
diff --git a/.sqlx/query-24876462291b90324dfe3682e9f36247a328db780a48da47c9402e1d3ebd80c9.json b/.sqlx/query-24876462291b90324dfe3682e9f36247a328db780a48da47c9402e1d3ebd80c9.json
deleted file mode 100644
index 8046c5d..0000000
--- a/.sqlx/query-24876462291b90324dfe3682e9f36247a328db780a48da47c9402e1d3ebd80c9.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "db_name": "PostgreSQL",
- "query": "DELETE FROM casbin_rule",
- "describe": {
- "columns": [],
- "parameters": {
- "Left": []
- },
- "nullable": []
- },
- "hash": "24876462291b90324dfe3682e9f36247a328db780a48da47c9402e1d3ebd80c9"
-}
diff --git a/.sqlx/query-2872b56bbc5bed96b1a303bf9cf44610fb79a1b9330730c65953f0c1b88c2a53.json b/.sqlx/query-2872b56bbc5bed96b1a303bf9cf44610fb79a1b9330730c65953f0c1b88c2a53.json
deleted file mode 100644
index e246e53..0000000
--- a/.sqlx/query-2872b56bbc5bed96b1a303bf9cf44610fb79a1b9330730c65953f0c1b88c2a53.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "db_name": "PostgreSQL",
- "query": "DELETE FROM casbin_rule WHERE\n ptype = $1 AND\n v0 = $2 AND\n v1 = $3 AND\n v2 = $4 AND\n v3 = $5 AND\n v4 = $6 AND\n v5 = $7",
- "describe": {
- "columns": [],
- "parameters": {
- "Left": [
- "Text",
- "Text",
- "Text",
- "Text",
- "Text",
- "Text",
- "Text"
- ]
- },
- "nullable": []
- },
- "hash": "2872b56bbc5bed96b1a303bf9cf44610fb79a1b9330730c65953f0c1b88c2a53"
-}
diff --git a/.sqlx/query-3ae7e28de7cb8896086c186dbc0e78f2a23eff67925322bdd3646d063d710584.json b/.sqlx/query-3ae7e28de7cb8896086c186dbc0e78f2a23eff67925322bdd3646d063d710584.json
deleted file mode 100644
index 1640026..0000000
--- a/.sqlx/query-3ae7e28de7cb8896086c186dbc0e78f2a23eff67925322bdd3646d063d710584.json
+++ /dev/null
@@ -1,110 +0,0 @@
-{
- "db_name": "PostgreSQL",
- "query": "SELECT id, ptype, v0, v1, v2, v3, v4, v5 FROM casbin_rule",
- "describe": {
- "columns": [
- {
- "ordinal": 0,
- "name": "id",
- "type_info": "Int4",
- "origin": {
- "Table": {
- "table": "casbin_rule",
- "name": "id"
- }
- }
- },
- {
- "ordinal": 1,
- "name": "ptype",
- "type_info": "Varchar",
- "origin": {
- "Table": {
- "table": "casbin_rule",
- "name": "ptype"
- }
- }
- },
- {
- "ordinal": 2,
- "name": "v0",
- "type_info": "Varchar",
- "origin": {
- "Table": {
- "table": "casbin_rule",
- "name": "v0"
- }
- }
- },
- {
- "ordinal": 3,
- "name": "v1",
- "type_info": "Varchar",
- "origin": {
- "Table": {
- "table": "casbin_rule",
- "name": "v1"
- }
- }
- },
- {
- "ordinal": 4,
- "name": "v2",
- "type_info": "Varchar",
- "origin": {
- "Table": {
- "table": "casbin_rule",
- "name": "v2"
- }
- }
- },
- {
- "ordinal": 5,
- "name": "v3",
- "type_info": "Varchar",
- "origin": {
- "Table": {
- "table": "casbin_rule",
- "name": "v3"
- }
- }
- },
- {
- "ordinal": 6,
- "name": "v4",
- "type_info": "Varchar",
- "origin": {
- "Table": {
- "table": "casbin_rule",
- "name": "v4"
- }
- }
- },
- {
- "ordinal": 7,
- "name": "v5",
- "type_info": "Varchar",
- "origin": {
- "Table": {
- "table": "casbin_rule",
- "name": "v5"
- }
- }
- }
- ],
- "parameters": {
- "Left": []
- },
- "nullable": [
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false
- ]
- },
- "hash": "3ae7e28de7cb8896086c186dbc0e78f2a23eff67925322bdd3646d063d710584"
-}
diff --git a/.sqlx/query-438ee38e669be96e562d09d3bc5806b4c78b7aa2a9609c4eccb941c7dff7b107.json b/.sqlx/query-438ee38e669be96e562d09d3bc5806b4c78b7aa2a9609c4eccb941c7dff7b107.json
deleted file mode 100644
index 75c6da3..0000000
--- a/.sqlx/query-438ee38e669be96e562d09d3bc5806b4c78b7aa2a9609c4eccb941c7dff7b107.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "db_name": "PostgreSQL",
- "query": "CREATE TABLE IF NOT EXISTS casbin_rule (\n id SERIAL PRIMARY KEY,\n ptype VARCHAR NOT NULL,\n v0 VARCHAR NOT NULL,\n v1 VARCHAR NOT NULL,\n v2 VARCHAR NOT NULL,\n v3 VARCHAR NOT NULL,\n v4 VARCHAR NOT NULL,\n v5 VARCHAR NOT NULL,\n CONSTRAINT unique_key_sqlx_adapter UNIQUE(ptype, v0, v1, v2, v3, v4, v5)\n [...]
- "describe": {
- "columns": [],
- "parameters": {
- "Left": []
- },
- "nullable": []
- },
- "hash": "438ee38e669be96e562d09d3bc5806b4c78b7aa2a9609c4eccb941c7dff7b107"
-}
diff --git a/.sqlx/query-4acfe0086a593b08177791bb3b47cb75a999041a3eb6a8f8177bebfa3c30d56f.json b/.sqlx/query-4acfe0086a593b08177791bb3b47cb75a999041a3eb6a8f8177bebfa3c30d56f.json
deleted file mode 100644
index ce229dc..0000000
--- a/.sqlx/query-4acfe0086a593b08177791bb3b47cb75a999041a3eb6a8f8177bebfa3c30d56f.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "db_name": "PostgreSQL",
- "query": "DELETE FROM casbin_rule WHERE\n ptype = $1 AND\n (v4 is NULL OR v4 = COALESCE($2,v4)) AND\n (v5 is NULL OR v5 = COALESCE($3,v5))",
- "describe": {
- "columns": [],
- "parameters": {
- "Left": [
- "Text",
- "Varchar",
- "Varchar"
- ]
- },
- "nullable": []
- },
- "hash": "4acfe0086a593b08177791bb3b47cb75a999041a3eb6a8f8177bebfa3c30d56f"
-}
diff --git a/.sqlx/query-4e7b82d256f7298564f46af6a45b89853785c32a5f83cb0b25609329c760428a.json b/.sqlx/query-4e7b82d256f7298564f46af6a45b89853785c32a5f83cb0b25609329c760428a.json
deleted file mode 100644
index 4c4c1df..0000000
--- a/.sqlx/query-4e7b82d256f7298564f46af6a45b89853785c32a5f83cb0b25609329c760428a.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "db_name": "PostgreSQL",
- "query": "DELETE FROM casbin_rule WHERE\n ptype = $1 AND\n (v1 is NULL OR v1 = COALESCE($2,v1)) AND\n (v2 is NULL OR v2 = COALESCE($3,v2)) AND\n (v3 is NULL OR v3 = COALESCE($4,v3)) AND\n (v4 is NULL OR v4 = COALESCE($5,v4)) AND\n (v5 is NULL OR v5 = COALESCE($6,v5))",
- "describe": {
- "columns": [],
- "parameters": {
- "Left": [
- "Text",
- "Varchar",
- "Varchar",
- "Varchar",
- "Varchar",
- "Varchar"
- ]
- },
- "nullable": []
- },
- "hash": "4e7b82d256f7298564f46af6a45b89853785c32a5f83cb0b25609329c760428a"
-}
diff --git a/.sqlx/query-530d3f59ba6d986d3354242ff25faae78671d69c8935d2a2d57c0f9d1e91e832.json b/.sqlx/query-530d3f59ba6d986d3354242ff25faae78671d69c8935d2a2d57c0f9d1e91e832.json
deleted file mode 100644
index 1de61b2..0000000
--- a/.sqlx/query-530d3f59ba6d986d3354242ff25faae78671d69c8935d2a2d57c0f9d1e91e832.json
+++ /dev/null
@@ -1,123 +0,0 @@
-{
- "db_name": "PostgreSQL",
- "query": "SELECT id, ptype, v0, v1, v2, v3, v4, v5 from casbin_rule WHERE (\n ptype LIKE 'g%' AND v0 LIKE $1 AND v1 LIKE $2 AND v2 LIKE $3 AND v3 LIKE $4 AND v4 LIKE $5 AND v5 LIKE $6 )\n OR (\n ptype LIKE 'p%' AND v0 LIKE $7 AND v1 LIKE $8 AND v2 LIKE $9 AND v3 LIKE $10 AND v4 LIKE $11 AND v5 LIKE $12 );\n ",
- "describe": {
- "columns": [
- {
- "ordinal": 0,
- "name": "id",
- "type_info": "Int4",
- "origin": {
- "Table": {
- "table": "casbin_rule",
- "name": "id"
- }
- }
- },
- {
- "ordinal": 1,
- "name": "ptype",
- "type_info": "Varchar",
- "origin": {
- "Table": {
- "table": "casbin_rule",
- "name": "ptype"
- }
- }
- },
- {
- "ordinal": 2,
- "name": "v0",
- "type_info": "Varchar",
- "origin": {
- "Table": {
- "table": "casbin_rule",
- "name": "v0"
- }
- }
- },
- {
- "ordinal": 3,
- "name": "v1",
- "type_info": "Varchar",
- "origin": {
- "Table": {
- "table": "casbin_rule",
- "name": "v1"
- }
- }
- },
- {
- "ordinal": 4,
- "name": "v2",
- "type_info": "Varchar",
- "origin": {
- "Table": {
- "table": "casbin_rule",
- "name": "v2"
- }
- }
- },
- {
- "ordinal": 5,
- "name": "v3",
- "type_info": "Varchar",
- "origin": {
- "Table": {
- "table": "casbin_rule",
- "name": "v3"
- }
- }
- },
- {
- "ordinal": 6,
- "name": "v4",
- "type_info": "Varchar",
- "origin": {
- "Table": {
- "table": "casbin_rule",
- "name": "v4"
- }
- }
- },
- {
- "ordinal": 7,
- "name": "v5",
- "type_info": "Varchar",
- "origin": {
- "Table": {
- "table": "casbin_rule",
- "name": "v5"
- }
- }
- }
- ],
- "parameters": {
- "Left": [
- "Text",
- "Text",
- "Text",
- "Text",
- "Text",
- "Text",
- "Text",
- "Text",
- "Text",
- "Text",
- "Text",
- "Text"
- ]
- },
- "nullable": [
- false,
- false,
- false,
- false,
- false,
- false,
- false,
- false
- ]
- },
- "hash": "530d3f59ba6d986d3354242ff25faae78671d69c8935d2a2d57c0f9d1e91e832"
-}
diff --git a/.sqlx/query-f130c22d14ee2a99b9220ac1a45226ba97993ede9988a4c57d58bd066500a119.json b/.sqlx/query-f130c22d14ee2a99b9220ac1a45226ba97993ede9988a4c57d58bd066500a119.json
deleted file mode 100644
index ef54cdb..0000000
--- a/.sqlx/query-f130c22d14ee2a99b9220ac1a45226ba97993ede9988a4c57d58bd066500a119.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "db_name": "PostgreSQL",
- "query": "DELETE FROM casbin_rule WHERE\n ptype = $1 AND\n (v0 is NULL OR v0 = COALESCE($2,v0)) AND\n (v1 is NULL OR v1 = COALESCE($3,v1)) AND\n (v2 is NULL OR v2 = COALESCE($4,v2)) AND\n (v3 is NULL OR v3 = COALESCE($5,v3)) AND\n (v4 is NULL OR v4 = COALESCE($6,v4)) AND\n (v5 is NULL OR v5 = COALESCE($7,v5))",
- "describe": {
- "columns": [],
- "parameters": {
- "Left": [
- "Text",
- "Varchar",
- "Varchar",
- "Varchar",
- "Varchar",
- "Varchar",
- "Varchar"
- ]
- },
- "nullable": []
- },
- "hash": "f130c22d14ee2a99b9220ac1a45226ba97993ede9988a4c57d58bd066500a119"
-}
diff --git a/.sqlx/query-f8611a862ed1d3b982e8aa5ccab21e00c42a3fad8082cf15c2af88cd8388f41b.json b/.sqlx/query-f8611a862ed1d3b982e8aa5ccab21e00c42a3fad8082cf15c2af88cd8388f41b.json
deleted file mode 100644
index 0daaa8a..0000000
--- a/.sqlx/query-f8611a862ed1d3b982e8aa5ccab21e00c42a3fad8082cf15c2af88cd8388f41b.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "db_name": "PostgreSQL",
- "query": "DELETE FROM casbin_rule WHERE\n ptype = $1 AND\n (v2 is NULL OR v2 = COALESCE($2,v2)) AND\n (v3 is NULL OR v3 = COALESCE($3,v3)) AND\n (v4 is NULL OR v4 = COALESCE($4,v4)) AND\n (v5 is NULL OR v5 = COALESCE($5,v5))",
- "describe": {
- "columns": [],
- "parameters": {
- "Left": [
- "Text",
- "Varchar",
- "Varchar",
- "Varchar",
- "Varchar"
- ]
- },
- "nullable": []
- },
- "hash": "f8611a862ed1d3b982e8aa5ccab21e00c42a3fad8082cf15c2af88cd8388f41b"
-}
diff --git a/.sqlx/query-fa51ae7af271fc17c848694fbf1b37d46c5a2f4202e1b8dce1f66a65069beb0b.json b/.sqlx/query-fa51ae7af271fc17c848694fbf1b37d46c5a2f4202e1b8dce1f66a65069beb0b.json
deleted file mode 100644
index 4a5f7e8..0000000
--- a/.sqlx/query-fa51ae7af271fc17c848694fbf1b37d46c5a2f4202e1b8dce1f66a65069beb0b.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "db_name": "PostgreSQL",
- "query": "DELETE FROM casbin_rule WHERE\n ptype = $1 AND\n (v5 is NULL OR v5 = COALESCE($2,v5))",
- "describe": {
- "columns": [],
- "parameters": {
- "Left": [
- "Text",
- "Varchar"
- ]
- },
- "nullable": []
- },
- "hash": "fa51ae7af271fc17c848694fbf1b37d46c5a2f4202e1b8dce1f66a65069beb0b"
-}
diff --git a/README.md b/README.md
index 45c0a31..cd12925 100644
--- a/README.md
+++ b/README.md
@@ -51,9 +51,11 @@ tokio = { version = "1.1.1", features = ["macros"] }
## Configure
+**No database is needed to build this crate.** All queries are executed at runtime, so `cargo build` works offline and you never have to set `DATABASE_URL` or run `cargo sqlx prepare` in your own project. The steps below are only about the database your application talks to at runtime (and about running this repository's own test suite).
+
1. Set up database environment
- You must prepare the database environment so that `Sqlx` can do static check with queries during compile time. One convenient option is using docker to get your database environment ready:
+ One convenient option is using docker to get your database environment ready:
```bash
#!/bin/bash
@@ -109,6 +111,8 @@ tokio = { version = "1.1.1", features = ["macros"] }
2. Create table `casbin_rule`
+ `SqlxAdapter` issues `CREATE TABLE IF NOT EXISTS` on startup, so this is optional — do it yourself only if your database user is not allowed to create tables.
+
```bash
# PostgreSQL
psql postgres://casbin_rs:casbin_rs@127.0.0.1:5432/casbin -c "CREATE TABLE IF NOT EXISTS casbin_rule (
@@ -155,7 +159,7 @@ tokio = { version = "1.1.1", features = ["macros"] }
);"
```
-3. Configure `env`
+3. Configure `env` (only needed to run this repository's tests)
Rename `sample.env` to `.env` and put `DATABASE_URL`, `POOL_SIZE` inside
diff --git a/src/actions.rs b/src/actions.rs
index be121bc..d5aa58e 100644
--- a/src/actions.rs
+++ b/src/actions.rs
@@ -7,27 +7,30 @@ use sqlx::error::Error as SqlxError;
use crate::models::{CasbinRule, NewCasbinRule};
#[cfg(feature = "postgres")]
-use sqlx::postgres::PgQueryResult;
+pub type ConnectionPool = sqlx::PgPool;
#[cfg(feature = "mysql")]
-use sqlx::mysql::MySqlQueryResult;
+pub type ConnectionPool = sqlx::MySqlPool;
#[cfg(feature = "sqlite")]
-use sqlx::sqlite::SqliteQueryResult;
+pub type ConnectionPool = sqlx::SqlitePool;
#[cfg(feature = "postgres")]
-pub type ConnectionPool = sqlx::PgPool;
+pub type QueryResult = sqlx::postgres::PgQueryResult;
#[cfg(feature = "mysql")]
-pub type ConnectionPool = sqlx::MySqlPool;
+pub type QueryResult = sqlx::mysql::MySqlQueryResult;
#[cfg(feature = "sqlite")]
-pub type ConnectionPool = sqlx::SqlitePool;
+pub type QueryResult = sqlx::sqlite::SqliteQueryResult;
+// The statements below are run through the plain `sqlx::query` API on purpose:
+// the `sqlx::query!` macros validate SQL against a live database at *compile*
+// time, which would force every downstream crate to have a reachable database
+// (or a matching `.sqlx` cache for its own driver) just to build this adapter.
#[cfg(feature = "postgres")]
-pub async fn new(conn: &ConnectionPool) -> Result<PgQueryResult> {
- sqlx::query!(
- "CREATE TABLE IF NOT EXISTS casbin_rule (
+mod sql {
+ pub(super) const CREATE_TABLE: &str = "CREATE TABLE IF NOT EXISTS casbin_rule (
id SERIAL PRIMARY KEY,
ptype VARCHAR NOT NULL,
v0 VARCHAR NOT NULL,
@@ -37,39 +40,72 @@ pub async fn new(conn: &ConnectionPool) -> Result<PgQueryResult> {
v4 VARCHAR NOT NULL,
v5 VARCHAR NOT NULL,
CONSTRAINT unique_key_sqlx_adapter UNIQUE(ptype, v0, v1, v2, v3, v4, v5)
- );
- "
- )
- .execute(conn)
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))
-}
+ );";
-#[cfg(feature = "sqlite")]
-pub async fn new(conn: &ConnectionPool) -> Result<SqliteQueryResult> {
- sqlx::query!(
- "CREATE TABLE IF NOT EXISTS casbin_rule (
- id SERIAL PRIMARY KEY,
- ptype VARCHAR NOT NULL,
- v0 VARCHAR NOT NULL,
- v1 VARCHAR NOT NULL,
- v2 VARCHAR NOT NULL,
- v3 VARCHAR NOT NULL,
- v4 VARCHAR NOT NULL,
- v5 VARCHAR NOT NULL,
- CONSTRAINT unique_key_sqlx_adapter UNIQUE(ptype, v0, v1, v2, v3, v4, v5)
- );
- "
- )
- .execute(conn)
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))
+ pub(super) const REMOVE_POLICY: &str = "DELETE FROM casbin_rule WHERE
+ ptype = $1 AND
+ v0 = $2 AND
+ v1 = $3 AND
+ v2 = $4 AND
+ v3 = $5 AND
+ v4 = $6 AND
+ v5 = $7";
+
+ /// Indexed by `field_index`: entry `i` binds `ptype` plus `6 - i` values.
+ pub(super) const REMOVE_FILTERED_POLICY: [&str; 6] = [
+ "DELETE FROM casbin_rule WHERE
+ ptype = $1 AND
+ (v0 is NULL OR v0 = COALESCE($2,v0)) AND
+ (v1 is NULL OR v1 = COALESCE($3,v1)) AND
+ (v2 is NULL OR v2 = COALESCE($4,v2)) AND
+ (v3 is NULL OR v3 = COALESCE($5,v3)) AND
+ (v4 is NULL OR v4 = COALESCE($6,v4)) AND
+ (v5 is NULL OR v5 = COALESCE($7,v5))",
+ "DELETE FROM casbin_rule WHERE
+ ptype = $1 AND
+ (v1 is NULL OR v1 = COALESCE($2,v1)) AND
+ (v2 is NULL OR v2 = COALESCE($3,v2)) AND
+ (v3 is NULL OR v3 = COALESCE($4,v3)) AND
+ (v4 is NULL OR v4 = COALESCE($5,v4)) AND
+ (v5 is NULL OR v5 = COALESCE($6,v5))",
+ "DELETE FROM casbin_rule WHERE
+ ptype = $1 AND
+ (v2 is NULL OR v2 = COALESCE($2,v2)) AND
+ (v3 is NULL OR v3 = COALESCE($3,v3)) AND
+ (v4 is NULL OR v4 = COALESCE($4,v4)) AND
+ (v5 is NULL OR v5 = COALESCE($5,v5))",
+ "DELETE FROM casbin_rule WHERE
+ ptype = $1 AND
+ (v3 is NULL OR v3 = COALESCE($2,v3)) AND
+ (v4 is NULL OR v4 = COALESCE($3,v4)) AND
+ (v5 is NULL OR v5 = COALESCE($4,v5))",
+ "DELETE FROM casbin_rule WHERE
+ ptype = $1 AND
+ (v4 is NULL OR v4 = COALESCE($2,v4)) AND
+ (v5 is NULL OR v5 = COALESCE($3,v5))",
+ "DELETE FROM casbin_rule WHERE
+ ptype = $1 AND
+ (v5 is NULL OR v5 = COALESCE($2,v5))",
+ ];
+
+ pub(super) const LOAD_POLICY: &str =
+ "SELECT id, ptype, v0, v1, v2, v3, v4, v5 FROM casbin_rule";
+
+ pub(super) const LOAD_FILTERED_POLICY: &str =
+ "SELECT id, ptype, v0, v1, v2, v3, v4, v5 FROM casbin_rule WHERE (
+ ptype LIKE 'g%' AND v0 LIKE $1 AND v1 LIKE $2 AND v2 LIKE $3 AND v3 LIKE $4 AND v4 LIKE $5 AND v5 LIKE $6 )
+ OR (
+ ptype LIKE 'p%' AND v0 LIKE $7 AND v1 LIKE $8 AND v2 LIKE $9 AND v3 LIKE $10 AND v4 LIKE $11 AND v5 LIKE $12 )";
+
+ pub(super) const ADD_POLICY: &str = "INSERT INTO casbin_rule ( ptype, v0, v1, v2, v3, v4, v5 )
+ VALUES ( $1, $2, $3, $4, $5, $6, $7 )";
+
+ pub(super) const CLEAR_POLICY: &str = "DELETE FROM casbin_rule";
}
#[cfg(feature = "mysql")]
-pub async fn new(conn: &ConnectionPool) -> Result<MySqlQueryResult> {
- sqlx::query!(
- "CREATE TABLE IF NOT EXISTS casbin_rule (
+mod sql {
+ pub(super) const CREATE_TABLE: &str = "CREATE TABLE IF NOT EXISTS casbin_rule (
id INT NOT NULL AUTO_INCREMENT,
ptype VARCHAR(12) NOT NULL,
v0 VARCHAR(128) NOT NULL,
@@ -80,622 +116,247 @@ pub async fn new(conn: &ConnectionPool) -> Result<MySqlQueryResult> {
v5 VARCHAR(128) NOT NULL,
PRIMARY KEY(id),
CONSTRAINT unique_key_sqlx_adapter UNIQUE(ptype, v0, v1, v2, v3, v4, v5)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8;",
- )
- .execute(conn)
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))
-}
-
-#[cfg(feature = "postgres")]
-pub async fn remove_policy(conn: &ConnectionPool, pt: &str, rule: Vec<String>) -> Result<bool> {
- let rule = normalize_casbin_rule(rule);
- sqlx::query!(
- "DELETE FROM casbin_rule WHERE
- ptype = $1 AND
- v0 = $2 AND
- v1 = $3 AND
- v2 = $4 AND
- v3 = $5 AND
- v4 = $6 AND
- v5 = $7",
- pt,
- rule[0],
- rule[1],
- rule[2],
- rule[3],
- rule[4],
- rule[5]
- )
- .execute(conn)
- .await
- .map(|n| PgQueryResult::rows_affected(&n) == 1)
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))
-}
-
-#[cfg(feature = "sqlite")]
-pub async fn remove_policy(conn: &ConnectionPool, pt: &str, rule: Vec<String>) -> Result<bool> {
- let rule = normalize_casbin_rule(rule);
- sqlx::query!(
- "DELETE FROM casbin_rule WHERE
- ptype = ?1 AND
- v0 = ?2 AND
- v1 = ?3 AND
- v2 = ?4 AND
- v3 = ?5 AND
- v4 = ?6 AND
- v5 = ?7",
- pt,
- rule[0],
- rule[1],
- rule[2],
- rule[3],
- rule[4],
- rule[5]
- )
- .execute(conn)
- .await
- .map(|n| SqliteQueryResult::rows_affected(&n) == 1)
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))
-}
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8;";
-#[cfg(feature = "mysql")]
-pub async fn remove_policy(conn: &ConnectionPool, pt: &str, rule: Vec<String>) -> Result<bool> {
- let rule = normalize_casbin_rule(rule);
- sqlx::query!(
- "DELETE FROM casbin_rule WHERE
+ pub(super) const REMOVE_POLICY: &str = "DELETE FROM casbin_rule WHERE
ptype = ? AND
v0 = ? AND
v1 = ? AND
v2 = ? AND
v3 = ? AND
v4 = ? AND
- v5 = ?",
- pt,
- rule[0],
- rule[1],
- rule[2],
- rule[3],
- rule[4],
- rule[5]
- )
- .execute(conn)
- .await
- .map(|n| MySqlQueryResult::rows_affected(&n) == 1)
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))
-}
+ v5 = ?";
-#[cfg(feature = "postgres")]
-pub async fn remove_policies(
- conn: &ConnectionPool,
- pt: &str,
- rules: Vec<Vec<String>>,
-) -> Result<bool> {
- let mut transaction = conn
- .begin()
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
- for rule in rules {
- let rule = normalize_casbin_rule(rule);
- sqlx::query!(
- "DELETE FROM casbin_rule WHERE
- ptype = $1 AND
- v0 = $2 AND
- v1 = $3 AND
- v2 = $4 AND
- v3 = $5 AND
- v4 = $6 AND
- v5 = $7",
- pt,
- rule[0],
- rule[1],
- rule[2],
- rule[3],
- rule[4],
- rule[5]
- )
- .execute(&mut *transaction)
- .await
- .and_then(|n| {
- if PgQueryResult::rows_affected(&n) == 1 {
- Ok(true)
- } else {
- Err(SqlxError::RowNotFound)
- }
- })
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
- }
- transaction
- .commit()
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
- Ok(true)
+ /// Indexed by `field_index`: entry `i` binds `ptype` plus `6 - i` values.
+ pub(super) const REMOVE_FILTERED_POLICY: [&str; 6] = [
+ "DELETE FROM casbin_rule WHERE
+ ptype = ? AND
+ (v0 is NULL OR v0 = COALESCE(?,v0)) AND
+ (v1 is NULL OR v1 = COALESCE(?,v1)) AND
+ (v2 is NULL OR v2 = COALESCE(?,v2)) AND
+ (v3 is NULL OR v3 = COALESCE(?,v3)) AND
+ (v4 is NULL OR v4 = COALESCE(?,v4)) AND
+ (v5 is NULL OR v5 = COALESCE(?,v5))",
+ "DELETE FROM casbin_rule WHERE
+ ptype = ? AND
+ (v1 is NULL OR v1 = COALESCE(?,v1)) AND
+ (v2 is NULL OR v2 = COALESCE(?,v2)) AND
+ (v3 is NULL OR v3 = COALESCE(?,v3)) AND
+ (v4 is NULL OR v4 = COALESCE(?,v4)) AND
+ (v5 is NULL OR v5 = COALESCE(?,v5))",
+ "DELETE FROM casbin_rule WHERE
+ ptype = ? AND
+ (v2 is NULL OR v2 = COALESCE(?,v2)) AND
+ (v3 is NULL OR v3 = COALESCE(?,v3)) AND
+ (v4 is NULL OR v4 = COALESCE(?,v4)) AND
+ (v5 is NULL OR v5 = COALESCE(?,v5))",
+ "DELETE FROM casbin_rule WHERE
+ ptype = ? AND
+ (v3 is NULL OR v3 = COALESCE(?,v3)) AND
+ (v4 is NULL OR v4 = COALESCE(?,v4)) AND
+ (v5 is NULL OR v5 = COALESCE(?,v5))",
+ "DELETE FROM casbin_rule WHERE
+ ptype = ? AND
+ (v4 is NULL OR v4 = COALESCE(?,v4)) AND
+ (v5 is NULL OR v5 = COALESCE(?,v5))",
+ "DELETE FROM casbin_rule WHERE
+ ptype = ? AND
+ (v5 is NULL OR v5 = COALESCE(?,v5))",
+ ];
+
+ pub(super) const LOAD_POLICY: &str =
+ "SELECT id, ptype, v0, v1, v2, v3, v4, v5 FROM casbin_rule";
+
+ pub(super) const LOAD_FILTERED_POLICY: &str =
+ "SELECT id, ptype, v0, v1, v2, v3, v4, v5 FROM casbin_rule WHERE (
+ ptype LIKE 'g%' AND v0 LIKE ? AND v1 LIKE ? AND v2 LIKE ? AND v3 LIKE ? AND v4 LIKE ? AND v5 LIKE ? )
+ OR (
+ ptype LIKE 'p%' AND v0 LIKE ? AND v1 LIKE ? AND v2 LIKE ? AND v3 LIKE ? AND v4 LIKE ? AND v5 LIKE ? )";
+
+ pub(super) const ADD_POLICY: &str = "INSERT INTO casbin_rule ( ptype, v0, v1, v2, v3, v4, v5 )
+ VALUES ( ?, ?, ?, ?, ?, ?, ? )";
+
+ pub(super) const CLEAR_POLICY: &str = "DELETE FROM casbin_rule";
}
#[cfg(feature = "sqlite")]
-pub async fn remove_policies(
- conn: &ConnectionPool,
- pt: &str,
- rules: Vec<Vec<String>>,
-) -> Result<bool> {
- let mut transaction = conn
- .begin()
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
- for rule in rules {
- let rule = normalize_casbin_rule(rule);
- sqlx::query!(
- "DELETE FROM casbin_rule WHERE
- ptype = ?1 AND
- v0 = ?2 AND
- v1 = ?3 AND
- v2 = ?4 AND
- v3 = ?5 AND
- v4 = ?6 AND
- v5 = ?7",
- pt,
- rule[0],
- rule[1],
- rule[2],
- rule[3],
- rule[4],
- rule[5]
- )
- .execute(&mut *transaction)
- .await
- .and_then(|n| {
- if SqliteQueryResult::rows_affected(&n) == 1 {
- Ok(true)
- } else {
- Err(SqlxError::RowNotFound)
- }
- })
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
- }
- transaction
- .commit()
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
- Ok(true)
-}
+mod sql {
+ // `INTEGER PRIMARY KEY` is the only form SQLite treats as an auto-assigned
+ // rowid alias; the `SERIAL PRIMARY KEY` this used to say left `id` NULL on
+ // every insert, which then failed to decode back into `CasbinRule::id`.
+ pub(super) const CREATE_TABLE: &str = "CREATE TABLE IF NOT EXISTS casbin_rule (
+ id INTEGER PRIMARY KEY,
+ ptype VARCHAR(12) NOT NULL,
+ v0 VARCHAR(128) NOT NULL,
+ v1 VARCHAR(128) NOT NULL,
+ v2 VARCHAR(128) NOT NULL,
+ v3 VARCHAR(128) NOT NULL,
+ v4 VARCHAR(128) NOT NULL,
+ v5 VARCHAR(128) NOT NULL,
+ CONSTRAINT unique_key_sqlx_adapter UNIQUE(ptype, v0, v1, v2, v3, v4, v5)
+ );";
-#[cfg(feature = "mysql")]
-pub async fn remove_policies(
- conn: &ConnectionPool,
- pt: &str,
- rules: Vec<Vec<String>>,
-) -> Result<bool> {
- let mut transaction = conn
- .begin()
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
- for rule in rules {
- let rule = normalize_casbin_rule(rule);
- sqlx::query!(
- "DELETE FROM casbin_rule WHERE
+ pub(super) const REMOVE_POLICY: &str = "DELETE FROM casbin_rule WHERE
ptype = ? AND
v0 = ? AND
v1 = ? AND
v2 = ? AND
v3 = ? AND
v4 = ? AND
- v5 = ?",
- pt,
- rule[0],
- rule[1],
- rule[2],
- rule[3],
- rule[4],
- rule[5]
- )
- .execute(&mut *transaction)
- .await
- .and_then(|n| {
- if MySqlQueryResult::rows_affected(&n) == 1 {
- Ok(true)
- } else {
- Err(SqlxError::RowNotFound)
- }
- })
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
- }
- transaction
- .commit()
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
- Ok(true)
-}
-
-#[cfg(feature = "postgres")]
-pub async fn remove_filtered_policy(
- conn: &ConnectionPool,
- pt: &str,
- field_index: usize,
- field_values: Vec<String>,
-) -> Result<bool> {
- let field_values = normalize_casbin_rule_option(field_values);
- let boxed_query = if field_index == 5 {
- Box::new(sqlx::query!(
- "DELETE FROM casbin_rule WHERE
- ptype = $1 AND
- (v5 is NULL OR v5 = COALESCE($2,v5))",
- pt.to_string(),
- field_values[0]
- ))
- } else if field_index == 4 {
- Box::new(sqlx::query!(
- "DELETE FROM casbin_rule WHERE
- ptype = $1 AND
- (v4 is NULL OR v4 = COALESCE($2,v4)) AND
- (v5 is NULL OR v5 = COALESCE($3,v5))",
- pt,
- field_values[0],
- field_values[1]
- ))
- } else if field_index == 3 {
- Box::new(sqlx::query!(
- "DELETE FROM casbin_rule WHERE
- ptype = $1 AND
- (v3 is NULL OR v3 = COALESCE($2,v3)) AND
- (v4 is NULL OR v4 = COALESCE($3,v4)) AND
- (v5 is NULL OR v5 = COALESCE($4,v5))",
- pt,
- field_values[0],
- field_values[1],
- field_values[2]
- ))
- } else if field_index == 2 {
- Box::new(sqlx::query!(
- "DELETE FROM casbin_rule WHERE
- ptype = $1 AND
- (v2 is NULL OR v2 = COALESCE($2,v2)) AND
- (v3 is NULL OR v3 = COALESCE($3,v3)) AND
- (v4 is NULL OR v4 = COALESCE($4,v4)) AND
- (v5 is NULL OR v5 = COALESCE($5,v5))",
- pt,
- field_values[0],
- field_values[1],
- field_values[2],
- field_values[3]
- ))
- } else if field_index == 1 {
- Box::new(sqlx::query!(
- "DELETE FROM casbin_rule WHERE
- ptype = $1 AND
- (v1 is NULL OR v1 = COALESCE($2,v1)) AND
- (v2 is NULL OR v2 = COALESCE($3,v2)) AND
- (v3 is NULL OR v3 = COALESCE($4,v3)) AND
- (v4 is NULL OR v4 = COALESCE($5,v4)) AND
- (v5 is NULL OR v5 = COALESCE($6,v5))",
- pt,
- field_values[0],
- field_values[1],
- field_values[2],
- field_values[3],
- field_values[4]
- ))
- } else {
- Box::new(sqlx::query!(
- "DELETE FROM casbin_rule WHERE
- ptype = $1 AND
- (v0 is NULL OR v0 = COALESCE($2,v0)) AND
- (v1 is NULL OR v1 = COALESCE($3,v1)) AND
- (v2 is NULL OR v2 = COALESCE($4,v2)) AND
- (v3 is NULL OR v3 = COALESCE($5,v3)) AND
- (v4 is NULL OR v4 = COALESCE($6,v4)) AND
- (v5 is NULL OR v5 = COALESCE($7,v5))",
- pt,
- field_values[0],
- field_values[1],
- field_values[2],
- field_values[3],
- field_values[4],
- field_values[5]
- ))
- };
-
- boxed_query
- .execute(conn)
- .await
- .map(|n| PgQueryResult::rows_affected(&n) >= 1)
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))
-}
-
-#[cfg(feature = "sqlite")]
-pub async fn remove_filtered_policy(
- conn: &ConnectionPool,
- pt: &str,
- field_index: usize,
- field_values: Vec<String>,
-) -> Result<bool> {
- let field_values = normalize_casbin_rule_option(field_values);
- let boxed_query = if field_index == 5 {
- Box::new(sqlx::query!(
- "DELETE FROM casbin_rule WHERE
- ptype = $1 AND
- (v5 is NULL OR v5 = COALESCE(?2,v5))",
- pt,
- field_values[0]
- ))
- } else if field_index == 4 {
- Box::new(sqlx::query!(
- "DELETE FROM casbin_rule WHERE
- ptype = ?1 AND
- (v4 is NULL OR v4 = COALESCE(?2,v4)) AND
- (v5 is NULL OR v5 = COALESCE(?3,v5))",
- pt,
- field_values[0],
- field_values[1]
- ))
- } else if field_index == 3 {
- Box::new(sqlx::query!(
- "DELETE FROM casbin_rule WHERE
- ptype = ?1 AND
- (v3 is NULL OR v3 = COALESCE(?2,v3)) AND
- (v4 is NULL OR v4 = COALESCE(?3,v4)) AND
- (v5 is NULL OR v5 = COALESCE(?4,v5))",
- pt,
- field_values[0],
- field_values[1],
- field_values[2]
- ))
- } else if field_index == 2 {
- Box::new(sqlx::query!(
- "DELETE FROM casbin_rule WHERE
- ptype = ?1 AND
- (v2 is NULL OR v2 = COALESCE(?2,v2)) AND
- (v3 is NULL OR v3 = COALESCE(?3,v3)) AND
- (v4 is NULL OR v4 = COALESCE(?4,v4)) AND
- (v5 is NULL OR v5 = COALESCE(?5,v5))",
- pt,
- field_values[0],
- field_values[1],
- field_values[2],
- field_values[3]
- ))
- } else if field_index == 1 {
- Box::new(sqlx::query!(
- "DELETE FROM casbin_rule WHERE
- ptype = ?1 AND
- (v1 is NULL OR v1 = COALESCE(?2,v1)) AND
- (v2 is NULL OR v2 = COALESCE(?3,v2)) AND
- (v3 is NULL OR v3 = COALESCE(?4,v3)) AND
- (v4 is NULL OR v4 = COALESCE(?5,v4)) AND
- (v5 is NULL OR v5 = COALESCE(?6,v5))",
- pt,
- field_values[0],
- field_values[1],
- field_values[2],
- field_values[3],
- field_values[4]
- ))
- } else {
- Box::new(sqlx::query!(
- "DELETE FROM casbin_rule WHERE
- ptype = ?1 AND
- (v0 is NULL OR v0 = COALESCE(?2,v0)) AND
- (v1 is NULL OR v1 = COALESCE(?3,v1)) AND
- (v2 is NULL OR v2 = COALESCE(?4,v2)) AND
- (v3 is NULL OR v3 = COALESCE(?5,v3)) AND
- (v4 is NULL OR v4 = COALESCE(?6,v4)) AND
- (v5 is NULL OR v5 = COALESCE(?7,v5))",
- pt,
- field_values[0],
- field_values[1],
- field_values[2],
- field_values[3],
- field_values[4],
- field_values[5]
- ))
- };
+ v5 = ?";
- boxed_query
- .execute(conn)
- .await
- .map(|n| SqliteQueryResult::rows_affected(&n) >= 1)
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))
-}
-
-#[cfg(feature = "mysql")]
-pub async fn remove_filtered_policy(
- conn: &ConnectionPool,
- pt: &str,
- field_index: usize,
- field_values: Vec<String>,
-) -> Result<bool> {
- let field_values = normalize_casbin_rule_option(field_values);
- let boxed_query = if field_index == 5 {
- Box::new(sqlx::query!(
- "DELETE FROM casbin_rule WHERE
- ptype = ? AND
- (v5 is NULL OR v5 = COALESCE(?,v5))",
- pt,
- field_values[0]
- ))
- } else if field_index == 4 {
- Box::new(sqlx::query!(
- "DELETE FROM casbin_rule WHERE
+ /// Indexed by `field_index`: entry `i` binds `ptype` plus `6 - i` values.
+ pub(super) const REMOVE_FILTERED_POLICY: [&str; 6] = [
+ "DELETE FROM casbin_rule WHERE
ptype = ? AND
+ (v0 is NULL OR v0 = COALESCE(?,v0)) AND
+ (v1 is NULL OR v1 = COALESCE(?,v1)) AND
+ (v2 is NULL OR v2 = COALESCE(?,v2)) AND
+ (v3 is NULL OR v3 = COALESCE(?,v3)) AND
(v4 is NULL OR v4 = COALESCE(?,v4)) AND
(v5 is NULL OR v5 = COALESCE(?,v5))",
- pt.to_string(),
- field_values[0],
- field_values[1]
- ))
- } else if field_index == 3 {
- Box::new(sqlx::query!(
- "DELETE FROM casbin_rule WHERE
+ "DELETE FROM casbin_rule WHERE
ptype = ? AND
+ (v1 is NULL OR v1 = COALESCE(?,v1)) AND
+ (v2 is NULL OR v2 = COALESCE(?,v2)) AND
(v3 is NULL OR v3 = COALESCE(?,v3)) AND
(v4 is NULL OR v4 = COALESCE(?,v4)) AND
(v5 is NULL OR v5 = COALESCE(?,v5))",
- pt,
- field_values[0],
- field_values[1],
- field_values[2]
- ))
- } else if field_index == 2 {
- Box::new(sqlx::query!(
- "DELETE FROM casbin_rule WHERE
+ "DELETE FROM casbin_rule WHERE
ptype = ? AND
(v2 is NULL OR v2 = COALESCE(?,v2)) AND
(v3 is NULL OR v3 = COALESCE(?,v3)) AND
(v4 is NULL OR v4 = COALESCE(?,v4)) AND
(v5 is NULL OR v5 = COALESCE(?,v5))",
- pt,
- field_values[0],
- field_values[1],
- field_values[2],
- field_values[3]
- ))
- } else if field_index == 1 {
- Box::new(sqlx::query!(
- "DELETE FROM casbin_rule WHERE
+ "DELETE FROM casbin_rule WHERE
ptype = ? AND
- (v1 is NULL OR v1 = COALESCE(?,v1)) AND
- (v2 is NULL OR v2 = COALESCE(?,v2)) AND
(v3 is NULL OR v3 = COALESCE(?,v3)) AND
(v4 is NULL OR v4 = COALESCE(?,v4)) AND
(v5 is NULL OR v5 = COALESCE(?,v5))",
- pt,
- field_values[0],
- field_values[1],
- field_values[2],
- field_values[3],
- field_values[4]
- ))
- } else {
- Box::new(sqlx::query!(
- "DELETE FROM casbin_rule WHERE
+ "DELETE FROM casbin_rule WHERE
ptype = ? AND
- (v0 is NULL OR v0 = COALESCE(?,v0)) AND
- (v1 is NULL OR v1 = COALESCE(?,v1)) AND
- (v2 is NULL OR v2 = COALESCE(?,v2)) AND
- (v3 is NULL OR v3 = COALESCE(?,v3)) AND
(v4 is NULL OR v4 = COALESCE(?,v4)) AND
(v5 is NULL OR v5 = COALESCE(?,v5))",
- pt,
- field_values[0],
- field_values[1],
- field_values[2],
- field_values[3],
- field_values[4],
- field_values[5]
- ))
- };
+ "DELETE FROM casbin_rule WHERE
+ ptype = ? AND
+ (v5 is NULL OR v5 = COALESCE(?,v5))",
+ ];
- boxed_query
- .execute(conn)
- .await
- .map(|n| MySqlQueryResult::rows_affected(&n) >= 1)
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))
-}
+ pub(super) const LOAD_POLICY: &str =
+ "SELECT id, ptype, v0, v1, v2, v3, v4, v5 FROM casbin_rule";
-#[cfg(feature = "postgres")]
-pub(crate) async fn load_policy(conn: &ConnectionPool) -> Result<Vec<CasbinRule>> {
- let casbin_rule: Vec<CasbinRule> = sqlx::query_as!(
- CasbinRule,
- "SELECT id, ptype, v0, v1, v2, v3, v4, v5 FROM casbin_rule"
- )
- .fetch_all(conn)
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
+ pub(super) const LOAD_FILTERED_POLICY: &str =
+ "SELECT id, ptype, v0, v1, v2, v3, v4, v5 FROM casbin_rule WHERE (
+ ptype LIKE 'g%' AND v0 LIKE ? AND v1 LIKE ? AND v2 LIKE ? AND v3 LIKE ? AND v4 LIKE ? AND v5 LIKE ? )
+ OR (
+ ptype LIKE 'p%' AND v0 LIKE ? AND v1 LIKE ? AND v2 LIKE ? AND v3 LIKE ? AND v4 LIKE ? AND v5 LIKE ? )";
- Ok(casbin_rule)
+ pub(super) const ADD_POLICY: &str = "INSERT INTO casbin_rule ( ptype, v0, v1, v2, v3, v4, v5 )
+ VALUES ( ?, ?, ?, ?, ?, ?, ? )";
+
+ pub(super) const CLEAR_POLICY: &str = "DELETE FROM casbin_rule";
}
-#[cfg(feature = "sqlite")]
-pub(crate) async fn load_policy(conn: &ConnectionPool) -> Result<Vec<CasbinRule>> {
- let casbin_rule: Vec<CasbinRule> = sqlx::query_as!(
- CasbinRule,
- "SELECT id, ptype, v0, v1, v2, v3, v4, v5 FROM casbin_rule"
- )
- .fetch_all(conn)
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
+fn adapter_error(err: SqlxError) -> CasbinError {
+ CasbinError::from(AdapterError(Box::new(Error::SqlxError(err))))
+}
- Ok(casbin_rule)
+pub async fn new(conn: &ConnectionPool) -> Result<QueryResult> {
+ sqlx::query(sql::CREATE_TABLE)
+ .execute(conn)
+ .await
+ .map_err(adapter_error)
}
-#[cfg(feature = "mysql")]
-pub(crate) async fn load_policy(conn: &ConnectionPool) -> Result<Vec<CasbinRule>> {
- let casbin_rule: Vec<CasbinRule> = sqlx::query_as!(
- CasbinRule,
- "SELECT id, ptype, v0, v1, v2, v3, v4, v5 FROM casbin_rule"
- )
- .fetch_all(conn)
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
+pub async fn remove_policy(conn: &ConnectionPool, pt: &str, rule: Vec<String>) -> Result<bool> {
+ let rule = normalize_casbin_rule(rule);
+ sqlx::query(sql::REMOVE_POLICY)
+ .bind(pt)
+ .bind(rule[0].as_str())
+ .bind(rule[1].as_str())
+ .bind(rule[2].as_str())
+ .bind(rule[3].as_str())
+ .bind(rule[4].as_str())
+ .bind(rule[5].as_str())
+ .execute(conn)
+ .await
+ .map(|n| n.rows_affected() == 1)
+ .map_err(adapter_error)
+}
- Ok(casbin_rule)
+pub async fn remove_policies(
+ conn: &ConnectionPool,
+ pt: &str,
+ rules: Vec<Vec<String>>,
+) -> Result<bool> {
+ let mut transaction = conn.begin().await.map_err(adapter_error)?;
+ for rule in rules {
+ let rule = normalize_casbin_rule(rule);
+ sqlx::query(sql::REMOVE_POLICY)
+ .bind(pt)
+ .bind(rule[0].as_str())
+ .bind(rule[1].as_str())
+ .bind(rule[2].as_str())
+ .bind(rule[3].as_str())
+ .bind(rule[4].as_str())
+ .bind(rule[5].as_str())
+ .execute(&mut *transaction)
+ .await
+ .and_then(|n| {
+ if n.rows_affected() == 1 {
+ Ok(true)
+ } else {
+ Err(SqlxError::RowNotFound)
+ }
+ })
+ .map_err(adapter_error)?;
+ }
+ transaction.commit().await.map_err(adapter_error)?;
+ Ok(true)
}
-#[cfg(feature = "postgres")]
-pub(crate) async fn load_filtered_policy(
+pub async fn remove_filtered_policy(
conn: &ConnectionPool,
- filter: &Filter<'_>,
-) -> Result<Vec<CasbinRule>> {
- let (g_filter, p_filter) = filtered_where_values(filter);
+ pt: &str,
+ field_index: usize,
+ field_values: Vec<String>,
+) -> Result<bool> {
+ let field_values = normalize_casbin_rule_option(field_values);
+ let field_index = if field_index > 5 { 0 } else { field_index };
- let casbin_rule: Vec<CasbinRule> = sqlx::query_as!(
- CasbinRule,
- "SELECT id, ptype, v0, v1, v2, v3, v4, v5 from casbin_rule WHERE (
- ptype LIKE 'g%' AND v0 LIKE $1 AND v1 LIKE $2 AND v2 LIKE $3 AND v3 LIKE $4 AND v4 LIKE $5 AND v5 LIKE $6 )
- OR (
- ptype LIKE 'p%' AND v0 LIKE $7 AND v1 LIKE $8 AND v2 LIKE $9 AND v3 LIKE $10 AND v4 LIKE $11 AND v5 LIKE $12 );
- ",
- g_filter[0], g_filter[1], g_filter[2], g_filter[3], g_filter[4], g_filter[5],
- p_filter[0], p_filter[1], p_filter[2], p_filter[3], p_filter[4], p_filter[5],)
- .fetch_all(conn)
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
+ let mut query = sqlx::query(sql::REMOVE_FILTERED_POLICY[field_index]).bind(pt);
+ for value in field_values.iter().take(6 - field_index) {
+ query = query.bind(value.as_deref());
+ }
- Ok(casbin_rule)
+ query
+ .execute(conn)
+ .await
+ .map(|n| n.rows_affected() >= 1)
+ .map_err(adapter_error)
}
-#[cfg(feature = "sqlite")]
-pub(crate) async fn load_filtered_policy(
- conn: &ConnectionPool,
- filter: &Filter<'_>,
-) -> Result<Vec<CasbinRule>> {
- let (g_filter, p_filter) = filtered_where_values(filter);
-
- let casbin_rule: Vec<CasbinRule> = sqlx::query_as!(
- CasbinRule,
- "SELECT id, ptype, v0, v1, v2, v3, v4, v5 from casbin_rule WHERE (
- ptype LIKE 'g%' AND v0 LIKE $1 AND v1 LIKE $2 AND v2 LIKE $3 AND v3 LIKE $4 AND v4 LIKE $5 AND v5 LIKE $6 )
- OR (
- ptype LIKE 'p%' AND v0 LIKE $7 AND v1 LIKE $8 AND v2 LIKE $9 AND v3 LIKE $10 AND v4 LIKE $11 AND v5 LIKE $12 );
- ",
- g_filter[0], g_filter[1], g_filter[2], g_filter[3], g_filter[4], g_filter[5],
- p_filter[0], p_filter[1], p_filter[2], p_filter[3], p_filter[4], p_filter[5],)
+pub(crate) async fn load_policy(conn: &ConnectionPool) -> Result<Vec<CasbinRule>> {
+ let casbin_rule: Vec<CasbinRule> = sqlx::query_as::<_, CasbinRule>(sql::LOAD_POLICY)
.fetch_all(conn)
.await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
+ .map_err(adapter_error)?;
Ok(casbin_rule)
}
-#[cfg(feature = "mysql")]
pub(crate) async fn load_filtered_policy(
conn: &ConnectionPool,
filter: &Filter<'_>,
) -> Result<Vec<CasbinRule>> {
let (g_filter, p_filter) = filtered_where_values(filter);
- let casbin_rule: Vec<CasbinRule> = sqlx::query_as!(
- CasbinRule,
- "SELECT id, ptype, v0, v1, v2, v3, v4, v5 from casbin_rule WHERE (
- ptype LIKE 'g%' AND v0 LIKE ? AND v1 LIKE ? AND v2 LIKE ? AND v3 LIKE ? AND v4 LIKE ? AND v5 LIKE ? )
- OR (
- ptype LIKE 'p%' AND v0 LIKE ? AND v1 LIKE ? AND v2 LIKE ? AND v3 LIKE ? AND v4 LIKE ? AND v5 LIKE ? );
- ",
- g_filter[0], g_filter[1], g_filter[2], g_filter[3], g_filter[4], g_filter[5],
- p_filter[0], p_filter[1], p_filter[2], p_filter[3], p_filter[4], p_filter[5],
- )
- .fetch_all(conn)
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
+ let mut query = sqlx::query_as::<_, CasbinRule>(sql::LOAD_FILTERED_POLICY);
+ for value in g_filter.iter().chain(p_filter.iter()) {
+ query = query.bind(*value);
+ }
+
+ let casbin_rule: Vec<CasbinRule> = query.fetch_all(conn).await.map_err(adapter_error)?;
Ok(casbin_rule)
}
@@ -716,363 +377,92 @@ fn filtered_where_values<'a>(filter: &Filter<'a>) -> ([&'a str; 6], [&'a str; 6]
(g_filter, p_filter)
}
-#[cfg(feature = "postgres")]
-pub(crate) async fn save_policy(
- conn: &ConnectionPool,
- rules: Vec<NewCasbinRule<'_>>,
-) -> Result<()> {
- let mut transaction = conn
- .begin()
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
- sqlx::query!("DELETE FROM casbin_rule")
- .execute(&mut *transaction)
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
- for rule in rules {
- sqlx::query!(
- "INSERT INTO casbin_rule ( ptype, v0, v1, v2, v3, v4, v5 )
- VALUES ( $1, $2, $3, $4, $5, $6, $7 )",
- rule.ptype,
- rule.v0,
- rule.v1,
- rule.v2,
- rule.v3,
- rule.v4,
- rule.v5
- )
- .execute(&mut *transaction)
- .await
- .and_then(|n| {
- if PgQueryResult::rows_affected(&n) == 1 {
- Ok(true)
- } else {
- Err(SqlxError::RowNotFound)
- }
- })
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
- }
- transaction
- .commit()
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
- Ok(())
-}
-
-#[cfg(feature = "sqlite")]
pub(crate) async fn save_policy(
conn: &ConnectionPool,
rules: Vec<NewCasbinRule<'_>>,
) -> Result<()> {
- let mut transaction = conn
- .begin()
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
- sqlx::query!("DELETE FROM casbin_rule")
+ let mut transaction = conn.begin().await.map_err(adapter_error)?;
+ sqlx::query(sql::CLEAR_POLICY)
.execute(&mut *transaction)
.await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
+ .map_err(adapter_error)?;
for rule in rules {
- sqlx::query!(
- "INSERT INTO casbin_rule ( ptype, v0, v1, v2, v3, v4, v5 )
- VALUES ( $1, $2, $3, $4, $5, $6, $7 )",
- rule.ptype,
- rule.v0,
- rule.v1,
- rule.v2,
- rule.v3,
- rule.v4,
- rule.v5
- )
- .execute(&mut *transaction)
- .await
- .and_then(|n| {
- if SqliteQueryResult::rows_affected(&n) == 1 {
- Ok(true)
- } else {
- Err(SqlxError::RowNotFound)
- }
- })
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
+ sqlx::query(sql::ADD_POLICY)
+ .bind(rule.ptype)
+ .bind(rule.v0)
+ .bind(rule.v1)
+ .bind(rule.v2)
+ .bind(rule.v3)
+ .bind(rule.v4)
+ .bind(rule.v5)
+ .execute(&mut *transaction)
+ .await
+ .and_then(|n| {
+ if n.rows_affected() == 1 {
+ Ok(true)
+ } else {
+ Err(SqlxError::RowNotFound)
+ }
+ })
+ .map_err(adapter_error)?;
}
- transaction
- .commit()
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
+ transaction.commit().await.map_err(adapter_error)?;
Ok(())
}
-#[cfg(feature = "mysql")]
-pub(crate) async fn save_policy<'a>(
- conn: &ConnectionPool,
- rules: Vec<NewCasbinRule<'a>>,
-) -> Result<()> {
- let mut transaction = conn
- .begin()
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
- sqlx::query!("DELETE FROM casbin_rule")
- .execute(&mut *transaction)
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
- for rule in rules {
- sqlx::query!(
- "INSERT INTO casbin_rule ( ptype, v0, v1, v2, v3, v4, v5 )
- VALUES ( ?, ?, ?, ?, ?, ?, ? )",
- rule.ptype,
- rule.v0,
- rule.v1,
- rule.v2,
- rule.v3,
- rule.v4,
- rule.v5
- )
- .execute(&mut *transaction)
- .await
- .and_then(|n| {
- if MySqlQueryResult::rows_affected(&n) == 1 {
- Ok(true)
- } else {
- Err(SqlxError::RowNotFound)
- }
- })
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
- }
- transaction
- .commit()
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
- Ok(())
-}
-
-#[cfg(feature = "postgres")]
pub(crate) async fn add_policy(conn: &ConnectionPool, rule: NewCasbinRule<'_>) -> Result<bool> {
- sqlx::query!(
- "INSERT INTO casbin_rule ( ptype, v0, v1, v2, v3, v4, v5 )
- VALUES ( $1, $2, $3, $4, $5, $6, $7 )",
- rule.ptype,
- rule.v0,
- rule.v1,
- rule.v2,
- rule.v3,
- rule.v4,
- rule.v5
- )
- .execute(conn)
- .await
- .map(|n| PgQueryResult::rows_affected(&n) == 1)
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
-
- Ok(true)
-}
-
-#[cfg(feature = "sqlite")]
-pub(crate) async fn add_policy(conn: &ConnectionPool, rule: NewCasbinRule<'_>) -> Result<bool> {
- sqlx::query!(
- "INSERT INTO casbin_rule ( ptype, v0, v1, v2, v3, v4, v5 )
- VALUES ( $1, $2, $3, $4, $5, $6, $7 )",
- rule.ptype,
- rule.v0,
- rule.v1,
- rule.v2,
- rule.v3,
- rule.v4,
- rule.v5
- )
- .execute(conn)
- .await
- .map(|n| SqliteQueryResult::rows_affected(&n) == 1)
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
-
- Ok(true)
-}
-
-#[cfg(feature = "mysql")]
-pub(crate) async fn add_policy(conn: &ConnectionPool, rule: NewCasbinRule<'_>) -> Result<bool> {
- sqlx::query!(
- "INSERT INTO casbin_rule ( ptype, v0, v1, v2, v3, v4, v5 )
- VALUES ( ?, ?, ?, ?, ?, ?, ? )",
- rule.ptype,
- rule.v0,
- rule.v1,
- rule.v2,
- rule.v3,
- rule.v4,
- rule.v5
- )
- .execute(conn)
- .await
- .map(|n| MySqlQueryResult::rows_affected(&n) == 1)
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
-
- Ok(true)
-}
-
-#[cfg(feature = "postgres")]
-pub(crate) async fn add_policies(
- conn: &ConnectionPool,
- rules: Vec<NewCasbinRule<'_>>,
-) -> Result<bool> {
- let mut transaction = conn
- .begin()
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
- for rule in rules {
- sqlx::query!(
- "INSERT INTO casbin_rule ( ptype, v0, v1, v2, v3, v4, v5 )
- VALUES ( $1, $2, $3, $4, $5, $6, $7 )",
- rule.ptype,
- rule.v0,
- rule.v1,
- rule.v2,
- rule.v3,
- rule.v4,
- rule.v5
- )
- .execute(&mut *transaction)
- .await
- .and_then(|n| {
- if PgQueryResult::rows_affected(&n) == 1 {
- Ok(true)
- } else {
- Err(SqlxError::RowNotFound)
- }
- })
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
- }
- transaction
- .commit()
+ sqlx::query(sql::ADD_POLICY)
+ .bind(rule.ptype)
+ .bind(rule.v0)
+ .bind(rule.v1)
+ .bind(rule.v2)
+ .bind(rule.v3)
+ .bind(rule.v4)
+ .bind(rule.v5)
+ .execute(conn)
.await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
- Ok(true)
-}
+ .map(|n| n.rows_affected() == 1)
+ .map_err(adapter_error)?;
-#[cfg(feature = "sqlite")]
-pub(crate) async fn add_policies(
- conn: &ConnectionPool,
- rules: Vec<NewCasbinRule<'_>>,
-) -> Result<bool> {
- let mut transaction = conn
- .begin()
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
- for rule in rules {
- sqlx::query!(
- "INSERT INTO casbin_rule ( ptype, v0, v1, v2, v3, v4, v5 )
- VALUES ( $1, $2, $3, $4, $5, $6, $7 )",
- rule.ptype,
- rule.v0,
- rule.v1,
- rule.v2,
- rule.v3,
- rule.v4,
- rule.v5
- )
- .execute(&mut *transaction)
- .await
- .and_then(|n| {
- if SqliteQueryResult::rows_affected(&n) == 1 {
- Ok(true)
- } else {
- Err(SqlxError::RowNotFound)
- }
- })
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
- }
- transaction
- .commit()
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
Ok(true)
}
-#[cfg(feature = "mysql")]
pub(crate) async fn add_policies(
conn: &ConnectionPool,
rules: Vec<NewCasbinRule<'_>>,
) -> Result<bool> {
- let mut transaction = conn
- .begin()
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
+ let mut transaction = conn.begin().await.map_err(adapter_error)?;
for rule in rules {
- sqlx::query!(
- "INSERT INTO casbin_rule ( ptype, v0, v1, v2, v3, v4, v5 )
- VALUES ( ?, ?, ?, ?, ?, ?, ? )",
- rule.ptype,
- rule.v0,
- rule.v1,
- rule.v2,
- rule.v3,
- rule.v4,
- rule.v5
- )
- .execute(&mut *transaction)
- .await
- .and_then(|n| {
- if MySqlQueryResult::rows_affected(&n) == 1 {
- Ok(true)
- } else {
- Err(SqlxError::RowNotFound)
- }
- })
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
+ sqlx::query(sql::ADD_POLICY)
+ .bind(rule.ptype)
+ .bind(rule.v0)
+ .bind(rule.v1)
+ .bind(rule.v2)
+ .bind(rule.v3)
+ .bind(rule.v4)
+ .bind(rule.v5)
+ .execute(&mut *transaction)
+ .await
+ .and_then(|n| {
+ if n.rows_affected() == 1 {
+ Ok(true)
+ } else {
+ Err(SqlxError::RowNotFound)
+ }
+ })
+ .map_err(adapter_error)?;
}
- transaction
- .commit()
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
+ transaction.commit().await.map_err(adapter_error)?;
Ok(true)
}
-#[cfg(feature = "postgres")]
pub(crate) async fn clear_policy(conn: &ConnectionPool) -> Result<()> {
- let mut transaction = conn
- .begin()
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
- sqlx::query!("DELETE FROM casbin_rule")
+ let mut transaction = conn.begin().await.map_err(adapter_error)?;
+ sqlx::query(sql::CLEAR_POLICY)
.execute(&mut *transaction)
.await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
- transaction
- .commit()
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
- Ok(())
-}
-
-#[cfg(feature = "sqlite")]
-pub(crate) async fn clear_policy(conn: &ConnectionPool) -> Result<()> {
- let mut transaction = conn
- .begin()
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
- sqlx::query!("DELETE FROM casbin_rule")
- .execute(&mut *transaction)
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
- transaction
- .commit()
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
- Ok(())
-}
-
-#[cfg(feature = "mysql")]
-pub(crate) async fn clear_policy(conn: &ConnectionPool) -> Result<()> {
- let mut transaction = conn
- .begin()
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
- sqlx::query!("DELETE FROM casbin_rule")
- .execute(&mut *transaction)
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
- transaction
- .commit()
- .await
- .map_err(|err| CasbinError::from(AdapterError(Box::new(Error::SqlxError(err)))))?;
+ .map_err(adapter_error)?;
+ transaction.commit().await.map_err(adapter_error)?;
Ok(())
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@casbin.apache.org
For additional commands, e-mail: commits-help@casbin.apache.org