diff --git a/client/internal/db/bucket.go b/client/internal/db/bucket.go index a46d6eb..e159887 100644 --- a/client/internal/db/bucket.go +++ b/client/internal/db/bucket.go @@ -1,14 +1,11 @@ -package db2 +package db import ( - "errors" "fmt" "time" + "gitlink.org.cn/cloudream/storage2/client/types" "gorm.io/gorm" - - cdssdk "gitlink.org.cn/cloudream/common/sdks/storage" - "gitlink.org.cn/cloudream/storage2/common/pkgs/db2/model" ) type BucketDB struct { @@ -19,14 +16,14 @@ func (db *DB) Bucket() *BucketDB { 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 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 return ret, err } @@ -46,94 +43,50 @@ func (db *BucketDB) GetIDByName(ctx SQLContext, bucketName string) (int64, error 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 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 } -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 - err := ctx.Table("UserBucket"). + err := ctx.Table("Bucket"). 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 if err != nil { - return cdssdk.Bucket{}, err + return types.Bucket{}, err } 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 { - 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 } -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 } -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) if err != nil { return err diff --git a/client/internal/db/cache.go b/client/internal/db/cache.go deleted file mode 100644 index 556f9c5..0000000 --- a/client/internal/db/cache.go +++ /dev/null @@ -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 -} diff --git a/client/internal/db/config.go b/client/internal/db/config.go index 9495b71..0879503 100644 --- a/client/internal/db/config.go +++ b/client/internal/db/config.go @@ -1,4 +1,4 @@ -package config +package db import "fmt" diff --git a/client/internal/db/db2.go b/client/internal/db/db.go similarity index 98% rename from client/internal/db/db2.go rename to client/internal/db/db.go index 8e807bc..3d0fded 100644 --- a/client/internal/db/db2.go +++ b/client/internal/db/db.go @@ -1,4 +1,4 @@ -package db2 +package db import ( _ "github.com/go-sql-driver/mysql" diff --git a/client/internal/db/hub.go b/client/internal/db/hub.go deleted file mode 100644 index dc66181..0000000 --- a/client/internal/db/hub.go +++ /dev/null @@ -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 -} diff --git a/client/internal/db/hub_connectivity.go b/client/internal/db/hub_connectivity.go deleted file mode 100644 index 5fe27e7..0000000 --- a/client/internal/db/hub_connectivity.go +++ /dev/null @@ -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 -} diff --git a/client/internal/db/location.go b/client/internal/db/location.go deleted file mode 100644 index 49bfc96..0000000 --- a/client/internal/db/location.go +++ /dev/null @@ -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 -} diff --git a/client/internal/db/object.go b/client/internal/db/object.go index 5325ac4..3c20617 100644 --- a/client/internal/db/object.go +++ b/client/internal/db/object.go @@ -1,4 +1,4 @@ -package db2 +package db import ( "fmt" @@ -8,10 +8,7 @@ import ( "gorm.io/gorm" "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 { @@ -22,20 +19,20 @@ func (db *DB) Object() *ObjectDB { 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 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 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"). Joins("join Package on Package.PackageID = Object.PackageID and Package.Name = ?", pkgName). 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 } -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 return ret, err } // 查询结果将按照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 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 { - cdssdk.Object + types.Object IsObject bool `gorm:"IsObject"` 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"). Select(fmt.Sprintf("%s as Prefix, Max(ObjectID) as ObjectID, %s = Path as IsObject", prefixStatm, prefixStatm)). Where("PackageID = ?", packageID). @@ -86,23 +83,23 @@ func (db *ObjectDB) GetByPrefixGrouped(ctx SQLContext, packageID cdssdk.PackageI if o.IsObject { objs = append(objs, o.Object) } else { - commonPrefixes = append(commonPrefixes, o.Prefix+cdssdk.ObjectPathSeparator) + commonPrefixes = append(commonPrefixes, o.Prefix+types.ObjectPathSeparator) } } 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 { - cdssdk.Object + types.Object IsObject bool `gorm:"IsObject"` 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"). Select(fmt.Sprintf("%s as Prefix, Max(ObjectID) as ObjectID, %s = Path as IsObject", prefixStatm, prefixStatm)). Where("PackageID = ?", packageID). @@ -125,7 +122,7 @@ func (db *ObjectDB) GetByPrefixGroupedPaged(ctx SQLContext, packageID cdssdk.Pac if o.IsObject { objs = append(objs, o.Object) } else { - commonPrefixes = append(commonPrefixes, o.Prefix+cdssdk.ObjectPathSeparator) + commonPrefixes = append(commonPrefixes, o.Prefix+types.ObjectPathSeparator) } nextStartPath = o.Prefix } @@ -133,8 +130,8 @@ func (db *ObjectDB) GetByPrefixGroupedPaged(ctx SQLContext, packageID cdssdk.Pac 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 if err == nil { return true, nil @@ -147,18 +144,18 @@ func (db *ObjectDB) HasObjectWithPrefix(ctx SQLContext, packageID cdssdk.Package 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 { - 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 if err != nil { return nil, err } - avaiIDMap := make(map[cdssdk.ObjectID]bool) + avaiIDMap := make(map[types.ObjectID]bool) for _, pkgID := range avaiIDs { avaiIDMap[pkgID] = true } @@ -166,12 +163,12 @@ func (db *ObjectDB) BatchTestObjectID(ctx SQLContext, objectIDs []cdssdk.ObjectI 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 { 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 if err != nil { return nil, err @@ -180,12 +177,12 @@ func (db *ObjectDB) BatchGet(ctx SQLContext, objectIDs []cdssdk.ObjectID) ([]cds 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 { 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 if err != nil { return nil, err @@ -194,33 +191,33 @@ func (db *ObjectDB) BatchGetByPackagePath(ctx SQLContext, pkgID cdssdk.PackageID 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 if err != nil { - return stgmod.ObjectDetail{}, fmt.Errorf("getting object: %w", err) + return types.ObjectDetail{}, fmt.Errorf("getting object: %w", err) } // 获取所有的 ObjectBlock - var allBlocks []stgmod.ObjectBlock + var allBlocks []types.ObjectBlock err = ctx.Table("ObjectBlock").Where("ObjectID = ?", objectID).Order("`Index` ASC").Find(&allBlocks).Error 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 - var allPinnedObjs []cdssdk.PinnedObject + var allPinnedObjs []types.PinnedObject err = ctx.Table("PinnedObject").Where("ObjectID = ?", objectID).Order("ObjectID ASC").Find(&allPinnedObjs).Error 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 { - pinnedAt[i] = po.StorageID + pinnedAt[i] = po.UserSpaceID } - return stgmod.ObjectDetail{ + return types.ObjectDetail{ Object: obj, Blocks: allBlocks, 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 if err != nil { @@ -237,32 +234,32 @@ func (db *ObjectDB) BatchGetDetails(ctx SQLContext, objectIDs []cdssdk.ObjectID) } // 获取所有的 ObjectBlock - var allBlocks []stgmod.ObjectBlock + var allBlocks []types.ObjectBlock err = ctx.Table("ObjectBlock").Where("ObjectID IN ?", objectIDs).Order("ObjectID, `Index` ASC").Find(&allBlocks).Error if err != nil { return nil, err } // 获取所有的 PinnedObject - var allPinnedObjs []cdssdk.PinnedObject + var allPinnedObjs []types.PinnedObject err = ctx.Table("PinnedObject").Where("ObjectID IN ?", objectIDs).Order("ObjectID ASC").Find(&allPinnedObjs).Error if err != nil { return nil, err } - details := make([]stgmod.ObjectDetail, len(objs)) + details := make([]types.ObjectDetail, len(objs)) for i, obj := range objs { - details[i] = stgmod.ObjectDetail{ + details[i] = types.ObjectDetail{ Object: obj, } } - stgmod.DetailsFillObjectBlocks(details, allBlocks) - stgmod.DetailsFillPinnedAt(details, allPinnedObjs) + types.DetailsFillObjectBlocks(details, allBlocks) + types.DetailsFillPinnedAt(details, allPinnedObjs) 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 if err != nil { 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。 -func (db *ObjectDB) BatchCreate(ctx SQLContext, objs *[]cdssdk.Object) error { +func (db *ObjectDB) BatchCreate(ctx SQLContext, objs *[]types.Object) error { if len(*objs) == 0 { return nil } @@ -280,7 +277,7 @@ func (db *ObjectDB) BatchCreate(ctx SQLContext, objs *[]cdssdk.Object) error { } // 批量更新对象所有属性,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 { return nil } @@ -294,7 +291,7 @@ func (db *ObjectDB) BatchUpdate(ctx SQLContext, objs []cdssdk.Object) error { // 批量更新对象指定属性,objs中的对象只需设置需要更新的属性即可,但: // 1. 必须包含ObjectID // 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 { return nil } @@ -305,21 +302,21 @@ func (db *ObjectDB) BatchUpdateColumns(ctx SQLContext, objs []cdssdk.Object, col }).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 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 if err != nil { return nil, fmt.Errorf("getting objects: %w", err) } // 获取所有的 ObjectBlock - var allBlocks []stgmod.ObjectBlock + var allBlocks []types.ObjectBlock err = ctx.Table("ObjectBlock"). Select("ObjectBlock.*"). Joins("JOIN Object ON ObjectBlock.ObjectID = Object.ObjectID"). @@ -331,7 +328,7 @@ func (db *ObjectDB) GetPackageObjectDetails(ctx SQLContext, packageID cdssdk.Pac } // 获取所有的 PinnedObject - var allPinnedObjs []cdssdk.PinnedObject + var allPinnedObjs []types.PinnedObject err = ctx.Table("PinnedObject"). Select("PinnedObject.*"). 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) } - details := make([]stgmod.ObjectDetail, len(objs)) + details := make([]types.ObjectDetail, len(objs)) for i, obj := range objs { - details[i] = stgmod.ObjectDetail{ + details[i] = types.ObjectDetail{ Object: obj, } } - stgmod.DetailsFillObjectBlocks(details, allBlocks) - stgmod.DetailsFillPinnedAt(details, allPinnedObjs) + types.DetailsFillObjectBlocks(details, allBlocks) + types.DetailsFillPinnedAt(details, allPinnedObjs) 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 { return nil, fmt.Errorf("getting objects: %w", err) } @@ -364,7 +361,15 @@ func (db *ObjectDB) GetObjectsIfAnyBlockOnStorage(ctx SQLContext, stgID cdssdk.S 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 { 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) } - existsObjsMap := make(map[string]cdssdk.Object) + existsObjsMap := make(map[string]types.Object) for _, obj := range existsObjs { existsObjsMap[obj.Path] = obj } - var updatingObjs []cdssdk.Object - var addingObjs []cdssdk.Object + var updatingObjs []types.Object + var addingObjs []types.Object for i := range adds { - o := cdssdk.Object{ + o := types.Object{ PackageID: packageID, Path: adds[i].Path, Size: adds[i].Size, FileHash: adds[i].FileHash, - Redundancy: cdssdk.NewNoneRedundancy(), // 首次上传默认使用不分块的none模式 + Redundancy: types.NewNoneRedundancy(), // 首次上传默认使用不分块的none模式 CreateTime: adds[i].UploadTime, UpdateTime: adds[i].UploadTime, } @@ -423,15 +428,15 @@ func (db *ObjectDB) BatchAdd(ctx SQLContext, packageID cdssdk.PackageID, adds [] } // 按照add参数的顺序返回结果 - affectedObjsMp := make(map[string]cdssdk.Object) + affectedObjsMp := make(map[string]types.Object) for _, o := range updatingObjs { affectedObjsMp[o.Path] = o } for _, o := range addingObjs { 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 { obj := affectedObjsMp[adds[i].Path] affectedObjs = append(affectedObjs, obj) @@ -451,15 +456,15 @@ func (db *ObjectDB) BatchAdd(ctx SQLContext, packageID cdssdk.PackageID, adds [] } // 创建 ObjectBlock - objBlocks := make([]stgmod.ObjectBlock, 0, len(adds)) + objBlocks := make([]types.ObjectBlock, 0, len(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) } - // 创建 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 } -func (db *ObjectDB) BatchDelete(ctx SQLContext, ids []cdssdk.ObjectID) error { +func (db *ObjectDB) BatchDelete(ctx SQLContext, ids []types.ObjectID) error { if len(ids) == 0 { 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)). Updates(map[string]any{ "PackageID": newPkgID, diff --git a/client/internal/db/object_access_stat.go b/client/internal/db/object_access_stat.go index b305582..255fc0e 100644 --- a/client/internal/db/object_access_stat.go +++ b/client/internal/db/object_access_stat.go @@ -1,9 +1,7 @@ -package db2 +package db 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/clause" ) @@ -16,61 +14,68 @@ func (db *DB) ObjectAccessStat() *ObjectAccessStatDB { 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"). - Where("ObjectID = ? AND StorageID = ?", objID, stgID). + Where("ObjectID = ? AND UserSpaceID = ?", objID, spaceID). First(&ret).Error 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"). Where("ObjectID = ?", objID). Find(&ret).Error 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 { return nil, nil } - var ret []stgmod.ObjectAccessStat + var ret []types.ObjectAccessStat err := ctx.Table("ObjectAccessStat"). Where("ObjectID IN ?", objIDs). Find(&ret).Error 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 { return nil, nil } - var ret []stgmod.ObjectAccessStat + var ret []types.ObjectAccessStat err := ctx.Table("ObjectAccessStat"). - Where("ObjectID IN ? AND StorageID = ?", objIDs, stgID). + Where("ObjectID IN ? AND UserSpaceID = ?", objIDs, spaceID). Find(&ret).Error 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 { return nil } 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"). Clauses(clause.OnConflict{ - Columns: []clause.Column{{Name: "ObjectID"}, {Name: "StorageID"}}, + Columns: []clause.Column{{Name: "ObjectID"}, {Name: "UserSpaceID"}}, DoUpdates: clause.Assignments(map[string]any{ "Counter": gorm.Expr("Counter + values(Counter)"), }), @@ -82,7 +87,7 @@ func (*ObjectAccessStatDB) BatchAddCounter(ctx SQLContext, entries []coormq.AddA 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 { return nil } @@ -96,12 +101,12 @@ func (*ObjectAccessStatDB) UpdateAllAmount(ctx SQLContext, historyWeight float64 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 return err } -func (*ObjectAccessStatDB) BatchDeleteByObjectID(ctx SQLContext, objIDs []cdssdk.ObjectID) error { +func (*ObjectAccessStatDB) BatchDeleteByObjectID(ctx SQLContext, objIDs []types.ObjectID) error { if len(objIDs) == 0 { return nil } @@ -110,7 +115,7 @@ func (*ObjectAccessStatDB) BatchDeleteByObjectID(ctx SQLContext, objIDs []cdssdk 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 return err } diff --git a/client/internal/db/object_block.go b/client/internal/db/object_block.go index 2d2729c..01b7f01 100644 --- a/client/internal/db/object_block.go +++ b/client/internal/db/object_block.go @@ -1,11 +1,7 @@ -package db2 +package db 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" ) @@ -17,24 +13,24 @@ func (db *DB) ObjectBlock() *ObjectBlockDB { 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 } -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 { 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 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"). Joins("INNER JOIN Object ON ObjectBlock.ObjectID = Object.ObjectID"). Where("Object.PackageID = ?", packageID). @@ -43,12 +39,12 @@ func (*ObjectBlockDB) GetInPackageID(ctx SQLContext, packageID cdssdk.PackageID) 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 } -func (db *ObjectBlockDB) BatchCreate(ctx SQLContext, blocks []stgmod.ObjectBlock) error { +func (db *ObjectBlockDB) BatchCreate(ctx SQLContext, blocks []types.ObjectBlock) error { if len(blocks) == 0 { 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 } -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 { 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 { 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) { @@ -90,7 +86,7 @@ func (db *ObjectBlockDB) CountBlockWithHash(ctx SQLContext, fileHash string) (in Select("COUNT(FileHash)"). Joins("INNER JOIN Object ON ObjectBlock.ObjectID = Object.ObjectID"). Joins("INNER JOIN Package ON Object.PackageID = Package.PackageID"). - Where("FileHash = ? AND Package.State = ?", fileHash, cdssdk.PackageStateNormal). + Where("FileHash = ?", fileHash). Scan(&cnt).Error if err != nil { @@ -99,24 +95,3 @@ func (db *ObjectBlockDB) CountBlockWithHash(ctx SQLContext, fileHash string) (in 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 -} diff --git a/client/internal/db/package.go b/client/internal/db/package.go index c6af549..20f7a1f 100644 --- a/client/internal/db/package.go +++ b/client/internal/db/package.go @@ -1,13 +1,11 @@ -package db2 +package db import ( "fmt" "time" + "gitlink.org.cn/cloudream/storage2/client/types" "gorm.io/gorm" - - cdssdk "gitlink.org.cn/cloudream/common/sdks/storage" - "gitlink.org.cn/cloudream/storage2/common/pkgs/db2/model" ) type PackageDB struct { @@ -18,24 +16,24 @@ func (db *DB) Package() *PackageDB { 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 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 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 { - 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"). Select("PackageID"). Where("PackageID IN ?", pkgIDs). @@ -44,7 +42,7 @@ func (db *PackageDB) BatchTestPackageID(ctx SQLContext, pkgIDs []cdssdk.PackageI return nil, err } - avaiIDMap := make(map[cdssdk.PackageID]bool) + avaiIDMap := make(map[types.PackageID]bool) for _, pkgID := range avaiIDs { avaiIDMap[pkgID] = true } @@ -52,24 +50,14 @@ func (db *PackageDB) BatchTestPackageID(ctx SQLContext, pkgIDs []cdssdk.PackageI 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 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"). Select("Package.*"). Where("BucketID = ?", bucketID). @@ -77,8 +65,8 @@ func (db *PackageDB) GetBucketPackages(ctx SQLContext, bucketID cdssdk.BucketID) 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"). Select("Package.*"). Joins("JOIN Bucket ON Package.BucketID = Bucket.BucketID"). @@ -87,50 +75,18 @@ func (db *PackageDB) GetBucketPackagesByName(ctx SQLContext, bucketName string) 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 -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"). Select("Package.*"). 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 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 err := ctx.Table("Package"). Select("PackageID"). @@ -138,27 +94,27 @@ func (db *PackageDB) Create(ctx SQLContext, bucketID cdssdk.BucketID, name strin Scan(&packageID).Error if err != nil { - return cdssdk.Package{}, err + return types.Package{}, err } 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 { - 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 } -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 } // 删除与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 { return fmt.Errorf("delete package state: %w", err) } @@ -186,13 +142,13 @@ func (db *PackageDB) DeleteComplete(ctx SQLContext, packageID cdssdk.PackageID) 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 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 if err == gorm.ErrRecordNotFound { return false, nil @@ -203,7 +159,7 @@ func (*PackageDB) HasPackageIn(ctx SQLContext, bucketID cdssdk.BucketID) (bool, 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 return err } diff --git a/client/internal/db/package_access_stat.go b/client/internal/db/package_access_stat.go index 9032645..56ff8ec 100644 --- a/client/internal/db/package_access_stat.go +++ b/client/internal/db/package_access_stat.go @@ -1,9 +1,7 @@ -package db2 +package db 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/clause" ) @@ -16,51 +14,51 @@ func (db *DB) PackageAccessStat() *PackageAccessStatDB { 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 } -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 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 { return nil, nil } - var ret []stgmod.PackageAccessStat + var ret []types.PackageAccessStat err := ctx.Table("PackageAccessStat").Where("PackageID IN (?)", pkgIDs).Find(&ret).Error return ret, err } -func (*PackageAccessStatDB) BatchAddCounter(ctx SQLContext, entries []coormq.AddAccessStatEntry) error { +func (*PackageAccessStatDB) BatchAddCounter(ctx SQLContext, entries []AddAccessStatEntry) error { if len(entries) == 0 { return nil } - accs := make([]stgmod.PackageAccessStat, len(entries)) + accs := make([]types.PackageAccessStat, len(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{ - Columns: []clause.Column{{Name: "PackageID"}, {Name: "StorageID"}}, + Columns: []clause.Column{{Name: "PackageID"}, {Name: "UserSpaceID"}}, DoUpdates: clause.Assignments(map[string]any{ "Counter": gorm.Expr("Counter + values(Counter)"), }), }).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 { return nil } @@ -74,6 +72,6 @@ func (*PackageAccessStatDB) UpdateAllAmount(ctx SQLContext, historyWeight float6 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 } diff --git a/client/internal/db/pinned_object.go b/client/internal/db/pinned_object.go index a9de444..057d32b 100644 --- a/client/internal/db/pinned_object.go +++ b/client/internal/db/pinned_object.go @@ -1,9 +1,9 @@ -package db2 +package db import ( "time" - cdssdk "gitlink.org.cn/cloudream/common/sdks/storage" + "gitlink.org.cn/cloudream/storage2/client/types" "gorm.io/gorm/clause" ) @@ -15,66 +15,66 @@ func (db *DB) PinnedObject() *PinnedObjectDB { 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 } -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 } -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 { 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 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{ - Columns: []clause.Column{{Name: "ObjectID"}, {Name: "StorageID"}}, + Columns: []clause.Column{{Name: "ObjectID"}, {Name: "UserSpaceID"}}, 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 { return nil } return ctx.Clauses(clause.OnConflict{ - Columns: []clause.Column{{Name: "ObjectID"}, {Name: "StorageID"}}, + Columns: []clause.Column{{Name: "ObjectID"}, {Name: "UserSpaceID"}}, DoUpdates: clause.AssignmentColumns([]string{"CreateTime"}), }).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( - "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(), packageID, ).Error 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 } - for _, id := range stgIDs { + for _, id := range spaceIDs { err := db.TryCreate(ctx, id, objectID, time.Now()) if err != nil { return err @@ -83,40 +83,40 @@ func (db *PinnedObjectDB) ObjectBatchCreate(ctx SQLContext, objectID cdssdk.Obje 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 } -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 return err } -func (*PinnedObjectDB) BatchDeleteByObjectID(ctx SQLContext, objectIDs []cdssdk.ObjectID) error { +func (*PinnedObjectDB) BatchDeleteByObjectID(ctx SQLContext, objectIDs []types.ObjectID) error { if len(objectIDs) == 0 { 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 } -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 } -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 } -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 { 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 } diff --git a/client/internal/db/storage.go b/client/internal/db/storage.go deleted file mode 100644 index a558e37..0000000 --- a/client/internal/db/storage.go +++ /dev/null @@ -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 -} diff --git a/client/internal/db/union_serializer.go b/client/internal/db/union_serializer.go index 8c0183c..490cd30 100644 --- a/client/internal/db/union_serializer.go +++ b/client/internal/db/union_serializer.go @@ -1,4 +1,4 @@ -package db2 +package db import ( "context" diff --git a/client/internal/db/user.go b/client/internal/db/user.go deleted file mode 100644 index b94e73b..0000000 --- a/client/internal/db/user.go +++ /dev/null @@ -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 -} diff --git a/client/internal/db/user_bucket.go b/client/internal/db/user_bucket.go deleted file mode 100644 index 70b1152..0000000 --- a/client/internal/db/user_bucket.go +++ /dev/null @@ -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 -} diff --git a/client/internal/db/user_hub.go b/client/internal/db/user_hub.go deleted file mode 100644 index e68a57e..0000000 --- a/client/internal/db/user_hub.go +++ /dev/null @@ -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 -} diff --git a/client/internal/db/user_storage.go b/client/internal/db/user_storage.go deleted file mode 100644 index 2cccdbe..0000000 --- a/client/internal/db/user_storage.go +++ /dev/null @@ -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 -} diff --git a/client/internal/db/utils.go b/client/internal/db/utils.go index deeda45..67cb079 100644 --- a/client/internal/db/utils.go +++ b/client/internal/db/utils.go @@ -1,4 +1,4 @@ -package db2 +package db import ( "strings"