Mercurial > gemma
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 {