diff --git a/cache/file.go b/cache/file.go index a4e59c06..3807fa7c 100644 --- a/cache/file.go +++ b/cache/file.go @@ -47,10 +47,11 @@ type FileCache struct { EmbedExpiry int } -// Create new file cache with default directory and suffix. +// Create new file cache with no config. // the level and expiry need set in method StartAndGC as config string. func NewFileCache() *FileCache { - return &FileCache{CachePath:FileCachePath, FileSuffix:FileCacheFileSuffix} + // return &FileCache{CachePath:FileCachePath, FileSuffix:FileCacheFileSuffix} + return &FileCache{} } // Start and begin gc for file cache. @@ -142,13 +143,14 @@ func (this *FileCache) Get(key string) interface{} { } // Put value into file cache. -// timeout means how long to keep this file, unit of second. +// timeout means how long to keep this file, unit of ms. +// if timeout equals FileCacheEmbedExpiry(default is 0), cache this item forever. func (this *FileCache) Put(key string, val interface{}, timeout int64) error { filename := this.getCacheFileName(key) var item FileCacheItem item.Data = val if timeout == FileCacheEmbedExpiry { - item.Expired = time.Now().Unix() + (86400 * 365 * 10) //10年 + item.Expired = time.Now().Unix() + (86400 * 365 * 10) // ten years } else { item.Expired = time.Now().Unix() + timeout } diff --git a/cache/memory.go b/cache/memory.go index 839fed72..e1284b79 100644 --- a/cache/memory.go +++ b/cache/memory.go @@ -26,7 +26,7 @@ type MemoryCache struct { lock sync.RWMutex dur time.Duration items map[string]*MemoryItem - Every int // run an expiration check Every cloc; time + Every int // run an expiration check Every clock time } // NewMemoryCache returns a new MemoryCache. @@ -52,6 +52,7 @@ func (bc *MemoryCache) Get(name string) interface{} { } // Put cache to memory. +// if expired is 0, it will be cleaned by next gc operation ( default gc clock is 1 minute). func (bc *MemoryCache) Put(name string, value interface{}, expired int64) error { bc.lock.Lock() defer bc.lock.Unlock() diff --git a/config/config.go b/config/config.go index 101bc66d..5fb0dd81 100644 --- a/config/config.go +++ b/config/config.go @@ -4,9 +4,10 @@ import ( "fmt" ) +// ConfigContainer defines how to get and set value from configuration raw data. type ConfigContainer interface { - Set(key, val string) error - String(key string) string + Set(key, val string) error // support section::key type in given key when using ini type. + String(key string) string // support section::key type in key string when using ini and json type; Int,Int64,Bool,Float,DIY are same. Int(key string) (int, error) Int64(key string) (int64, error) Bool(key string) (bool, error) @@ -14,6 +15,7 @@ type ConfigContainer interface { DIY(key string) (interface{}, error) } +// Config is the adapter interface for parsing config file to get raw data to ConfigContainer. type Config interface { Parse(key string) (ConfigContainer, error) } @@ -33,8 +35,8 @@ func Register(name string, adapter Config) { adapters[name] = adapter } -// adapterNamer is ini/json/xml/yaml -// filename is the config file path +// adapterName is ini/json/xml/yaml. +// filename is the config file path. func NewConfig(adapterName, fileaname string) (ConfigContainer, error) { adapter, ok := adapters[adapterName] if !ok { diff --git a/config/ini.go b/config/ini.go index cf4484f1..22c23f40 100644 --- a/config/ini.go +++ b/config/ini.go @@ -13,21 +13,21 @@ import ( ) var ( - DEFAULT_SECTION = "default" - bNumComment = []byte{'#'} // number sign - bSemComment = []byte{';'} // semicolon + DEFAULT_SECTION = "default" // default section means if some ini items not in a section, make them in default section, + bNumComment = []byte{'#'} // number signal + bSemComment = []byte{';'} // semicolon signal bEmpty = []byte{} - bEqual = []byte{'='} - bDQuote = []byte{'"'} - sectionStart = []byte{'['} - sectionEnd = []byte{']'} + bEqual = []byte{'='} // equal signal + bDQuote = []byte{'"'} // quote signal + sectionStart = []byte{'['} // section start signal + sectionEnd = []byte{']'} // section end signal ) +// IniConfig implements Config to parse ini file. type IniConfig struct { } -// ParseFile creates a new Config and parses the file configuration from the -// named file. +// ParseFile creates a new Config and parses the file configuration from the named file. func (ini *IniConfig) Parse(name string) (ConfigContainer, error) { file, err := os.Open(name) if err != nil { @@ -106,11 +106,12 @@ func (ini *IniConfig) Parse(name string) (ConfigContainer, error) { return cfg, nil } -// A Config represents the configuration. +// A Config represents the ini configuration. +// When set and get value, support key as section:name type. type IniConfigContainer struct { filename string - data map[string]map[string]string //section=> key:val - sectionComment map[string]string //sction : comment + data map[string]map[string]string // section=> key:val + sectionComment map[string]string // section : comment keycomment map[string]string // id: []{comment, key...}; id 1 is for main comment. sync.RWMutex } @@ -127,6 +128,7 @@ func (c *IniConfigContainer) Int(key string) (int, error) { return strconv.Atoi(c.getdata(key)) } +// Int64 returns the int64 value for a given key. func (c *IniConfigContainer) Int64(key string) (int64, error) { key = strings.ToLower(key) return strconv.ParseInt(c.getdata(key), 10, 64) @@ -145,6 +147,8 @@ func (c *IniConfigContainer) String(key string) string { } // WriteValue writes a new value for key. +// if write to one section, the key need be "section::key". +// if the section is not existed, it panics. func (c *IniConfigContainer) Set(key, value string) error { c.Lock() defer c.Unlock() @@ -169,6 +173,7 @@ func (c *IniConfigContainer) Set(key, value string) error { return nil } +// DIY returns the raw value by a given key. func (c *IniConfigContainer) DIY(key string) (v interface{}, err error) { key = strings.ToLower(key) if v, ok := c.data[key]; ok { @@ -177,7 +182,7 @@ func (c *IniConfigContainer) DIY(key string) (v interface{}, err error) { return v, errors.New("key not find") } -//section.key or key +// section.key or key func (c *IniConfigContainer) getdata(key string) string { c.RLock() defer c.RUnlock() diff --git a/config/json.go b/config/json.go index b401e1b3..883e0674 100644 --- a/config/json.go +++ b/config/json.go @@ -9,9 +9,11 @@ import ( "sync" ) +// JsonConfig is a json config parser and implements Config interface. type JsonConfig struct { } +// Parse returns a ConfigContainer with parsed json config map. func (js *JsonConfig) Parse(filename string) (ConfigContainer, error) { file, err := os.Open(filename) if err != nil { @@ -32,11 +34,14 @@ func (js *JsonConfig) Parse(filename string) (ConfigContainer, error) { return x, nil } +// A Config represents the json configuration. +// Only when get value, support key as section:name type. type JsonConfigContainer struct { data map[string]interface{} sync.RWMutex } +// Bool returns the boolean value for a given key. func (c *JsonConfigContainer) Bool(key string) (bool, error) { val := c.getdata(key) if val != nil { @@ -48,9 +53,10 @@ func (c *JsonConfigContainer) Bool(key string) (bool, error) { } else { return false, errors.New("not exist key:" + key) } - + return false, nil } +// Int returns the integer value for a given key. func (c *JsonConfigContainer) Int(key string) (int, error) { val := c.getdata(key) if val != nil { @@ -62,8 +68,10 @@ func (c *JsonConfigContainer) Int(key string) (int, error) { } else { return 0, errors.New("not exist key:" + key) } + return 0, nil } +// Int64 returns the int64 value for a given key. func (c *JsonConfigContainer) Int64(key string) (int64, error) { val := c.getdata(key) if val != nil { @@ -75,8 +83,10 @@ func (c *JsonConfigContainer) Int64(key string) (int64, error) { } else { return 0, errors.New("not exist key:" + key) } + return 0, nil } +// Float returns the float value for a given key. func (c *JsonConfigContainer) Float(key string) (float64, error) { val := c.getdata(key) if val != nil { @@ -88,8 +98,10 @@ func (c *JsonConfigContainer) Float(key string) (float64, error) { } else { return 0.0, errors.New("not exist key:" + key) } + return 0.0, nil } +// String returns the string value for a given key. func (c *JsonConfigContainer) String(key string) string { val := c.getdata(key) if val != nil { @@ -101,8 +113,10 @@ func (c *JsonConfigContainer) String(key string) string { } else { return "" } + return "" } +// WriteValue writes a new value for key. func (c *JsonConfigContainer) Set(key, val string) error { c.Lock() defer c.Unlock() @@ -110,6 +124,7 @@ func (c *JsonConfigContainer) Set(key, val string) error { return nil } +// DIY returns the raw value by a given key. func (c *JsonConfigContainer) DIY(key string) (v interface{}, err error) { val := c.getdata(key) if val != nil { @@ -117,9 +132,10 @@ func (c *JsonConfigContainer) DIY(key string) (v interface{}, err error) { } else { return nil, errors.New("not exist key") } + return nil, nil } -//section.key or key +// section.key or key func (c *JsonConfigContainer) getdata(key string) interface{} { c.RLock() defer c.RUnlock() diff --git a/config/xml.go b/config/xml.go index 7f3807ef..35f19336 100644 --- a/config/xml.go +++ b/config/xml.go @@ -1,5 +1,3 @@ -//xml parse should incluce in tags - package config import ( @@ -12,9 +10,13 @@ import ( "github.com/beego/x2j" ) +// XmlConfig is a xml config parser and implements Config interface. +// xml configurations should be included in tag. +// only support key/value pair as value as each item. type XMLConfig struct { } +// Parse returns a ConfigContainer with parsed xml config map. func (xmls *XMLConfig) Parse(filename string) (ConfigContainer, error) { file, err := os.Open(filename) if err != nil { @@ -36,27 +38,33 @@ func (xmls *XMLConfig) Parse(filename string) (ConfigContainer, error) { return x, nil } +// A Config represents the xml configuration. type XMLConfigContainer struct { data map[string]interface{} sync.Mutex } +// Bool returns the boolean value for a given key. func (c *XMLConfigContainer) Bool(key string) (bool, error) { return strconv.ParseBool(c.data[key].(string)) } +// Int returns the integer value for a given key. func (c *XMLConfigContainer) Int(key string) (int, error) { return strconv.Atoi(c.data[key].(string)) } +// Int64 returns the int64 value for a given key. func (c *XMLConfigContainer) Int64(key string) (int64, error) { return strconv.ParseInt(c.data[key].(string), 10, 64) } +// Float returns the float value for a given key. func (c *XMLConfigContainer) Float(key string) (float64, error) { return strconv.ParseFloat(c.data[key].(string), 64) } +// String returns the string value for a given key. func (c *XMLConfigContainer) String(key string) string { if v, ok := c.data[key].(string); ok { return v @@ -64,6 +72,7 @@ func (c *XMLConfigContainer) String(key string) string { return "" } +// WriteValue writes a new value for key. func (c *XMLConfigContainer) Set(key, val string) error { c.Lock() defer c.Unlock() @@ -71,6 +80,7 @@ func (c *XMLConfigContainer) Set(key, val string) error { return nil } +// DIY returns the raw value by a given key. func (c *XMLConfigContainer) DIY(key string) (v interface{}, err error) { if v, ok := c.data[key]; ok { return v, nil diff --git a/config/yaml.go b/config/yaml.go index 04bb0940..394cb3b2 100644 --- a/config/yaml.go +++ b/config/yaml.go @@ -12,9 +12,11 @@ import ( "github.com/beego/goyaml2" ) +// YAMLConfig is a yaml config parser and implements Config interface. type YAMLConfig struct { } +// Parse returns a ConfigContainer with parsed yaml config map. func (yaml *YAMLConfig) Parse(filename string) (ConfigContainer, error) { y := &YAMLConfigContainer{ data: make(map[string]interface{}), @@ -27,7 +29,8 @@ func (yaml *YAMLConfig) Parse(filename string) (ConfigContainer, error) { return y, nil } -// 从Reader读取YAML +// Read yaml file to map. +// if json like, use json package, unless goyaml2 package. func ReadYmlReader(path string) (cnf map[string]interface{}, err error) { err = nil f, err := os.Open(path) @@ -68,11 +71,13 @@ func ReadYmlReader(path string) (cnf map[string]interface{}, err error) { return } +// A Config represents the yaml configuration. type YAMLConfigContainer struct { data map[string]interface{} sync.Mutex } +// Bool returns the boolean value for a given key. func (c *YAMLConfigContainer) Bool(key string) (bool, error) { if v, ok := c.data[key].(bool); ok { return v, nil @@ -80,6 +85,7 @@ func (c *YAMLConfigContainer) Bool(key string) (bool, error) { return false, errors.New("not bool value") } +// Int returns the integer value for a given key. func (c *YAMLConfigContainer) Int(key string) (int, error) { if v, ok := c.data[key].(int64); ok { return int(v), nil @@ -87,6 +93,7 @@ func (c *YAMLConfigContainer) Int(key string) (int, error) { return 0, errors.New("not int value") } +// Int64 returns the int64 value for a given key. func (c *YAMLConfigContainer) Int64(key string) (int64, error) { if v, ok := c.data[key].(int64); ok { return v, nil @@ -94,6 +101,7 @@ func (c *YAMLConfigContainer) Int64(key string) (int64, error) { return 0, errors.New("not bool value") } +// Float returns the float value for a given key. func (c *YAMLConfigContainer) Float(key string) (float64, error) { if v, ok := c.data[key].(float64); ok { return v, nil @@ -101,6 +109,7 @@ func (c *YAMLConfigContainer) Float(key string) (float64, error) { return 0.0, errors.New("not float64 value") } +// String returns the string value for a given key. func (c *YAMLConfigContainer) String(key string) string { if v, ok := c.data[key].(string); ok { return v @@ -108,6 +117,7 @@ func (c *YAMLConfigContainer) String(key string) string { return "" } +// WriteValue writes a new value for key. func (c *YAMLConfigContainer) Set(key, val string) error { c.Lock() defer c.Unlock() @@ -115,6 +125,7 @@ func (c *YAMLConfigContainer) Set(key, val string) error { return nil } +// DIY returns the raw value by a given key. func (c *YAMLConfigContainer) DIY(key string) (v interface{}, err error) { if v, ok := c.data[key]; ok { return v, nil