Adam Sadovsky | 23bc12d | 2015-09-24 10:10:09 -0700 | [diff] [blame] | 1 | // Copyright 2015 The Vanadium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style |
| 3 | // license that can be found in the LICENSE file. |
| 4 | |
| 5 | package util |
| 6 | |
| 7 | import ( |
| 8 | "v.io/v23/context" |
| 9 | "v.io/v23/glob" |
| 10 | "v.io/v23/naming" |
| 11 | "v.io/v23/rpc" |
| 12 | pubutil "v.io/v23/syncbase/util" |
Adam Sadovsky | 3e4a4d5 | 2015-09-25 16:53:19 -0700 | [diff] [blame] | 13 | "v.io/v23/verror" |
Adam Sadovsky | 23bc12d | 2015-09-24 10:10:09 -0700 | [diff] [blame] | 14 | "v.io/x/ref/services/syncbase/store" |
| 15 | ) |
| 16 | |
| 17 | // Note, Syncbase handles Glob requests by implementing GlobChildren__ at each |
| 18 | // level (service, app, database, table). |
| 19 | |
Adam Sadovsky | 3e4a4d5 | 2015-09-25 16:53:19 -0700 | [diff] [blame] | 20 | // GlobChildren implements glob over the Syncbase namespace. |
| 21 | func GlobChildren(ctx *context.T, call rpc.GlobChildrenServerCall, matcher *glob.Element, sntx store.SnapshotOrTransaction, stKeyPrefix string) error { |
Adam Sadovsky | 23bc12d | 2015-09-24 10:10:09 -0700 | [diff] [blame] | 22 | prefix, _ := matcher.FixedPrefix() |
Adam Sadovsky | 3e4a4d5 | 2015-09-25 16:53:19 -0700 | [diff] [blame] | 23 | unescPrefix, ok := pubutil.Unescape(prefix) |
| 24 | if !ok { |
| 25 | return verror.New(verror.ErrBadArg, ctx, prefix) |
| 26 | } |
| 27 | it := sntx.Scan(ScanPrefixArgs(stKeyPrefix, unescPrefix)) |
Adam Sadovsky | 23bc12d | 2015-09-24 10:10:09 -0700 | [diff] [blame] | 28 | key := []byte{} |
| 29 | for it.Advance() { |
| 30 | key = it.Key(key) |
| 31 | parts := SplitKeyParts(string(key)) |
Adam Sadovsky | 3e4a4d5 | 2015-09-25 16:53:19 -0700 | [diff] [blame] | 32 | // For explanation of Escape(), see comment in server/nosql/dispatcher.go. |
| 33 | name := pubutil.Escape(parts[len(parts)-1]) |
Adam Sadovsky | 23bc12d | 2015-09-24 10:10:09 -0700 | [diff] [blame] | 34 | if matcher.Match(name) { |
| 35 | // TODO(rogulenko): Check for resolve access. (For table glob, this means |
| 36 | // checking prefix perms.) |
Adam Sadovsky | 3e4a4d5 | 2015-09-25 16:53:19 -0700 | [diff] [blame] | 37 | if err := call.SendStream().Send(naming.GlobChildrenReplyName{Value: name}); err != nil { |
Adam Sadovsky | 23bc12d | 2015-09-24 10:10:09 -0700 | [diff] [blame] | 38 | return err |
| 39 | } |
| 40 | } |
| 41 | } |
| 42 | if err := it.Err(); err != nil { |
| 43 | call.SendStream().Send(naming.GlobChildrenReplyError{Value: naming.GlobError{Error: err}}) |
| 44 | } |
| 45 | return nil |
| 46 | } |