Fix live queries
This commit is contained in:
parent
bd8c6fddb2
commit
ae7b6ca0e4
3 changed files with 24 additions and 24 deletions
12
db/live.go
12
db/live.go
|
@ -29,11 +29,7 @@ var sockets sync.Map
|
|||
func register(fib *fibre.Context, id string) func() {
|
||||
return func() {
|
||||
|
||||
auth := fib.Get(varKeyAuth).(*cnf.Auth)
|
||||
|
||||
sockets.Store(id, &socket{
|
||||
ns: auth.NS,
|
||||
db: auth.DB,
|
||||
fibre: fib,
|
||||
items: make(map[string][]interface{}),
|
||||
lives: make(map[string]*sql.LiveStatement),
|
||||
|
@ -54,13 +50,11 @@ func deregister(fib *fibre.Context, id string) func() {
|
|||
|
||||
func (e *executor) executeLive(ctx context.Context, stm *sql.LiveStatement) (out []interface{}, err error) {
|
||||
|
||||
stm.FB = e.id
|
||||
|
||||
if err := e.access(ctx, cnf.AuthNO); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if sck, ok := sockets.Load(stm.FB); ok {
|
||||
if sck, ok := sockets.Load(e.id); ok {
|
||||
return sck.(*socket).executeLive(e, ctx, stm)
|
||||
}
|
||||
|
||||
|
@ -70,13 +64,11 @@ func (e *executor) executeLive(ctx context.Context, stm *sql.LiveStatement) (out
|
|||
|
||||
func (e *executor) executeKill(ctx context.Context, stm *sql.KillStatement) (out []interface{}, err error) {
|
||||
|
||||
stm.FB = e.id
|
||||
|
||||
if err := e.access(ctx, cnf.AuthNO); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if sck, ok := sockets.Load(stm.FB); ok {
|
||||
if sck, ok := sockets.Load(e.id); ok {
|
||||
return sck.(*socket).executeKill(e, ctx, stm)
|
||||
}
|
||||
|
||||
|
|
34
db/socket.go
34
db/socket.go
|
@ -30,8 +30,6 @@ import (
|
|||
)
|
||||
|
||||
type socket struct {
|
||||
ns string
|
||||
db string
|
||||
mutex sync.Mutex
|
||||
fibre *fibre.Context
|
||||
items map[string][]interface{}
|
||||
|
@ -206,12 +204,12 @@ func (s *socket) deregister(id string) {
|
|||
|
||||
case *sql.Table:
|
||||
|
||||
key := &keys.LV{KV: KV, NS: s.ns, DB: s.db, TB: what.TB, LV: id}
|
||||
key := &keys.LV{KV: KV, NS: stm.NS, DB: stm.DB, TB: what.TB, LV: id}
|
||||
txn.Clr(ctx, key.Encode())
|
||||
|
||||
case *sql.Ident:
|
||||
|
||||
key := &keys.LV{KV: KV, NS: s.ns, DB: s.db, TB: what.VA, LV: id}
|
||||
key := &keys.LV{KV: KV, NS: stm.NS, DB: stm.DB, TB: what.VA, LV: id}
|
||||
txn.Clr(ctx, key.Encode())
|
||||
|
||||
}
|
||||
|
@ -224,6 +222,10 @@ func (s *socket) deregister(id string) {
|
|||
|
||||
func (s *socket) executeLive(e *executor, ctx context.Context, stm *sql.LiveStatement) (out []interface{}, err error) {
|
||||
|
||||
stm.FB = e.id
|
||||
stm.NS = e.ns
|
||||
stm.DB = e.db
|
||||
|
||||
s.mutex.Lock()
|
||||
defer s.mutex.Unlock()
|
||||
|
||||
|
@ -241,15 +243,17 @@ func (s *socket) executeLive(e *executor, ctx context.Context, stm *sql.LiveStat
|
|||
|
||||
// Store the live query in the database layer.
|
||||
|
||||
for key, val := range stm.What {
|
||||
var what sql.Exprs
|
||||
|
||||
for _, val := range stm.What {
|
||||
w, err := e.fetch(ctx, val, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
stm.What[key] = w
|
||||
what = append(what, w)
|
||||
}
|
||||
|
||||
for _, w := range stm.What {
|
||||
for _, w := range what {
|
||||
|
||||
switch what := w.(type) {
|
||||
|
||||
|
@ -258,14 +262,14 @@ func (s *socket) executeLive(e *executor, ctx context.Context, stm *sql.LiveStat
|
|||
|
||||
case *sql.Table:
|
||||
|
||||
key := &keys.LV{KV: KV, NS: s.ns, DB: s.db, TB: what.TB, LV: stm.ID}
|
||||
key := &keys.LV{KV: KV, NS: stm.NS, DB: stm.DB, TB: what.TB, LV: stm.ID}
|
||||
if _, err = e.dbo.Put(ctx, 0, key.Encode(), stm.Encode()); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
case *sql.Ident:
|
||||
|
||||
key := &keys.LV{KV: KV, NS: s.ns, DB: s.db, TB: what.VA, LV: stm.ID}
|
||||
key := &keys.LV{KV: KV, NS: stm.NS, DB: stm.DB, TB: what.VA, LV: stm.ID}
|
||||
if _, err = e.dbo.Put(ctx, 0, key.Encode(), stm.Encode()); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -285,15 +289,17 @@ func (s *socket) executeKill(e *executor, ctx context.Context, stm *sql.KillStat
|
|||
|
||||
// Remove the live query from the database layer.
|
||||
|
||||
for key, val := range stm.What {
|
||||
var what sql.Exprs
|
||||
|
||||
for _, val := range stm.What {
|
||||
w, err := e.fetch(ctx, val, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
stm.What[key] = w
|
||||
what = append(what, w)
|
||||
}
|
||||
|
||||
for _, w := range stm.What {
|
||||
for _, w := range what {
|
||||
|
||||
switch what := w.(type) {
|
||||
|
||||
|
@ -315,11 +321,11 @@ func (s *socket) executeKill(e *executor, ctx context.Context, stm *sql.KillStat
|
|||
switch what := w.(type) {
|
||||
|
||||
case *sql.Table:
|
||||
key := &keys.LV{KV: KV, NS: s.ns, DB: s.db, TB: what.TB, LV: qry.ID}
|
||||
key := &keys.LV{KV: KV, NS: qry.NS, DB: qry.DB, TB: what.TB, LV: qry.ID}
|
||||
_, err = e.dbo.Clr(ctx, key.Encode())
|
||||
|
||||
case *sql.Ident:
|
||||
key := &keys.LV{KV: KV, NS: s.ns, DB: s.db, TB: what.VA, LV: qry.ID}
|
||||
key := &keys.LV{KV: KV, NS: qry.NS, DB: qry.DB, TB: what.VA, LV: qry.ID}
|
||||
_, err = e.dbo.Clr(ctx, key.Encode())
|
||||
|
||||
}
|
||||
|
|
|
@ -125,6 +125,8 @@ type LetStatement struct {
|
|||
type LiveStatement struct {
|
||||
ID string
|
||||
FB string
|
||||
NS string
|
||||
DB string
|
||||
Diff bool
|
||||
Expr Fields
|
||||
What Exprs
|
||||
|
|
Loading…
Reference in a new issue