package cache
|
|
|
|
import (
|
|
"errors"
|
|
"net/url"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
// ds : dataSource: schema://username:password@host:port/db?options
|
|
|
|
func NewCache(ds string) (Cache, error) {
|
|
u,e := url.Parse(ds)
|
|
if nil != e {
|
|
return nil, e
|
|
}
|
|
switch u.Scheme {
|
|
case "redis":
|
|
var pass string
|
|
var db int64
|
|
var port uint = 6379
|
|
var enabled = true
|
|
if u.User != nil {
|
|
pass = u.User.Username()
|
|
if p, t := u.User.Password(); t {
|
|
pass = p
|
|
}
|
|
}
|
|
if u.Port() != "" {
|
|
if p, e := strconv.ParseUint(u.Port(), 10, 32); nil == e {
|
|
port = uint(p)
|
|
}
|
|
}
|
|
ps := strings.TrimLeft(u.Path, "/")
|
|
if ps != "" {
|
|
if d, e := strconv.ParseInt(ps, 10, 64); nil == e {
|
|
db = d
|
|
}
|
|
}
|
|
en := strings.ToLower(u.Query().Get("enabled"))
|
|
if en == "f" || en == "false" || en == "no" {
|
|
enabled = false
|
|
}
|
|
return new_redis_cache(u.Hostname(), port, db, pass, enabled)
|
|
default:
|
|
return nil, errors.New("Unsupported engine type: "+u.Scheme)
|
|
|
|
}
|
|
return nil, nil
|
|
}
|