refactor write insert sql (#2302)
Reviewed-on: https://gitea.com/xorm/xorm/pulls/2302
This commit is contained in:
parent
9988dac44d
commit
6c29ab378e
|
@ -293,3 +293,99 @@ func (statement *Statement) GenInsertMultipleMapSQL(columns []string, argss [][]
|
||||||
|
|
||||||
return buf.String(), buf.Args(), nil
|
return buf.String(), buf.Args(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (statement *Statement) writeColumns(w *builder.BytesWriter, slice []string) error {
|
||||||
|
for i, s := range slice {
|
||||||
|
if i > 0 {
|
||||||
|
if _, err := fmt.Fprint(w, ","); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err := statement.dialect.Quoter().QuoteTo(w.Builder, s); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (statement *Statement) writeQuestions(w *builder.BytesWriter, length int) error {
|
||||||
|
for i := 0; i < length; i++ {
|
||||||
|
if i > 0 {
|
||||||
|
if _, err := fmt.Fprint(w, ","); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if _, err := fmt.Fprint(w, "?"); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (statement *Statement) oracleWriteInsertMultiple(w *builder.BytesWriter, tableName string, colNames []string, colMultiPlaces []string) error {
|
||||||
|
if _, err := fmt.Fprint(w, "INSERT ALL"); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, cols := range colMultiPlaces {
|
||||||
|
if _, err := fmt.Fprint(w, " INTO "); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := statement.dialect.Quoter().QuoteTo(w.Builder, tableName); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if _, err := fmt.Fprint(w, " ("); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := statement.writeColumns(w, colNames); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if _, err := fmt.Fprint(w, ") VALUES ("); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if _, err := fmt.Fprintf(w, cols, ")"); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := fmt.Fprint(w, " SELECT 1 FROM DUAL"); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (statement *Statement) WriteInsertMultiple(w *builder.BytesWriter, tableName string, colNames []string, colMultiPlaces []string) error {
|
||||||
|
if statement.dialect.URI().DBType == schemas.ORACLE {
|
||||||
|
return statement.oracleWriteInsertMultiple(w, tableName, colNames, colMultiPlaces)
|
||||||
|
}
|
||||||
|
return statement.plainWriteInsertMultiple(w, tableName, colNames, colMultiPlaces)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (statement *Statement) plainWriteInsertMultiple(w *builder.BytesWriter, tableName string, colNames []string, colMultiPlaces []string) error {
|
||||||
|
if _, err := fmt.Fprint(w, "INSERT INTO "); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := statement.dialect.Quoter().QuoteTo(w.Builder, tableName); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if _, err := fmt.Fprint(w, " ("); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := statement.writeColumns(w, colNames); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if _, err := fmt.Fprint(w, ") VALUES ("); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for i, cols := range colMultiPlaces {
|
||||||
|
if _, err := fmt.Fprint(w, cols, ")"); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if i < len(colMultiPlaces)-1 {
|
||||||
|
if _, err := fmt.Fprint(w, ",("); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
|
@ -36,7 +36,7 @@ func (statement *Statement) writeJoins(w *builder.BytesWriter) error {
|
||||||
|
|
||||||
func (statement *Statement) writeJoin(buf *builder.BytesWriter, join join) error {
|
func (statement *Statement) writeJoin(buf *builder.BytesWriter, join join) error {
|
||||||
// write join operator
|
// write join operator
|
||||||
if _, err := fmt.Fprintf(buf, " %v JOIN", join.op); err != nil {
|
if _, err := fmt.Fprint(buf, " ", join.op, " JOIN"); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -230,7 +230,7 @@ func (statement *Statement) writeDistinct(w builder.Writer) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (statement *Statement) writeSelectColumns(w *builder.BytesWriter, columnStr string) error {
|
func (statement *Statement) writeSelectColumns(w *builder.BytesWriter, columnStr string) error {
|
||||||
if _, err := fmt.Fprintf(w, "SELECT "); err != nil {
|
if _, err := fmt.Fprintf(w, "SELECT"); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := statement.writeDistinct(w); err != nil {
|
if err := statement.writeDistinct(w); err != nil {
|
||||||
|
|
|
@ -12,6 +12,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"xorm.io/builder"
|
||||||
"xorm.io/xorm/convert"
|
"xorm.io/xorm/convert"
|
||||||
"xorm.io/xorm/dialects"
|
"xorm.io/xorm/dialects"
|
||||||
"xorm.io/xorm/internal/utils"
|
"xorm.io/xorm/internal/utils"
|
||||||
|
@ -156,14 +157,14 @@ func (session *Session) insertMultipleStruct(rowsSlicePtr interface{}) (int64, e
|
||||||
}
|
}
|
||||||
args = append(args, val)
|
args = append(args, val)
|
||||||
|
|
||||||
var colName = col.Name
|
colName := col.Name
|
||||||
session.afterClosures = append(session.afterClosures, func(bean interface{}) {
|
session.afterClosures = append(session.afterClosures, func(bean interface{}) {
|
||||||
col := table.GetColumn(colName)
|
col := table.GetColumn(colName)
|
||||||
setColumnTime(bean, col, t)
|
setColumnTime(bean, col, t)
|
||||||
})
|
})
|
||||||
} else if col.IsVersion && session.statement.CheckVersion {
|
} else if col.IsVersion && session.statement.CheckVersion {
|
||||||
args = append(args, 1)
|
args = append(args, 1)
|
||||||
var colName = col.Name
|
colName := col.Name
|
||||||
session.afterClosures = append(session.afterClosures, func(bean interface{}) {
|
session.afterClosures = append(session.afterClosures, func(bean interface{}) {
|
||||||
col := table.GetColumn(colName)
|
col := table.GetColumn(colName)
|
||||||
setColumnInt(bean, col, 1)
|
setColumnInt(bean, col, 1)
|
||||||
|
@ -186,24 +187,12 @@ func (session *Session) insertMultipleStruct(rowsSlicePtr interface{}) (int64, e
|
||||||
}
|
}
|
||||||
cleanupProcessorsClosures(&session.beforeClosures)
|
cleanupProcessorsClosures(&session.beforeClosures)
|
||||||
|
|
||||||
quoter := session.engine.dialect.Quoter()
|
w := builder.NewWriter()
|
||||||
var sql string
|
if err := session.statement.WriteInsertMultiple(w, tableName, colNames, colMultiPlaces); err != nil {
|
||||||
colStr := quoter.Join(colNames, ",")
|
return 0, err
|
||||||
if session.engine.dialect.URI().DBType == schemas.ORACLE {
|
|
||||||
temp := fmt.Sprintf(") INTO %s (%v) VALUES (",
|
|
||||||
quoter.Quote(tableName),
|
|
||||||
colStr)
|
|
||||||
sql = fmt.Sprintf("INSERT ALL INTO %s (%v) VALUES (%v) SELECT 1 FROM DUAL",
|
|
||||||
quoter.Quote(tableName),
|
|
||||||
colStr,
|
|
||||||
strings.Join(colMultiPlaces, temp))
|
|
||||||
} else {
|
|
||||||
sql = fmt.Sprintf("INSERT INTO %s (%v) VALUES (%v)",
|
|
||||||
quoter.Quote(tableName),
|
|
||||||
colStr,
|
|
||||||
strings.Join(colMultiPlaces, "),("))
|
|
||||||
}
|
}
|
||||||
res, err := session.exec(sql, args...)
|
|
||||||
|
res, err := session.exec(w.String(), args...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
@ -276,7 +265,7 @@ func (session *Session) insertStruct(bean interface{}) (int64, error) {
|
||||||
processor.BeforeInsert()
|
processor.BeforeInsert()
|
||||||
}
|
}
|
||||||
|
|
||||||
var tableName = session.statement.TableName()
|
tableName := session.statement.TableName()
|
||||||
table := session.statement.RefTable
|
table := session.statement.RefTable
|
||||||
|
|
||||||
colNames, args, err := session.genInsertColumns(bean)
|
colNames, args, err := session.genInsertColumns(bean)
|
||||||
|
@ -517,7 +506,7 @@ func (session *Session) genInsertColumns(bean interface{}) ([]string, []interfac
|
||||||
}
|
}
|
||||||
args = append(args, val)
|
args = append(args, val)
|
||||||
|
|
||||||
var colName = col.Name
|
colName := col.Name
|
||||||
session.afterClosures = append(session.afterClosures, func(bean interface{}) {
|
session.afterClosures = append(session.afterClosures, func(bean interface{}) {
|
||||||
col := table.GetColumn(colName)
|
col := table.GetColumn(colName)
|
||||||
setColumnTime(bean, col, t)
|
setColumnTime(bean, col, t)
|
||||||
|
@ -547,7 +536,7 @@ func (session *Session) insertMapInterface(m map[string]interface{}) (int64, err
|
||||||
return 0, ErrTableNotFound
|
return 0, ErrTableNotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
var columns = make([]string, 0, len(m))
|
columns := make([]string, 0, len(m))
|
||||||
exprs := session.statement.ExprColumns
|
exprs := session.statement.ExprColumns
|
||||||
for k := range m {
|
for k := range m {
|
||||||
if !exprs.IsColExist(k) {
|
if !exprs.IsColExist(k) {
|
||||||
|
@ -556,7 +545,7 @@ func (session *Session) insertMapInterface(m map[string]interface{}) (int64, err
|
||||||
}
|
}
|
||||||
sort.Strings(columns)
|
sort.Strings(columns)
|
||||||
|
|
||||||
var args = make([]interface{}, 0, len(m))
|
args := make([]interface{}, 0, len(m))
|
||||||
for _, colName := range columns {
|
for _, colName := range columns {
|
||||||
args = append(args, m[colName])
|
args = append(args, m[colName])
|
||||||
}
|
}
|
||||||
|
@ -574,7 +563,7 @@ func (session *Session) insertMultipleMapInterface(maps []map[string]interface{}
|
||||||
return 0, ErrTableNotFound
|
return 0, ErrTableNotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
var columns = make([]string, 0, len(maps[0]))
|
columns := make([]string, 0, len(maps[0]))
|
||||||
exprs := session.statement.ExprColumns
|
exprs := session.statement.ExprColumns
|
||||||
for k := range maps[0] {
|
for k := range maps[0] {
|
||||||
if !exprs.IsColExist(k) {
|
if !exprs.IsColExist(k) {
|
||||||
|
@ -583,9 +572,9 @@ func (session *Session) insertMultipleMapInterface(maps []map[string]interface{}
|
||||||
}
|
}
|
||||||
sort.Strings(columns)
|
sort.Strings(columns)
|
||||||
|
|
||||||
var argss = make([][]interface{}, 0, len(maps))
|
argss := make([][]interface{}, 0, len(maps))
|
||||||
for _, m := range maps {
|
for _, m := range maps {
|
||||||
var args = make([]interface{}, 0, len(m))
|
args := make([]interface{}, 0, len(m))
|
||||||
for _, colName := range columns {
|
for _, colName := range columns {
|
||||||
args = append(args, m[colName])
|
args = append(args, m[colName])
|
||||||
}
|
}
|
||||||
|
@ -605,7 +594,7 @@ func (session *Session) insertMapString(m map[string]string) (int64, error) {
|
||||||
return 0, ErrTableNotFound
|
return 0, ErrTableNotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
var columns = make([]string, 0, len(m))
|
columns := make([]string, 0, len(m))
|
||||||
exprs := session.statement.ExprColumns
|
exprs := session.statement.ExprColumns
|
||||||
for k := range m {
|
for k := range m {
|
||||||
if !exprs.IsColExist(k) {
|
if !exprs.IsColExist(k) {
|
||||||
|
@ -615,7 +604,7 @@ func (session *Session) insertMapString(m map[string]string) (int64, error) {
|
||||||
|
|
||||||
sort.Strings(columns)
|
sort.Strings(columns)
|
||||||
|
|
||||||
var args = make([]interface{}, 0, len(m))
|
args := make([]interface{}, 0, len(m))
|
||||||
for _, colName := range columns {
|
for _, colName := range columns {
|
||||||
args = append(args, m[colName])
|
args = append(args, m[colName])
|
||||||
}
|
}
|
||||||
|
@ -633,7 +622,7 @@ func (session *Session) insertMultipleMapString(maps []map[string]string) (int64
|
||||||
return 0, ErrTableNotFound
|
return 0, ErrTableNotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
var columns = make([]string, 0, len(maps[0]))
|
columns := make([]string, 0, len(maps[0]))
|
||||||
exprs := session.statement.ExprColumns
|
exprs := session.statement.ExprColumns
|
||||||
for k := range maps[0] {
|
for k := range maps[0] {
|
||||||
if !exprs.IsColExist(k) {
|
if !exprs.IsColExist(k) {
|
||||||
|
@ -642,9 +631,9 @@ func (session *Session) insertMultipleMapString(maps []map[string]string) (int64
|
||||||
}
|
}
|
||||||
sort.Strings(columns)
|
sort.Strings(columns)
|
||||||
|
|
||||||
var argss = make([][]interface{}, 0, len(maps))
|
argss := make([][]interface{}, 0, len(maps))
|
||||||
for _, m := range maps {
|
for _, m := range maps {
|
||||||
var args = make([]interface{}, 0, len(m))
|
args := make([]interface{}, 0, len(m))
|
||||||
for _, colName := range columns {
|
for _, colName := range columns {
|
||||||
args = append(args, m[colName])
|
args = append(args, m[colName])
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue