Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 4 additions & 5 deletions apply_index_sql.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package mssql

import (
"github.com/go-rel/rel"
"github.com/go-rel/rel/adapter/sql"
)

// ApplyIndexSQL builder.
Expand All @@ -12,7 +11,7 @@ type ApplyIndexSQL struct {

// Build sql query for index.
func (ais ApplyIndexSQL) Build(index rel.Index) string {
var buffer sql.Buffer
var buffer buffer

switch index.Op {
case rel.SchemaCreate:
Expand All @@ -28,7 +27,7 @@ func (ais ApplyIndexSQL) Build(index rel.Index) string {
}

// WriteCreateIndex to buffer
func (ais ApplyIndexSQL) WriteCreateIndex(buffer *sql.Buffer, index rel.Index) {
func (ais ApplyIndexSQL) WriteCreateIndex(buffer *buffer, index rel.Index) {
buffer.WriteString("CREATE ")
if index.Unique {
buffer.WriteString("UNIQUE NONCLUSTERED ")
Expand Down Expand Up @@ -65,7 +64,7 @@ func (ais ApplyIndexSQL) WriteCreateIndex(buffer *sql.Buffer, index rel.Index) {
}

// WriteDropIndex to buffer
func (ais ApplyIndexSQL) WriteDropIndex(buffer *sql.Buffer, index rel.Index) {
func (ais ApplyIndexSQL) WriteDropIndex(buffer *buffer, index rel.Index) {
buffer.WriteString("DROP INDEX ")

if index.Optional {
Expand All @@ -81,7 +80,7 @@ func (ais ApplyIndexSQL) WriteDropIndex(buffer *sql.Buffer, index rel.Index) {
}

// WriteOptions sql to buffer.
func (ais ApplyIndexSQL) WriteOptions(buffer *sql.Buffer, options string) {
func (ais ApplyIndexSQL) WriteOptions(buffer *buffer, options string) {
if options == "" {
return
}
Expand Down
17 changes: 8 additions & 9 deletions apply_table_sql.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import (
"strconv"

"github.com/go-rel/rel"
"github.com/go-rel/rel/adapter/sql"
)

type ColumnMapper func(*rel.Column) (string, int, int)
Expand All @@ -18,7 +17,7 @@ type ApplyTableSQL struct {

// Build SQL query for table creation and modification.
func (ats ApplyTableSQL) Build(table rel.Table) string {
var buffer sql.Buffer
var buffer buffer

switch table.Op {
case rel.SchemaCreate:
Expand All @@ -35,7 +34,7 @@ func (ats ApplyTableSQL) Build(table rel.Table) string {
}

// WriteCreateTable query to buffer.
func (ats ApplyTableSQL) WriteCreateTable(buffer *sql.Buffer, table rel.Table) {
func (ats ApplyTableSQL) WriteCreateTable(buffer *buffer, table rel.Table) {

if table.Optional {
buffer.WriteString("IF OBJECT_ID('")
Expand Down Expand Up @@ -67,7 +66,7 @@ func (ats ApplyTableSQL) WriteCreateTable(buffer *sql.Buffer, table rel.Table) {
}

// WriteAlterTable query to buffer.
func (ats ApplyTableSQL) WriteAlterTable(buffer *sql.Buffer, table rel.Table) {
func (ats ApplyTableSQL) WriteAlterTable(buffer *buffer, table rel.Table) {
for _, def := range table.Definitions {
if v, ok := def.(rel.Column); ok && v.Op == rel.SchemaRename {
buffer.WriteString("EXEC sp_rename ")
Expand Down Expand Up @@ -109,7 +108,7 @@ func (ats ApplyTableSQL) WriteAlterTable(buffer *sql.Buffer, table rel.Table) {
}

// WriteRenameTable query to buffer.
func (ats ApplyTableSQL) WriteRenameTable(buffer *sql.Buffer, table rel.Table) {
func (ats ApplyTableSQL) WriteRenameTable(buffer *buffer, table rel.Table) {
buffer.WriteString("EXEC sp_rename ")
buffer.WriteString(ats.fieldSQL.Build(table.Name))
buffer.WriteString(", ")
Expand All @@ -118,7 +117,7 @@ func (ats ApplyTableSQL) WriteRenameTable(buffer *sql.Buffer, table rel.Table) {
}

// WriteDropTable query to buffer.
func (ats ApplyTableSQL) WriteDropTable(buffer *sql.Buffer, table rel.Table) {
func (ats ApplyTableSQL) WriteDropTable(buffer *buffer, table rel.Table) {
if table.Optional {
buffer.WriteString("IF OBJECT_ID('")
buffer.WriteString(ats.fieldSQL.Build(table.Name))
Expand All @@ -131,7 +130,7 @@ func (ats ApplyTableSQL) WriteDropTable(buffer *sql.Buffer, table rel.Table) {
}

// WriteColumn definition to buffer.
func (ats ApplyTableSQL) WriteColumn(buffer *sql.Buffer, column rel.Column) {
func (ats ApplyTableSQL) WriteColumn(buffer *buffer, column rel.Column) {
var (
typ, m, n = ats.columnMapper(&column)
)
Expand Down Expand Up @@ -185,7 +184,7 @@ func (ats ApplyTableSQL) WriteColumn(buffer *sql.Buffer, column rel.Column) {
}

// WriteKey definition to buffer.
func (ats ApplyTableSQL) WriteKey(buffer *sql.Buffer, key rel.Key) {
func (ats ApplyTableSQL) WriteKey(buffer *buffer, key rel.Key) {
var (
typ = string(key.Type)
)
Expand Down Expand Up @@ -234,7 +233,7 @@ func (ats ApplyTableSQL) WriteKey(buffer *sql.Buffer, key rel.Key) {
}

// WriteOptions sql to buffer.
func (ats ApplyTableSQL) WriteOptions(buffer *sql.Buffer, options string) {
func (ats ApplyTableSQL) WriteOptions(buffer *buffer, options string) {
if options == "" {
return
}
Expand Down
37 changes: 37 additions & 0 deletions buffer.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package mssql

import (
"strconv"
"strings"
)

// buffer used to strings buffer and argument of the query.
type buffer struct {
strings.Builder
valueCount int
arguments []interface{}
}

// WriteValue query placeholder and append value to argument.
func (b *buffer) WriteValue(value interface{}) {
b.valueCount++
b.WriteString("@p")
b.WriteString(strconv.Itoa(b.valueCount))
b.arguments = append(b.arguments, value)
}

// AddArguments appends multiple arguments without writing placeholder query..
func (b *buffer) AddArguments(args ...interface{}) {
b.arguments = append(b.arguments, args...)
}

func (b buffer) Arguments() []interface{} {
return b.arguments
}

// Reset buffer.
func (b *buffer) Reset() {
b.Builder.Reset()
b.valueCount = 0
b.arguments = nil
}
5 changes: 2 additions & 3 deletions delete_sql.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package mssql

import (
"github.com/go-rel/rel"
"github.com/go-rel/rel/adapter/sql"
)

// DeleteSQL builder.
Expand All @@ -13,7 +12,7 @@ type DeleteSQL struct {

// Build SQL query and its arguments.
func (ds DeleteSQL) Build(table string, filter rel.FilterQuery) (string, []interface{}) {
var buffer sql.Buffer
var buffer buffer

buffer.WriteString("DELETE FROM ")
buffer.WriteString(ds.fieldSQL.Build(table))
Expand All @@ -25,7 +24,7 @@ func (ds DeleteSQL) Build(table string, filter rel.FilterQuery) (string, []inter

buffer.WriteString(";")

return buffer.String(), buffer.Arguments
return buffer.String(), buffer.Arguments()
}

// NewDeleteSQL builder.
Expand Down
38 changes: 16 additions & 22 deletions filter_sql.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,15 @@ package mssql

import (
"github.com/go-rel/rel"
"github.com/go-rel/rel/adapter/sql"
)

// FilterSQL builder.
type FilterSQL struct {
fieldSQL FieldSQL
placeholder string
fieldSQL FieldSQL
}

// Write SQL to buffer.
func (fs FilterSQL) Write(buffer *sql.Buffer, filter rel.FilterQuery) {
func (fs FilterSQL) Write(buffer *buffer, filter rel.FilterQuery) {
switch filter.Type {
case rel.FilterAndOp:
fs.BuildLogical(buffer, "AND", filter.Inner)
Expand Down Expand Up @@ -40,21 +38,19 @@ func (fs FilterSQL) Write(buffer *sql.Buffer, filter rel.FilterQuery) {
case rel.FilterLikeOp:
buffer.WriteString(fs.fieldSQL.Build(filter.Field))
buffer.WriteString(" LIKE ")
buffer.WriteString(fs.placeholder)
buffer.Append(filter.Value)
buffer.WriteValue(filter.Value)
case rel.FilterNotLikeOp:
buffer.WriteString(fs.fieldSQL.Build(filter.Field))
buffer.WriteString(" NOT LIKE ")
buffer.WriteString(fs.placeholder)
buffer.Append(filter.Value)
buffer.WriteValue(filter.Value)
case rel.FilterFragmentOp:
buffer.WriteString(filter.Field)
buffer.Append(filter.Value.([]interface{})...)
buffer.AddArguments(filter.Value.([]interface{})...)
}
}

// BuildLogical SQL to buffer.
func (fs FilterSQL) BuildLogical(buffer *sql.Buffer, op string, inner []rel.FilterQuery) {
func (fs FilterSQL) BuildLogical(buffer *buffer, op string, inner []rel.FilterQuery) {
var (
length = len(inner)
)
Expand All @@ -79,7 +75,7 @@ func (fs FilterSQL) BuildLogical(buffer *sql.Buffer, op string, inner []rel.Filt
}

// BuildComparison SQL to buffer.
func (fs FilterSQL) BuildComparison(buffer *sql.Buffer, filter rel.FilterQuery) {
func (fs FilterSQL) BuildComparison(buffer *buffer, filter rel.FilterQuery) {
buffer.WriteString(fs.fieldSQL.Build(filter.Field))

switch filter.Type {
Expand All @@ -97,12 +93,11 @@ func (fs FilterSQL) BuildComparison(buffer *sql.Buffer, filter rel.FilterQuery)
buffer.WriteString(">=")
}

buffer.WriteString(fs.placeholder)
buffer.Append(filter.Value)
buffer.WriteValue(filter.Value)
}

// BuildInclusion SQL to buffer.
func (fs FilterSQL) BuildInclusion(buffer *sql.Buffer, filter rel.FilterQuery) {
func (fs FilterSQL) BuildInclusion(buffer *buffer, filter rel.FilterQuery) {
var (
values = filter.Value.([]interface{})
)
Expand All @@ -115,19 +110,18 @@ func (fs FilterSQL) BuildInclusion(buffer *sql.Buffer, filter rel.FilterQuery) {
buffer.WriteString(" NOT IN (")
}

buffer.WriteString(fs.placeholder)
for i := 1; i <= len(values)-1; i++ {
buffer.WriteByte(',')
buffer.WriteString(fs.placeholder)
for i := 0; i < len(values); i++ {
if i > 0 {
buffer.WriteByte(',')
}
buffer.WriteValue(values[i])
}
buffer.WriteByte(')')
buffer.Append(values...)
}

// NewFilterSQL builder.
func NewFilterSQL(fieldSQL FieldSQL, placeholder string) FilterSQL {
func NewFilterSQL(fieldSQL FieldSQL) FilterSQL {
return FilterSQL{
fieldSQL: fieldSQL,
placeholder: placeholder,
fieldSQL: fieldSQL,
}
}
32 changes: 12 additions & 20 deletions insert_all_sql.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,17 @@ package mssql

import (
"github.com/go-rel/rel"
"github.com/go-rel/rel/adapter/sql"
)

// InsertAllSQL builder.
type InsertAllSQL struct {
fieldSQL FieldSQL
placeholder string
fieldSQL FieldSQL
}

// Build SQL string and its arguments.
func (ias InsertAllSQL) Build(table string, primaryField string, fields []string, bulkMutates []map[string]rel.Mutate) (string, []interface{}) {
var (
buffer sql.Buffer
fieldsCount = len(fields)
buffer buffer
mutatesCount = len(bulkMutates)
identityInsert = false
)
Expand All @@ -27,8 +24,6 @@ func (ias InsertAllSQL) Build(table string, primaryField string, fields []string
}
}

buffer.Arguments = make([]interface{}, 0, fieldsCount*mutatesCount)

if identityInsert {
buffer.WriteString("SET IDENTITY_INSERT ")
buffer.WriteString(ias.fieldSQL.Build(table))
Expand All @@ -40,11 +35,11 @@ func (ias InsertAllSQL) Build(table string, primaryField string, fields []string
buffer.WriteString(" (")

for i := range fields {
buffer.WriteString(ias.fieldSQL.Build(fields[i]))

if i < fieldsCount-1 {
if i > 0 {
buffer.WriteByte(',')
}

buffer.WriteString(ias.fieldSQL.Build(fields[i]))
}

buffer.WriteString(")")
Expand All @@ -60,16 +55,14 @@ func (ias InsertAllSQL) Build(table string, primaryField string, fields []string
buffer.WriteByte('(')

for j, field := range fields {
if j > 0 {
buffer.WriteByte(',')
}
if mut, ok := mutates[field]; ok && mut.Type == rel.ChangeSetOp {
buffer.WriteString(ias.placeholder)
buffer.Append(mut.Value)
buffer.WriteValue(mut.Value)
} else {
buffer.WriteString("DEFAULT")
}

if j < fieldsCount-1 {
buffer.WriteByte(',')
}
}

if i < mutatesCount-1 {
Expand All @@ -87,13 +80,12 @@ func (ias InsertAllSQL) Build(table string, primaryField string, fields []string
buffer.WriteString(" OFF; ")
}

return buffer.String(), buffer.Arguments
return buffer.String(), buffer.Arguments()
}

// NewInsertAllSQL builder.
func NewInsertAllSQL(fieldSQL FieldSQL, placeholder string) InsertAllSQL {
func NewInsertAllSQL(fieldSQL FieldSQL) InsertAllSQL {
return InsertAllSQL{
fieldSQL: fieldSQL,
placeholder: placeholder,
fieldSQL: fieldSQL,
}
}
Loading