Mercurial > gemma
view pkg/models/pubservices.go @ 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 | a8e217119085 |
line wrap: on
line source
package models import ( "database/sql" "log" "sort" "sync" "gemma.intevation.de/gemma/pkg/auth" ) type PubEntry struct { Name string Style sql.NullString WMS bool WFS bool } type PubServices struct { entries []PubEntry mu sync.Mutex } const selectPublishedServices = `SELECT name, style, as_wms, as_wfs FROM sys_admin.published_services ORDER by name` var PublishedServices = &PubServices{} func (ps *PubServices) Find(name string) (string, bool) { ps.mu.Lock() defer ps.mu.Unlock() if ps.entries == nil { if err := ps.load(); err != nil { log.Printf("error: %v\n", err) return "", false } } n := sort.Search(len(ps.entries), func(i int) bool { return ps.entries[i].Name >= name }) if n == len(ps.entries) || ps.entries[n].Name != name { return "", false } return name, true } 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 { return err } defer rows.Close() for rows.Next() { var entry PubEntry if err := rows.Scan( &entry.Name, &entry.Style, &entry.WFS, &entry.WFS, ); err != nil { return err } ps.entries = append(ps.entries, entry) } return rows.Err() }) return nil } func (ps *PubServices) Invalidate() { ps.mu.Lock() ps.entries = nil ps.mu.Unlock() } func PublishedWMS(entry PubEntry) bool { return entry.WMS } func PublishedWFS(entry PubEntry) bool { return entry.WFS } func (ps *PubServices) Filter(accept func(PubEntry) bool) []PubEntry { ps.mu.Lock() defer ps.mu.Unlock() if ps.entries == nil { if err := ps.load(); err != nil { log.Printf("error: %v\n", err) return nil } } pe := make([]PubEntry, 0, len(ps.entries)) for _, e := range ps.entries { if accept(e) { pe = append(pe, e) } } return pe }