From 2eea4794c6840522a6f9d9af89159251b0bbe49e Mon Sep 17 00:00:00 2001 From: anton troyanov Date: Mon, 18 May 2020 13:44:00 +0300 Subject: [PATCH] Add support for custom table name --- adapter.go | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/adapter.go b/adapter.go index 93a7806..98cd247 100644 --- a/adapter.go +++ b/adapter.go @@ -8,6 +8,7 @@ import ( "github.com/casbin/casbin/v2/persist" "github.com/go-pg/pg/v9" "github.com/go-pg/pg/v9/orm" + "github.com/go-pg/pg/v9/types" "github.com/mmcloughlin/meow" ) @@ -30,10 +31,13 @@ type Filter struct { // Adapter represents the github.com/go-pg/pg adapter for policy storage. type Adapter struct { - db *pg.DB - filtered bool + db *pg.DB + tableName string + filtered bool } +type Option func(a *Adapter) + // NewAdapter is the constructor for Adapter. // arg should be a PostgreS URL string or of type *pg.Options // The adapter will create a DB named "casbin" if it doesn't exist @@ -54,14 +58,31 @@ func NewAdapter(arg interface{}) (*Adapter, error) { // NewAdapterByDB creates new Adapter by using existing DB connection // creates table from CasbinRule struct if it doesn't exist -func NewAdapterByDB(db *pg.DB) (*Adapter, error) { +func NewAdapterByDB(db *pg.DB, opts ...Option) (*Adapter, error) { a := &Adapter{db: db} + for _, opt := range opts { + opt(a) + } + + if len(a.tableName) > 0 { + a.db.Model((*CasbinRule)(nil)).TableModel().Table().Name = a.tableName + a.db.Model((*CasbinRule)(nil)).TableModel().Table().FullName = (types.Safe)(a.tableName) + a.db.Model((*CasbinRule)(nil)).TableModel().Table().FullNameForSelects = (types.Safe)(a.tableName) + } + if err := a.createTableifNotExists(); err != nil { return nil, fmt.Errorf("pgadapter.NewAdapter: %v", err) } return a, nil } +// WithTableName can be used to pass custom table name for Casbin rules +func WithTableName(tableName string) Option { + return func(a *Adapter) { + a.tableName = tableName + } +} + func createCasbinDatabase(arg interface{}) (*pg.DB, error) { var opts *pg.Options var err error