From 39a812d59d149c55af8a80c3fba3c79771b45df1 Mon Sep 17 00:00:00 2001 From: Mamoru Murakami Date: Thu, 6 Jul 2017 14:03:06 +0900 Subject: [PATCH] Topic/fix cache uint (#635) * modify cache_test for issues #330 * fix bugs cache key when pk is defined as uint (#330) * add comment --- cache_test.go | 8 ++++++-- engine.go | 26 +++++++++++++++++++++++--- session_find.go | 15 +++------------ 3 files changed, 32 insertions(+), 17 deletions(-) diff --git a/cache_test.go b/cache_test.go index e8671927..636e000f 100644 --- a/cache_test.go +++ b/cache_test.go @@ -15,7 +15,7 @@ func TestCacheFind(t *testing.T) { assert.NoError(t, prepareEngine()) type MailBox struct { - Id int64 + Id int64 `xorm:"pk"` Username string Password string } @@ -27,10 +27,12 @@ func TestCacheFind(t *testing.T) { var inserts = []*MailBox{ { + Id: 0, Username: "user1", Password: "pass1", }, { + Id: 1, Username: "user2", Password: "pass2", }, @@ -63,7 +65,7 @@ func TestCacheFind2(t *testing.T) { assert.NoError(t, prepareEngine()) type MailBox2 struct { - Id uint64 + Id uint64 `xorm:"pk"` Username string Password string } @@ -75,10 +77,12 @@ func TestCacheFind2(t *testing.T) { var inserts = []*MailBox2{ { + Id: 0, Username: "user1", Password: "pass1", }, { + Id: 1, Username: "user2", Password: "pass2", }, diff --git a/engine.go b/engine.go index 6e5f14fe..b1478a24 100644 --- a/engine.go +++ b/engine.go @@ -1104,19 +1104,39 @@ func (engine *Engine) idOfV(rv reflect.Value) (core.PK, error) { pk := make([]interface{}, len(table.PrimaryKeys)) for i, col := range table.PKColumns() { + var err error pkField := v.FieldByName(col.FieldName) switch pkField.Kind() { case reflect.String: - pk[i] = pkField.String() + pk[i], err = engine.idTypeAssertion(col, pkField.String()) case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - pk[i] = pkField.Int() + pk[i], err = engine.idTypeAssertion(col, strconv.FormatInt(pkField.Int(), 10)) case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - pk[i] = pkField.Uint() + // id of uint will be converted to int64 + pk[i], err = engine.idTypeAssertion(col, strconv.FormatUint(pkField.Uint(), 10)) + } + + if err != nil { + return nil, err } } return core.PK(pk), nil } +func (engine *Engine) idTypeAssertion(col *core.Column, sid string) (interface{}, error) { + if col.SQLType.IsNumeric() { + n, err := strconv.ParseInt(sid, 10, 64) + if err != nil { + return nil, err + } + return n, nil + } else if col.SQLType.IsText() { + return sid, nil + } else { + return nil, errors.New("not supported") + } +} + // CreateIndexes create indexes func (engine *Engine) CreateIndexes(bean interface{}) error { session := engine.NewSession() diff --git a/session_find.go b/session_find.go index be64878a..b711991e 100644 --- a/session_find.go +++ b/session_find.go @@ -8,7 +8,6 @@ import ( "errors" "fmt" "reflect" - "strconv" "strings" "github.com/go-xorm/builder" @@ -323,19 +322,11 @@ func (session *Session) cacheFind(t reflect.Type, sqlStr string, rowsSlicePtr in if err != nil { return err } - var pk core.PK = make([]interface{}, len(table.PrimaryKeys)) for i, col := range table.PKColumns() { - if col.SQLType.IsNumeric() { - n, err := strconv.ParseInt(res[i], 10, 64) - if err != nil { - return err - } - pk[i] = n - } else if col.SQLType.IsText() { - pk[i] = res[i] - } else { - return errors.New("not supported") + pk[i], err = session.Engine.idTypeAssertion(col, res[i]) + if err != nil { + return err } }