From adadb47c60fcb8c6ed4029620eb152f47ec92d0e Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Wed, 26 Aug 2015 14:28:59 +0800 Subject: [PATCH] bug fixed for oracle insert --- session.go | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/session.go b/session.go index a8f53117..f0edb0ba 100644 --- a/session.go +++ b/session.go @@ -3212,6 +3212,64 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) { aiValue.Set(reflect.ValueOf(v)) return res.RowsAffected() + } else if session.Engine.DriverName() == core.ORACLE { + //assert table.AutoIncrement != "" + res, err := session.query("select seq_atable.currval from dual", args...) + + if err != nil { + return 0, err + } else { + handleAfterInsertProcessorFunc(bean) + } + + if cacher := session.Engine.getCacher2(table); cacher != nil && session.Statement.UseCache { + session.cacheInsert(session.Statement.TableName()) + } + + if table.Version != "" && session.Statement.checkVersion { + verValue, err := table.VersionColumn().ValueOf(bean) + if err != nil { + session.Engine.LogError(err) + } else if verValue.IsValid() && verValue.CanSet() { + verValue.SetInt(1) + } + } + + if len(res) < 1 { + return 0, errors.New("insert no error but not returned id") + } + + idByte := res[0][table.AutoIncrement] + id, err := strconv.ParseInt(string(idByte), 10, 64) + if err != nil { + return 1, err + } + + aiValue, err := table.AutoIncrColumn().ValueOf(bean) + if err != nil { + session.Engine.LogError(err) + } + + if aiValue == nil || !aiValue.IsValid() /*|| aiValue. != 0*/ || !aiValue.CanSet() { + return 1, nil + } + + var v interface{} = id + switch aiValue.Type().Kind() { + case reflect.Int32: + v = int32(id) + case reflect.Int: + v = int(id) + case reflect.Uint32: + v = uint32(id) + case reflect.Uint64: + v = uint64(id) + case reflect.Uint: + v = uint(id) + } + aiValue.Set(reflect.ValueOf(v)) + + return 1, nil } else { //assert table.AutoIncrement != "" sqlStr = sqlStr + " RETURNING " + session.Engine.Quote(table.AutoIncrement)