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