diff --git a/internal/sqladapter/result.go b/internal/sqladapter/result.go index 3ad00023f095222f8ae0fcd56d7897d6a2f73fc0..69d7e623a2ac3724dea27ec4e3d0a8a458fdb0b7 100644 --- a/internal/sqladapter/result.go +++ b/internal/sqladapter/result.go @@ -63,9 +63,11 @@ func (r *Result) setErr(err error) error { r.errMu.Lock() defer r.errMu.Unlock() - if err != nil { - r.err = err + if err == nil { + return nil } + + r.err = err return err } diff --git a/lib/sqlbuilder/builder.go b/lib/sqlbuilder/builder.go index b2fa6caeb606005bd58198e722c795f0485fa6d6..7509024361ab3246eb4b7d28ab6feaea685a4bd0 100644 --- a/lib/sqlbuilder/builder.go +++ b/lib/sqlbuilder/builder.go @@ -313,39 +313,37 @@ func (s *stringer) compileAndReplacePlaceholders(stmt *exql.Statement) (query st } func (iter *iterator) Scan(dst ...interface{}) error { - if iter.err != nil { - return iter.err + if err := iter.Err(); err != nil { + return err } return iter.cursor.Scan(dst...) } +func (iter *iterator) setErr(err error) error { + iter.err = err + return iter.err +} + func (iter *iterator) One(dst interface{}) error { - if iter.err != nil { - return iter.err + if err := iter.Err(); err != nil { + return err } - defer iter.Close() - - if !iter.Next(dst) { - return iter.Err() - } - - return nil + return iter.setErr(iter.next(dst)) } func (iter *iterator) All(dst interface{}) error { - var err error - - if iter.err != nil { - return iter.err + if err := iter.Err(); err != nil { + return err } - defer iter.Close() // Fetching all results within the cursor. - err = fetchRows(iter.cursor, dst) + if err := fetchRows(iter.cursor, dst); err != nil { + return iter.setErr(err) + } - return err + return nil } func (iter *iterator) Err() (err error) { @@ -353,31 +351,44 @@ func (iter *iterator) Err() (err error) { } func (iter *iterator) Next(dst ...interface{}) bool { - var err error - if iter.err != nil { + if err := iter.Err(); err != nil { + return false + } + + if err := iter.next(dst...); err != nil { + // ignore db.ErrNoMoreRows, just break. + if err != db.ErrNoMoreRows { + iter.setErr(err) + } return false } + return true +} + +func (iter *iterator) next(dst ...interface{}) error { + switch len(dst) { case 0: if ok := iter.cursor.Next(); !ok { - iter.err = iter.cursor.Err() - iter.Close() - return false + defer iter.Close() + err := iter.cursor.Err() + if err == nil { + err = db.ErrNoMoreRows + } + return err } - return true + return nil case 1: - if err = fetchRow(iter.cursor, dst[0]); err != nil { - iter.err = err - iter.Close() - return false + if err := fetchRow(iter.cursor, dst[0]); err != nil { + defer iter.Close() + return err } - return true + return nil } - iter.err = errors.New("Next does not currently supports more than one parameters") - return false + return errors.New("Next does not currently supports more than one parameters") } func (iter *iterator) Close() (err error) { diff --git a/lib/sqlbuilder/convert.go b/lib/sqlbuilder/convert.go index 0e1f3d94c09e1e5e6dba6269d5ca2de7e64ec280..47d8c3ce3568ca9748f272c7f82b809f2b4970d2 100644 --- a/lib/sqlbuilder/convert.go +++ b/lib/sqlbuilder/convert.go @@ -83,6 +83,9 @@ func (tu *templateWithUtils) ToWhereWithArguments(term interface{}) (where exql. where.Conditions = append(where.Conditions, w.Conditions...) } return + case db.RawValue: + where.Conditions = []exql.Fragment{exql.RawValue(t.String())} + return case db.Constraints: for _, c := range t.Constraints() { w, v := tu.ToWhereWithArguments(c)