|
- // 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)
- }
|