From 5d0cb69c574d29f3f5bd5aa6fd48ee6863355b8c Mon Sep 17 00:00:00 2001 From: marshalys Date: Fri, 26 Oct 2018 12:13:32 +0800 Subject: [PATCH] fix panic when use version with uint32 type --- session.go | 9 +++++++++ session_insert.go | 6 +++--- session_update.go | 4 ++-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/session.go b/session.go index b4750891..6d120416 100644 --- a/session.go +++ b/session.go @@ -845,3 +845,12 @@ func (session *Session) Unscoped() *Session { session.statement.Unscoped() return session } + +func (session *Session) setIntegerFieldValue(fieldValue *reflect.Value, version int64) { + switch fieldValue.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + fieldValue.SetInt(version) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + fieldValue.SetUint(uint64(version)) + } +} diff --git a/session_insert.go b/session_insert.go index 2ea58fda..f576f0b5 100644 --- a/session_insert.go +++ b/session_insert.go @@ -397,7 +397,7 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) { if err != nil { session.engine.logger.Error(err) } else if verValue.IsValid() && verValue.CanSet() { - verValue.SetInt(1) + session.setIntegerFieldValue(verValue, 1) } } @@ -440,7 +440,7 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) { if err != nil { session.engine.logger.Error(err) } else if verValue.IsValid() && verValue.CanSet() { - verValue.SetInt(1) + session.setIntegerFieldValue(verValue, 1) } } @@ -481,7 +481,7 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) { if err != nil { session.engine.logger.Error(err) } else if verValue.IsValid() && verValue.CanSet() { - verValue.SetInt(1) + session.setIntegerFieldValue(verValue, 1) } } diff --git a/session_update.go b/session_update.go index 42dfaacd..98be67f0 100644 --- a/session_update.go +++ b/session_update.go @@ -116,7 +116,7 @@ func (session *Session) cacheUpdate(table *core.Table, tableName, sqlStr string, } else { session.engine.logger.Debug("[cacheUpdate] set bean field", bean, colName, fieldValue.Interface()) if col.IsVersion && session.statement.checkVersion { - fieldValue.SetInt(fieldValue.Int() + 1) + session.setIntegerFieldValue(fieldValue, fieldValue.Int()+1) } else { fieldValue.Set(reflect.ValueOf(args[idx])) } @@ -357,7 +357,7 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6 return 0, err } else if doIncVer { if verValue != nil && verValue.IsValid() && verValue.CanSet() { - verValue.SetInt(verValue.Int() + 1) + session.setIntegerFieldValue(verValue, verValue.Int()+1) } }