42 lines
826 B
Go
42 lines
826 B
Go
package meta
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/FAU-CDI/wisski-distillery/internal/component"
|
|
"github.com/FAU-CDI/wisski-distillery/internal/component/sql"
|
|
)
|
|
|
|
// Component meta is responsible for managing metadata per WissKI Instance
|
|
type Meta struct {
|
|
component.Base
|
|
|
|
SQL *sql.SQL
|
|
|
|
sl sync.Mutex
|
|
sc map[string]*Storage
|
|
}
|
|
|
|
// Storage returns a Storage for the instance with the given slug.
|
|
// When slug is nil, returns a global storage.
|
|
func (meta *Meta) Storage(slug string) *Storage {
|
|
meta.sl.Lock()
|
|
defer meta.sl.Unlock()
|
|
|
|
// create the cache (unless it already exists)
|
|
if meta.sc == nil {
|
|
meta.sc = make(map[string]*Storage)
|
|
}
|
|
|
|
// cache hit
|
|
if storage, ok := meta.sc[slug]; ok {
|
|
return storage
|
|
}
|
|
|
|
// create a new storage
|
|
meta.sc[slug] = &Storage{
|
|
Slug: slug,
|
|
sql: meta.SQL,
|
|
}
|
|
return meta.sc[slug]
|
|
}
|