Mercurial > gemma
comparison pkg/octree/cache.go @ 725:e0437ec46798
Finished the octree cache. TODO: implement the deserialization.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Sat, 22 Sep 2018 09:55:42 +0200 |
parents | 6ab0c170e5b8 |
children | 41c8dc61f38f |
comparison
equal
deleted
inserted
replaced
724:6ab0c170e5b8 | 725:e0437ec46798 |
---|---|
81 oc.Lock() | 81 oc.Lock() |
82 defer oc.Unlock() | 82 defer oc.Unlock() |
83 | 83 |
84 key := cacheKey{date, bottleneck} | 84 key := cacheKey{date, bottleneck} |
85 entry := oc.entries[key] | 85 entry := oc.entries[key] |
86 | |
87 var data []byte | |
88 var checksum string | |
89 | |
86 if entry == nil { | 90 if entry == nil { |
87 // fetch from database | 91 // fetch from database |
88 var data []byte | 92 err := conn.QueryRowContext( |
89 err := conn.QueryRowContext(ctx, fetchOctreeSQL, bottleneck, date).Scan(&data) | 93 ctx, fetchOctreeSQL, bottleneck, date).Scan(&checksum, &data) |
90 switch { | 94 switch { |
91 case err == sql.ErrNoRows: | 95 case err == sql.ErrNoRows: |
92 return nil, nil | 96 return nil, nil |
93 case err != nil: | 97 case err != nil: |
94 return nil, err | 98 return nil, err |
95 } | 99 } |
96 // TODO: Deserialize! | |
97 } else { | 100 } else { |
98 // check if we are not outdated. | 101 // check if we are not outdated. |
99 // TODO: Implement me! | 102 err := conn.QueryRowContext( |
103 ctx, checkOctreeSQL, bottleneck, date, entry.checksum).Scan(&data) | |
104 switch { | |
105 case err == sql.ErrNoRows: | |
106 return nil, nil | |
107 case err != nil: | |
108 return nil, err | |
109 } | |
110 if data == nil { // we are still current | |
111 entry.access = time.Now() | |
112 return entry.tree, nil | |
113 } | |
100 } | 114 } |
101 | 115 |
102 return nil, nil | 116 tree, err := Deserialize(data) |
117 if err != nil { | |
118 return nil, err | |
119 } | |
120 | |
121 now := time.Now() | |
122 | |
123 if entry != nil { | |
124 entry.tree = tree | |
125 entry.access = now | |
126 return tree, nil | |
127 } | |
128 | |
129 for len(oc.entries) >= maxCacheEntries { | |
130 // Evict the entry that is accessed the longest time ago. | |
131 var oldestKey cacheKey | |
132 oldest := now | |
133 | |
134 for k, v := range oc.entries { | |
135 if v.access.Before(oldest) { | |
136 oldest = v.access | |
137 oldestKey = k | |
138 } | |
139 } | |
140 delete(oc.entries, oldestKey) | |
141 } | |
142 | |
143 oc.entries[key] = &cacheEntry{ | |
144 checksum: checksum, | |
145 tree: tree, | |
146 access: now, | |
147 } | |
148 | |
149 return tree, nil | |
103 } | 150 } |