mirror of https://github.com/lqs/sqlingo
149 lines
2.6 KiB
Go
149 lines
2.6 KiB
Go
package sqlingo
|
|
|
|
import (
|
|
"fmt"
|
|
"runtime"
|
|
"strings"
|
|
)
|
|
|
|
type Model interface {
|
|
GetTable() Table
|
|
GetValues() []interface{}
|
|
}
|
|
|
|
type Assignment interface {
|
|
GetSQL() string
|
|
}
|
|
|
|
type assignment struct {
|
|
Assignment
|
|
field Field
|
|
value interface{}
|
|
}
|
|
|
|
func (a *assignment) GetSQL() string {
|
|
value, _ := getSQLFromWhatever(a.value)
|
|
return a.field.GetSQL() + " = " + value
|
|
}
|
|
|
|
func Raw(sql string) UnknownExpression {
|
|
return &expression{sql: sql, priority: 99}
|
|
}
|
|
|
|
func And(expressions ...BooleanExpression) (result BooleanExpression) {
|
|
if len(expressions) == 0 {
|
|
result = &expression{sql: "TRUE"}
|
|
return
|
|
}
|
|
for i, condition := range expressions {
|
|
if i == 0 {
|
|
result = condition
|
|
} else {
|
|
result = result.And(condition)
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func Or(expressions ...BooleanExpression) (result BooleanExpression) {
|
|
if len(expressions) == 0 {
|
|
result = &expression{sql: "FALSE"}
|
|
return
|
|
}
|
|
for i, condition := range expressions {
|
|
if i == 0 {
|
|
result = condition
|
|
} else {
|
|
result = result.Or(condition)
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func Function(name string, args ...Expression) Expression {
|
|
return &expression{sql: name + "(" + commaExpressions(args) + ")"}
|
|
}
|
|
|
|
func If(predicate Expression, trueValue Expression, falseValue Expression) (result Expression) {
|
|
return Function("IF", predicate, trueValue, falseValue)
|
|
}
|
|
|
|
func commaFields(fields []Field) string {
|
|
sql := ""
|
|
for i, item := range fields {
|
|
if i > 0 {
|
|
sql += ", "
|
|
}
|
|
sql += item.GetSQL()
|
|
}
|
|
return sql
|
|
}
|
|
|
|
func commaExpressions(expressions []Expression) string {
|
|
sql := ""
|
|
for i, item := range expressions {
|
|
if i > 0 {
|
|
sql += ", "
|
|
}
|
|
sql += item.GetSQL()
|
|
}
|
|
return sql
|
|
}
|
|
|
|
func commaValues(values []interface{}) string {
|
|
sql := ""
|
|
for i, item := range values {
|
|
if i > 0 {
|
|
sql += ", "
|
|
}
|
|
value, _ := getSQLFromWhatever(item)
|
|
sql += value
|
|
}
|
|
return sql
|
|
}
|
|
|
|
func commaAssignments(assignments []assignment) string {
|
|
sql := ""
|
|
for i, item := range assignments {
|
|
if i > 0 {
|
|
sql += ", "
|
|
}
|
|
sql += item.GetSQL()
|
|
}
|
|
return sql
|
|
}
|
|
|
|
func commaOrderBys(orderBys []OrderBy) string {
|
|
sql := ""
|
|
for i, item := range orderBys {
|
|
if i > 0 {
|
|
sql += ", "
|
|
}
|
|
sql += item.GetSQL()
|
|
}
|
|
return sql
|
|
}
|
|
|
|
func getSQLForName(name string) string {
|
|
// TODO: check reserved words
|
|
return "`" + name + "`"
|
|
}
|
|
|
|
func getCallerInfo() string {
|
|
for i := 0; true; i++ {
|
|
_, file, line, ok := runtime.Caller(i)
|
|
if !ok {
|
|
break
|
|
}
|
|
segs := strings.Split(file, "/")
|
|
name := segs[len(segs)-1]
|
|
switch name {
|
|
case "common.go", "select.go", "insert.go", "update.go", "delete.go":
|
|
continue
|
|
default:
|
|
return fmt.Sprintf("/* %s:%d */ ", name, line)
|
|
}
|
|
}
|
|
return ""
|
|
}
|