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

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package db
  2. import (
  3. "gitlink.org.cn/cloudream/jcs-pub/client/types"
  4. "gorm.io/gorm/clause"
  5. )
  6. type ObjectBlockDB struct {
  7. *DB
  8. }
  9. func (db *DB) ObjectBlock() *ObjectBlockDB {
  10. return &ObjectBlockDB{DB: db}
  11. }
  12. func (db *ObjectBlockDB) GetByUserSpaceID(ctx SQLContext, spaceID types.UserSpaceID) ([]types.ObjectBlock, error) {
  13. var rets []types.ObjectBlock
  14. err := ctx.Table("ObjectBlock").Where("UserSpaceID = ?", spaceID).Find(&rets).Error
  15. return rets, err
  16. }
  17. func (db *ObjectBlockDB) BatchGetByObjectID(ctx SQLContext, objectIDs []types.ObjectID) ([]types.ObjectBlock, error) {
  18. if len(objectIDs) == 0 {
  19. return nil, nil
  20. }
  21. var blocks []types.ObjectBlock
  22. err := ctx.Table("ObjectBlock").Where("ObjectID IN (?)", objectIDs).Order("ObjectID, `Index` ASC").Find(&blocks).Error
  23. return blocks, err
  24. }
  25. func (*ObjectBlockDB) GetInPackageID(ctx SQLContext, packageID types.PackageID) ([]types.ObjectBlock, error) {
  26. var rets []types.ObjectBlock
  27. err := ctx.Table("ObjectBlock").
  28. Joins("INNER JOIN Object ON ObjectBlock.ObjectID = Object.ObjectID").
  29. Where("Object.PackageID = ?", packageID).
  30. Order("ObjectBlock.ObjectID, ObjectBlock.`Index` ASC").
  31. Find(&rets).Error
  32. return rets, err
  33. }
  34. func (db *ObjectBlockDB) Create(ctx SQLContext, objectID types.ObjectID, index int, spaceID types.UserSpaceID, fileHash types.FileHash, size int64) error {
  35. block := types.ObjectBlock{ObjectID: objectID, Index: index, UserSpaceID: spaceID, FileHash: fileHash, Size: size}
  36. return ctx.Table("ObjectBlock").Create(&block).Error
  37. }
  38. func (db *ObjectBlockDB) BatchCreate(ctx SQLContext, blocks []types.ObjectBlock) error {
  39. if len(blocks) == 0 {
  40. return nil
  41. }
  42. return ctx.Clauses(clause.Insert{Modifier: "ignore"}).Create(&blocks).Error
  43. }
  44. func (db *ObjectBlockDB) DeleteByObjectID(ctx SQLContext, objectID types.ObjectID) error {
  45. return ctx.Table("ObjectBlock").Where("ObjectID = ?", objectID).Delete(&types.ObjectBlock{}).Error
  46. }
  47. func (db *ObjectBlockDB) DeleteByObjectIDIndex(ctx SQLContext, objectID types.ObjectID, index int) error {
  48. return ctx.Table("ObjectBlock").Where("ObjectID = ? AND `Index` = ?", objectID, index).Delete(&types.ObjectBlock{}).Error
  49. }
  50. func (db *ObjectBlockDB) BatchDeleteByObjectID(ctx SQLContext, objectIDs []types.ObjectID) error {
  51. if len(objectIDs) == 0 {
  52. return nil
  53. }
  54. return ctx.Table("ObjectBlock").Where("ObjectID IN (?)", objectIDs).Delete(&types.ObjectBlock{}).Error
  55. }
  56. func (db *ObjectBlockDB) DeleteInPackage(ctx SQLContext, packageID types.PackageID) error {
  57. return ctx.Table("ObjectBlock").Where("ObjectID IN (SELECT ObjectID FROM Object WHERE PackageID = ?)", packageID).Delete(&types.ObjectBlock{}).Error
  58. }
  59. func (db *ObjectBlockDB) BatchDeleteByFileHash(ctx SQLContext, spaceID types.UserSpaceID, fileHashes []types.FileHash) error {
  60. if len(fileHashes) == 0 {
  61. return nil
  62. }
  63. return ctx.Table("ObjectBlock").Where("UserSpaceID = ? AND FileHash IN (?)", spaceID, fileHashes).Delete(&types.ObjectBlock{}).Error
  64. }
  65. func (db *ObjectBlockDB) CountBlockWithHash(ctx SQLContext, fileHash string) (int, error) {
  66. var cnt int64
  67. err := ctx.Table("ObjectBlock").
  68. Select("COUNT(FileHash)").
  69. Joins("INNER JOIN Object ON ObjectBlock.ObjectID = Object.ObjectID").
  70. Joins("INNER JOIN Package ON Object.PackageID = Package.PackageID").
  71. Where("FileHash = ?", fileHash).
  72. Scan(&cnt).Error
  73. if err != nil {
  74. return 0, err
  75. }
  76. return int(cnt), nil
  77. }

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