support.go 2.3 KB

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