...
1
2
3
4
5
6
7 package leveldb
8
9 import (
10 "github.com/syndtr/goleveldb/leveldb/filter"
11 "github.com/syndtr/goleveldb/leveldb/opt"
12 )
13
14 func dupOptions(o *opt.Options) *opt.Options {
15 newo := &opt.Options{}
16 if o != nil {
17 *newo = *o
18 }
19 if newo.Strict == 0 {
20 newo.Strict = opt.DefaultStrict
21 }
22 return newo
23 }
24
25 func (s *session) setOptions(o *opt.Options) {
26 no := dupOptions(o)
27
28 if filters := o.GetAltFilters(); len(filters) > 0 {
29 no.AltFilters = make([]filter.Filter, len(filters))
30 for i, filter := range filters {
31 no.AltFilters[i] = &iFilter{filter}
32 }
33 }
34
35 s.icmp = &iComparer{o.GetComparer()}
36 no.Comparer = s.icmp
37
38 if filter := o.GetFilter(); filter != nil {
39 no.Filter = &iFilter{filter}
40 }
41
42 s.o = &cachedOptions{Options: no}
43 s.o.cache()
44 }
45
46 const optCachedLevel = 7
47
48 type cachedOptions struct {
49 *opt.Options
50
51 compactionExpandLimit []int
52 compactionGPOverlaps []int
53 compactionSourceLimit []int
54 compactionTableSize []int
55 compactionTotalSize []int64
56 }
57
58 func (co *cachedOptions) cache() {
59 co.compactionExpandLimit = make([]int, optCachedLevel)
60 co.compactionGPOverlaps = make([]int, optCachedLevel)
61 co.compactionSourceLimit = make([]int, optCachedLevel)
62 co.compactionTableSize = make([]int, optCachedLevel)
63 co.compactionTotalSize = make([]int64, optCachedLevel)
64
65 for level := 0; level < optCachedLevel; level++ {
66 co.compactionExpandLimit[level] = co.Options.GetCompactionExpandLimit(level)
67 co.compactionGPOverlaps[level] = co.Options.GetCompactionGPOverlaps(level)
68 co.compactionSourceLimit[level] = co.Options.GetCompactionSourceLimit(level)
69 co.compactionTableSize[level] = co.Options.GetCompactionTableSize(level)
70 co.compactionTotalSize[level] = co.Options.GetCompactionTotalSize(level)
71 }
72 }
73
74 func (co *cachedOptions) GetCompactionExpandLimit(level int) int {
75 if level < optCachedLevel {
76 return co.compactionExpandLimit[level]
77 }
78 return co.Options.GetCompactionExpandLimit(level)
79 }
80
81 func (co *cachedOptions) GetCompactionGPOverlaps(level int) int {
82 if level < optCachedLevel {
83 return co.compactionGPOverlaps[level]
84 }
85 return co.Options.GetCompactionGPOverlaps(level)
86 }
87
88 func (co *cachedOptions) GetCompactionSourceLimit(level int) int {
89 if level < optCachedLevel {
90 return co.compactionSourceLimit[level]
91 }
92 return co.Options.GetCompactionSourceLimit(level)
93 }
94
95 func (co *cachedOptions) GetCompactionTableSize(level int) int {
96 if level < optCachedLevel {
97 return co.compactionTableSize[level]
98 }
99 return co.Options.GetCompactionTableSize(level)
100 }
101
102 func (co *cachedOptions) GetCompactionTotalSize(level int) int64 {
103 if level < optCachedLevel {
104 return co.compactionTotalSize[level]
105 }
106 return co.Options.GetCompactionTotalSize(level)
107 }
108
View as plain text