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,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

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