OSDN Git Service

Hulk did something
[bytom/vapor.git] / vendor / github.com / syndtr / goleveldb / leveldb / options.go
diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/options.go b/vendor/github.com/syndtr/goleveldb/leveldb/options.go
new file mode 100644 (file)
index 0000000..b072b1a
--- /dev/null
@@ -0,0 +1,107 @@
+// Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>
+// All rights reserved.
+//
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package leveldb
+
+import (
+       "github.com/syndtr/goleveldb/leveldb/filter"
+       "github.com/syndtr/goleveldb/leveldb/opt"
+)
+
+func dupOptions(o *opt.Options) *opt.Options {
+       newo := &opt.Options{}
+       if o != nil {
+               *newo = *o
+       }
+       if newo.Strict == 0 {
+               newo.Strict = opt.DefaultStrict
+       }
+       return newo
+}
+
+func (s *session) setOptions(o *opt.Options) {
+       no := dupOptions(o)
+       // Alternative filters.
+       if filters := o.GetAltFilters(); len(filters) > 0 {
+               no.AltFilters = make([]filter.Filter, len(filters))
+               for i, filter := range filters {
+                       no.AltFilters[i] = &iFilter{filter}
+               }
+       }
+       // Comparer.
+       s.icmp = &iComparer{o.GetComparer()}
+       no.Comparer = s.icmp
+       // Filter.
+       if filter := o.GetFilter(); filter != nil {
+               no.Filter = &iFilter{filter}
+       }
+
+       s.o = &cachedOptions{Options: no}
+       s.o.cache()
+}
+
+const optCachedLevel = 7
+
+type cachedOptions struct {
+       *opt.Options
+
+       compactionExpandLimit []int
+       compactionGPOverlaps  []int
+       compactionSourceLimit []int
+       compactionTableSize   []int
+       compactionTotalSize   []int64
+}
+
+func (co *cachedOptions) cache() {
+       co.compactionExpandLimit = make([]int, optCachedLevel)
+       co.compactionGPOverlaps = make([]int, optCachedLevel)
+       co.compactionSourceLimit = make([]int, optCachedLevel)
+       co.compactionTableSize = make([]int, optCachedLevel)
+       co.compactionTotalSize = make([]int64, optCachedLevel)
+
+       for level := 0; level < optCachedLevel; level++ {
+               co.compactionExpandLimit[level] = co.Options.GetCompactionExpandLimit(level)
+               co.compactionGPOverlaps[level] = co.Options.GetCompactionGPOverlaps(level)
+               co.compactionSourceLimit[level] = co.Options.GetCompactionSourceLimit(level)
+               co.compactionTableSize[level] = co.Options.GetCompactionTableSize(level)
+               co.compactionTotalSize[level] = co.Options.GetCompactionTotalSize(level)
+       }
+}
+
+func (co *cachedOptions) GetCompactionExpandLimit(level int) int {
+       if level < optCachedLevel {
+               return co.compactionExpandLimit[level]
+       }
+       return co.Options.GetCompactionExpandLimit(level)
+}
+
+func (co *cachedOptions) GetCompactionGPOverlaps(level int) int {
+       if level < optCachedLevel {
+               return co.compactionGPOverlaps[level]
+       }
+       return co.Options.GetCompactionGPOverlaps(level)
+}
+
+func (co *cachedOptions) GetCompactionSourceLimit(level int) int {
+       if level < optCachedLevel {
+               return co.compactionSourceLimit[level]
+       }
+       return co.Options.GetCompactionSourceLimit(level)
+}
+
+func (co *cachedOptions) GetCompactionTableSize(level int) int {
+       if level < optCachedLevel {
+               return co.compactionTableSize[level]
+       }
+       return co.Options.GetCompactionTableSize(level)
+}
+
+func (co *cachedOptions) GetCompactionTotalSize(level int) int64 {
+       if level < optCachedLevel {
+               return co.compactionTotalSize[level]
+       }
+       return co.Options.GetCompactionTotalSize(level)
+}