2820f630 by astaxie

config: add more method

DefaultString(key string, defaultval string) string      // support
section::key type in key string when using ini and json type;
Int,Int64,Bool,Float,DIY are same.
	DefaultStrings(key string, defaultval []string) []string //get string
slice
	DefaultInt(key string, defaultval int) int
	DefaultInt64(key string, defaultval int64) int64
	DefaultBool(key string, defaultval bool) bool
	DefaultFloat(key string, defaultval float64) float64
	DIY(key string) (interface{}, error)
	GetSection(section string) (map[string]string, error)
	SaveConfigFile(filename string) error
1 parent 1f6c5599
...@@ -22,12 +22,21 @@ type ConfigContainer interface { ...@@ -22,12 +22,21 @@ type ConfigContainer interface {
22 Int64(key string) (int64, error) 22 Int64(key string) (int64, error)
23 Bool(key string) (bool, error) 23 Bool(key string) (bool, error)
24 Float(key string) (float64, error) 24 Float(key string) (float64, error)
25 DefaultString(key string, defaultval string) string // support section::key type in key string when using ini and json type; Int,Int64,Bool,Float,DIY are same.
26 DefaultStrings(key string, defaultval []string) []string //get string slice
27 DefaultInt(key string, defaultval int) int
28 DefaultInt64(key string, defaultval int64) int64
29 DefaultBool(key string, defaultval bool) bool
30 DefaultFloat(key string, defaultval float64) float64
25 DIY(key string) (interface{}, error) 31 DIY(key string) (interface{}, error)
32 GetSection(section string) (map[string]string, error)
33 SaveConfigFile(filename string) error
26 } 34 }
27 35
28 // Config is the adapter interface for parsing config file to get raw data to ConfigContainer. 36 // Config is the adapter interface for parsing config file to get raw data to ConfigContainer.
29 type Config interface { 37 type Config interface {
30 Parse(key string) (ConfigContainer, error) 38 Parse(key string) (ConfigContainer, error)
39 ParseData(data []byte) (ConfigContainer, error)
31 } 40 }
32 41
33 var adapters = make(map[string]Config) 42 var adapters = make(map[string]Config)
...@@ -54,3 +63,13 @@ func NewConfig(adapterName, fileaname string) (ConfigContainer, error) { ...@@ -54,3 +63,13 @@ func NewConfig(adapterName, fileaname string) (ConfigContainer, error) {
54 } 63 }
55 return adapter.Parse(fileaname) 64 return adapter.Parse(fileaname)
56 } 65 }
66
67 // adapterName is ini/json/xml/yaml.
68 // data is the config data.
69 func NewConfigData(adapterName string, data []byte) (ConfigContainer, error) {
70 adapter, ok := adapters[adapterName]
71 if !ok {
72 return nil, fmt.Errorf("config: unknown adaptername %q (forgotten import?)", adapterName)
73 }
74 return adapter.ParseData(data)
75 }
......
...@@ -32,26 +32,74 @@ func (c *fakeConfigContainer) String(key string) string { ...@@ -32,26 +32,74 @@ func (c *fakeConfigContainer) String(key string) string {
32 return c.getData(key) 32 return c.getData(key)
33 } 33 }
34 34
35 func (c *fakeConfigContainer) DefaultString(key string, defaultval string) string {
36 if v := c.getData(key); v == "" {
37 return defaultval
38 } else {
39 return v
40 }
41 }
42
35 func (c *fakeConfigContainer) Strings(key string) []string { 43 func (c *fakeConfigContainer) Strings(key string) []string {
36 return strings.Split(c.getData(key), ";") 44 return strings.Split(c.getData(key), ";")
37 } 45 }
38 46
47 func (c *fakeConfigContainer) DefaultStrings(key string, defaultval []string) []string {
48 if v := c.Strings(key); len(v) == 0 {
49 return defaultval
50 } else {
51 return v
52 }
53 }
54
39 func (c *fakeConfigContainer) Int(key string) (int, error) { 55 func (c *fakeConfigContainer) Int(key string) (int, error) {
40 return strconv.Atoi(c.getData(key)) 56 return strconv.Atoi(c.getData(key))
41 } 57 }
42 58
59 func (c *fakeConfigContainer) DefaultInt(key string, defaultval int) int {
60 if v, err := c.Int(key); err != nil {
61 return defaultval
62 } else {
63 return v
64 }
65 }
66
43 func (c *fakeConfigContainer) Int64(key string) (int64, error) { 67 func (c *fakeConfigContainer) Int64(key string) (int64, error) {
44 return strconv.ParseInt(c.getData(key), 10, 64) 68 return strconv.ParseInt(c.getData(key), 10, 64)
45 } 69 }
46 70
71 func (c *fakeConfigContainer) DefaultInt64(key string, defaultval int64) int64 {
72 if v, err := c.Int64(key); err != nil {
73 return defaultval
74 } else {
75 return v
76 }
77 }
78
47 func (c *fakeConfigContainer) Bool(key string) (bool, error) { 79 func (c *fakeConfigContainer) Bool(key string) (bool, error) {
48 return strconv.ParseBool(c.getData(key)) 80 return strconv.ParseBool(c.getData(key))
49 } 81 }
50 82
83 func (c *fakeConfigContainer) DefaultBool(key string, defaultval bool) bool {
84 if v, err := c.Bool(key); err != nil {
85 return defaultval
86 } else {
87 return v
88 }
89 }
90
51 func (c *fakeConfigContainer) Float(key string) (float64, error) { 91 func (c *fakeConfigContainer) Float(key string) (float64, error) {
52 return strconv.ParseFloat(c.getData(key), 64) 92 return strconv.ParseFloat(c.getData(key), 64)
53 } 93 }
54 94
95 func (c *fakeConfigContainer) DefaultFloat(key string, defaultval float64) float64 {
96 if v, err := c.Float(key); err != nil {
97 return defaultval
98 } else {
99 return v
100 }
101 }
102
55 func (c *fakeConfigContainer) DIY(key string) (interface{}, error) { 103 func (c *fakeConfigContainer) DIY(key string) (interface{}, error) {
56 if v, ok := c.data[strings.ToLower(key)]; ok { 104 if v, ok := c.data[strings.ToLower(key)]; ok {
57 return v, nil 105 return v, nil
...@@ -59,6 +107,14 @@ func (c *fakeConfigContainer) DIY(key string) (interface{}, error) { ...@@ -59,6 +107,14 @@ func (c *fakeConfigContainer) DIY(key string) (interface{}, error) {
59 return nil, errors.New("key not find") 107 return nil, errors.New("key not find")
60 } 108 }
61 109
110 func (c *fakeConfigContainer) GetSection(section string) (map[string]string, error) {
111 return nil, errors.New("not implement in the fakeConfigContainer")
112 }
113
114 func (c *fakeConfigContainer) SaveConfigFile(filename string) error {
115 return errors.New("not implement in the fakeConfigContainer")
116 }
117
62 var _ ConfigContainer = new(fakeConfigContainer) 118 var _ ConfigContainer = new(fakeConfigContainer)
63 119
64 func NewFakeConfig() ConfigContainer { 120 func NewFakeConfig() ConfigContainer {
......
...@@ -13,11 +13,15 @@ import ( ...@@ -13,11 +13,15 @@ import (
13 "bufio" 13 "bufio"
14 "bytes" 14 "bytes"
15 "errors" 15 "errors"
16 "fmt"
16 "io" 17 "io"
18 "io/ioutil"
17 "os" 19 "os"
20 "path"
18 "strconv" 21 "strconv"
19 "strings" 22 "strings"
20 "sync" 23 "sync"
24 "time"
21 "unicode" 25 "unicode"
22 ) 26 )
23 27
...@@ -30,6 +34,7 @@ var ( ...@@ -30,6 +34,7 @@ var (
30 bDQuote = []byte{'"'} // quote signal 34 bDQuote = []byte{'"'} // quote signal
31 sectionStart = []byte{'['} // section start signal 35 sectionStart = []byte{'['} // section start signal
32 sectionEnd = []byte{']'} // section end signal 36 sectionEnd = []byte{']'} // section end signal
37 lineBreak = "\n"
33 ) 38 )
34 39
35 // IniConfig implements Config to parse ini file. 40 // IniConfig implements Config to parse ini file.
...@@ -115,6 +120,16 @@ func (ini *IniConfig) Parse(name string) (ConfigContainer, error) { ...@@ -115,6 +120,16 @@ func (ini *IniConfig) Parse(name string) (ConfigContainer, error) {
115 return cfg, nil 120 return cfg, nil
116 } 121 }
117 122
123 func (ini *IniConfig) ParseData(data []byte) (ConfigContainer, error) {
124 // Save memory data to temporary file
125 tmpName := path.Join(os.TempDir(), "beego", fmt.Sprintf("%d", time.Now().Nanosecond()))
126 os.MkdirAll(path.Dir(tmpName), os.ModePerm)
127 if err := ioutil.WriteFile(tmpName, data, 0655); err != nil {
128 return nil, err
129 }
130 return ini.Parse(tmpName)
131 }
132
118 // A Config represents the ini configuration. 133 // A Config represents the ini configuration.
119 // When set and get value, support key as section:name type. 134 // When set and get value, support key as section:name type.
120 type IniConfigContainer struct { 135 type IniConfigContainer struct {
...@@ -130,32 +145,154 @@ func (c *IniConfigContainer) Bool(key string) (bool, error) { ...@@ -130,32 +145,154 @@ func (c *IniConfigContainer) Bool(key string) (bool, error) {
130 return strconv.ParseBool(c.getdata(strings.ToLower(key))) 145 return strconv.ParseBool(c.getdata(strings.ToLower(key)))
131 } 146 }
132 147
148 // DefaultBool returns the boolean value for a given key.
149 // if err != nil return defaltval
150 func (c *IniConfigContainer) DefaultBool(key string, defaultval bool) bool {
151 if v, err := c.Bool(key); err != nil {
152 return defaultval
153 } else {
154 return v
155 }
156 }
157
133 // Int returns the integer value for a given key. 158 // Int returns the integer value for a given key.
134 func (c *IniConfigContainer) Int(key string) (int, error) { 159 func (c *IniConfigContainer) Int(key string) (int, error) {
135 return strconv.Atoi(c.getdata(strings.ToLower(key))) 160 return strconv.Atoi(c.getdata(strings.ToLower(key)))
136 } 161 }
137 162
163 // DefaultInt returns the integer value for a given key.
164 // if err != nil return defaltval
165 func (c *IniConfigContainer) DefaultInt(key string, defaultval int) int {
166 if v, err := c.Int(key); err != nil {
167 return defaultval
168 } else {
169 return v
170 }
171 }
172
138 // Int64 returns the int64 value for a given key. 173 // Int64 returns the int64 value for a given key.
139 func (c *IniConfigContainer) Int64(key string) (int64, error) { 174 func (c *IniConfigContainer) Int64(key string) (int64, error) {
140 return strconv.ParseInt(c.getdata(strings.ToLower(key)), 10, 64) 175 return strconv.ParseInt(c.getdata(strings.ToLower(key)), 10, 64)
141 } 176 }
142 177
178 // DefaultInt64 returns the int64 value for a given key.
179 // if err != nil return defaltval
180 func (c *IniConfigContainer) DefaultInt64(key string, defaultval int64) int64 {
181 if v, err := c.Int64(key); err != nil {
182 return defaultval
183 } else {
184 return v
185 }
186 }
187
143 // Float returns the float value for a given key. 188 // Float returns the float value for a given key.
144 func (c *IniConfigContainer) Float(key string) (float64, error) { 189 func (c *IniConfigContainer) Float(key string) (float64, error) {
145 return strconv.ParseFloat(c.getdata(strings.ToLower(key)), 64) 190 return strconv.ParseFloat(c.getdata(strings.ToLower(key)), 64)
146 } 191 }
147 192
193 // DefaultFloat returns the float64 value for a given key.
194 // if err != nil return defaltval
195 func (c *IniConfigContainer) DefaultFloat(key string, defaultval float64) float64 {
196 if v, err := c.Float(key); err != nil {
197 return defaultval
198 } else {
199 return v
200 }
201 }
202
148 // String returns the string value for a given key. 203 // String returns the string value for a given key.
149 func (c *IniConfigContainer) String(key string) string { 204 func (c *IniConfigContainer) String(key string) string {
150 key = strings.ToLower(key) 205 key = strings.ToLower(key)
151 return c.getdata(strings.ToLower(key)) 206 return c.getdata(strings.ToLower(key))
152 } 207 }
153 208
209 // DefaultString returns the string value for a given key.
210 // if err != nil return defaltval
211 func (c *IniConfigContainer) DefaultString(key string, defaultval string) string {
212 if v := c.String(key); v == "" {
213 return defaultval
214 } else {
215 return v
216 }
217 }
218
154 // Strings returns the []string value for a given key. 219 // Strings returns the []string value for a given key.
155 func (c *IniConfigContainer) Strings(key string) []string { 220 func (c *IniConfigContainer) Strings(key string) []string {
156 return strings.Split(c.String(key), ";") 221 return strings.Split(c.String(key), ";")
157 } 222 }
158 223
224 // DefaultStrings returns the []string value for a given key.
225 // if err != nil return defaltval
226 func (c *IniConfigContainer) DefaultStrings(key string, defaultval []string) []string {
227 if v := c.Strings(key); len(v) == 0 {
228 return defaultval
229 } else {
230 return v
231 }
232 }
233
234 // GetSection returns map for the given section
235 func (c *IniConfigContainer) GetSection(section string) (map[string]string, error) {
236 if v, ok := c.data[section]; ok {
237 return v, nil
238 } else {
239 return nil, errors.New("not exist setction")
240 }
241 }
242
243 // SaveConfigFile save the config into file
244 func (c *IniConfigContainer) SaveConfigFile(filename string) (err error) {
245 // Write configuration file by filename.
246 f, err := os.Create(filename)
247 if err != nil {
248 return err
249 }
250 defer f.Close()
251
252 buf := bytes.NewBuffer(nil)
253 for section, dt := range c.data {
254 // Write section comments.
255 if v, ok := c.sectionComment[section]; ok {
256 if _, err = buf.WriteString(string(bNumComment) + v + lineBreak); err != nil {
257 return err
258 }
259 }
260
261 if section != DEFAULT_SECTION {
262 // Write section name.
263 if _, err = buf.WriteString(string(sectionStart) + section + string(sectionEnd) + lineBreak); err != nil {
264 return err
265 }
266 }
267
268 for key, val := range dt {
269 if key != " " {
270 // Write key comments.
271 if v, ok := c.keyComment[key]; ok {
272 if _, err = buf.WriteString(string(bNumComment) + v + lineBreak); err != nil {
273 return err
274 }
275 }
276
277 // Write key and value.
278 if _, err = buf.WriteString(key + string(bEqual) + val + lineBreak); err != nil {
279 return err
280 }
281 }
282 }
283
284 // Put a line between sections.
285 if _, err = buf.WriteString(lineBreak); err != nil {
286 return err
287 }
288 }
289
290 if _, err = buf.WriteTo(f); err != nil {
291 return err
292 }
293 return nil
294 }
295
159 // WriteValue writes a new value for key. 296 // WriteValue writes a new value for key.
160 // if write to one section, the key need be "section::key". 297 // if write to one section, the key need be "section::key".
161 // if the section is not existed, it panics. 298 // if the section is not existed, it panics.
......
...@@ -12,10 +12,13 @@ package config ...@@ -12,10 +12,13 @@ package config
12 import ( 12 import (
13 "encoding/json" 13 "encoding/json"
14 "errors" 14 "errors"
15 "fmt"
15 "io/ioutil" 16 "io/ioutil"
16 "os" 17 "os"
18 "path"
17 "strings" 19 "strings"
18 "sync" 20 "sync"
21 "time"
19 ) 22 )
20 23
21 // JsonConfig is a json config parser and implements Config interface. 24 // JsonConfig is a json config parser and implements Config interface.
...@@ -48,6 +51,16 @@ func (js *JsonConfig) Parse(filename string) (ConfigContainer, error) { ...@@ -48,6 +51,16 @@ func (js *JsonConfig) Parse(filename string) (ConfigContainer, error) {
48 return x, nil 51 return x, nil
49 } 52 }
50 53
54 func (js *JsonConfig) ParseData(data []byte) (ConfigContainer, error) {
55 // Save memory data to temporary file
56 tmpName := path.Join(os.TempDir(), "beego", fmt.Sprintf("%d", time.Now().Nanosecond()))
57 os.MkdirAll(path.Dir(tmpName), os.ModePerm)
58 if err := ioutil.WriteFile(tmpName, data, 0655); err != nil {
59 return nil, err
60 }
61 return js.Parse(tmpName)
62 }
63
51 // A Config represents the json configuration. 64 // A Config represents the json configuration.
52 // Only when get value, support key as section:name type. 65 // Only when get value, support key as section:name type.
53 type JsonConfigContainer struct { 66 type JsonConfigContainer struct {
...@@ -67,6 +80,16 @@ func (c *JsonConfigContainer) Bool(key string) (bool, error) { ...@@ -67,6 +80,16 @@ func (c *JsonConfigContainer) Bool(key string) (bool, error) {
67 return false, errors.New("not exist key:" + key) 80 return false, errors.New("not exist key:" + key)
68 } 81 }
69 82
83 // DefaultBool return the bool value if has no error
84 // otherwise return the defaultval
85 func (c *JsonConfigContainer) DefaultBool(key string, defaultval bool) bool {
86 if v, err := c.Bool(key); err != nil {
87 return defaultval
88 } else {
89 return v
90 }
91 }
92
70 // Int returns the integer value for a given key. 93 // Int returns the integer value for a given key.
71 func (c *JsonConfigContainer) Int(key string) (int, error) { 94 func (c *JsonConfigContainer) Int(key string) (int, error) {
72 val := c.getData(key) 95 val := c.getData(key)
...@@ -79,6 +102,16 @@ func (c *JsonConfigContainer) Int(key string) (int, error) { ...@@ -79,6 +102,16 @@ func (c *JsonConfigContainer) Int(key string) (int, error) {
79 return 0, errors.New("not exist key:" + key) 102 return 0, errors.New("not exist key:" + key)
80 } 103 }
81 104
105 // DefaultInt returns the integer value for a given key.
106 // if err != nil return defaltval
107 func (c *JsonConfigContainer) DefaultInt(key string, defaultval int) int {
108 if v, err := c.Int(key); err != nil {
109 return defaultval
110 } else {
111 return v
112 }
113 }
114
82 // Int64 returns the int64 value for a given key. 115 // Int64 returns the int64 value for a given key.
83 func (c *JsonConfigContainer) Int64(key string) (int64, error) { 116 func (c *JsonConfigContainer) Int64(key string) (int64, error) {
84 val := c.getData(key) 117 val := c.getData(key)
...@@ -91,6 +124,16 @@ func (c *JsonConfigContainer) Int64(key string) (int64, error) { ...@@ -91,6 +124,16 @@ func (c *JsonConfigContainer) Int64(key string) (int64, error) {
91 return 0, errors.New("not exist key:" + key) 124 return 0, errors.New("not exist key:" + key)
92 } 125 }
93 126
127 // DefaultInt64 returns the int64 value for a given key.
128 // if err != nil return defaltval
129 func (c *JsonConfigContainer) DefaultInt64(key string, defaultval int64) int64 {
130 if v, err := c.Int64(key); err != nil {
131 return defaultval
132 } else {
133 return v
134 }
135 }
136
94 // Float returns the float value for a given key. 137 // Float returns the float value for a given key.
95 func (c *JsonConfigContainer) Float(key string) (float64, error) { 138 func (c *JsonConfigContainer) Float(key string) (float64, error) {
96 val := c.getData(key) 139 val := c.getData(key)
...@@ -103,6 +146,16 @@ func (c *JsonConfigContainer) Float(key string) (float64, error) { ...@@ -103,6 +146,16 @@ func (c *JsonConfigContainer) Float(key string) (float64, error) {
103 return 0.0, errors.New("not exist key:" + key) 146 return 0.0, errors.New("not exist key:" + key)
104 } 147 }
105 148
149 // DefaultFloat returns the float64 value for a given key.
150 // if err != nil return defaltval
151 func (c *JsonConfigContainer) DefaultFloat(key string, defaultval float64) float64 {
152 if v, err := c.Float(key); err != nil {
153 return defaultval
154 } else {
155 return v
156 }
157 }
158
106 // String returns the string value for a given key. 159 // String returns the string value for a given key.
107 func (c *JsonConfigContainer) String(key string) string { 160 func (c *JsonConfigContainer) String(key string) string {
108 val := c.getData(key) 161 val := c.getData(key)
...@@ -114,11 +167,56 @@ func (c *JsonConfigContainer) String(key string) string { ...@@ -114,11 +167,56 @@ func (c *JsonConfigContainer) String(key string) string {
114 return "" 167 return ""
115 } 168 }
116 169
170 // DefaultString returns the string value for a given key.
171 // if err != nil return defaltval
172 func (c *JsonConfigContainer) DefaultString(key string, defaultval string) string {
173 if v := c.String(key); v == "" {
174 return defaultval
175 } else {
176 return v
177 }
178 }
179
117 // Strings returns the []string value for a given key. 180 // Strings returns the []string value for a given key.
118 func (c *JsonConfigContainer) Strings(key string) []string { 181 func (c *JsonConfigContainer) Strings(key string) []string {
119 return strings.Split(c.String(key), ";") 182 return strings.Split(c.String(key), ";")
120 } 183 }
121 184
185 // DefaultStrings returns the []string value for a given key.
186 // if err != nil return defaltval
187 func (c *JsonConfigContainer) DefaultStrings(key string, defaultval []string) []string {
188 if v := c.Strings(key); len(v) == 0 {
189 return defaultval
190 } else {
191 return v
192 }
193 }
194
195 // GetSection returns map for the given section
196 func (c *JsonConfigContainer) GetSection(section string) (map[string]string, error) {
197 if v, ok := c.data[section]; ok {
198 return v.(map[string]string), nil
199 } else {
200 return nil, errors.New("not exist setction")
201 }
202 }
203
204 // SaveConfigFile save the config into file
205 func (c *JsonConfigContainer) SaveConfigFile(filename string) (err error) {
206 // Write configuration file by filename.
207 f, err := os.Create(filename)
208 if err != nil {
209 return err
210 }
211 defer f.Close()
212 b, err := json.MarshalIndent(c.data, "", " ")
213 if err != nil {
214 return err
215 }
216 _, err = f.Write(b)
217 return err
218 }
219
122 // WriteValue writes a new value for key. 220 // WriteValue writes a new value for key.
123 func (c *JsonConfigContainer) Set(key, val string) error { 221 func (c *JsonConfigContainer) Set(key, val string) error {
124 c.Lock() 222 c.Lock()
......
...@@ -10,12 +10,16 @@ ...@@ -10,12 +10,16 @@
10 package xml 10 package xml
11 11
12 import ( 12 import (
13 "encoding/xml"
13 "errors" 14 "errors"
15 "fmt"
14 "io/ioutil" 16 "io/ioutil"
15 "os" 17 "os"
18 "path"
16 "strconv" 19 "strconv"
17 "strings" 20 "strings"
18 "sync" 21 "sync"
22 "time"
19 23
20 "github.com/astaxie/beego/config" 24 "github.com/astaxie/beego/config"
21 "github.com/beego/x2j" 25 "github.com/beego/x2j"
...@@ -49,6 +53,16 @@ func (xc *XMLConfig) Parse(filename string) (config.ConfigContainer, error) { ...@@ -49,6 +53,16 @@ func (xc *XMLConfig) Parse(filename string) (config.ConfigContainer, error) {
49 return x, nil 53 return x, nil
50 } 54 }
51 55
56 func (x *XMLConfig) ParseData(data []byte) (config.ConfigContainer, error) {
57 // Save memory data to temporary file
58 tmpName := path.Join(os.TempDir(), "beego", fmt.Sprintf("%d", time.Now().Nanosecond()))
59 os.MkdirAll(path.Dir(tmpName), os.ModePerm)
60 if err := ioutil.WriteFile(tmpName, data, 0655); err != nil {
61 return nil, err
62 }
63 return x.Parse(tmpName)
64 }
65
52 // A Config represents the xml configuration. 66 // A Config represents the xml configuration.
53 type XMLConfigContainer struct { 67 type XMLConfigContainer struct {
54 data map[string]interface{} 68 data map[string]interface{}
...@@ -60,21 +74,61 @@ func (c *XMLConfigContainer) Bool(key string) (bool, error) { ...@@ -60,21 +74,61 @@ func (c *XMLConfigContainer) Bool(key string) (bool, error) {
60 return strconv.ParseBool(c.data[key].(string)) 74 return strconv.ParseBool(c.data[key].(string))
61 } 75 }
62 76
77 // DefaultBool return the bool value if has no error
78 // otherwise return the defaultval
79 func (c *XMLConfigContainer) DefaultBool(key string, defaultval bool) bool {
80 if v, err := c.Bool(key); err != nil {
81 return defaultval
82 } else {
83 return v
84 }
85 }
86
63 // Int returns the integer value for a given key. 87 // Int returns the integer value for a given key.
64 func (c *XMLConfigContainer) Int(key string) (int, error) { 88 func (c *XMLConfigContainer) Int(key string) (int, error) {
65 return strconv.Atoi(c.data[key].(string)) 89 return strconv.Atoi(c.data[key].(string))
66 } 90 }
67 91
92 // DefaultInt returns the integer value for a given key.
93 // if err != nil return defaltval
94 func (c *XMLConfigContainer) DefaultInt(key string, defaultval int) int {
95 if v, err := c.Int(key); err != nil {
96 return defaultval
97 } else {
98 return v
99 }
100 }
101
68 // Int64 returns the int64 value for a given key. 102 // Int64 returns the int64 value for a given key.
69 func (c *XMLConfigContainer) Int64(key string) (int64, error) { 103 func (c *XMLConfigContainer) Int64(key string) (int64, error) {
70 return strconv.ParseInt(c.data[key].(string), 10, 64) 104 return strconv.ParseInt(c.data[key].(string), 10, 64)
71 } 105 }
72 106
107 // DefaultInt64 returns the int64 value for a given key.
108 // if err != nil return defaltval
109 func (c *XMLConfigContainer) DefaultInt64(key string, defaultval int64) int64 {
110 if v, err := c.Int64(key); err != nil {
111 return defaultval
112 } else {
113 return v
114 }
115 }
116
73 // Float returns the float value for a given key. 117 // Float returns the float value for a given key.
74 func (c *XMLConfigContainer) Float(key string) (float64, error) { 118 func (c *XMLConfigContainer) Float(key string) (float64, error) {
75 return strconv.ParseFloat(c.data[key].(string), 64) 119 return strconv.ParseFloat(c.data[key].(string), 64)
76 } 120 }
77 121
122 // DefaultFloat returns the float64 value for a given key.
123 // if err != nil return defaltval
124 func (c *XMLConfigContainer) DefaultFloat(key string, defaultval float64) float64 {
125 if v, err := c.Float(key); err != nil {
126 return defaultval
127 } else {
128 return v
129 }
130 }
131
78 // String returns the string value for a given key. 132 // String returns the string value for a given key.
79 func (c *XMLConfigContainer) String(key string) string { 133 func (c *XMLConfigContainer) String(key string) string {
80 if v, ok := c.data[key].(string); ok { 134 if v, ok := c.data[key].(string); ok {
...@@ -83,11 +137,56 @@ func (c *XMLConfigContainer) String(key string) string { ...@@ -83,11 +137,56 @@ func (c *XMLConfigContainer) String(key string) string {
83 return "" 137 return ""
84 } 138 }
85 139
140 // DefaultString returns the string value for a given key.
141 // if err != nil return defaltval
142 func (c *XMLConfigContainer) DefaultString(key string, defaultval string) string {
143 if v := c.String(key); v == "" {
144 return defaultval
145 } else {
146 return v
147 }
148 }
149
86 // Strings returns the []string value for a given key. 150 // Strings returns the []string value for a given key.
87 func (c *XMLConfigContainer) Strings(key string) []string { 151 func (c *XMLConfigContainer) Strings(key string) []string {
88 return strings.Split(c.String(key), ";") 152 return strings.Split(c.String(key), ";")
89 } 153 }
90 154
155 // DefaultStrings returns the []string value for a given key.
156 // if err != nil return defaltval
157 func (c *XMLConfigContainer) DefaultStrings(key string, defaultval []string) []string {
158 if v := c.Strings(key); len(v) == 0 {
159 return defaultval
160 } else {
161 return v
162 }
163 }
164
165 // GetSection returns map for the given section
166 func (c *XMLConfigContainer) GetSection(section string) (map[string]string, error) {
167 if v, ok := c.data[section]; ok {
168 return v.(map[string]string), nil
169 } else {
170 return nil, errors.New("not exist setction")
171 }
172 }
173
174 // SaveConfigFile save the config into file
175 func (c *XMLConfigContainer) SaveConfigFile(filename string) (err error) {
176 // Write configuration file by filename.
177 f, err := os.Create(filename)
178 if err != nil {
179 return err
180 }
181 defer f.Close()
182 b, err := xml.MarshalIndent(c.data, " ", " ")
183 if err != nil {
184 return err
185 }
186 _, err = f.Write(b)
187 return err
188 }
189
91 // WriteValue writes a new value for key. 190 // WriteValue writes a new value for key.
92 func (c *XMLConfigContainer) Set(key, val string) error { 191 func (c *XMLConfigContainer) Set(key, val string) error {
93 c.Lock() 192 c.Lock()
......
...@@ -13,11 +13,14 @@ import ( ...@@ -13,11 +13,14 @@ import (
13 "bytes" 13 "bytes"
14 "encoding/json" 14 "encoding/json"
15 "errors" 15 "errors"
16 "fmt"
16 "io/ioutil" 17 "io/ioutil"
17 "log" 18 "log"
18 "os" 19 "os"
20 "path"
19 "strings" 21 "strings"
20 "sync" 22 "sync"
23 "time"
21 24
22 "github.com/astaxie/beego/config" 25 "github.com/astaxie/beego/config"
23 "github.com/beego/goyaml2" 26 "github.com/beego/goyaml2"
...@@ -38,6 +41,16 @@ func (yaml *YAMLConfig) Parse(filename string) (y config.ConfigContainer, err er ...@@ -38,6 +41,16 @@ func (yaml *YAMLConfig) Parse(filename string) (y config.ConfigContainer, err er
38 return 41 return
39 } 42 }
40 43
44 func (yaml *YAMLConfig) ParseData(data []byte) (config.ConfigContainer, error) {
45 // Save memory data to temporary file
46 tmpName := path.Join(os.TempDir(), "beego", fmt.Sprintf("%d", time.Now().Nanosecond()))
47 os.MkdirAll(path.Dir(tmpName), os.ModePerm)
48 if err := ioutil.WriteFile(tmpName, data, 0655); err != nil {
49 return nil, err
50 }
51 return yaml.Parse(tmpName)
52 }
53
41 // Read yaml file to map. 54 // Read yaml file to map.
42 // if json like, use json package, unless goyaml2 package. 55 // if json like, use json package, unless goyaml2 package.
43 func ReadYmlReader(path string) (cnf map[string]interface{}, err error) { 56 func ReadYmlReader(path string) (cnf map[string]interface{}, err error) {
...@@ -93,6 +106,16 @@ func (c *YAMLConfigContainer) Bool(key string) (bool, error) { ...@@ -93,6 +106,16 @@ func (c *YAMLConfigContainer) Bool(key string) (bool, error) {
93 return false, errors.New("not bool value") 106 return false, errors.New("not bool value")
94 } 107 }
95 108
109 // DefaultBool return the bool value if has no error
110 // otherwise return the defaultval
111 func (c *YAMLConfigContainer) DefaultBool(key string, defaultval bool) bool {
112 if v, err := c.Bool(key); err != nil {
113 return defaultval
114 } else {
115 return v
116 }
117 }
118
96 // Int returns the integer value for a given key. 119 // Int returns the integer value for a given key.
97 func (c *YAMLConfigContainer) Int(key string) (int, error) { 120 func (c *YAMLConfigContainer) Int(key string) (int, error) {
98 if v, ok := c.data[key].(int64); ok { 121 if v, ok := c.data[key].(int64); ok {
...@@ -101,6 +124,16 @@ func (c *YAMLConfigContainer) Int(key string) (int, error) { ...@@ -101,6 +124,16 @@ func (c *YAMLConfigContainer) Int(key string) (int, error) {
101 return 0, errors.New("not int value") 124 return 0, errors.New("not int value")
102 } 125 }
103 126
127 // DefaultInt returns the integer value for a given key.
128 // if err != nil return defaltval
129 func (c *YAMLConfigContainer) DefaultInt(key string, defaultval int) int {
130 if v, err := c.Int(key); err != nil {
131 return defaultval
132 } else {
133 return v
134 }
135 }
136
104 // Int64 returns the int64 value for a given key. 137 // Int64 returns the int64 value for a given key.
105 func (c *YAMLConfigContainer) Int64(key string) (int64, error) { 138 func (c *YAMLConfigContainer) Int64(key string) (int64, error) {
106 if v, ok := c.data[key].(int64); ok { 139 if v, ok := c.data[key].(int64); ok {
...@@ -109,6 +142,16 @@ func (c *YAMLConfigContainer) Int64(key string) (int64, error) { ...@@ -109,6 +142,16 @@ func (c *YAMLConfigContainer) Int64(key string) (int64, error) {
109 return 0, errors.New("not bool value") 142 return 0, errors.New("not bool value")
110 } 143 }
111 144
145 // DefaultInt64 returns the int64 value for a given key.
146 // if err != nil return defaltval
147 func (c *YAMLConfigContainer) DefaultInt64(key string, defaultval int64) int64 {
148 if v, err := c.Int64(key); err != nil {
149 return defaultval
150 } else {
151 return v
152 }
153 }
154
112 // Float returns the float value for a given key. 155 // Float returns the float value for a given key.
113 func (c *YAMLConfigContainer) Float(key string) (float64, error) { 156 func (c *YAMLConfigContainer) Float(key string) (float64, error) {
114 if v, ok := c.data[key].(float64); ok { 157 if v, ok := c.data[key].(float64); ok {
...@@ -117,6 +160,16 @@ func (c *YAMLConfigContainer) Float(key string) (float64, error) { ...@@ -117,6 +160,16 @@ func (c *YAMLConfigContainer) Float(key string) (float64, error) {
117 return 0.0, errors.New("not float64 value") 160 return 0.0, errors.New("not float64 value")
118 } 161 }
119 162
163 // DefaultFloat returns the float64 value for a given key.
164 // if err != nil return defaltval
165 func (c *YAMLConfigContainer) DefaultFloat(key string, defaultval float64) float64 {
166 if v, err := c.Float(key); err != nil {
167 return defaultval
168 } else {
169 return v
170 }
171 }
172
120 // String returns the string value for a given key. 173 // String returns the string value for a given key.
121 func (c *YAMLConfigContainer) String(key string) string { 174 func (c *YAMLConfigContainer) String(key string) string {
122 if v, ok := c.data[key].(string); ok { 175 if v, ok := c.data[key].(string); ok {
...@@ -125,11 +178,52 @@ func (c *YAMLConfigContainer) String(key string) string { ...@@ -125,11 +178,52 @@ func (c *YAMLConfigContainer) String(key string) string {
125 return "" 178 return ""
126 } 179 }
127 180
181 // DefaultString returns the string value for a given key.
182 // if err != nil return defaltval
183 func (c *YAMLConfigContainer) DefaultString(key string, defaultval string) string {
184 if v := c.String(key); v == "" {
185 return defaultval
186 } else {
187 return v
188 }
189 }
190
128 // Strings returns the []string value for a given key. 191 // Strings returns the []string value for a given key.
129 func (c *YAMLConfigContainer) Strings(key string) []string { 192 func (c *YAMLConfigContainer) Strings(key string) []string {
130 return strings.Split(c.String(key), ";") 193 return strings.Split(c.String(key), ";")
131 } 194 }
132 195
196 // DefaultStrings returns the []string value for a given key.
197 // if err != nil return defaltval
198 func (c *YAMLConfigContainer) DefaultStrings(key string, defaultval []string) []string {
199 if v := c.Strings(key); len(v) == 0 {
200 return defaultval
201 } else {
202 return v
203 }
204 }
205
206 // GetSection returns map for the given section
207 func (c *YAMLConfigContainer) GetSection(section string) (map[string]string, error) {
208 if v, ok := c.data[section]; ok {
209 return v.(map[string]string), nil
210 } else {
211 return nil, errors.New("not exist setction")
212 }
213 }
214
215 // SaveConfigFile save the config into file
216 func (c *YAMLConfigContainer) SaveConfigFile(filename string) (err error) {
217 // Write configuration file by filename.
218 f, err := os.Create(filename)
219 if err != nil {
220 return err
221 }
222 defer f.Close()
223 err = goyaml2.Write(f, c.data)
224 return err
225 }
226
133 // WriteValue writes a new value for key. 227 // WriteValue writes a new value for key.
134 func (c *YAMLConfigContainer) Set(key, val string) error { 228 func (c *YAMLConfigContainer) Set(key, val string) error {
135 c.Lock() 229 c.Lock()
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!