Mercurial > gemma
diff pkg/models/pubservices.go @ 442:fc37e7072022
Moved some models used in controllers to to model package because they may be needed elsewhere (e.g. GeoServer config).
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Tue, 21 Aug 2018 16:57:55 +0200 |
parents | pkg/controllers/pubservices.go@76a76691a298 |
children | c315885825e5 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pkg/models/pubservices.go Tue Aug 21 16:57:55 2018 +0200 @@ -0,0 +1,72 @@ +package models + +import ( + "database/sql" + "log" + "sync" + + "gemma.intevation.de/gemma/pkg/auth" +) + +type PubEntry struct { + style sql.NullString + asWMS bool + asWFS bool +} + +type PubServices struct { + entries map[string]PubEntry + mu sync.Mutex +} + +const selectPublishedServices = `SELECT name, style, as_wms, as_wfs +FROM sys_admin.published_services` + +var PublishedServices = &PubServices{} + +func (ps *PubServices) Find(name string) (string, bool) { + ps.mu.Lock() + defer ps.mu.Unlock() + + if ps.entries == nil { + ps.entries = make(map[string]PubEntry) + if err := ps.load(); err != nil { + log.Printf("error: %v\n", err) + return "", false + } + } + _, found := ps.entries[name] + if !found { + name = "" + } + return name, found +} + +func (ps *PubServices) load() error { + 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 + var key string + if err := rows.Scan( + &key, &entry.style, + &entry.asWFS, &entry.asWFS, + ); err != nil { + return err + } + ps.entries[key] = entry + } + return rows.Err() + }) + return nil +} + +func (ps *PubServices) Invalidate() { + ps.mu.Lock() + ps.entries = nil + ps.mu.Unlock() +}