2019-03-31 14:07:58 +02:00
|
|
|
package sqlbuilder
|
2019-04-14 17:55:10 +02:00
|
|
|
|
2019-04-20 19:49:29 +02:00
|
|
|
import (
|
|
|
|
|
"database/sql"
|
2019-04-29 14:39:48 +02:00
|
|
|
"errors"
|
2019-04-20 19:49:29 +02:00
|
|
|
"github.com/sub0zero/go-sqlbuilder/sqlbuilder/execution"
|
|
|
|
|
"github.com/sub0zero/go-sqlbuilder/types"
|
|
|
|
|
)
|
2019-04-14 17:55:10 +02:00
|
|
|
|
2019-04-29 14:39:48 +02:00
|
|
|
func serializeOrderByClauseList(orderByClauses []OrderByClause, out *queryData) error {
|
|
|
|
|
|
|
|
|
|
for i, value := range orderByClauses {
|
2019-04-14 17:55:10 +02:00
|
|
|
if i > 0 {
|
2019-04-29 14:39:48 +02:00
|
|
|
out.WriteString(", ")
|
2019-04-14 17:55:10 +02:00
|
|
|
}
|
|
|
|
|
|
2019-04-29 14:39:48 +02:00
|
|
|
err := value.Serialize(out)
|
2019-04-14 17:55:10 +02:00
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2019-04-29 14:39:48 +02:00
|
|
|
func serializeClauseList(clauses []Clause, out *queryData) (err error) {
|
|
|
|
|
|
|
|
|
|
for i, c := range clauses {
|
2019-04-14 17:55:10 +02:00
|
|
|
if i > 0 {
|
2019-04-29 14:39:48 +02:00
|
|
|
out.WriteString(", ")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if c == nil {
|
|
|
|
|
return errors.New("nil clause.")
|
2019-04-14 17:55:10 +02:00
|
|
|
}
|
|
|
|
|
|
2019-04-29 14:39:48 +02:00
|
|
|
if err = c.Serialize(out); err != nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func serializeExpressionList(expressions []Expression, separator string, out *queryData) error {
|
|
|
|
|
|
|
|
|
|
for i, value := range expressions {
|
|
|
|
|
if i > 0 {
|
|
|
|
|
out.WriteString(separator)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
err := value.Serialize(out)
|
2019-04-14 17:55:10 +02:00
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
2019-04-20 19:49:29 +02:00
|
|
|
|
2019-04-29 14:39:48 +02:00
|
|
|
func serializeProjectionList(projections []Projection, out *queryData) error {
|
|
|
|
|
for i, col := range projections {
|
|
|
|
|
if i > 0 {
|
2019-05-03 12:51:57 +02:00
|
|
|
out.WriteString(", ")
|
2019-04-29 14:39:48 +02:00
|
|
|
}
|
|
|
|
|
if col == nil {
|
|
|
|
|
return errors.New("Projection expression is nil.")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := col.SerializeForProjection(out); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func serializeColumnList(columns []Column, out *queryData) error {
|
|
|
|
|
for i, col := range columns {
|
|
|
|
|
if i > 0 {
|
|
|
|
|
out.WriteByte(',')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if col == nil {
|
|
|
|
|
return errors.New("nil column in columns list.")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
out.WriteString(col.Name())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2019-04-20 19:49:29 +02:00
|
|
|
func Query(statement Statement, db types.Db, destination interface{}) error {
|
2019-04-29 14:39:48 +02:00
|
|
|
query, args, err := statement.Sql()
|
2019-04-20 19:49:29 +02:00
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2019-04-29 14:39:48 +02:00
|
|
|
return execution.Query(db, query, args, destination)
|
2019-04-20 19:49:29 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Execute(statement Statement, db types.Db) (res sql.Result, err error) {
|
2019-04-29 14:39:48 +02:00
|
|
|
query, args, err := statement.Sql()
|
2019-04-20 19:49:29 +02:00
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2019-04-29 14:39:48 +02:00
|
|
|
return db.Exec(query, args...)
|
2019-04-20 19:49:29 +02:00
|
|
|
}
|