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

2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package db
  2. import (
  3. "time"
  4. "github.com/jmoiron/sqlx"
  5. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  6. "gitlink.org.cn/cloudream/storage/common/consts"
  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, nodeID cdssdk.NodeID) (model.Cache, error) {
  16. var ret model.Cache
  17. err := sqlx.Get(ctx, &ret, "select * from Cache where FileHash = ? and NodeID = ?", fileHash, nodeID)
  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) GetNodeCaches(ctx SQLContext, nodeID cdssdk.NodeID) ([]model.Cache, error) {
  26. var ret []model.Cache
  27. err := sqlx.Select(ctx, &ret, "select * from Cache where NodeID = ?", nodeID)
  28. return ret, err
  29. }
  30. // CreateNew 创建一条新的缓存记录
  31. func (*CacheDB) CreateNew(ctx SQLContext, fileHash string, nodeID cdssdk.NodeID) error {
  32. _, err := ctx.Exec("insert into Cache values(?,?,?,?,?)", fileHash, nodeID, consts.CacheStatePinned, nil, time.Now())
  33. if err != nil {
  34. return err
  35. }
  36. return nil
  37. }
  38. func (*CacheDB) SetPackageObjectFrozen(ctx SQLContext, pkgID cdssdk.PackageID, nodeID cdssdk.NodeID) error {
  39. var nowTime = time.Now()
  40. _, err := ctx.Exec(
  41. "insert into Cache(FileHash,NodeID,State,FrozenTime,CreateTime,Priority)"+
  42. " select FileHash, ?, ?, ?, ?, ? from Object where PackageID = ?"+
  43. " on duplicate key update State = ?, FrozenTime = ?",
  44. nodeID, consts.CacheStatePinned, &nowTime, &nowTime, 0,
  45. pkgID,
  46. consts.CacheStatePinned, &nowTime,
  47. )
  48. return err
  49. }
  50. // CreatePinned 创建一条缓存记录,如果已存在,但不是pinned状态,则将其设置为pin状态
  51. func (*CacheDB) CreatePinned(ctx SQLContext, fileHash string, nodeID cdssdk.NodeID, priority int) error {
  52. _, err := ctx.Exec("insert into Cache values(?,?,?,?,?,?) on duplicate key update State = ?, CreateTime = ?, Priority = ?",
  53. fileHash, nodeID, consts.CacheStatePinned, nil, time.Now(), priority,
  54. consts.CacheStatePinned, time.Now(), priority,
  55. )
  56. return err
  57. }
  58. func (*CacheDB) BatchCreatePinned(ctx SQLContext, fileHashes []string, nodeID cdssdk.NodeID, priority int) error {
  59. var caches []model.Cache
  60. var nowTime = time.Now()
  61. for _, hash := range fileHashes {
  62. caches = append(caches, model.Cache{
  63. FileHash: hash,
  64. NodeID: nodeID,
  65. State: consts.CacheStatePinned,
  66. FrozenTime: nil,
  67. CreateTime: nowTime,
  68. Priority: priority,
  69. })
  70. }
  71. _, err := sqlx.NamedExec(ctx, "insert into Cache(FileHash,NodeID,State,FrozenTime,CreateTime,Priority) values(:FileHash,:NodeID,:State,:FrozenTime,:CreateTime,:Priority)"+
  72. " on duplicate key update State=values(State), CreateTime=values(CreateTime), Priority=values(Priority)",
  73. caches,
  74. )
  75. return err
  76. }
  77. // Create 创建一条Temp状态的缓存记录,如果已存在则不产生效果
  78. func (*CacheDB) CreateTemp(ctx SQLContext, fileHash string, nodeID cdssdk.NodeID) error {
  79. _, err := ctx.Exec("insert ignore into Cache values(?,?,?,?,?)", fileHash, nodeID, nil, consts.CacheStateTemp, time.Now())
  80. return err
  81. }
  82. // GetCachingFileNodes 查找缓存了指定文件的节点
  83. func (*CacheDB) GetCachingFileNodes(ctx SQLContext, fileHash string) ([]model.Node, error) {
  84. var x []model.Node
  85. err := sqlx.Select(ctx, &x,
  86. "select Node.* from Cache, Node where Cache.FileHash=? and Cache.NodeID = Node.NodeID", fileHash)
  87. return x, err
  88. }
  89. // DeleteTemp 删除一条Temp状态的记录
  90. func (*CacheDB) DeleteTemp(ctx SQLContext, fileHash string, nodeID cdssdk.NodeID) error {
  91. _, err := ctx.Exec("delete from Cache where FileHash = ? and NodeID = ? and State = ?", fileHash, nodeID, consts.CacheStateTemp)
  92. return err
  93. }
  94. // DeleteNodeAll 删除一个节点所有的记录
  95. func (*CacheDB) DeleteNodeAll(ctx SQLContext, nodeID cdssdk.NodeID) error {
  96. _, err := ctx.Exec("delete from Cache where NodeID = ?", nodeID)
  97. return err
  98. }
  99. // FindCachingFileUserNodes 在缓存表中查询指定数据所在的节点
  100. func (*CacheDB) FindCachingFileUserNodes(ctx SQLContext, userID cdssdk.NodeID, fileHash string) ([]model.Node, error) {
  101. var x []model.Node
  102. err := sqlx.Select(ctx, &x,
  103. "select Node.* from Cache, UserNode, Node where"+
  104. " Cache.FileHash=? and Cache.NodeID = UserNode.NodeID and"+
  105. " UserNode.UserID = ? and UserNode.NodeID = Node.NodeID", fileHash, userID)
  106. return x, err
  107. }
  108. // 设置一条记录为Temp,对Frozen的记录无效
  109. func (*CacheDB) SetTemp(ctx SQLContext, fileHash string, nodeID cdssdk.NodeID) error {
  110. _, err := ctx.Exec("update Cache set State = ?, CreateTime = ? where FileHash = ? and NodeID = ? and FrozenTime = null",
  111. consts.CacheStateTemp,
  112. time.Now(),
  113. fileHash,
  114. nodeID,
  115. )
  116. return err
  117. }

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