Mercurial > gemma
view pkg/models/extservices.go @ 616:51dc26b0f066
client: avoid extra password reveal button for IE/Edge
author | Bernhard Reiter <bernhard@intevation.de> |
---|---|
date | Tue, 11 Sep 2018 09:50:37 +0200 |
parents | c10c76c92797 |
children | a244b18cb916 |
line wrap: on
line source
package models import ( "context" "database/sql" "log" "sort" "sync" "gemma.intevation.de/gemma/pkg/auth" ) type ExtEntry struct { Name string `json:"name"` URL string `json:"url"` WFS bool `json:"wfs"` } type ExtServices struct { mu sync.Mutex entries []ExtEntry } var ExternalServices = &ExtServices{} const selectExternalServices = `SELECT local_name, remote_url, is_wfs FROM sys_admin.external_services ORDER BY local_name` func (es *ExtServices) Find(name string) (string, bool) { es.mu.Lock() defer es.mu.Unlock() if es.entries == nil { if err := es.load(); err != nil { log.Printf("error: %v\n", err) return "", false } } 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", context.Background(), func(conn *sql.Conn) error { rows, err := conn.QueryContext( context.Background(), selectExternalServices) if err != nil { return err } defer rows.Close() for rows.Next() { var entry ExtEntry if err := rows.Scan( &entry.Name, &entry.URL, &entry.WFS, ); err != nil { return err } es.entries = append(es.entries, entry) } return rows.Err() }) } func (es *ExtServices) Invalidate() { es.mu.Lock() es.entries = nil es.mu.Unlock() } func ExternalAll(ExtEntry) bool { return true } func ExternalWMS(entry ExtEntry) bool { return !entry.WFS } func ExternalWFS(entry ExtEntry) 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 }