From ceb4aa9e2552222ef91d99351a9a33e8e25ca983 Mon Sep 17 00:00:00 2001 From: bronze1man Date: Sun, 24 Nov 2013 14:26:32 +0800 Subject: [PATCH] [orm] QueryTable with nil ptr struct --- orm/orm.go | 4 +--- orm/orm_test.go | 1 + orm/utils.go | 10 ++++++++++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/orm/orm.go b/orm/orm.go index 425e0f4e..0069aa1d 100644 --- a/orm/orm.go +++ b/orm/orm.go @@ -274,9 +274,7 @@ func (o *orm) QueryTable(ptrStructOrTableName interface{}) (qs QuerySeter) { qs = newQuerySet(o, mi) } } else { - val := reflect.ValueOf(ptrStructOrTableName) - ind := reflect.Indirect(val) - name = getFullName(ind.Type()) + name = getFullName(indirectType(reflect.TypeOf(ptrStructOrTableName))) if mi, ok := modelCache.getByFN(name); ok { qs = newQuerySet(o, mi) } diff --git a/orm/orm_test.go b/orm/orm_test.go index 5448e032..8b81ea8b 100644 --- a/orm/orm_test.go +++ b/orm/orm_test.go @@ -473,6 +473,7 @@ The program—and web server—godoc processes Go source files to extract docume func TestExpr(t *testing.T) { user := &User{} qs := dORM.QueryTable(user) + qs = dORM.QueryTable((*User)(nil)) qs = dORM.QueryTable("User") qs = dORM.QueryTable("user") num, err := qs.Filter("UserName", "slene").Filter("user_name", "slene").Filter("profile__Age", 28).Count() diff --git a/orm/utils.go b/orm/utils.go index 7f45782c..237b3edf 100644 --- a/orm/utils.go +++ b/orm/utils.go @@ -231,3 +231,13 @@ func timeParse(dateString, format string) (time.Time, error) { func timeFormat(t time.Time, format string) string { return t.Format(format) } + +func indirectType(v reflect.Type) reflect.Type { + switch v.Kind() { + case reflect.Ptr: + return indirectType(v.Elem()) + default: + return v + } + return v +}