error.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  1. // Copyright (c) 2018 David Crawshaw <david@zentus.com>
  2. //
  3. // Permission to use, copy, modify, and distribute this software for any
  4. // purpose with or without fee is hereby granted, provided that the above
  5. // copyright notice and this permission notice appear in all copies.
  6. //
  7. // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  8. // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  9. // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  10. // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  11. // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  12. // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  13. // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  14. package sqlite
  15. // #include <sqlite3.h>
  16. import "C"
  17. import "errors"
  18. // Error is an error produced by SQLite.
  19. type Error struct {
  20. Code ErrorCode // SQLite extended error code (SQLITE_OK is an invalid value)
  21. Loc string // method name that generated the error
  22. Query string // original SQL query text
  23. Msg string // value of sqlite3_errmsg, set sqlite.ErrMsg = true
  24. }
  25. func (err Error) Error() string {
  26. str := "sqlite"
  27. if err.Loc != "" {
  28. str += "." + err.Loc
  29. }
  30. str += ": " + err.Code.String()
  31. if err.Msg != "" {
  32. str += ": " + err.Msg
  33. }
  34. if err.Query != "" {
  35. str += " (" + err.Query + ")"
  36. }
  37. return str
  38. }
  39. // ErrorCode is an SQLite extended error code.
  40. //
  41. // The three SQLite result codes (SQLITE_OK, SQLITE_ROW, and SQLITE_DONE),
  42. // are not errors so they should not be used in an Error.
  43. type ErrorCode int
  44. func (code ErrorCode) ToError() error {
  45. return Error{Code: code}
  46. }
  47. func (code ErrorCode) String() string {
  48. switch code {
  49. default:
  50. var buf [20]byte
  51. return "SQLITE_UNKNOWN_ERR(" + string(itoa(buf[:], int64(code))) + ")"
  52. case SQLITE_OK:
  53. return "SQLITE_OK(not an error)"
  54. case SQLITE_ROW:
  55. return "SQLITE_ROW(not an error)"
  56. case SQLITE_DONE:
  57. return "SQLITE_DONE(not an error)"
  58. case SQLITE_ERROR:
  59. return "SQLITE_ERROR"
  60. case SQLITE_INTERNAL:
  61. return "SQLITE_INTERNAL"
  62. case SQLITE_PERM:
  63. return "SQLITE_PERM"
  64. case SQLITE_ABORT:
  65. return "SQLITE_ABORT"
  66. case SQLITE_BUSY:
  67. return "SQLITE_BUSY"
  68. case SQLITE_LOCKED:
  69. return "SQLITE_LOCKED"
  70. case SQLITE_NOMEM:
  71. return "SQLITE_NOMEM"
  72. case SQLITE_READONLY:
  73. return "SQLITE_READONLY"
  74. case SQLITE_INTERRUPT:
  75. return "SQLITE_INTERRUPT"
  76. case SQLITE_IOERR:
  77. return "SQLITE_IOERR"
  78. case SQLITE_CORRUPT:
  79. return "SQLITE_CORRUPT"
  80. case SQLITE_NOTFOUND:
  81. return "SQLITE_NOTFOUND"
  82. case SQLITE_FULL:
  83. return "SQLITE_FULL"
  84. case SQLITE_CANTOPEN:
  85. return "SQLITE_CANTOPEN"
  86. case SQLITE_PROTOCOL:
  87. return "SQLITE_PROTOCOL"
  88. case SQLITE_EMPTY:
  89. return "SQLITE_EMPTY"
  90. case SQLITE_SCHEMA:
  91. return "SQLITE_SCHEMA"
  92. case SQLITE_TOOBIG:
  93. return "SQLITE_TOOBIG"
  94. case SQLITE_CONSTRAINT:
  95. return "SQLITE_CONSTRAINT"
  96. case SQLITE_MISMATCH:
  97. return "SQLITE_MISMATCH"
  98. case SQLITE_MISUSE:
  99. return "SQLITE_MISUSE"
  100. case SQLITE_NOLFS:
  101. return "SQLITE_NOLFS"
  102. case SQLITE_AUTH:
  103. return "SQLITE_AUTH"
  104. case SQLITE_FORMAT:
  105. return "SQLITE_FORMAT"
  106. case SQLITE_RANGE:
  107. return "SQLITE_RANGE"
  108. case SQLITE_NOTADB:
  109. return "SQLITE_NOTADB"
  110. case SQLITE_NOTICE:
  111. return "SQLITE_NOTICE"
  112. case SQLITE_WARNING:
  113. return "SQLITE_WARNING"
  114. case SQLITE_ERROR_MISSING_COLLSEQ:
  115. return "SQLITE_ERROR_MISSING_COLLSEQ"
  116. case SQLITE_ERROR_RETRY:
  117. return "SQLITE_ERROR_RETRY"
  118. case SQLITE_ERROR_SNAPSHOT:
  119. return "SQLITE_ERROR_SNAPSHOT"
  120. case SQLITE_IOERR_READ:
  121. return "SQLITE_IOERR_READ"
  122. case SQLITE_IOERR_SHORT_READ:
  123. return "SQLITE_IOERR_SHORT_READ"
  124. case SQLITE_IOERR_WRITE:
  125. return "SQLITE_IOERR_WRITE"
  126. case SQLITE_IOERR_FSYNC:
  127. return "SQLITE_IOERR_FSYNC"
  128. case SQLITE_IOERR_DIR_FSYNC:
  129. return "SQLITE_IOERR_DIR_FSYNC"
  130. case SQLITE_IOERR_TRUNCATE:
  131. return "SQLITE_IOERR_TRUNCATE"
  132. case SQLITE_IOERR_FSTAT:
  133. return "SQLITE_IOERR_FSTAT"
  134. case SQLITE_IOERR_UNLOCK:
  135. return "SQLITE_IOERR_UNLOCK"
  136. case SQLITE_IOERR_RDLOCK:
  137. return "SQLITE_IOERR_RDLOCK"
  138. case SQLITE_IOERR_DELETE:
  139. return "SQLITE_IOERR_DELETE"
  140. case SQLITE_IOERR_BLOCKED:
  141. return "SQLITE_IOERR_BLOCKED"
  142. case SQLITE_IOERR_NOMEM:
  143. return "SQLITE_IOERR_NOMEM"
  144. case SQLITE_IOERR_ACCESS:
  145. return "SQLITE_IOERR_ACCESS"
  146. case SQLITE_IOERR_CHECKRESERVEDLOCK:
  147. return "SQLITE_IOERR_CHECKRESERVEDLOCK"
  148. case SQLITE_IOERR_LOCK:
  149. return "SQLITE_IOERR_LOCK"
  150. case SQLITE_IOERR_CLOSE:
  151. return "SQLITE_IOERR_CLOSE"
  152. case SQLITE_IOERR_DIR_CLOSE:
  153. return "SQLITE_IOERR_DIR_CLOSE"
  154. case SQLITE_IOERR_SHMOPEN:
  155. return "SQLITE_IOERR_SHMOPEN"
  156. case SQLITE_IOERR_SHMSIZE:
  157. return "SQLITE_IOERR_SHMSIZE"
  158. case SQLITE_IOERR_SHMLOCK:
  159. return "SQLITE_IOERR_SHMLOCK"
  160. case SQLITE_IOERR_SHMMAP:
  161. return "SQLITE_IOERR_SHMMAP"
  162. case SQLITE_IOERR_SEEK:
  163. return "SQLITE_IOERR_SEEK"
  164. case SQLITE_IOERR_DELETE_NOENT:
  165. return "SQLITE_IOERR_DELETE_NOENT"
  166. case SQLITE_IOERR_MMAP:
  167. return "SQLITE_IOERR_MMAP"
  168. case SQLITE_IOERR_GETTEMPPATH:
  169. return "SQLITE_IOERR_GETTEMPPATH"
  170. case SQLITE_IOERR_CONVPATH:
  171. return "SQLITE_IOERR_CONVPATH"
  172. case SQLITE_IOERR_VNODE:
  173. return "SQLITE_IOERR_VNODE"
  174. case SQLITE_IOERR_AUTH:
  175. return "SQLITE_IOERR_AUTH"
  176. case SQLITE_IOERR_BEGIN_ATOMIC:
  177. return "SQLITE_IOERR_BEGIN_ATOMIC"
  178. case SQLITE_IOERR_COMMIT_ATOMIC:
  179. return "SQLITE_IOERR_COMMIT_ATOMIC"
  180. case SQLITE_IOERR_ROLLBACK_ATOMIC:
  181. return "SQLITE_IOERR_ROLLBACK_ATOMIC"
  182. case SQLITE_LOCKED_SHAREDCACHE:
  183. return "SQLITE_LOCKED_SHAREDCACHE"
  184. case SQLITE_BUSY_RECOVERY:
  185. return "SQLITE_BUSY_RECOVERY"
  186. case SQLITE_BUSY_SNAPSHOT:
  187. return "SQLITE_BUSY_SNAPSHOT"
  188. case SQLITE_CANTOPEN_NOTEMPDIR:
  189. return "SQLITE_CANTOPEN_NOTEMPDIR"
  190. case SQLITE_CANTOPEN_ISDIR:
  191. return "SQLITE_CANTOPEN_ISDIR"
  192. case SQLITE_CANTOPEN_FULLPATH:
  193. return "SQLITE_CANTOPEN_FULLPATH"
  194. case SQLITE_CANTOPEN_CONVPATH:
  195. return "SQLITE_CANTOPEN_CONVPATH"
  196. case SQLITE_CORRUPT_VTAB:
  197. return "SQLITE_CORRUPT_VTAB"
  198. case SQLITE_READONLY_RECOVERY:
  199. return "SQLITE_READONLY_RECOVERY"
  200. case SQLITE_READONLY_CANTLOCK:
  201. return "SQLITE_READONLY_CANTLOCK"
  202. case SQLITE_READONLY_ROLLBACK:
  203. return "SQLITE_READONLY_ROLLBACK"
  204. case SQLITE_READONLY_DBMOVED:
  205. return "SQLITE_READONLY_DBMOVED"
  206. case SQLITE_READONLY_CANTINIT:
  207. return "SQLITE_READONLY_CANTINIT"
  208. case SQLITE_READONLY_DIRECTORY:
  209. return "SQLITE_READONLY_DIRECTORY"
  210. case SQLITE_ABORT_ROLLBACK:
  211. return "SQLITE_ABORT_ROLLBACK"
  212. case SQLITE_CONSTRAINT_CHECK:
  213. return "SQLITE_CONSTRAINT_CHECK"
  214. case SQLITE_CONSTRAINT_COMMITHOOK:
  215. return "SQLITE_CONSTRAINT_COMMITHOOK"
  216. case SQLITE_CONSTRAINT_FOREIGNKEY:
  217. return "SQLITE_CONSTRAINT_FOREIGNKEY"
  218. case SQLITE_CONSTRAINT_FUNCTION:
  219. return "SQLITE_CONSTRAINT_FUNCTION"
  220. case SQLITE_CONSTRAINT_NOTNULL:
  221. return "SQLITE_CONSTRAINT_NOTNULL"
  222. case SQLITE_CONSTRAINT_PRIMARYKEY:
  223. return "SQLITE_CONSTRAINT_PRIMARYKEY"
  224. case SQLITE_CONSTRAINT_TRIGGER:
  225. return "SQLITE_CONSTRAINT_TRIGGER"
  226. case SQLITE_CONSTRAINT_UNIQUE:
  227. return "SQLITE_CONSTRAINT_UNIQUE"
  228. case SQLITE_CONSTRAINT_VTAB:
  229. return "SQLITE_CONSTRAINT_VTAB"
  230. case SQLITE_CONSTRAINT_ROWID:
  231. return "SQLITE_CONSTRAINT_ROWID"
  232. case SQLITE_NOTICE_RECOVER_WAL:
  233. return "SQLITE_NOTICE_RECOVER_WAL"
  234. case SQLITE_NOTICE_RECOVER_ROLLBACK:
  235. return "SQLITE_NOTICE_RECOVER_ROLLBACK"
  236. case SQLITE_WARNING_AUTOINDEX:
  237. return "SQLITE_WARNING_AUTOINDEX"
  238. case SQLITE_AUTH_USER:
  239. return "SQLITE_AUTH_USER"
  240. }
  241. }
  242. const (
  243. SQLITE_OK = ErrorCode(C.SQLITE_OK) // do not use in Error
  244. SQLITE_ERROR = ErrorCode(C.SQLITE_ERROR)
  245. SQLITE_INTERNAL = ErrorCode(C.SQLITE_INTERNAL)
  246. SQLITE_PERM = ErrorCode(C.SQLITE_PERM)
  247. SQLITE_ABORT = ErrorCode(C.SQLITE_ABORT)
  248. SQLITE_BUSY = ErrorCode(C.SQLITE_BUSY)
  249. SQLITE_LOCKED = ErrorCode(C.SQLITE_LOCKED)
  250. SQLITE_NOMEM = ErrorCode(C.SQLITE_NOMEM)
  251. SQLITE_READONLY = ErrorCode(C.SQLITE_READONLY)
  252. SQLITE_INTERRUPT = ErrorCode(C.SQLITE_INTERRUPT)
  253. SQLITE_IOERR = ErrorCode(C.SQLITE_IOERR)
  254. SQLITE_CORRUPT = ErrorCode(C.SQLITE_CORRUPT)
  255. SQLITE_NOTFOUND = ErrorCode(C.SQLITE_NOTFOUND)
  256. SQLITE_FULL = ErrorCode(C.SQLITE_FULL)
  257. SQLITE_CANTOPEN = ErrorCode(C.SQLITE_CANTOPEN)
  258. SQLITE_PROTOCOL = ErrorCode(C.SQLITE_PROTOCOL)
  259. SQLITE_EMPTY = ErrorCode(C.SQLITE_EMPTY)
  260. SQLITE_SCHEMA = ErrorCode(C.SQLITE_SCHEMA)
  261. SQLITE_TOOBIG = ErrorCode(C.SQLITE_TOOBIG)
  262. SQLITE_CONSTRAINT = ErrorCode(C.SQLITE_CONSTRAINT)
  263. SQLITE_MISMATCH = ErrorCode(C.SQLITE_MISMATCH)
  264. SQLITE_MISUSE = ErrorCode(C.SQLITE_MISUSE)
  265. SQLITE_NOLFS = ErrorCode(C.SQLITE_NOLFS)
  266. SQLITE_AUTH = ErrorCode(C.SQLITE_AUTH)
  267. SQLITE_FORMAT = ErrorCode(C.SQLITE_FORMAT)
  268. SQLITE_RANGE = ErrorCode(C.SQLITE_RANGE)
  269. SQLITE_NOTADB = ErrorCode(C.SQLITE_NOTADB)
  270. SQLITE_NOTICE = ErrorCode(C.SQLITE_NOTICE)
  271. SQLITE_WARNING = ErrorCode(C.SQLITE_WARNING)
  272. SQLITE_ROW = ErrorCode(C.SQLITE_ROW) // do not use in Error
  273. SQLITE_DONE = ErrorCode(C.SQLITE_DONE) // do not use in Error
  274. SQLITE_ERROR_MISSING_COLLSEQ = ErrorCode(C.SQLITE_ERROR_MISSING_COLLSEQ)
  275. SQLITE_ERROR_RETRY = ErrorCode(C.SQLITE_ERROR_RETRY)
  276. SQLITE_ERROR_SNAPSHOT = ErrorCode(C.SQLITE_ERROR_SNAPSHOT)
  277. SQLITE_IOERR_READ = ErrorCode(C.SQLITE_IOERR_READ)
  278. SQLITE_IOERR_SHORT_READ = ErrorCode(C.SQLITE_IOERR_SHORT_READ)
  279. SQLITE_IOERR_WRITE = ErrorCode(C.SQLITE_IOERR_WRITE)
  280. SQLITE_IOERR_FSYNC = ErrorCode(C.SQLITE_IOERR_FSYNC)
  281. SQLITE_IOERR_DIR_FSYNC = ErrorCode(C.SQLITE_IOERR_DIR_FSYNC)
  282. SQLITE_IOERR_TRUNCATE = ErrorCode(C.SQLITE_IOERR_TRUNCATE)
  283. SQLITE_IOERR_FSTAT = ErrorCode(C.SQLITE_IOERR_FSTAT)
  284. SQLITE_IOERR_UNLOCK = ErrorCode(C.SQLITE_IOERR_UNLOCK)
  285. SQLITE_IOERR_RDLOCK = ErrorCode(C.SQLITE_IOERR_RDLOCK)
  286. SQLITE_IOERR_DELETE = ErrorCode(C.SQLITE_IOERR_DELETE)
  287. SQLITE_IOERR_BLOCKED = ErrorCode(C.SQLITE_IOERR_BLOCKED)
  288. SQLITE_IOERR_NOMEM = ErrorCode(C.SQLITE_IOERR_NOMEM)
  289. SQLITE_IOERR_ACCESS = ErrorCode(C.SQLITE_IOERR_ACCESS)
  290. SQLITE_IOERR_CHECKRESERVEDLOCK = ErrorCode(C.SQLITE_IOERR_CHECKRESERVEDLOCK)
  291. SQLITE_IOERR_LOCK = ErrorCode(C.SQLITE_IOERR_LOCK)
  292. SQLITE_IOERR_CLOSE = ErrorCode(C.SQLITE_IOERR_CLOSE)
  293. SQLITE_IOERR_DIR_CLOSE = ErrorCode(C.SQLITE_IOERR_DIR_CLOSE)
  294. SQLITE_IOERR_SHMOPEN = ErrorCode(C.SQLITE_IOERR_SHMOPEN)
  295. SQLITE_IOERR_SHMSIZE = ErrorCode(C.SQLITE_IOERR_SHMSIZE)
  296. SQLITE_IOERR_SHMLOCK = ErrorCode(C.SQLITE_IOERR_SHMLOCK)
  297. SQLITE_IOERR_SHMMAP = ErrorCode(C.SQLITE_IOERR_SHMMAP)
  298. SQLITE_IOERR_SEEK = ErrorCode(C.SQLITE_IOERR_SEEK)
  299. SQLITE_IOERR_DELETE_NOENT = ErrorCode(C.SQLITE_IOERR_DELETE_NOENT)
  300. SQLITE_IOERR_MMAP = ErrorCode(C.SQLITE_IOERR_MMAP)
  301. SQLITE_IOERR_GETTEMPPATH = ErrorCode(C.SQLITE_IOERR_GETTEMPPATH)
  302. SQLITE_IOERR_CONVPATH = ErrorCode(C.SQLITE_IOERR_CONVPATH)
  303. SQLITE_IOERR_VNODE = ErrorCode(C.SQLITE_IOERR_VNODE)
  304. SQLITE_IOERR_AUTH = ErrorCode(C.SQLITE_IOERR_AUTH)
  305. SQLITE_IOERR_BEGIN_ATOMIC = ErrorCode(C.SQLITE_IOERR_BEGIN_ATOMIC)
  306. SQLITE_IOERR_COMMIT_ATOMIC = ErrorCode(C.SQLITE_IOERR_COMMIT_ATOMIC)
  307. SQLITE_IOERR_ROLLBACK_ATOMIC = ErrorCode(C.SQLITE_IOERR_ROLLBACK_ATOMIC)
  308. SQLITE_LOCKED_SHAREDCACHE = ErrorCode(C.SQLITE_LOCKED_SHAREDCACHE)
  309. SQLITE_BUSY_RECOVERY = ErrorCode(C.SQLITE_BUSY_RECOVERY)
  310. SQLITE_BUSY_SNAPSHOT = ErrorCode(C.SQLITE_BUSY_SNAPSHOT)
  311. SQLITE_CANTOPEN_NOTEMPDIR = ErrorCode(C.SQLITE_CANTOPEN_NOTEMPDIR)
  312. SQLITE_CANTOPEN_ISDIR = ErrorCode(C.SQLITE_CANTOPEN_ISDIR)
  313. SQLITE_CANTOPEN_FULLPATH = ErrorCode(C.SQLITE_CANTOPEN_FULLPATH)
  314. SQLITE_CANTOPEN_CONVPATH = ErrorCode(C.SQLITE_CANTOPEN_CONVPATH)
  315. SQLITE_CORRUPT_VTAB = ErrorCode(C.SQLITE_CORRUPT_VTAB)
  316. SQLITE_READONLY_RECOVERY = ErrorCode(C.SQLITE_READONLY_RECOVERY)
  317. SQLITE_READONLY_CANTLOCK = ErrorCode(C.SQLITE_READONLY_CANTLOCK)
  318. SQLITE_READONLY_ROLLBACK = ErrorCode(C.SQLITE_READONLY_ROLLBACK)
  319. SQLITE_READONLY_DBMOVED = ErrorCode(C.SQLITE_READONLY_DBMOVED)
  320. SQLITE_READONLY_CANTINIT = ErrorCode(C.SQLITE_READONLY_CANTINIT)
  321. SQLITE_READONLY_DIRECTORY = ErrorCode(C.SQLITE_READONLY_DIRECTORY)
  322. SQLITE_ABORT_ROLLBACK = ErrorCode(C.SQLITE_ABORT_ROLLBACK)
  323. SQLITE_CONSTRAINT_CHECK = ErrorCode(C.SQLITE_CONSTRAINT_CHECK)
  324. SQLITE_CONSTRAINT_COMMITHOOK = ErrorCode(C.SQLITE_CONSTRAINT_COMMITHOOK)
  325. SQLITE_CONSTRAINT_FOREIGNKEY = ErrorCode(C.SQLITE_CONSTRAINT_FOREIGNKEY)
  326. SQLITE_CONSTRAINT_FUNCTION = ErrorCode(C.SQLITE_CONSTRAINT_FUNCTION)
  327. SQLITE_CONSTRAINT_NOTNULL = ErrorCode(C.SQLITE_CONSTRAINT_NOTNULL)
  328. SQLITE_CONSTRAINT_PRIMARYKEY = ErrorCode(C.SQLITE_CONSTRAINT_PRIMARYKEY)
  329. SQLITE_CONSTRAINT_TRIGGER = ErrorCode(C.SQLITE_CONSTRAINT_TRIGGER)
  330. SQLITE_CONSTRAINT_UNIQUE = ErrorCode(C.SQLITE_CONSTRAINT_UNIQUE)
  331. SQLITE_CONSTRAINT_VTAB = ErrorCode(C.SQLITE_CONSTRAINT_VTAB)
  332. SQLITE_CONSTRAINT_ROWID = ErrorCode(C.SQLITE_CONSTRAINT_ROWID)
  333. SQLITE_NOTICE_RECOVER_WAL = ErrorCode(C.SQLITE_NOTICE_RECOVER_WAL)
  334. SQLITE_NOTICE_RECOVER_ROLLBACK = ErrorCode(C.SQLITE_NOTICE_RECOVER_ROLLBACK)
  335. SQLITE_WARNING_AUTOINDEX = ErrorCode(C.SQLITE_WARNING_AUTOINDEX)
  336. SQLITE_AUTH_USER = ErrorCode(C.SQLITE_AUTH_USER)
  337. )
  338. // ErrCode extracts the SQLite error code from err.
  339. // If err is not a sqlite Error, SQLITE_ERROR is returned.
  340. // If err is nil, SQLITE_OK is returned.
  341. func ErrCode(err error) ErrorCode {
  342. var sqliteError Error
  343. if errors.As(err, &sqliteError) {
  344. return sqliteError.Code
  345. }
  346. if err != nil {
  347. return SQLITE_ERROR
  348. }
  349. return SQLITE_OK
  350. }
  351. func itoa(buf []byte, val int64) []byte {
  352. i := len(buf) - 1
  353. neg := false
  354. if val < 0 {
  355. neg = true
  356. val = 0 - val
  357. }
  358. for val >= 10 {
  359. buf[i] = byte(val%10 + '0')
  360. i--
  361. val /= 10
  362. }
  363. buf[i] = byte(val + '0')
  364. if neg {
  365. i--
  366. buf[i] = '-'
  367. }
  368. return buf[i:]
  369. }