Update sqlbuilder for sqlite
This commit is contained in:
parent
eb43b539f9
commit
d7ac078e4c
@ -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
|
||||||
}()
|
}()
|
||||||
|
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 (
|
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
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user