changeset 724:6ab0c170e5b8

Moved octree stuff to own package.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Sat, 22 Sep 2018 09:36:12 +0200
parents 7eed7ff3142d
children e0437ec46798
files pkg/models/octree.go pkg/models/octreecache.go pkg/octree/cache.go pkg/octree/tree.go
diffstat 4 files changed, 108 insertions(+), 108 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/models/octree.go	Fri Sep 21 18:32:41 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-package models
-
-type Octree struct {
-	// TODO: Implement me!
-}
--- a/pkg/models/octreecache.go	Fri Sep 21 18:32:41 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,103 +0,0 @@
-package models
-
-import (
-	"context"
-	"database/sql"
-	"sync"
-	"time"
-)
-
-type (
-	octreeCacheKey struct {
-		date       time.Time
-		bottleneck string
-	}
-
-	octreeCacheEntry struct {
-		checksum string
-		tree     *Octree
-		access   time.Time
-	}
-	octreeCache struct {
-		sync.Mutex
-		entries map[octreeCacheKey]*octreeCacheEntry
-	}
-)
-
-const (
-	cleanupOctreeCacheSleep = 6 * time.Minute
-	maxOctreeCacheAge       = 5 * time.Minute
-	maxOctreeCacheEntries   = 4
-)
-
-const (
-	fetchOctreeSQL = `
-SELECT checksum, octree_index
-FROM waterway.octrees ot
-JOIN waterway.sounding_results sr ON ot.sounding_result_id = sr.id
-WHERE sr.bottleneck_id = $1 AND sr.date_info = $2::date
-`
-	checkOctreeSQL = `
-SELECT CASE
-  WHEN checksum = $3 THEN NULL
-  ELSE ot.octree_index
-  END
-FROM waterway.octrees ot
-JOIN waterway.sounding_results sr ON ot.sounding_result_id = sr.id
-WHERE sr.bottleneck_id = $1 AND sr.date_info = $2::date
-`
-)
-
-var OctreeCache = octreeCache{
-	entries: map[octreeCacheKey]*octreeCacheEntry{},
-}
-
-func init() {
-	go OctreeCache.background()
-}
-
-func (oc *octreeCache) background() {
-	for {
-		time.Sleep(cleanupOctreeCacheSleep)
-		oc.cleanup()
-	}
-}
-
-func (oc *octreeCache) cleanup() {
-	oc.Lock()
-	defer oc.Unlock()
-	good := time.Now().Add(-maxOctreeCacheAge)
-	for k, v := range oc.entries {
-		if v.access.Before(good) {
-			delete(oc.entries, k)
-		}
-	}
-}
-
-func (oc *octreeCache) Get(
-	bottleneck string, date time.Time,
-	conn *sql.Conn, ctx context.Context,
-) (*Octree, error) {
-	oc.Lock()
-	defer oc.Unlock()
-
-	key := octreeCacheKey{date, bottleneck}
-	entry := oc.entries[key]
-	if entry == nil {
-		// fetch from database
-		var data []byte
-		err := conn.QueryRowContext(ctx, fetchOctreeSQL, bottleneck, date).Scan(&data)
-		switch {
-		case err == sql.ErrNoRows:
-			return nil, nil
-		case err != nil:
-			return nil, err
-		}
-		// TODO: Deserialize!
-	} else {
-		// check if we are not outdated.
-		// TODO: Implement me!
-	}
-
-	return nil, nil
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pkg/octree/cache.go	Sat Sep 22 09:36:12 2018 +0200
@@ -0,0 +1,103 @@
+package octree
+
+import (
+	"context"
+	"database/sql"
+	"sync"
+	"time"
+)
+
+type (
+	cacheKey struct {
+		date       time.Time
+		bottleneck string
+	}
+
+	cacheEntry struct {
+		checksum string
+		tree     *Octree
+		access   time.Time
+	}
+	OctreeCache struct {
+		sync.Mutex
+		entries map[cacheKey]*cacheEntry
+	}
+)
+
+const (
+	cleanupCacheSleep = 6 * time.Minute
+	maxCacheAge       = 5 * time.Minute
+	maxCacheEntries   = 4
+)
+
+const (
+	fetchOctreeSQL = `
+SELECT checksum, octree_index
+FROM waterway.octrees ot
+JOIN waterway.sounding_results sr ON ot.sounding_result_id = sr.id
+WHERE sr.bottleneck_id = $1 AND sr.date_info = $2::date
+`
+	checkOctreeSQL = `
+SELECT CASE
+  WHEN checksum = $3 THEN NULL
+  ELSE ot.octree_index
+  END
+FROM waterway.octrees ot
+JOIN waterway.sounding_results sr ON ot.sounding_result_id = sr.id
+WHERE sr.bottleneck_id = $1 AND sr.date_info = $2::date
+`
+)
+
+var Cache = OctreeCache{
+	entries: map[cacheKey]*cacheEntry{},
+}
+
+func init() {
+	go Cache.background()
+}
+
+func (oc *OctreeCache) background() {
+	for {
+		time.Sleep(cleanupCacheSleep)
+		oc.cleanup()
+	}
+}
+
+func (oc *OctreeCache) cleanup() {
+	oc.Lock()
+	defer oc.Unlock()
+	good := time.Now().Add(-maxCacheAge)
+	for k, v := range oc.entries {
+		if v.access.Before(good) {
+			delete(oc.entries, k)
+		}
+	}
+}
+
+func (oc *OctreeCache) Get(
+	bottleneck string, date time.Time,
+	conn *sql.Conn, ctx context.Context,
+) (*Octree, error) {
+	oc.Lock()
+	defer oc.Unlock()
+
+	key := cacheKey{date, bottleneck}
+	entry := oc.entries[key]
+	if entry == nil {
+		// fetch from database
+		var data []byte
+		err := conn.QueryRowContext(ctx, fetchOctreeSQL, bottleneck, date).Scan(&data)
+		switch {
+		case err == sql.ErrNoRows:
+			return nil, nil
+		case err != nil:
+			return nil, err
+		}
+		// TODO: Deserialize!
+	} else {
+		// check if we are not outdated.
+		// TODO: Implement me!
+	}
+
+	return nil, nil
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pkg/octree/tree.go	Sat Sep 22 09:36:12 2018 +0200
@@ -0,0 +1,5 @@
+package octree
+
+type Octree struct {
+	// TODO: Implement me!
+}