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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package db2
  2. import (
  3. "time"
  4. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  5. "gitlink.org.cn/cloudream/storage/common/pkgs/db/model"
  6. )
  7. type CacheDB struct {
  8. *DB
  9. }
  10. func (db *DB) Cache() *CacheDB {
  11. return &CacheDB{DB: db}
  12. }
  13. func (*CacheDB) Get(ctx SQLContext, fileHash string, nodeID cdssdk.NodeID) (model.Cache, error) {
  14. var ret model.Cache
  15. err := ctx.Table("Cache").Where("FileHash = ? AND NodeID = ?", fileHash, nodeID).First(&ret).Error
  16. return ret, err
  17. }
  18. func (*CacheDB) BatchGetAllFileHashes(ctx SQLContext, start int, count int) ([]string, error) {
  19. var ret []string
  20. err := ctx.Table("Cache").Distinct("FileHash").Offset(start).Limit(count).Pluck("FileHash", &ret).Error
  21. return ret, err
  22. }
  23. func (*CacheDB) GetByNodeID(ctx SQLContext, nodeID cdssdk.NodeID) ([]model.Cache, error) {
  24. var ret []model.Cache
  25. err := ctx.Table("Cache").Where("NodeID = ?", nodeID).Find(&ret).Error
  26. return ret, err
  27. }
  28. // Create 创建一条缓存记录,如果已有则不进行操作
  29. func (*CacheDB) Create(ctx SQLContext, fileHash string, nodeID cdssdk.NodeID, priority int) error {
  30. cache := model.Cache{FileHash: fileHash, NodeID: nodeID, CreateTime: time.Now(), Priority: priority}
  31. return ctx.Where(cache).Attrs(cache).FirstOrCreate(&cache).Error
  32. }
  33. // 批量创建缓存记录
  34. func (*CacheDB) BatchCreate(ctx SQLContext, caches []model.Cache) error {
  35. if len(caches) == 0 {
  36. return nil
  37. }
  38. return BatchNamedExec(
  39. ctx,
  40. "insert into Cache(FileHash,NodeID,CreateTime,Priority) values(:FileHash,:NodeID,:CreateTime,:Priority)"+
  41. " on duplicate key update CreateTime=values(CreateTime), Priority=values(Priority)",
  42. 4,
  43. caches,
  44. nil,
  45. )
  46. }
  47. func (*CacheDB) BatchCreateOnSameNode(ctx SQLContext, fileHashes []string, nodeID cdssdk.NodeID, priority int) error {
  48. if len(fileHashes) == 0 {
  49. return nil
  50. }
  51. var caches []model.Cache
  52. var nowTime = time.Now()
  53. for _, hash := range fileHashes {
  54. caches = append(caches, model.Cache{
  55. FileHash: hash,
  56. NodeID: nodeID,
  57. CreateTime: nowTime,
  58. Priority: priority,
  59. })
  60. }
  61. return BatchNamedExec(ctx,
  62. "insert into Cache(FileHash,NodeID,CreateTime,Priority) values(:FileHash,:NodeID,:CreateTime,:Priority)"+
  63. " on duplicate key update CreateTime=values(CreateTime), Priority=values(Priority)",
  64. 4,
  65. caches,
  66. nil,
  67. )
  68. }
  69. func (*CacheDB) NodeBatchDelete(ctx SQLContext, nodeID cdssdk.NodeID, fileHashes []string) error {
  70. if len(fileHashes) == 0 {
  71. return nil
  72. }
  73. return ctx.Table("Cache").Where("NodeID = ? AND FileHash IN (?)", nodeID, fileHashes).Delete(&model.Cache{}).Error
  74. }
  75. // GetCachingFileNodes 查找缓存了指定文件的节点
  76. func (*CacheDB) GetCachingFileNodes(ctx SQLContext, fileHash string) ([]cdssdk.Node, error) {
  77. var nodes []cdssdk.Node
  78. err := ctx.Table("Cache").Select("Node.*").
  79. Joins("JOIN Node ON Cache.NodeID = Node.NodeID").
  80. Where("Cache.FileHash = ?", fileHash).
  81. Find(&nodes).Error
  82. return nodes, err
  83. }
  84. // DeleteNodeAll 删除一个节点所有的记录
  85. func (*CacheDB) DeleteNodeAll(ctx SQLContext, nodeID cdssdk.NodeID) error {
  86. return ctx.Where("NodeID = ?", nodeID).Delete(&model.Cache{}).Error
  87. }
  88. // FindCachingFileUserNodes 在缓存表中查询指定数据所在的节点
  89. func (*CacheDB) FindCachingFileUserNodes(ctx SQLContext, userID cdssdk.NodeID, fileHash string) ([]cdssdk.Node, error) {
  90. var nodes []cdssdk.Node
  91. err := ctx.Table("Cache").Select("Node.*").
  92. Joins("JOIN UserNode ON Cache.NodeID = UserNode.NodeID").
  93. Joins("JOIN Node ON UserNode.NodeID = Node.NodeID").
  94. Where("Cache.FileHash = ? AND UserNode.UserID = ?", fileHash, userID).
  95. Find(&nodes).Error
  96. return nodes, err
  97. }

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