forked from Shiloh/githaven
108 lines
2.9 KiB
Go
108 lines
2.9 KiB
Go
|
// 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)
|
||
|
}
|