github.com/slspeek/camlistore_namedsearch@v0.0.0-20140519202248-ed6f70f7721a/pkg/index/enumstat.go (about) 1 /* 2 Copyright 2011 Google Inc. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package index 18 19 import ( 20 "fmt" 21 "strconv" 22 "strings" 23 24 "camlistore.org/pkg/blob" 25 "camlistore.org/pkg/context" 26 "camlistore.org/pkg/sorted" 27 ) 28 29 func (ix *Index) EnumerateBlobs(ctx *context.Context, dest chan<- blob.SizedRef, after string, limit int) (err error) { 30 defer close(dest) 31 it := ix.s.Find("have:"+after, "have~") 32 defer func() { 33 closeErr := it.Close() 34 if err == nil { 35 err = closeErr 36 } 37 }() 38 39 n := int(0) 40 for n < limit && it.Next() { 41 k := it.Key() 42 if k <= after { 43 continue 44 } 45 if !strings.HasPrefix(k, "have:") { 46 break 47 } 48 n++ 49 br, ok := blob.Parse(k[len("have:"):]) 50 size, err := strconv.ParseUint(it.Value(), 10, 32) 51 if ok && err == nil { 52 select { 53 case dest <- blob.SizedRef{br, uint32(size)}: 54 case <-ctx.Done(): 55 return context.ErrCanceled 56 } 57 } 58 } 59 return nil 60 } 61 62 func (ix *Index) StatBlobs(dest chan<- blob.SizedRef, blobs []blob.Ref) error { 63 for _, br := range blobs { 64 key := "have:" + br.String() 65 v, err := ix.s.Get(key) 66 if err == sorted.ErrNotFound { 67 continue 68 } 69 if err != nil { 70 return fmt.Errorf("error looking up key %q: %v", key, err) 71 } 72 size, err := strconv.ParseInt(v, 10, 64) 73 if err != nil { 74 return fmt.Errorf("invalid size for key %q = %q", key, v) 75 } 76 dest <- blob.SizedRef{br, uint32(size)} 77 } 78 return nil 79 }