init.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package db
  2. import (
  3. "fmt"
  4. "time"
  5. "github.com/langgenius/dify-plugin-daemon/internal/types/app"
  6. "github.com/langgenius/dify-plugin-daemon/internal/types/models"
  7. "github.com/langgenius/dify-plugin-daemon/internal/utils/log"
  8. "gorm.io/driver/postgres"
  9. "gorm.io/gorm"
  10. )
  11. func initDifyPluginDB(host string, port int, db_name string, user string, pass string, sslmode string) error {
  12. // create db if not exists
  13. dsn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=%s", host, port, user, pass, "postgres", sslmode)
  14. db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
  15. if err != nil {
  16. return err
  17. }
  18. pgsqlDB, err := db.DB()
  19. if err != nil {
  20. return err
  21. }
  22. // check if the db exists
  23. rows, err := pgsqlDB.Query(fmt.Sprintf("SELECT 1 FROM pg_database WHERE datname = '%s'", db_name))
  24. if err != nil {
  25. return err
  26. }
  27. if !rows.Next() {
  28. // create database
  29. _, err = pgsqlDB.Exec(fmt.Sprintf("CREATE DATABASE %s", db_name))
  30. if err != nil {
  31. return err
  32. }
  33. }
  34. // close db
  35. err = pgsqlDB.Close()
  36. if err != nil {
  37. return err
  38. }
  39. // connect to the new db
  40. dsn = fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=%s", host, port, user, pass, db_name, sslmode)
  41. db, err = gorm.Open(postgres.Open(dsn), &gorm.Config{})
  42. if err != nil {
  43. return err
  44. }
  45. pgsqlDB, err = db.DB()
  46. if err != nil {
  47. return err
  48. }
  49. // check if uuid-ossp extension exists
  50. rows, err = pgsqlDB.Query("SELECT 1 FROM pg_extension WHERE extname = 'uuid-ossp'")
  51. if err != nil {
  52. return err
  53. }
  54. if !rows.Next() {
  55. // create the uuid-ossp extension
  56. _, err = pgsqlDB.Exec("CREATE EXTENSION IF NOT EXISTS \"uuid-ossp\"")
  57. if err != nil {
  58. return err
  59. }
  60. }
  61. pgsqlDB.SetConnMaxIdleTime(time.Minute * 1)
  62. DifyPluginDB = db
  63. return nil
  64. }
  65. func autoMigrate() error {
  66. return DifyPluginDB.AutoMigrate(
  67. models.Plugin{},
  68. models.PluginInstallation{},
  69. models.PluginDeclaration{},
  70. models.Endpoint{},
  71. models.ServerlessRuntime{},
  72. models.ToolInstallation{},
  73. models.AIModelInstallation{},
  74. models.InstallTask{},
  75. models.TenantStorage{},
  76. )
  77. }
  78. func Init(config *app.Config) {
  79. err := initDifyPluginDB(
  80. config.DBHost,
  81. int(config.DBPort),
  82. config.DBDatabase,
  83. config.DBUsername, config.DBPassword, config.DBSslMode,
  84. )
  85. if err != nil {
  86. log.Panic("failed to init dify plugin db: %v", err)
  87. }
  88. err = autoMigrate()
  89. if err != nil {
  90. log.Panic("failed to auto migrate: %v", err)
  91. }
  92. log.Info("dify plugin db initialized")
  93. }
  94. func Close() {
  95. db, err := DifyPluginDB.DB()
  96. if err != nil {
  97. log.Error("failed to close dify plugin db: %v", err)
  98. return
  99. }
  100. err = db.Close()
  101. if err != nil {
  102. log.Error("failed to close dify plugin db: %v", err)
  103. return
  104. }
  105. log.Info("dify plugin db closed")
  106. }