@@ -133,6 +133,12 @@ func (r *CasbinRule) String() string {
133133 const prefixLine = ", "
134134 var sb strings.Builder
135135
136+ sb .Grow (
137+ len (r .PType ) +
138+ len (r .V0 ) + len (r .V1 ) + len (r .V2 ) +
139+ len (r .V3 ) + len (r .V4 ) + len (r .V5 ),
140+ )
141+
136142 sb .WriteString (r .PType )
137143 if len (r .V0 ) > 0 {
138144 sb .WriteString (prefixLine )
@@ -215,7 +221,13 @@ func savePolicyLine(ptype string, rule []string) *CasbinRule {
215221
216222// SavePolicy saves policy to database.
217223func (a * Adapter ) SavePolicy (model model.Model ) error {
218- _ , err := a .db .Model ((* CasbinRule )(nil )).Where ("id IS NOT NULL" ).Delete ()
224+ tx , err := a .db .Begin ()
225+ if err != nil {
226+ return fmt .Errorf ("start DB transaction: %v" , err )
227+ }
228+ defer tx .Close ()
229+
230+ _ , err = tx .Model ((* CasbinRule )(nil )).Where ("id IS NOT NULL" ).Delete ()
219231 if err != nil {
220232 return err
221233 }
@@ -237,20 +249,33 @@ func (a *Adapter) SavePolicy(model model.Model) error {
237249 }
238250
239251 if len (lines ) > 0 {
240- _ , err = a . db .Model (& lines ).
252+ _ , err = tx .Model (& lines ).
241253 OnConflict ("DO NOTHING" ).
242254 Insert ()
243- return err
255+ if err != nil {
256+ return err
257+ }
258+ }
259+
260+ err = tx .Commit ()
261+ if err != nil {
262+ return fmt .Errorf ("commit DB transaction: %v" , err )
244263 }
264+
245265 return nil
246266}
247267
248268// AddPolicy adds a policy rule to the storage.
249269func (a * Adapter ) AddPolicy (sec string , ptype string , rule []string ) error {
250270 line := savePolicyLine (ptype , rule )
251- _ , err := a .db .Model (line ).
252- OnConflict ("DO NOTHING" ).
253- Insert ()
271+ err := a .db .RunInTransaction (func (tx * pg.Tx ) error {
272+ _ , err := a .db .Model (line ).
273+ OnConflict ("DO NOTHING" ).
274+ Insert ()
275+
276+ return err
277+ })
278+
254279 return err
255280}
256281
@@ -275,7 +300,10 @@ func (a *Adapter) AddPolicies(sec string, ptype string, rules [][]string) error
275300// RemovePolicy removes a policy rule from the storage.
276301func (a * Adapter ) RemovePolicy (sec string , ptype string , rule []string ) error {
277302 line := savePolicyLine (ptype , rule )
278- err := a .db .Delete (line )
303+ err := a .db .RunInTransaction (func (tx * pg.Tx ) error {
304+ return a .db .Delete (line )
305+ })
306+
279307 return err
280308}
281309
@@ -320,7 +348,11 @@ func (a *Adapter) RemoveFilteredPolicy(sec string, ptype string, fieldIndex int,
320348 query = query .Where ("v5 = ?" , fieldValues [5 - fieldIndex ])
321349 }
322350
323- _ , err := query .Delete ()
351+ err := a .db .RunInTransaction (func (tx * pg.Tx ) error {
352+ _ , err := query .Delete ()
353+ return err
354+ })
355+
324356 return err
325357}
326358
0 commit comments