Next() should wait while BUSY or LOCKED because return value is bool

systemlib
mattn 2015-03-19 13:29:43 +09:00
parent 308067797b
commit 5253daf856
1 changed files with 17 additions and 9 deletions

View File

@ -463,12 +463,14 @@ func (r *SQLiteResult) RowsAffected() (int64, error) {
func (s *SQLiteStmt) Exec(args []driver.Value) (driver.Result, error) { func (s *SQLiteStmt) Exec(args []driver.Value) (driver.Result, error) {
if err := s.bind(args); err != nil { if err := s.bind(args); err != nil {
C.sqlite3_reset(s.s) C.sqlite3_reset(s.s)
C.sqlite3_clear_bindings(s.s)
return nil, err return nil, err
} }
rv := C.sqlite3_step(s.s) rv := C.sqlite3_step(s.s)
if rv != C.SQLITE_ROW && rv != C.SQLITE_OK && rv != C.SQLITE_DONE { if rv != C.SQLITE_ROW && rv != C.SQLITE_OK && rv != C.SQLITE_DONE {
err := s.c.lastError() err := s.c.lastError()
C.sqlite3_reset(s.s) C.sqlite3_reset(s.s)
C.sqlite3_clear_bindings(s.s)
return nil, err return nil, err
} }
@ -507,16 +509,22 @@ func (rc *SQLiteRows) Columns() []string {
// Move cursor to next. // Move cursor to next.
func (rc *SQLiteRows) Next(dest []driver.Value) error { func (rc *SQLiteRows) Next(dest []driver.Value) error {
rv := C.sqlite3_step(rc.s.s) for {
if rv == C.SQLITE_DONE { rv := C.sqlite3_step(rc.s.s)
return io.EOF if rv == C.SQLITE_DONE {
} return io.EOF
if rv != C.SQLITE_ROW { }
rv = C.sqlite3_reset(rc.s.s) if rv == C.SQLITE_ROW {
if rv != C.SQLITE_OK { break
return rc.s.c.lastError() }
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 { if rc.decltype == nil {