query.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. // Copyright 2021 Ross Light
  2. // SPDX-License-Identifier: ISC
  3. package sqlitex
  4. import (
  5. "errors"
  6. "zombiezen.com/go/sqlite"
  7. )
  8. var errNoResults = errors.New("sqlite: statement has no results")
  9. var errMultipleResults = errors.New("sqlite: statement has multiple result rows")
  10. func resultSetup(stmt *sqlite.Stmt) error {
  11. hasRow, err := stmt.Step()
  12. if err != nil {
  13. stmt.Reset()
  14. return err
  15. }
  16. if !hasRow {
  17. stmt.Reset()
  18. return errNoResults
  19. }
  20. return nil
  21. }
  22. func resultTeardown(stmt *sqlite.Stmt) error {
  23. hasRow, err := stmt.Step()
  24. if err != nil {
  25. stmt.Reset()
  26. return err
  27. }
  28. if hasRow {
  29. stmt.Reset()
  30. return errMultipleResults
  31. }
  32. return stmt.Reset()
  33. }
  34. func ResultBool(stmt *sqlite.Stmt) (bool, error) {
  35. res, err := ResultInt64(stmt)
  36. return res != 0, err
  37. }
  38. func ResultInt(stmt *sqlite.Stmt) (int, error) {
  39. res, err := ResultInt64(stmt)
  40. return int(res), err
  41. }
  42. func ResultInt64(stmt *sqlite.Stmt) (int64, error) {
  43. if err := resultSetup(stmt); err != nil {
  44. return 0, err
  45. }
  46. res := stmt.ColumnInt64(0)
  47. if err := resultTeardown(stmt); err != nil {
  48. return 0, err
  49. }
  50. return res, nil
  51. }
  52. func ResultText(stmt *sqlite.Stmt) (string, error) {
  53. if err := resultSetup(stmt); err != nil {
  54. return "", err
  55. }
  56. res := stmt.ColumnText(0)
  57. if err := resultTeardown(stmt); err != nil {
  58. return "", err
  59. }
  60. return res, nil
  61. }
  62. func ResultFloat(stmt *sqlite.Stmt) (float64, error) {
  63. if err := resultSetup(stmt); err != nil {
  64. return 0, err
  65. }
  66. res := stmt.ColumnFloat(0)
  67. if err := resultTeardown(stmt); err != nil {
  68. return 0, err
  69. }
  70. return res, nil
  71. }