func (c *SQLiteConn) lastError() Error { return Error{ Code: ErrNo(C.sqlite3_errcode(c.db)), ExtendedCode: ErrNoExtended(C.sqlite3_extended_errcode(c.db)), err: C.GoString(C.sqlite3_errmsg(c.db)), } }
func (self *sqlConnection) sqlExtendedErrorCode() int { // SQLite 3.6.5 introduced sqlite3_extended_errcode(), // see http://www.hwaci.com/sw/sqlite/changes.html for // details; we can't expect wide availability yet, for // example Debian Lenny ships SQLite 3.5.9 only. if sqlVersionNumber() < 3006005 { // just return the regular error code... return self.sqlErrorCode() } return int(C.sqlite3_extended_errcode(self.handle)) }
// OpenVfs opens a new database with a specified virtual file system. func OpenVfs(filename string, vfsname string, flags ...OpenFlag) (*Conn, error) { if C.sqlite3_threadsafe() == 0 { return nil, errors.New("sqlite library was not compiled for thread-safe operation") } var openFlags int if len(flags) > 0 { for _, flag := range flags { openFlags |= int(flag) } } else { openFlags = C.SQLITE_OPEN_FULLMUTEX | C.SQLITE_OPEN_READWRITE | C.SQLITE_OPEN_CREATE } var db *C.sqlite3 cname := C.CString(filename) defer C.free(unsafe.Pointer(cname)) var vfs *C.char if len(vfsname) > 0 { vfs = C.CString(vfsname) defer C.free(unsafe.Pointer(vfs)) } rv := C.sqlite3_open_v2(cname, &db, C.int(openFlags), vfs) if rv != C.SQLITE_OK { if db != nil { // try to extract futher details from db... err := OpenError{Code: Errno(rv), ExtendedCode: int(C.sqlite3_extended_errcode(db)), Msg: C.GoString(C.sqlite3_errmsg(db)), Filename: filename, } C.sqlite3_close(db) return nil, err } return nil, Errno(rv) } if db == nil { return nil, errors.New("sqlite succeeded without returning a database") } c := &Conn{db: db, stmtCache: newCache(), DefaultTimeLayout: "2006-01-02 15:04:05.000Z07:00"} if os.Getenv("SQLITE_DEBUG") != "" { //c.SetAuthorizer(authorizer, c.db) c.Trace(trace, "TRACE") //c.SetCacheSize(0) } return c, nil }
// FIXME it might be the case that a second error occurs on a separate thread in between the time of the first error and the call to this method. func (e *ConnError) ExtendedCode() int { return int(C.sqlite3_extended_errcode(e.c.db)) }
func fillDBError(dbErr *Error, db *C.sqlite3) { // See SQLiteConn.lastError(), in file 'sqlite3.go' at the time of writing (Sept 5, 2016) dbErr.Code = ErrNo(C.sqlite3_errcode(db)) dbErr.ExtendedCode = ErrNoExtended(C.sqlite3_extended_errcode(db)) dbErr.err = C.GoString(C.sqlite3_errmsg(db)) }