| // Copyright 2015 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package util |
| |
| import ( |
| "v.io/v23/context" |
| "v.io/v23/glob" |
| "v.io/v23/naming" |
| "v.io/v23/rpc" |
| pubutil "v.io/v23/syncbase/util" |
| "v.io/v23/verror" |
| "v.io/x/ref/services/syncbase/store" |
| ) |
| |
| // Note, Syncbase handles Glob requests by implementing GlobChildren__ at each |
| // level (service, app, database, table). |
| |
| // GlobChildren implements glob over the Syncbase namespace. |
| func GlobChildren(ctx *context.T, call rpc.GlobChildrenServerCall, matcher *glob.Element, sntx store.SnapshotOrTransaction, stKeyPrefix string) error { |
| prefix, _ := matcher.FixedPrefix() |
| unescPrefix, ok := pubutil.Unescape(prefix) |
| if !ok { |
| return verror.New(verror.ErrBadArg, ctx, prefix) |
| } |
| it := sntx.Scan(ScanPrefixArgs(stKeyPrefix, unescPrefix)) |
| key := []byte{} |
| for it.Advance() { |
| key = it.Key(key) |
| parts := SplitKeyParts(string(key)) |
| // For explanation of Escape(), see comment in server/nosql/dispatcher.go. |
| name := pubutil.Escape(parts[len(parts)-1]) |
| if matcher.Match(name) { |
| // TODO(rogulenko): Check for resolve access. (For table glob, this means |
| // checking prefix perms.) |
| if err := call.SendStream().Send(naming.GlobChildrenReplyName{Value: name}); err != nil { |
| return err |
| } |
| } |
| } |
| if err := it.Err(); err != nil { |
| call.SendStream().Send(naming.GlobChildrenReplyError{Value: naming.GlobError{Error: err}}) |
| } |
| return nil |
| } |