optimistic writeback and pessimistic read

This commit is contained in:
2023-11-03 00:56:56 -07:00
parent 0fc1bf396d
commit 610b979966
3 changed files with 139 additions and 93 deletions

View File

@@ -10,7 +10,13 @@ import (
func (c *ConfigManager) GetBool(key string) bool { func (c *ConfigManager) GetBool(key string) bool {
c.mutex.RLock() c.mutex.RLock()
defer c.mutex.RUnlock() defer c.mutex.RUnlock()
if v, ok := c.combinedConfig[strings.ToLower(key)]; ok { v, ok := c.combinedConfig[strings.ToLower(key)]
if !ok {
v, ok = c.envConfig[strings.ToLower(key)]
if !ok {
return false
}
}
val := v.Value val := v.Value
switch val := val.(type) { switch val := val.(type) {
case bool: case bool:
@@ -41,13 +47,17 @@ func (c *ConfigManager) GetBool(key string) bool {
return val.(bool) return val.(bool)
} }
} }
return false
}
func (c *ConfigManager) GetDuration(key string) time.Duration { func (c *ConfigManager) GetDuration(key string) time.Duration {
c.mutex.RLock() c.mutex.RLock()
defer c.mutex.RUnlock() defer c.mutex.RUnlock()
if v, ok := c.combinedConfig[strings.ToLower(key)]; ok { v, ok := c.combinedConfig[strings.ToLower(key)]
if !ok {
v, ok = c.envConfig[strings.ToLower(key)]
if !ok {
return 0
}
}
val := v.Value val := v.Value
switch val := val.(type) { switch val := val.(type) {
case time.Duration: case time.Duration:
@@ -68,15 +78,21 @@ func (c *ConfigManager) GetDuration(key string) time.Duration {
return 0 return 0
default: default:
return val.(time.Duration) return val.(time.Duration)
} }
} }
return 0
}
func (c *ConfigManager) GetString(key string) string { func (c *ConfigManager) GetString(key string) string {
c.mutex.RLock() c.mutex.RLock()
defer c.mutex.RUnlock() defer c.mutex.RUnlock()
if v, ok := c.combinedConfig[strings.ToLower(key)]; ok { v, ok := c.combinedConfig[strings.ToLower(key)]
if !ok {
v, ok = c.envConfig[strings.ToLower(key)]
if !ok {
return ""
}
}
switch val := v.Value.(type) { switch val := v.Value.(type) {
case string: case string:
return val return val
@@ -84,13 +100,17 @@ func (c *ConfigManager) GetString(key string) string {
return fmt.Sprintf("%v", v.Value) return fmt.Sprintf("%v", v.Value)
} }
} }
return ""
}
func (c *ConfigManager) GetStringMap(key string) map[string]any { func (c *ConfigManager) GetStringMap(key string) map[string]any {
c.mutex.RLock() c.mutex.RLock()
defer c.mutex.RUnlock() defer c.mutex.RUnlock()
if v, ok := c.combinedConfig[strings.ToLower(key)]; ok { v, ok := c.combinedConfig[strings.ToLower(key)]
if !ok {
v, ok = c.envConfig[strings.ToLower(key)]
if !ok {
return nil
}
}
switch val := v.Value.(type) { switch val := v.Value.(type) {
case map[string]any: case map[string]any:
return val return val
@@ -98,13 +118,17 @@ func (c *ConfigManager) GetStringMap(key string) map[string]any {
return nil return nil
} }
} }
return nil
}
func (c *ConfigManager) GetStringSlice(key string) []string { func (c *ConfigManager) GetStringSlice(key string) []string {
c.mutex.RLock() c.mutex.RLock()
defer c.mutex.RUnlock() defer c.mutex.RUnlock()
if v, ok := c.combinedConfig[strings.ToLower(key)]; ok { v, ok := c.combinedConfig[strings.ToLower(key)]
if !ok {
v, ok = c.envConfig[strings.ToLower(key)]
if !ok {
return nil
}
}
switch val := v.Value.(type) { switch val := v.Value.(type) {
case []string: case []string:
return val return val
@@ -112,13 +136,17 @@ func (c *ConfigManager) GetStringSlice(key string) []string {
return nil return nil
} }
} }
return nil
}
func (c *ConfigManager) GetInt(key string) int { func (c *ConfigManager) GetInt(key string) int {
c.mutex.RLock() c.mutex.RLock()
defer c.mutex.RUnlock() defer c.mutex.RUnlock()
if v, ok := c.combinedConfig[strings.ToLower(key)]; ok { v, ok := c.combinedConfig[strings.ToLower(key)]
if !ok {
v, ok = c.envConfig[strings.ToLower(key)]
if !ok {
return 0
}
}
switch val := v.Value.(type) { switch val := v.Value.(type) {
case int: case int:
return val return val
@@ -135,16 +163,20 @@ func (c *ConfigManager) GetInt(key string) int {
case nil: case nil:
return 0 return 0
default: default:
return val.(int)
}
}
return 0 return 0
} }
}
func (c *ConfigManager) GetIntSlice(key string) []int { func (c *ConfigManager) GetIntSlice(key string) []int {
c.mutex.RLock() c.mutex.RLock()
defer c.mutex.RUnlock() defer c.mutex.RUnlock()
if v, ok := c.combinedConfig[strings.ToLower(key)]; ok { v, ok := c.combinedConfig[strings.ToLower(key)]
if !ok {
v, ok = c.envConfig[strings.ToLower(key)]
if !ok {
return nil
}
}
switch val := v.Value.(type) { switch val := v.Value.(type) {
case []int: case []int:
return val return val
@@ -152,5 +184,3 @@ func (c *ConfigManager) GetIntSlice(key string) []int {
return nil return nil
} }
} }
return nil
}

View File

@@ -28,6 +28,7 @@ type (
ConfigManager struct { ConfigManager struct {
configName string configName string
configPath string
configFileUsed string configFileUsed string
configType configType configType configType
envPrefix string envPrefix string
@@ -201,6 +202,12 @@ func readFile(filename string, fileType configType) (map[string]any, error) {
} }
} }
func (c *ConfigManager) SetConfigDir(path string) {
c.mutex.Lock()
defer c.mutex.Unlock()
c.configPath = name
}
func (c *ConfigManager) SetConfigName(name string) { func (c *ConfigManager) SetConfigName(name string) {
c.mutex.Lock() c.mutex.Lock()
defer c.mutex.Unlock() defer c.mutex.Unlock()

View File

@@ -9,6 +9,7 @@ func (c *ConfigManager) SetBool(key string, value bool) {
defer c.mutex.Unlock() defer c.mutex.Unlock()
lower := strings.ToLower(key) lower := strings.ToLower(key)
c.mapConfig[lower] = ConfigMap{Key: key, Value: value} c.mapConfig[lower] = ConfigMap{Key: key, Value: value}
c.combinedConfig[lower] = ConfigMap{Key: key, Value: value}
} }
func (c *ConfigManager) SetString(key string, value string) { func (c *ConfigManager) SetString(key string, value string) {
@@ -16,6 +17,7 @@ func (c *ConfigManager) SetString(key string, value string) {
defer c.mutex.Unlock() defer c.mutex.Unlock()
lower := strings.ToLower(key) lower := strings.ToLower(key)
c.mapConfig[lower] = ConfigMap{Key: key, Value: value} c.mapConfig[lower] = ConfigMap{Key: key, Value: value}
c.combinedConfig[lower] = ConfigMap{Key: key, Value: value}
} }
func (c *ConfigManager) Set(key string, value any) { func (c *ConfigManager) Set(key string, value any) {
@@ -23,6 +25,7 @@ func (c *ConfigManager) Set(key string, value any) {
defer c.mutex.Unlock() defer c.mutex.Unlock()
lower := strings.ToLower(key) lower := strings.ToLower(key)
c.mapConfig[lower] = ConfigMap{Key: key, Value: value} c.mapConfig[lower] = ConfigMap{Key: key, Value: value}
c.combinedConfig[lower] = ConfigMap{Key: key, Value: value}
} }
func (c *ConfigManager) SetDefault(key string, value any) { func (c *ConfigManager) SetDefault(key string, value any) {
@@ -30,4 +33,10 @@ func (c *ConfigManager) SetDefault(key string, value any) {
defer c.mutex.Unlock() defer c.mutex.Unlock()
lower := strings.ToLower(key) lower := strings.ToLower(key)
c.defaultConfig[lower] = ConfigMap{Key: key, Value: value} c.defaultConfig[lower] = ConfigMap{Key: key, Value: value}
if _, ok := c.mapConfig[lower]; !ok {
if envVal, ok := c.envConfig[lower]; !ok {
c.mapConfig[lower] = envVal
c.combinedConfig[lower] = envVal
}
}
} }