github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/syndtr/goleveldb/leveldb/options.go (about) 1 // Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com> 2 // All rights reserved. 3 // 4 // Use of this source code is governed by a BSD-style license that can be 5 // found in the LICENSE file. 6 7 package leveldb 8 9 import ( 10 "github.com/insionng/yougam/libraries/syndtr/goleveldb/leveldb/filter" 11 "github.com/insionng/yougam/libraries/syndtr/goleveldb/leveldb/opt" 12 ) 13 14 func dupOptions(o *opt.Options) *opt.Options { 15 newo := &opt.Options{} 16 if o != nil { 17 *newo = *o 18 } 19 if newo.Strict == 0 { 20 newo.Strict = opt.DefaultStrict 21 } 22 return newo 23 } 24 25 func (s *session) setOptions(o *opt.Options) { 26 no := dupOptions(o) 27 // Alternative filters. 28 if filters := o.GetAltFilters(); len(filters) > 0 { 29 no.AltFilters = make([]filter.Filter, len(filters)) 30 for i, filter := range filters { 31 no.AltFilters[i] = &iFilter{filter} 32 } 33 } 34 // Comparer. 35 s.icmp = &iComparer{o.GetComparer()} 36 no.Comparer = s.icmp 37 // Filter. 38 if filter := o.GetFilter(); filter != nil { 39 no.Filter = &iFilter{filter} 40 } 41 42 s.o = &cachedOptions{Options: no} 43 s.o.cache() 44 } 45 46 const optCachedLevel = 7 47 48 type cachedOptions struct { 49 *opt.Options 50 51 compactionExpandLimit []int 52 compactionGPOverlaps []int 53 compactionSourceLimit []int 54 compactionTableSize []int 55 compactionTotalSize []int64 56 } 57 58 func (co *cachedOptions) cache() { 59 co.compactionExpandLimit = make([]int, optCachedLevel) 60 co.compactionGPOverlaps = make([]int, optCachedLevel) 61 co.compactionSourceLimit = make([]int, optCachedLevel) 62 co.compactionTableSize = make([]int, optCachedLevel) 63 co.compactionTotalSize = make([]int64, optCachedLevel) 64 65 for level := 0; level < optCachedLevel; level++ { 66 co.compactionExpandLimit[level] = co.Options.GetCompactionExpandLimit(level) 67 co.compactionGPOverlaps[level] = co.Options.GetCompactionGPOverlaps(level) 68 co.compactionSourceLimit[level] = co.Options.GetCompactionSourceLimit(level) 69 co.compactionTableSize[level] = co.Options.GetCompactionTableSize(level) 70 co.compactionTotalSize[level] = co.Options.GetCompactionTotalSize(level) 71 } 72 } 73 74 func (co *cachedOptions) GetCompactionExpandLimit(level int) int { 75 if level < optCachedLevel { 76 return co.compactionExpandLimit[level] 77 } 78 return co.Options.GetCompactionExpandLimit(level) 79 } 80 81 func (co *cachedOptions) GetCompactionGPOverlaps(level int) int { 82 if level < optCachedLevel { 83 return co.compactionGPOverlaps[level] 84 } 85 return co.Options.GetCompactionGPOverlaps(level) 86 } 87 88 func (co *cachedOptions) GetCompactionSourceLimit(level int) int { 89 if level < optCachedLevel { 90 return co.compactionSourceLimit[level] 91 } 92 return co.Options.GetCompactionSourceLimit(level) 93 } 94 95 func (co *cachedOptions) GetCompactionTableSize(level int) int { 96 if level < optCachedLevel { 97 return co.compactionTableSize[level] 98 } 99 return co.Options.GetCompactionTableSize(level) 100 } 101 102 func (co *cachedOptions) GetCompactionTotalSize(level int) int64 { 103 if level < optCachedLevel { 104 return co.compactionTotalSize[level] 105 } 106 return co.Options.GetCompactionTotalSize(level) 107 }