102 lines
3.6 KiB
Go
102 lines
3.6 KiB
Go
package db
|
|
|
|
import (
|
|
jcstypes "gitlink.org.cn/cloudream/jcs-pub/common/types"
|
|
"gorm.io/gorm/clause"
|
|
)
|
|
|
|
type ObjectBlockDB struct {
|
|
*DB
|
|
}
|
|
|
|
func (db *DB) ObjectBlock() *ObjectBlockDB {
|
|
return &ObjectBlockDB{DB: db}
|
|
}
|
|
|
|
func (db *ObjectBlockDB) GetByUserSpaceID(ctx SQLContext, spaceID jcstypes.UserSpaceID) ([]jcstypes.ObjectBlock, error) {
|
|
var rets []jcstypes.ObjectBlock
|
|
err := ctx.Table("ObjectBlock").Where("UserSpaceID = ?", spaceID).Find(&rets).Error
|
|
return rets, err
|
|
}
|
|
|
|
func (db *ObjectBlockDB) BatchGetByObjectID(ctx SQLContext, objectIDs []jcstypes.ObjectID) ([]jcstypes.ObjectBlock, error) {
|
|
if len(objectIDs) == 0 {
|
|
return nil, nil
|
|
}
|
|
|
|
var blocks []jcstypes.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 jcstypes.PackageID) ([]jcstypes.ObjectBlock, error) {
|
|
var rets []jcstypes.ObjectBlock
|
|
err := ctx.Table("ObjectBlock").
|
|
Joins("INNER JOIN Object ON ObjectBlock.ObjectID = Object.ObjectID").
|
|
Where("Object.PackageID = ?", packageID).
|
|
Order("ObjectBlock.ObjectID, ObjectBlock.`Index` ASC").
|
|
Find(&rets).Error
|
|
return rets, err
|
|
}
|
|
|
|
func (db *ObjectBlockDB) Create(ctx SQLContext, objectID jcstypes.ObjectID, index int, spaceID jcstypes.UserSpaceID, fileHash jcstypes.FileHash, size int64) error {
|
|
block := jcstypes.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 []jcstypes.ObjectBlock) error {
|
|
if len(blocks) == 0 {
|
|
return nil
|
|
}
|
|
|
|
return ctx.Clauses(clause.Insert{Modifier: "ignore"}).Create(&blocks).Error
|
|
}
|
|
|
|
func (db *ObjectBlockDB) DeleteByObjectID(ctx SQLContext, objectID jcstypes.ObjectID) error {
|
|
return ctx.Table("ObjectBlock").Where("ObjectID = ?", objectID).Delete(&jcstypes.ObjectBlock{}).Error
|
|
}
|
|
|
|
func (db *ObjectBlockDB) DeleteByObjectIDIndex(ctx SQLContext, objectID jcstypes.ObjectID, index int) error {
|
|
return ctx.Table("ObjectBlock").Where("ObjectID = ? AND `Index` = ?", objectID, index).Delete(&jcstypes.ObjectBlock{}).Error
|
|
}
|
|
|
|
func (db *ObjectBlockDB) BatchDeleteByObjectID(ctx SQLContext, objectIDs []jcstypes.ObjectID) error {
|
|
if len(objectIDs) == 0 {
|
|
return nil
|
|
}
|
|
|
|
return ctx.Table("ObjectBlock").Where("ObjectID IN (?)", objectIDs).Delete(&jcstypes.ObjectBlock{}).Error
|
|
}
|
|
|
|
func (db *ObjectBlockDB) DeleteInPackage(ctx SQLContext, packageID jcstypes.PackageID) error {
|
|
return ctx.Table("ObjectBlock").Where("ObjectID IN (SELECT ObjectID FROM Object WHERE PackageID = ?)", packageID).Delete(&jcstypes.ObjectBlock{}).Error
|
|
}
|
|
|
|
func (db *ObjectBlockDB) BatchDeleteByFileHash(ctx SQLContext, spaceID jcstypes.UserSpaceID, fileHashes []jcstypes.FileHash) error {
|
|
if len(fileHashes) == 0 {
|
|
return nil
|
|
}
|
|
|
|
return ctx.Table("ObjectBlock").Where("UserSpaceID = ? AND FileHash IN (?)", spaceID, fileHashes).Delete(&jcstypes.ObjectBlock{}).Error
|
|
}
|
|
|
|
func (*ObjectBlockDB) DeleteByUserSpaceID(ctx SQLContext, spaceID jcstypes.UserSpaceID) error {
|
|
return ctx.Table("ObjectBlock").Where("UserSpaceID = ?", spaceID).Delete(&jcstypes.ObjectBlock{}).Error
|
|
}
|
|
|
|
func (db *ObjectBlockDB) CountBlockWithHash(ctx SQLContext, fileHash string) (int, error) {
|
|
var cnt int64
|
|
err := ctx.Table("ObjectBlock").
|
|
Select("COUNT(FileHash)").
|
|
Joins("INNER JOIN Object ON ObjectBlock.ObjectID = Object.ObjectID").
|
|
Joins("INNER JOIN Package ON Object.PackageID = Package.PackageID").
|
|
Where("FileHash = ?", fileHash).
|
|
Scan(&cnt).Error
|
|
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
return int(cnt), nil
|
|
}
|