mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-29 10:57:44 +09:00 
			
		
		
		
	Retry create issue to cope with duplicate keys (#7898)
* Retry create issue to cope with duplicate keys * Use .SetExpr().Where().Insert()
This commit is contained in:
		
				
					committed by
					
						 techknowlogick
						techknowlogick
					
				
			
			
				
	
			
			
			
						parent
						
							541fab196f
						
					
				
				
					commit
					5fe2ec264f
				
			
							
								
								
									
										136
									
								
								vendor/github.com/go-xorm/xorm/session_insert.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										136
									
								
								vendor/github.com/go-xorm/xorm/session_insert.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -12,6 +12,7 @@ import ( | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
|  | ||||
| 	"xorm.io/builder" | ||||
| 	"xorm.io/core" | ||||
| ) | ||||
|  | ||||
| @@ -242,23 +243,17 @@ func (session *Session) innerInsertMulti(rowsSlicePtr interface{}) (int64, error | ||||
|  | ||||
| 	var sql string | ||||
| 	if session.engine.dialect.DBType() == core.ORACLE { | ||||
| 		temp := fmt.Sprintf(") INTO %s (%v%v%v) VALUES (", | ||||
| 		temp := fmt.Sprintf(") INTO %s (%v) VALUES (", | ||||
| 			session.engine.Quote(tableName), | ||||
| 			session.engine.QuoteStr(), | ||||
| 			strings.Join(colNames, session.engine.QuoteStr()+", "+session.engine.QuoteStr()), | ||||
| 			session.engine.QuoteStr()) | ||||
| 		sql = fmt.Sprintf("INSERT ALL INTO %s (%v%v%v) VALUES (%v) SELECT 1 FROM DUAL", | ||||
| 			quoteColumns(colNames, session.engine.Quote, ",")) | ||||
| 		sql = fmt.Sprintf("INSERT ALL INTO %s (%v) VALUES (%v) SELECT 1 FROM DUAL", | ||||
| 			session.engine.Quote(tableName), | ||||
| 			session.engine.QuoteStr(), | ||||
| 			strings.Join(colNames, session.engine.QuoteStr()+", "+session.engine.QuoteStr()), | ||||
| 			session.engine.QuoteStr(), | ||||
| 			quoteColumns(colNames, session.engine.Quote, ","), | ||||
| 			strings.Join(colMultiPlaces, temp)) | ||||
| 	} else { | ||||
| 		sql = fmt.Sprintf("INSERT INTO %s (%v%v%v) VALUES (%v)", | ||||
| 		sql = fmt.Sprintf("INSERT INTO %s (%v) VALUES (%v)", | ||||
| 			session.engine.Quote(tableName), | ||||
| 			session.engine.QuoteStr(), | ||||
| 			strings.Join(colNames, session.engine.QuoteStr()+", "+session.engine.QuoteStr()), | ||||
| 			session.engine.QuoteStr(), | ||||
| 			quoteColumns(colNames, session.engine.Quote, ","), | ||||
| 			strings.Join(colMultiPlaces, "),(")) | ||||
| 	} | ||||
| 	res, err := session.exec(sql, args...) | ||||
| @@ -351,7 +346,7 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) { | ||||
| 	for _, v := range exprColumns { | ||||
| 		// remove the expr columns | ||||
| 		for i, colName := range colNames { | ||||
| 			if colName == v.colName { | ||||
| 			if colName == strings.Trim(v.colName, "`") { | ||||
| 				colNames = append(colNames[:i], colNames[i+1:]...) | ||||
| 				args = append(args[:i], args[i+1:]...) | ||||
| 			} | ||||
| @@ -377,14 +372,30 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) { | ||||
| 	if session.engine.dialect.DBType() == core.MSSQL && len(table.AutoIncrement) > 0 { | ||||
| 		output = fmt.Sprintf(" OUTPUT Inserted.%s", table.AutoIncrement) | ||||
| 	} | ||||
|  | ||||
| 	if len(colPlaces) > 0 { | ||||
| 		sqlStr = fmt.Sprintf("INSERT INTO %s (%v%v%v)%s VALUES (%v)", | ||||
| 			session.engine.Quote(tableName), | ||||
| 			session.engine.QuoteStr(), | ||||
| 			strings.Join(colNames, session.engine.Quote(", ")), | ||||
| 			session.engine.QuoteStr(), | ||||
| 			output, | ||||
| 			colPlaces) | ||||
| 		if session.statement.cond.IsValid() { | ||||
| 			condSQL, condArgs, err := builder.ToSQL(session.statement.cond) | ||||
| 			if err != nil { | ||||
| 				return 0, err | ||||
| 			} | ||||
|  | ||||
| 			sqlStr = fmt.Sprintf("INSERT INTO %s (%v)%s SELECT %v FROM %v WHERE %v", | ||||
| 				session.engine.Quote(tableName), | ||||
| 				quoteColumns(colNames, session.engine.Quote, ","), | ||||
| 				output, | ||||
| 				colPlaces, | ||||
| 				session.engine.Quote(tableName), | ||||
| 				condSQL, | ||||
| 			) | ||||
| 			args = append(args, condArgs...) | ||||
| 		} else { | ||||
| 			sqlStr = fmt.Sprintf("INSERT INTO %s (%v)%s VALUES (%v)", | ||||
| 				session.engine.Quote(tableName), | ||||
| 				quoteColumns(colNames, session.engine.Quote, ","), | ||||
| 				output, | ||||
| 				colPlaces) | ||||
| 		} | ||||
| 	} else { | ||||
| 		if session.engine.dialect.DBType() == core.MYSQL { | ||||
| 			sqlStr = fmt.Sprintf("INSERT INTO %s VALUES ()", session.engine.Quote(tableName)) | ||||
| @@ -671,6 +682,11 @@ func (session *Session) insertMapInterface(m map[string]interface{}) (int64, err | ||||
| 		return 0, ErrParamsType | ||||
| 	} | ||||
|  | ||||
| 	tableName := session.statement.TableName() | ||||
| 	if len(tableName) <= 0 { | ||||
| 		return 0, ErrTableNotFound | ||||
| 	} | ||||
|  | ||||
| 	var columns = make([]string, 0, len(m)) | ||||
| 	for k := range m { | ||||
| 		columns = append(columns, k) | ||||
| @@ -678,19 +694,40 @@ func (session *Session) insertMapInterface(m map[string]interface{}) (int64, err | ||||
| 	sort.Strings(columns) | ||||
|  | ||||
| 	qm := strings.Repeat("?,", len(columns)) | ||||
| 	qm = "(" + qm[:len(qm)-1] + ")" | ||||
|  | ||||
| 	tableName := session.statement.TableName() | ||||
| 	if len(tableName) <= 0 { | ||||
| 		return 0, ErrTableNotFound | ||||
| 	} | ||||
|  | ||||
| 	var sql = fmt.Sprintf("INSERT INTO %s (`%s`) VALUES %s", session.engine.Quote(tableName), strings.Join(columns, "`,`"), qm) | ||||
| 	var args = make([]interface{}, 0, len(m)) | ||||
| 	for _, colName := range columns { | ||||
| 		args = append(args, m[colName]) | ||||
| 	} | ||||
|  | ||||
| 	// insert expr columns, override if exists | ||||
| 	exprColumns := session.statement.getExpr() | ||||
| 	for _, col := range exprColumns { | ||||
| 		columns = append(columns, strings.Trim(col.colName, "`")) | ||||
| 		qm = qm + col.expr + "," | ||||
| 	} | ||||
|  | ||||
| 	qm = qm[:len(qm)-1] | ||||
|  | ||||
| 	var sql string | ||||
|  | ||||
| 	if session.statement.cond.IsValid() { | ||||
| 		condSQL, condArgs, err := builder.ToSQL(session.statement.cond) | ||||
| 		if err != nil { | ||||
| 			return 0, err | ||||
| 		} | ||||
| 		sql = fmt.Sprintf("INSERT INTO %s (`%s`) SELECT %s FROM %s WHERE %s", | ||||
| 			session.engine.Quote(tableName), | ||||
| 			strings.Join(columns, "`,`"), | ||||
| 			qm, | ||||
| 			session.engine.Quote(tableName), | ||||
| 			condSQL, | ||||
| 		) | ||||
| 		args = append(args, condArgs...) | ||||
| 	} else { | ||||
| 		sql = fmt.Sprintf("INSERT INTO %s (`%s`) VALUES (%s)", session.engine.Quote(tableName), strings.Join(columns, "`,`"), qm) | ||||
| 	} | ||||
|  | ||||
| 	if err := session.cacheInsert(tableName); err != nil { | ||||
| 		return 0, err | ||||
| 	} | ||||
| @@ -711,26 +748,53 @@ func (session *Session) insertMapString(m map[string]string) (int64, error) { | ||||
| 		return 0, ErrParamsType | ||||
| 	} | ||||
|  | ||||
| 	tableName := session.statement.TableName() | ||||
| 	if len(tableName) <= 0 { | ||||
| 		return 0, ErrTableNotFound | ||||
| 	} | ||||
|  | ||||
| 	var columns = make([]string, 0, len(m)) | ||||
| 	for k := range m { | ||||
| 		columns = append(columns, k) | ||||
| 	} | ||||
| 	sort.Strings(columns) | ||||
|  | ||||
| 	qm := strings.Repeat("?,", len(columns)) | ||||
| 	qm = "(" + qm[:len(qm)-1] + ")" | ||||
|  | ||||
| 	tableName := session.statement.TableName() | ||||
| 	if len(tableName) <= 0 { | ||||
| 		return 0, ErrTableNotFound | ||||
| 	} | ||||
|  | ||||
| 	var sql = fmt.Sprintf("INSERT INTO %s (`%s`) VALUES %s", session.engine.Quote(tableName), strings.Join(columns, "`,`"), qm) | ||||
| 	var args = make([]interface{}, 0, len(m)) | ||||
| 	for _, colName := range columns { | ||||
| 		args = append(args, m[colName]) | ||||
| 	} | ||||
|  | ||||
| 	qm := strings.Repeat("?,", len(columns)) | ||||
|  | ||||
| 	// insert expr columns, override if exists | ||||
| 	exprColumns := session.statement.getExpr() | ||||
| 	for _, col := range exprColumns { | ||||
| 		columns = append(columns, strings.Trim(col.colName, "`")) | ||||
| 		qm = qm + col.expr + "," | ||||
| 	} | ||||
|  | ||||
| 	qm = qm[:len(qm)-1] | ||||
|  | ||||
| 	var sql string | ||||
|  | ||||
| 	if session.statement.cond.IsValid() { | ||||
| 		qm = "(" + qm[:len(qm)-1] + ")" | ||||
| 		condSQL, condArgs, err := builder.ToSQL(session.statement.cond) | ||||
| 		if err != nil { | ||||
| 			return 0, err | ||||
| 		} | ||||
| 		sql = fmt.Sprintf("INSERT INTO %s (`%s`) SELECT %s FROM %s WHERE %s", | ||||
| 			session.engine.Quote(tableName), | ||||
| 			strings.Join(columns, "`,`"), | ||||
| 			qm, | ||||
| 			session.engine.Quote(tableName), | ||||
| 			condSQL, | ||||
| 		) | ||||
| 		args = append(args, condArgs...) | ||||
| 	} else { | ||||
| 		sql = fmt.Sprintf("INSERT INTO %s (`%s`) VALUES (%s)", session.engine.Quote(tableName), strings.Join(columns, "`,`"), qm) | ||||
| 	} | ||||
|  | ||||
| 	if err := session.cacheInsert(tableName); err != nil { | ||||
| 		return 0, err | ||||
| 	} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user