support.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package support
  2. import (
  3. "context"
  4. "io/ioutil"
  5. "os"
  6. "regexp"
  7. "strings"
  8. "golang-fave/engine/sqlw"
  9. "golang-fave/support/migrate"
  10. "golang-fave/utils"
  11. )
  12. type Support struct {
  13. }
  14. func New() *Support {
  15. sup := Support{}
  16. return &sup
  17. }
  18. func (this *Support) isSettingsTableDoesntExist(err error) bool {
  19. error_msg := strings.ToLower(err.Error())
  20. if match, _ := regexp.MatchString(`^error 1146`, error_msg); match {
  21. if match, _ := regexp.MatchString(`'[^\.]+\.settings'`, error_msg); match {
  22. if match, _ := regexp.MatchString(`doesn't exist$`, error_msg); match {
  23. return true
  24. }
  25. }
  26. }
  27. return false
  28. }
  29. func (this *Support) Migration(ctx context.Context, dir string) error {
  30. files, err := ioutil.ReadDir(dir)
  31. if err != nil {
  32. return err
  33. }
  34. for _, file := range files {
  35. if utils.IsDir(dir + string(os.PathSeparator) + file.Name()) {
  36. if err := this.Migrate(ctx, dir+string(os.PathSeparator)+file.Name()); err != nil {
  37. return err
  38. }
  39. }
  40. }
  41. return nil
  42. }
  43. func (this *Support) Migrate(ctx context.Context, host string) error {
  44. mysql_config_file := host + string(os.PathSeparator) + "config" + string(os.PathSeparator) + "mysql.json"
  45. if utils.IsMySqlConfigExists(mysql_config_file) {
  46. mc, err := utils.MySqlConfigRead(mysql_config_file)
  47. if err != nil {
  48. return err
  49. }
  50. db, err := sqlw.Open("mysql", mc.User+":"+mc.Password+"@tcp("+mc.Host+":"+mc.Port+")/"+mc.Name)
  51. if err != nil {
  52. return err
  53. }
  54. if err := db.Ping(ctx); err != nil {
  55. return err
  56. }
  57. defer db.Close()
  58. var version string
  59. if err := db.QueryRow(ctx, `SELECT value FROM settings WHERE name = 'database_version' LIMIT 1;`).Scan(&version); err != nil {
  60. if this.isSettingsTableDoesntExist(err) {
  61. if _, err := db.Exec(
  62. `CREATE TABLE settings (
  63. name varchar(255) NOT NULL COMMENT 'Setting name',
  64. value text NOT NULL COMMENT 'Setting value'
  65. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;`,
  66. ); err != nil {
  67. return err
  68. }
  69. if _, err := db.Exec(
  70. `INSERT INTO settings (name, value) VALUES ('database_version', '000000002');`,
  71. ); err != nil {
  72. return err
  73. }
  74. version = "000000002"
  75. err = nil
  76. }
  77. return err
  78. }
  79. return this.Process(db, version, host)
  80. }
  81. return nil
  82. }
  83. func (this *Support) Process(db *sqlw.DB, version string, host string) error {
  84. return migrate.Run(db, utils.StrToInt(version), host)
  85. }