Add scope tokens to SQL INFO queries
This commit is contained in:
parent
6ed01504ec
commit
41c2fd0b3e
6 changed files with 81 additions and 10 deletions
30
db/info.go
30
db/info.go
|
@ -28,6 +28,8 @@ func (e *executor) executeInfo(ctx context.Context, ast *sql.InfoStatement) (out
|
||||||
return e.executeInfoNS(ctx, ast)
|
return e.executeInfoNS(ctx, ast)
|
||||||
case sql.DATABASE:
|
case sql.DATABASE:
|
||||||
return e.executeInfoDB(ctx, ast)
|
return e.executeInfoDB(ctx, ast)
|
||||||
|
case sql.SCOPE:
|
||||||
|
return e.executeInfoSC(ctx, ast)
|
||||||
case sql.TABLE:
|
case sql.TABLE:
|
||||||
return e.executeInfoTB(ctx, ast)
|
return e.executeInfoTB(ctx, ast)
|
||||||
}
|
}
|
||||||
|
@ -131,24 +133,44 @@ func (e *executor) executeInfoDB(ctx context.Context, ast *sql.InfoStatement) (o
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (e *executor) executeInfoSC(ctx context.Context, ast *sql.InfoStatement) (out []interface{}, err error) {
|
||||||
|
|
||||||
|
st, err := e.dbo.AllST(ctx, ast.NS, ast.DB, ast.What.VA)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
res := data.New()
|
||||||
|
|
||||||
|
token := make(map[string]interface{})
|
||||||
|
for _, v := range st {
|
||||||
|
token[v.Name.VA] = v.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
res.Set(token, "token")
|
||||||
|
|
||||||
|
return []interface{}{res.Data()}, nil
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func (e *executor) executeInfoTB(ctx context.Context, ast *sql.InfoStatement) (out []interface{}, err error) {
|
func (e *executor) executeInfoTB(ctx context.Context, ast *sql.InfoStatement) (out []interface{}, err error) {
|
||||||
|
|
||||||
ev, err := e.dbo.AllEV(ctx, ast.NS, ast.DB, ast.What.TB)
|
ev, err := e.dbo.AllEV(ctx, ast.NS, ast.DB, ast.What.VA)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
fd, err := e.dbo.AllFD(ctx, ast.NS, ast.DB, ast.What.TB)
|
fd, err := e.dbo.AllFD(ctx, ast.NS, ast.DB, ast.What.VA)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
ix, err := e.dbo.AllIX(ctx, ast.NS, ast.DB, ast.What.TB)
|
ix, err := e.dbo.AllIX(ctx, ast.NS, ast.DB, ast.What.VA)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
ft, err := e.dbo.AllFT(ctx, ast.NS, ast.DB, ast.What.TB)
|
ft, err := e.dbo.AllFT(ctx, ast.NS, ast.DB, ast.What.VA)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -108,6 +108,32 @@ func TestInfo(t *testing.T) {
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Convey("Info for scope", t, func() {
|
||||||
|
|
||||||
|
setupDB()
|
||||||
|
|
||||||
|
txt := `
|
||||||
|
USE NS test DB test;
|
||||||
|
DEFINE SCOPE test;
|
||||||
|
DEFINE TOKEN test ON SCOPE test TYPE HS512 VALUE "test";
|
||||||
|
INFO FOR SCOPE test;
|
||||||
|
REMOVE TOKEN test ON SCOPE test;
|
||||||
|
INFO FOR SCOPE test;
|
||||||
|
`
|
||||||
|
|
||||||
|
res, err := Execute(setupKV(), txt, nil)
|
||||||
|
So(err, ShouldBeNil)
|
||||||
|
So(res, ShouldHaveLength, 6)
|
||||||
|
So(res[1].Status, ShouldEqual, "OK")
|
||||||
|
So(res[2].Status, ShouldEqual, "OK")
|
||||||
|
So(data.Consume(res[3].Result[0]).Get("token").Data(), ShouldHaveLength, 1)
|
||||||
|
So(data.Consume(res[3].Result[0]).Get("token.test").Data(), ShouldEqual, "DEFINE TOKEN test ON SCOPE test TYPE HS512 VALUE ********")
|
||||||
|
So(res[4].Status, ShouldEqual, "OK")
|
||||||
|
So(res[5].Status, ShouldEqual, "OK")
|
||||||
|
So(data.Consume(res[5].Result[0]).Get("token").Data(), ShouldHaveLength, 0)
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
Convey("Info for table", t, func() {
|
Convey("Info for table", t, func() {
|
||||||
|
|
||||||
setupDB()
|
setupDB()
|
||||||
|
|
|
@ -86,7 +86,7 @@ type InfoStatement struct {
|
||||||
NS string
|
NS string
|
||||||
DB string
|
DB string
|
||||||
Kind Token
|
Kind Token
|
||||||
What *Table
|
What *Ident
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------
|
// --------------------------------------------------
|
||||||
|
|
13
sql/info.go
13
sql/info.go
|
@ -22,7 +22,7 @@ func (p *parser) parseInfoStatement() (stmt *InfoStatement, err error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if stmt.Kind, _, err = p.shouldBe(NAMESPACE, DATABASE, TABLE); err != nil {
|
if stmt.Kind, _, err = p.shouldBe(NAMESPACE, DATABASE, SCOPE, TABLE); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,11 +38,20 @@ func (p *parser) parseInfoStatement() (stmt *InfoStatement, err error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if is(stmt.Kind, SCOPE) {
|
||||||
|
if stmt.KV, stmt.NS, stmt.DB, err = p.o.get(AuthDB); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if stmt.What, err = p.parseIdent(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if is(stmt.Kind, TABLE) {
|
if is(stmt.Kind, TABLE) {
|
||||||
if stmt.KV, stmt.NS, stmt.DB, err = p.o.get(AuthDB); err != nil {
|
if stmt.KV, stmt.NS, stmt.DB, err = p.o.get(AuthDB); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if stmt.What, err = p.parseTable(); err != nil {
|
if stmt.What, err = p.parseIdent(); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -288,7 +288,7 @@ func Test_Parse_Queries_Info(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
sql: `INFO FOR`,
|
sql: `INFO FOR`,
|
||||||
err: "Found `` but expected `NAMESPACE, DATABASE, TABLE`",
|
err: "Found `` but expected `NAMESPACE, DATABASE, SCOPE, TABLE`",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
sql: `INFO FOR NAMESPACE`,
|
sql: `INFO FOR NAMESPACE`,
|
||||||
|
@ -304,16 +304,28 @@ func Test_Parse_Queries_Info(t *testing.T) {
|
||||||
Kind: DATABASE,
|
Kind: DATABASE,
|
||||||
}}},
|
}}},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
sql: `INFO FOR SCOPE`,
|
||||||
|
err: "Found `` but expected `name`",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
sql: `INFO FOR SCOPE test`,
|
||||||
|
res: &Query{Statements: []Statement{&InfoStatement{
|
||||||
|
KV: "*", NS: "*", DB: "*",
|
||||||
|
Kind: SCOPE,
|
||||||
|
What: &Ident{"test"},
|
||||||
|
}}},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
sql: `INFO FOR TABLE`,
|
sql: `INFO FOR TABLE`,
|
||||||
err: "Found `` but expected `table`",
|
err: "Found `` but expected `name`",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
sql: `INFO FOR TABLE test`,
|
sql: `INFO FOR TABLE test`,
|
||||||
res: &Query{Statements: []Statement{&InfoStatement{
|
res: &Query{Statements: []Statement{&InfoStatement{
|
||||||
KV: "*", NS: "*", DB: "*",
|
KV: "*", NS: "*", DB: "*",
|
||||||
Kind: TABLE,
|
Kind: TABLE,
|
||||||
What: &Table{"test"},
|
What: &Ident{"test"},
|
||||||
}}},
|
}}},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
@ -163,6 +163,8 @@ func (this InfoStatement) String() string {
|
||||||
return "INFO FOR NAMESPACE"
|
return "INFO FOR NAMESPACE"
|
||||||
case DATABASE:
|
case DATABASE:
|
||||||
return "INFO FOR DATABASE"
|
return "INFO FOR DATABASE"
|
||||||
|
case SCOPE:
|
||||||
|
return print("INFO FOR SCOPE %s", this.What)
|
||||||
default:
|
default:
|
||||||
return print("INFO FOR TABLE %s", this.What)
|
return print("INFO FOR TABLE %s", this.What)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue