engine.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package migrations
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/go-xorm/xorm"
  6. "github.com/torkelo/grafana-pro/pkg/services/sqlstore/sqlsyntax"
  7. )
  8. var x *xorm.Engine
  9. var dialect sqlsyntax.Dialect
  10. func getSchemaVersion() (int, error) {
  11. exists, err := x.IsTableExist(new(SchemaVersion))
  12. if err != nil {
  13. return 0, err
  14. }
  15. if !exists {
  16. if err := x.CreateTables(new(SchemaVersion)); err != nil {
  17. return 0, err
  18. }
  19. return 0, nil
  20. }
  21. v := SchemaVersion{}
  22. _, err = x.Table("schema_version").Limit(1, 0).Desc("version").Get(&v)
  23. return v.Version, err
  24. }
  25. func StartMigration(engine *xorm.Engine) error {
  26. x = engine
  27. dialect = new(sqlsyntax.Sqlite3)
  28. _, err := getSchemaVersion()
  29. if err != nil {
  30. return err
  31. }
  32. for _, m := range migrationList {
  33. if err := execMigration(m); err != nil {
  34. return err
  35. }
  36. }
  37. return nil
  38. }
  39. func execMigration(m *migration) error {
  40. err := inTransaction(func(sess *xorm.Session) error {
  41. _, err := sess.Exec(m.sqlite)
  42. if err != nil {
  43. return err
  44. }
  45. return nil
  46. })
  47. if err != nil {
  48. return err
  49. }
  50. // verify
  51. if m.verifyTable != "" {
  52. sqlStr, args := dialect.TableCheckSql(m.verifyTable)
  53. results, err := x.Query(sqlStr, args...)
  54. if err != nil || len(results) == 0 {
  55. return errors.New(fmt.Sprintf("Verify failed: table %v does not exist", m.verifyTable))
  56. }
  57. }
  58. return nil
  59. }
  60. type dbTransactionFunc func(sess *xorm.Session) error
  61. func inTransaction(callback dbTransactionFunc) error {
  62. var err error
  63. sess := x.NewSession()
  64. defer sess.Close()
  65. if err = sess.Begin(); err != nil {
  66. return err
  67. }
  68. err = callback(sess)
  69. if err != nil {
  70. sess.Rollback()
  71. return err
  72. } else if err = sess.Commit(); err != nil {
  73. return err
  74. }
  75. return nil
  76. }