You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

sqlite.go 1.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package testfixtures
  2. import (
  3. "database/sql"
  4. "path/filepath"
  5. )
  6. type sqlite struct {
  7. baseHelper
  8. }
  9. func (*sqlite) paramType() int {
  10. return paramTypeQuestion
  11. }
  12. func (*sqlite) databaseName(q queryable) (string, error) {
  13. var seq int
  14. var main, dbName string
  15. err := q.QueryRow("PRAGMA database_list").Scan(&seq, &main, &dbName)
  16. if err != nil {
  17. return "", err
  18. }
  19. dbName = filepath.Base(dbName)
  20. return dbName, nil
  21. }
  22. func (*sqlite) tableNames(q queryable) ([]string, error) {
  23. query := `
  24. SELECT name
  25. FROM sqlite_master
  26. WHERE type = 'table';
  27. `
  28. rows, err := q.Query(query)
  29. if err != nil {
  30. return nil, err
  31. }
  32. defer rows.Close()
  33. var tables []string
  34. for rows.Next() {
  35. var table string
  36. if err = rows.Scan(&table); err != nil {
  37. return nil, err
  38. }
  39. tables = append(tables, table)
  40. }
  41. if err = rows.Err(); err != nil {
  42. return nil, err
  43. }
  44. return tables, nil
  45. }
  46. func (*sqlite) disableReferentialIntegrity(db *sql.DB, loadFn loadFunction) (err error) {
  47. defer func() {
  48. if _, err2 := db.Exec("PRAGMA defer_foreign_keys = OFF"); err2 != nil && err == nil {
  49. err = err2
  50. }
  51. }()
  52. if _, err = db.Exec("PRAGMA defer_foreign_keys = ON"); err != nil {
  53. return err
  54. }
  55. tx, err := db.Begin()
  56. if err != nil {
  57. return err
  58. }
  59. defer tx.Rollback()
  60. if err = loadFn(tx); err != nil {
  61. return err
  62. }
  63. return tx.Commit()
  64. }