From a44c4bd5d8d7cec8bf3bfc868d926b06757bcb3f Mon Sep 17 00:00:00 2001 From: Muhammad Surya Date: Wed, 31 Mar 2021 01:05:19 +0900 Subject: [PATCH] Implement named args and use sqlserver driver instead of mssql --- apply_index_sql.go | 9 ++++----- apply_table_sql.go | 17 ++++++++--------- buffer.go | 37 +++++++++++++++++++++++++++++++++++++ delete_sql.go | 5 ++--- filter_sql.go | 38 ++++++++++++++++---------------------- insert_all_sql.go | 32 ++++++++++++-------------------- insert_sql.go | 41 ++++++++++++++++++----------------------- mssql.go | 11 +++++------ query_sql.go | 25 ++++++++++++------------- update_sql.go | 25 ++++++++++--------------- 10 files changed, 124 insertions(+), 116 deletions(-) create mode 100644 buffer.go diff --git a/apply_index_sql.go b/apply_index_sql.go index 8824271..196872c 100644 --- a/apply_index_sql.go +++ b/apply_index_sql.go @@ -2,7 +2,6 @@ package mssql import ( "github.com/go-rel/rel" - "github.com/go-rel/rel/adapter/sql" ) // ApplyIndexSQL builder. @@ -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: @@ -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 ") @@ -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 { @@ -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 } diff --git a/apply_table_sql.go b/apply_table_sql.go index 534b26e..59d90cd 100644 --- a/apply_table_sql.go +++ b/apply_table_sql.go @@ -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) @@ -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: @@ -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('") @@ -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 ") @@ -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(", ") @@ -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)) @@ -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) ) @@ -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) ) @@ -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 } diff --git a/buffer.go b/buffer.go new file mode 100644 index 0000000..a03bb6f --- /dev/null +++ b/buffer.go @@ -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 +} diff --git a/delete_sql.go b/delete_sql.go index db97a32..cc41ce6 100644 --- a/delete_sql.go +++ b/delete_sql.go @@ -2,7 +2,6 @@ package mssql import ( "github.com/go-rel/rel" - "github.com/go-rel/rel/adapter/sql" ) // DeleteSQL builder. @@ -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)) @@ -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. diff --git a/filter_sql.go b/filter_sql.go index b7642c7..4f9e361 100644 --- a/filter_sql.go +++ b/filter_sql.go @@ -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) @@ -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) ) @@ -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 { @@ -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{}) ) @@ -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, } } diff --git a/insert_all_sql.go b/insert_all_sql.go index 3f9a0a2..56dda00 100644 --- a/insert_all_sql.go +++ b/insert_all_sql.go @@ -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 ) @@ -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)) @@ -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(")") @@ -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 { @@ -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, } } diff --git a/insert_sql.go b/insert_sql.go index d6c9e07..a65f22a 100644 --- a/insert_sql.go +++ b/insert_sql.go @@ -2,25 +2,21 @@ package mssql import ( "github.com/go-rel/rel" - "github.com/go-rel/rel/adapter/sql" ) // InsertSQL builder. type InsertSQL struct { - fieldSQL FieldSQL - placeholder string + fieldSQL FieldSQL } // Build sql query and its arguments. func (is InsertSQL) Build(table string, primaryField string, mutates map[string]rel.Mutate) (string, []interface{}) { var ( - buffer sql.Buffer - count = len(mutates) + buffer buffer _, identityInsert = mutates[primaryField] + arguments = make([]interface{}, len(mutates)) ) - buffer.Arguments = make([]interface{}, count) - if identityInsert { buffer.WriteString("SET IDENTITY_INSERT ") buffer.WriteString(is.fieldSQL.Build(table)) @@ -34,14 +30,14 @@ func (is InsertSQL) Build(table string, primaryField string, mutates map[string] index := 0 for field, mut := range mutates { if mut.Type == rel.ChangeSetOp { - buffer.WriteString(is.fieldSQL.Build(field)) - buffer.Arguments[index] = mut.Value - } + if index > 0 { + buffer.WriteByte(',') + } - if index < count-1 { - buffer.WriteByte(',') + buffer.WriteString(is.fieldSQL.Build(field)) + arguments[index] = mut.Value + index++ } - index++ } buffer.WriteString(")") @@ -51,16 +47,16 @@ func (is InsertSQL) Build(table string, primaryField string, mutates map[string] buffer.WriteString(is.fieldSQL.Build(primaryField)) } - buffer.WriteString(" VALUES ") - - buffer.WriteByte('(') - for index := 0; index < len(buffer.Arguments); index++ { - buffer.WriteString(is.placeholder) + buffer.WriteString(" VALUES (") - if index < len(buffer.Arguments)-1 { + for i := range arguments { + if i > 0 { buffer.WriteByte(',') } + + buffer.WriteValue(arguments[i]) } + buffer.WriteString(");") if identityInsert { @@ -69,13 +65,12 @@ func (is InsertSQL) Build(table string, primaryField string, mutates map[string] buffer.WriteString(" OFF; ") } - return buffer.String(), buffer.Arguments + return buffer.String(), buffer.Arguments() } // NewInsertSQL builder. -func NewInsertSQL(fieldSQL FieldSQL, placeholder string) InsertSQL { +func NewInsertSQL(fieldSQL FieldSQL) InsertSQL { return InsertSQL{ - fieldSQL: fieldSQL, - placeholder: placeholder, + fieldSQL: fieldSQL, } } diff --git a/mssql.go b/mssql.go index 732a1d8..5e565ff 100644 --- a/mssql.go +++ b/mssql.go @@ -35,9 +35,8 @@ func New(db *db.DB) Adapter { func new(db *db.DB, tx *db.Tx, savepoint int) rel.Adapter { var ( - placeholder = "?" fieldSQL = NewFieldSQL("[", "]") - filterSQL = NewFilterSQL(fieldSQL, placeholder) + filterSQL = NewFilterSQL(fieldSQL) querySQL = NewQuerySQL(fieldSQL, filterSQL) instrumentation = NewInstrumentationAdapter() connectionAdapter = NewConnectionAdapter(instrumentation, db, tx, savepoint, new) @@ -45,9 +44,9 @@ func new(db *db.DB, tx *db.Tx, savepoint int) rel.Adapter { queryAdapter = NewQueryAdapter(connectionAdapter, querySQL, mapError) aggregateAdapter = NewAggregateAdapter(connectionAdapter, querySQL) applyAdapter = NewApplyAdapter(execAdapter, NewApplyTableSQL(fieldSQL, mapColumn), NewApplyIndexSQL(fieldSQL)) - insertAdapter = NewInsertAdapter(connectionAdapter, NewInsertSQL(fieldSQL, placeholder)) - insertAllAdapter = NewInsertAllAdapter(connectionAdapter, NewInsertAllSQL(fieldSQL, placeholder)) - updateAdapter = NewUpdateAdapter(execAdapter, NewUpdateSQL(fieldSQL, filterSQL, placeholder)) + insertAdapter = NewInsertAdapter(connectionAdapter, NewInsertSQL(fieldSQL)) + insertAllAdapter = NewInsertAllAdapter(connectionAdapter, NewInsertAllSQL(fieldSQL)) + updateAdapter = NewUpdateAdapter(execAdapter, NewUpdateSQL(fieldSQL, filterSQL)) deleteAdapter = NewDeleteAdapter(execAdapter, NewDeleteSQL(fieldSQL, filterSQL)) ) @@ -67,7 +66,7 @@ func new(db *db.DB, tx *db.Tx, savepoint int) rel.Adapter { // Open mssql connection using dsn. func Open(dsn string) (Adapter, error) { - var database, err = db.Open("mssql", dsn) + var database, err = db.Open("sqlserver", dsn) return New(database), err } diff --git a/query_sql.go b/query_sql.go index bcee64c..2a59cf3 100644 --- a/query_sql.go +++ b/query_sql.go @@ -5,7 +5,6 @@ import ( "strings" "github.com/go-rel/rel" - "github.com/go-rel/rel/adapter/sql" ) // QuerySQL builder. @@ -24,15 +23,15 @@ func (qs QuerySQL) Build(query rel.Query) (string, []interface{}) { query = query.Sort("^1") } - var buffer sql.Buffer + var buffer buffer qs.BuildSelect(&buffer, query.SelectQuery, query.LimitQuery, query.OffsetQuery) qs.BuildQuery(&buffer, query) - return buffer.String(), buffer.Arguments + return buffer.String(), buffer.Arguments() } // BuildSelect SQL to buffer. -func (qs QuerySQL) BuildSelect(buffer *sql.Buffer, selectQuery rel.SelectQuery, limit rel.Limit, offset rel.Offset) { +func (qs QuerySQL) BuildSelect(buffer *buffer, selectQuery rel.SelectQuery, limit rel.Limit, offset rel.Offset) { buffer.WriteString("SELECT") if selectQuery.OnlyDistinct { @@ -61,7 +60,7 @@ func (qs QuerySQL) BuildSelect(buffer *sql.Buffer, selectQuery rel.SelectQuery, } // BuildQuery SQL to buffer. -func (qs QuerySQL) BuildQuery(buffer *sql.Buffer, query rel.Query) { +func (qs QuerySQL) BuildQuery(buffer *buffer, query rel.Query) { qs.BuildFrom(buffer, query.Table) qs.BuildJoin(buffer, query.Table, query.JoinQuery) qs.BuildWhere(buffer, query.WhereQuery) @@ -83,13 +82,13 @@ func (qs QuerySQL) BuildQuery(buffer *sql.Buffer, query rel.Query) { } // BuildFrom SQL to buffer. -func (qs QuerySQL) BuildFrom(buffer *sql.Buffer, table string) { +func (qs QuerySQL) BuildFrom(buffer *buffer, table string) { buffer.WriteString(" FROM ") buffer.WriteString(qs.fieldSQL.Build(table)) } // BuildJoin SQL to buffer. -func (qs QuerySQL) BuildJoin(buffer *sql.Buffer, table string, joins []rel.JoinQuery) { +func (qs QuerySQL) BuildJoin(buffer *buffer, table string, joins []rel.JoinQuery) { if len(joins) == 0 { return } @@ -118,12 +117,12 @@ func (qs QuerySQL) BuildJoin(buffer *sql.Buffer, table string, joins []rel.JoinQ buffer.WriteString(to) } - buffer.Append(join.Arguments...) + buffer.AddArguments(join.Arguments...) } } // BuildWhere SQL to buffer. -func (qs QuerySQL) BuildWhere(buffer *sql.Buffer, filter rel.FilterQuery) { +func (qs QuerySQL) BuildWhere(buffer *buffer, filter rel.FilterQuery) { if filter.None() { return } @@ -133,7 +132,7 @@ func (qs QuerySQL) BuildWhere(buffer *sql.Buffer, filter rel.FilterQuery) { } // BuildGroupBy SQL to buffer. -func (qs QuerySQL) BuildGroupBy(buffer *sql.Buffer, fields []string) { +func (qs QuerySQL) BuildGroupBy(buffer *buffer, fields []string) { buffer.WriteString(" GROUP BY ") l := len(fields) - 1 @@ -147,7 +146,7 @@ func (qs QuerySQL) BuildGroupBy(buffer *sql.Buffer, fields []string) { } // BuildHaving SQL to buffer. -func (qs QuerySQL) BuildHaving(buffer *sql.Buffer, filter rel.FilterQuery) { +func (qs QuerySQL) BuildHaving(buffer *buffer, filter rel.FilterQuery) { if filter.None() { return } @@ -157,7 +156,7 @@ func (qs QuerySQL) BuildHaving(buffer *sql.Buffer, filter rel.FilterQuery) { } // BuildOrderBy SQL to buffer. -func (qs QuerySQL) BuildOrderBy(buffer *sql.Buffer, orders []rel.SortQuery) { +func (qs QuerySQL) BuildOrderBy(buffer *buffer, orders []rel.SortQuery) { var ( length = len(orders) ) @@ -183,7 +182,7 @@ func (qs QuerySQL) BuildOrderBy(buffer *sql.Buffer, orders []rel.SortQuery) { } // BuildLimitOffset SQL to buffer. -func (qs QuerySQL) BuildLimitOffset(buffer *sql.Buffer, limit rel.Limit, offset rel.Offset) { +func (qs QuerySQL) BuildLimitOffset(buffer *buffer, limit rel.Limit, offset rel.Offset) { if limit > 0 && offset > 0 { buffer.WriteString(" OFFSET ") buffer.WriteString(strconv.Itoa(int(offset))) diff --git a/update_sql.go b/update_sql.go index ac0fdb7..22be1ac 100644 --- a/update_sql.go +++ b/update_sql.go @@ -2,20 +2,18 @@ package mssql import ( "github.com/go-rel/rel" - "github.com/go-rel/rel/adapter/sql" ) // UpdateSQL builder. type UpdateSQL struct { - fieldSQL FieldSQL - filterSQL FilterSQL - placeholder string + fieldSQL FieldSQL + filterSQL FilterSQL } // Build SQL string and it arguments. func (us UpdateSQL) Build(table string, primaryField string, mutates map[string]rel.Mutate, filter rel.FilterQuery) (string, []interface{}) { var ( - buffer sql.Buffer + buffer buffer ) buffer.WriteString("UPDATE ") @@ -37,18 +35,16 @@ func (us UpdateSQL) Build(table string, primaryField string, mutates map[string] case rel.ChangeSetOp: buffer.WriteString(us.fieldSQL.Build(field)) buffer.WriteByte('=') - buffer.WriteString(us.placeholder) - buffer.Append(mut.Value) + buffer.WriteValue(mut.Value) case rel.ChangeIncOp: buffer.WriteString(us.fieldSQL.Build(field)) buffer.WriteByte('=') buffer.WriteString(us.fieldSQL.Build(field)) buffer.WriteByte('+') - buffer.WriteString(us.placeholder) - buffer.Append(mut.Value) + buffer.WriteValue(mut.Value) case rel.ChangeFragmentOp: buffer.WriteString(field) - buffer.Append(mut.Value.([]interface{})...) + buffer.AddArguments(mut.Value.([]interface{})...) } } @@ -59,14 +55,13 @@ func (us UpdateSQL) Build(table string, primaryField string, mutates map[string] buffer.WriteString(";") - return buffer.String(), buffer.Arguments + return buffer.String(), buffer.Arguments() } // NewUpdateSQL builder. -func NewUpdateSQL(fieldSQL FieldSQL, filterSQL FilterSQL, placeholder string) UpdateSQL { +func NewUpdateSQL(fieldSQL FieldSQL, filterSQL FilterSQL) UpdateSQL { return UpdateSQL{ - fieldSQL: fieldSQL, - filterSQL: filterSQL, - placeholder: placeholder, + fieldSQL: fieldSQL, + filterSQL: filterSQL, } }