From dd30b1fa61fc1923e197bf44aad84ff1b93bb4c3 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Fri, 28 Aug 2015 17:01:41 +0800 Subject: [PATCH] oracle insert primary key set back support --- session.go | 117 ++++++++++++++++++++++++++--------------------------- 1 file changed, 58 insertions(+), 59 deletions(-) diff --git a/session.go b/session.go index f0edb0ba..f10a1423 100644 --- a/session.go +++ b/session.go @@ -3155,64 +3155,7 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) { // for postgres, many of them didn't implement lastInsertId, so we should // implemented it ourself. - - if session.Engine.DriverName() != core.POSTGRES || table.AutoIncrement == "" { - res, err := session.exec(sqlStr, 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 table.AutoIncrement == "" { - return res.RowsAffected() - } - - var id int64 = 0 - id, err = res.LastInsertId() - if err != nil || id <= 0 { - return res.RowsAffected() - } - - aiValue, err := table.AutoIncrColumn().ValueOf(bean) - if err != nil { - session.Engine.LogError(err) - } - - if aiValue == nil || !aiValue.IsValid() /*|| aiValue.Int() != 0*/ || !aiValue.CanSet() { - return res.RowsAffected() - } - - 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 res.RowsAffected() - } else if session.Engine.DriverName() == core.ORACLE { + if session.Engine.DriverName() == core.ORACLE && len(table.AutoIncrement) > 0 { //assert table.AutoIncrement != "" res, err := session.query("select seq_atable.currval from dual", args...) @@ -3270,7 +3213,7 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) { aiValue.Set(reflect.ValueOf(v)) return 1, nil - } else { + } else if session.Engine.DriverName() == core.POSTGRES && len(table.AutoIncrement) > 0 { //assert table.AutoIncrement != "" sqlStr = sqlStr + " RETURNING " + session.Engine.Quote(table.AutoIncrement) res, err := session.query(sqlStr, args...) @@ -3329,6 +3272,62 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) { aiValue.Set(reflect.ValueOf(v)) return 1, nil + } else { + res, err := session.exec(sqlStr, 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 table.AutoIncrement == "" { + return res.RowsAffected() + } + + var id int64 = 0 + id, err = res.LastInsertId() + if err != nil || id <= 0 { + return res.RowsAffected() + } + + aiValue, err := table.AutoIncrColumn().ValueOf(bean) + if err != nil { + session.Engine.LogError(err) + } + + if aiValue == nil || !aiValue.IsValid() /*|| aiValue.Int() != 0*/ || !aiValue.CanSet() { + return res.RowsAffected() + } + + 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 res.RowsAffected() } }