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 }