Skip to content

Commit

Permalink
update CasbinRule struct and format codes
Browse files Browse the repository at this point in the history
  • Loading branch information
Blank committed Aug 20, 2020
1 parent fb84002 commit 840637d
Show file tree
Hide file tree
Showing 6 changed files with 110 additions and 78 deletions.
4 changes: 0 additions & 4 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,3 @@

*.idea
*.vscode

*.db

tests/tests
10 changes: 8 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
# sqlx-adapter [![Build Status](https://travis-ci.org/Blank-Xu/sqlx-adapter.svg?branch=oracle)](https://travis-ci.org/Blank-Xu/sqlx-adapter) [![Coverage Status](https://coveralls.io/repos/github/Blank-Xu/sqlx-adapter/badge.svg?branch=oracle)](https://coveralls.io/github/Blank-Xu/sqlx-adapter?branch=oracle) [![Go Report Card](https://goreportcard.com/badge/github.com/Blank-Xu/sqlx-adapter)](https://goreportcard.com/report/github.com/Blank-Xu/sqlx-adapter) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE)
# sqlx-adapter

[![Build Status](https://travis-ci.org/Blank-Xu/sqlx-adapter.svg?branch=oracle)](https://travis-ci.org/Blank-Xu/sqlx-adapter)
[![Coverage Status](https://coveralls.io/repos/github/Blank-Xu/sqlx-adapter/badge.svg?branch=oracle)](https://coveralls.io/github/Blank-Xu/sqlx-adapter?branch=oracle)
[![Go Report Card](https://goreportcard.com/badge/github.com/Blank-Xu/sqlx-adapter)](https://goreportcard.com/report/github.com/Blank-Xu/sqlx-adapter)
[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE)
---

sqlx-adapter is a [Sqlx](https://github.com/jmoiron/sqlx) Adapter for [Casbin V2](https://github.com/casbin/casbin/v2).

Expand All @@ -19,7 +25,7 @@ With this library, Casbin can load policy lines from Sqlx supported databases or

## Installation

Install oracle client followed like link:
Install oracle client followed this link:

https://github.com/mattn/go-oci8

Expand Down
72 changes: 20 additions & 52 deletions adapter.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,19 +32,8 @@ import (
const defaultTableName = "CASBIN_RULE"

// CasbinRule defines the casbin rule model.
// It used for save or load policy lines from sqlx connected database.
// It used for save or load policy lines from oracle.
type CasbinRule struct {
PType string `db:"P_TYPE"`
V0 string `db:"V0"`
V1 string `db:"V1"`
V2 string `db:"V2"`
V3 string `db:"V3"`
V4 string `db:"V4"`
V5 string `db:"V5"`
}

// casbinRule defines to parse records from oracle.
type casbinRule struct {
PType sql.NullString `db:"P_TYPE"`
V0 sql.NullString `db:"V0"`
V1 sql.NullString `db:"V1"`
Expand Down Expand Up @@ -135,8 +124,11 @@ func NewAdapter(db *sqlx.DB, tableName string) (*Adapter, error) {
func (p *Adapter) genSQL() {
p.tableName = strings.ToUpper(p.tableName)

p.sqlCreateTable = []string{fmt.Sprintf(sqlCreateTable, p.tableName),
fmt.Sprintf(sqlCreateIndex, p.tableName, p.tableName)}
p.sqlCreateTable = []string{
fmt.Sprintf(sqlCreateTable, p.tableName),
fmt.Sprintf(sqlCreateIndex, p.tableName, p.tableName),
}

p.sqlTruncateTable = fmt.Sprintf(sqlTruncateTable, p.tableName)
p.sqlIsTableExist = fmt.Sprintf(sqlIsTableExist, p.tableName)

Expand Down Expand Up @@ -230,15 +222,13 @@ func (p *Adapter) truncateAndInsertRows(args [][]interface{}) (err error) {

var sqlBuf bytes.Buffer

sqlBuf.Grow(64)

for _, arg := range args {
l := len(arg)
if l == 0 {
continue
}

sqlBuf.Reset()
sqlBuf.Grow(128)
sqlBuf.WriteString(p.sqlInsertRow)
sqlBuf.Write(p.cols[l-1])
sqlBuf.WriteString(" VALUES ")
Expand All @@ -248,6 +238,8 @@ func (p *Adapter) truncateAndInsertRows(args [][]interface{}) (err error) {
action = "exec"
goto ROLLBACK
}

sqlBuf.Reset()
}

if err = tx.Commit(); err != nil {
Expand All @@ -267,32 +259,10 @@ ROLLBACK:
}

// selectRows select all data from the table.
func (p *Adapter) selectRows(query string, args ...interface{}) ([]CasbinRule, error) {
rows, err := p.db.Queryx(query, args...)
if err != nil {
return nil, err
}

func (p *Adapter) selectRows(query string, args ...interface{}) (lines []CasbinRule, err error) {
// make a slice with capacity
lines := make([]CasbinRule, 0, 32)
for rows.Next() {
var rule casbinRule
if err = rows.StructScan(&rule); err != nil {
return nil, err
}

line := CasbinRule{
PType: rule.PType.String,
V0: rule.V0.String,
V1: rule.V1.String,
V2: rule.V2.String,
V3: rule.V3.String,
V4: rule.V4.String,
V5: rule.V5.String,
}

lines = append(lines, line)
}
lines = make([]CasbinRule, 0, 128)
err = p.db.Select(&lines, query, args...)

return lines, nil
}
Expand All @@ -301,7 +271,7 @@ func (p *Adapter) selectRows(query string, args ...interface{}) ([]CasbinRule, e
func (p *Adapter) selectWhereIn(filter *Filter) (lines []CasbinRule, err error) {
var sqlBuf bytes.Buffer

sqlBuf.Grow(64)
sqlBuf.Grow(128)
sqlBuf.WriteString(p.sqlSelectWhere)

args := make([]interface{}, 0, 4)
Expand Down Expand Up @@ -346,11 +316,9 @@ func (p *Adapter) selectWhereIn(filter *Filter) (lines []CasbinRule, err error)
var query string

if hasInCond {
query, args, err = sqlx.In(sqlBuf.String(), args...)
if err != nil {
if query, args, err = sqlx.In(sqlBuf.String(), args...); err != nil {
return
}

} else {
query = sqlBuf.String()
}
Expand Down Expand Up @@ -402,7 +370,7 @@ func (p *Adapter) AddPolicy(sec string, ptype string, rule []string) error {

var sqlBuf bytes.Buffer

sqlBuf.Grow(64)
sqlBuf.Grow(128)
sqlBuf.WriteString(p.sqlInsertRow)
sqlBuf.Write(p.cols[idx])
sqlBuf.WriteString(" VALUES ")
Expand All @@ -417,7 +385,7 @@ func (p *Adapter) AddPolicy(sec string, ptype string, rule []string) error {
func (p *Adapter) RemovePolicy(sec string, ptype string, rule []string) error {
var sqlBuf bytes.Buffer

sqlBuf.Grow(64)
sqlBuf.Grow(128)
sqlBuf.WriteString(p.sqlDeleteByArgs)

args := make([]interface{}, 0, len(rule)+1)
Expand All @@ -441,7 +409,7 @@ func (p *Adapter) RemovePolicy(sec string, ptype string, rule []string) error {
func (p *Adapter) RemoveFilteredPolicy(sec string, ptype string, fieldIndex int, fieldValues ...string) error {
var sqlBuf bytes.Buffer

sqlBuf.Grow(64)
sqlBuf.Grow(128)
sqlBuf.WriteString(p.sqlDeleteByArgs)

args := make([]interface{}, 0, 4)
Expand Down Expand Up @@ -504,10 +472,10 @@ func (p *Adapter) IsFiltered() bool {
func (Adapter) loadPolicyLine(line CasbinRule, model model.Model) {
var lineBuf bytes.Buffer

lineBuf.Grow(64)
lineBuf.WriteString(line.PType)
lineBuf.Grow(128)
lineBuf.WriteString(line.PType.String)

args := [6]string{line.V0, line.V1, line.V2, line.V3, line.V4, line.V5}
args := [6]string{line.V0.String, line.V1.String, line.V2.String, line.V3.String, line.V4.String, line.V5.String}
for _, arg := range args {
if arg != "" {
lineBuf.WriteByte(',')
Expand Down
96 changes: 79 additions & 17 deletions adapter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
package sqlxadapter

import (
"database/sql"
"flag"
"testing"

Expand All @@ -34,15 +35,68 @@ var (
dataSourceName = flag.String("dataSourceName", "system/oracle@127.0.0.1:1521/xe", "dataSourceName")

lines = []CasbinRule{
{PType: "p", V0: "alice", V1: "data1", V2: "read"},
{PType: "p", V0: "bob", V1: "data2", V2: "read"},
{PType: "p", V0: "bob", V1: "data2", V2: "write"},
{PType: "p", V0: "data2_admin", V1: "data1", V2: "read", V3: "test1", V4: "test2", V5: "test3"},
{PType: "p", V0: "data2_admin", V1: "data2", V2: "write", V3: "test1", V4: "test2", V5: "test3"},
{PType: "p", V0: "data1_admin", V1: "data2", V2: "write"},
{PType: "g", V0: "alice", V1: "data2_admin"},
{PType: "g", V0: "bob", V1: "data2_admin", V2: "test"},
{PType: "g", V0: "bob", V1: "data1_admin", V2: "test2", V3: "test3", V4: "test4", V5: "test5"},
{
PType: sql.NullString{String: "p"},
V0: sql.NullString{String: "alice"},
V1: sql.NullString{String: "data1"},
V2: sql.NullString{String: "read"},
},
{
PType: sql.NullString{String: "p"},
V0: sql.NullString{String: "bob"},
V1: sql.NullString{String: "data2"},
V2: sql.NullString{String: "read"},
},
{
PType: sql.NullString{String: "p"},
V0: sql.NullString{String: "bob"},
V1: sql.NullString{String: "data2"},
V2: sql.NullString{String: "write"},
},
{
PType: sql.NullString{String: "p"},
V0: sql.NullString{String: "data2_admin"},
V1: sql.NullString{String: "data1"},
V2: sql.NullString{String: "read"},
V3: sql.NullString{String: "test1"},
V4: sql.NullString{String: "test2"},
V5: sql.NullString{String: "test3"},
},
{
PType: sql.NullString{String: "p"},
V0: sql.NullString{String: "data2_admin"},
V1: sql.NullString{String: "data2"},
V2: sql.NullString{String: "write"},
V3: sql.NullString{String: "test1"},
V4: sql.NullString{String: "test2"},
V5: sql.NullString{String: "test3"},
},
{
PType: sql.NullString{String: "p"},
V0: sql.NullString{String: "data1_admin"},
V1: sql.NullString{String: "data2"},
V2: sql.NullString{String: "write"},
},
{
PType: sql.NullString{String: "g"},
V0: sql.NullString{String: "alice"},
V1: sql.NullString{String: "data2_admin"},
},
{
PType: sql.NullString{String: "g"},
V0: sql.NullString{String: "bob"},
V1: sql.NullString{String: "data2_admin"},
V2: sql.NullString{String: "test"},
},
{
PType: sql.NullString{String: "g"},
V0: sql.NullString{String: "bob"},
V1: sql.NullString{String: "data1_admin"},
V2: sql.NullString{String: "test2"},
V3: sql.NullString{String: "test3"},
V4: sql.NullString{String: "test4"},
V5: sql.NullString{String: "test5"},
},
}

filter = Filter{
Expand Down Expand Up @@ -99,13 +153,13 @@ func testSQL(t *testing.T, db *sqlx.DB, tableName string) {
}

equalValue := func(line1, line2 CasbinRule) bool {
if line1.PType != line2.PType ||
line1.V0 != line2.V0 ||
line1.V1 != line2.V1 ||
line1.V2 != line2.V2 ||
line1.V3 != line2.V3 ||
line1.V4 != line2.V4 ||
line1.V5 != line2.V5 {
if line1.PType.String != line2.PType.String ||
line1.V0.String != line2.V0.String ||
line1.V1.String != line2.V1.String ||
line1.V2.String != line2.V2.String ||
line1.V3.String != line2.V3.String ||
line1.V4.String != line2.V4.String ||
line1.V5.String != line2.V5.String {
return false
}
return true
Expand All @@ -124,7 +178,15 @@ func testSQL(t *testing.T, db *sqlx.DB, tableName string) {

rules := make([][]interface{}, len(lines))
for idx, rule := range lines {
args := a.genArgs(rule.PType, []string{rule.V0, rule.V1, rule.V2, rule.V3, rule.V4, rule.V5})
args := a.genArgs(rule.PType.String,
[]string{
rule.V0.String,
rule.V1.String,
rule.V2.String,
rule.V3.String,
rule.V4.String,
rule.V5.String,
})
rules[idx] = args
}

Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@ module github.com/Blank-Xu/sqlx-adapter
go 1.11

require (
github.com/casbin/casbin/v2 v2.8.7
github.com/casbin/casbin/v2 v2.10.0
github.com/jmoiron/sqlx v1.2.0
)
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
github.com/casbin/casbin/v2 v2.8.7 h1:NSiJAV6Ug+w0FyxPxiJxmnuLKwTCYkd1rHZie3xGE4Y=
github.com/casbin/casbin/v2 v2.8.7/go.mod h1:XXtYGrs/0zlOsJMeRteEdVi/FsB0ph7KgNfjoCoJUD8=
github.com/casbin/casbin/v2 v2.10.0 h1:hBGwn5dnOiA2agPwpedz0a3ke/OVnWksyoHm7dW/bWc=
github.com/casbin/casbin/v2 v2.10.0/go.mod h1:XXtYGrs/0zlOsJMeRteEdVi/FsB0ph7KgNfjoCoJUD8=
github.com/jmoiron/sqlx v1.2.0 h1:41Ip0zITnmWNR/vHV+S4m+VoUivnWY5E4OJfLZjCJMA=
github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=

0 comments on commit 840637d

Please sign in to comment.