init.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package mysql
  2. import (
  3. "fmt"
  4. _ "github.com/go-sql-driver/mysql"
  5. "github.com/jmoiron/sqlx"
  6. log "github.com/sirupsen/logrus"
  7. "pmail/config"
  8. "pmail/dto"
  9. )
  10. var Instance *sqlx.DB
  11. func Init() {
  12. dsn := config.Instance.MysqlDSN
  13. var err error
  14. Instance, err = sqlx.Open("mysql", dsn)
  15. if err != nil {
  16. panic(err)
  17. }
  18. Instance.SetMaxOpenConns(100)
  19. Instance.SetMaxIdleConns(10)
  20. showMySQLCharacterSet()
  21. checkTable()
  22. }
  23. func WithContext(ctx *dto.Context, sql string) string {
  24. if ctx != nil {
  25. logId := ctx.GetValue(dto.LogID)
  26. return fmt.Sprintf("/* %s */ %s", logId, sql)
  27. }
  28. return sql
  29. }
  30. type tables struct {
  31. TablesInPmail string `db:"Tables_in_pmail"`
  32. }
  33. func checkTable() {
  34. var res []*tables
  35. err := Instance.Select(&res, "show tables")
  36. if err != nil {
  37. panic(err)
  38. }
  39. existTable := map[string]struct{}{}
  40. for _, tableName := range res {
  41. existTable[tableName.TablesInPmail] = struct{}{}
  42. }
  43. for tableName, createSQL := range config.Instance.Tables {
  44. if _, ok := existTable[tableName]; !ok {
  45. _, err = Instance.Exec(createSQL)
  46. log.Infof("Create Table: %s", createSQL)
  47. if err != nil {
  48. panic(err)
  49. }
  50. if initData, ok := config.Instance.TablesInitData[tableName]; ok {
  51. _, err = Instance.Exec(initData)
  52. log.Infof("Init Table: %s", initData)
  53. if err != nil {
  54. panic(err)
  55. }
  56. }
  57. }
  58. }
  59. }
  60. func showMySQLCharacterSet() {
  61. var res []struct {
  62. Variable_name string `db:"Variable_name"`
  63. Value string `db:"Value"`
  64. }
  65. err := Instance.Select(&res, "show variables like '%character%';")
  66. log.Debugf("%+v %+v", res, err)
  67. }
  68. func testSlowLog() {
  69. var res []struct {
  70. Value string `db:"Value"`
  71. }
  72. err := Instance.Select(&res, "/* asddddasad */select /* this is test */ sleep(4) as Value")
  73. log.Debugf("%+v %+v", res, err)
  74. }