Update sqlbuilder for sqlite

This commit is contained in:
Jinzhu 2018-03-16 18:29:11 +08:00
parent eb43b539f9
commit d7ac078e4c
3 changed files with 106 additions and 19 deletions

View File

@ -12,18 +12,20 @@ type ConditionInterface interface {
} }
// BuildConditions build conditions // BuildConditions build conditions
func BuildConditions(tx *gorm.DB, conds []gorm.ConditionInterface) chan *Builder { func BuildConditions(tx *gorm.DB) chan *Builder {
queryChan := make(chan *Builder) queryChan := make(chan *Builder)
go func() { go func() {
builder := &Builder{} builder := &Builder{}
if len(tx.Statement.Conditions) > 0 {
for i, c := range conds { builder.SQL.WriteString(" WHERE ")
for i, c := range tx.Statement.Conditions {
if i > 0 { if i > 0 {
builder.SQL.WriteString(" AND ") builder.SQL.WriteString(" AND ")
} }
buildCondition(tx, c, builder) buildCondition(tx, c, builder)
} }
}
queryChan <- builder queryChan <- builder
}() }()

View 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
}

View File

@ -104,7 +104,8 @@ func (dialect *Dialect) Query(tx *gorm.DB) (err error) {
var ( var (
args []interface{} args []interface{}
tableNameChan = sqlbuilder.GetTable(tx) tableNameChan = sqlbuilder.GetTable(tx)
conditionsChan = sqlbuilder.BuildConditions(tx, tx.Statement.Conditions) joinChan = sqlbuilder.BuildJoinCondition(tx)
conditionsChan = sqlbuilder.BuildConditions(tx)
groupChan = sqlbuilder.BuildGroupCondition(tx) groupChan = sqlbuilder.BuildGroupCondition(tx)
orderChan = sqlbuilder.BuildOrderCondition(tx) orderChan = sqlbuilder.BuildOrderCondition(tx)
limitChan = sqlbuilder.BuildLimitCondition(tx) limitChan = sqlbuilder.BuildLimitCondition(tx)
@ -131,17 +132,12 @@ func (dialect *Dialect) Query(tx *gorm.DB) (err error) {
s.WriteString(dialect.Quote(<-tableNameChan)) s.WriteString(dialect.Quote(<-tableNameChan))
// Join SQL // Join SQL
for _, join := range tx.Statement.Joins { if builder := <-joinChan; builder != nil {
if join.Table == "" {
builder := <-sqlbuilder.BuildConditions(tx, join.Conditions)
_, err = builder.SQL.WriteTo(s) _, err = builder.SQL.WriteTo(s)
args = append(args, builder.Args...) args = append(args, builder.Args)
}
// FIXME
} }
if len(tx.Statement.Conditions) > 0 { if len(tx.Statement.Conditions) > 0 {
s.WriteString(" WHERE ")
builder := <-conditionsChan builder := <-conditionsChan
_, err = builder.SQL.WriteTo(s) _, err = builder.SQL.WriteTo(s)
args = append(args, builder.Args...) args = append(args, builder.Args...)
@ -165,11 +161,75 @@ func (dialect *Dialect) Query(tx *gorm.DB) (err error) {
} }
// Update update // Update update
func (*Dialect) Update(tx *gorm.DB) error { func (dialect *Dialect) Update(tx *gorm.DB) (err error) {
return nil 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 // Delete delete
func (*Dialect) Delete(tx *gorm.DB) error { func (dialect *Dialect) Delete(tx *gorm.DB) (err error) {
return nil 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
} }