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 }