11package pgadapter
22
33import (
4+ "context"
45 "fmt"
56 "strings"
67
78 "github.com/casbin/casbin/v2/model"
89 "github.com/casbin/casbin/v2/persist"
9- "github.com/go-pg/pg/v9"
10- "github.com/go-pg/pg/v9/orm"
11- "github.com/go-pg/pg/v9/types"
10+ "github.com/go-pg/pg/v10"
11+ "github.com/go-pg/pg/v10/orm"
1212 "github.com/mmcloughlin/meow"
1313)
1414
15+ const DefaultTableName = "casbin_rule"
16+
1517// CasbinRule represents a rule in Casbin.
1618type CasbinRule struct {
17- ID string
18- PType string
19- V0 string
20- V1 string
21- V2 string
22- V3 string
23- V4 string
24- V5 string
19+ tableName struct {} `pg:"_"`
20+ ID string
21+ PType string
22+ V0 string
23+ V1 string
24+ V2 string
25+ V3 string
26+ V4 string
27+ V5 string
2528}
2629
2730type Filter struct {
@@ -48,7 +51,7 @@ func NewAdapter(arg interface{}) (*Adapter, error) {
4851 return nil , fmt .Errorf ("pgadapter.NewAdapter: %v" , err )
4952 }
5053
51- a := & Adapter {db : db }
54+ a := & Adapter {db : db , tableName : DefaultTableName }
5255
5356 if err := a .createTableifNotExists (); err != nil {
5457 return nil , fmt .Errorf ("pgadapter.NewAdapter: %v" , err )
@@ -60,17 +63,11 @@ func NewAdapter(arg interface{}) (*Adapter, error) {
6063// NewAdapterByDB creates new Adapter by using existing DB connection
6164// creates table from CasbinRule struct if it doesn't exist
6265func NewAdapterByDB (db * pg.DB , opts ... Option ) (* Adapter , error ) {
63- a := & Adapter {db : db }
66+ a := & Adapter {db : db , tableName : DefaultTableName }
6467 for _ , opt := range opts {
6568 opt (a )
6669 }
6770
68- if len (a .tableName ) > 0 {
69- a .db .Model ((* CasbinRule )(nil )).TableModel ().Table ().Name = a .tableName
70- a .db .Model ((* CasbinRule )(nil )).TableModel ().Table ().FullName = (types .Safe )(a .tableName )
71- a .db .Model ((* CasbinRule )(nil )).TableModel ().Table ().FullNameForSelects = (types .Safe )(a .tableName )
72- }
73-
7471 if ! a .skipTableCreate {
7572 if err := a .createTableifNotExists (); err != nil {
7673 return nil , fmt .Errorf ("pgadapter.NewAdapter: %v" , err )
@@ -130,7 +127,7 @@ func (a *Adapter) Close() error {
130127}
131128
132129func (a * Adapter ) createTableifNotExists () error {
133- err := a .db .CreateTable ( & CasbinRule {}, & orm.CreateTableOptions {
130+ err := a .db .Model (( * CasbinRule )( nil )). Table ( a . tableName ). CreateTable ( & orm.CreateTableOptions {
134131 Temp : false ,
135132 IfNotExists : true ,
136133 })
@@ -183,7 +180,7 @@ func (r *CasbinRule) String() string {
183180func (a * Adapter ) LoadPolicy (model model.Model ) error {
184181 var lines []* CasbinRule
185182
186- if err := a .db .Model (& lines ).Select (); err != nil {
183+ if err := a .db .Model (& lines ).Table ( a . tableName ). Select (); err != nil {
187184 return err
188185 }
189186
@@ -238,7 +235,7 @@ func (a *Adapter) SavePolicy(model model.Model) error {
238235 }
239236 defer tx .Close ()
240237
241- _ , err = tx .Model ((* CasbinRule )(nil )).Where ("id IS NOT NULL" ).Delete ()
238+ _ , err = tx .Model ((* CasbinRule )(nil )).Table ( a . tableName ). Where ("id IS NOT NULL" ).Delete ()
242239 if err != nil {
243240 return err
244241 }
@@ -259,8 +256,8 @@ func (a *Adapter) SavePolicy(model model.Model) error {
259256 }
260257 }
261258
262- if len ( lines ) > 0 {
263- _ , err = tx .Model (& lines ).
259+ for _ , line := range lines {
260+ _ , err = tx .Model (line ). Table ( a . tableName ).
264261 OnConflict ("DO NOTHING" ).
265262 Insert ()
266263 if err != nil {
@@ -279,8 +276,9 @@ func (a *Adapter) SavePolicy(model model.Model) error {
279276// AddPolicy adds a policy rule to the storage.
280277func (a * Adapter ) AddPolicy (sec string , ptype string , rule []string ) error {
281278 line := savePolicyLine (ptype , rule )
282- err := a .db .RunInTransaction (func (tx * pg.Tx ) error {
279+ err := a .db .RunInTransaction (context . Background (), func (tx * pg.Tx ) error {
283280 _ , err := a .db .Model (line ).
281+ Table (a .tableName ).
284282 OnConflict ("DO NOTHING" ).
285283 Insert ()
286284
@@ -298,8 +296,9 @@ func (a *Adapter) AddPolicies(sec string, ptype string, rules [][]string) error
298296 lines = append (lines , line )
299297 }
300298
301- err := a .db .RunInTransaction (func (tx * pg.Tx ) error {
299+ err := a .db .RunInTransaction (context . Background (), func (tx * pg.Tx ) error {
302300 _ , err := tx .Model (& lines ).
301+ Table (a .tableName ).
303302 OnConflict ("DO NOTHING" ).
304303 Insert ()
305304 return err
@@ -311,8 +310,9 @@ func (a *Adapter) AddPolicies(sec string, ptype string, rules [][]string) error
311310// RemovePolicy removes a policy rule from the storage.
312311func (a * Adapter ) RemovePolicy (sec string , ptype string , rule []string ) error {
313312 line := savePolicyLine (ptype , rule )
314- err := a .db .RunInTransaction (func (tx * pg.Tx ) error {
315- return a .db .Delete (line )
313+ err := a .db .RunInTransaction (context .Background (), func (tx * pg.Tx ) error {
314+ _ , err := a .db .Model (line ).Table (a .tableName ).WherePK ().Delete ()
315+ return err
316316 })
317317
318318 return err
@@ -326,8 +326,8 @@ func (a *Adapter) RemovePolicies(sec string, ptype string, rules [][]string) err
326326 lines = append (lines , line )
327327 }
328328
329- err := a .db .RunInTransaction (func (tx * pg.Tx ) error {
330- _ , err := tx .Model (& lines ).
329+ err := a .db .RunInTransaction (context . Background (), func (tx * pg.Tx ) error {
330+ _ , err := tx .Model (& lines ).Table ( a . tableName ).
331331 Delete ()
332332 return err
333333 })
@@ -337,7 +337,7 @@ func (a *Adapter) RemovePolicies(sec string, ptype string, rules [][]string) err
337337
338338// RemoveFilteredPolicy removes policy rules that match the filter from the storage.
339339func (a * Adapter ) RemoveFilteredPolicy (sec string , ptype string , fieldIndex int , fieldValues ... string ) error {
340- query := a .db .Model ((* CasbinRule )(nil )).Where ("p_type = ?" , ptype )
340+ query := a .db .Model ((* CasbinRule )(nil )).Table ( a . tableName ). Where ("p_type = ?" , ptype )
341341
342342 idx := fieldIndex + len (fieldValues )
343343 if fieldIndex <= 0 && idx > 0 && fieldValues [0 - fieldIndex ] != "" {
@@ -359,7 +359,7 @@ func (a *Adapter) RemoveFilteredPolicy(sec string, ptype string, fieldIndex int,
359359 query = query .Where ("v5 = ?" , fieldValues [5 - fieldIndex ])
360360 }
361361
362- err := a .db .RunInTransaction (func (tx * pg.Tx ) error {
362+ err := a .db .RunInTransaction (context . Background (), func (tx * pg.Tx ) error {
363363 _ , err := query .Delete ()
364364 return err
365365 })
@@ -413,7 +413,7 @@ func (a *Adapter) loadFilteredPolicy(model model.Model, filter *Filter, handler
413413 if filter .P != nil {
414414 lines := []* CasbinRule {}
415415
416- query := a .db .Model (& lines ).Where ("p_type = 'p'" )
416+ query := a .db .Model (& lines ).Table ( a . tableName ). Where ("p_type = 'p'" )
417417 query , err := buildQuery (query , filter .P )
418418 if err != nil {
419419 return err
@@ -430,7 +430,7 @@ func (a *Adapter) loadFilteredPolicy(model model.Model, filter *Filter, handler
430430 if filter .G != nil {
431431 lines := []* CasbinRule {}
432432
433- query := a .db .Model (& lines ).Where ("p_type = 'g'" )
433+ query := a .db .Model (& lines ).Table ( a . tableName ). Where ("p_type = 'g'" )
434434 query , err := buildQuery (query , filter .G )
435435 if err != nil {
436436 return err
@@ -484,12 +484,12 @@ func (a *Adapter) UpdateFilteredPolicies(sec string, ptype string, oldRules, new
484484 newLines = append (newLines , line )
485485 }
486486
487- err := a .db .RunInTransaction (func (tx * pg.Tx ) error {
488- _ , err := tx .Model (& oldLines ).Delete ()
487+ err := a .db .RunInTransaction (context . Background (), func (tx * pg.Tx ) error {
488+ _ , err := tx .Model (& oldLines ).Table ( a . tableName ). Delete ()
489489 if err != nil {
490490 return err
491491 }
492- _ , err = tx .Model (& newLines ).
492+ _ , err = tx .Model (& newLines ).Table ( a . tableName ).
493493 OnConflict ("DO NOTHING" ).
494494 Insert ()
495495 return err
@@ -506,7 +506,7 @@ func (a *Adapter) updatePolicies(oldLines, newLines []*CasbinRule) error {
506506
507507 for i , line := range oldLines {
508508 newLines [i ].ID = line .ID
509- _ , err = tx .Model (newLines [i ]).WherePK ().Update ()
509+ _ , err = tx .Model (newLines [i ]).Table ( a . tableName ). WherePK ().Update ()
510510 if err != nil {
511511 tx .Rollback ()
512512 return err
0 commit comments