init.go 2.1 KB

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