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 2.3 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package db
  2. import (
  3. _ "github.com/go-sql-driver/mysql"
  4. "github.com/sirupsen/logrus"
  5. "gorm.io/driver/mysql"
  6. "gorm.io/gorm"
  7. )
  8. type DB struct {
  9. db *gorm.DB
  10. }
  11. func NewDB(cfg *Config) (*DB, error) {
  12. mydb, err := gorm.Open(mysql.Open(cfg.MakeSourceString()), &gorm.Config{})
  13. if err != nil {
  14. logrus.Fatalf("failed to connect to database: %v", err)
  15. }
  16. return &DB{
  17. db: mydb,
  18. }, nil
  19. }
  20. func (db *DB) DoTx(do func(tx SQLContext) error) error {
  21. return db.db.Transaction(func(tx *gorm.DB) error {
  22. return do(SQLContext{tx})
  23. })
  24. }
  25. func DoTx10[T any](db *DB, do func(tx SQLContext, t T) error, t T) error {
  26. return db.db.Transaction(func(tx *gorm.DB) error {
  27. return do(SQLContext{tx}, t)
  28. })
  29. }
  30. func DoTx01[R any](db *DB, do func(tx SQLContext) (R, error)) (R, error) {
  31. var ret R
  32. err := db.db.Transaction(func(tx *gorm.DB) error {
  33. var err error
  34. ret, err = do(SQLContext{tx})
  35. return err
  36. })
  37. return ret, err
  38. }
  39. func DoTx02[R1, R2 any](db *DB, do func(tx SQLContext) (R1, R2, error)) (R1, R2, error) {
  40. var ret1 R1
  41. var ret2 R2
  42. err := db.db.Transaction(func(tx *gorm.DB) error {
  43. var err error
  44. ret1, ret2, err = do(SQLContext{tx})
  45. return err
  46. })
  47. return ret1, ret2, err
  48. }
  49. func DoTx11[T any, R any](db *DB, do func(tx SQLContext, t T) (R, error), t T) (R, error) {
  50. var ret R
  51. err := db.db.Transaction(func(tx *gorm.DB) error {
  52. var err error
  53. ret, err = do(SQLContext{tx}, t)
  54. return err
  55. })
  56. return ret, err
  57. }
  58. func DoTx20[T1 any, T2 any](db *DB, do func(tx SQLContext, t1 T1, t2 T2) error, t1 T1, t2 T2) error {
  59. return db.db.Transaction(func(tx *gorm.DB) error {
  60. return do(SQLContext{tx}, t1, t2)
  61. })
  62. }
  63. func DoTx21[T1 any, T2 any, R any](db *DB, do func(tx SQLContext, t1 T1, t2 T2) (R, error), t1 T1, t2 T2) (R, error) {
  64. var ret R
  65. err := db.db.Transaction(func(tx *gorm.DB) error {
  66. var err error
  67. ret, err = do(SQLContext{tx}, t1, t2)
  68. return err
  69. })
  70. return ret, err
  71. }
  72. func DoTx31[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) {
  73. var ret R
  74. err := db.db.Transaction(func(tx *gorm.DB) error {
  75. var err error
  76. ret, err = do(SQLContext{tx}, t1, t2, t3)
  77. return err
  78. })
  79. return ret, err
  80. }
  81. type SQLContext struct {
  82. *gorm.DB
  83. }
  84. func (db *DB) DefCtx() SQLContext {
  85. return SQLContext{db.db}
  86. }

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