You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

db.go 1.7 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package db
  2. import (
  3. _ "github.com/go-sql-driver/mysql"
  4. "github.com/sirupsen/logrus"
  5. "gitlink.org.cn/cloudream/storage2/common/pkgs/db2/config"
  6. "gorm.io/driver/mysql"
  7. "gorm.io/gorm"
  8. )
  9. type DB struct {
  10. db *gorm.DB
  11. }
  12. func NewDB(cfg *config.Config) (*DB, error) {
  13. mydb, err := gorm.Open(mysql.Open(cfg.MakeSourceString()), &gorm.Config{})
  14. if err != nil {
  15. logrus.Fatalf("failed to connect to database: %v", err)
  16. }
  17. return &DB{
  18. db: mydb,
  19. }, nil
  20. }
  21. func (db *DB) DoTx(do func(tx SQLContext) error) error {
  22. return db.db.Transaction(func(tx *gorm.DB) error {
  23. return do(SQLContext{tx})
  24. })
  25. }
  26. func DoTx02[R any](db *DB, do func(tx SQLContext) (R, error)) (R, error) {
  27. var ret R
  28. err := db.db.Transaction(func(tx *gorm.DB) error {
  29. var err error
  30. ret, err = do(SQLContext{tx})
  31. return err
  32. })
  33. return ret, err
  34. }
  35. func DoTx12[T any, R any](db *DB, do func(tx SQLContext, t T) (R, error), t T) (R, error) {
  36. var ret R
  37. err := db.db.Transaction(func(tx *gorm.DB) error {
  38. var err error
  39. ret, err = do(SQLContext{tx}, t)
  40. return err
  41. })
  42. return ret, err
  43. }
  44. func DoTx22[T1 any, T2 any, R any](db *DB, do func(tx SQLContext, t1 T1, t2 T2) (R, error), t1 T1, t2 T2) (R, error) {
  45. var ret R
  46. err := db.db.Transaction(func(tx *gorm.DB) error {
  47. var err error
  48. ret, err = do(SQLContext{tx}, t1, t2)
  49. return err
  50. })
  51. return ret, err
  52. }
  53. func DoTx32[T1 any, T2 any, T3 any, R any](db *DB, do func(tx SQLContext, t1 T1, t2 T2, t3 T3) (R, error), t1 T1, t2 T2, t3 T3) (R, error) {
  54. var ret R
  55. err := db.db.Transaction(func(tx *gorm.DB) error {
  56. var err error
  57. ret, err = do(SQLContext{tx}, t1, t2, t3)
  58. return err
  59. })
  60. return ret, err
  61. }
  62. type SQLContext struct {
  63. *gorm.DB
  64. }
  65. func (db *DB) DefCtx() SQLContext {
  66. return SQLContext{db.db}
  67. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。