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.3 kB

2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package db
  2. import (
  3. "context"
  4. "database/sql"
  5. "fmt"
  6. _ "github.com/go-sql-driver/mysql"
  7. "github.com/jmoiron/sqlx"
  8. "gitlink.org.cn/cloudream/storage/common/pkgs/db/config"
  9. )
  10. type DB struct {
  11. d *sqlx.DB
  12. }
  13. type SQLContext interface {
  14. sqlx.Queryer
  15. sqlx.Execer
  16. sqlx.Ext
  17. sqlx.Preparer
  18. NamedQuery(query string, arg interface{}) (*sqlx.Rows, error)
  19. NamedExec(query string, arg interface{}) (sql.Result, error)
  20. PrepareNamed(query string) (*sqlx.NamedStmt, error)
  21. }
  22. func NewDB(cfg *config.Config) (*DB, error) {
  23. db, err := sqlx.Open("mysql", cfg.MakeSourceString())
  24. if err != nil {
  25. return nil, fmt.Errorf("open database connection failed, err: %w", err)
  26. }
  27. // 尝试连接一下数据库,如果数据库配置有错误在这里就能报出来
  28. err = db.Ping()
  29. if err != nil {
  30. return nil, err
  31. }
  32. return &DB{
  33. d: db,
  34. }, nil
  35. }
  36. func (db *DB) DoTx(isolation sql.IsolationLevel, fn func(tx *sqlx.Tx) error) error {
  37. tx, err := db.d.BeginTxx(context.Background(), &sql.TxOptions{Isolation: isolation})
  38. if err != nil {
  39. return err
  40. }
  41. if err := fn(tx); err != nil {
  42. tx.Rollback()
  43. return err
  44. }
  45. if err := tx.Commit(); err != nil {
  46. tx.Rollback()
  47. return err
  48. }
  49. return nil
  50. }
  51. func (db *DB) SQLCtx() SQLContext {
  52. return db.d
  53. }

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