Browse Source

迁移数据库代码

gitlink
Sydonian 7 months ago
parent
commit
ed6d137430
20 changed files with 261 additions and 891 deletions
  1. +22
    -69
      client/internal/db/bucket.go
  2. +0
    -105
      client/internal/db/cache.go
  3. +1
    -1
      client/internal/db/config.go
  4. +1
    -1
      client/internal/db/db.go
  5. +0
    -60
      client/internal/db/hub.go
  6. +0
    -37
      client/internal/db/hub_connectivity.go
  7. +0
    -36
      client/internal/db/location.go
  8. +99
    -110
      client/internal/db/object.go
  9. +29
    -24
      client/internal/db/object_access_stat.go
  10. +23
    -48
      client/internal/db/object_block.go
  11. +31
    -75
      client/internal/db/package.go
  12. +19
    -21
      client/internal/db/package_access_stat.go
  13. +34
    -34
      client/internal/db/pinned_object.go
  14. +0
    -120
      client/internal/db/storage.go
  15. +1
    -1
      client/internal/db/union_serializer.go
  16. +0
    -44
      client/internal/db/user.go
  17. +0
    -36
      client/internal/db/user_bucket.go
  18. +0
    -34
      client/internal/db/user_hub.go
  19. +0
    -34
      client/internal/db/user_storage.go
  20. +1
    -1
      client/internal/db/utils.go

+ 22
- 69
client/internal/db/bucket.go View File

@@ -1,14 +1,11 @@
package db2
package db


import ( import (
"errors"
"fmt" "fmt"
"time" "time"


"gitlink.org.cn/cloudream/storage2/client/types"
"gorm.io/gorm" "gorm.io/gorm"

cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
"gitlink.org.cn/cloudream/storage2/common/pkgs/db2/model"
) )


type BucketDB struct { type BucketDB struct {
@@ -19,14 +16,14 @@ func (db *DB) Bucket() *BucketDB {
return &BucketDB{DB: db} return &BucketDB{DB: db}
} }


func (db *BucketDB) GetByID(ctx SQLContext, bucketID cdssdk.BucketID) (cdssdk.Bucket, error) {
var ret cdssdk.Bucket
func (db *BucketDB) GetByID(ctx SQLContext, bucketID types.BucketID) (types.Bucket, error) {
var ret types.Bucket
err := ctx.Table("Bucket").Where("BucketID = ?", bucketID).First(&ret).Error err := ctx.Table("Bucket").Where("BucketID = ?", bucketID).First(&ret).Error
return ret, err return ret, err
} }


func (db *BucketDB) GetByName(ctx SQLContext, bucketName string) (cdssdk.Bucket, error) {
var ret cdssdk.Bucket
func (db *BucketDB) GetByName(ctx SQLContext, bucketName string) (types.Bucket, error) {
var ret types.Bucket
err := ctx.Table("Bucket").Where("Name = ?", bucketName).First(&ret).Error err := ctx.Table("Bucket").Where("Name = ?", bucketName).First(&ret).Error
return ret, err return ret, err
} }
@@ -46,94 +43,50 @@ func (db *BucketDB) GetIDByName(ctx SQLContext, bucketName string) (int64, error
return result.BucketID, nil return result.BucketID, nil
} }


func (*BucketDB) GetAll(ctx SQLContext) ([]cdssdk.Bucket, error) {
var ret []cdssdk.Bucket
func (*BucketDB) GetAll(ctx SQLContext) ([]types.Bucket, error) {
var ret []types.Bucket
err := ctx.Table("Bucket").Find(&ret).Error err := ctx.Table("Bucket").Find(&ret).Error
return ret, err return ret, err
} }


// IsAvailable 判断用户是否有指定Bucekt的权限
func (db *BucketDB) IsAvailable(ctx SQLContext, bucketID cdssdk.BucketID, userID cdssdk.UserID) (bool, error) {
_, err := db.GetUserBucket(ctx, userID, bucketID)
if errors.Is(err, gorm.ErrRecordNotFound) {
return false, nil
}

if err != nil {
return false, fmt.Errorf("find bucket failed, err: %w", err)
}

return true, nil
}

func (*BucketDB) GetUserBucket(ctx SQLContext, userID cdssdk.UserID, bucketID cdssdk.BucketID) (model.Bucket, error) {
var ret model.Bucket
err := ctx.Table("UserBucket").
Select("Bucket.*").
Joins("JOIN Bucket ON UserBucket.BucketID = Bucket.BucketID").
Where("UserBucket.UserID = ? AND Bucket.BucketID = ?", userID, bucketID).
First(&ret).Error
return ret, err
}

func (*BucketDB) GetUserBucketByName(ctx SQLContext, userID cdssdk.UserID, bucketName string) (model.Bucket, error) {
var ret model.Bucket
err := ctx.Table("UserBucket").
Select("Bucket.*").
Joins("JOIN Bucket ON UserBucket.BucketID = Bucket.BucketID").
Where("UserBucket.UserID = ? AND Bucket.Name = ?", userID, bucketName).
First(&ret).Error
return ret, err
}

func (*BucketDB) GetUserBuckets(ctx SQLContext, userID cdssdk.UserID) ([]model.Bucket, error) {
var ret []model.Bucket
err := ctx.Table("UserBucket").
Select("Bucket.*").
Joins("JOIN Bucket ON UserBucket.BucketID = Bucket.BucketID").
Where("UserBucket.UserID = ?", userID).
Find(&ret).Error
func (*BucketDB) GetUserBuckets(ctx SQLContext) ([]types.Bucket, error) {
var ret []types.Bucket
err := ctx.Table("Bucket").Find(&ret).Error
return ret, err return ret, err
} }


func (db *BucketDB) Create(ctx SQLContext, userID cdssdk.UserID, bucketName string, createTime time.Time) (cdssdk.Bucket, error) {
func (db *BucketDB) Create(ctx SQLContext, bucketName string, createTime time.Time) (types.Bucket, error) {
var bucketID int64 var bucketID int64
err := ctx.Table("UserBucket").
err := ctx.Table("Bucket").
Select("Bucket.BucketID"). Select("Bucket.BucketID").
Joins("JOIN Bucket ON UserBucket.BucketID = Bucket.BucketID").
Where("UserBucket.UserID = ? AND Bucket.Name = ?", userID, bucketName).
Where("Bucket.Name = ?", bucketName).
Scan(&bucketID).Error Scan(&bucketID).Error


if err != nil { if err != nil {
return cdssdk.Bucket{}, err
return types.Bucket{}, err
} }


if bucketID > 0 { if bucketID > 0 {
return cdssdk.Bucket{}, gorm.ErrDuplicatedKey
return types.Bucket{}, gorm.ErrDuplicatedKey
} }


newBucket := cdssdk.Bucket{Name: bucketName, CreateTime: createTime, CreatorID: userID}
newBucket := types.Bucket{Name: bucketName, CreateTime: createTime}
if err := ctx.Table("Bucket").Create(&newBucket).Error; err != nil { if err := ctx.Table("Bucket").Create(&newBucket).Error; err != nil {
return cdssdk.Bucket{}, fmt.Errorf("insert bucket failed, err: %w", err)
}

err = ctx.Table("UserBucket").Create(&model.UserBucket{UserID: userID, BucketID: newBucket.BucketID}).Error
if err != nil {
return cdssdk.Bucket{}, fmt.Errorf("insert user bucket: %w", err)
return types.Bucket{}, fmt.Errorf("insert bucket failed, err: %w", err)
} }


return newBucket, nil return newBucket, nil
} }


func (db *BucketDB) Rename(ctx SQLContext, bucketID cdssdk.BucketID, bucketName string) error {
func (db *BucketDB) Rename(ctx SQLContext, bucketID types.BucketID, bucketName string) error {
return ctx.Table("Bucket").Where("BucketID = ?", bucketID).Update("Name", bucketName).Error return ctx.Table("Bucket").Where("BucketID = ?", bucketID).Update("Name", bucketName).Error
} }


func (db *BucketDB) Delete(ctx SQLContext, bucketID cdssdk.BucketID) error {
return ctx.Delete(&cdssdk.Bucket{}, "BucketID = ?", bucketID).Error
func (db *BucketDB) Delete(ctx SQLContext, bucketID types.BucketID) error {
return ctx.Delete(&types.Bucket{}, "BucketID = ?", bucketID).Error
} }


func (db *BucketDB) DeleteComplete(tx SQLContext, bucketID cdssdk.BucketID) error {
func (db *BucketDB) DeleteComplete(tx SQLContext, bucketID types.BucketID) error {
pkgs, err := db.Package().GetBucketPackages(tx, bucketID) pkgs, err := db.Package().GetBucketPackages(tx, bucketID)
if err != nil { if err != nil {
return err return err


+ 0
- 105
client/internal/db/cache.go View File

@@ -1,105 +0,0 @@
package db2

import (
"time"

cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
"gitlink.org.cn/cloudream/storage2/common/pkgs/db2/model"
"gorm.io/gorm/clause"
)

type CacheDB struct {
*DB
}

func (db *DB) Cache() *CacheDB {
return &CacheDB{DB: db}
}

func (*CacheDB) Get(ctx SQLContext, fileHash cdssdk.FileHash, stgID cdssdk.StorageID) (model.Cache, error) {
var ret model.Cache
err := ctx.Table("Cache").Where("FileHash = ? AND StorageID = ?", fileHash, stgID).First(&ret).Error
return ret, err
}

func (*CacheDB) BatchGetAllFileHashes(ctx SQLContext, start int, count int) ([]string, error) {
var ret []string
err := ctx.Table("Cache").Distinct("FileHash").Offset(start).Limit(count).Pluck("FileHash", &ret).Error
return ret, err
}

func (*CacheDB) GetByStorageID(ctx SQLContext, stgID cdssdk.StorageID) ([]model.Cache, error) {
var ret []model.Cache
err := ctx.Table("Cache").Where("StorageID = ?", stgID).Find(&ret).Error
return ret, err
}

// Create 创建一条缓存记录,如果已有则不进行操作
func (*CacheDB) Create(ctx SQLContext, fileHash cdssdk.FileHash, stgID cdssdk.StorageID, priority int) error {
cache := model.Cache{FileHash: fileHash, StorageID: stgID, CreateTime: time.Now(), Priority: priority}
return ctx.Where(cache).Attrs(cache).FirstOrCreate(&cache).Error
}

// 批量创建缓存记录
func (*CacheDB) BatchCreate(ctx SQLContext, caches []model.Cache) error {
if len(caches) == 0 {
return nil
}

return ctx.Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "FileHash"}, {Name: "StorageID"}},
DoUpdates: clause.AssignmentColumns([]string{"CreateTime", "Priority"}),
}).Create(&caches).Error
}

func (db *CacheDB) BatchCreateOnSameStorage(ctx SQLContext, fileHashes []cdssdk.FileHash, stgID cdssdk.StorageID, priority int) error {
if len(fileHashes) == 0 {
return nil
}

var caches []model.Cache
var nowTime = time.Now()
for _, hash := range fileHashes {
caches = append(caches, model.Cache{
FileHash: hash,
StorageID: stgID,
CreateTime: nowTime,
Priority: priority,
})
}

return db.BatchCreate(ctx, caches)
}

func (*CacheDB) StorageBatchDelete(ctx SQLContext, stgID cdssdk.StorageID, fileHashes []cdssdk.FileHash) error {
if len(fileHashes) == 0 {
return nil
}

return ctx.Table("Cache").Where("StorageID = ? AND FileHash IN (?)", stgID, fileHashes).Delete(&model.Cache{}).Error
}

// GetCachingFileStorages 查找缓存了指定文件的存储服务
func (*CacheDB) GetCachingFileStorages(ctx SQLContext, fileHash cdssdk.FileHash) ([]cdssdk.Storage, error) {
var stgs []cdssdk.Storage
err := ctx.Table("Cache").Select("Storage.*").
Joins("JOIN Storage ON Cache.StorageID = Storage.StorageID").
Where("Cache.FileHash = ?", fileHash).
Find(&stgs).Error
return stgs, err
}

// DeleteStorageAll 删除一个存储服务所有的记录
func (*CacheDB) DeleteStorageAll(ctx SQLContext, StorageID cdssdk.StorageID) error {
return ctx.Where("StorageID = ?", StorageID).Delete(&model.Cache{}).Error
}

// FindCachingFileUserStorages 在缓存表中查询指定数据所在的节点
func (*CacheDB) FindCachingFileUserStorages(ctx SQLContext, userID cdssdk.UserID, fileHash string) ([]cdssdk.Storage, error) {
var stgs []cdssdk.Storage
err := ctx.Table("Cache").Select("Storage.*").
Joins("JOIN UserStorage ON Cache.StorageID = UserStorage.StorageID").
Where("Cache.FileHash = ? AND UserStorage.UserID = ?", fileHash, userID).
Find(&stgs).Error
return stgs, err
}

+ 1
- 1
client/internal/db/config.go View File

@@ -1,4 +1,4 @@
package config
package db


import "fmt" import "fmt"




client/internal/db/db2.go → client/internal/db/db.go View File

@@ -1,4 +1,4 @@
package db2
package db


import ( import (
_ "github.com/go-sql-driver/mysql" _ "github.com/go-sql-driver/mysql"

+ 0
- 60
client/internal/db/hub.go View File

@@ -1,60 +0,0 @@
package db2

import (
"time"

cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
)

type HubDB struct {
*DB
}

func (db *DB) Hub() *HubDB {
return &HubDB{DB: db}
}

func (*HubDB) GetAllHubs(ctx SQLContext) ([]cdssdk.Hub, error) {
var ret []cdssdk.Hub

err := ctx.Table("Hub").Find(&ret).Error
return ret, err
}

func (*HubDB) GetByID(ctx SQLContext, hubID cdssdk.HubID) (cdssdk.Hub, error) {
var ret cdssdk.Hub
err := ctx.Table("Hub").Where("HubID = ?", hubID).Find(&ret).Error

return ret, err
}

func (*HubDB) BatchGetByID(ctx SQLContext, hubIDs []cdssdk.HubID) ([]cdssdk.Hub, error) {
var ret []cdssdk.Hub
err := ctx.Table("Hub").Where("HubID IN (?)", hubIDs).Find(&ret).Error

return ret, err
}

// GetUserHubs 根据用户id查询可用hub
func (*HubDB) GetUserHubs(ctx SQLContext, userID cdssdk.UserID) ([]cdssdk.Hub, error) {
var hubs []cdssdk.Hub
err := ctx.
Table("Hub").
Select("Hub.*").
Joins("JOIN UserHub ON UserHub.HubID = Hub.HubID").
Where("UserHub.UserID = ?", userID).
Find(&hubs).Error
return hubs, err
}

// UpdateState 更新状态,并且设置上次上报时间为现在
func (*HubDB) UpdateState(ctx SQLContext, hubID cdssdk.HubID, state string) error {
err := ctx.
Model(&cdssdk.Hub{}).
Where("HubID = ?", hubID).
Updates(map[string]interface{}{
"State": state,
"LastReportTime": time.Now(),
}).Error
return err
}

+ 0
- 37
client/internal/db/hub_connectivity.go View File

@@ -1,37 +0,0 @@
package db2

import (
cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
"gitlink.org.cn/cloudream/storage2/common/pkgs/db2/model"
"gorm.io/gorm/clause"
)

type HubConnectivityDB struct {
*DB
}

func (db *DB) HubConnectivity() *HubConnectivityDB {
return &HubConnectivityDB{DB: db}
}

func (db *HubConnectivityDB) BatchGetByFromHub(ctx SQLContext, fromHubIDs []cdssdk.HubID) ([]model.HubConnectivity, error) {
if len(fromHubIDs) == 0 {
return nil, nil
}

var ret []model.HubConnectivity

err := ctx.Table("HubConnectivity").Where("FromHubID IN (?)", fromHubIDs).Find(&ret).Error
return ret, err
}

func (db *HubConnectivityDB) BatchUpdateOrCreate(ctx SQLContext, cons []model.HubConnectivity) error {
if len(cons) == 0 {
return nil
}

// 使用 GORM 的批量插入或更新
return ctx.Table("HubConnectivity").Clauses(clause.OnConflict{
UpdateAll: true,
}).Create(&cons).Error
}

+ 0
- 36
client/internal/db/location.go View File

@@ -1,36 +0,0 @@
package db2

import (
"fmt"

"gitlink.org.cn/cloudream/storage2/common/pkgs/db2/model"
)

type LocationDB struct {
*DB
}

func (db *DB) Location() *LocationDB {
return &LocationDB{DB: db}
}

func (*LocationDB) GetByID(ctx SQLContext, id int64) (model.Location, error) {
var ret model.Location
err := ctx.First(&ret, id).Error
return ret, err
}

func (db *LocationDB) FindLocationByExternalIP(ctx SQLContext, ip string) (model.Location, error) {
var locID int64
err := ctx.Table("Hub").Select("LocationID").Where("ExternalIP = ?", ip).Scan(&locID).Error
if err != nil {
return model.Location{}, fmt.Errorf("finding hub by external ip: %w", err)
}

loc, err := db.GetByID(ctx, locID)
if err != nil {
return model.Location{}, fmt.Errorf("getting location by id: %w", err)
}

return loc, nil
}

+ 99
- 110
client/internal/db/object.go View File

@@ -1,4 +1,4 @@
package db2
package db


import ( import (
"fmt" "fmt"
@@ -8,10 +8,7 @@ import (
"gorm.io/gorm" "gorm.io/gorm"
"gorm.io/gorm/clause" "gorm.io/gorm/clause"


cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
stgmod "gitlink.org.cn/cloudream/storage2/common/models"
"gitlink.org.cn/cloudream/storage2/common/pkgs/db2/model"
coormq "gitlink.org.cn/cloudream/storage2/common/pkgs/mq/coordinator"
"gitlink.org.cn/cloudream/storage2/client/types"
) )


type ObjectDB struct { type ObjectDB struct {
@@ -22,20 +19,20 @@ func (db *DB) Object() *ObjectDB {
return &ObjectDB{DB: db} return &ObjectDB{DB: db}
} }


func (db *ObjectDB) GetByID(ctx SQLContext, objectID cdssdk.ObjectID) (cdssdk.Object, error) {
var ret cdssdk.Object
func (db *ObjectDB) GetByID(ctx SQLContext, objectID types.ObjectID) (types.Object, error) {
var ret types.Object
err := ctx.Table("Object").Where("ObjectID = ?", objectID).First(&ret).Error err := ctx.Table("Object").Where("ObjectID = ?", objectID).First(&ret).Error
return ret, err return ret, err
} }


func (db *ObjectDB) GetByPath(ctx SQLContext, packageID cdssdk.PackageID, path string) (cdssdk.Object, error) {
var ret cdssdk.Object
func (db *ObjectDB) GetByPath(ctx SQLContext, packageID types.PackageID, path string) (types.Object, error) {
var ret types.Object
err := ctx.Table("Object").Where("PackageID = ? AND Path = ?", packageID, path).First(&ret).Error err := ctx.Table("Object").Where("PackageID = ? AND Path = ?", packageID, path).First(&ret).Error
return ret, err return ret, err
} }


func (db *ObjectDB) GetByFullPath(ctx SQLContext, bktName string, pkgName string, path string) (cdssdk.Object, error) {
var ret cdssdk.Object
func (db *ObjectDB) GetByFullPath(ctx SQLContext, bktName string, pkgName string, path string) (types.Object, error) {
var ret types.Object
err := ctx.Table("Object"). err := ctx.Table("Object").
Joins("join Package on Package.PackageID = Object.PackageID and Package.Name = ?", pkgName). Joins("join Package on Package.PackageID = Object.PackageID and Package.Name = ?", pkgName).
Joins("join Bucket on Bucket.BucketID = Package.BucketID and Bucket.Name = ?", bktName). Joins("join Bucket on Bucket.BucketID = Package.BucketID and Bucket.Name = ?", bktName).
@@ -43,29 +40,29 @@ func (db *ObjectDB) GetByFullPath(ctx SQLContext, bktName string, pkgName string
return ret, err return ret, err
} }


func (db *ObjectDB) GetWithPathPrefix(ctx SQLContext, packageID cdssdk.PackageID, pathPrefix string) ([]cdssdk.Object, error) {
var ret []cdssdk.Object
func (db *ObjectDB) GetWithPathPrefix(ctx SQLContext, packageID types.PackageID, pathPrefix string) ([]types.Object, error) {
var ret []types.Object
err := ctx.Table("Object").Where("PackageID = ? AND Path LIKE ?", packageID, escapeLike("", "%", pathPrefix)).Order("ObjectID ASC").Find(&ret).Error err := ctx.Table("Object").Where("PackageID = ? AND Path LIKE ?", packageID, escapeLike("", "%", pathPrefix)).Order("ObjectID ASC").Find(&ret).Error
return ret, err return ret, err
} }


// 查询结果将按照Path升序,而不是ObjectID升序 // 查询结果将按照Path升序,而不是ObjectID升序
func (db *ObjectDB) GetWithPathPrefixPaged(ctx SQLContext, packageID cdssdk.PackageID, pathPrefix string, startPath string, limit int) ([]cdssdk.Object, error) {
var ret []cdssdk.Object
func (db *ObjectDB) GetWithPathPrefixPaged(ctx SQLContext, packageID types.PackageID, pathPrefix string, startPath string, limit int) ([]types.Object, error) {
var ret []types.Object
err := ctx.Table("Object").Where("PackageID = ? AND Path > ? AND Path LIKE ?", packageID, startPath, pathPrefix+"%").Order("Path ASC").Limit(limit).Find(&ret).Error err := ctx.Table("Object").Where("PackageID = ? AND Path > ? AND Path LIKE ?", packageID, startPath, pathPrefix+"%").Order("Path ASC").Limit(limit).Find(&ret).Error
return ret, err return ret, err
} }


func (db *ObjectDB) GetByPrefixGrouped(ctx SQLContext, packageID cdssdk.PackageID, pathPrefix string) (objs []cdssdk.Object, commonPrefixes []string, err error) {
func (db *ObjectDB) GetByPrefixGrouped(ctx SQLContext, packageID types.PackageID, pathPrefix string) (objs []types.Object, commonPrefixes []string, err error) {
type ObjectOrDir struct { type ObjectOrDir struct {
cdssdk.Object
types.Object
IsObject bool `gorm:"IsObject"` IsObject bool `gorm:"IsObject"`
Prefix string `gorm:"Prefix"` Prefix string `gorm:"Prefix"`
} }


sepCnt := strings.Count(pathPrefix, cdssdk.ObjectPathSeparator) + 1
sepCnt := strings.Count(pathPrefix, types.ObjectPathSeparator) + 1


prefixStatm := fmt.Sprintf("Substring_Index(Path, '%s', %d)", cdssdk.ObjectPathSeparator, sepCnt)
prefixStatm := fmt.Sprintf("Substring_Index(Path, '%s', %d)", types.ObjectPathSeparator, sepCnt)
grouping := ctx.Table("Object"). grouping := ctx.Table("Object").
Select(fmt.Sprintf("%s as Prefix, Max(ObjectID) as ObjectID, %s = Path as IsObject", prefixStatm, prefixStatm)). Select(fmt.Sprintf("%s as Prefix, Max(ObjectID) as ObjectID, %s = Path as IsObject", prefixStatm, prefixStatm)).
Where("PackageID = ?", packageID). Where("PackageID = ?", packageID).
@@ -86,23 +83,23 @@ func (db *ObjectDB) GetByPrefixGrouped(ctx SQLContext, packageID cdssdk.PackageI
if o.IsObject { if o.IsObject {
objs = append(objs, o.Object) objs = append(objs, o.Object)
} else { } else {
commonPrefixes = append(commonPrefixes, o.Prefix+cdssdk.ObjectPathSeparator)
commonPrefixes = append(commonPrefixes, o.Prefix+types.ObjectPathSeparator)
} }
} }


return return
} }


func (db *ObjectDB) GetByPrefixGroupedPaged(ctx SQLContext, packageID cdssdk.PackageID, pathPrefix string, startPath string, limit int) (objs []cdssdk.Object, commonPrefixes []string, nextStartPath string, err error) {
func (db *ObjectDB) GetByPrefixGroupedPaged(ctx SQLContext, packageID types.PackageID, pathPrefix string, startPath string, limit int) (objs []types.Object, commonPrefixes []string, nextStartPath string, err error) {
type ObjectOrDir struct { type ObjectOrDir struct {
cdssdk.Object
types.Object
IsObject bool `gorm:"IsObject"` IsObject bool `gorm:"IsObject"`
Prefix string `gorm:"Prefix"` Prefix string `gorm:"Prefix"`
} }


sepCnt := strings.Count(pathPrefix, cdssdk.ObjectPathSeparator) + 1
sepCnt := strings.Count(pathPrefix, types.ObjectPathSeparator) + 1


prefixStatm := fmt.Sprintf("Substring_Index(Path, '%s', %d)", cdssdk.ObjectPathSeparator, sepCnt)
prefixStatm := fmt.Sprintf("Substring_Index(Path, '%s', %d)", types.ObjectPathSeparator, sepCnt)
grouping := ctx.Table("Object"). grouping := ctx.Table("Object").
Select(fmt.Sprintf("%s as Prefix, Max(ObjectID) as ObjectID, %s = Path as IsObject", prefixStatm, prefixStatm)). Select(fmt.Sprintf("%s as Prefix, Max(ObjectID) as ObjectID, %s = Path as IsObject", prefixStatm, prefixStatm)).
Where("PackageID = ?", packageID). Where("PackageID = ?", packageID).
@@ -125,7 +122,7 @@ func (db *ObjectDB) GetByPrefixGroupedPaged(ctx SQLContext, packageID cdssdk.Pac
if o.IsObject { if o.IsObject {
objs = append(objs, o.Object) objs = append(objs, o.Object)
} else { } else {
commonPrefixes = append(commonPrefixes, o.Prefix+cdssdk.ObjectPathSeparator)
commonPrefixes = append(commonPrefixes, o.Prefix+types.ObjectPathSeparator)
} }
nextStartPath = o.Prefix nextStartPath = o.Prefix
} }
@@ -133,8 +130,8 @@ func (db *ObjectDB) GetByPrefixGroupedPaged(ctx SQLContext, packageID cdssdk.Pac
return return
} }


func (db *ObjectDB) HasObjectWithPrefix(ctx SQLContext, packageID cdssdk.PackageID, pathPrefix string) (bool, error) {
var obj cdssdk.Object
func (db *ObjectDB) HasObjectWithPrefix(ctx SQLContext, packageID types.PackageID, pathPrefix string) (bool, error) {
var obj types.Object
err := ctx.Table("Object").Where("PackageID = ? AND Path LIKE ?", packageID, escapeLike("", "%", pathPrefix)).First(&obj).Error err := ctx.Table("Object").Where("PackageID = ? AND Path LIKE ?", packageID, escapeLike("", "%", pathPrefix)).First(&obj).Error
if err == nil { if err == nil {
return true, nil return true, nil
@@ -147,18 +144,18 @@ func (db *ObjectDB) HasObjectWithPrefix(ctx SQLContext, packageID cdssdk.Package
return false, err return false, err
} }


func (db *ObjectDB) BatchTestObjectID(ctx SQLContext, objectIDs []cdssdk.ObjectID) (map[cdssdk.ObjectID]bool, error) {
func (db *ObjectDB) BatchTestObjectID(ctx SQLContext, objectIDs []types.ObjectID) (map[types.ObjectID]bool, error) {
if len(objectIDs) == 0 { if len(objectIDs) == 0 {
return make(map[cdssdk.ObjectID]bool), nil
return make(map[types.ObjectID]bool), nil
} }


var avaiIDs []cdssdk.ObjectID
var avaiIDs []types.ObjectID
err := ctx.Table("Object").Where("ObjectID IN ?", objectIDs).Pluck("ObjectID", &avaiIDs).Error err := ctx.Table("Object").Where("ObjectID IN ?", objectIDs).Pluck("ObjectID", &avaiIDs).Error
if err != nil { if err != nil {
return nil, err return nil, err
} }


avaiIDMap := make(map[cdssdk.ObjectID]bool)
avaiIDMap := make(map[types.ObjectID]bool)
for _, pkgID := range avaiIDs { for _, pkgID := range avaiIDs {
avaiIDMap[pkgID] = true avaiIDMap[pkgID] = true
} }
@@ -166,12 +163,12 @@ func (db *ObjectDB) BatchTestObjectID(ctx SQLContext, objectIDs []cdssdk.ObjectI
return avaiIDMap, nil return avaiIDMap, nil
} }


func (db *ObjectDB) BatchGet(ctx SQLContext, objectIDs []cdssdk.ObjectID) ([]cdssdk.Object, error) {
func (db *ObjectDB) BatchGet(ctx SQLContext, objectIDs []types.ObjectID) ([]types.Object, error) {
if len(objectIDs) == 0 { if len(objectIDs) == 0 {
return nil, nil return nil, nil
} }


var objs []cdssdk.Object
var objs []types.Object
err := ctx.Table("Object").Where("ObjectID IN ?", objectIDs).Order("ObjectID ASC").Find(&objs).Error err := ctx.Table("Object").Where("ObjectID IN ?", objectIDs).Order("ObjectID ASC").Find(&objs).Error
if err != nil { if err != nil {
return nil, err return nil, err
@@ -180,12 +177,12 @@ func (db *ObjectDB) BatchGet(ctx SQLContext, objectIDs []cdssdk.ObjectID) ([]cds
return objs, nil return objs, nil
} }


func (db *ObjectDB) BatchGetByPackagePath(ctx SQLContext, pkgID cdssdk.PackageID, pathes []string) ([]cdssdk.Object, error) {
func (db *ObjectDB) BatchGetByPackagePath(ctx SQLContext, pkgID types.PackageID, pathes []string) ([]types.Object, error) {
if len(pathes) == 0 { if len(pathes) == 0 {
return nil, nil return nil, nil
} }


var objs []cdssdk.Object
var objs []types.Object
err := ctx.Table("Object").Where("PackageID = ? AND Path IN ?", pkgID, pathes).Find(&objs).Error err := ctx.Table("Object").Where("PackageID = ? AND Path IN ?", pkgID, pathes).Find(&objs).Error
if err != nil { if err != nil {
return nil, err return nil, err
@@ -194,33 +191,33 @@ func (db *ObjectDB) BatchGetByPackagePath(ctx SQLContext, pkgID cdssdk.PackageID
return objs, nil return objs, nil
} }


func (db *ObjectDB) GetDetail(ctx SQLContext, objectID cdssdk.ObjectID) (stgmod.ObjectDetail, error) {
var obj cdssdk.Object
func (db *ObjectDB) GetDetail(ctx SQLContext, objectID types.ObjectID) (types.ObjectDetail, error) {
var obj types.Object
err := ctx.Table("Object").Where("ObjectID = ?", objectID).First(&obj).Error err := ctx.Table("Object").Where("ObjectID = ?", objectID).First(&obj).Error
if err != nil { if err != nil {
return stgmod.ObjectDetail{}, fmt.Errorf("getting object: %w", err)
return types.ObjectDetail{}, fmt.Errorf("getting object: %w", err)
} }


// 获取所有的 ObjectBlock // 获取所有的 ObjectBlock
var allBlocks []stgmod.ObjectBlock
var allBlocks []types.ObjectBlock
err = ctx.Table("ObjectBlock").Where("ObjectID = ?", objectID).Order("`Index` ASC").Find(&allBlocks).Error err = ctx.Table("ObjectBlock").Where("ObjectID = ?", objectID).Order("`Index` ASC").Find(&allBlocks).Error
if err != nil { if err != nil {
return stgmod.ObjectDetail{}, fmt.Errorf("getting all object blocks: %w", err)
return types.ObjectDetail{}, fmt.Errorf("getting all object blocks: %w", err)
} }


// 获取所有的 PinnedObject // 获取所有的 PinnedObject
var allPinnedObjs []cdssdk.PinnedObject
var allPinnedObjs []types.PinnedObject
err = ctx.Table("PinnedObject").Where("ObjectID = ?", objectID).Order("ObjectID ASC").Find(&allPinnedObjs).Error err = ctx.Table("PinnedObject").Where("ObjectID = ?", objectID).Order("ObjectID ASC").Find(&allPinnedObjs).Error
if err != nil { if err != nil {
return stgmod.ObjectDetail{}, fmt.Errorf("getting all pinned objects: %w", err)
return types.ObjectDetail{}, fmt.Errorf("getting all pinned objects: %w", err)
} }


pinnedAt := make([]cdssdk.StorageID, len(allPinnedObjs))
pinnedAt := make([]types.UserSpaceID, len(allPinnedObjs))
for i, po := range allPinnedObjs { for i, po := range allPinnedObjs {
pinnedAt[i] = po.StorageID
pinnedAt[i] = po.UserSpaceID
} }


return stgmod.ObjectDetail{
return types.ObjectDetail{
Object: obj, Object: obj,
Blocks: allBlocks, Blocks: allBlocks,
PinnedAt: pinnedAt, PinnedAt: pinnedAt,
@@ -228,8 +225,8 @@ func (db *ObjectDB) GetDetail(ctx SQLContext, objectID cdssdk.ObjectID) (stgmod.
} }


// 仅返回查询到的对象 // 仅返回查询到的对象
func (db *ObjectDB) BatchGetDetails(ctx SQLContext, objectIDs []cdssdk.ObjectID) ([]stgmod.ObjectDetail, error) {
var objs []cdssdk.Object
func (db *ObjectDB) BatchGetDetails(ctx SQLContext, objectIDs []types.ObjectID) ([]types.ObjectDetail, error) {
var objs []types.Object


err := ctx.Table("Object").Where("ObjectID IN ?", objectIDs).Order("ObjectID ASC").Find(&objs).Error err := ctx.Table("Object").Where("ObjectID IN ?", objectIDs).Order("ObjectID ASC").Find(&objs).Error
if err != nil { if err != nil {
@@ -237,32 +234,32 @@ func (db *ObjectDB) BatchGetDetails(ctx SQLContext, objectIDs []cdssdk.ObjectID)
} }


// 获取所有的 ObjectBlock // 获取所有的 ObjectBlock
var allBlocks []stgmod.ObjectBlock
var allBlocks []types.ObjectBlock
err = ctx.Table("ObjectBlock").Where("ObjectID IN ?", objectIDs).Order("ObjectID, `Index` ASC").Find(&allBlocks).Error err = ctx.Table("ObjectBlock").Where("ObjectID IN ?", objectIDs).Order("ObjectID, `Index` ASC").Find(&allBlocks).Error
if err != nil { if err != nil {
return nil, err return nil, err
} }


// 获取所有的 PinnedObject // 获取所有的 PinnedObject
var allPinnedObjs []cdssdk.PinnedObject
var allPinnedObjs []types.PinnedObject
err = ctx.Table("PinnedObject").Where("ObjectID IN ?", objectIDs).Order("ObjectID ASC").Find(&allPinnedObjs).Error err = ctx.Table("PinnedObject").Where("ObjectID IN ?", objectIDs).Order("ObjectID ASC").Find(&allPinnedObjs).Error
if err != nil { if err != nil {
return nil, err return nil, err
} }


details := make([]stgmod.ObjectDetail, len(objs))
details := make([]types.ObjectDetail, len(objs))
for i, obj := range objs { for i, obj := range objs {
details[i] = stgmod.ObjectDetail{
details[i] = types.ObjectDetail{
Object: obj, Object: obj,
} }
} }


stgmod.DetailsFillObjectBlocks(details, allBlocks)
stgmod.DetailsFillPinnedAt(details, allPinnedObjs)
types.DetailsFillObjectBlocks(details, allBlocks)
types.DetailsFillPinnedAt(details, allPinnedObjs)
return details, nil return details, nil
} }


func (db *ObjectDB) Create(ctx SQLContext, obj cdssdk.Object) (cdssdk.ObjectID, error) {
func (db *ObjectDB) Create(ctx SQLContext, obj types.Object) (types.ObjectID, error) {
err := ctx.Table("Object").Create(&obj).Error err := ctx.Table("Object").Create(&obj).Error
if err != nil { if err != nil {
return 0, fmt.Errorf("insert object failed, err: %w", err) return 0, fmt.Errorf("insert object failed, err: %w", err)
@@ -271,7 +268,7 @@ func (db *ObjectDB) Create(ctx SQLContext, obj cdssdk.Object) (cdssdk.ObjectID,
} }


// 批量创建对象,创建完成后会填充ObjectID。 // 批量创建对象,创建完成后会填充ObjectID。
func (db *ObjectDB) BatchCreate(ctx SQLContext, objs *[]cdssdk.Object) error {
func (db *ObjectDB) BatchCreate(ctx SQLContext, objs *[]types.Object) error {
if len(*objs) == 0 { if len(*objs) == 0 {
return nil return nil
} }
@@ -280,7 +277,7 @@ func (db *ObjectDB) BatchCreate(ctx SQLContext, objs *[]cdssdk.Object) error {
} }


// 批量更新对象所有属性,objs中的对象必须包含ObjectID // 批量更新对象所有属性,objs中的对象必须包含ObjectID
func (db *ObjectDB) BatchUpdate(ctx SQLContext, objs []cdssdk.Object) error {
func (db *ObjectDB) BatchUpdate(ctx SQLContext, objs []types.Object) error {
if len(objs) == 0 { if len(objs) == 0 {
return nil return nil
} }
@@ -294,7 +291,7 @@ func (db *ObjectDB) BatchUpdate(ctx SQLContext, objs []cdssdk.Object) error {
// 批量更新对象指定属性,objs中的对象只需设置需要更新的属性即可,但: // 批量更新对象指定属性,objs中的对象只需设置需要更新的属性即可,但:
// 1. 必须包含ObjectID // 1. 必须包含ObjectID
// 2. 日期类型属性不能设置为0值 // 2. 日期类型属性不能设置为0值
func (db *ObjectDB) BatchUpdateColumns(ctx SQLContext, objs []cdssdk.Object, columns []string) error {
func (db *ObjectDB) BatchUpdateColumns(ctx SQLContext, objs []types.Object, columns []string) error {
if len(objs) == 0 { if len(objs) == 0 {
return nil return nil
} }
@@ -305,21 +302,21 @@ func (db *ObjectDB) BatchUpdateColumns(ctx SQLContext, objs []cdssdk.Object, col
}).Create(objs).Error }).Create(objs).Error
} }


func (db *ObjectDB) GetPackageObjects(ctx SQLContext, packageID cdssdk.PackageID) ([]cdssdk.Object, error) {
var ret []cdssdk.Object
func (db *ObjectDB) GetPackageObjects(ctx SQLContext, packageID types.PackageID) ([]types.Object, error) {
var ret []types.Object
err := ctx.Table("Object").Where("PackageID = ?", packageID).Order("ObjectID ASC").Find(&ret).Error err := ctx.Table("Object").Where("PackageID = ?", packageID).Order("ObjectID ASC").Find(&ret).Error
return ret, err return ret, err
} }


func (db *ObjectDB) GetPackageObjectDetails(ctx SQLContext, packageID cdssdk.PackageID) ([]stgmod.ObjectDetail, error) {
var objs []cdssdk.Object
func (db *ObjectDB) GetPackageObjectDetails(ctx SQLContext, packageID types.PackageID) ([]types.ObjectDetail, error) {
var objs []types.Object
err := ctx.Table("Object").Where("PackageID = ?", packageID).Order("ObjectID ASC").Find(&objs).Error err := ctx.Table("Object").Where("PackageID = ?", packageID).Order("ObjectID ASC").Find(&objs).Error
if err != nil { if err != nil {
return nil, fmt.Errorf("getting objects: %w", err) return nil, fmt.Errorf("getting objects: %w", err)
} }


// 获取所有的 ObjectBlock // 获取所有的 ObjectBlock
var allBlocks []stgmod.ObjectBlock
var allBlocks []types.ObjectBlock
err = ctx.Table("ObjectBlock"). err = ctx.Table("ObjectBlock").
Select("ObjectBlock.*"). Select("ObjectBlock.*").
Joins("JOIN Object ON ObjectBlock.ObjectID = Object.ObjectID"). Joins("JOIN Object ON ObjectBlock.ObjectID = Object.ObjectID").
@@ -331,7 +328,7 @@ func (db *ObjectDB) GetPackageObjectDetails(ctx SQLContext, packageID cdssdk.Pac
} }


// 获取所有的 PinnedObject // 获取所有的 PinnedObject
var allPinnedObjs []cdssdk.PinnedObject
var allPinnedObjs []types.PinnedObject
err = ctx.Table("PinnedObject"). err = ctx.Table("PinnedObject").
Select("PinnedObject.*"). Select("PinnedObject.*").
Joins("JOIN Object ON PinnedObject.ObjectID = Object.ObjectID"). Joins("JOIN Object ON PinnedObject.ObjectID = Object.ObjectID").
@@ -342,21 +339,21 @@ func (db *ObjectDB) GetPackageObjectDetails(ctx SQLContext, packageID cdssdk.Pac
return nil, fmt.Errorf("getting all pinned objects: %w", err) return nil, fmt.Errorf("getting all pinned objects: %w", err)
} }


details := make([]stgmod.ObjectDetail, len(objs))
details := make([]types.ObjectDetail, len(objs))
for i, obj := range objs { for i, obj := range objs {
details[i] = stgmod.ObjectDetail{
details[i] = types.ObjectDetail{
Object: obj, Object: obj,
} }
} }


stgmod.DetailsFillObjectBlocks(details, allBlocks)
stgmod.DetailsFillPinnedAt(details, allPinnedObjs)
types.DetailsFillObjectBlocks(details, allBlocks)
types.DetailsFillPinnedAt(details, allPinnedObjs)
return details, nil return details, nil
} }


func (db *ObjectDB) GetObjectsIfAnyBlockOnStorage(ctx SQLContext, stgID cdssdk.StorageID) ([]cdssdk.Object, error) {
var objs []cdssdk.Object
err := ctx.Table("Object").Where("ObjectID IN (SELECT ObjectID FROM ObjectBlock WHERE StorageID = ?)", stgID).Order("ObjectID ASC").Find(&objs).Error
func (db *ObjectDB) GetObjectsIfAnyBlockOnStorage(ctx SQLContext, spaceID types.UserSpaceID) ([]types.Object, error) {
var objs []types.Object
err := ctx.Table("Object").Where("ObjectID IN (SELECT ObjectID FROM ObjectBlock WHERE UserSpaceID = ?)", spaceID).Order("ObjectID ASC").Find(&objs).Error
if err != nil { if err != nil {
return nil, fmt.Errorf("getting objects: %w", err) return nil, fmt.Errorf("getting objects: %w", err)
} }
@@ -364,7 +361,15 @@ func (db *ObjectDB) GetObjectsIfAnyBlockOnStorage(ctx SQLContext, stgID cdssdk.S
return objs, nil return objs, nil
} }


func (db *ObjectDB) BatchAdd(ctx SQLContext, packageID cdssdk.PackageID, adds []coormq.AddObjectEntry) ([]cdssdk.Object, error) {
type AddObjectEntry struct {
Path string `json:"path"`
Size int64 `json:"size,string"`
FileHash types.FileHash `json:"fileHash"`
UploadTime time.Time `json:"uploadTime"` // 开始上传文件的时间
UserSpaceIDs []types.UserSpaceID `json:"userSpaceIDs"`
}

func (db *ObjectDB) BatchAdd(ctx SQLContext, packageID types.PackageID, adds []AddObjectEntry) ([]types.Object, error) {
if len(adds) == 0 { if len(adds) == 0 {
return nil, nil return nil, nil
} }
@@ -381,20 +386,20 @@ func (db *ObjectDB) BatchAdd(ctx SQLContext, packageID cdssdk.PackageID, adds []
return nil, fmt.Errorf("batch get object by path: %w", err) return nil, fmt.Errorf("batch get object by path: %w", err)
} }


existsObjsMap := make(map[string]cdssdk.Object)
existsObjsMap := make(map[string]types.Object)
for _, obj := range existsObjs { for _, obj := range existsObjs {
existsObjsMap[obj.Path] = obj existsObjsMap[obj.Path] = obj
} }


var updatingObjs []cdssdk.Object
var addingObjs []cdssdk.Object
var updatingObjs []types.Object
var addingObjs []types.Object
for i := range adds { for i := range adds {
o := cdssdk.Object{
o := types.Object{
PackageID: packageID, PackageID: packageID,
Path: adds[i].Path, Path: adds[i].Path,
Size: adds[i].Size, Size: adds[i].Size,
FileHash: adds[i].FileHash, FileHash: adds[i].FileHash,
Redundancy: cdssdk.NewNoneRedundancy(), // 首次上传默认使用不分块的none模式
Redundancy: types.NewNoneRedundancy(), // 首次上传默认使用不分块的none模式
CreateTime: adds[i].UploadTime, CreateTime: adds[i].UploadTime,
UpdateTime: adds[i].UploadTime, UpdateTime: adds[i].UploadTime,
} }
@@ -423,15 +428,15 @@ func (db *ObjectDB) BatchAdd(ctx SQLContext, packageID cdssdk.PackageID, adds []
} }


// 按照add参数的顺序返回结果 // 按照add参数的顺序返回结果
affectedObjsMp := make(map[string]cdssdk.Object)
affectedObjsMp := make(map[string]types.Object)
for _, o := range updatingObjs { for _, o := range updatingObjs {
affectedObjsMp[o.Path] = o affectedObjsMp[o.Path] = o
} }
for _, o := range addingObjs { for _, o := range addingObjs {
affectedObjsMp[o.Path] = o affectedObjsMp[o.Path] = o
} }
affectedObjs := make([]cdssdk.Object, 0, len(affectedObjsMp))
affectedObjIDs := make([]cdssdk.ObjectID, 0, len(affectedObjsMp))
affectedObjs := make([]types.Object, 0, len(affectedObjsMp))
affectedObjIDs := make([]types.ObjectID, 0, len(affectedObjsMp))
for i := range adds { for i := range adds {
obj := affectedObjsMp[adds[i].Path] obj := affectedObjsMp[adds[i].Path]
affectedObjs = append(affectedObjs, obj) affectedObjs = append(affectedObjs, obj)
@@ -451,15 +456,15 @@ func (db *ObjectDB) BatchAdd(ctx SQLContext, packageID cdssdk.PackageID, adds []
} }


// 创建 ObjectBlock // 创建 ObjectBlock
objBlocks := make([]stgmod.ObjectBlock, 0, len(adds))
objBlocks := make([]types.ObjectBlock, 0, len(adds))
for i, add := range adds { for i, add := range adds {
for _, stgID := range add.StorageIDs {
objBlocks = append(objBlocks, stgmod.ObjectBlock{
ObjectID: affectedObjIDs[i],
Index: 0,
StorageID: stgID,
FileHash: add.FileHash,
Size: add.Size,
for _, spaceID := range add.UserSpaceIDs {
objBlocks = append(objBlocks, types.ObjectBlock{
ObjectID: affectedObjIDs[i],
Index: 0,
UserSpaceID: spaceID,
FileHash: add.FileHash,
Size: add.Size,
}) })
} }
} }
@@ -467,42 +472,26 @@ func (db *ObjectDB) BatchAdd(ctx SQLContext, packageID cdssdk.PackageID, adds []
return nil, fmt.Errorf("batch create object blocks: %w", err) return nil, fmt.Errorf("batch create object blocks: %w", err)
} }


// 创建 Cache
caches := make([]model.Cache, 0, len(adds))
for _, add := range adds {
for _, stgID := range add.StorageIDs {
caches = append(caches, model.Cache{
FileHash: add.FileHash,
StorageID: stgID,
CreateTime: time.Now(),
Priority: 0,
})
}
}
if err := db.Cache().BatchCreate(ctx, caches); err != nil {
return nil, fmt.Errorf("batch create caches: %w", err)
}

return affectedObjs, nil return affectedObjs, nil
} }


func (db *ObjectDB) BatchDelete(ctx SQLContext, ids []cdssdk.ObjectID) error {
func (db *ObjectDB) BatchDelete(ctx SQLContext, ids []types.ObjectID) error {
if len(ids) == 0 { if len(ids) == 0 {
return nil return nil
} }


return ctx.Table("Object").Where("ObjectID IN ?", ids).Delete(&cdssdk.Object{}).Error
return ctx.Table("Object").Where("ObjectID IN ?", ids).Delete(&types.Object{}).Error
} }


func (db *ObjectDB) DeleteInPackage(ctx SQLContext, packageID cdssdk.PackageID) error {
return ctx.Table("Object").Where("PackageID = ?", packageID).Delete(&cdssdk.Object{}).Error
func (db *ObjectDB) DeleteInPackage(ctx SQLContext, packageID types.PackageID) error {
return ctx.Table("Object").Where("PackageID = ?", packageID).Delete(&types.Object{}).Error
} }


func (db *ObjectDB) DeleteByPath(ctx SQLContext, packageID cdssdk.PackageID, path string) error {
return ctx.Table("Object").Where("PackageID = ? AND Path = ?", packageID, path).Delete(&cdssdk.Object{}).Error
func (db *ObjectDB) DeleteByPath(ctx SQLContext, packageID types.PackageID, path string) error {
return ctx.Table("Object").Where("PackageID = ? AND Path = ?", packageID, path).Delete(&types.Object{}).Error
} }


func (db *ObjectDB) MoveByPrefix(ctx SQLContext, oldPkgID cdssdk.PackageID, oldPrefix string, newPkgID cdssdk.PackageID, newPrefix string) error {
func (db *ObjectDB) MoveByPrefix(ctx SQLContext, oldPkgID types.PackageID, oldPrefix string, newPkgID types.PackageID, newPrefix string) error {
return ctx.Table("Object").Where("PackageID = ? AND Path LIKE ?", oldPkgID, escapeLike("", "%", oldPrefix)). return ctx.Table("Object").Where("PackageID = ? AND Path LIKE ?", oldPkgID, escapeLike("", "%", oldPrefix)).
Updates(map[string]any{ Updates(map[string]any{
"PackageID": newPkgID, "PackageID": newPkgID,


+ 29
- 24
client/internal/db/object_access_stat.go View File

@@ -1,9 +1,7 @@
package db2
package db


import ( import (
cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
stgmod "gitlink.org.cn/cloudream/storage2/common/models"
coormq "gitlink.org.cn/cloudream/storage2/common/pkgs/mq/coordinator"
"gitlink.org.cn/cloudream/storage2/client/types"
"gorm.io/gorm" "gorm.io/gorm"
"gorm.io/gorm/clause" "gorm.io/gorm/clause"
) )
@@ -16,61 +14,68 @@ func (db *DB) ObjectAccessStat() *ObjectAccessStatDB {
return &ObjectAccessStatDB{db} return &ObjectAccessStatDB{db}
} }


func (*ObjectAccessStatDB) Get(ctx SQLContext, objID cdssdk.ObjectID, stgID cdssdk.StorageID) (stgmod.ObjectAccessStat, error) {
var ret stgmod.ObjectAccessStat
func (*ObjectAccessStatDB) Get(ctx SQLContext, objID types.ObjectID, spaceID types.UserSpaceID) (types.ObjectAccessStat, error) {
var ret types.ObjectAccessStat
err := ctx.Table("ObjectAccessStat"). err := ctx.Table("ObjectAccessStat").
Where("ObjectID = ? AND StorageID = ?", objID, stgID).
Where("ObjectID = ? AND UserSpaceID = ?", objID, spaceID).
First(&ret).Error First(&ret).Error
return ret, err return ret, err
} }


func (*ObjectAccessStatDB) GetByObjectID(ctx SQLContext, objID cdssdk.ObjectID) ([]stgmod.ObjectAccessStat, error) {
var ret []stgmod.ObjectAccessStat
func (*ObjectAccessStatDB) GetByObjectID(ctx SQLContext, objID types.ObjectID) ([]types.ObjectAccessStat, error) {
var ret []types.ObjectAccessStat
err := ctx.Table("ObjectAccessStat"). err := ctx.Table("ObjectAccessStat").
Where("ObjectID = ?", objID). Where("ObjectID = ?", objID).
Find(&ret).Error Find(&ret).Error
return ret, err return ret, err
} }


func (*ObjectAccessStatDB) BatchGetByObjectID(ctx SQLContext, objIDs []cdssdk.ObjectID) ([]stgmod.ObjectAccessStat, error) {
func (*ObjectAccessStatDB) BatchGetByObjectID(ctx SQLContext, objIDs []types.ObjectID) ([]types.ObjectAccessStat, error) {
if len(objIDs) == 0 { if len(objIDs) == 0 {
return nil, nil return nil, nil
} }


var ret []stgmod.ObjectAccessStat
var ret []types.ObjectAccessStat
err := ctx.Table("ObjectAccessStat"). err := ctx.Table("ObjectAccessStat").
Where("ObjectID IN ?", objIDs). Where("ObjectID IN ?", objIDs).
Find(&ret).Error Find(&ret).Error
return ret, err return ret, err
} }


func (*ObjectAccessStatDB) BatchGetByObjectIDOnStorage(ctx SQLContext, objIDs []cdssdk.ObjectID, stgID cdssdk.StorageID) ([]stgmod.ObjectAccessStat, error) {
func (*ObjectAccessStatDB) BatchGetByObjectIDOnStorage(ctx SQLContext, objIDs []types.ObjectID, spaceID types.UserSpaceID) ([]types.ObjectAccessStat, error) {
if len(objIDs) == 0 { if len(objIDs) == 0 {
return nil, nil return nil, nil
} }


var ret []stgmod.ObjectAccessStat
var ret []types.ObjectAccessStat
err := ctx.Table("ObjectAccessStat"). err := ctx.Table("ObjectAccessStat").
Where("ObjectID IN ? AND StorageID = ?", objIDs, stgID).
Where("ObjectID IN ? AND UserSpaceID = ?", objIDs, spaceID).
Find(&ret).Error Find(&ret).Error
return ret, err return ret, err
} }


func (*ObjectAccessStatDB) BatchAddCounter(ctx SQLContext, entries []coormq.AddAccessStatEntry) error {
type AddAccessStatEntry struct {
ObjectID types.ObjectID `json:"objectID"`
PackageID types.PackageID `json:"packageID"`
UserSpaceID types.UserSpaceID `json:"userSpaceID"`
Counter float64 `json:"counter"`
}

func (*ObjectAccessStatDB) BatchAddCounter(ctx SQLContext, entries []AddAccessStatEntry) error {
if len(entries) == 0 { if len(entries) == 0 {
return nil return nil
} }


for _, entry := range entries { for _, entry := range entries {
acc := stgmod.ObjectAccessStat{
ObjectID: entry.ObjectID,
StorageID: entry.StorageID,
Counter: entry.Counter,
acc := types.ObjectAccessStat{
ObjectID: entry.ObjectID,
UserSpaceID: entry.UserSpaceID,
Counter: entry.Counter,
} }


err := ctx.Table("ObjectAccessStat"). err := ctx.Table("ObjectAccessStat").
Clauses(clause.OnConflict{ Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "ObjectID"}, {Name: "StorageID"}},
Columns: []clause.Column{{Name: "ObjectID"}, {Name: "UserSpaceID"}},
DoUpdates: clause.Assignments(map[string]any{ DoUpdates: clause.Assignments(map[string]any{
"Counter": gorm.Expr("Counter + values(Counter)"), "Counter": gorm.Expr("Counter + values(Counter)"),
}), }),
@@ -82,7 +87,7 @@ func (*ObjectAccessStatDB) BatchAddCounter(ctx SQLContext, entries []coormq.AddA
return nil return nil
} }


func (*ObjectAccessStatDB) BatchUpdateAmountInPackage(ctx SQLContext, pkgIDs []cdssdk.PackageID, historyWeight float64) error {
func (*ObjectAccessStatDB) BatchUpdateAmountInPackage(ctx SQLContext, pkgIDs []types.PackageID, historyWeight float64) error {
if len(pkgIDs) == 0 { if len(pkgIDs) == 0 {
return nil return nil
} }
@@ -96,12 +101,12 @@ func (*ObjectAccessStatDB) UpdateAllAmount(ctx SQLContext, historyWeight float64
return err return err
} }


func (*ObjectAccessStatDB) DeleteByObjectID(ctx SQLContext, objID cdssdk.ObjectID) error {
func (*ObjectAccessStatDB) DeleteByObjectID(ctx SQLContext, objID types.ObjectID) error {
err := ctx.Table("ObjectAccessStat").Where("ObjectID = ?", objID).Delete(nil).Error err := ctx.Table("ObjectAccessStat").Where("ObjectID = ?", objID).Delete(nil).Error
return err return err
} }


func (*ObjectAccessStatDB) BatchDeleteByObjectID(ctx SQLContext, objIDs []cdssdk.ObjectID) error {
func (*ObjectAccessStatDB) BatchDeleteByObjectID(ctx SQLContext, objIDs []types.ObjectID) error {
if len(objIDs) == 0 { if len(objIDs) == 0 {
return nil return nil
} }
@@ -110,7 +115,7 @@ func (*ObjectAccessStatDB) BatchDeleteByObjectID(ctx SQLContext, objIDs []cdssdk
return err return err
} }


func (*ObjectAccessStatDB) DeleteInPackage(ctx SQLContext, packageID cdssdk.PackageID) error {
func (*ObjectAccessStatDB) DeleteInPackage(ctx SQLContext, packageID types.PackageID) error {
err := ctx.Exec("DELETE o FROM ObjectAccessStat o INNER JOIN Object obj ON o.ObjectID = obj.ObjectID WHERE obj.PackageID = ?", packageID).Error err := ctx.Exec("DELETE o FROM ObjectAccessStat o INNER JOIN Object obj ON o.ObjectID = obj.ObjectID WHERE obj.PackageID = ?", packageID).Error
return err return err
} }

+ 23
- 48
client/internal/db/object_block.go View File

@@ -1,11 +1,7 @@
package db2
package db


import ( import (
"strconv"
"strings"

cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
stgmod "gitlink.org.cn/cloudream/storage2/common/models"
"gitlink.org.cn/cloudream/storage2/client/types"
"gorm.io/gorm/clause" "gorm.io/gorm/clause"
) )


@@ -17,24 +13,24 @@ func (db *DB) ObjectBlock() *ObjectBlockDB {
return &ObjectBlockDB{DB: db} return &ObjectBlockDB{DB: db}
} }


func (db *ObjectBlockDB) GetByStorageID(ctx SQLContext, stgID cdssdk.StorageID) ([]stgmod.ObjectBlock, error) {
var rets []stgmod.ObjectBlock
err := ctx.Table("ObjectBlock").Where("StorageID = ?", stgID).Find(&rets).Error
func (db *ObjectBlockDB) GetByUserSpaceID(ctx SQLContext, spaceID types.UserSpaceID) ([]types.ObjectBlock, error) {
var rets []types.ObjectBlock
err := ctx.Table("ObjectBlock").Where("UserSpaceID = ?", spaceID).Find(&rets).Error
return rets, err return rets, err
} }


func (db *ObjectBlockDB) BatchGetByObjectID(ctx SQLContext, objectIDs []cdssdk.ObjectID) ([]stgmod.ObjectBlock, error) {
func (db *ObjectBlockDB) BatchGetByObjectID(ctx SQLContext, objectIDs []types.ObjectID) ([]types.ObjectBlock, error) {
if len(objectIDs) == 0 { if len(objectIDs) == 0 {
return nil, nil return nil, nil
} }


var blocks []stgmod.ObjectBlock
var blocks []types.ObjectBlock
err := ctx.Table("ObjectBlock").Where("ObjectID IN (?)", objectIDs).Order("ObjectID, `Index` ASC").Find(&blocks).Error err := ctx.Table("ObjectBlock").Where("ObjectID IN (?)", objectIDs).Order("ObjectID, `Index` ASC").Find(&blocks).Error
return blocks, err return blocks, err
} }


func (*ObjectBlockDB) GetInPackageID(ctx SQLContext, packageID cdssdk.PackageID) ([]stgmod.ObjectBlock, error) {
var rets []stgmod.ObjectBlock
func (*ObjectBlockDB) GetInPackageID(ctx SQLContext, packageID types.PackageID) ([]types.ObjectBlock, error) {
var rets []types.ObjectBlock
err := ctx.Table("ObjectBlock"). err := ctx.Table("ObjectBlock").
Joins("INNER JOIN Object ON ObjectBlock.ObjectID = Object.ObjectID"). Joins("INNER JOIN Object ON ObjectBlock.ObjectID = Object.ObjectID").
Where("Object.PackageID = ?", packageID). Where("Object.PackageID = ?", packageID).
@@ -43,12 +39,12 @@ func (*ObjectBlockDB) GetInPackageID(ctx SQLContext, packageID cdssdk.PackageID)
return rets, err return rets, err
} }


func (db *ObjectBlockDB) Create(ctx SQLContext, objectID cdssdk.ObjectID, index int, stgID cdssdk.StorageID, fileHash cdssdk.FileHash, size int64) error {
block := stgmod.ObjectBlock{ObjectID: objectID, Index: index, StorageID: stgID, FileHash: fileHash, Size: size}
func (db *ObjectBlockDB) Create(ctx SQLContext, objectID types.ObjectID, index int, spaceID types.UserSpaceID, fileHash types.FileHash, size int64) error {
block := types.ObjectBlock{ObjectID: objectID, Index: index, UserSpaceID: spaceID, FileHash: fileHash, Size: size}
return ctx.Table("ObjectBlock").Create(&block).Error return ctx.Table("ObjectBlock").Create(&block).Error
} }


func (db *ObjectBlockDB) BatchCreate(ctx SQLContext, blocks []stgmod.ObjectBlock) error {
func (db *ObjectBlockDB) BatchCreate(ctx SQLContext, blocks []types.ObjectBlock) error {
if len(blocks) == 0 { if len(blocks) == 0 {
return nil return nil
} }
@@ -56,32 +52,32 @@ func (db *ObjectBlockDB) BatchCreate(ctx SQLContext, blocks []stgmod.ObjectBlock
return ctx.Clauses(clause.Insert{Modifier: "ignore"}).Create(&blocks).Error return ctx.Clauses(clause.Insert{Modifier: "ignore"}).Create(&blocks).Error
} }


func (db *ObjectBlockDB) DeleteByObjectID(ctx SQLContext, objectID cdssdk.ObjectID) error {
return ctx.Table("ObjectBlock").Where("ObjectID = ?", objectID).Delete(&stgmod.ObjectBlock{}).Error
func (db *ObjectBlockDB) DeleteByObjectID(ctx SQLContext, objectID types.ObjectID) error {
return ctx.Table("ObjectBlock").Where("ObjectID = ?", objectID).Delete(&types.ObjectBlock{}).Error
} }


func (db *ObjectBlockDB) DeleteByObjectIDIndex(ctx SQLContext, objectID cdssdk.ObjectID, index int) error {
return ctx.Table("ObjectBlock").Where("ObjectID = ? AND `Index` = ?", objectID, index).Delete(&stgmod.ObjectBlock{}).Error
func (db *ObjectBlockDB) DeleteByObjectIDIndex(ctx SQLContext, objectID types.ObjectID, index int) error {
return ctx.Table("ObjectBlock").Where("ObjectID = ? AND `Index` = ?", objectID, index).Delete(&types.ObjectBlock{}).Error
} }


func (db *ObjectBlockDB) BatchDeleteByObjectID(ctx SQLContext, objectIDs []cdssdk.ObjectID) error {
func (db *ObjectBlockDB) BatchDeleteByObjectID(ctx SQLContext, objectIDs []types.ObjectID) error {
if len(objectIDs) == 0 { if len(objectIDs) == 0 {
return nil return nil
} }


return ctx.Table("ObjectBlock").Where("ObjectID IN (?)", objectIDs).Delete(&stgmod.ObjectBlock{}).Error
return ctx.Table("ObjectBlock").Where("ObjectID IN (?)", objectIDs).Delete(&types.ObjectBlock{}).Error
} }


func (db *ObjectBlockDB) DeleteInPackage(ctx SQLContext, packageID cdssdk.PackageID) error {
return ctx.Table("ObjectBlock").Where("ObjectID IN (SELECT ObjectID FROM Object WHERE PackageID = ?)", packageID).Delete(&stgmod.ObjectBlock{}).Error
func (db *ObjectBlockDB) DeleteInPackage(ctx SQLContext, packageID types.PackageID) error {
return ctx.Table("ObjectBlock").Where("ObjectID IN (SELECT ObjectID FROM Object WHERE PackageID = ?)", packageID).Delete(&types.ObjectBlock{}).Error
} }


func (db *ObjectBlockDB) StorageBatchDelete(ctx SQLContext, stgID cdssdk.StorageID, fileHashes []cdssdk.FileHash) error {
func (db *ObjectBlockDB) StorageBatchDelete(ctx SQLContext, spaceID types.UserSpaceID, fileHashes []types.FileHash) error {
if len(fileHashes) == 0 { if len(fileHashes) == 0 {
return nil return nil
} }


return ctx.Table("ObjectBlock").Where("StorageID = ? AND FileHash IN (?)", stgID, fileHashes).Delete(&stgmod.ObjectBlock{}).Error
return ctx.Table("ObjectBlock").Where("UserSpaceID = ? AND FileHash IN (?)", spaceID, fileHashes).Delete(&types.ObjectBlock{}).Error
} }


func (db *ObjectBlockDB) CountBlockWithHash(ctx SQLContext, fileHash string) (int, error) { func (db *ObjectBlockDB) CountBlockWithHash(ctx SQLContext, fileHash string) (int, error) {
@@ -90,7 +86,7 @@ func (db *ObjectBlockDB) CountBlockWithHash(ctx SQLContext, fileHash string) (in
Select("COUNT(FileHash)"). Select("COUNT(FileHash)").
Joins("INNER JOIN Object ON ObjectBlock.ObjectID = Object.ObjectID"). Joins("INNER JOIN Object ON ObjectBlock.ObjectID = Object.ObjectID").
Joins("INNER JOIN Package ON Object.PackageID = Package.PackageID"). Joins("INNER JOIN Package ON Object.PackageID = Package.PackageID").
Where("FileHash = ? AND Package.State = ?", fileHash, cdssdk.PackageStateNormal).
Where("FileHash = ?", fileHash).
Scan(&cnt).Error Scan(&cnt).Error


if err != nil { if err != nil {
@@ -99,24 +95,3 @@ func (db *ObjectBlockDB) CountBlockWithHash(ctx SQLContext, fileHash string) (in


return int(cnt), nil return int(cnt), nil
} }

// 按逗号切割字符串,并将每一个部分解析为一个int64的ID。
// 注:需要外部保证分隔的每一个部分都是正确的10进制数字格式
func splitConcatedHubID(idStr string) []cdssdk.HubID {
idStrs := strings.Split(idStr, ",")
ids := make([]cdssdk.HubID, 0, len(idStrs))

for _, str := range idStrs {
// 假设传入的ID是正确的数字格式
id, _ := strconv.ParseInt(str, 10, 64)
ids = append(ids, cdssdk.HubID(id))
}

return ids
}

// 按逗号切割字符串
func splitConcatedFileHash(idStr string) []string {
idStrs := strings.Split(idStr, ",")
return idStrs
}

+ 31
- 75
client/internal/db/package.go View File

@@ -1,13 +1,11 @@
package db2
package db


import ( import (
"fmt" "fmt"
"time" "time"


"gitlink.org.cn/cloudream/storage2/client/types"
"gorm.io/gorm" "gorm.io/gorm"

cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
"gitlink.org.cn/cloudream/storage2/common/pkgs/db2/model"
) )


type PackageDB struct { type PackageDB struct {
@@ -18,24 +16,24 @@ func (db *DB) Package() *PackageDB {
return &PackageDB{DB: db} return &PackageDB{DB: db}
} }


func (db *PackageDB) GetByID(ctx SQLContext, packageID cdssdk.PackageID) (model.Package, error) {
var ret model.Package
func (db *PackageDB) GetByID(ctx SQLContext, packageID types.PackageID) (types.Package, error) {
var ret types.Package
err := ctx.Table("Package").Where("PackageID = ?", packageID).First(&ret).Error err := ctx.Table("Package").Where("PackageID = ?", packageID).First(&ret).Error
return ret, err return ret, err
} }


func (db *PackageDB) GetByName(ctx SQLContext, bucketID cdssdk.BucketID, name string) (model.Package, error) {
var ret model.Package
func (db *PackageDB) GetByName(ctx SQLContext, bucketID types.BucketID, name string) (types.Package, error) {
var ret types.Package
err := ctx.Table("Package").Where("BucketID = ? AND Name = ?", bucketID, name).First(&ret).Error err := ctx.Table("Package").Where("BucketID = ? AND Name = ?", bucketID, name).First(&ret).Error
return ret, err return ret, err
} }


func (db *PackageDB) BatchTestPackageID(ctx SQLContext, pkgIDs []cdssdk.PackageID) (map[cdssdk.PackageID]bool, error) {
func (db *PackageDB) BatchTestPackageID(ctx SQLContext, pkgIDs []types.PackageID) (map[types.PackageID]bool, error) {
if len(pkgIDs) == 0 { if len(pkgIDs) == 0 {
return make(map[cdssdk.PackageID]bool), nil
return make(map[types.PackageID]bool), nil
} }


var avaiIDs []cdssdk.PackageID
var avaiIDs []types.PackageID
err := ctx.Table("Package"). err := ctx.Table("Package").
Select("PackageID"). Select("PackageID").
Where("PackageID IN ?", pkgIDs). Where("PackageID IN ?", pkgIDs).
@@ -44,7 +42,7 @@ func (db *PackageDB) BatchTestPackageID(ctx SQLContext, pkgIDs []cdssdk.PackageI
return nil, err return nil, err
} }


avaiIDMap := make(map[cdssdk.PackageID]bool)
avaiIDMap := make(map[types.PackageID]bool)
for _, pkgID := range avaiIDs { for _, pkgID := range avaiIDs {
avaiIDMap[pkgID] = true avaiIDMap[pkgID] = true
} }
@@ -52,24 +50,14 @@ func (db *PackageDB) BatchTestPackageID(ctx SQLContext, pkgIDs []cdssdk.PackageI
return avaiIDMap, nil return avaiIDMap, nil
} }


func (*PackageDB) BatchGetAllPackageIDs(ctx SQLContext, start int, count int) ([]cdssdk.PackageID, error) {
var ret []cdssdk.PackageID
func (*PackageDB) BatchGetAllPackageIDs(ctx SQLContext, start int, count int) ([]types.PackageID, error) {
var ret []types.PackageID
err := ctx.Table("Package").Select("PackageID").Limit(count).Offset(start).Find(&ret).Error err := ctx.Table("Package").Select("PackageID").Limit(count).Offset(start).Find(&ret).Error
return ret, err return ret, err
} }


func (db *PackageDB) GetUserBucketPackages(ctx SQLContext, userID cdssdk.UserID, bucketID cdssdk.BucketID) ([]model.Package, error) {
var ret []model.Package
err := ctx.Table("UserBucket").
Select("Package.*").
Joins("JOIN Package ON UserBucket.BucketID = Package.BucketID").
Where("UserBucket.UserID = ? AND UserBucket.BucketID = ?", userID, bucketID).
Find(&ret).Error
return ret, err
}

func (db *PackageDB) GetBucketPackages(ctx SQLContext, bucketID cdssdk.BucketID) ([]model.Package, error) {
var ret []model.Package
func (db *PackageDB) GetBucketPackages(ctx SQLContext, bucketID types.BucketID) ([]types.Package, error) {
var ret []types.Package
err := ctx.Table("Package"). err := ctx.Table("Package").
Select("Package.*"). Select("Package.*").
Where("BucketID = ?", bucketID). Where("BucketID = ?", bucketID).
@@ -77,8 +65,8 @@ func (db *PackageDB) GetBucketPackages(ctx SQLContext, bucketID cdssdk.BucketID)
return ret, err return ret, err
} }


func (db *PackageDB) GetBucketPackagesByName(ctx SQLContext, bucketName string) ([]model.Package, error) {
var ret []model.Package
func (db *PackageDB) GetBucketPackagesByName(ctx SQLContext, bucketName string) ([]types.Package, error) {
var ret []types.Package
err := ctx.Table("Package"). err := ctx.Table("Package").
Select("Package.*"). Select("Package.*").
Joins("JOIN Bucket ON Package.BucketID = Bucket.BucketID"). Joins("JOIN Bucket ON Package.BucketID = Bucket.BucketID").
@@ -87,50 +75,18 @@ func (db *PackageDB) GetBucketPackagesByName(ctx SQLContext, bucketName string)
return ret, err return ret, err
} }


// IsAvailable 判断一个用户是否拥有指定对象
func (db *PackageDB) IsAvailable(ctx SQLContext, userID cdssdk.UserID, packageID cdssdk.PackageID) (bool, error) {
var pkgID cdssdk.PackageID
err := ctx.Table("Package").
Select("Package.PackageID").
Joins("JOIN UserBucket ON Package.BucketID = UserBucket.BucketID").
Where("Package.PackageID = ? AND UserBucket.UserID = ?", packageID, userID).
Scan(&pkgID).Error

if err == gorm.ErrRecordNotFound {
return false, nil
}

if err != nil {
return false, fmt.Errorf("find package failed, err: %w", err)
}

return true, nil
}

// GetUserPackage 获得Package,如果用户没有权限访问,则不会获得结果
func (db *PackageDB) GetUserPackage(ctx SQLContext, userID cdssdk.UserID, packageID cdssdk.PackageID) (model.Package, error) {
var ret model.Package
err := ctx.Table("Package").
Select("Package.*").
Joins("JOIN UserBucket ON Package.BucketID = UserBucket.BucketID").
Where("Package.PackageID = ? AND UserBucket.UserID = ?", packageID, userID).
First(&ret).Error
return ret, err
}

// 在指定名称的Bucket中查找指定名称的Package // 在指定名称的Bucket中查找指定名称的Package
func (*PackageDB) GetUserPackageByName(ctx SQLContext, userID cdssdk.UserID, bucketName string, packageName string) (model.Package, error) {
var ret model.Package
func (*PackageDB) GetUserPackageByName(ctx SQLContext, bucketName string, packageName string) (types.Package, error) {
var ret types.Package
err := ctx.Table("Package"). err := ctx.Table("Package").
Select("Package.*"). Select("Package.*").
Joins("JOIN Bucket ON Package.BucketID = Bucket.BucketID"). Joins("JOIN Bucket ON Package.BucketID = Bucket.BucketID").
Joins("JOIN UserBucket ON Bucket.BucketID = UserBucket.BucketID").
Where("Package.Name = ? AND Bucket.Name = ? AND UserBucket.UserID = ?", packageName, bucketName, userID).
Where("Package.Name = ? AND Bucket.Name = ?", packageName, bucketName).
First(&ret).Error First(&ret).Error
return ret, err return ret, err
} }


func (db *PackageDB) Create(ctx SQLContext, bucketID cdssdk.BucketID, name string) (cdssdk.Package, error) {
func (db *PackageDB) Create(ctx SQLContext, bucketID types.BucketID, name string) (types.Package, error) {
var packageID int64 var packageID int64
err := ctx.Table("Package"). err := ctx.Table("Package").
Select("PackageID"). Select("PackageID").
@@ -138,27 +94,27 @@ func (db *PackageDB) Create(ctx SQLContext, bucketID cdssdk.BucketID, name strin
Scan(&packageID).Error Scan(&packageID).Error


if err != nil { if err != nil {
return cdssdk.Package{}, err
return types.Package{}, err
} }
if packageID != 0 { if packageID != 0 {
return cdssdk.Package{}, gorm.ErrDuplicatedKey
return types.Package{}, gorm.ErrDuplicatedKey
} }


newPackage := cdssdk.Package{Name: name, BucketID: bucketID, CreateTime: time.Now(), State: cdssdk.PackageStateNormal}
newPackage := types.Package{Name: name, BucketID: bucketID, CreateTime: time.Now()}
if err := ctx.Create(&newPackage).Error; err != nil { if err := ctx.Create(&newPackage).Error; err != nil {
return cdssdk.Package{}, fmt.Errorf("insert package failed, err: %w", err)
return types.Package{}, fmt.Errorf("insert package failed, err: %w", err)
} }


return newPackage, nil return newPackage, nil
} }


func (*PackageDB) Delete(ctx SQLContext, packageID cdssdk.PackageID) error {
err := ctx.Delete(&model.Package{}, "PackageID = ?", packageID).Error
func (*PackageDB) Delete(ctx SQLContext, packageID types.PackageID) error {
err := ctx.Delete(&types.Package{}, "PackageID = ?", packageID).Error
return err return err
} }


// 删除与Package相关的所有数据 // 删除与Package相关的所有数据
func (db *PackageDB) DeleteComplete(ctx SQLContext, packageID cdssdk.PackageID) error {
func (db *PackageDB) DeleteComplete(ctx SQLContext, packageID types.PackageID) error {
if err := db.Package().Delete(ctx, packageID); err != nil { if err := db.Package().Delete(ctx, packageID); err != nil {
return fmt.Errorf("delete package state: %w", err) return fmt.Errorf("delete package state: %w", err)
} }
@@ -186,13 +142,13 @@ func (db *PackageDB) DeleteComplete(ctx SQLContext, packageID cdssdk.PackageID)
return nil return nil
} }


func (*PackageDB) ChangeState(ctx SQLContext, packageID cdssdk.PackageID, state string) error {
func (*PackageDB) ChangeState(ctx SQLContext, packageID types.PackageID, state string) error {
err := ctx.Exec("UPDATE Package SET State = ? WHERE PackageID = ?", state, packageID).Error err := ctx.Exec("UPDATE Package SET State = ? WHERE PackageID = ?", state, packageID).Error
return err return err
} }


func (*PackageDB) HasPackageIn(ctx SQLContext, bucketID cdssdk.BucketID) (bool, error) {
var pkg cdssdk.Package
func (*PackageDB) HasPackageIn(ctx SQLContext, bucketID types.BucketID) (bool, error) {
var pkg types.Package
err := ctx.Table("Package").Where("BucketID = ?", bucketID).First(&pkg).Error err := ctx.Table("Package").Where("BucketID = ?", bucketID).First(&pkg).Error
if err == gorm.ErrRecordNotFound { if err == gorm.ErrRecordNotFound {
return false, nil return false, nil
@@ -203,7 +159,7 @@ func (*PackageDB) HasPackageIn(ctx SQLContext, bucketID cdssdk.BucketID) (bool,
return true, nil return true, nil
} }


func (*PackageDB) Move(ctx SQLContext, packageID cdssdk.PackageID, newBktID cdssdk.BucketID, newName string) error {
func (*PackageDB) Move(ctx SQLContext, packageID types.PackageID, newBktID types.BucketID, newName string) error {
err := ctx.Table("Package").Where("PackageID = ?", packageID).Update("BucketID", newBktID).Update("Name", newName).Error err := ctx.Table("Package").Where("PackageID = ?", packageID).Update("BucketID", newBktID).Update("Name", newName).Error
return err return err
} }

+ 19
- 21
client/internal/db/package_access_stat.go View File

@@ -1,9 +1,7 @@
package db2
package db


import ( import (
cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
stgmod "gitlink.org.cn/cloudream/storage2/common/models"
coormq "gitlink.org.cn/cloudream/storage2/common/pkgs/mq/coordinator"
"gitlink.org.cn/cloudream/storage2/client/types"
"gorm.io/gorm" "gorm.io/gorm"
"gorm.io/gorm/clause" "gorm.io/gorm/clause"
) )
@@ -16,51 +14,51 @@ func (db *DB) PackageAccessStat() *PackageAccessStatDB {
return &PackageAccessStatDB{db} return &PackageAccessStatDB{db}
} }


func (*PackageAccessStatDB) Get(ctx SQLContext, pkgID cdssdk.PackageID, stgID cdssdk.StorageID) (stgmod.PackageAccessStat, error) {
var ret stgmod.PackageAccessStat
err := ctx.Table("PackageAccessStat").Where("PackageID = ? AND StorageID = ?", pkgID, stgID).First(&ret).Error
func (*PackageAccessStatDB) Get(ctx SQLContext, pkgID types.PackageID, spaceID types.UserSpaceID) (types.PackageAccessStat, error) {
var ret types.PackageAccessStat
err := ctx.Table("PackageAccessStat").Where("PackageID = ? AND UserSpaceID = ?", pkgID, spaceID).First(&ret).Error
return ret, err return ret, err
} }


func (*PackageAccessStatDB) GetByPackageID(ctx SQLContext, pkgID cdssdk.PackageID) ([]stgmod.PackageAccessStat, error) {
var ret []stgmod.PackageAccessStat
func (*PackageAccessStatDB) GetByPackageID(ctx SQLContext, pkgID types.PackageID) ([]types.PackageAccessStat, error) {
var ret []types.PackageAccessStat
err := ctx.Table("PackageAccessStat").Where("PackageID = ?", pkgID).Find(&ret).Error err := ctx.Table("PackageAccessStat").Where("PackageID = ?", pkgID).Find(&ret).Error
return ret, err return ret, err
} }


func (*PackageAccessStatDB) BatchGetByPackageID(ctx SQLContext, pkgIDs []cdssdk.PackageID) ([]stgmod.PackageAccessStat, error) {
func (*PackageAccessStatDB) BatchGetByPackageID(ctx SQLContext, pkgIDs []types.PackageID) ([]types.PackageAccessStat, error) {
if len(pkgIDs) == 0 { if len(pkgIDs) == 0 {
return nil, nil return nil, nil
} }


var ret []stgmod.PackageAccessStat
var ret []types.PackageAccessStat
err := ctx.Table("PackageAccessStat").Where("PackageID IN (?)", pkgIDs).Find(&ret).Error err := ctx.Table("PackageAccessStat").Where("PackageID IN (?)", pkgIDs).Find(&ret).Error
return ret, err return ret, err
} }


func (*PackageAccessStatDB) BatchAddCounter(ctx SQLContext, entries []coormq.AddAccessStatEntry) error {
func (*PackageAccessStatDB) BatchAddCounter(ctx SQLContext, entries []AddAccessStatEntry) error {
if len(entries) == 0 { if len(entries) == 0 {
return nil return nil
} }


accs := make([]stgmod.PackageAccessStat, len(entries))
accs := make([]types.PackageAccessStat, len(entries))
for i, e := range entries { for i, e := range entries {
accs[i] = stgmod.PackageAccessStat{
PackageID: e.PackageID,
StorageID: e.StorageID,
Counter: e.Counter,
accs[i] = types.PackageAccessStat{
PackageID: e.PackageID,
UserSpaceID: e.UserSpaceID,
Counter: e.Counter,
} }
} }


return ctx.Clauses(clause.OnConflict{ return ctx.Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "PackageID"}, {Name: "StorageID"}},
Columns: []clause.Column{{Name: "PackageID"}, {Name: "UserSpaceID"}},
DoUpdates: clause.Assignments(map[string]any{ DoUpdates: clause.Assignments(map[string]any{
"Counter": gorm.Expr("Counter + values(Counter)"), "Counter": gorm.Expr("Counter + values(Counter)"),
}), }),
}).Table("PackageAccessStat").Create(&accs).Error }).Table("PackageAccessStat").Create(&accs).Error
} }


func (*PackageAccessStatDB) BatchUpdateAmount(ctx SQLContext, pkgIDs []cdssdk.PackageID, historyWeight float64) error {
func (*PackageAccessStatDB) BatchUpdateAmount(ctx SQLContext, pkgIDs []types.PackageID, historyWeight float64) error {
if len(pkgIDs) == 0 { if len(pkgIDs) == 0 {
return nil return nil
} }
@@ -74,6 +72,6 @@ func (*PackageAccessStatDB) UpdateAllAmount(ctx SQLContext, historyWeight float6
return ctx.Exec(sql, historyWeight, historyWeight).Error return ctx.Exec(sql, historyWeight, historyWeight).Error
} }


func (*PackageAccessStatDB) DeleteByPackageID(ctx SQLContext, pkgID cdssdk.PackageID) error {
return ctx.Table("PackageAccessStat").Where("PackageID = ?", pkgID).Delete(&stgmod.PackageAccessStat{}).Error
func (*PackageAccessStatDB) DeleteByPackageID(ctx SQLContext, pkgID types.PackageID) error {
return ctx.Table("PackageAccessStat").Where("PackageID = ?", pkgID).Delete(&types.PackageAccessStat{}).Error
} }

+ 34
- 34
client/internal/db/pinned_object.go View File

@@ -1,9 +1,9 @@
package db2
package db


import ( import (
"time" "time"


cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
"gitlink.org.cn/cloudream/storage2/client/types"
"gorm.io/gorm/clause" "gorm.io/gorm/clause"
) )


@@ -15,66 +15,66 @@ func (db *DB) PinnedObject() *PinnedObjectDB {
return &PinnedObjectDB{DB: db} return &PinnedObjectDB{DB: db}
} }


func (*PinnedObjectDB) GetByStorageID(ctx SQLContext, stgID cdssdk.StorageID) ([]cdssdk.PinnedObject, error) {
var ret []cdssdk.PinnedObject
err := ctx.Table("PinnedObject").Find(&ret, "StorageID = ?", stgID).Error
func (*PinnedObjectDB) GetByUserSpaceID(ctx SQLContext, spaceID types.UserSpaceID) ([]types.PinnedObject, error) {
var ret []types.PinnedObject
err := ctx.Table("PinnedObject").Find(&ret, "UserSpaceID = ?", spaceID).Error
return ret, err return ret, err
} }


func (*PinnedObjectDB) GetObjectsByStorageID(ctx SQLContext, stgID cdssdk.StorageID) ([]cdssdk.Object, error) {
var ret []cdssdk.Object
err := ctx.Table("Object").Joins("inner join PinnedObject on Object.ObjectID = PinnedObject.ObjectID").Where("StorageID = ?", stgID).Find(&ret).Error
func (*PinnedObjectDB) GetObjectsByUserSpaceID(ctx SQLContext, spaceID types.UserSpaceID) ([]types.Object, error) {
var ret []types.Object
err := ctx.Table("Object").Joins("inner join PinnedObject on Object.ObjectID = PinnedObject.ObjectID").Where("UserSpaceID = ?", spaceID).Find(&ret).Error
return ret, err return ret, err
} }


func (*PinnedObjectDB) Create(ctx SQLContext, stgID cdssdk.StorageID, objectID cdssdk.ObjectID, createTime time.Time) error {
return ctx.Table("PinnedObject").Create(&cdssdk.PinnedObject{StorageID: stgID, ObjectID: objectID, CreateTime: createTime}).Error
func (*PinnedObjectDB) Create(ctx SQLContext, spaceID types.UserSpaceID, objectID types.ObjectID, createTime time.Time) error {
return ctx.Table("PinnedObject").Create(&types.PinnedObject{UserSpaceID: spaceID, ObjectID: objectID, CreateTime: createTime}).Error
} }


func (*PinnedObjectDB) BatchGetByObjectID(ctx SQLContext, objectIDs []cdssdk.ObjectID) ([]cdssdk.PinnedObject, error) {
func (*PinnedObjectDB) BatchGetByObjectID(ctx SQLContext, objectIDs []types.ObjectID) ([]types.PinnedObject, error) {
if len(objectIDs) == 0 { if len(objectIDs) == 0 {
return nil, nil return nil, nil
} }


var pinneds []cdssdk.PinnedObject
var pinneds []types.PinnedObject
err := ctx.Table("PinnedObject").Where("ObjectID in (?)", objectIDs).Order("ObjectID asc").Find(&pinneds).Error err := ctx.Table("PinnedObject").Where("ObjectID in (?)", objectIDs).Order("ObjectID asc").Find(&pinneds).Error
return pinneds, err return pinneds, err
} }


func (*PinnedObjectDB) TryCreate(ctx SQLContext, stgID cdssdk.StorageID, objectID cdssdk.ObjectID, createTime time.Time) error {
func (*PinnedObjectDB) TryCreate(ctx SQLContext, spaceID types.UserSpaceID, objectID types.ObjectID, createTime time.Time) error {
return ctx.Clauses(clause.OnConflict{ return ctx.Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "ObjectID"}, {Name: "StorageID"}},
Columns: []clause.Column{{Name: "ObjectID"}, {Name: "UserSpaceID"}},
DoUpdates: clause.AssignmentColumns([]string{"CreateTime"}), DoUpdates: clause.AssignmentColumns([]string{"CreateTime"}),
}).Create(&cdssdk.PinnedObject{StorageID: stgID, ObjectID: objectID, CreateTime: createTime}).Error
}).Create(&types.PinnedObject{UserSpaceID: spaceID, ObjectID: objectID, CreateTime: createTime}).Error
} }


func (*PinnedObjectDB) BatchTryCreate(ctx SQLContext, pinneds []cdssdk.PinnedObject) error {
func (*PinnedObjectDB) BatchTryCreate(ctx SQLContext, pinneds []types.PinnedObject) error {
if len(pinneds) == 0 { if len(pinneds) == 0 {
return nil return nil
} }


return ctx.Clauses(clause.OnConflict{ return ctx.Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "ObjectID"}, {Name: "StorageID"}},
Columns: []clause.Column{{Name: "ObjectID"}, {Name: "UserSpaceID"}},
DoUpdates: clause.AssignmentColumns([]string{"CreateTime"}), DoUpdates: clause.AssignmentColumns([]string{"CreateTime"}),
}).Create(&pinneds).Error }).Create(&pinneds).Error
} }


func (*PinnedObjectDB) CreateFromPackage(ctx SQLContext, packageID cdssdk.PackageID, stgID cdssdk.StorageID) error {
func (*PinnedObjectDB) CreateFromPackage(ctx SQLContext, packageID types.PackageID, spaceID types.UserSpaceID) error {
err := ctx.Exec( err := ctx.Exec(
"insert ignore into PinnedObject(StorageID, ObjectID, CreateTime) select ? as StorageID, ObjectID, ? as CreateTime from Object where PackageID = ?",
stgID,
"insert ignore into PinnedObject(UserSpaceID, ObjectID, CreateTime) select ? as UserSpaceID, ObjectID, ? as CreateTime from Object where PackageID = ?",
spaceID,
time.Now(), time.Now(),
packageID, packageID,
).Error ).Error
return err return err
} }


func (db *PinnedObjectDB) ObjectBatchCreate(ctx SQLContext, objectID cdssdk.ObjectID, stgIDs []cdssdk.StorageID) error {
if len(stgIDs) == 0 {
func (db *PinnedObjectDB) ObjectBatchCreate(ctx SQLContext, objectID types.ObjectID, spaceIDs []types.UserSpaceID) error {
if len(spaceIDs) == 0 {
return nil return nil
} }


for _, id := range stgIDs {
for _, id := range spaceIDs {
err := db.TryCreate(ctx, id, objectID, time.Now()) err := db.TryCreate(ctx, id, objectID, time.Now())
if err != nil { if err != nil {
return err return err
@@ -83,40 +83,40 @@ func (db *PinnedObjectDB) ObjectBatchCreate(ctx SQLContext, objectID cdssdk.Obje
return nil return nil
} }


func (*PinnedObjectDB) Delete(ctx SQLContext, stgID cdssdk.StorageID, objectID cdssdk.ObjectID) error {
err := ctx.Exec("delete from PinnedObject where StorageID = ? and ObjectID = ?", stgID, objectID).Error
func (*PinnedObjectDB) Delete(ctx SQLContext, spaceID types.UserSpaceID, objectID types.ObjectID) error {
err := ctx.Exec("delete from PinnedObject where UserSpaceID = ? and ObjectID = ?", spaceID, objectID).Error
return err return err
} }


func (*PinnedObjectDB) DeleteByObjectID(ctx SQLContext, objectID cdssdk.ObjectID) error {
func (*PinnedObjectDB) DeleteByObjectID(ctx SQLContext, objectID types.ObjectID) error {
err := ctx.Exec("delete from PinnedObject where ObjectID = ?", objectID).Error err := ctx.Exec("delete from PinnedObject where ObjectID = ?", objectID).Error
return err return err
} }


func (*PinnedObjectDB) BatchDeleteByObjectID(ctx SQLContext, objectIDs []cdssdk.ObjectID) error {
func (*PinnedObjectDB) BatchDeleteByObjectID(ctx SQLContext, objectIDs []types.ObjectID) error {
if len(objectIDs) == 0 { if len(objectIDs) == 0 {
return nil return nil
} }


err := ctx.Table("PinnedObject").Where("ObjectID in (?)", objectIDs).Delete(&cdssdk.PinnedObject{}).Error
err := ctx.Table("PinnedObject").Where("ObjectID in (?)", objectIDs).Delete(&types.PinnedObject{}).Error
return err return err
} }


func (*PinnedObjectDB) DeleteInPackage(ctx SQLContext, packageID cdssdk.PackageID) error {
err := ctx.Table("PinnedObject").Where("ObjectID in (select ObjectID from Object where PackageID = ?)", packageID).Delete(&cdssdk.PinnedObject{}).Error
func (*PinnedObjectDB) DeleteInPackage(ctx SQLContext, packageID types.PackageID) error {
err := ctx.Table("PinnedObject").Where("ObjectID in (select ObjectID from Object where PackageID = ?)", packageID).Delete(&types.PinnedObject{}).Error
return err return err
} }


func (*PinnedObjectDB) DeleteInPackageAtStorage(ctx SQLContext, packageID cdssdk.PackageID, stgID cdssdk.StorageID) error {
err := ctx.Exec("delete PinnedObject from PinnedObject inner join Object on PinnedObject.ObjectID = Object.ObjectID where PackageID = ? and StorageID = ?", packageID, stgID).Error
func (*PinnedObjectDB) DeleteInPackageAtStorage(ctx SQLContext, packageID types.PackageID, spaceID types.UserSpaceID) error {
err := ctx.Exec("delete PinnedObject from PinnedObject inner join Object on PinnedObject.ObjectID = Object.ObjectID where PackageID = ? and UserSpaceID = ?", packageID, spaceID).Error
return err return err
} }


func (*PinnedObjectDB) StorageBatchDelete(ctx SQLContext, stgID cdssdk.StorageID, objectIDs []cdssdk.ObjectID) error {
func (*PinnedObjectDB) StorageBatchDelete(ctx SQLContext, spaceID types.UserSpaceID, objectIDs []types.ObjectID) error {
if len(objectIDs) == 0 { if len(objectIDs) == 0 {
return nil return nil
} }


err := ctx.Table("PinnedObject").Where("StorageID = ? and ObjectID in (?)", stgID, objectIDs).Delete(&cdssdk.PinnedObject{}).Error
err := ctx.Table("PinnedObject").Where("UserSpaceID = ? and ObjectID in (?)", spaceID, objectIDs).Delete(&types.PinnedObject{}).Error
return err return err
} }

+ 0
- 120
client/internal/db/storage.go View File

@@ -1,120 +0,0 @@
package db2

import (
"fmt"

"gitlink.org.cn/cloudream/common/pkgs/logger"
cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
stgmod "gitlink.org.cn/cloudream/storage2/common/models"
"gitlink.org.cn/cloudream/storage2/common/pkgs/db2/model"
"gorm.io/gorm"
)

type StorageDB struct {
*DB
}

func (db *DB) Storage() *StorageDB {
return &StorageDB{DB: db}
}

func (db *StorageDB) GetByID(ctx SQLContext, stgID cdssdk.StorageID) (model.Storage, error) {
var stg model.Storage
err := ctx.Table("Storage").First(&stg, stgID).Error
return stg, err
}

func (StorageDB) GetAllIDs(ctx SQLContext) ([]cdssdk.StorageID, error) {
var stgs []cdssdk.StorageID
err := ctx.Table("Storage").Select("StorageID").Find(&stgs).Error
return stgs, err
}

func (db *StorageDB) BatchGetByID(ctx SQLContext, stgIDs []cdssdk.StorageID) ([]model.Storage, error) {
var stgs []model.Storage
err := ctx.Table("Storage").Find(&stgs, "StorageID IN (?)", stgIDs).Error
return stgs, err
}

func (db *StorageDB) GetUserStorages(ctx SQLContext, userID cdssdk.UserID) ([]model.Storage, error) {
var stgs []model.Storage
err := ctx.Table("Storage").Select("Storage.*").
Joins("inner join UserStorage on Storage.StorageID = UserStorage.StorageID").
Where("UserID = ?", userID).Find(&stgs).Error
return stgs, err
}

func (db *StorageDB) BatchGetAllStorageIDs(ctx SQLContext, start int, count int) ([]cdssdk.StorageID, error) {
var ret []cdssdk.StorageID
err := ctx.Table("Storage").Select("StorageID").Find(&ret).Limit(count).Offset(start).Error
return ret, err
}

func (db *StorageDB) IsAvailable(ctx SQLContext, userID cdssdk.UserID, storageID cdssdk.StorageID) (bool, error) {
rows, err := ctx.Table("Storage").Select("Storage.StorageID").
Joins("inner join UserStorage on Storage.StorageID = UserStorage.StorageID").
Where("UserID = ? and Storage.StorageID = ?", userID, storageID).Rows()
if err != nil {
return false, fmt.Errorf("execute sql: %w", err)
}
defer rows.Close()

return rows.Next(), nil
}

func (db *StorageDB) GetUserStorage(ctx SQLContext, userID cdssdk.UserID, storageID cdssdk.StorageID) (model.Storage, error) {
var stg model.Storage
err := ctx.Table("Storage").Select("Storage.*").
Joins("inner join UserStorage on Storage.StorageID = UserStorage.StorageID").
Where("UserID = ? and Storage.StorageID = ?", userID, storageID).First(&stg).Error

return stg, err
}

func (db *StorageDB) GetUserStorageByName(ctx SQLContext, userID cdssdk.UserID, name string) (model.Storage, error) {
var stg model.Storage
err := ctx.Table("Storage").Select("Storage.*").
Joins("inner join UserStorage on Storage.StorageID = UserStorage.StorageID").
Where("UserID = ? and Name = ?", userID, name).First(&stg).Error

return stg, err
}

func (db *StorageDB) GetHubStorages(ctx SQLContext, hubID cdssdk.HubID) ([]model.Storage, error) {
var stgs []model.Storage
err := ctx.Table("Storage").Select("Storage.*").Find(&stgs, "MasterHub = ?", hubID).Error
return stgs, err
}

func (db *StorageDB) FillDetails(ctx SQLContext, details []stgmod.StorageDetail) error {
stgsMp := make(map[cdssdk.StorageID]*stgmod.StorageDetail)
var masterHubIDs []cdssdk.HubID
for i := range details {
stgsMp[details[i].Storage.StorageID] = &details[i]
masterHubIDs = append(masterHubIDs, details[i].Storage.MasterHub)
}

// 获取监护Hub信息
masterHubs, err := db.Hub().BatchGetByID(ctx, masterHubIDs)
if err != nil && err != gorm.ErrRecordNotFound {
return fmt.Errorf("getting master hub: %w", err)
}
masterHubMap := make(map[cdssdk.HubID]cdssdk.Hub)
for _, hub := range masterHubs {
masterHubMap[hub.HubID] = hub
}
for _, stg := range stgsMp {
if stg.Storage.MasterHub != 0 {
hub, ok := masterHubMap[stg.Storage.MasterHub]
if !ok {
logger.Warnf("master hub %v of storage %v not found, this storage will not be add to result", stg.Storage.MasterHub, stg.Storage)
delete(stgsMp, stg.Storage.StorageID)
continue
}

stg.MasterHub = &hub
}
}

return nil
}

+ 1
- 1
client/internal/db/union_serializer.go View File

@@ -1,4 +1,4 @@
package db2
package db


import ( import (
"context" "context"


+ 0
- 44
client/internal/db/user.go View File

@@ -1,44 +0,0 @@
package db2

import (
cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
"gorm.io/gorm"
)

type UserDB struct {
*DB
}

func (db *DB) User() *UserDB {
return &UserDB{DB: db}
}

func (db *UserDB) GetByID(ctx SQLContext, userID cdssdk.UserID) (cdssdk.User, error) {
var ret cdssdk.User
err := ctx.Table("User").Where("UserID = ?", userID).First(&ret).Error
return ret, err
}

func (db *UserDB) GetByName(ctx SQLContext, name string) (cdssdk.User, error) {
var ret cdssdk.User
err := ctx.Table("User").Where("Name = ?", name).First(&ret).Error
return ret, err
}

func (db *UserDB) Create(ctx SQLContext, name string) (cdssdk.User, error) {
_, err := db.GetByName(ctx, name)
if err == nil {
return cdssdk.User{}, gorm.ErrDuplicatedKey
}
if err != gorm.ErrRecordNotFound {
return cdssdk.User{}, err
}

user := cdssdk.User{Name: name}
err = ctx.Table("User").Create(&user).Error
return user, err
}

func (*UserDB) Delete(ctx SQLContext, userID cdssdk.UserID) error {
return ctx.Table("User").Delete(&cdssdk.User{UserID: userID}).Error
}

+ 0
- 36
client/internal/db/user_bucket.go View File

@@ -1,36 +0,0 @@
package db2

import (
cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
"gitlink.org.cn/cloudream/storage2/common/pkgs/db2/model"
)

type UserBucketDB struct {
*DB
}

func (db *DB) UserBucket() *UserBucketDB {
return &UserBucketDB{DB: db}
}

func (*UserBucketDB) GetByUserID(ctx SQLContext, userID cdssdk.UserID) ([]model.UserBucket, error) {
var userBuckets []model.UserBucket
err := ctx.Table("UserBucket").Where("UserID = ?", userID).Find(&userBuckets).Error
return userBuckets, err
}

func (*UserBucketDB) Create(ctx SQLContext, userID cdssdk.UserID, bucketID cdssdk.BucketID) error {
userBucket := model.UserBucket{
UserID: userID,
BucketID: bucketID,
}
return ctx.Table("UserBucket").Create(&userBucket).Error
}

func (*UserBucketDB) DeleteByBucketID(ctx SQLContext, bucketID cdssdk.BucketID) error {
return ctx.Table("UserBucket").Where("BucketID = ?", bucketID).Delete(&model.UserBucket{}).Error
}

func (*UserBucketDB) DeleteByUserID(ctx SQLContext, userID cdssdk.UserID) error {
return ctx.Table("UserBucket").Where("UserID = ?", userID).Delete(&model.UserBucket{}).Error
}

+ 0
- 34
client/internal/db/user_hub.go View File

@@ -1,34 +0,0 @@
package db2

import (
cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
"gitlink.org.cn/cloudream/storage2/common/pkgs/db2/model"
)

type UserHubDB struct {
*DB
}

func (db *DB) UserHub() *UserHubDB {
return &UserHubDB{db}
}

func (*UserHubDB) GetByUserID(ctx SQLContext, userID cdssdk.UserID) ([]model.UserHub, error) {
var userHubs []model.UserHub
if err := ctx.Table("UserHub").Where("UserID = ?", userID).Find(&userHubs).Error; err != nil {
return nil, err
}

return userHubs, nil
}

func (*UserHubDB) Create(ctx SQLContext, userID cdssdk.UserID, hubID cdssdk.HubID) error {
return ctx.Table("UserHub").Create(&model.UserHub{
UserID: userID,
HubID: hubID,
}).Error
}

func (*UserHubDB) DeleteByUserID(ctx SQLContext, userID cdssdk.UserID) error {
return ctx.Table("UserHub").Delete(&model.UserHub{}, "UserID = ?", userID).Error
}

+ 0
- 34
client/internal/db/user_storage.go View File

@@ -1,34 +0,0 @@
package db2

import (
cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
"gitlink.org.cn/cloudream/storage2/common/pkgs/db2/model"
)

type UserStorageDB struct {
*DB
}

func (db *DB) UserStorage() *UserStorageDB {
return &UserStorageDB{db}
}

func (*UserStorageDB) GetByUserID(ctx SQLContext, userID cdssdk.UserID) ([]model.UserStorage, error) {
var userStgs []model.UserStorage
if err := ctx.Table("UserStorage").Where("UserID = ?", userID).Find(&userStgs).Error; err != nil {
return nil, err
}

return userStgs, nil
}

func (*UserStorageDB) Create(ctx SQLContext, userID cdssdk.UserID, stgID cdssdk.StorageID) error {
return ctx.Table("UserStorage").Create(&model.UserStorage{
UserID: userID,
StorageID: stgID,
}).Error
}

func (*UserStorageDB) DeleteByUserID(ctx SQLContext, userID cdssdk.UserID) error {
return ctx.Table("UserStorage").Delete(&model.UserStorage{}, "UserID = ?", userID).Error
}

+ 1
- 1
client/internal/db/utils.go View File

@@ -1,4 +1,4 @@
package db2
package db


import ( import (
"strings" "strings"


Loading…
Cancel
Save