changeset 446:659c04feb2dc

Made use of sorted slice in external proxied services symmetric to published services.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 21 Aug 2018 18:07:43 +0200
parents 37742dd72fdb
children 62c909dd3098
files pkg/models/extservices.go pkg/models/pubservices.go
diffstat 2 files changed, 43 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/models/extservices.go	Tue Aug 21 17:55:58 2018 +0200
+++ b/pkg/models/extservices.go	Tue Aug 21 18:07:43 2018 +0200
@@ -3,19 +3,21 @@
 import (
 	"database/sql"
 	"log"
+	"sort"
 	"sync"
 
 	"gemma.intevation.de/gemma/pkg/auth"
 )
 
 type ExtEntry struct {
-	url   string
-	isWFS bool
+	Name string
+	URL  string
+	WFS  bool
 }
 
 type ExtServices struct {
 	mu      sync.Mutex
-	entries map[string]ExtEntry
+	entries []ExtEntry
 }
 
 var ExternalServices = &ExtServices{}
@@ -28,17 +30,23 @@
 	defer es.mu.Unlock()
 
 	if es.entries == nil {
-		es.entries = make(map[string]ExtEntry)
 		if err := es.load(); err != nil {
 			log.Printf("error: %v\n", err)
 			return "", false
 		}
 	}
-	e, found := es.entries[name]
-	return e.url, found
+	n := sort.Search(len(es.entries), func(i int) bool {
+		return es.entries[i].Name >= name
+	})
+	if n == len(es.entries) || es.entries[n].Name != name {
+		return "", false
+	}
+	return es.entries[n].URL, true
 }
 
 func (es *ExtServices) load() error {
+	// make empty slice to prevent retry if slice is empty.
+	es.entries = []ExtEntry{}
 	return auth.RunAs("sys_admin", func(db *sql.DB) error {
 		rows, err := db.Query(selectExternalServices)
 		if err != nil {
@@ -47,11 +55,14 @@
 		defer rows.Close()
 		for rows.Next() {
 			var entry ExtEntry
-			var key string
-			if err := rows.Scan(&key, &entry.url, &entry.isWFS); err != nil {
+			if err := rows.Scan(
+				&entry.Name,
+				&entry.URL,
+				&entry.WFS,
+			); err != nil {
 				return err
 			}
-			es.entries[key] = entry
+			es.entries = append(es.entries, entry)
 		}
 		return rows.Err()
 	})
@@ -62,3 +73,24 @@
 	es.entries = nil
 	es.mu.Unlock()
 }
+
+func ExternalWMS(entry PubEntry) bool { return !entry.WFS }
+func ExternalWFS(entry PubEntry) bool { return entry.WFS }
+
+func (es *ExtServices) Filter(accept func(ExtEntry) bool) []ExtEntry {
+	es.mu.Lock()
+	defer es.mu.Unlock()
+	if es.entries == nil {
+		if err := es.load(); err != nil {
+			log.Printf("error: %v\n", err)
+			return nil
+		}
+	}
+	ee := make([]ExtEntry, 0, len(es.entries))
+	for _, e := range es.entries {
+		if accept(e) {
+			ee = append(ee, e)
+		}
+	}
+	return ee
+}
--- a/pkg/models/pubservices.go	Tue Aug 21 17:55:58 2018 +0200
+++ b/pkg/models/pubservices.go	Tue Aug 21 18:07:43 2018 +0200
@@ -47,6 +47,8 @@
 }
 
 func (ps *PubServices) load() error {
+	// make empty slice to prevent retry if slice is empty.
+	ps.entries = []PubEntry{}
 	return auth.RunAs("sys_admin", func(db *sql.DB) error {
 		rows, err := db.Query(selectPublishedServices)
 		if err != nil {