mirror of
https://github.com/astaxie/beego.git
synced 2024-11-25 22:21:28 +00:00
Merge branches 'master' and 'develop' of https://github.com/astaxie/beego into develop
This commit is contained in:
commit
a05e5a7c09
4
.gosimpleignore
Normal file
4
.gosimpleignore
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
github.com/astaxie/beego/*/*:S1012
|
||||||
|
github.com/astaxie/beego/*:S1012
|
||||||
|
github.com/astaxie/beego/*/*:S1007
|
||||||
|
github.com/astaxie/beego/*:S1007
|
@ -2,8 +2,8 @@ language: go
|
|||||||
|
|
||||||
go:
|
go:
|
||||||
- 1.6
|
- 1.6
|
||||||
- 1.5.3
|
- 1.7
|
||||||
- 1.4.3
|
- 1.8
|
||||||
services:
|
services:
|
||||||
- redis-server
|
- redis-server
|
||||||
- mysql
|
- mysql
|
||||||
@ -33,6 +33,8 @@ install:
|
|||||||
- go get github.com/ssdb/gossdb/ssdb
|
- go get github.com/ssdb/gossdb/ssdb
|
||||||
- go get github.com/cloudflare/golz4
|
- go get github.com/cloudflare/golz4
|
||||||
- go get github.com/gogo/protobuf/proto
|
- go get github.com/gogo/protobuf/proto
|
||||||
|
- go get -u honnef.co/go/tools/cmd/gosimple
|
||||||
|
- go get -u github.com/mdempsky/unconvert
|
||||||
before_script:
|
before_script:
|
||||||
- psql --version
|
- psql --version
|
||||||
- sh -c "if [ '$ORM_DRIVER' = 'postgres' ]; then psql -c 'create database orm_test;' -U postgres; fi"
|
- sh -c "if [ '$ORM_DRIVER' = 'postgres' ]; then psql -c 'create database orm_test;' -U postgres; fi"
|
||||||
@ -47,5 +49,7 @@ after_script:
|
|||||||
- rm -rf ./res/var/*
|
- rm -rf ./res/var/*
|
||||||
script:
|
script:
|
||||||
- go test -v ./...
|
- go test -v ./...
|
||||||
|
- gosimple -ignore "$(cat .gosimpleignore)" $(go list ./... | grep -v /vendor/)
|
||||||
|
- unconvert $(go list ./... | grep -v /vendor/)
|
||||||
addons:
|
addons:
|
||||||
postgresql: "9.4"
|
postgresql: "9.4"
|
||||||
|
22
admin.go
22
admin.go
@ -157,8 +157,8 @@ func listConf(rw http.ResponseWriter, r *http.Request) {
|
|||||||
resultList := new([][]string)
|
resultList := new([][]string)
|
||||||
for _, f := range bf {
|
for _, f := range bf {
|
||||||
var result = []string{
|
var result = []string{
|
||||||
fmt.Sprintf("%s", f.pattern),
|
f.pattern,
|
||||||
fmt.Sprintf("%s", utils.GetFuncName(f.filterFunc)),
|
utils.GetFuncName(f.filterFunc),
|
||||||
}
|
}
|
||||||
*resultList = append(*resultList, result)
|
*resultList = append(*resultList, result)
|
||||||
}
|
}
|
||||||
@ -213,7 +213,7 @@ func printTree(resultList *[][]string, t *Tree) {
|
|||||||
var result = []string{
|
var result = []string{
|
||||||
v.pattern,
|
v.pattern,
|
||||||
fmt.Sprintf("%s", v.methods),
|
fmt.Sprintf("%s", v.methods),
|
||||||
fmt.Sprintf("%s", v.controllerType),
|
v.controllerType.String(),
|
||||||
}
|
}
|
||||||
*resultList = append(*resultList, result)
|
*resultList = append(*resultList, result)
|
||||||
} else if v.routerType == routerTypeRESTFul {
|
} else if v.routerType == routerTypeRESTFul {
|
||||||
@ -287,16 +287,16 @@ func healthcheck(rw http.ResponseWriter, req *http.Request) {
|
|||||||
for name, h := range toolbox.AdminCheckList {
|
for name, h := range toolbox.AdminCheckList {
|
||||||
if err := h.Check(); err != nil {
|
if err := h.Check(); err != nil {
|
||||||
result = []string{
|
result = []string{
|
||||||
fmt.Sprintf("error"),
|
"error",
|
||||||
fmt.Sprintf("%s", name),
|
name,
|
||||||
fmt.Sprintf("%s", err.Error()),
|
err.Error(),
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
result = []string{
|
result = []string{
|
||||||
fmt.Sprintf("success"),
|
"success",
|
||||||
fmt.Sprintf("%s", name),
|
name,
|
||||||
fmt.Sprintf("OK"),
|
"OK",
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -341,8 +341,8 @@ func taskStatus(rw http.ResponseWriter, req *http.Request) {
|
|||||||
for tname, tk := range toolbox.AdminTaskList {
|
for tname, tk := range toolbox.AdminTaskList {
|
||||||
result = []string{
|
result = []string{
|
||||||
tname,
|
tname,
|
||||||
fmt.Sprintf("%s", tk.GetSpec()),
|
tk.GetSpec(),
|
||||||
fmt.Sprintf("%s", tk.GetStatus()),
|
tk.GetStatus(),
|
||||||
tk.GetPrev().String(),
|
tk.GetPrev().String(),
|
||||||
}
|
}
|
||||||
*resultList = append(*resultList, result)
|
*resultList = append(*resultList, result)
|
||||||
|
6
cache/conv_test.go
vendored
6
cache/conv_test.go
vendored
@ -118,14 +118,14 @@ func TestGetFloat64(t *testing.T) {
|
|||||||
|
|
||||||
func TestGetBool(t *testing.T) {
|
func TestGetBool(t *testing.T) {
|
||||||
var t1 = true
|
var t1 = true
|
||||||
if true != GetBool(t1) {
|
if !GetBool(t1) {
|
||||||
t.Error("get bool from bool error")
|
t.Error("get bool from bool error")
|
||||||
}
|
}
|
||||||
var t2 = "true"
|
var t2 = "true"
|
||||||
if true != GetBool(t2) {
|
if !GetBool(t2) {
|
||||||
t.Error("get bool from string error")
|
t.Error("get bool from string error")
|
||||||
}
|
}
|
||||||
if false != GetBool(nil) {
|
if GetBool(nil) {
|
||||||
t.Error("get bool from nil error")
|
t.Error("get bool from nil error")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
5
cache/memcache/memcache.go
vendored
5
cache/memcache/memcache.go
vendored
@ -146,10 +146,7 @@ func (rc *Cache) IsExist(key string) bool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
_, err := rc.conn.Get(key)
|
_, err := rc.conn.Get(key)
|
||||||
if err != nil {
|
return !(err != nil)
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ClearAll clear all cached in memcache.
|
// ClearAll clear all cached in memcache.
|
||||||
|
2
cache/redis/redis.go
vendored
2
cache/redis/redis.go
vendored
@ -137,7 +137,7 @@ func (rc *Cache) IsExist(key string) bool {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if v == false {
|
if !v {
|
||||||
if _, err = rc.do("HDEL", rc.key, key); err != nil {
|
if _, err = rc.do("HDEL", rc.key, key); err != nil {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
19
cache/ssdb/ssdb.go
vendored
19
cache/ssdb/ssdb.go
vendored
@ -53,7 +53,7 @@ func (rc *Cache) GetMulti(keys []string) []interface{} {
|
|||||||
resSize := len(res)
|
resSize := len(res)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
for i := 1; i < resSize; i += 2 {
|
for i := 1; i < resSize; i += 2 {
|
||||||
values = append(values, string(res[i+1]))
|
values = append(values, res[i+1])
|
||||||
}
|
}
|
||||||
return values
|
return values
|
||||||
}
|
}
|
||||||
@ -71,10 +71,7 @@ func (rc *Cache) DelMulti(keys []string) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
_, err := rc.conn.Do("multi_del", keys)
|
_, err := rc.conn.Do("multi_del", keys)
|
||||||
if err != nil {
|
return err
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Put put value to memcache. only support string.
|
// Put put value to memcache. only support string.
|
||||||
@ -113,10 +110,7 @@ func (rc *Cache) Delete(key string) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
_, err := rc.conn.Del(key)
|
_, err := rc.conn.Del(key)
|
||||||
if err != nil {
|
return err
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Incr increase counter.
|
// Incr increase counter.
|
||||||
@ -175,7 +169,7 @@ func (rc *Cache) ClearAll() error {
|
|||||||
}
|
}
|
||||||
keys := []string{}
|
keys := []string{}
|
||||||
for i := 1; i < size; i += 2 {
|
for i := 1; i < size; i += 2 {
|
||||||
keys = append(keys, string(resp[i]))
|
keys = append(keys, resp[i])
|
||||||
}
|
}
|
||||||
_, e := rc.conn.Do("multi_del", keys)
|
_, e := rc.conn.Do("multi_del", keys)
|
||||||
if e != nil {
|
if e != nil {
|
||||||
@ -229,10 +223,7 @@ func (rc *Cache) connectInit() error {
|
|||||||
}
|
}
|
||||||
var err error
|
var err error
|
||||||
rc.conn, err = ssdb.Connect(host, port)
|
rc.conn, err = ssdb.Connect(host, port)
|
||||||
if err != nil {
|
return err
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -345,7 +345,7 @@ func assignSingleConfig(p interface{}, ac config.Configer) {
|
|||||||
case reflect.String:
|
case reflect.String:
|
||||||
pf.SetString(ac.DefaultString(name, pf.String()))
|
pf.SetString(ac.DefaultString(name, pf.String()))
|
||||||
case reflect.Int, reflect.Int64:
|
case reflect.Int, reflect.Int64:
|
||||||
pf.SetInt(int64(ac.DefaultInt64(name, pf.Int())))
|
pf.SetInt(ac.DefaultInt64(name, pf.Int()))
|
||||||
case reflect.Bool:
|
case reflect.Bool:
|
||||||
pf.SetBool(ac.DefaultBool(name, pf.Bool()))
|
pf.SetBool(ac.DefaultBool(name, pf.Bool()))
|
||||||
case reflect.Struct:
|
case reflect.Struct:
|
||||||
|
@ -397,11 +397,8 @@ func (c *IniConfigContainer) SaveConfigFile(filename string) (err error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
_, err = buf.WriteTo(f)
|
||||||
if _, err = buf.WriteTo(f); err != nil {
|
return err
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set writes a new value for key.
|
// Set writes a new value for key.
|
||||||
|
@ -181,7 +181,7 @@ name=mysql
|
|||||||
cfgData := string(data)
|
cfgData := string(data)
|
||||||
datas := strings.Split(saveResult, "\n")
|
datas := strings.Split(saveResult, "\n")
|
||||||
for _, line := range datas {
|
for _, line := range datas {
|
||||||
if strings.Contains(cfgData, line+"\n") == false {
|
if !strings.Contains(cfgData, line+"\n") {
|
||||||
t.Fatalf("different after save ini config file. need contains %q", line)
|
t.Fatalf("different after save ini config file. need contains %q", line)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -105,7 +105,7 @@ func (output *BeegoOutput) Cookie(name string, value string, others ...interface
|
|||||||
switch {
|
switch {
|
||||||
case maxAge > 0:
|
case maxAge > 0:
|
||||||
fmt.Fprintf(&b, "; Expires=%s; Max-Age=%d", time.Now().Add(time.Duration(maxAge)*time.Second).UTC().Format(time.RFC1123), maxAge)
|
fmt.Fprintf(&b, "; Expires=%s; Max-Age=%d", time.Now().Add(time.Duration(maxAge)*time.Second).UTC().Format(time.RFC1123), maxAge)
|
||||||
case maxAge < 0:
|
case maxAge <= 0:
|
||||||
fmt.Fprintf(&b, "; Max-Age=0")
|
fmt.Fprintf(&b, "; Max-Age=0")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -223,7 +223,7 @@ func (c *Controller) RenderBytes() ([]byte, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
buf.Reset()
|
buf.Reset()
|
||||||
ExecuteViewPathTemplate(&buf, c.Layout, c.viewPath() ,c.Data)
|
ExecuteViewPathTemplate(&buf, c.Layout, c.viewPath(), c.Data)
|
||||||
}
|
}
|
||||||
return buf.Bytes(), err
|
return buf.Bytes(), err
|
||||||
}
|
}
|
||||||
@ -249,7 +249,7 @@ func (c *Controller) renderTemplate() (bytes.Buffer, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
BuildTemplate(c.viewPath() , buildFiles...)
|
BuildTemplate(c.viewPath(), buildFiles...)
|
||||||
}
|
}
|
||||||
return buf, ExecuteViewPathTemplate(&buf, c.TplName, c.viewPath(), c.Data)
|
return buf, ExecuteViewPathTemplate(&buf, c.TplName, c.viewPath(), c.Data)
|
||||||
}
|
}
|
||||||
@ -314,7 +314,7 @@ func (c *Controller) ServeJSON(encoding ...bool) {
|
|||||||
if BConfig.RunMode == PROD {
|
if BConfig.RunMode == PROD {
|
||||||
hasIndent = false
|
hasIndent = false
|
||||||
}
|
}
|
||||||
if len(encoding) > 0 && encoding[0] == true {
|
if len(encoding) > 0 && encoding[0] {
|
||||||
hasEncoding = true
|
hasEncoding = true
|
||||||
}
|
}
|
||||||
c.Ctx.Output.JSON(c.Data["json"], hasIndent, hasEncoding)
|
c.Ctx.Output.JSON(c.Data["json"], hasIndent, hasEncoding)
|
||||||
|
@ -48,7 +48,7 @@ func TestFlashHeader(t *testing.T) {
|
|||||||
// match for the expected header
|
// match for the expected header
|
||||||
res := strings.Contains(sc, "BEEGO_FLASH=%00notice%23BEEGOFLASH%23TestFlashString%00")
|
res := strings.Contains(sc, "BEEGO_FLASH=%00notice%23BEEGOFLASH%23TestFlashString%00")
|
||||||
// validate the assertion
|
// validate the assertion
|
||||||
if res != true {
|
if !res {
|
||||||
t.Errorf("TestFlashHeader() unable to validate flash message")
|
t.Errorf("TestFlashHeader() unable to validate flash message")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@ func newGraceListener(l net.Listener, srv *Server) (el *graceListener) {
|
|||||||
server: srv,
|
server: srv,
|
||||||
}
|
}
|
||||||
go func() {
|
go func() {
|
||||||
_ = <-el.stop
|
<-el.stop
|
||||||
el.stopped = true
|
el.stopped = true
|
||||||
el.stop <- el.Listener.Close()
|
el.stop <- el.Listener.Close()
|
||||||
}()
|
}()
|
||||||
|
@ -335,7 +335,7 @@ func (b *BeegoHTTPRequest) JSONBody(obj interface{}) (*BeegoHTTPRequest, error)
|
|||||||
func (b *BeegoHTTPRequest) buildURL(paramBody string) {
|
func (b *BeegoHTTPRequest) buildURL(paramBody string) {
|
||||||
// build GET url with query string
|
// build GET url with query string
|
||||||
if b.req.Method == "GET" && len(paramBody) > 0 {
|
if b.req.Method == "GET" && len(paramBody) > 0 {
|
||||||
if strings.Index(b.url, "?") != -1 {
|
if strings.Contains(b.url, "?") {
|
||||||
b.url += "&" + paramBody
|
b.url += "&" + paramBody
|
||||||
} else {
|
} else {
|
||||||
b.url = b.url + "?" + paramBody
|
b.url = b.url + "?" + paramBody
|
||||||
|
@ -395,7 +395,7 @@ func sovLog(x uint64) (n int) {
|
|||||||
return n
|
return n
|
||||||
}
|
}
|
||||||
func sozLog(x uint64) (n int) {
|
func sozLog(x uint64) (n int) {
|
||||||
return sovLog(uint64((x << 1) ^ uint64((int64(x) >> 63))))
|
return sovLog((x << 1) ^ (x >> 63))
|
||||||
}
|
}
|
||||||
func (m *Log) Unmarshal(data []byte) error {
|
func (m *Log) Unmarshal(data []byte) error {
|
||||||
var hasFields [1]uint64
|
var hasFields [1]uint64
|
||||||
|
14
logs/file.go
14
logs/file.go
@ -193,16 +193,14 @@ func (w *fileLogWriter) dailyRotate(openTime time.Time) {
|
|||||||
y, m, d := openTime.Add(24 * time.Hour).Date()
|
y, m, d := openTime.Add(24 * time.Hour).Date()
|
||||||
nextDay := time.Date(y, m, d, 0, 0, 0, 0, openTime.Location())
|
nextDay := time.Date(y, m, d, 0, 0, 0, 0, openTime.Location())
|
||||||
tm := time.NewTimer(time.Duration(nextDay.UnixNano() - openTime.UnixNano() + 100))
|
tm := time.NewTimer(time.Duration(nextDay.UnixNano() - openTime.UnixNano() + 100))
|
||||||
select {
|
<-tm.C
|
||||||
case <-tm.C:
|
w.Lock()
|
||||||
w.Lock()
|
if w.needRotate(0, time.Now().Day()) {
|
||||||
if w.needRotate(0, time.Now().Day()) {
|
if err := w.doRotate(time.Now()); err != nil {
|
||||||
if err := w.doRotate(time.Now()); err != nil {
|
fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.Filename, err)
|
||||||
fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.Filename, err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
w.Unlock()
|
|
||||||
}
|
}
|
||||||
|
w.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *fileLogWriter) lines() (int, error) {
|
func (w *fileLogWriter) lines() (int, error) {
|
||||||
|
@ -25,11 +25,7 @@ func newJLWriter() Logger {
|
|||||||
|
|
||||||
// Init JLWriter with json config string
|
// Init JLWriter with json config string
|
||||||
func (s *JLWriter) Init(jsonconfig string) error {
|
func (s *JLWriter) Init(jsonconfig string) error {
|
||||||
err := json.Unmarshal([]byte(jsonconfig), s)
|
return json.Unmarshal([]byte(jsonconfig), s)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// WriteMsg write message in smtp writer.
|
// WriteMsg write message in smtp writer.
|
||||||
|
@ -275,7 +275,7 @@ func (bl *BeeLogger) writeMsg(logLevel int, msg string, v ...interface{}) error
|
|||||||
line = 0
|
line = 0
|
||||||
}
|
}
|
||||||
_, filename := path.Split(file)
|
_, filename := path.Split(file)
|
||||||
msg = "[" + filename + ":" + strconv.FormatInt(int64(line), 10) + "] " + msg
|
msg = "[" + filename + ":" + strconv.Itoa(line) + "] " + msg
|
||||||
}
|
}
|
||||||
|
|
||||||
//set level info in front of filename info
|
//set level info in front of filename info
|
||||||
@ -561,11 +561,7 @@ func SetLogFuncCallDepth(d int) {
|
|||||||
|
|
||||||
// SetLogger sets a new logger.
|
// SetLogger sets a new logger.
|
||||||
func SetLogger(adapter string, config ...string) error {
|
func SetLogger(adapter string, config ...string) error {
|
||||||
err := beeLogger.SetLogger(adapter, config...)
|
return beeLogger.SetLogger(adapter, config...)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Emergency logs a message at emergency level.
|
// Emergency logs a message at emergency level.
|
||||||
|
@ -21,11 +21,7 @@ func newSLACKWriter() Logger {
|
|||||||
|
|
||||||
// Init SLACKWriter with json config string
|
// Init SLACKWriter with json config string
|
||||||
func (s *SLACKWriter) Init(jsonconfig string) error {
|
func (s *SLACKWriter) Init(jsonconfig string) error {
|
||||||
err := json.Unmarshal([]byte(jsonconfig), s)
|
return json.Unmarshal([]byte(jsonconfig), s)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// WriteMsg write message in smtp writer.
|
// WriteMsg write message in smtp writer.
|
||||||
|
15
logs/smtp.go
15
logs/smtp.go
@ -52,11 +52,7 @@ func newSMTPWriter() Logger {
|
|||||||
// "level":LevelError
|
// "level":LevelError
|
||||||
// }
|
// }
|
||||||
func (s *SMTPWriter) Init(jsonconfig string) error {
|
func (s *SMTPWriter) Init(jsonconfig string) error {
|
||||||
err := json.Unmarshal([]byte(jsonconfig), s)
|
return json.Unmarshal([]byte(jsonconfig), s)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *SMTPWriter) getSMTPAuth(host string) smtp.Auth {
|
func (s *SMTPWriter) getSMTPAuth(host string) smtp.Auth {
|
||||||
@ -106,7 +102,7 @@ func (s *SMTPWriter) sendMail(hostAddressWithPort string, auth smtp.Auth, fromAd
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
_, err = w.Write([]byte(msgContent))
|
_, err = w.Write(msgContent)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -116,12 +112,7 @@ func (s *SMTPWriter) sendMail(hostAddressWithPort string, auth smtp.Auth, fromAd
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = client.Quit()
|
return client.Quit()
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// WriteMsg write message in smtp writer.
|
// WriteMsg write message in smtp writer.
|
||||||
|
@ -139,10 +139,7 @@ func TestNamespaceCond(t *testing.T) {
|
|||||||
|
|
||||||
ns := NewNamespace("/v2")
|
ns := NewNamespace("/v2")
|
||||||
ns.Cond(func(ctx *context.Context) bool {
|
ns.Cond(func(ctx *context.Context) bool {
|
||||||
if ctx.Input.Domain() == "beego.me" {
|
return ctx.Input.Domain() == "beego.me"
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}).
|
}).
|
||||||
AutoRouter(&TestController{})
|
AutoRouter(&TestController{})
|
||||||
AddNamespace(ns)
|
AddNamespace(ns)
|
||||||
|
@ -150,7 +150,7 @@ func (d *commandSyncDb) Run() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, fi := range mi.fields.fieldsDB {
|
for _, fi := range mi.fields.fieldsDB {
|
||||||
if _, ok := columns[fi.column]; ok == false {
|
if _, ok := columns[fi.column]; !ok {
|
||||||
fields = append(fields, fi)
|
fields = append(fields, fi)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -175,7 +175,7 @@ func (d *commandSyncDb) Run() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, idx := range indexes[mi.table] {
|
for _, idx := range indexes[mi.table] {
|
||||||
if d.al.DbBaser.IndexExists(db, idx.Table, idx.Name) == false {
|
if !d.al.DbBaser.IndexExists(db, idx.Table, idx.Name) {
|
||||||
if !d.noInfo {
|
if !d.noInfo {
|
||||||
fmt.Printf("create index `%s` for table `%s`\n", idx.Name, idx.Table)
|
fmt.Printf("create index `%s` for table `%s`\n", idx.Name, idx.Table)
|
||||||
}
|
}
|
||||||
|
@ -89,7 +89,7 @@ checkColumn:
|
|||||||
col = T["float64"]
|
col = T["float64"]
|
||||||
case TypeDecimalField:
|
case TypeDecimalField:
|
||||||
s := T["float64-decimal"]
|
s := T["float64-decimal"]
|
||||||
if strings.Index(s, "%d") == -1 {
|
if !strings.Contains(s, "%d") {
|
||||||
col = s
|
col = s
|
||||||
} else {
|
} else {
|
||||||
col = fmt.Sprintf(s, fi.digits, fi.decimals)
|
col = fmt.Sprintf(s, fi.digits, fi.decimals)
|
||||||
@ -120,7 +120,7 @@ func getColumnAddQuery(al *alias, fi *fieldInfo) string {
|
|||||||
Q := al.DbBaser.TableQuote()
|
Q := al.DbBaser.TableQuote()
|
||||||
typ := getColumnTyp(al, fi)
|
typ := getColumnTyp(al, fi)
|
||||||
|
|
||||||
if fi.null == false {
|
if !fi.null {
|
||||||
typ += " " + "NOT NULL"
|
typ += " " + "NOT NULL"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,7 +172,7 @@ func getDbCreateSQL(al *alias) (sqls []string, tableIndexes map[string][]dbIndex
|
|||||||
} else {
|
} else {
|
||||||
column += col
|
column += col
|
||||||
|
|
||||||
if fi.null == false {
|
if !fi.null {
|
||||||
column += " " + "NOT NULL"
|
column += " " + "NOT NULL"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -192,7 +192,7 @@ func getDbCreateSQL(al *alias) (sqls []string, tableIndexes map[string][]dbIndex
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if strings.Index(column, "%COL%") != -1 {
|
if strings.Contains(column, "%COL%") {
|
||||||
column = strings.Replace(column, "%COL%", fi.column, -1)
|
column = strings.Replace(column, "%COL%", fi.column, -1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
28
orm/db.go
28
orm/db.go
@ -48,7 +48,7 @@ var (
|
|||||||
"lte": true,
|
"lte": true,
|
||||||
"eq": true,
|
"eq": true,
|
||||||
"nq": true,
|
"nq": true,
|
||||||
"ne": true,
|
"ne": true,
|
||||||
"startswith": true,
|
"startswith": true,
|
||||||
"endswith": true,
|
"endswith": true,
|
||||||
"istartswith": true,
|
"istartswith": true,
|
||||||
@ -87,7 +87,7 @@ func (d *dbBase) collectValues(mi *modelInfo, ind reflect.Value, cols []string,
|
|||||||
} else {
|
} else {
|
||||||
panic(fmt.Errorf("wrong db field/column name `%s` for model `%s`", column, mi.fullName))
|
panic(fmt.Errorf("wrong db field/column name `%s` for model `%s`", column, mi.fullName))
|
||||||
}
|
}
|
||||||
if fi.dbcol == false || fi.auto && skipAuto {
|
if !fi.dbcol || fi.auto && skipAuto {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
value, err := d.collectFieldValue(mi, fi, ind, insert, tz)
|
value, err := d.collectFieldValue(mi, fi, ind, insert, tz)
|
||||||
@ -224,7 +224,7 @@ func (d *dbBase) collectFieldValue(mi *modelInfo, fi *fieldInfo, ind reflect.Val
|
|||||||
value = nil
|
value = nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if fi.null == false && value == nil {
|
if !fi.null && value == nil {
|
||||||
return nil, fmt.Errorf("field `%s` cannot be NULL", fi.fullName)
|
return nil, fmt.Errorf("field `%s` cannot be NULL", fi.fullName)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -271,7 +271,7 @@ func (d *dbBase) PrepareInsert(q dbQuerier, mi *modelInfo) (stmtQuerier, string,
|
|||||||
dbcols := make([]string, 0, len(mi.fields.dbcols))
|
dbcols := make([]string, 0, len(mi.fields.dbcols))
|
||||||
marks := make([]string, 0, len(mi.fields.dbcols))
|
marks := make([]string, 0, len(mi.fields.dbcols))
|
||||||
for _, fi := range mi.fields.fieldsDB {
|
for _, fi := range mi.fields.fieldsDB {
|
||||||
if fi.auto == false {
|
if !fi.auto {
|
||||||
dbcols = append(dbcols, fi.column)
|
dbcols = append(dbcols, fi.column)
|
||||||
marks = append(marks, "?")
|
marks = append(marks, "?")
|
||||||
}
|
}
|
||||||
@ -326,7 +326,7 @@ func (d *dbBase) Read(q dbQuerier, mi *modelInfo, ind reflect.Value, tz *time.Lo
|
|||||||
} else {
|
} else {
|
||||||
// default use pk value as where condtion.
|
// default use pk value as where condtion.
|
||||||
pkColumn, pkValue, ok := getExistPk(mi, ind)
|
pkColumn, pkValue, ok := getExistPk(mi, ind)
|
||||||
if ok == false {
|
if !ok {
|
||||||
return ErrMissPK
|
return ErrMissPK
|
||||||
}
|
}
|
||||||
whereCols = []string{pkColumn}
|
whereCols = []string{pkColumn}
|
||||||
@ -601,7 +601,7 @@ func (d *dbBase) InsertOrUpdate(q dbQuerier, mi *modelInfo, ind reflect.Value, a
|
|||||||
// execute update sql dbQuerier with given struct reflect.Value.
|
// execute update sql dbQuerier with given struct reflect.Value.
|
||||||
func (d *dbBase) Update(q dbQuerier, mi *modelInfo, ind reflect.Value, tz *time.Location, cols []string) (int64, error) {
|
func (d *dbBase) Update(q dbQuerier, mi *modelInfo, ind reflect.Value, tz *time.Location, cols []string) (int64, error) {
|
||||||
pkName, pkValue, ok := getExistPk(mi, ind)
|
pkName, pkValue, ok := getExistPk(mi, ind)
|
||||||
if ok == false {
|
if !ok {
|
||||||
return 0, ErrMissPK
|
return 0, ErrMissPK
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -654,7 +654,7 @@ func (d *dbBase) Delete(q dbQuerier, mi *modelInfo, ind reflect.Value, tz *time.
|
|||||||
} else {
|
} else {
|
||||||
// default use pk value as where condtion.
|
// default use pk value as where condtion.
|
||||||
pkColumn, pkValue, ok := getExistPk(mi, ind)
|
pkColumn, pkValue, ok := getExistPk(mi, ind)
|
||||||
if ok == false {
|
if !ok {
|
||||||
return 0, ErrMissPK
|
return 0, ErrMissPK
|
||||||
}
|
}
|
||||||
whereCols = []string{pkColumn}
|
whereCols = []string{pkColumn}
|
||||||
@ -699,7 +699,7 @@ func (d *dbBase) UpdateBatch(q dbQuerier, qs *querySet, mi *modelInfo, cond *Con
|
|||||||
columns := make([]string, 0, len(params))
|
columns := make([]string, 0, len(params))
|
||||||
values := make([]interface{}, 0, len(params))
|
values := make([]interface{}, 0, len(params))
|
||||||
for col, val := range params {
|
for col, val := range params {
|
||||||
if fi, ok := mi.fields.GetByAny(col); ok == false || fi.dbcol == false {
|
if fi, ok := mi.fields.GetByAny(col); !ok || !fi.dbcol {
|
||||||
panic(fmt.Errorf("wrong field/column name `%s`", col))
|
panic(fmt.Errorf("wrong field/column name `%s`", col))
|
||||||
} else {
|
} else {
|
||||||
columns = append(columns, fi.column)
|
columns = append(columns, fi.column)
|
||||||
@ -929,7 +929,7 @@ func (d *dbBase) ReadBatch(q dbQuerier, qs *querySet, mi *modelInfo, cond *Condi
|
|||||||
if hasRel {
|
if hasRel {
|
||||||
for _, fi := range mi.fields.fieldsDB {
|
for _, fi := range mi.fields.fieldsDB {
|
||||||
if fi.fieldType&IsRelField > 0 {
|
if fi.fieldType&IsRelField > 0 {
|
||||||
if maps[fi.column] == false {
|
if !maps[fi.column] {
|
||||||
tCols = append(tCols, fi.column)
|
tCols = append(tCols, fi.column)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -987,7 +987,7 @@ func (d *dbBase) ReadBatch(q dbQuerier, qs *querySet, mi *modelInfo, cond *Condi
|
|||||||
|
|
||||||
var cnt int64
|
var cnt int64
|
||||||
for rs.Next() {
|
for rs.Next() {
|
||||||
if one && cnt == 0 || one == false {
|
if one && cnt == 0 || !one {
|
||||||
if err := rs.Scan(refs...); err != nil {
|
if err := rs.Scan(refs...); err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
@ -1067,7 +1067,7 @@ func (d *dbBase) ReadBatch(q dbQuerier, qs *querySet, mi *modelInfo, cond *Condi
|
|||||||
cnt++
|
cnt++
|
||||||
}
|
}
|
||||||
|
|
||||||
if one == false {
|
if !one {
|
||||||
if cnt > 0 {
|
if cnt > 0 {
|
||||||
ind.Set(slice)
|
ind.Set(slice)
|
||||||
} else {
|
} else {
|
||||||
@ -1357,7 +1357,7 @@ end:
|
|||||||
func (d *dbBase) setFieldValue(fi *fieldInfo, value interface{}, field reflect.Value) (interface{}, error) {
|
func (d *dbBase) setFieldValue(fi *fieldInfo, value interface{}, field reflect.Value) (interface{}, error) {
|
||||||
|
|
||||||
fieldType := fi.fieldType
|
fieldType := fi.fieldType
|
||||||
isNative := fi.isFielder == false
|
isNative := !fi.isFielder
|
||||||
|
|
||||||
setValue:
|
setValue:
|
||||||
switch {
|
switch {
|
||||||
@ -1533,7 +1533,7 @@ setValue:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if isNative == false {
|
if !isNative {
|
||||||
fd := field.Addr().Interface().(Fielder)
|
fd := field.Addr().Interface().(Fielder)
|
||||||
err := fd.SetRaw(value)
|
err := fd.SetRaw(value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -1594,7 +1594,7 @@ func (d *dbBase) ReadValues(q dbQuerier, qs *querySet, mi *modelInfo, cond *Cond
|
|||||||
infos = make([]*fieldInfo, 0, len(exprs))
|
infos = make([]*fieldInfo, 0, len(exprs))
|
||||||
for _, ex := range exprs {
|
for _, ex := range exprs {
|
||||||
index, name, fi, suc := tables.parseExprs(mi, strings.Split(ex, ExprSep))
|
index, name, fi, suc := tables.parseExprs(mi, strings.Split(ex, ExprSep))
|
||||||
if suc == false {
|
if !suc {
|
||||||
panic(fmt.Errorf("unknown field/column name `%s`", ex))
|
panic(fmt.Errorf("unknown field/column name `%s`", ex))
|
||||||
}
|
}
|
||||||
cols = append(cols, fmt.Sprintf("%s.%s%s%s %s%s%s", index, Q, fi.column, Q, Q, name, Q))
|
cols = append(cols, fmt.Sprintf("%s.%s%s%s %s%s%s", index, Q, fi.column, Q, Q, name, Q))
|
||||||
|
@ -186,7 +186,7 @@ func addAliasWthDB(aliasName, driverName string, db *sql.DB) (*alias, error) {
|
|||||||
return nil, fmt.Errorf("register db Ping `%s`, %s", aliasName, err.Error())
|
return nil, fmt.Errorf("register db Ping `%s`, %s", aliasName, err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
if dataBaseCache.add(aliasName, al) == false {
|
if !dataBaseCache.add(aliasName, al) {
|
||||||
return nil, fmt.Errorf("DataBase alias name `%s` already registered, cannot reuse", aliasName)
|
return nil, fmt.Errorf("DataBase alias name `%s` already registered, cannot reuse", aliasName)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -244,7 +244,7 @@ end:
|
|||||||
|
|
||||||
// RegisterDriver Register a database driver use specify driver name, this can be definition the driver is which database type.
|
// RegisterDriver Register a database driver use specify driver name, this can be definition the driver is which database type.
|
||||||
func RegisterDriver(driverName string, typ DriverType) error {
|
func RegisterDriver(driverName string, typ DriverType) error {
|
||||||
if t, ok := drivers[driverName]; ok == false {
|
if t, ok := drivers[driverName]; !ok {
|
||||||
drivers[driverName] = typ
|
drivers[driverName] = typ
|
||||||
} else {
|
} else {
|
||||||
if t != typ {
|
if t != typ {
|
||||||
|
@ -63,7 +63,7 @@ func (t *dbTables) set(names []string, mi *modelInfo, fi *fieldInfo, inner bool)
|
|||||||
// add table info to collection.
|
// add table info to collection.
|
||||||
func (t *dbTables) add(names []string, mi *modelInfo, fi *fieldInfo, inner bool) (*dbTable, bool) {
|
func (t *dbTables) add(names []string, mi *modelInfo, fi *fieldInfo, inner bool) (*dbTable, bool) {
|
||||||
name := strings.Join(names, ExprSep)
|
name := strings.Join(names, ExprSep)
|
||||||
if _, ok := t.tablesM[name]; ok == false {
|
if _, ok := t.tablesM[name]; !ok {
|
||||||
i := len(t.tables) + 1
|
i := len(t.tables) + 1
|
||||||
jt := &dbTable{i, fmt.Sprintf("T%d", i), name, names, false, inner, mi, fi, nil}
|
jt := &dbTable{i, fmt.Sprintf("T%d", i), name, names, false, inner, mi, fi, nil}
|
||||||
t.tablesM[name] = jt
|
t.tablesM[name] = jt
|
||||||
@ -261,7 +261,7 @@ loopFor:
|
|||||||
fiN, okN = mmi.fields.GetByAny(exprs[i+1])
|
fiN, okN = mmi.fields.GetByAny(exprs[i+1])
|
||||||
}
|
}
|
||||||
|
|
||||||
if isRel && (fi.mi.isThrough == false || num != i) {
|
if isRel && (!fi.mi.isThrough || num != i) {
|
||||||
if fi.null || t.skipEnd {
|
if fi.null || t.skipEnd {
|
||||||
inner = false
|
inner = false
|
||||||
}
|
}
|
||||||
@ -364,7 +364,7 @@ func (t *dbTables) getCondSQL(cond *Condition, sub bool, tz *time.Location) (whe
|
|||||||
}
|
}
|
||||||
|
|
||||||
index, _, fi, suc := t.parseExprs(mi, exprs)
|
index, _, fi, suc := t.parseExprs(mi, exprs)
|
||||||
if suc == false {
|
if !suc {
|
||||||
panic(fmt.Errorf("unknown field/column name `%s`", strings.Join(p.exprs, ExprSep)))
|
panic(fmt.Errorf("unknown field/column name `%s`", strings.Join(p.exprs, ExprSep)))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -383,7 +383,7 @@ func (t *dbTables) getCondSQL(cond *Condition, sub bool, tz *time.Location) (whe
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if sub == false && where != "" {
|
if !sub && where != "" {
|
||||||
where = "WHERE " + where
|
where = "WHERE " + where
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -403,7 +403,7 @@ func (t *dbTables) getGroupSQL(groups []string) (groupSQL string) {
|
|||||||
exprs := strings.Split(group, ExprSep)
|
exprs := strings.Split(group, ExprSep)
|
||||||
|
|
||||||
index, _, fi, suc := t.parseExprs(t.mi, exprs)
|
index, _, fi, suc := t.parseExprs(t.mi, exprs)
|
||||||
if suc == false {
|
if !suc {
|
||||||
panic(fmt.Errorf("unknown field/column name `%s`", strings.Join(exprs, ExprSep)))
|
panic(fmt.Errorf("unknown field/column name `%s`", strings.Join(exprs, ExprSep)))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -432,7 +432,7 @@ func (t *dbTables) getOrderSQL(orders []string) (orderSQL string) {
|
|||||||
exprs := strings.Split(order, ExprSep)
|
exprs := strings.Split(order, ExprSep)
|
||||||
|
|
||||||
index, _, fi, suc := t.parseExprs(t.mi, exprs)
|
index, _, fi, suc := t.parseExprs(t.mi, exprs)
|
||||||
if suc == false {
|
if !suc {
|
||||||
panic(fmt.Errorf("unknown field/column name `%s`", strings.Join(exprs, ExprSep)))
|
panic(fmt.Errorf("unknown field/column name `%s`", strings.Join(exprs, ExprSep)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -128,7 +128,7 @@ func bootStrap() {
|
|||||||
if i := strings.LastIndex(fi.relThrough, "."); i != -1 && len(fi.relThrough) > (i+1) {
|
if i := strings.LastIndex(fi.relThrough, "."); i != -1 && len(fi.relThrough) > (i+1) {
|
||||||
pn := fi.relThrough[:i]
|
pn := fi.relThrough[:i]
|
||||||
rmi, ok := modelCache.getByFullName(fi.relThrough)
|
rmi, ok := modelCache.getByFullName(fi.relThrough)
|
||||||
if ok == false || pn != rmi.pkg {
|
if !ok || pn != rmi.pkg {
|
||||||
err = fmt.Errorf("field `%s` wrong rel_through value `%s` cannot find table", fi.fullName, fi.relThrough)
|
err = fmt.Errorf("field `%s` wrong rel_through value `%s` cannot find table", fi.fullName, fi.relThrough)
|
||||||
goto end
|
goto end
|
||||||
}
|
}
|
||||||
@ -171,7 +171,7 @@ func bootStrap() {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if inModel == false {
|
if !inModel {
|
||||||
rmi := fi.relModelInfo
|
rmi := fi.relModelInfo
|
||||||
ffi := new(fieldInfo)
|
ffi := new(fieldInfo)
|
||||||
ffi.name = mi.name
|
ffi.name = mi.name
|
||||||
@ -185,7 +185,7 @@ func bootStrap() {
|
|||||||
} else {
|
} else {
|
||||||
ffi.fieldType = RelReverseMany
|
ffi.fieldType = RelReverseMany
|
||||||
}
|
}
|
||||||
if rmi.fields.Add(ffi) == false {
|
if !rmi.fields.Add(ffi) {
|
||||||
added := false
|
added := false
|
||||||
for cnt := 0; cnt < 5; cnt++ {
|
for cnt := 0; cnt < 5; cnt++ {
|
||||||
ffi.name = fmt.Sprintf("%s%d", mi.name, cnt)
|
ffi.name = fmt.Sprintf("%s%d", mi.name, cnt)
|
||||||
@ -195,7 +195,7 @@ func bootStrap() {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if added == false {
|
if !added {
|
||||||
panic(fmt.Errorf("cannot generate auto reverse field info `%s` to `%s`", fi.fullName, ffi.fullName))
|
panic(fmt.Errorf("cannot generate auto reverse field info `%s` to `%s`", fi.fullName, ffi.fullName))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -248,7 +248,7 @@ func bootStrap() {
|
|||||||
break mForA
|
break mForA
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if found == false {
|
if !found {
|
||||||
err = fmt.Errorf("reverse field `%s` not found in model `%s`", fi.fullName, fi.relModelInfo.fullName)
|
err = fmt.Errorf("reverse field `%s` not found in model `%s`", fi.fullName, fi.relModelInfo.fullName)
|
||||||
goto end
|
goto end
|
||||||
}
|
}
|
||||||
@ -267,7 +267,7 @@ func bootStrap() {
|
|||||||
break mForB
|
break mForB
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if found == false {
|
if !found {
|
||||||
mForC:
|
mForC:
|
||||||
for _, ffi := range fi.relModelInfo.fields.fieldsByType[RelManyToMany] {
|
for _, ffi := range fi.relModelInfo.fields.fieldsByType[RelManyToMany] {
|
||||||
conditions := fi.relThrough != "" && fi.relThrough == ffi.relThrough ||
|
conditions := fi.relThrough != "" && fi.relThrough == ffi.relThrough ||
|
||||||
@ -287,7 +287,7 @@ func bootStrap() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if found == false {
|
if !found {
|
||||||
err = fmt.Errorf("reverse field for `%s` not found in model `%s`", fi.fullName, fi.relModelInfo.fullName)
|
err = fmt.Errorf("reverse field for `%s` not found in model `%s`", fi.fullName, fi.relModelInfo.fullName)
|
||||||
goto end
|
goto end
|
||||||
}
|
}
|
||||||
|
@ -47,7 +47,7 @@ func (f *fields) Add(fi *fieldInfo) (added bool) {
|
|||||||
} else {
|
} else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if _, ok := f.fieldsByType[fi.fieldType]; ok == false {
|
if _, ok := f.fieldsByType[fi.fieldType]; !ok {
|
||||||
f.fieldsByType[fi.fieldType] = make([]*fieldInfo, 0)
|
f.fieldsByType[fi.fieldType] = make([]*fieldInfo, 0)
|
||||||
}
|
}
|
||||||
f.fieldsByType[fi.fieldType] = append(f.fieldsByType[fi.fieldType], fi)
|
f.fieldsByType[fi.fieldType] = append(f.fieldsByType[fi.fieldType], fi)
|
||||||
@ -334,12 +334,12 @@ checkType:
|
|||||||
switch onDelete {
|
switch onDelete {
|
||||||
case odCascade, odDoNothing:
|
case odCascade, odDoNothing:
|
||||||
case odSetDefault:
|
case odSetDefault:
|
||||||
if initial.Exist() == false {
|
if !initial.Exist() {
|
||||||
err = errors.New("on_delete: set_default need set field a default value")
|
err = errors.New("on_delete: set_default need set field a default value")
|
||||||
goto end
|
goto end
|
||||||
}
|
}
|
||||||
case odSetNULL:
|
case odSetNULL:
|
||||||
if fi.null == false {
|
if !fi.null {
|
||||||
err = errors.New("on_delete: set_null need set field null")
|
err = errors.New("on_delete: set_null need set field null")
|
||||||
goto end
|
goto end
|
||||||
}
|
}
|
||||||
|
@ -78,7 +78,7 @@ func addModelFields(mi *modelInfo, ind reflect.Value, mName string, index []int)
|
|||||||
fi.fieldIndex = append(index, i)
|
fi.fieldIndex = append(index, i)
|
||||||
fi.mi = mi
|
fi.mi = mi
|
||||||
fi.inModel = true
|
fi.inModel = true
|
||||||
if mi.fields.Add(fi) == false {
|
if !mi.fields.Add(fi) {
|
||||||
err = fmt.Errorf("duplicate column name: %s", fi.column)
|
err = fmt.Errorf("duplicate column name: %s", fi.column)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
26
orm/orm.go
26
orm/orm.go
@ -122,21 +122,13 @@ func (o *orm) getFieldInfo(mi *modelInfo, name string) *fieldInfo {
|
|||||||
// read data to model
|
// read data to model
|
||||||
func (o *orm) Read(md interface{}, cols ...string) error {
|
func (o *orm) Read(md interface{}, cols ...string) error {
|
||||||
mi, ind := o.getMiInd(md, true)
|
mi, ind := o.getMiInd(md, true)
|
||||||
err := o.alias.DbBaser.Read(o.db, mi, ind, o.alias.TZ, cols, false)
|
return o.alias.DbBaser.Read(o.db, mi, ind, o.alias.TZ, cols, false)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// read data to model, like Read(), but use "SELECT FOR UPDATE" form
|
// read data to model, like Read(), but use "SELECT FOR UPDATE" form
|
||||||
func (o *orm) ReadForUpdate(md interface{}, cols ...string) error {
|
func (o *orm) ReadForUpdate(md interface{}, cols ...string) error {
|
||||||
mi, ind := o.getMiInd(md, true)
|
mi, ind := o.getMiInd(md, true)
|
||||||
err := o.alias.DbBaser.Read(o.db, mi, ind, o.alias.TZ, cols, true)
|
return o.alias.DbBaser.Read(o.db, mi, ind, o.alias.TZ, cols, true)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try to read a row from the database, or insert one if it doesn't exist
|
// Try to read a row from the database, or insert one if it doesn't exist
|
||||||
@ -238,15 +230,11 @@ func (o *orm) InsertOrUpdate(md interface{}, colConflitAndArgs ...string) (int64
|
|||||||
// cols set the columns those want to update.
|
// cols set the columns those want to update.
|
||||||
func (o *orm) Update(md interface{}, cols ...string) (int64, error) {
|
func (o *orm) Update(md interface{}, cols ...string) (int64, error) {
|
||||||
mi, ind := o.getMiInd(md, true)
|
mi, ind := o.getMiInd(md, true)
|
||||||
num, err := o.alias.DbBaser.Update(o.db, mi, ind, o.alias.TZ, cols)
|
return o.alias.DbBaser.Update(o.db, mi, ind, o.alias.TZ, cols)
|
||||||
if err != nil {
|
|
||||||
return num, err
|
|
||||||
}
|
|
||||||
return num, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// delete model in database
|
// delete model in database
|
||||||
// cols shows the delete conditions values read from. deafult is pk
|
// cols shows the delete conditions values read from. default is pk
|
||||||
func (o *orm) Delete(md interface{}, cols ...string) (int64, error) {
|
func (o *orm) Delete(md interface{}, cols ...string) (int64, error) {
|
||||||
mi, ind := o.getMiInd(md, true)
|
mi, ind := o.getMiInd(md, true)
|
||||||
num, err := o.alias.DbBaser.Delete(o.db, mi, ind, o.alias.TZ, cols)
|
num, err := o.alias.DbBaser.Delete(o.db, mi, ind, o.alias.TZ, cols)
|
||||||
@ -361,7 +349,7 @@ func (o *orm) queryRelated(md interface{}, name string) (*modelInfo, *fieldInfo,
|
|||||||
fi := o.getFieldInfo(mi, name)
|
fi := o.getFieldInfo(mi, name)
|
||||||
|
|
||||||
_, _, exist := getExistPk(mi, ind)
|
_, _, exist := getExistPk(mi, ind)
|
||||||
if exist == false {
|
if !exist {
|
||||||
panic(ErrMissPK)
|
panic(ErrMissPK)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -489,7 +477,7 @@ func (o *orm) Begin() error {
|
|||||||
|
|
||||||
// commit transaction
|
// commit transaction
|
||||||
func (o *orm) Commit() error {
|
func (o *orm) Commit() error {
|
||||||
if o.isTx == false {
|
if !o.isTx {
|
||||||
return ErrTxDone
|
return ErrTxDone
|
||||||
}
|
}
|
||||||
err := o.db.(txEnder).Commit()
|
err := o.db.(txEnder).Commit()
|
||||||
@ -504,7 +492,7 @@ func (o *orm) Commit() error {
|
|||||||
|
|
||||||
// rollback transaction
|
// rollback transaction
|
||||||
func (o *orm) Rollback() error {
|
func (o *orm) Rollback() error {
|
||||||
if o.isTx == false {
|
if !o.isTx {
|
||||||
return ErrTxDone
|
return ErrTxDone
|
||||||
}
|
}
|
||||||
err := o.db.(txEnder).Rollback()
|
err := o.db.(txEnder).Rollback()
|
||||||
|
@ -72,7 +72,7 @@ func (o *queryM2M) Add(mds ...interface{}) (int64, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_, v1, exist := getExistPk(o.mi, o.ind)
|
_, v1, exist := getExistPk(o.mi, o.ind)
|
||||||
if exist == false {
|
if !exist {
|
||||||
panic(ErrMissPK)
|
panic(ErrMissPK)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -87,7 +87,7 @@ func (o *queryM2M) Add(mds ...interface{}) (int64, error) {
|
|||||||
v2 = ind.Interface()
|
v2 = ind.Interface()
|
||||||
} else {
|
} else {
|
||||||
_, v2, exist = getExistPk(fi.relModelInfo, ind)
|
_, v2, exist = getExistPk(fi.relModelInfo, ind)
|
||||||
if exist == false {
|
if !exist {
|
||||||
panic(ErrMissPK)
|
panic(ErrMissPK)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -104,11 +104,7 @@ func (o *queryM2M) Remove(mds ...interface{}) (int64, error) {
|
|||||||
fi := o.fi
|
fi := o.fi
|
||||||
qs := o.qs.Filter(fi.reverseFieldInfo.name, o.md)
|
qs := o.qs.Filter(fi.reverseFieldInfo.name, o.md)
|
||||||
|
|
||||||
nums, err := qs.Filter(fi.reverseFieldInfoTwo.name+ExprSep+"in", mds).Delete()
|
return qs.Filter(fi.reverseFieldInfoTwo.name+ExprSep+"in", mds).Delete()
|
||||||
if err != nil {
|
|
||||||
return nums, err
|
|
||||||
}
|
|
||||||
return nums, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// check model is existed in relationship of origin model
|
// check model is existed in relationship of origin model
|
||||||
|
@ -93,14 +93,14 @@ wrongArg:
|
|||||||
}
|
}
|
||||||
|
|
||||||
func AssertIs(a interface{}, args ...interface{}) error {
|
func AssertIs(a interface{}, args ...interface{}) error {
|
||||||
if ok, err := ValuesCompare(true, a, args...); ok == false {
|
if ok, err := ValuesCompare(true, a, args...); !ok {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func AssertNot(a interface{}, args ...interface{}) error {
|
func AssertNot(a interface{}, args ...interface{}) error {
|
||||||
if ok, err := ValuesCompare(false, a, args...); ok == false {
|
if ok, err := ValuesCompare(false, a, args...); !ok {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
10
orm/utils.go
10
orm/utils.go
@ -92,11 +92,11 @@ func (f StrTo) Int64() (int64, error) {
|
|||||||
i := new(big.Int)
|
i := new(big.Int)
|
||||||
ni, ok := i.SetString(f.String(), 10) // octal
|
ni, ok := i.SetString(f.String(), 10) // octal
|
||||||
if !ok {
|
if !ok {
|
||||||
return int64(v), err
|
return v, err
|
||||||
}
|
}
|
||||||
return ni.Int64(), nil
|
return ni.Int64(), nil
|
||||||
}
|
}
|
||||||
return int64(v), err
|
return v, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Uint string to uint
|
// Uint string to uint
|
||||||
@ -130,11 +130,11 @@ func (f StrTo) Uint64() (uint64, error) {
|
|||||||
i := new(big.Int)
|
i := new(big.Int)
|
||||||
ni, ok := i.SetString(f.String(), 10)
|
ni, ok := i.SetString(f.String(), 10)
|
||||||
if !ok {
|
if !ok {
|
||||||
return uint64(v), err
|
return v, err
|
||||||
}
|
}
|
||||||
return ni.Uint64(), nil
|
return ni.Uint64(), nil
|
||||||
}
|
}
|
||||||
return uint64(v), err
|
return v, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// String string to string
|
// String string to string
|
||||||
@ -225,7 +225,7 @@ func camelString(s string) string {
|
|||||||
if d == '_' {
|
if d == '_' {
|
||||||
flag = true
|
flag = true
|
||||||
continue
|
continue
|
||||||
} else if flag == true {
|
} else if flag {
|
||||||
if d >= 'a' && d <= 'z' {
|
if d >= 'a' && d <= 'z' {
|
||||||
d = d - 32
|
d = d - 32
|
||||||
}
|
}
|
||||||
|
@ -502,10 +502,10 @@ func TestFilterBeforeRouter(t *testing.T) {
|
|||||||
rw, r := testRequest("GET", url)
|
rw, r := testRequest("GET", url)
|
||||||
mux.ServeHTTP(rw, r)
|
mux.ServeHTTP(rw, r)
|
||||||
|
|
||||||
if strings.Contains(rw.Body.String(), "BeforeRouter1") == false {
|
if !strings.Contains(rw.Body.String(), "BeforeRouter1") {
|
||||||
t.Errorf(testName + " BeforeRouter did not run")
|
t.Errorf(testName + " BeforeRouter did not run")
|
||||||
}
|
}
|
||||||
if strings.Contains(rw.Body.String(), "hello") == true {
|
if strings.Contains(rw.Body.String(), "hello") {
|
||||||
t.Errorf(testName + " BeforeRouter did not return properly")
|
t.Errorf(testName + " BeforeRouter did not return properly")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -525,13 +525,13 @@ func TestFilterBeforeExec(t *testing.T) {
|
|||||||
rw, r := testRequest("GET", url)
|
rw, r := testRequest("GET", url)
|
||||||
mux.ServeHTTP(rw, r)
|
mux.ServeHTTP(rw, r)
|
||||||
|
|
||||||
if strings.Contains(rw.Body.String(), "BeforeExec1") == false {
|
if !strings.Contains(rw.Body.String(), "BeforeExec1") {
|
||||||
t.Errorf(testName + " BeforeExec did not run")
|
t.Errorf(testName + " BeforeExec did not run")
|
||||||
}
|
}
|
||||||
if strings.Contains(rw.Body.String(), "hello") == true {
|
if strings.Contains(rw.Body.String(), "hello") {
|
||||||
t.Errorf(testName + " BeforeExec did not return properly")
|
t.Errorf(testName + " BeforeExec did not return properly")
|
||||||
}
|
}
|
||||||
if strings.Contains(rw.Body.String(), "BeforeRouter") == true {
|
if strings.Contains(rw.Body.String(), "BeforeRouter") {
|
||||||
t.Errorf(testName + " BeforeRouter ran in error")
|
t.Errorf(testName + " BeforeRouter ran in error")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -552,16 +552,16 @@ func TestFilterAfterExec(t *testing.T) {
|
|||||||
rw, r := testRequest("GET", url)
|
rw, r := testRequest("GET", url)
|
||||||
mux.ServeHTTP(rw, r)
|
mux.ServeHTTP(rw, r)
|
||||||
|
|
||||||
if strings.Contains(rw.Body.String(), "AfterExec1") == false {
|
if !strings.Contains(rw.Body.String(), "AfterExec1") {
|
||||||
t.Errorf(testName + " AfterExec did not run")
|
t.Errorf(testName + " AfterExec did not run")
|
||||||
}
|
}
|
||||||
if strings.Contains(rw.Body.String(), "hello") == false {
|
if !strings.Contains(rw.Body.String(), "hello") {
|
||||||
t.Errorf(testName + " handler did not run properly")
|
t.Errorf(testName + " handler did not run properly")
|
||||||
}
|
}
|
||||||
if strings.Contains(rw.Body.String(), "BeforeRouter") == true {
|
if strings.Contains(rw.Body.String(), "BeforeRouter") {
|
||||||
t.Errorf(testName + " BeforeRouter ran in error")
|
t.Errorf(testName + " BeforeRouter ran in error")
|
||||||
}
|
}
|
||||||
if strings.Contains(rw.Body.String(), "BeforeExec") == true {
|
if strings.Contains(rw.Body.String(), "BeforeExec") {
|
||||||
t.Errorf(testName + " BeforeExec ran in error")
|
t.Errorf(testName + " BeforeExec ran in error")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -583,19 +583,19 @@ func TestFilterFinishRouter(t *testing.T) {
|
|||||||
rw, r := testRequest("GET", url)
|
rw, r := testRequest("GET", url)
|
||||||
mux.ServeHTTP(rw, r)
|
mux.ServeHTTP(rw, r)
|
||||||
|
|
||||||
if strings.Contains(rw.Body.String(), "FinishRouter1") == true {
|
if strings.Contains(rw.Body.String(), "FinishRouter1") {
|
||||||
t.Errorf(testName + " FinishRouter did not run")
|
t.Errorf(testName + " FinishRouter did not run")
|
||||||
}
|
}
|
||||||
if strings.Contains(rw.Body.String(), "hello") == false {
|
if !strings.Contains(rw.Body.String(), "hello") {
|
||||||
t.Errorf(testName + " handler did not run properly")
|
t.Errorf(testName + " handler did not run properly")
|
||||||
}
|
}
|
||||||
if strings.Contains(rw.Body.String(), "AfterExec1") == true {
|
if strings.Contains(rw.Body.String(), "AfterExec1") {
|
||||||
t.Errorf(testName + " AfterExec ran in error")
|
t.Errorf(testName + " AfterExec ran in error")
|
||||||
}
|
}
|
||||||
if strings.Contains(rw.Body.String(), "BeforeRouter") == true {
|
if strings.Contains(rw.Body.String(), "BeforeRouter") {
|
||||||
t.Errorf(testName + " BeforeRouter ran in error")
|
t.Errorf(testName + " BeforeRouter ran in error")
|
||||||
}
|
}
|
||||||
if strings.Contains(rw.Body.String(), "BeforeExec") == true {
|
if strings.Contains(rw.Body.String(), "BeforeExec") {
|
||||||
t.Errorf(testName + " BeforeExec ran in error")
|
t.Errorf(testName + " BeforeExec ran in error")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -615,14 +615,14 @@ func TestFilterFinishRouterMultiFirstOnly(t *testing.T) {
|
|||||||
rw, r := testRequest("GET", url)
|
rw, r := testRequest("GET", url)
|
||||||
mux.ServeHTTP(rw, r)
|
mux.ServeHTTP(rw, r)
|
||||||
|
|
||||||
if strings.Contains(rw.Body.String(), "FinishRouter1") == false {
|
if !strings.Contains(rw.Body.String(), "FinishRouter1") {
|
||||||
t.Errorf(testName + " FinishRouter1 did not run")
|
t.Errorf(testName + " FinishRouter1 did not run")
|
||||||
}
|
}
|
||||||
if strings.Contains(rw.Body.String(), "hello") == false {
|
if !strings.Contains(rw.Body.String(), "hello") {
|
||||||
t.Errorf(testName + " handler did not run properly")
|
t.Errorf(testName + " handler did not run properly")
|
||||||
}
|
}
|
||||||
// not expected in body
|
// not expected in body
|
||||||
if strings.Contains(rw.Body.String(), "FinishRouter2") == true {
|
if strings.Contains(rw.Body.String(), "FinishRouter2") {
|
||||||
t.Errorf(testName + " FinishRouter2 did run")
|
t.Errorf(testName + " FinishRouter2 did run")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -642,13 +642,13 @@ func TestFilterFinishRouterMulti(t *testing.T) {
|
|||||||
rw, r := testRequest("GET", url)
|
rw, r := testRequest("GET", url)
|
||||||
mux.ServeHTTP(rw, r)
|
mux.ServeHTTP(rw, r)
|
||||||
|
|
||||||
if strings.Contains(rw.Body.String(), "FinishRouter1") == false {
|
if !strings.Contains(rw.Body.String(), "FinishRouter1") {
|
||||||
t.Errorf(testName + " FinishRouter1 did not run")
|
t.Errorf(testName + " FinishRouter1 did not run")
|
||||||
}
|
}
|
||||||
if strings.Contains(rw.Body.String(), "hello") == false {
|
if !strings.Contains(rw.Body.String(), "hello") {
|
||||||
t.Errorf(testName + " handler did not run properly")
|
t.Errorf(testName + " handler did not run properly")
|
||||||
}
|
}
|
||||||
if strings.Contains(rw.Body.String(), "FinishRouter2") == false {
|
if !strings.Contains(rw.Body.String(), "FinishRouter2") {
|
||||||
t.Errorf(testName + " FinishRouter2 did not run properly")
|
t.Errorf(testName + " FinishRouter2 did not run properly")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -125,10 +125,7 @@ func (lp *Provider) SessionRead(sid string) (session.Store, error) {
|
|||||||
// SessionExist check ledis session exist by sid
|
// SessionExist check ledis session exist by sid
|
||||||
func (lp *Provider) SessionExist(sid string) bool {
|
func (lp *Provider) SessionExist(sid string) bool {
|
||||||
count, _ := c.Exists([]byte(sid))
|
count, _ := c.Exists([]byte(sid))
|
||||||
if count == 0 {
|
return !(count == 0)
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// SessionRegenerate generate new sid for ledis session
|
// SessionRegenerate generate new sid for ledis session
|
||||||
@ -150,7 +147,7 @@ func (lp *Provider) SessionRegenerate(oldsid, sid string) (session.Store, error)
|
|||||||
if len(kvs) == 0 {
|
if len(kvs) == 0 {
|
||||||
kv = make(map[interface{}]interface{})
|
kv = make(map[interface{}]interface{})
|
||||||
} else {
|
} else {
|
||||||
kv, err = session.DecodeGob([]byte(kvs))
|
kv, err = session.DecodeGob(kvs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -205,11 +205,7 @@ func (rp *MemProvider) SessionDestroy(sid string) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
err := client.Delete(sid)
|
return client.Delete(sid)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rp *MemProvider) connectInit() error {
|
func (rp *MemProvider) connectInit() error {
|
||||||
|
@ -171,10 +171,7 @@ func (mp *Provider) SessionExist(sid string) bool {
|
|||||||
row := c.QueryRow("select session_data from "+TableName+" where session_key=?", sid)
|
row := c.QueryRow("select session_data from "+TableName+" where session_key=?", sid)
|
||||||
var sessiondata []byte
|
var sessiondata []byte
|
||||||
err := row.Scan(&sessiondata)
|
err := row.Scan(&sessiondata)
|
||||||
if err == sql.ErrNoRows {
|
return !(err == sql.ErrNoRows)
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// SessionRegenerate generate new sid for mysql session
|
// SessionRegenerate generate new sid for mysql session
|
||||||
|
@ -184,11 +184,7 @@ func (mp *Provider) SessionExist(sid string) bool {
|
|||||||
row := c.QueryRow("select session_data from session where session_key=$1", sid)
|
row := c.QueryRow("select session_data from session where session_key=$1", sid)
|
||||||
var sessiondata []byte
|
var sessiondata []byte
|
||||||
err := row.Scan(&sessiondata)
|
err := row.Scan(&sessiondata)
|
||||||
|
return !(err == sql.ErrNoRows)
|
||||||
if err == sql.ErrNoRows {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// SessionRegenerate generate new sid for postgresql session
|
// SessionRegenerate generate new sid for postgresql session
|
||||||
|
@ -163,10 +163,7 @@ func (fp *FileProvider) SessionExist(sid string) bool {
|
|||||||
defer filepder.lock.Unlock()
|
defer filepder.lock.Unlock()
|
||||||
|
|
||||||
_, err := os.Stat(path.Join(fp.savePath, string(sid[0]), string(sid[1]), sid))
|
_, err := os.Stat(path.Join(fp.savePath, string(sid[0]), string(sid[1]), sid))
|
||||||
if err == nil {
|
return err == nil
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// SessionDestroy Remove all files in this save path
|
// SessionDestroy Remove all files in this save path
|
||||||
|
@ -115,7 +115,7 @@ func TestParseConfig(t *testing.T) {
|
|||||||
if cf2.Gclifetime != 3600 {
|
if cf2.Gclifetime != 3600 {
|
||||||
t.Fatal("parseconfig get gclifetime error")
|
t.Fatal("parseconfig get gclifetime error")
|
||||||
}
|
}
|
||||||
if cf2.EnableSetCookie != false {
|
if cf2.EnableSetCookie {
|
||||||
t.Fatal("parseconfig get enableSetCookie error")
|
t.Fatal("parseconfig get enableSetCookie error")
|
||||||
}
|
}
|
||||||
cconfig := new(cookieConfig)
|
cconfig := new(cookieConfig)
|
||||||
|
@ -26,10 +26,7 @@ func (p *SsdbProvider) connectInit() error {
|
|||||||
return errors.New("SessionInit First")
|
return errors.New("SessionInit First")
|
||||||
}
|
}
|
||||||
p.client, err = ssdb.Connect(p.host, p.port)
|
p.client, err = ssdb.Connect(p.host, p.port)
|
||||||
if err != nil {
|
return err
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *SsdbProvider) SessionInit(maxLifetime int64, savePath string) error {
|
func (p *SsdbProvider) SessionInit(maxLifetime int64, savePath string) error {
|
||||||
@ -41,11 +38,7 @@ func (p *SsdbProvider) SessionInit(maxLifetime int64, savePath string) error {
|
|||||||
if e != nil {
|
if e != nil {
|
||||||
return e
|
return e
|
||||||
}
|
}
|
||||||
err := p.connectInit()
|
return p.connectInit()
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *SsdbProvider) SessionRead(sid string) (session.Store, error) {
|
func (p *SsdbProvider) SessionRead(sid string) (session.Store, error) {
|
||||||
@ -126,10 +119,7 @@ func (p *SsdbProvider) SessionDestroy(sid string) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
_, err := p.client.Del(sid)
|
_, err := p.client.Del(sid)
|
||||||
if err != nil {
|
return err
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *SsdbProvider) SessionGC() {
|
func (p *SsdbProvider) SessionGC() {
|
||||||
|
@ -109,14 +109,14 @@ var (
|
|||||||
func openFile(filePath string, fi os.FileInfo, acceptEncoding string) (bool, string, *serveContentHolder, error) {
|
func openFile(filePath string, fi os.FileInfo, acceptEncoding string) (bool, string, *serveContentHolder, error) {
|
||||||
mapKey := acceptEncoding + ":" + filePath
|
mapKey := acceptEncoding + ":" + filePath
|
||||||
mapLock.RLock()
|
mapLock.RLock()
|
||||||
mapFile, _ := staticFileMap[mapKey]
|
mapFile := staticFileMap[mapKey]
|
||||||
mapLock.RUnlock()
|
mapLock.RUnlock()
|
||||||
if isOk(mapFile, fi) {
|
if isOk(mapFile, fi) {
|
||||||
return mapFile.encoding != "", mapFile.encoding, mapFile, nil
|
return mapFile.encoding != "", mapFile.encoding, mapFile, nil
|
||||||
}
|
}
|
||||||
mapLock.Lock()
|
mapLock.Lock()
|
||||||
defer mapLock.Unlock()
|
defer mapLock.Unlock()
|
||||||
if mapFile, _ = staticFileMap[mapKey]; !isOk(mapFile, fi) {
|
if mapFile = staticFileMap[mapKey]; !isOk(mapFile, fi) {
|
||||||
file, err := os.Open(filePath)
|
file, err := os.Open(filePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, "", nil, err
|
return false, "", nil, err
|
||||||
|
27
template.go
27
template.go
@ -31,11 +31,11 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
beegoTplFuncMap = make(template.FuncMap)
|
beegoTplFuncMap = make(template.FuncMap)
|
||||||
beeViewPathTemplateLocked = false
|
beeViewPathTemplateLocked = false
|
||||||
// beeViewPathTemplates caching map and supported template file extensions per view
|
// beeViewPathTemplates caching map and supported template file extensions per view
|
||||||
beeViewPathTemplates = make(map[string]map[string]*template.Template)
|
beeViewPathTemplates = make(map[string]map[string]*template.Template)
|
||||||
templatesLock sync.RWMutex
|
templatesLock sync.RWMutex
|
||||||
// beeTemplateExt stores the template extension which will build
|
// beeTemplateExt stores the template extension which will build
|
||||||
beeTemplateExt = []string{"tpl", "html"}
|
beeTemplateExt = []string{"tpl", "html"}
|
||||||
// beeTemplatePreprocessors stores associations of extension -> preprocessor handler
|
// beeTemplatePreprocessors stores associations of extension -> preprocessor handler
|
||||||
@ -46,7 +46,7 @@ var (
|
|||||||
// writing the output to wr.
|
// writing the output to wr.
|
||||||
// A template will be executed safely in parallel.
|
// A template will be executed safely in parallel.
|
||||||
func ExecuteTemplate(wr io.Writer, name string, data interface{}) error {
|
func ExecuteTemplate(wr io.Writer, name string, data interface{}) error {
|
||||||
return ExecuteViewPathTemplate(wr,name, BConfig.WebConfig.ViewsPath, data)
|
return ExecuteViewPathTemplate(wr, name, BConfig.WebConfig.ViewsPath, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ExecuteViewPathTemplate applies the template with name and from specific viewPath to the specified data object,
|
// ExecuteViewPathTemplate applies the template with name and from specific viewPath to the specified data object,
|
||||||
@ -57,7 +57,7 @@ func ExecuteViewPathTemplate(wr io.Writer, name string, viewPath string, data in
|
|||||||
templatesLock.RLock()
|
templatesLock.RLock()
|
||||||
defer templatesLock.RUnlock()
|
defer templatesLock.RUnlock()
|
||||||
}
|
}
|
||||||
if beeTemplates,ok := beeViewPathTemplates[viewPath]; ok {
|
if beeTemplates, ok := beeViewPathTemplates[viewPath]; ok {
|
||||||
if t, ok := beeTemplates[name]; ok {
|
if t, ok := beeTemplates[name]; ok {
|
||||||
var err error
|
var err error
|
||||||
if t.Lookup(name) != nil {
|
if t.Lookup(name) != nil {
|
||||||
@ -72,7 +72,7 @@ func ExecuteViewPathTemplate(wr io.Writer, name string, viewPath string, data in
|
|||||||
}
|
}
|
||||||
panic("can't find templatefile in the path:" + viewPath + "/" + name)
|
panic("can't find templatefile in the path:" + viewPath + "/" + name)
|
||||||
}
|
}
|
||||||
panic("Uknown view path:" + viewPath)
|
panic("Unknown view path:" + viewPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
@ -160,11 +160,14 @@ func AddTemplateExt(ext string) {
|
|||||||
beeTemplateExt = append(beeTemplateExt, ext)
|
beeTemplateExt = append(beeTemplateExt, ext)
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddViewPath adds a new path to the supported view paths.
|
// AddViewPath adds a new path to the supported view paths.
|
||||||
//Can later be used by setting a controller ViewPath to this folder
|
//Can later be used by setting a controller ViewPath to this folder
|
||||||
//will panic if called after beego.Run()
|
//will panic if called after beego.Run()
|
||||||
func AddViewPath(viewPath string) error {
|
func AddViewPath(viewPath string) error {
|
||||||
if beeViewPathTemplateLocked {
|
if beeViewPathTemplateLocked {
|
||||||
|
if _, exist := beeViewPathTemplates[viewPath]; exist {
|
||||||
|
return nil //Ignore if viewpath already exists
|
||||||
|
}
|
||||||
panic("Can not add new view paths after beego.Run()")
|
panic("Can not add new view paths after beego.Run()")
|
||||||
}
|
}
|
||||||
beeViewPathTemplates[viewPath] = make(map[string]*template.Template)
|
beeViewPathTemplates[viewPath] = make(map[string]*template.Template)
|
||||||
@ -184,7 +187,7 @@ func BuildTemplate(dir string, files ...string) error {
|
|||||||
}
|
}
|
||||||
return errors.New("dir open err")
|
return errors.New("dir open err")
|
||||||
}
|
}
|
||||||
beeTemplates,ok := beeViewPathTemplates[dir];
|
beeTemplates, ok := beeViewPathTemplates[dir]
|
||||||
if !ok {
|
if !ok {
|
||||||
panic("Unknown view path: " + dir)
|
panic("Unknown view path: " + dir)
|
||||||
}
|
}
|
||||||
@ -214,7 +217,7 @@ func BuildTemplate(dir string, files ...string) error {
|
|||||||
t, err = getTemplate(self.root, file, v...)
|
t, err = getTemplate(self.root, file, v...)
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Trace("parse template err:", file, err)
|
logs.Error("parse template err:", file, err)
|
||||||
} else {
|
} else {
|
||||||
beeTemplates[file] = t
|
beeTemplates[file] = t
|
||||||
}
|
}
|
||||||
@ -293,7 +296,7 @@ func _getTemplate(t0 *template.Template, root string, subMods [][]string, others
|
|||||||
t, subMods1, err = getTplDeep(root, otherFile, "", t)
|
t, subMods1, err = getTplDeep(root, otherFile, "", t)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Trace("template parse file err:", err)
|
logs.Trace("template parse file err:", err)
|
||||||
} else if subMods1 != nil && len(subMods1) > 0 {
|
} else if len(subMods1) > 0 {
|
||||||
t, err = _getTemplate(t, root, subMods1, others...)
|
t, err = _getTemplate(t, root, subMods1, others...)
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
@ -314,7 +317,7 @@ func _getTemplate(t0 *template.Template, root string, subMods [][]string, others
|
|||||||
t, subMods1, err = getTplDeep(root, otherFile, "", t)
|
t, subMods1, err = getTplDeep(root, otherFile, "", t)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Trace("template parse file err:", err)
|
logs.Trace("template parse file err:", err)
|
||||||
} else if subMods1 != nil && len(subMods1) > 0 {
|
} else if len(subMods1) > 0 {
|
||||||
t, err = _getTemplate(t, root, subMods1, others...)
|
t, err = _getTemplate(t, root, subMods1, others...)
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
|
@ -46,26 +46,25 @@ func Substr(s string, start, length int) string {
|
|||||||
|
|
||||||
// HTML2str returns escaping text convert from html.
|
// HTML2str returns escaping text convert from html.
|
||||||
func HTML2str(html string) string {
|
func HTML2str(html string) string {
|
||||||
src := string(html)
|
|
||||||
|
|
||||||
re, _ := regexp.Compile("\\<[\\S\\s]+?\\>")
|
re, _ := regexp.Compile("\\<[\\S\\s]+?\\>")
|
||||||
src = re.ReplaceAllStringFunc(src, strings.ToLower)
|
html = re.ReplaceAllStringFunc(html, strings.ToLower)
|
||||||
|
|
||||||
//remove STYLE
|
//remove STYLE
|
||||||
re, _ = regexp.Compile("\\<style[\\S\\s]+?\\</style\\>")
|
re, _ = regexp.Compile("\\<style[\\S\\s]+?\\</style\\>")
|
||||||
src = re.ReplaceAllString(src, "")
|
html = re.ReplaceAllString(html, "")
|
||||||
|
|
||||||
//remove SCRIPT
|
//remove SCRIPT
|
||||||
re, _ = regexp.Compile("\\<script[\\S\\s]+?\\</script\\>")
|
re, _ = regexp.Compile("\\<script[\\S\\s]+?\\</script\\>")
|
||||||
src = re.ReplaceAllString(src, "")
|
html = re.ReplaceAllString(html, "")
|
||||||
|
|
||||||
re, _ = regexp.Compile("\\<[\\S\\s]+?\\>")
|
re, _ = regexp.Compile("\\<[\\S\\s]+?\\>")
|
||||||
src = re.ReplaceAllString(src, "\n")
|
html = re.ReplaceAllString(html, "\n")
|
||||||
|
|
||||||
re, _ = regexp.Compile("\\s{2,}")
|
re, _ = regexp.Compile("\\s{2,}")
|
||||||
src = re.ReplaceAllString(src, "\n")
|
html = re.ReplaceAllString(html, "\n")
|
||||||
|
|
||||||
return strings.TrimSpace(src)
|
return strings.TrimSpace(html)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DateFormat takes a time and a layout string and returns a string with the formatted date. Used by the template parser as "dateformat"
|
// DateFormat takes a time and a layout string and returns a string with the formatted date. Used by the template parser as "dateformat"
|
||||||
@ -193,7 +192,7 @@ func Str2html(raw string) template.HTML {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Htmlquote returns quoted html string.
|
// Htmlquote returns quoted html string.
|
||||||
func Htmlquote(src string) string {
|
func Htmlquote(text string) string {
|
||||||
//HTML编码为实体符号
|
//HTML编码为实体符号
|
||||||
/*
|
/*
|
||||||
Encodes `text` for raw use in HTML.
|
Encodes `text` for raw use in HTML.
|
||||||
@ -201,8 +200,6 @@ func Htmlquote(src string) string {
|
|||||||
'<'&">'
|
'<'&">'
|
||||||
*/
|
*/
|
||||||
|
|
||||||
text := string(src)
|
|
||||||
|
|
||||||
text = strings.Replace(text, "&", "&", -1) // Must be done first!
|
text = strings.Replace(text, "&", "&", -1) // Must be done first!
|
||||||
text = strings.Replace(text, "<", "<", -1)
|
text = strings.Replace(text, "<", "<", -1)
|
||||||
text = strings.Replace(text, ">", ">", -1)
|
text = strings.Replace(text, ">", ">", -1)
|
||||||
@ -216,7 +213,7 @@ func Htmlquote(src string) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Htmlunquote returns unquoted html string.
|
// Htmlunquote returns unquoted html string.
|
||||||
func Htmlunquote(src string) string {
|
func Htmlunquote(text string) string {
|
||||||
//实体符号解释为HTML
|
//实体符号解释为HTML
|
||||||
/*
|
/*
|
||||||
Decodes `text` that's HTML quoted.
|
Decodes `text` that's HTML quoted.
|
||||||
@ -227,7 +224,6 @@ func Htmlunquote(src string) string {
|
|||||||
// strings.Replace(s, old, new, n)
|
// strings.Replace(s, old, new, n)
|
||||||
// 在s字符串中,把old字符串替换为new字符串,n表示替换的次数,小于0表示全部替换
|
// 在s字符串中,把old字符串替换为new字符串,n表示替换的次数,小于0表示全部替换
|
||||||
|
|
||||||
text := string(src)
|
|
||||||
text = strings.Replace(text, " ", " ", -1)
|
text = strings.Replace(text, " ", " ", -1)
|
||||||
text = strings.Replace(text, "”", "”", -1)
|
text = strings.Replace(text, "”", "”", -1)
|
||||||
text = strings.Replace(text, "“", "“", -1)
|
text = strings.Replace(text, "“", "“", -1)
|
||||||
@ -262,19 +258,17 @@ func URLFor(endpoint string, values ...interface{}) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// AssetsJs returns script tag with src string.
|
// AssetsJs returns script tag with src string.
|
||||||
func AssetsJs(src string) template.HTML {
|
func AssetsJs(text string) template.HTML {
|
||||||
text := string(src)
|
|
||||||
|
|
||||||
text = "<script src=\"" + src + "\"></script>"
|
text = "<script src=\"" + text + "\"></script>"
|
||||||
|
|
||||||
return template.HTML(text)
|
return template.HTML(text)
|
||||||
}
|
}
|
||||||
|
|
||||||
// AssetsCSS returns stylesheet link tag with src string.
|
// AssetsCSS returns stylesheet link tag with src string.
|
||||||
func AssetsCSS(src string) template.HTML {
|
func AssetsCSS(text string) template.HTML {
|
||||||
text := string(src)
|
|
||||||
|
|
||||||
text = "<link href=\"" + src + "\" rel=\"stylesheet\" />"
|
text = "<link href=\"" + text + "\" rel=\"stylesheet\" />"
|
||||||
|
|
||||||
return template.HTML(text)
|
return template.HTML(text)
|
||||||
}
|
}
|
||||||
|
@ -173,7 +173,7 @@ func TestParseForm(t *testing.T) {
|
|||||||
if u.Intro != "I am an engineer!" {
|
if u.Intro != "I am an engineer!" {
|
||||||
t.Errorf("Intro should equal `I am an engineer!` but got `%v`", u.Intro)
|
t.Errorf("Intro should equal `I am an engineer!` but got `%v`", u.Intro)
|
||||||
}
|
}
|
||||||
if u.StrBool != true {
|
if !u.StrBool {
|
||||||
t.Errorf("strboll should equal `true`, but got `%v`", u.StrBool)
|
t.Errorf("strboll should equal `true`, but got `%v`", u.StrBool)
|
||||||
}
|
}
|
||||||
y, m, d := u.Date.Date()
|
y, m, d := u.Date.Date()
|
||||||
@ -255,43 +255,43 @@ func TestParseFormTag(t *testing.T) {
|
|||||||
objT := reflect.TypeOf(&user{}).Elem()
|
objT := reflect.TypeOf(&user{}).Elem()
|
||||||
|
|
||||||
label, name, fType, id, class, ignored, required := parseFormTag(objT.Field(0))
|
label, name, fType, id, class, ignored, required := parseFormTag(objT.Field(0))
|
||||||
if !(name == "name" && label == "年龄:" && fType == "text" && ignored == false) {
|
if !(name == "name" && label == "年龄:" && fType == "text" && !ignored) {
|
||||||
t.Errorf("Form Tag with name, label and type was not correctly parsed.")
|
t.Errorf("Form Tag with name, label and type was not correctly parsed.")
|
||||||
}
|
}
|
||||||
|
|
||||||
label, name, fType, id, class, ignored, required = parseFormTag(objT.Field(1))
|
label, name, fType, id, class, ignored, required = parseFormTag(objT.Field(1))
|
||||||
if !(name == "NoName" && label == "年龄:" && fType == "hidden" && ignored == false) {
|
if !(name == "NoName" && label == "年龄:" && fType == "hidden" && !ignored) {
|
||||||
t.Errorf("Form Tag with label and type but without name was not correctly parsed.")
|
t.Errorf("Form Tag with label and type but without name was not correctly parsed.")
|
||||||
}
|
}
|
||||||
|
|
||||||
label, name, fType, id, class, ignored, required = parseFormTag(objT.Field(2))
|
label, name, fType, id, class, ignored, required = parseFormTag(objT.Field(2))
|
||||||
if !(name == "OnlyLabel" && label == "年龄:" && fType == "text" && ignored == false) {
|
if !(name == "OnlyLabel" && label == "年龄:" && fType == "text" && !ignored) {
|
||||||
t.Errorf("Form Tag containing only label was not correctly parsed.")
|
t.Errorf("Form Tag containing only label was not correctly parsed.")
|
||||||
}
|
}
|
||||||
|
|
||||||
label, name, fType, id, class, ignored, required = parseFormTag(objT.Field(3))
|
label, name, fType, id, class, ignored, required = parseFormTag(objT.Field(3))
|
||||||
if !(name == "name" && label == "OnlyName: " && fType == "text" && ignored == false &&
|
if !(name == "name" && label == "OnlyName: " && fType == "text" && !ignored &&
|
||||||
id == "name" && class == "form-name") {
|
id == "name" && class == "form-name") {
|
||||||
t.Errorf("Form Tag containing only name was not correctly parsed.")
|
t.Errorf("Form Tag containing only name was not correctly parsed.")
|
||||||
}
|
}
|
||||||
|
|
||||||
label, name, fType, id, class, ignored, required = parseFormTag(objT.Field(4))
|
label, name, fType, id, class, ignored, required = parseFormTag(objT.Field(4))
|
||||||
if ignored == false {
|
if !ignored {
|
||||||
t.Errorf("Form Tag that should be ignored was not correctly parsed.")
|
t.Errorf("Form Tag that should be ignored was not correctly parsed.")
|
||||||
}
|
}
|
||||||
|
|
||||||
label, name, fType, id, class, ignored, required = parseFormTag(objT.Field(5))
|
label, name, fType, id, class, ignored, required = parseFormTag(objT.Field(5))
|
||||||
if !(name == "name" && required == true) {
|
if !(name == "name" && required) {
|
||||||
t.Errorf("Form Tag containing only name and required was not correctly parsed.")
|
t.Errorf("Form Tag containing only name and required was not correctly parsed.")
|
||||||
}
|
}
|
||||||
|
|
||||||
label, name, fType, id, class, ignored, required = parseFormTag(objT.Field(6))
|
label, name, fType, id, class, ignored, required = parseFormTag(objT.Field(6))
|
||||||
if !(name == "name" && required == false) {
|
if !(name == "name" && !required) {
|
||||||
t.Errorf("Form Tag containing only name and ignore required was not correctly parsed.")
|
t.Errorf("Form Tag containing only name and ignore required was not correctly parsed.")
|
||||||
}
|
}
|
||||||
|
|
||||||
label, name, fType, id, class, ignored, required = parseFormTag(objT.Field(7))
|
label, name, fType, id, class, ignored, required = parseFormTag(objT.Field(7))
|
||||||
if !(name == "name" && required == false) {
|
if !(name == "name" && !required) {
|
||||||
t.Errorf("Form Tag containing only name and not required was not correctly parsed.")
|
t.Errorf("Form Tag containing only name and not required was not correctly parsed.")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -474,7 +474,7 @@ func randomBrightness(c color.RGBA, max uint8) color.RGBA {
|
|||||||
uint8(int(c.R) + n),
|
uint8(int(c.R) + n),
|
||||||
uint8(int(c.G) + n),
|
uint8(int(c.G) + n),
|
||||||
uint8(int(c.B) + n),
|
uint8(int(c.B) + n),
|
||||||
uint8(c.A),
|
c.A,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -349,7 +349,7 @@ func (v *Validation) RecursiveValid(objc interface{}) (bool, error) {
|
|||||||
//Step 1: validate obj itself firstly
|
//Step 1: validate obj itself firstly
|
||||||
// fails if objc is not struct
|
// fails if objc is not struct
|
||||||
pass, err := v.Valid(objc)
|
pass, err := v.Valid(objc)
|
||||||
if err != nil || false == pass {
|
if err != nil || !pass {
|
||||||
return pass, err // Stop recursive validation
|
return pass, err // Stop recursive validation
|
||||||
}
|
}
|
||||||
// Step 2: Validate struct's struct fields
|
// Step 2: Validate struct's struct fields
|
||||||
|
@ -214,6 +214,12 @@ func TestEmail(t *testing.T) {
|
|||||||
if !valid.Email("suchuangji@gmail.com", "email").Ok {
|
if !valid.Email("suchuangji@gmail.com", "email").Ok {
|
||||||
t.Error("\"suchuangji@gmail.com\" is a valid email address should be true")
|
t.Error("\"suchuangji@gmail.com\" is a valid email address should be true")
|
||||||
}
|
}
|
||||||
|
if valid.Email("@suchuangji@gmail.com", "email").Ok {
|
||||||
|
t.Error("\"@suchuangji@gmail.com\" is a valid email address should be false")
|
||||||
|
}
|
||||||
|
if valid.Email("suchuangji@gmail.com ok", "email").Ok {
|
||||||
|
t.Error("\"suchuangji@gmail.com ok\" is a valid email address should be false")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestIP(t *testing.T) {
|
func TestIP(t *testing.T) {
|
||||||
|
@ -518,7 +518,7 @@ func (a AlphaDash) GetLimitValue() interface{} {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var emailPattern = regexp.MustCompile("[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[a-zA-Z0-9](?:[\\w-]*[\\w])?")
|
var emailPattern = regexp.MustCompile("^[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[a-zA-Z0-9](?:[\\w-]*[\\w])?$")
|
||||||
|
|
||||||
// Email check struct
|
// Email check struct
|
||||||
type Email struct {
|
type Email struct {
|
||||||
|
Loading…
Reference in New Issue
Block a user