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.

cache.go 3.6 kB

2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package db
  2. /*
  3. import (
  4. "time"
  5. "github.com/jmoiron/sqlx"
  6. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  7. "gitlink.org.cn/cloudream/storage/common/pkgs/db/model"
  8. )
  9. type CacheDB struct {
  10. *DB
  11. }
  12. func (db *DB) Cache() *CacheDB {
  13. return &CacheDB{DB: db}
  14. }
  15. func (*CacheDB) Get(ctx SQLContext, fileHash string, hubID cdssdk.HubID) (model.Cache, error) {
  16. var ret model.Cache
  17. err := sqlx.Get(ctx, &ret, "select * from Cache where FileHash = ? and HubID = ?", fileHash, hubID)
  18. return ret, err
  19. }
  20. func (*CacheDB) BatchGetAllFileHashes(ctx SQLContext, start int, count int) ([]string, error) {
  21. var ret []string
  22. err := sqlx.Select(ctx, &ret, "select distinct FileHash from Cache limit ?, ?", start, count)
  23. return ret, err
  24. }
  25. func (*CacheDB) GetByHubID(ctx SQLContext, hubID cdssdk.HubID) ([]model.Cache, error) {
  26. var ret []model.Cache
  27. err := sqlx.Select(ctx, &ret, "select * from Cache where HubID = ?", hubID)
  28. return ret, err
  29. }
  30. // Create 创建一条的缓存记录,如果已有则不进行操作
  31. func (*CacheDB) Create(ctx SQLContext, fileHash string, hubID cdssdk.HubID, priority int) error {
  32. _, err := ctx.Exec("insert ignore into Cache values(?,?,?,?)", fileHash, hubID, time.Now(), priority)
  33. if err != nil {
  34. return err
  35. }
  36. return nil
  37. }
  38. // 批量创建缓存记录
  39. func (*CacheDB) BatchCreate(ctx SQLContext, caches []model.Cache) error {
  40. if len(caches) == 0 {
  41. return nil
  42. }
  43. return BatchNamedExec(
  44. ctx,
  45. "insert into Cache(FileHash,HubID,CreateTime,Priority) values(:FileHash,:HubID,:CreateTime,:Priority)"+
  46. " on duplicate key update CreateTime=values(CreateTime), Priority=values(Priority)",
  47. 4,
  48. caches,
  49. nil,
  50. )
  51. }
  52. func (*CacheDB) BatchCreateOnSameNode(ctx SQLContext, fileHashes []string, hubID cdssdk.HubID, priority int) error {
  53. if len(fileHashes) == 0 {
  54. return nil
  55. }
  56. var caches []model.Cache
  57. var nowTime = time.Now()
  58. for _, hash := range fileHashes {
  59. caches = append(caches, model.Cache{
  60. FileHash: hash,
  61. HubID: hubID,
  62. CreateTime: nowTime,
  63. Priority: priority,
  64. })
  65. }
  66. return BatchNamedExec(ctx,
  67. "insert into Cache(FileHash,HubID,CreateTime,Priority) values(:FileHash,:HubID,:CreateTime,:Priority)"+
  68. " on duplicate key update CreateTime=values(CreateTime), Priority=values(Priority)",
  69. 4,
  70. caches,
  71. nil,
  72. )
  73. }
  74. func (*CacheDB) NodeBatchDelete(ctx SQLContext, hubID cdssdk.HubID, fileHashes []string) error {
  75. if len(fileHashes) == 0 {
  76. return nil
  77. }
  78. // TODO in语句有长度限制
  79. query, args, err := sqlx.In("delete from Cache where HubID = ? and FileHash in (?)", hubID, fileHashes)
  80. if err != nil {
  81. return err
  82. }
  83. _, err = ctx.Exec(query, args...)
  84. return err
  85. }
  86. // GetCachingFileNodes 查找缓存了指定文件的节点
  87. func (*CacheDB) GetCachingFileNodes(ctx SQLContext, fileHash string) ([]cdssdk.Node, error) {
  88. var x []cdssdk.Node
  89. err := sqlx.Select(ctx, &x,
  90. "select Node.* from Cache, Node where Cache.FileHash=? and Cache.HubID = Node.HubID", fileHash)
  91. return x, err
  92. }
  93. // DeleteNodeAll 删除一个节点所有的记录
  94. func (*CacheDB) DeleteNodeAll(ctx SQLContext, hubID cdssdk.HubID) error {
  95. _, err := ctx.Exec("delete from Cache where HubID = ?", hubID)
  96. return err
  97. }
  98. // FindCachingFileUserNodes 在缓存表中查询指定数据所在的节点
  99. func (*CacheDB) FindCachingFileUserNodes(ctx SQLContext, userID cdssdk.HubID, fileHash string) ([]cdssdk.Node, error) {
  100. var x []cdssdk.Node
  101. err := sqlx.Select(ctx, &x,
  102. "select Node.* from Cache, UserNode, Node where"+
  103. " Cache.FileHash=? and Cache.HubID = UserNode.HubID and"+
  104. " UserNode.UserID = ? and UserNode.HubID = Node.HubID", fileHash, userID)
  105. return x, err
  106. }
  107. */

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