forked from mirror/go-sqlite3
Next() should wait while BUSY or LOCKED because return value is bool
This commit is contained in:
parent
308067797b
commit
5253daf856
26
sqlite3.go
26
sqlite3.go
|
@ -463,12 +463,14 @@ func (r *SQLiteResult) RowsAffected() (int64, error) {
|
|||
func (s *SQLiteStmt) Exec(args []driver.Value) (driver.Result, error) {
|
||||
if err := s.bind(args); err != nil {
|
||||
C.sqlite3_reset(s.s)
|
||||
C.sqlite3_clear_bindings(s.s)
|
||||
return nil, err
|
||||
}
|
||||
rv := C.sqlite3_step(s.s)
|
||||
if rv != C.SQLITE_ROW && rv != C.SQLITE_OK && rv != C.SQLITE_DONE {
|
||||
err := s.c.lastError()
|
||||
C.sqlite3_reset(s.s)
|
||||
C.sqlite3_clear_bindings(s.s)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
@ -507,16 +509,22 @@ func (rc *SQLiteRows) Columns() []string {
|
|||
|
||||
// Move cursor to next.
|
||||
func (rc *SQLiteRows) Next(dest []driver.Value) error {
|
||||
rv := C.sqlite3_step(rc.s.s)
|
||||
if rv == C.SQLITE_DONE {
|
||||
return io.EOF
|
||||
}
|
||||
if rv != C.SQLITE_ROW {
|
||||
rv = C.sqlite3_reset(rc.s.s)
|
||||
if rv != C.SQLITE_OK {
|
||||
return rc.s.c.lastError()
|
||||
for {
|
||||
rv := C.sqlite3_step(rc.s.s)
|
||||
if rv == C.SQLITE_DONE {
|
||||
return io.EOF
|
||||
}
|
||||
if rv == C.SQLITE_ROW {
|
||||
break
|
||||
}
|
||||
if rv != C.SQLITE_BUSY && rv != C.SQLITE_LOCKED {
|
||||
err := rc.s.c.lastError()
|
||||
C.sqlite3_reset(rc.s.s)
|
||||
if rc.nc > 0 {
|
||||
C.sqlite3_clear_bindings(rc.s.s)
|
||||
}
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
if rc.decltype == nil {
|
||||
|
|
Loading…
Reference in New Issue