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.

object_block.go 3.6 kB

2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package db
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "github.com/jmoiron/sqlx"
  6. "gitlink.org.cn/cloudream/storage-common/consts"
  7. "gitlink.org.cn/cloudream/storage-common/models"
  8. "gitlink.org.cn/cloudream/storage-common/pkgs/db/model"
  9. )
  10. type ObjectBlockDB struct {
  11. *DB
  12. }
  13. func (db *DB) ObjectBlock() *ObjectBlockDB {
  14. return &ObjectBlockDB{DB: db}
  15. }
  16. func (db *ObjectBlockDB) Create(ctx SQLContext, objectID int64, index int, fileHash string) error {
  17. _, err := ctx.Exec("insert into ObjectBlock(ObjectID, Index, FileHash) values(?,?,?)", objectID, index, fileHash)
  18. return err
  19. }
  20. func (db *ObjectBlockDB) DeleteObjectAll(ctx SQLContext, objectID int64) error {
  21. _, err := ctx.Exec("delete from ObjectBlock where ObjectID = ?", objectID)
  22. return err
  23. }
  24. func (db *ObjectBlockDB) CountBlockWithHash(ctx SQLContext, fileHash string) (int, error) {
  25. var cnt int
  26. err := sqlx.Get(ctx, &cnt,
  27. "select count(FileHash) from ObjectBlock, Object, Package where FileHash = ? and "+
  28. "ObjectBlock.ObjectID = Object.ObjectID and "+
  29. "Object.PackageID = Package.PackageID and "+
  30. "Package.State = ?", fileHash, consts.PackageStateNormal)
  31. if err == sql.ErrNoRows {
  32. return 0, nil
  33. }
  34. return cnt, err
  35. }
  36. func (db *ObjectBlockDB) GetBatchObjectBlocks(ctx SQLContext, objectIDs []int64) ([][]string, error) {
  37. blocks := make([][]string, len(objectIDs))
  38. var err error
  39. for i, objectID := range objectIDs {
  40. var x []model.ObjectBlock
  41. sql := "select * from ObjectBlock where ObjectID=?"
  42. err = db.d.Select(&x, sql, objectID)
  43. xx := make([]string, len(x))
  44. for ii := 0; ii < len(x); ii++ {
  45. xx[x[ii].Index] = x[ii].FileHash
  46. }
  47. blocks[i] = xx
  48. }
  49. return blocks, err
  50. }
  51. func (db *ObjectBlockDB) GetBatchBlocksNodes(ctx SQLContext, hashs [][]string) ([][][]int64, error) {
  52. nodes := make([][][]int64, len(hashs))
  53. var err error
  54. for i, hs := range hashs {
  55. fileNodes := make([][]int64, len(hs))
  56. for j, h := range hs {
  57. var x []model.Node
  58. err = sqlx.Select(ctx, &x,
  59. "select Node.* from Cache, Node where "+
  60. "Cache.FileHash=? and Cache.NodeID = Node.NodeID and Cache.State=?", h, consts.CacheStatePinned)
  61. xx := make([]int64, len(x))
  62. for ii := 0; ii < len(x); ii++ {
  63. xx[ii] = x[ii].NodeID
  64. }
  65. fileNodes[j] = xx
  66. }
  67. nodes[i] = fileNodes
  68. }
  69. return nodes, err
  70. }
  71. func (db *ObjectBlockDB) GetWithNodeIDInPackage(ctx SQLContext, packageID int64) ([]models.ObjectECData, error) {
  72. var objectIDs []int64
  73. err := sqlx.Select(ctx, &objectIDs, "select ObjectID from Object where PackageID = ? order by ObjectID asc", packageID)
  74. if err != nil {
  75. return nil, fmt.Errorf("query objectIDs: %w", err)
  76. }
  77. rets := make([]models.ObjectECData, 0, len(objectIDs))
  78. for _, objID := range objectIDs {
  79. var tmpRets []struct {
  80. Index int `db:"Index"`
  81. FileHash string `db:"FileHash"`
  82. NodeIDs *string `db:"NodeIDs"`
  83. }
  84. err := sqlx.Select(ctx,
  85. &tmpRets,
  86. "select ObjectBlock.Index, ObjectBlock.FileHash, group_concat(NodeID) as NodeIDs from ObjectBlock "+
  87. "left join Cache on ObjectBlock.FileHash = Cache.FileHash"+
  88. "where ObjectID = ? group by ObjectBlock.Index, ObjectBlock.FileHash",
  89. objID,
  90. )
  91. if err != nil {
  92. return nil, err
  93. }
  94. blocks := make([]models.ObjectBlockData, 0, len(tmpRets))
  95. for _, tmp := range tmpRets {
  96. var block models.ObjectBlockData
  97. block.Index = tmp.Index
  98. block.FileHash = tmp.FileHash
  99. if tmp.NodeIDs != nil {
  100. block.NodeIDs = splitIDStringUnsafe(*tmp.NodeIDs)
  101. }
  102. blocks = append(blocks, block)
  103. }
  104. rets = append(rets, models.NewObjectECData(blocks))
  105. }
  106. return rets, nil
  107. }

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