rclone/fs/config/default_storage.go

115 lines
2.6 KiB
Go

package config
import (
"encoding/json"
"sync"
)
// defaultStorage implements config.Storage, providing in-memory config.
// Indexed by section, then key.
type defaultStorage struct {
mu sync.RWMutex
sections map[string]map[string]string
}
func newDefaultStorage() *defaultStorage {
return &defaultStorage{
sections: map[string]map[string]string{},
}
}
// GetSectionList returns a slice of strings with names for all the sections.
func (s *defaultStorage) GetSectionList() []string {
s.mu.RLock()
defer s.mu.RUnlock()
sections := make([]string, 0, len(s.sections))
for section := range s.sections {
sections = append(sections, section)
}
return sections
}
// HasSection returns true if section exists in the config.
func (s *defaultStorage) HasSection(section string) bool {
s.mu.RLock()
defer s.mu.RUnlock()
_, hasSection := s.sections[section]
return hasSection
}
// DeleteSection deletes the specified section.
func (s *defaultStorage) DeleteSection(section string) {
s.mu.Lock()
defer s.mu.Unlock()
delete(s.sections, section)
}
// GetKeyList returns the keys in this section.
func (s *defaultStorage) GetKeyList(section string) []string {
s.mu.RLock()
defer s.mu.RUnlock()
theSection := s.sections[section]
keys := make([]string, 0, len(theSection))
for key := range theSection {
keys = append(keys, key)
}
return keys
}
// GetValue returns the key in section with a found flag.
func (s *defaultStorage) GetValue(section string, key string) (value string, found bool) {
s.mu.RLock()
defer s.mu.RUnlock()
theSection, hasSection := s.sections[section]
if !hasSection {
return "", false
}
value, hasValue := theSection[key]
return value, hasValue
}
func (s *defaultStorage) SetValue(section string, key string, value string) {
s.mu.Lock()
defer s.mu.Unlock()
theSection, hasSection := s.sections[section]
if !hasSection {
theSection = map[string]string{}
s.sections[section] = theSection
}
theSection[key] = value
}
func (s *defaultStorage) DeleteKey(section string, key string) bool {
s.mu.Lock()
defer s.mu.Unlock()
theSection, hasSection := s.sections[section]
if !hasSection {
return false
}
_, hasKey := theSection[key]
if !hasKey {
return false
}
delete(s.sections[section], key)
return true
}
func (s *defaultStorage) Load() error {
return nil
}
func (s *defaultStorage) Save() error {
return nil
}
// Serialize the config into a string
func (s *defaultStorage) Serialize() (string, error) {
s.mu.RLock()
defer s.mu.RUnlock()
j, err := json.Marshal(s.sections)
return string(j), err
}
// Check the interface is satisfied
var _ Storage = newDefaultStorage()