diff --git a/vendor/github.com/go-rel/mysql/mysql.go b/vendor/github.com/go-rel/mysql/mysql.go index 76600da..0c5196b 100644 --- a/vendor/github.com/go-rel/mysql/mysql.go +++ b/vendor/github.com/go-rel/mysql/mysql.go @@ -24,6 +24,14 @@ import ( "github.com/go-rel/sql/builder" ) +// MySQL adapter. +type MySQL struct { + sql.SQL +} + +// Name of database type this adapter implements. +const Name string = "mysql" + // New mysql adapter using existing connection. // Existing connection needs to be created with `clientFoundRows=true` options for update and delete to works correctly. func New(database *db.DB) rel.Adapter { @@ -38,27 +46,31 @@ func New(database *db.DB) rel.Adapter { deleteBuilder = builder.Delete{BufferFactory: bufferFactory, Query: queryBuilder, Filter: filterBuilder} ddlBufferFactory = builder.BufferFactory{InlineValues: true, BoolTrueValue: "true", BoolFalseValue: "false", Quoter: Quote{}, ValueConverter: ValueConvert{}} ddlQueryBuilder = builder.Query{BufferFactory: ddlBufferFactory, Filter: filterBuilder} - tableBuilder = builder.Table{BufferFactory: ddlBufferFactory, ColumnMapper: columnMapper, DropKeyMapper: dropKeyMapper} + tableBuilder = builder.Table{BufferFactory: ddlBufferFactory, ColumnMapper: columnMapper, ColumnOptionsMapper: sql.ColumnOptionsMapper, DropKeyMapper: dropKeyMapper} indexBuilder = builder.Index{BufferFactory: ddlBufferFactory, Query: ddlQueryBuilder, Filter: filterBuilder, DropIndexOnTable: true} ) - return &sql.SQL{ - QueryBuilder: queryBuilder, - InsertBuilder: InsertBuilder, - InsertAllBuilder: insertAllBuilder, - UpdateBuilder: updateBuilder, - DeleteBuilder: deleteBuilder, - TableBuilder: tableBuilder, - IndexBuilder: indexBuilder, - Increment: getIncrement(database), - ErrorMapper: errorMapper, - DB: database, + return &MySQL{ + SQL: sql.SQL{ + QueryBuilder: queryBuilder, + InsertBuilder: InsertBuilder, + InsertAllBuilder: insertAllBuilder, + UpdateBuilder: updateBuilder, + DeleteBuilder: deleteBuilder, + TableBuilder: tableBuilder, + IndexBuilder: indexBuilder, + Increment: getIncrement(database), + ErrorMapper: errorMapper, + DB: database, + }, } } +var dbOpen = db.Open + // Open mysql connection using dsn. func Open(dsn string) (rel.Adapter, error) { - var database, err = db.Open("mysql", rewriteDsn(dsn)) + database, err := dbOpen("mysql", rewriteDsn(dsn)) return New(database), err } @@ -66,24 +78,25 @@ func rewriteDsn(dsn string) string { // force clientFoundRows=true // this allows not found record check when updating a record. if strings.ContainsRune(dsn, '?') { - dsn += "&clientFoundRows=true" - } else { - dsn += "?clientFoundRows=true" + return dsn + "&clientFoundRows=true" } - - return dsn + return dsn + "?clientFoundRows=true" } // MustOpen mysql connection using dsn. func MustOpen(dsn string) rel.Adapter { - var ( - adapter, err = Open(dsn) - ) - - check(err) + adapter, err := Open(dsn) + if err != nil { + panic(err) + } return adapter } +// Name of database adapter. +func (MySQL) Name() string { + return Name +} + func getIncrement(database *db.DB) int { var ( variable string @@ -91,7 +104,10 @@ func getIncrement(database *db.DB) int { ) if database != nil { - check(database.QueryRow("SHOW VARIABLES LIKE 'auto_increment_increment';").Scan(&variable, &increment)) + err := database.QueryRow("SHOW VARIABLES LIKE 'auto_increment_increment';").Scan(&variable, &increment) + if err != nil { + panic(err) + } } return increment @@ -146,9 +162,3 @@ func dropKeyMapper(typ rel.KeyType) string { panic(fmt.Sprintf("drop key: unsupported key type `%s`", typ)) } - -func check(err error) { - if err != nil { - panic(err) - } -} diff --git a/vendor/github.com/go-rel/rel/adapter.go b/vendor/github.com/go-rel/rel/adapter.go index 998dff9..7dbb220 100644 --- a/vendor/github.com/go-rel/rel/adapter.go +++ b/vendor/github.com/go-rel/rel/adapter.go @@ -6,6 +6,7 @@ import ( // Adapter interface type Adapter interface { + Name() string Close() error Instrumentation(instrumenter Instrumenter) diff --git a/vendor/github.com/go-rel/rel/document_meta.go b/vendor/github.com/go-rel/rel/document_meta.go index 0044254..5e78361 100644 --- a/vendor/github.com/go-rel/rel/document_meta.go +++ b/vendor/github.com/go-rel/rel/document_meta.go @@ -99,8 +99,8 @@ func (cdm *cachedDocumentMeta) mergeEmbedded(other cachedDocumentMeta, indexPref cdm.hasOne = appendWithPrefix(cdm.hasOne, other.hasOne, namePrefix) cdm.hasMany = appendWithPrefix(cdm.hasMany, other.hasMany, namePrefix) cdm.primaryField = appendWithPrefix(cdm.primaryField, other.primaryField, namePrefix) - for index := range other.primaryIndex { - cdm.primaryIndex = append(cdm.primaryIndex, append([]int{indexPrefix}, index)) + for _, index := range other.primaryIndex { + cdm.primaryIndex = append(cdm.primaryIndex, append([]int{indexPrefix}, index...)) } cdm.preload = appendWithPrefix(cdm.preload, other.preload, namePrefix) cdm.flag |= other.flag diff --git a/vendor/github.com/go-rel/reltest/nop_adapter.go b/vendor/github.com/go-rel/reltest/nop_adapter.go index 24c9595..b4ace4b 100644 --- a/vendor/github.com/go-rel/reltest/nop_adapter.go +++ b/vendor/github.com/go-rel/reltest/nop_adapter.go @@ -6,7 +6,10 @@ import ( "github.com/go-rel/rel" ) -type nopAdapter struct { +type nopAdapter struct{} + +func (na *nopAdapter) Name() string { + return "nop" } func (na *nopAdapter) Close() error { @@ -41,9 +44,7 @@ func (na *nopAdapter) Insert(ctx context.Context, query rel.Query, primaryField } func (na *nopAdapter) InsertAll(ctx context.Context, query rel.Query, primaryField string, fields []string, bulkMutates []map[string]rel.Mutate, onConflict rel.OnConflict) ([]any, error) { - var ( - ids = make([]any, len(bulkMutates)) - ) + ids := make([]any, len(bulkMutates)) for i := range bulkMutates { ids[i] = i + 1 diff --git a/vendor/github.com/go-rel/sql/builder/buffer.go b/vendor/github.com/go-rel/sql/builder/buffer.go index b9fb647..e807a62 100644 --- a/vendor/github.com/go-rel/sql/builder/buffer.go +++ b/vendor/github.com/go-rel/sql/builder/buffer.go @@ -30,6 +30,7 @@ type Buffer struct { Quoter Quoter ValueConverter driver.ValueConverter ArgumentPlaceholder string + AllowTableSchema bool ArgumentOrdinal bool InlineValues bool BoolTrueValue string @@ -47,7 +48,7 @@ func (b *Buffer) WriteValue(value any) { } // Detect float bits to not lose precision after converting to float64 - var floatBits = 64 + floatBits := 64 if value != nil && reflect.TypeOf(value).Kind() == reflect.Float32 { floatBits = 32 } @@ -109,6 +110,11 @@ func (b *Buffer) WriteField(table, field string) { b.WriteString(b.escape(table, field)) } +// WriteTable writes table name. +func (b *Buffer) WriteTable(table string) { + b.WriteString(b.escape(table, "")) +} + // WriteEscape string. func (b *Buffer) WriteEscape(value string) { b.WriteString(b.escape("", value)) @@ -127,7 +133,10 @@ func (b Buffer) escape(table, value string) string { var escaped_table string if table != "" { - if strings.IndexByte(table, '.') >= 0 { + if i := strings.Index(strings.ToLower(table), " as "); i > -1 { + return b.escape(table[:i], "") + " AS " + b.Quoter.ID(table[i+4:]) + } + if b.AllowTableSchema && strings.IndexByte(table, '.') >= 0 { parts := strings.Split(table, ".") for i, part := range parts { part = strings.TrimSpace(part) @@ -135,11 +144,13 @@ func (b Buffer) escape(table, value string) string { } escaped_table = strings.Join(parts, ".") } else { - escaped_table = b.Quoter.ID(table) + escaped_table = b.Quoter.ID(strings.ReplaceAll(table, ".", "_")) } } - if value == "*" { + if value == "" { + escapedValue = escaped_table + } else if value == "*" { escapedValue = escaped_table + ".*" } else if len(value) > 0 && value[0] == UnescapeCharacter { escapedValue = value[1:] @@ -193,6 +204,7 @@ func (b *Buffer) Reset() { type BufferFactory struct { Quoter Quoter ValueConverter driver.ValueConverter + AllowTableSchema bool ArgumentPlaceholder string ArgumentOrdinal bool InlineValues bool @@ -208,6 +220,7 @@ func (bf BufferFactory) Create() Buffer { return Buffer{ Quoter: bf.Quoter, ValueConverter: conv, + AllowTableSchema: bf.AllowTableSchema, ArgumentPlaceholder: bf.ArgumentPlaceholder, ArgumentOrdinal: bf.ArgumentOrdinal, InlineValues: bf.InlineValues, diff --git a/vendor/github.com/go-rel/sql/builder/delete.go b/vendor/github.com/go-rel/sql/builder/delete.go index 0a832eb..5a3a3ab 100644 --- a/vendor/github.com/go-rel/sql/builder/delete.go +++ b/vendor/github.com/go-rel/sql/builder/delete.go @@ -13,12 +13,10 @@ type Delete struct { // Build SQL query and its arguments. func (ds Delete) Build(table string, filter rel.FilterQuery) (string, []any) { - var ( - buffer = ds.BufferFactory.Create() - ) + buffer := ds.BufferFactory.Create() buffer.WriteString("DELETE FROM ") - buffer.WriteEscape(table) + buffer.WriteTable(table) if !filter.None() { buffer.WriteString(" WHERE ") diff --git a/vendor/github.com/go-rel/sql/builder/index.go b/vendor/github.com/go-rel/sql/builder/index.go index f751d54..2f4cbf5 100644 --- a/vendor/github.com/go-rel/sql/builder/index.go +++ b/vendor/github.com/go-rel/sql/builder/index.go @@ -46,7 +46,7 @@ func (i Index) WriteCreateIndex(buffer *Buffer, index rel.Index) { buffer.WriteEscape(index.Name) buffer.WriteString(" ON ") - buffer.WriteEscape(index.Table) + buffer.WriteTable(index.Table) buffer.WriteString(" (") for n, col := range index.Columns { @@ -78,7 +78,7 @@ func (i Index) WriteDropIndex(buffer *Buffer, index rel.Index) { if i.DropIndexOnTable { buffer.WriteString(" ON ") - buffer.WriteEscape(index.Table) + buffer.WriteTable(index.Table) } } diff --git a/vendor/github.com/go-rel/sql/builder/insert.go b/vendor/github.com/go-rel/sql/builder/insert.go index 9febb29..5303c30 100644 --- a/vendor/github.com/go-rel/sql/builder/insert.go +++ b/vendor/github.com/go-rel/sql/builder/insert.go @@ -14,9 +14,7 @@ type Insert struct { // Build sql query and its arguments. func (i Insert) Build(table string, primaryField string, mutates map[string]rel.Mutate, onConflict rel.OnConflict) (string, []any) { - var ( - buffer = i.BufferFactory.Create() - ) + buffer := i.BufferFactory.Create() i.WriteInsertInto(&buffer, table) i.WriteValues(&buffer, mutates) @@ -30,13 +28,11 @@ func (i Insert) Build(table string, primaryField string, mutates map[string]rel. func (i Insert) WriteInsertInto(buffer *Buffer, table string) { buffer.WriteString("INSERT INTO ") - buffer.WriteEscape(table) + buffer.WriteTable(table) } func (i Insert) WriteValues(buffer *Buffer, mutates map[string]rel.Mutate) { - var ( - count = len(mutates) - ) + count := len(mutates) if count == 0 && i.InsertDefaultValues { buffer.WriteString(" DEFAULT VALUES") diff --git a/vendor/github.com/go-rel/sql/builder/insert_all.go b/vendor/github.com/go-rel/sql/builder/insert_all.go index fd8a699..3027960 100644 --- a/vendor/github.com/go-rel/sql/builder/insert_all.go +++ b/vendor/github.com/go-rel/sql/builder/insert_all.go @@ -13,9 +13,7 @@ type InsertAll struct { // Build SQL string and its arguments. func (ia InsertAll) Build(table string, primaryField string, fields []string, bulkMutates []map[string]rel.Mutate, onConflict rel.OnConflict) (string, []any) { - var ( - buffer = ia.BufferFactory.Create() - ) + buffer := ia.BufferFactory.Create() ia.WriteInsertInto(&buffer, table) ia.WriteValues(&buffer, fields, bulkMutates) @@ -28,7 +26,7 @@ func (ia InsertAll) Build(table string, primaryField string, fields []string, bu func (ia InsertAll) WriteInsertInto(buffer *Buffer, table string) { buffer.WriteString("INSERT INTO ") - buffer.WriteEscape(table) + buffer.WriteTable(table) } func (ia InsertAll) WriteValues(buffer *Buffer, fields []string, bulkMutates []map[string]rel.Mutate) { diff --git a/vendor/github.com/go-rel/sql/builder/query.go b/vendor/github.com/go-rel/sql/builder/query.go index 8eb0f20..a8136c5 100644 --- a/vendor/github.com/go-rel/sql/builder/query.go +++ b/vendor/github.com/go-rel/sql/builder/query.go @@ -19,9 +19,7 @@ type Query struct { // Build SQL string and it arguments. func (q Query) Build(query rel.Query) (string, []any) { - var ( - buffer = q.BufferFactory.Create() - ) + buffer := q.BufferFactory.Create() q.Write(&buffer, query) @@ -96,7 +94,7 @@ func (q Query) WriteQuery(buffer *Buffer, query rel.Query) { // WriteFrom SQL to buffer. func (q Query) WriteFrom(buffer *Buffer, table string) { buffer.WriteString(" FROM ") - buffer.WriteEscape(table) + buffer.WriteTable(table) } // WriteJoin SQL to buffer. @@ -111,10 +109,16 @@ func (q Query) WriteJoin(buffer *Buffer, table string, joins []rel.JoinQuery) { to = join.To ) + jtable := join.Table + // If join table has alias use that for filter conditions + if i := strings.Index(strings.ToLower(jtable), " as "); i > -1 { + jtable = jtable[i+4:] + } + // TODO: move this to core functionality, and infer join condition using assoc data. if join.Arguments == nil && (join.From == "" || join.To == "") { from = table + "." + strings.TrimSuffix(join.Table, "s") + "_id" - to = join.Table + ".id" + to = jtable + ".id" } buffer.WriteByte(' ') @@ -122,14 +126,14 @@ func (q Query) WriteJoin(buffer *Buffer, table string, joins []rel.JoinQuery) { buffer.WriteByte(' ') if join.Table != "" { - buffer.WriteEscape(join.Table) + buffer.WriteTable(join.Table) buffer.WriteString(" ON ") buffer.WriteEscape(from) buffer.WriteString("=") buffer.WriteEscape(to) if !join.Filter.None() { buffer.WriteString(" AND ") - q.Filter.Write(buffer, join.Table, join.Filter, q) + q.Filter.Write(buffer, jtable, join.Filter, q) } } @@ -173,9 +177,7 @@ func (q Query) WriteHaving(buffer *Buffer, table string, filter rel.FilterQuery) // WriteOrderBy SQL to buffer. func (q Query) WriteOrderBy(buffer *Buffer, table string, orders []rel.SortQuery) { - var ( - length = len(orders) - ) + length := len(orders) if length == 0 { return diff --git a/vendor/github.com/go-rel/sql/builder/table.go b/vendor/github.com/go-rel/sql/builder/table.go index c0de6f3..c3a1e55 100644 --- a/vendor/github.com/go-rel/sql/builder/table.go +++ b/vendor/github.com/go-rel/sql/builder/table.go @@ -7,23 +7,25 @@ import ( "github.com/go-rel/rel" ) -type ColumnMapper func(*rel.Column) (string, int, int) -type DropKeyMapper func(rel.KeyType) string -type DefinitionFilter func(table rel.Table, def rel.TableDefinition) bool +type ( + ColumnMapper func(*rel.Column) (string, int, int) + ColumnOptionsMapper func(*rel.Column) string + DropKeyMapper func(rel.KeyType) string + DefinitionFilter func(table rel.Table, def rel.TableDefinition) bool +) // Table builder. type Table struct { - BufferFactory BufferFactory - ColumnMapper ColumnMapper - DropKeyMapper DropKeyMapper - DefinitionFilter DefinitionFilter + BufferFactory BufferFactory + ColumnMapper ColumnMapper + ColumnOptionsMapper ColumnOptionsMapper + DropKeyMapper DropKeyMapper + DefinitionFilter DefinitionFilter } // Build SQL query for table creation and modification. func (t Table) Build(table rel.Table) string { - var ( - buffer = t.BufferFactory.Create() - ) + buffer := t.BufferFactory.Create() switch table.Op { case rel.SchemaCreate: @@ -49,7 +51,7 @@ func (t Table) WriteCreateTable(buffer *Buffer, table rel.Table) { buffer.WriteString("IF NOT EXISTS ") } - buffer.WriteEscape(table.Name) + buffer.WriteTable(table.Name) if len(defs) > 0 { buffer.WriteString(" (") @@ -79,7 +81,7 @@ func (t Table) WriteAlterTable(buffer *Buffer, table rel.Table) { for _, def := range defs { buffer.WriteString("ALTER TABLE ") - buffer.WriteEscape(table.Name) + buffer.WriteTable(table.Name) buffer.WriteByte(' ') switch v := def.(type) { @@ -120,9 +122,9 @@ func (t Table) WriteAlterTable(buffer *Buffer, table rel.Table) { // WriteRenameTable query to buffer. func (t Table) WriteRenameTable(buffer *Buffer, table rel.Table) { buffer.WriteString("ALTER TABLE ") - buffer.WriteEscape(table.Name) + buffer.WriteTable(table.Name) buffer.WriteString(" RENAME TO ") - buffer.WriteEscape(table.Rename) + buffer.WriteTable(table.Rename) buffer.WriteByte(';') } @@ -134,15 +136,13 @@ func (t Table) WriteDropTable(buffer *Buffer, table rel.Table) { buffer.WriteString("IF EXISTS ") } - buffer.WriteEscape(table.Name) + buffer.WriteTable(table.Name) buffer.WriteByte(';') } // WriteColumn definition to buffer. func (t Table) WriteColumn(buffer *Buffer, column rel.Column) { - var ( - typ, m, n = t.ColumnMapper(&column) - ) + typ, m, n := t.ColumnMapper(&column) buffer.WriteEscape(column.Name) buffer.WriteByte(' ') @@ -160,20 +160,9 @@ func (t Table) WriteColumn(buffer *Buffer, column rel.Column) { buffer.WriteByte(')') } - if column.Unsigned { - buffer.WriteString(" UNSIGNED") - } - - if column.Unique { - buffer.WriteString(" UNIQUE") - } - - if column.Required { - buffer.WriteString(" NOT NULL") - } - - if column.Primary { - buffer.WriteString(" PRIMARY KEY") + if opts := t.ColumnOptionsMapper(&column); opts != "" { + buffer.WriteByte(' ') + buffer.WriteString(opts) } if column.Default != nil { @@ -186,9 +175,7 @@ func (t Table) WriteColumn(buffer *Buffer, column rel.Column) { // WriteKey definition to buffer. func (t Table) WriteKey(buffer *Buffer, key rel.Key) { - var ( - typ = string(key.Type) - ) + typ := string(key.Type) buffer.WriteString(typ) @@ -208,7 +195,7 @@ func (t Table) WriteKey(buffer *Buffer, key rel.Key) { if key.Type == rel.ForeignKey { buffer.WriteString(" REFERENCES ") - buffer.WriteEscape(key.Reference.Table) + buffer.WriteTable(key.Reference.Table) buffer.WriteString(" (") for i, col := range key.Reference.Columns { diff --git a/vendor/github.com/go-rel/sql/builder/update.go b/vendor/github.com/go-rel/sql/builder/update.go index cffae18..27c5348 100644 --- a/vendor/github.com/go-rel/sql/builder/update.go +++ b/vendor/github.com/go-rel/sql/builder/update.go @@ -13,12 +13,10 @@ type Update struct { // Build SQL string and it arguments. func (u Update) Build(table string, primaryField string, mutates map[string]rel.Mutate, filter rel.FilterQuery) (string, []any) { - var ( - buffer = u.BufferFactory.Create() - ) + buffer := u.BufferFactory.Create() buffer.WriteString("UPDATE ") - buffer.WriteEscape(table) + buffer.WriteTable(table) buffer.WriteString(" SET ") i := 0 diff --git a/vendor/github.com/go-rel/sql/sql.go b/vendor/github.com/go-rel/sql/sql.go index 733b7cc..4509f2a 100644 --- a/vendor/github.com/go-rel/sql/sql.go +++ b/vendor/github.com/go-rel/sql/sql.go @@ -33,6 +33,11 @@ type SQL struct { Instrumenter rel.Instrumenter } +// Name returns database adapter name. +func (s SQL) Name() string { + return "sql" +} + // Instrumentation set instrumenter for this adapter. func (s *SQL) Instrumentation(instrumenter rel.Instrumenter) { s.Instrumenter = instrumenter @@ -173,10 +178,7 @@ func (s SQL) Query(ctx context.Context, query rel.Query) (rel.Cursor, error) { // Exec performs exec operation. func (s SQL) Exec(ctx context.Context, statement string, args []any) (int64, int64, error) { - var ( - res, err = s.DoExec(ctx, statement, args) - ) - + res, err := s.DoExec(ctx, statement, args) if err != nil { return 0, 0, s.ErrorMapper(err) } @@ -284,9 +286,7 @@ func (s SQL) Delete(ctx context.Context, query rel.Query) (int, error) { // SchemaApply performs migration to database. func (s SQL) SchemaApply(ctx context.Context, migration rel.Migration) error { - var ( - statement string - ) + var statement string switch v := migration.(type) { case rel.Table: diff --git a/vendor/github.com/go-rel/sql/util.go b/vendor/github.com/go-rel/sql/util.go index b88c12d..0c38ed8 100644 --- a/vendor/github.com/go-rel/sql/util.go +++ b/vendor/github.com/go-rel/sql/util.go @@ -72,6 +72,34 @@ func ColumnMapper(column *rel.Column) (string, int, int) { return typ, m, n } +// ColumnOptionsMapper function. +func ColumnOptionsMapper(column *rel.Column) string { + var buffer strings.Builder + + if column.Unsigned { + buffer.WriteString(" UNSIGNED") + } + + if column.Unique { + buffer.WriteString(" UNIQUE") + } + + if column.Required { + buffer.WriteString(" NOT NULL") + } + + if column.Primary { + buffer.WriteString(" PRIMARY KEY") + } + + buf := buffer.String() + if buf != "" { + buf = buf[1:] + } + + return buf +} + // ExtractString between two string. func ExtractString(s, left, right string) string { var ( diff --git a/vendor/modules.txt b/vendor/modules.txt index ca9abb6..bb1e516 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -66,18 +66,18 @@ github.com/go-playground/universal-translator # github.com/go-playground/validator/v10 v10.15.3 ## explicit; go 1.18 github.com/go-playground/validator/v10 -# github.com/go-rel/mysql v0.10.0 -## explicit; go 1.20 +# github.com/go-rel/mysql v0.11.0 +## explicit; go 1.21 github.com/go-rel/mysql -# github.com/go-rel/rel v0.40.0 +# github.com/go-rel/rel v0.41.0 ## explicit; go 1.21 github.com/go-rel/rel github.com/go-rel/rel/where -# github.com/go-rel/reltest v0.11.0 -## explicit; go 1.19 +# github.com/go-rel/reltest v0.12.0 +## explicit; go 1.21 github.com/go-rel/reltest -# github.com/go-rel/sql v0.14.0 -## explicit; go 1.19 +# github.com/go-rel/sql v0.16.0 +## explicit; go 1.21 github.com/go-rel/sql github.com/go-rel/sql/builder # github.com/go-sql-driver/mysql v1.7.1