diff --git a/Gopkg.lock b/Gopkg.lock index bd7b68a07d..7c2cfbfbda 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -1368,19 +1368,19 @@ [[projects]] branch = "master" - digest = "1:35bcee3fd56603e5a4900825378bf75a81f30cf94b43a575841772eaed5963a0" + digest = "1:2fdf064ae928c1b311e67ec51e856ce655abc39e8eacf5e6b3f7bd0417fac0a6" name = "yunion.io/x/sqlchemy" packages = ["."] pruneopts = "UT" - revision = "75c341b1221002e2aa33b13c5de2a75196dfe233" + revision = "e22221d5efcc667e68b0fdeed19958e788c3ad63" [[projects]] branch = "master" - digest = "1:bbaf572e68e5dad4045e1e424af29838882c620df391fa1631dd8dc851c87a95" + digest = "1:97c47d46b272f535bc6760672a3dd4512bf66fb4463cb70547178e21cf9078f7" name = "yunion.io/x/structarg" packages = ["."] pruneopts = "UT" - revision = "c95bf78846decd8dea379e925410f2895fb20076" + revision = "1a162c0cfa82905f20a795e9ac530bf27f9a0549" [solve-meta] analyzer-name = "dep" @@ -1434,6 +1434,7 @@ "github.com/coredns/coredns/request", "github.com/fatih/color", "github.com/go-sql-driver/mysql", + "github.com/golang-plus/errors", "github.com/golang-plus/uuid", "github.com/googollee/go-socket.io", "github.com/gorilla/mux", diff --git a/vendor/yunion.io/x/sqlchemy/conditions.go b/vendor/yunion.io/x/sqlchemy/conditions.go index 23e78e1032..59fd7ed8fb 100644 --- a/vendor/yunion.io/x/sqlchemy/conditions.go +++ b/vendor/yunion.io/x/sqlchemy/conditions.go @@ -177,7 +177,7 @@ type SIsNotEmptyCondition struct { } func (c *SIsNotEmptyCondition) WhereClause() string { - return fmt.Sprintf("LENGTH(%s) > 0", c.field.Reference()) + return fmt.Sprintf("%s IS NOT NULL AND LENGTH(%s) > 0", c.field.Reference(), c.field.Reference()) } func IsNotEmpty(f IQueryField) ICondition { diff --git a/vendor/yunion.io/x/sqlchemy/functions.go b/vendor/yunion.io/x/sqlchemy/functions.go index c55920f836..237cdb31f5 100644 --- a/vendor/yunion.io/x/sqlchemy/functions.go +++ b/vendor/yunion.io/x/sqlchemy/functions.go @@ -38,8 +38,14 @@ func NewFunctionField(name string, funcexp string, fields ...IQueryField) SFunct return ff } -func COUNT(name string) IQueryField { - ff := NewFunctionField(name, "COUNT(*)") +func COUNT(name string, field ...IQueryField) IQueryField { + var expr string + if len(field) == 0 { + expr = "COUNT(*)" + } else { + expr = "COUNT(%s)" + } + ff := NewFunctionField(name, expr, field...) return &ff } diff --git a/vendor/yunion.io/x/structarg/structarg.go b/vendor/yunion.io/x/structarg/structarg.go index ff749484c7..c016e5c567 100644 --- a/vendor/yunion.io/x/structarg/structarg.go +++ b/vendor/yunion.io/x/structarg/structarg.go @@ -87,7 +87,7 @@ func NewArgumentParser(target interface{}, prog, desc, epilog string) (*Argument epilog: epilog, target: target} target_type := reflect.TypeOf(target).Elem() target_value := reflect.ValueOf(target).Elem() - e := parser.addStructArgument(target_type, target_value) + e := parser.addStructArgument("", target_type, target_value) if e != nil { return nil, e } @@ -165,7 +165,7 @@ const ( TAG_ALIAS = "alias" ) -func (this *ArgumentParser) addStructArgument(tp reflect.Type, val reflect.Value) error { +func (this *ArgumentParser) addStructArgument(prefix string, tp reflect.Type, val reflect.Value) error { for i := 0; i < tp.NumField(); i++ { v := val.Field(i) if !v.CanSet() { @@ -173,12 +173,16 @@ func (this *ArgumentParser) addStructArgument(tp reflect.Type, val reflect.Value } f := tp.Field(i) if f.Type.Kind() == reflect.Struct { - e := this.addStructArgument(f.Type, v) + p := prefix + if !f.Anonymous { + p += f.Name + "-" + } + e := this.addStructArgument(p, f.Type, v) if e != nil { return e } } else { - e := this.addArgument(f, v) + e := this.addArgument(prefix, f, v) if e != nil { return e } @@ -187,13 +191,14 @@ func (this *ArgumentParser) addStructArgument(tp reflect.Type, val reflect.Value return nil } -func (this *ArgumentParser) addArgument(f reflect.StructField, v reflect.Value) error { +func (this *ArgumentParser) addArgument(prefix string, f reflect.StructField, v reflect.Value) error { tagMap := utils.TagMap(f.Tag) help := tagMap[TAG_HELP] token, ok := tagMap[TAG_TOKEN] if !ok { token = f.Name } + token = prefix + token shorttoken := tagMap[TAG_SHORT_TOKEN] alias := tagMap[TAG_ALIAS] metavar := tagMap[TAG_METAVAR] @@ -344,6 +349,11 @@ func (this *ArgumentParser) AddArgument(arg Argument) error { } this.posArgs = append(this.posArgs, arg) } else { + for _, argOld := range this.optArgs { + if argOld.Token() == arg.Token() { + return fmt.Errorf("Duplicate argument %s", argOld.Token()) + } + } // Put required at the end and try to be stable if arg.IsRequired() { this.optArgs = append(this.optArgs, arg)