/api/datastore/sql/sqlite/sqlite.go

https://github.com/fnproject/fn · Go · 73 lines · 58 code · 14 blank · 1 comment · 10 complexity · 64110486a8621aa064256a3eb17d1eb0 MD5 · raw file

  1. package sqlite
  2. import (
  3. "net/url"
  4. "os"
  5. "path/filepath"
  6. "strings"
  7. "github.com/fnproject/fn/api/datastore/sql/dbhelper"
  8. "github.com/jmoiron/sqlx"
  9. "github.com/mattn/go-sqlite3"
  10. )
  11. type sqliteHelper int
  12. func (sqliteHelper) Supports(scheme string) bool {
  13. switch scheme {
  14. case "sqlite3", "sqlite":
  15. return true
  16. }
  17. return false
  18. }
  19. func (sqliteHelper) PreConnect(url *url.URL) (string, error) {
  20. // make all the dirs so we can make the file..
  21. dir := filepath.Dir(url.Path)
  22. err := os.MkdirAll(dir, 0750)
  23. if err != nil {
  24. return "", err
  25. }
  26. return strings.TrimPrefix(url.String(), url.Scheme+"://"), nil
  27. }
  28. func (sqliteHelper) PostCreate(db *sqlx.DB) (*sqlx.DB, error) {
  29. db.SetMaxOpenConns(1)
  30. return db, nil
  31. }
  32. func (sqliteHelper) CheckTableExists(tx *sqlx.Tx, table string) (bool, error) {
  33. query := tx.Rebind(`SELECT count(*)
  34. FROM sqlite_master
  35. WHERE name = ?`)
  36. row := tx.QueryRow(query, table)
  37. var count int
  38. err := row.Scan(&count)
  39. if err != nil {
  40. return false, err
  41. }
  42. exists := count > 0
  43. return exists, nil
  44. }
  45. func (sqliteHelper) String() string {
  46. return "sqlite"
  47. }
  48. func (sqliteHelper) IsDuplicateKeyError(err error) bool {
  49. sqliteErr, ok := err.(sqlite3.Error)
  50. if ok {
  51. if sqliteErr.ExtendedCode == sqlite3.ErrConstraintUnique || sqliteErr.ExtendedCode == sqlite3.ErrConstraintPrimaryKey {
  52. return true
  53. }
  54. }
  55. return false
  56. }
  57. func init() {
  58. dbhelper.Register(sqliteHelper(0))
  59. }