Update sqlbuilder for sqlite
This commit is contained in:
		
							parent
							
								
									eb43b539f9
								
							
						
					
					
						commit
						d7ac078e4c
					
				@ -12,17 +12,19 @@ type ConditionInterface interface {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// BuildConditions build conditions
 | 
			
		||||
func BuildConditions(tx *gorm.DB, conds []gorm.ConditionInterface) chan *Builder {
 | 
			
		||||
func BuildConditions(tx *gorm.DB) chan *Builder {
 | 
			
		||||
	queryChan := make(chan *Builder)
 | 
			
		||||
 | 
			
		||||
	go func() {
 | 
			
		||||
		builder := &Builder{}
 | 
			
		||||
 | 
			
		||||
		for i, c := range conds {
 | 
			
		||||
			if i > 0 {
 | 
			
		||||
				builder.SQL.WriteString(" AND ")
 | 
			
		||||
		if len(tx.Statement.Conditions) > 0 {
 | 
			
		||||
			builder.SQL.WriteString(" WHERE ")
 | 
			
		||||
			for i, c := range tx.Statement.Conditions {
 | 
			
		||||
				if i > 0 {
 | 
			
		||||
					builder.SQL.WriteString(" AND ")
 | 
			
		||||
				}
 | 
			
		||||
				buildCondition(tx, c, builder)
 | 
			
		||||
			}
 | 
			
		||||
			buildCondition(tx, c, builder)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		queryChan <- builder
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										25
									
								
								dialects/common/sqlbuilder/join.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								dialects/common/sqlbuilder/join.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,25 @@
 | 
			
		||||
package sqlbuilder
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/jinzhu/gorm"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// BuildJoinCondition build join condition
 | 
			
		||||
func BuildJoinCondition(tx *gorm.DB) chan *Builder {
 | 
			
		||||
	joinChan := make(chan *Builder)
 | 
			
		||||
 | 
			
		||||
	go func() {
 | 
			
		||||
		builder := &Builder{}
 | 
			
		||||
		for _, join := range tx.Statement.Joins {
 | 
			
		||||
			if join.Table == "" {
 | 
			
		||||
				for _, cond := range join.Conditions {
 | 
			
		||||
					buildCondition(tx, cond, builder)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			// FIXME fix join builder
 | 
			
		||||
		}
 | 
			
		||||
		joinChan <- builder
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	return joinChan
 | 
			
		||||
}
 | 
			
		||||
@ -104,7 +104,8 @@ func (dialect *Dialect) Query(tx *gorm.DB) (err error) {
 | 
			
		||||
	var (
 | 
			
		||||
		args           []interface{}
 | 
			
		||||
		tableNameChan  = sqlbuilder.GetTable(tx)
 | 
			
		||||
		conditionsChan = sqlbuilder.BuildConditions(tx, tx.Statement.Conditions)
 | 
			
		||||
		joinChan       = sqlbuilder.BuildJoinCondition(tx)
 | 
			
		||||
		conditionsChan = sqlbuilder.BuildConditions(tx)
 | 
			
		||||
		groupChan      = sqlbuilder.BuildGroupCondition(tx)
 | 
			
		||||
		orderChan      = sqlbuilder.BuildOrderCondition(tx)
 | 
			
		||||
		limitChan      = sqlbuilder.BuildLimitCondition(tx)
 | 
			
		||||
@ -131,17 +132,12 @@ func (dialect *Dialect) Query(tx *gorm.DB) (err error) {
 | 
			
		||||
	s.WriteString(dialect.Quote(<-tableNameChan))
 | 
			
		||||
 | 
			
		||||
	// Join SQL
 | 
			
		||||
	for _, join := range tx.Statement.Joins {
 | 
			
		||||
		if join.Table == "" {
 | 
			
		||||
			builder := <-sqlbuilder.BuildConditions(tx, join.Conditions)
 | 
			
		||||
			_, err = builder.SQL.WriteTo(s)
 | 
			
		||||
			args = append(args, builder.Args...)
 | 
			
		||||
		}
 | 
			
		||||
		// FIXME
 | 
			
		||||
	if builder := <-joinChan; builder != nil {
 | 
			
		||||
		_, err = builder.SQL.WriteTo(s)
 | 
			
		||||
		args = append(args, builder.Args)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(tx.Statement.Conditions) > 0 {
 | 
			
		||||
		s.WriteString(" WHERE ")
 | 
			
		||||
		builder := <-conditionsChan
 | 
			
		||||
		_, err = builder.SQL.WriteTo(s)
 | 
			
		||||
		args = append(args, builder.Args...)
 | 
			
		||||
@ -165,11 +161,75 @@ func (dialect *Dialect) Query(tx *gorm.DB) (err error) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Update update
 | 
			
		||||
func (*Dialect) Update(tx *gorm.DB) error {
 | 
			
		||||
	return nil
 | 
			
		||||
func (dialect *Dialect) Update(tx *gorm.DB) (err error) {
 | 
			
		||||
	var (
 | 
			
		||||
		args            []interface{}
 | 
			
		||||
		tableNameChan   = sqlbuilder.GetTable(tx)
 | 
			
		||||
		conditionsChan  = sqlbuilder.BuildConditions(tx)
 | 
			
		||||
		assignmentsChan = sqlbuilder.GetAssignmentFields(tx)
 | 
			
		||||
		orderChan       = sqlbuilder.BuildOrderCondition(tx)
 | 
			
		||||
		limitChan       = sqlbuilder.BuildLimitCondition(tx)
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	s := bytes.NewBufferString("UPDATE ")
 | 
			
		||||
	s.WriteString(dialect.Quote(<-tableNameChan))
 | 
			
		||||
	s.WriteString(" SET ")
 | 
			
		||||
	if assignments := <-assignmentsChan; len(assignments) > 0 {
 | 
			
		||||
		for _, fields := range assignments {
 | 
			
		||||
			for _, field := range fields {
 | 
			
		||||
				s.WriteString(dialect.Quote(field.Field.DBName))
 | 
			
		||||
				s.WriteString(" = ?")
 | 
			
		||||
				args = append(args, field.Value.Interface())
 | 
			
		||||
			}
 | 
			
		||||
			// TODO update with multiple records
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(tx.Statement.Conditions) > 0 {
 | 
			
		||||
		builder := <-conditionsChan
 | 
			
		||||
		_, err = builder.SQL.WriteTo(s)
 | 
			
		||||
		args = append(args, builder.Args...)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if builder := <-orderChan; builder != nil {
 | 
			
		||||
		_, err = builder.SQL.WriteTo(s)
 | 
			
		||||
		args = append(args, builder.Args)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if builder := <-limitChan; builder != nil {
 | 
			
		||||
		_, err = builder.SQL.WriteTo(s)
 | 
			
		||||
		args = append(args, builder.Args)
 | 
			
		||||
	}
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Delete delete
 | 
			
		||||
func (*Dialect) Delete(tx *gorm.DB) error {
 | 
			
		||||
	return nil
 | 
			
		||||
func (dialect *Dialect) Delete(tx *gorm.DB) (err error) {
 | 
			
		||||
	var (
 | 
			
		||||
		args           []interface{}
 | 
			
		||||
		tableNameChan  = sqlbuilder.GetTable(tx)
 | 
			
		||||
		conditionsChan = sqlbuilder.BuildConditions(tx)
 | 
			
		||||
		orderChan      = sqlbuilder.BuildOrderCondition(tx)
 | 
			
		||||
		limitChan      = sqlbuilder.BuildLimitCondition(tx)
 | 
			
		||||
	)
 | 
			
		||||
	s := bytes.NewBufferString("DELETE FROM ")
 | 
			
		||||
	s.WriteString(dialect.Quote(<-tableNameChan))
 | 
			
		||||
 | 
			
		||||
	if len(tx.Statement.Conditions) > 0 {
 | 
			
		||||
		builder := <-conditionsChan
 | 
			
		||||
		_, err = builder.SQL.WriteTo(s)
 | 
			
		||||
		args = append(args, builder.Args...)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if builder := <-orderChan; builder != nil {
 | 
			
		||||
		_, err = builder.SQL.WriteTo(s)
 | 
			
		||||
		args = append(args, builder.Args)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if builder := <-limitChan; builder != nil {
 | 
			
		||||
		_, err = builder.SQL.WriteTo(s)
 | 
			
		||||
		args = append(args, builder.Args)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user