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

2 years ago
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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/pkgs/db/model"
  7. )
  8. type CacheDB struct {
  9. *DB
  10. }
  11. func (db *DB) Cache() *CacheDB {
  12. return &CacheDB{DB: db}
  13. }
  14. func (*CacheDB) Get(ctx SQLContext, fileHash string, nodeID cdssdk.NodeID) (model.Cache, error) {
  15. var ret model.Cache
  16. err := sqlx.Get(ctx, &ret, "select * from Cache where FileHash = ? and NodeID = ?", fileHash, nodeID)
  17. return ret, err
  18. }
  19. func (*CacheDB) BatchGetAllFileHashes(ctx SQLContext, start int, count int) ([]string, error) {
  20. var ret []string
  21. err := sqlx.Select(ctx, &ret, "select distinct FileHash from Cache limit ?, ?", start, count)
  22. return ret, err
  23. }
  24. func (*CacheDB) GetByNodeID(ctx SQLContext, nodeID cdssdk.NodeID) ([]model.Cache, error) {
  25. var ret []model.Cache
  26. err := sqlx.Select(ctx, &ret, "select * from Cache where NodeID = ?", nodeID)
  27. return ret, err
  28. }
  29. // Create 创建一条的缓存记录,如果已有则不进行操作
  30. func (*CacheDB) Create(ctx SQLContext, fileHash string, nodeID cdssdk.NodeID, priority int) error {
  31. _, err := ctx.Exec("insert ignore into Cache values(?,?,?,?)", fileHash, nodeID, time.Now(), priority)
  32. if err != nil {
  33. return err
  34. }
  35. return nil
  36. }
  37. func (*CacheDB) BatchCreate(ctx SQLContext, fileHashes []string, nodeID cdssdk.NodeID, priority int) error {
  38. var caches []model.Cache
  39. var nowTime = time.Now()
  40. for _, hash := range fileHashes {
  41. caches = append(caches, model.Cache{
  42. FileHash: hash,
  43. NodeID: nodeID,
  44. CreateTime: nowTime,
  45. Priority: priority,
  46. })
  47. }
  48. _, err := sqlx.NamedExec(ctx, "insert into Cache(FileHash,NodeID,CreateTime,Priority) values(:FileHash,:NodeID,:CreateTime,:Priority)"+
  49. " on duplicate key update CreateTime=values(CreateTime), Priority=values(Priority)",
  50. caches,
  51. )
  52. return err
  53. }
  54. func (*CacheDB) NodeBatchDelete(ctx SQLContext, nodeID cdssdk.NodeID, fileHashes []string) error {
  55. // TODO in语句有长度限制
  56. query, args, err := sqlx.In("delete from Cache where NodeID = ? and FileHash in (?)", nodeID, fileHashes)
  57. if err != nil {
  58. return err
  59. }
  60. _, err = ctx.Exec(query, args...)
  61. return err
  62. }
  63. // GetCachingFileNodes 查找缓存了指定文件的节点
  64. func (*CacheDB) GetCachingFileNodes(ctx SQLContext, fileHash string) ([]cdssdk.Node, error) {
  65. var x []cdssdk.Node
  66. err := sqlx.Select(ctx, &x,
  67. "select Node.* from Cache, Node where Cache.FileHash=? and Cache.NodeID = Node.NodeID", fileHash)
  68. return x, err
  69. }
  70. // DeleteNodeAll 删除一个节点所有的记录
  71. func (*CacheDB) DeleteNodeAll(ctx SQLContext, nodeID cdssdk.NodeID) error {
  72. _, err := ctx.Exec("delete from Cache where NodeID = ?", nodeID)
  73. return err
  74. }
  75. // FindCachingFileUserNodes 在缓存表中查询指定数据所在的节点
  76. func (*CacheDB) FindCachingFileUserNodes(ctx SQLContext, userID cdssdk.NodeID, fileHash string) ([]cdssdk.Node, error) {
  77. var x []cdssdk.Node
  78. err := sqlx.Select(ctx, &x,
  79. "select Node.* from Cache, UserNode, Node where"+
  80. " Cache.FileHash=? and Cache.NodeID = UserNode.NodeID and"+
  81. " UserNode.UserID = ? and UserNode.NodeID = Node.NodeID", fileHash, userID)
  82. return x, err
  83. }

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