Check file integrity

This commit is contained in:
eikek
2022-03-10 22:18:50 +01:00
parent 422c0905dc
commit c1ce0769eb
12 changed files with 285 additions and 19 deletions

View File

@ -26,6 +26,14 @@ object BinnyUtils {
def fileKeyToBinaryId(fk: FileKey): BinaryId =
BinaryId(s"${fk.collective.id}/${fk.category.id.id}/${fk.id.id}")
def fileKeyPartToPrefix(fkp: FileKeyPart): Option[String] =
fkp match {
case FileKeyPart.Empty => None
case FileKeyPart.Collective(cid) => Some(s"${cid.id}/%")
case FileKeyPart.Category(cid, cat) => Some(s"${cid.id}/${cat.id.id}/%")
case FileKeyPart.Key(key) => Some(fileKeyToBinaryId(key).id)
}
def binaryIdToFileKey(bid: BinaryId): Either[String, FileKey] =
bid.id.split('/').toList match {
case cId :: catId :: fId :: Nil =>

View File

@ -8,8 +8,10 @@ package docspell.store.records
import cats.data.NonEmptyList
import cats.implicits._
import fs2.Stream
import docspell.common.{FileKey, _}
import docspell.store.file.BinnyUtils
import docspell.store.qb.DSL._
import docspell.store.qb._
@ -44,6 +46,18 @@ object RFileMeta {
def as(alias: String): Table =
Table(Some(alias))
def findAll(part: FileKeyPart, chunkSize: Int): Stream[ConnectionIO, RFileMeta] = {
val cond = BinnyUtils
.fileKeyPartToPrefix(part)
.map(prefix => T.id.cast[String].like(prefix))
Select(
select(T.all),
from(T),
cond.getOrElse(Condition.unit)
).build.query[RFileMeta].streamWithChunkSize(chunkSize)
}
def insert(r: RFileMeta): ConnectionIO[Int] =
DML.insert(T, T.all, fr"${r.id},${r.created},${r.mimetype},${r.length},${r.checksum}")

View File

@ -68,7 +68,7 @@ object StoreFixture {
ds <- dataSource(jdbc)
xa <- makeXA(ds)
cfg = FileRepositoryConfig.Database(64 * 1024)
fr = FileRepository[IO](xa, ds, cfg)
fr = FileRepository[IO](xa, ds, cfg, true)
store = new StoreImpl[IO](fr, jdbc, ds, xa)
_ <- Resource.eval(store.migrate)
} yield store