Improve SQL DEFINE SCOPE statement
This commit is contained in:
parent
cf79487b81
commit
ee6653c289
3 changed files with 46 additions and 13 deletions
14
sql/ast.go
14
sql/ast.go
|
@ -256,12 +256,14 @@ type RemoveTokenStatement struct {
|
|||
|
||||
// DefineScopeStatement represents an SQL DEFINE SCOPE statement.
|
||||
type DefineScopeStatement struct {
|
||||
KV string `cork:"-" codec:"-"`
|
||||
NS string `cork:"-" codec:"-"`
|
||||
DB string `cork:"-" codec:"-"`
|
||||
Name string `cork:"name" codec:"name"`
|
||||
Time time.Duration `cork:"time" codec:"time"`
|
||||
Opts interface{} `cork:"opts" codec:"opts"`
|
||||
KV string `cork:"-" codec:"-"`
|
||||
NS string `cork:"-" codec:"-"`
|
||||
DB string `cork:"-" codec:"-"`
|
||||
Name string `cork:"name" codec:"name"`
|
||||
Time time.Duration `cork:"time" codec:"time"`
|
||||
Signup Expr `cork:"signup" codec:"signup"`
|
||||
Signin Expr `cork:"signin" codec:"signin"`
|
||||
Policy map[string]interface{} `cork:"policy" codec:"policy"`
|
||||
}
|
||||
|
||||
// RemoveScopeStatement represents an SQL REMOVE SCOPE statement.
|
||||
|
|
|
@ -1199,7 +1199,9 @@ func (this *DefineScopeStatement) MarshalCORK() (dst []byte, err error) {
|
|||
e := cork.NewEncoder(b)
|
||||
e.Encode(this.Name)
|
||||
e.Encode(this.Time)
|
||||
e.Encode(this.Opts)
|
||||
e.Encode(this.Signup)
|
||||
e.Encode(this.Signin)
|
||||
e.Encode(this.Policy)
|
||||
return b.Bytes(), nil
|
||||
}
|
||||
|
||||
|
@ -1208,7 +1210,9 @@ func (this *DefineScopeStatement) UnmarshalCORK(src []byte) (err error) {
|
|||
d := cork.NewDecoder(b)
|
||||
d.Decode(&this.Name)
|
||||
d.Decode(&this.Time)
|
||||
d.Decode(&this.Opts)
|
||||
d.Decode(&this.Signup)
|
||||
d.Decode(&this.Signin)
|
||||
d.Decode(&this.Policy)
|
||||
return
|
||||
}
|
||||
|
||||
|
|
37
sql/scope.go
37
sql/scope.go
|
@ -26,12 +26,39 @@ func (p *parser) parseDefineScopeStatement() (stmt *DefineScopeStatement, err er
|
|||
return nil, err
|
||||
}
|
||||
|
||||
if _, _, err = p.shouldBe(SESSION); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for {
|
||||
|
||||
tok, _, exi := p.mightBe(SESSION, POLICY, SIGNUP, SIGNIN)
|
||||
if !exi {
|
||||
break
|
||||
}
|
||||
|
||||
if p.is(tok, SESSION) {
|
||||
if stmt.Time, err = p.parseDuration(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
if p.is(tok, POLICY) {
|
||||
if stmt.Policy, err = p.parseObject(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
if p.is(tok, SIGNUP) {
|
||||
_, _, _ = p.mightBe(AS)
|
||||
if stmt.Signup, err = p.parseExpr(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
if p.is(tok, SIGNIN) {
|
||||
_, _, _ = p.mightBe(AS)
|
||||
if stmt.Signin, err = p.parseExpr(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
if stmt.Time, err = p.parseDuration(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if _, _, err = p.shouldBe(EOF, SEMICOLON); err != nil {
|
||||
|
|
Loading…
Reference in a new issue