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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package db2
  2. import (
  3. "strconv"
  4. "strings"
  5. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  6. stgmod "gitlink.org.cn/cloudream/storage2/common/models"
  7. "gorm.io/gorm/clause"
  8. )
  9. type ObjectBlockDB struct {
  10. *DB
  11. }
  12. func (db *DB) ObjectBlock() *ObjectBlockDB {
  13. return &ObjectBlockDB{DB: db}
  14. }
  15. func (db *ObjectBlockDB) GetByStorageID(ctx SQLContext, stgID cdssdk.StorageID) ([]stgmod.ObjectBlock, error) {
  16. var rets []stgmod.ObjectBlock
  17. err := ctx.Table("ObjectBlock").Where("StorageID = ?", stgID).Find(&rets).Error
  18. return rets, err
  19. }
  20. func (db *ObjectBlockDB) BatchGetByObjectID(ctx SQLContext, objectIDs []cdssdk.ObjectID) ([]stgmod.ObjectBlock, error) {
  21. if len(objectIDs) == 0 {
  22. return nil, nil
  23. }
  24. var blocks []stgmod.ObjectBlock
  25. err := ctx.Table("ObjectBlock").Where("ObjectID IN (?)", objectIDs).Order("ObjectID, `Index` ASC").Find(&blocks).Error
  26. return blocks, err
  27. }
  28. func (*ObjectBlockDB) GetInPackageID(ctx SQLContext, packageID cdssdk.PackageID) ([]stgmod.ObjectBlock, error) {
  29. var rets []stgmod.ObjectBlock
  30. err := ctx.Table("ObjectBlock").
  31. Joins("INNER JOIN Object ON ObjectBlock.ObjectID = Object.ObjectID").
  32. Where("Object.PackageID = ?", packageID).
  33. Order("ObjectBlock.ObjectID, ObjectBlock.`Index` ASC").
  34. Find(&rets).Error
  35. return rets, err
  36. }
  37. func (db *ObjectBlockDB) Create(ctx SQLContext, objectID cdssdk.ObjectID, index int, stgID cdssdk.StorageID, fileHash cdssdk.FileHash, size int64) error {
  38. block := stgmod.ObjectBlock{ObjectID: objectID, Index: index, StorageID: stgID, FileHash: fileHash, Size: size}
  39. return ctx.Table("ObjectBlock").Create(&block).Error
  40. }
  41. func (db *ObjectBlockDB) BatchCreate(ctx SQLContext, blocks []stgmod.ObjectBlock) error {
  42. if len(blocks) == 0 {
  43. return nil
  44. }
  45. return ctx.Clauses(clause.Insert{Modifier: "ignore"}).Create(&blocks).Error
  46. }
  47. func (db *ObjectBlockDB) DeleteByObjectID(ctx SQLContext, objectID cdssdk.ObjectID) error {
  48. return ctx.Table("ObjectBlock").Where("ObjectID = ?", objectID).Delete(&stgmod.ObjectBlock{}).Error
  49. }
  50. func (db *ObjectBlockDB) DeleteByObjectIDIndex(ctx SQLContext, objectID cdssdk.ObjectID, index int) error {
  51. return ctx.Table("ObjectBlock").Where("ObjectID = ? AND `Index` = ?", objectID, index).Delete(&stgmod.ObjectBlock{}).Error
  52. }
  53. func (db *ObjectBlockDB) BatchDeleteByObjectID(ctx SQLContext, objectIDs []cdssdk.ObjectID) error {
  54. if len(objectIDs) == 0 {
  55. return nil
  56. }
  57. return ctx.Table("ObjectBlock").Where("ObjectID IN (?)", objectIDs).Delete(&stgmod.ObjectBlock{}).Error
  58. }
  59. func (db *ObjectBlockDB) DeleteInPackage(ctx SQLContext, packageID cdssdk.PackageID) error {
  60. return ctx.Table("ObjectBlock").Where("ObjectID IN (SELECT ObjectID FROM Object WHERE PackageID = ?)", packageID).Delete(&stgmod.ObjectBlock{}).Error
  61. }
  62. func (db *ObjectBlockDB) StorageBatchDelete(ctx SQLContext, stgID cdssdk.StorageID, fileHashes []cdssdk.FileHash) error {
  63. if len(fileHashes) == 0 {
  64. return nil
  65. }
  66. return ctx.Table("ObjectBlock").Where("StorageID = ? AND FileHash IN (?)", stgID, fileHashes).Delete(&stgmod.ObjectBlock{}).Error
  67. }
  68. func (db *ObjectBlockDB) CountBlockWithHash(ctx SQLContext, fileHash string) (int, error) {
  69. var cnt int64
  70. err := ctx.Table("ObjectBlock").
  71. Select("COUNT(FileHash)").
  72. Joins("INNER JOIN Object ON ObjectBlock.ObjectID = Object.ObjectID").
  73. Joins("INNER JOIN Package ON Object.PackageID = Package.PackageID").
  74. Where("FileHash = ? AND Package.State = ?", fileHash, cdssdk.PackageStateNormal).
  75. Scan(&cnt).Error
  76. if err != nil {
  77. return 0, err
  78. }
  79. return int(cnt), nil
  80. }
  81. // 按逗号切割字符串,并将每一个部分解析为一个int64的ID。
  82. // 注:需要外部保证分隔的每一个部分都是正确的10进制数字格式
  83. func splitConcatedHubID(idStr string) []cdssdk.HubID {
  84. idStrs := strings.Split(idStr, ",")
  85. ids := make([]cdssdk.HubID, 0, len(idStrs))
  86. for _, str := range idStrs {
  87. // 假设传入的ID是正确的数字格式
  88. id, _ := strconv.ParseInt(str, 10, 64)
  89. ids = append(ids, cdssdk.HubID(id))
  90. }
  91. return ids
  92. }
  93. // 按逗号切割字符串
  94. func splitConcatedFileHash(idStr string) []string {
  95. idStrs := strings.Split(idStr, ",")
  96. return idStrs
  97. }

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