@@ -4,17 +4,17 @@ use diesel::{
4
4
self ,
5
5
r2d2:: { ConnectionManager , Pool } ,
6
6
} ;
7
+ use dotenv:: dotenv;
7
8
8
9
use crate :: { actions as adapter, error:: * , models:: * } ;
9
10
10
- use dotenv:: dotenv;
11
11
use std:: time:: Duration ;
12
12
13
13
#[ cfg( feature = "runtime-async-std" ) ]
14
- use async_std:: task;
14
+ use async_std:: task:: spawn_blocking ;
15
15
16
16
#[ cfg( feature = "runtime-tokio" ) ]
17
- use tokio:: task;
17
+ use tokio:: task:: spawn_blocking ;
18
18
19
19
pub struct DieselAdapter {
20
20
pool : Pool < ConnectionManager < adapter:: Connection > > ,
@@ -49,44 +49,41 @@ impl<'a> DieselAdapter {
49
49
}
50
50
}
51
51
52
- pub ( crate ) fn save_policy_line < ' a > (
53
- ptype : & ' a str ,
54
- rule : & ' a [ String ] ,
55
- ) -> Option < NewCasbinRule < ' a > > {
52
+ pub ( crate ) fn save_policy_line ( ptype : & str , rule : & [ String ] ) -> Option < NewCasbinRule > {
56
53
if ptype. trim ( ) . is_empty ( ) || rule. is_empty ( ) {
57
54
return None ;
58
55
}
59
56
60
57
let mut new_rule = NewCasbinRule {
61
- ptype,
62
- v0 : "" ,
63
- v1 : "" ,
64
- v2 : "" ,
65
- v3 : "" ,
66
- v4 : "" ,
67
- v5 : "" ,
58
+ ptype : ptype . to_owned ( ) ,
59
+ v0 : "" . to_owned ( ) ,
60
+ v1 : "" . to_owned ( ) ,
61
+ v2 : "" . to_owned ( ) ,
62
+ v3 : "" . to_owned ( ) ,
63
+ v4 : "" . to_owned ( ) ,
64
+ v5 : "" . to_owned ( ) ,
68
65
} ;
69
66
70
- new_rule. v0 = & rule[ 0 ] ;
67
+ new_rule. v0 = rule[ 0 ] . to_owned ( ) ;
71
68
72
69
if rule. len ( ) > 1 {
73
- new_rule. v1 = & rule[ 1 ] ;
70
+ new_rule. v1 = rule[ 1 ] . to_owned ( ) ;
74
71
}
75
72
76
73
if rule. len ( ) > 2 {
77
- new_rule. v2 = & rule[ 2 ] ;
74
+ new_rule. v2 = rule[ 2 ] . to_owned ( ) ;
78
75
}
79
76
80
77
if rule. len ( ) > 3 {
81
- new_rule. v3 = & rule[ 3 ] ;
78
+ new_rule. v3 = rule[ 3 ] . to_owned ( ) ;
82
79
}
83
80
84
81
if rule. len ( ) > 4 {
85
- new_rule. v4 = & rule[ 4 ] ;
82
+ new_rule. v4 = rule[ 4 ] . to_owned ( ) ;
86
83
}
87
84
88
85
if rule. len ( ) > 5 {
89
- new_rule. v5 = & rule[ 5 ] ;
86
+ new_rule. v5 = rule[ 5 ] . to_owned ( ) ;
90
87
}
91
88
92
89
Some ( new_rule)
@@ -103,29 +100,26 @@ pub(crate) fn load_policy_line(casbin_rule: &CasbinRule) -> Option<Vec<String>>
103
100
pub ( crate ) fn load_filtered_policy_line (
104
101
casbin_rule : & CasbinRule ,
105
102
f : & Filter ,
106
- ) -> Option < Vec < String > > {
103
+ ) -> Option < ( bool , Vec < String > ) > {
107
104
if let Some ( sec) = casbin_rule. ptype . chars ( ) . next ( ) {
108
105
if let Some ( policy) = normalize_policy ( casbin_rule) {
109
- let mut is_filtered = false ;
106
+ let mut is_filtered = true ;
110
107
if sec == 'p' {
111
108
for ( i, rule) in f. p . iter ( ) . enumerate ( ) {
112
109
if !rule. is_empty ( ) && rule != & policy[ i] {
113
- is_filtered = true
110
+ is_filtered = false
114
111
}
115
112
}
116
113
} else if sec == 'g' {
117
114
for ( i, rule) in f. g . iter ( ) . enumerate ( ) {
118
115
if !rule. is_empty ( ) && rule != & policy[ i] {
119
- is_filtered = true
116
+ is_filtered = false
120
117
}
121
118
}
122
119
} else {
123
120
return None ;
124
121
}
125
-
126
- if !is_filtered {
127
- return Some ( policy) ;
128
- }
122
+ return Some ( ( is_filtered, policy) ) ;
129
123
}
130
124
}
131
125
@@ -166,12 +160,12 @@ impl Adapter for DieselAdapter {
166
160
. map_err ( |err| CasbinError :: from ( AdapterError ( Box :: new ( Error :: PoolError ( err) ) ) ) ) ?;
167
161
168
162
#[ cfg( feature = "runtime-tokio" ) ]
169
- let rules = task :: spawn_blocking ( move || adapter:: load_policy ( conn) )
163
+ let rules = spawn_blocking ( move || adapter:: load_policy ( conn) )
170
164
. await
171
165
. map_err ( |e| casbin:: error:: AdapterError ( Box :: new ( e) ) ) ??;
172
166
173
167
#[ cfg( feature = "runtime-async-std" ) ]
174
- let rules = task :: spawn_blocking ( move || adapter:: load_policy ( conn) ) . await ?;
168
+ let rules = spawn_blocking ( move || adapter:: load_policy ( conn) ) . await ?;
175
169
176
170
for casbin_rule in & rules {
177
171
let rule = load_policy_line ( casbin_rule) ;
@@ -197,26 +191,27 @@ impl Adapter for DieselAdapter {
197
191
. map_err ( |err| CasbinError :: from ( AdapterError ( Box :: new ( Error :: PoolError ( err) ) ) ) ) ?;
198
192
199
193
#[ cfg( feature = "runtime-tokio" ) ]
200
- let rules = task :: spawn_blocking ( move || adapter:: load_policy ( conn) )
194
+ let rules = spawn_blocking ( move || adapter:: load_policy ( conn) )
201
195
. await
202
196
. map_err ( |e| casbin:: error:: AdapterError ( Box :: new ( e) ) ) ??;
203
197
204
198
#[ cfg( feature = "runtime-async-std" ) ]
205
- let rules = task :: spawn_blocking ( move || adapter:: load_policy ( conn) ) . await ?;
199
+ let rules = spawn_blocking ( move || adapter:: load_policy ( conn) ) . await ?;
206
200
207
201
for casbin_rule in & rules {
208
202
let rule = load_filtered_policy_line ( casbin_rule, & f) ;
209
203
210
- if let Some ( rule) = rule {
211
- if let Some ( ref sec) = casbin_rule. ptype . chars ( ) . next ( ) . map ( |x| x. to_string ( ) ) {
212
- if let Some ( t1) = m. get_mut_model ( ) . get_mut ( sec) {
213
- if let Some ( t2) = t1. get_mut ( & casbin_rule. ptype ) {
214
- t2. get_mut_policy ( ) . insert ( rule) ;
204
+ if let Some ( ( is_filtered, rule) ) = rule {
205
+ if is_filtered {
206
+ self . is_filtered = is_filtered;
207
+ if let Some ( ref sec) = casbin_rule. ptype . chars ( ) . next ( ) . map ( |x| x. to_string ( ) ) {
208
+ if let Some ( t1) = m. get_mut_model ( ) . get_mut ( sec) {
209
+ if let Some ( t2) = t1. get_mut ( & casbin_rule. ptype ) {
210
+ t2. get_mut_policy ( ) . insert ( rule) ;
211
+ }
215
212
}
216
213
}
217
214
}
218
- } else {
219
- self . is_filtered = true ;
220
215
}
221
216
}
222
217
@@ -252,7 +247,17 @@ impl Adapter for DieselAdapter {
252
247
rules. extend ( new_rules) ;
253
248
}
254
249
}
255
- adapter:: save_policy ( conn, rules)
250
+
251
+ #[ cfg( feature = "runtime-tokio" ) ]
252
+ {
253
+ spawn_blocking ( move || adapter:: save_policy ( conn, rules) )
254
+ . await
255
+ . map_err ( |e| casbin:: error:: AdapterError ( Box :: new ( e) ) ) ?
256
+ }
257
+ #[ cfg( feature = "runtime-async-std" ) ]
258
+ {
259
+ spawn_blocking ( move || adapter:: save_policy ( conn, rules) ) . await
260
+ }
256
261
}
257
262
258
263
async fn add_policy ( & mut self , _sec : & str , ptype : & str , rule : Vec < String > ) -> Result < bool > {
@@ -264,8 +269,8 @@ impl Adapter for DieselAdapter {
264
269
265
270
#[ cfg( feature = "runtime-tokio" ) ]
266
271
{
267
- task :: spawn_blocking ( move || {
268
- if let Some ( new_rule) = save_policy_line ( ptype_c. as_str ( ) , & rule) {
272
+ spawn_blocking ( move || {
273
+ if let Some ( new_rule) = save_policy_line ( & ptype_c, & rule) {
269
274
return adapter:: add_policy ( conn, new_rule) ;
270
275
}
271
276
Ok ( false )
@@ -276,8 +281,8 @@ impl Adapter for DieselAdapter {
276
281
277
282
#[ cfg( feature = "runtime-async-std" ) ]
278
283
{
279
- task :: spawn_blocking ( move || {
280
- if let Some ( new_rule) = save_policy_line ( ptype_c. as_str ( ) , & rule) {
284
+ spawn_blocking ( move || {
285
+ if let Some ( new_rule) = save_policy_line ( & ptype_c, & rule) {
281
286
return adapter:: add_policy ( conn, new_rule) ;
282
287
}
283
288
Ok ( false )
@@ -300,10 +305,10 @@ impl Adapter for DieselAdapter {
300
305
301
306
#[ cfg( feature = "runtime-tokio" ) ]
302
307
{
303
- task :: spawn_blocking ( move || {
308
+ spawn_blocking ( move || {
304
309
let new_rules = rules
305
310
. iter ( )
306
- . filter_map ( |x : & Vec < String > | save_policy_line ( ptype_c. as_str ( ) , x) )
311
+ . filter_map ( |x : & Vec < String > | save_policy_line ( & ptype_c, x) )
307
312
. collect :: < Vec < NewCasbinRule > > ( ) ;
308
313
adapter:: add_policies ( conn, new_rules)
309
314
} )
@@ -313,10 +318,10 @@ impl Adapter for DieselAdapter {
313
318
314
319
#[ cfg( feature = "runtime-async-std" ) ]
315
320
{
316
- task :: spawn_blocking ( move || {
321
+ spawn_blocking ( move || {
317
322
let new_rules = rules
318
323
. iter ( )
319
- . filter_map ( |x : & Vec < String > | save_policy_line ( ptype_c. as_str ( ) , x) )
324
+ . filter_map ( |x : & Vec < String > | save_policy_line ( & ptype_c, x) )
320
325
. collect :: < Vec < NewCasbinRule > > ( ) ;
321
326
adapter:: add_policies ( conn, new_rules)
322
327
} )
@@ -333,14 +338,14 @@ impl Adapter for DieselAdapter {
333
338
334
339
#[ cfg( feature = "runtime-tokio" ) ]
335
340
{
336
- task :: spawn_blocking ( move || adapter:: remove_policy ( conn, ptype_c. as_str ( ) , rule) )
341
+ spawn_blocking ( move || adapter:: remove_policy ( conn, & ptype_c, rule) )
337
342
. await
338
343
. map_err ( |e| casbin:: error:: AdapterError ( Box :: new ( e) ) ) ?
339
344
}
340
345
341
346
#[ cfg( feature = "runtime-async-std" ) ]
342
347
{
343
- task :: spawn_blocking ( move || adapter:: remove_policy ( conn, ptype_c. as_str ( ) , rule) ) . await
348
+ spawn_blocking ( move || adapter:: remove_policy ( conn, & ptype_c, rule) ) . await
344
349
}
345
350
}
346
351
@@ -358,15 +363,14 @@ impl Adapter for DieselAdapter {
358
363
359
364
#[ cfg( feature = "runtime-tokio" ) ]
360
365
{
361
- task :: spawn_blocking ( move || adapter:: remove_policies ( conn, ptype_c. as_str ( ) , rules) )
366
+ spawn_blocking ( move || adapter:: remove_policies ( conn, & ptype_c, rules) )
362
367
. await
363
368
. map_err ( |e| casbin:: error:: AdapterError ( Box :: new ( e) ) ) ?
364
369
}
365
370
366
371
#[ cfg( feature = "runtime-async-std" ) ]
367
372
{
368
- task:: spawn_blocking ( move || adapter:: remove_policies ( conn, ptype_c. as_str ( ) , rules) )
369
- . await
373
+ spawn_blocking ( move || adapter:: remove_policies ( conn, & ptype_c, rules) ) . await
370
374
}
371
375
}
372
376
@@ -386,27 +390,17 @@ impl Adapter for DieselAdapter {
386
390
387
391
#[ cfg( feature = "runtime-tokio" ) ]
388
392
{
389
- task:: spawn_blocking ( move || {
390
- adapter:: remove_filtered_policy (
391
- conn,
392
- ptype_c. as_str ( ) ,
393
- field_index,
394
- field_values,
395
- )
393
+ spawn_blocking ( move || {
394
+ adapter:: remove_filtered_policy ( conn, & ptype_c, field_index, field_values)
396
395
} )
397
396
. await
398
397
. map_err ( |e| casbin:: error:: AdapterError ( Box :: new ( e) ) ) ?
399
398
}
400
399
401
400
#[ cfg( feature = "runtime-async-std" ) ]
402
401
{
403
- task:: spawn_blocking ( move || {
404
- adapter:: remove_filtered_policy (
405
- conn,
406
- ptype_c. as_str ( ) ,
407
- field_index,
408
- field_values,
409
- )
402
+ spawn_blocking ( move || {
403
+ adapter:: remove_filtered_policy ( conn, & ptype_c, field_index, field_values)
410
404
} )
411
405
. await
412
406
}
0 commit comments