Платформа ЦРНП "Мирокод" для разработки проектов
https://git.mirocod.ru
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
2.9 KiB
107 lines
2.9 KiB
// 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) |
|
}
|
|
|