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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. package db
  2. /*
  3. import (
  4. "database/sql"
  5. "strconv"
  6. "strings"
  7. "github.com/jmoiron/sqlx"
  8. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  9. stgmod "gitlink.org.cn/cloudream/storage/common/models"
  10. )
  11. type ObjectBlockDB struct {
  12. *DB
  13. }
  14. func (db *DB) ObjectBlock() *ObjectBlockDB {
  15. return &ObjectBlockDB{DB: db}
  16. }
  17. func (db *ObjectBlockDB) GetByNodeID(ctx SQLContext, nodeID cdssdk.NodeID) ([]stgmod.ObjectBlock, error) {
  18. var rets []stgmod.ObjectBlock
  19. err := sqlx.Select(ctx, &rets, "select * from ObjectBlock where NodeID = ?", nodeID)
  20. return rets, err
  21. }
  22. func (db *ObjectBlockDB) BatchGetByObjectID(ctx SQLContext, objectIDs []cdssdk.ObjectID) ([]stgmod.ObjectBlock, error) {
  23. if len(objectIDs) == 0 {
  24. return nil, nil
  25. }
  26. stmt, args, err := sqlx.In("select * from ObjectBlock where ObjectID in (?) order by ObjectID, `Index` asc", objectIDs)
  27. if err != nil {
  28. return nil, err
  29. }
  30. stmt = ctx.Rebind(stmt)
  31. var blocks []stgmod.ObjectBlock
  32. err = sqlx.Select(ctx, &blocks, stmt, args...)
  33. if err != nil {
  34. return nil, err
  35. }
  36. return blocks, nil
  37. }
  38. func (db *ObjectBlockDB) Create(ctx SQLContext, objectID cdssdk.ObjectID, index int, nodeID cdssdk.NodeID, fileHash string) error {
  39. _, err := ctx.Exec("insert into ObjectBlock values(?,?,?,?)", objectID, index, nodeID, fileHash)
  40. return err
  41. }
  42. func (db *ObjectBlockDB) BatchCreate(ctx SQLContext, blocks []stgmod.ObjectBlock) error {
  43. if len(blocks) == 0 {
  44. return nil
  45. }
  46. return BatchNamedExec(ctx,
  47. "insert ignore into ObjectBlock(ObjectID, `Index`, NodeID, FileHash) values(:ObjectID, :Index, :NodeID, :FileHash)",
  48. 4,
  49. blocks,
  50. nil,
  51. )
  52. }
  53. func (db *ObjectBlockDB) DeleteByObjectID(ctx SQLContext, objectID cdssdk.ObjectID) error {
  54. _, err := ctx.Exec("delete from ObjectBlock where ObjectID = ?", objectID)
  55. return err
  56. }
  57. func (db *ObjectBlockDB) BatchDeleteByObjectID(ctx SQLContext, objectIDs []cdssdk.ObjectID) error {
  58. if len(objectIDs) == 0 {
  59. return nil
  60. }
  61. // TODO in语句有长度限制
  62. query, args, err := sqlx.In("delete from ObjectBlock where ObjectID in (?)", objectIDs)
  63. if err != nil {
  64. return err
  65. }
  66. _, err = ctx.Exec(query, args...)
  67. return err
  68. }
  69. func (db *ObjectBlockDB) DeleteInPackage(ctx SQLContext, packageID cdssdk.PackageID) error {
  70. _, err := ctx.Exec("delete ObjectBlock from ObjectBlock inner join Object on ObjectBlock.ObjectID = Object.ObjectID where PackageID = ?", packageID)
  71. return err
  72. }
  73. func (db *ObjectBlockDB) NodeBatchDelete(ctx SQLContext, nodeID cdssdk.NodeID, fileHashes []string) error {
  74. if len(fileHashes) == 0 {
  75. return nil
  76. }
  77. query, args, err := sqlx.In("delete from ObjectBlock where NodeID = ? and FileHash in (?)", nodeID, fileHashes)
  78. if err != nil {
  79. return err
  80. }
  81. _, err = ctx.Exec(query, args...)
  82. return err
  83. }
  84. func (db *ObjectBlockDB) CountBlockWithHash(ctx SQLContext, fileHash string) (int, error) {
  85. var cnt int
  86. err := sqlx.Get(ctx, &cnt,
  87. "select count(FileHash) from ObjectBlock, Object, Package where FileHash = ? and"+
  88. " ObjectBlock.ObjectID = Object.ObjectID and"+
  89. " Object.PackageID = Package.PackageID and"+
  90. " Package.State = ?", fileHash, cdssdk.PackageStateNormal)
  91. if err == sql.ErrNoRows {
  92. return 0, nil
  93. }
  94. return cnt, err
  95. }
  96. // 按逗号切割字符串,并将每一个部分解析为一个int64的ID。
  97. // 注:需要外部保证分隔的每一个部分都是正确的10进制数字格式
  98. func splitConcatedNodeID(idStr string) []cdssdk.NodeID {
  99. idStrs := strings.Split(idStr, ",")
  100. ids := make([]cdssdk.NodeID, 0, len(idStrs))
  101. for _, str := range idStrs {
  102. // 假设传入的ID是正确的数字格式
  103. id, _ := strconv.ParseInt(str, 10, 64)
  104. ids = append(ids, cdssdk.NodeID(id))
  105. }
  106. return ids
  107. }
  108. // 按逗号切割字符串
  109. func splitConcatedFileHash(idStr string) []string {
  110. idStrs := strings.Split(idStr, ",")
  111. return idStrs
  112. }
  113. */

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