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

2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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) DeleteInPackage(ctx SQLContext, packageID int64) error {
  25. _, err := ctx.Exec("delete ObjectBlock from ObjectBlock inner join Object on ObjectBlock.ObjectID = Object.ObjectID where PackageID = ?", packageID)
  26. return err
  27. }
  28. func (db *ObjectBlockDB) CountBlockWithHash(ctx SQLContext, fileHash string) (int, error) {
  29. var cnt int
  30. err := sqlx.Get(ctx, &cnt,
  31. "select count(FileHash) from ObjectBlock, Object, Package where FileHash = ? and"+
  32. " ObjectBlock.ObjectID = Object.ObjectID and"+
  33. " Object.PackageID = Package.PackageID and"+
  34. " Package.State = ?", fileHash, consts.PackageStateNormal)
  35. if err == sql.ErrNoRows {
  36. return 0, nil
  37. }
  38. return cnt, err
  39. }
  40. func (db *ObjectBlockDB) GetBatchObjectBlocks(ctx SQLContext, objectIDs []int64) ([][]string, error) {
  41. blocks := make([][]string, len(objectIDs))
  42. var err error
  43. for i, objectID := range objectIDs {
  44. var x []model.ObjectBlock
  45. sql := "select * from ObjectBlock where ObjectID=?"
  46. err = db.d.Select(&x, sql, objectID)
  47. xx := make([]string, len(x))
  48. for ii := 0; ii < len(x); ii++ {
  49. xx[x[ii].Index] = x[ii].FileHash
  50. }
  51. blocks[i] = xx
  52. }
  53. return blocks, err
  54. }
  55. func (db *ObjectBlockDB) GetBatchBlocksNodes(ctx SQLContext, hashs [][]string) ([][][]int64, error) {
  56. nodes := make([][][]int64, len(hashs))
  57. var err error
  58. for i, hs := range hashs {
  59. fileNodes := make([][]int64, len(hs))
  60. for j, h := range hs {
  61. var x []model.Node
  62. err = sqlx.Select(ctx, &x,
  63. "select Node.* from Cache, Node where"+
  64. " Cache.FileHash=? and Cache.NodeID = Node.NodeID and Cache.State=?", h, consts.CacheStatePinned)
  65. xx := make([]int64, len(x))
  66. for ii := 0; ii < len(x); ii++ {
  67. xx[ii] = x[ii].NodeID
  68. }
  69. fileNodes[j] = xx
  70. }
  71. nodes[i] = fileNodes
  72. }
  73. return nodes, err
  74. }
  75. func (db *ObjectBlockDB) GetWithNodeIDInPackage(ctx SQLContext, packageID int64) ([]models.ObjectECData, error) {
  76. var objs []model.Object
  77. err := sqlx.Select(ctx, &objs, "select * from Object where PackageID = ? order by ObjectID asc", packageID)
  78. if err != nil {
  79. return nil, fmt.Errorf("query objectIDs: %w", err)
  80. }
  81. rets := make([]models.ObjectECData, 0, len(objs))
  82. for _, obj := range objs {
  83. var tmpRets []struct {
  84. Index int `db:"Index"`
  85. FileHash string `db:"FileHash"`
  86. NodeIDs *string `db:"NodeIDs"`
  87. }
  88. err := sqlx.Select(ctx,
  89. &tmpRets,
  90. "select ObjectBlock.Index, ObjectBlock.FileHash, group_concat(NodeID) as NodeIDs from ObjectBlock"+
  91. " left join Cache on ObjectBlock.FileHash = Cache.FileHash"+
  92. " where ObjectID = ? group by ObjectBlock.Index, ObjectBlock.FileHash",
  93. obj.ObjectID,
  94. )
  95. if err != nil {
  96. return nil, err
  97. }
  98. blocks := make([]models.ObjectBlockData, 0, len(tmpRets))
  99. for _, tmp := range tmpRets {
  100. var block models.ObjectBlockData
  101. block.Index = tmp.Index
  102. block.FileHash = tmp.FileHash
  103. if tmp.NodeIDs != nil {
  104. block.NodeIDs = splitIDStringUnsafe(*tmp.NodeIDs)
  105. }
  106. blocks = append(blocks, block)
  107. }
  108. rets = append(rets, models.NewObjectECData(obj, blocks))
  109. }
  110. return rets, nil
  111. }

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