Skip to content

Commit

Permalink
Introduce Unsafe method on Queryx
Browse files Browse the repository at this point in the history
It enables local control over `unsafe` mode for .Bind methods of `Queryx` and iterators
spawn by it.
  • Loading branch information
dkropachev authored and sylwiaszunejko committed Jun 25, 2024
1 parent a222c1f commit c6f942a
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 9 deletions.
2 changes: 1 addition & 1 deletion iterx.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import (
"github.com/scylladb/go-reflectx"
)

// DefaultUnsafe enables the behavior of forcing the iterator to ignore
// DefaultUnsafe enables the behavior of forcing queries and iterators to ignore
// missing fields for all queries. See Unsafe below for more information.
var DefaultUnsafe bool

Expand Down
6 changes: 1 addition & 5 deletions iterx_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -484,12 +484,8 @@ func TestIterxUnsafe(t *testing.T) {
})

t.Run("select default unsafe", func(t *testing.T) {
gocqlx.DefaultUnsafe = true
defer func() {
gocqlx.DefaultUnsafe = false
}()
var v []UnsafeTable
err := session.Query(stmt, nil).Iter().Select(&v)
err := session.Query(stmt, nil).Unsafe().Iter().Select(&v)
if err != nil {
t.Fatal("Select() failed:", err)
}
Expand Down
16 changes: 13 additions & 3 deletions queryx.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,8 @@ type Queryx struct {
tr Transformer
Mapper *reflectx.Mapper
*gocql.Query
Names []string
Names []string
unsafe bool
}

// Query creates a new Queryx from gocql.Query using a default mapper.
Expand All @@ -106,6 +107,7 @@ func Query(q *gocql.Query, names []string) *Queryx {
Names: names,
Mapper: DefaultMapper,
tr: DefaultBindTransformer,
unsafe: DefaultUnsafe,
}
}

Expand Down Expand Up @@ -209,7 +211,7 @@ func (q *Queryx) bindMapArgs(arg map[string]interface{}) ([]interface{}, error)
// Bind sets query arguments of query. This can also be used to rebind new query arguments
// to an existing query instance.
func (q *Queryx) Bind(v ...interface{}) *Queryx {
q.Query.Bind(udtWrapSlice(q.Mapper, DefaultUnsafe, v)...)
q.Query.Bind(udtWrapSlice(q.Mapper, q.unsafe, v)...)
return q
}

Expand Down Expand Up @@ -342,6 +344,14 @@ func (q *Queryx) Iter() *Iterx {
return &Iterx{
Iter: q.Query.Iter(),
Mapper: q.Mapper,
unsafe: DefaultUnsafe,
unsafe: q.unsafe,
}
}

// Unsafe forces the query and iterators to ignore missing fields. By default when scanning
// a struct if result row has a column that cannot be mapped to any destination
// field an error is reported. With unsafe such columns are ignored.
func (q *Queryx) Unsafe() *Queryx {
q.unsafe = true
return q
}
2 changes: 2 additions & 0 deletions session.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ func (s Session) ContextQuery(ctx context.Context, stmt string, names []string)
Names: names,
Mapper: s.Mapper,
tr: DefaultBindTransformer,
unsafe: DefaultUnsafe,
}
}

Expand All @@ -65,6 +66,7 @@ func (s Session) Query(stmt string, names []string) *Queryx {
Names: names,
Mapper: s.Mapper,
tr: DefaultBindTransformer,
unsafe: DefaultUnsafe,
}
}

Expand Down

0 comments on commit c6f942a

Please sign in to comment.