object Generic { val name = SQL.Column.string("name").make_primary_key
}
object Base { val name = Generic.name val heap_size = SQL.Column.long("heap_size") val heap_digest = SQL.Column.string("heap_digest") val uuid = SQL.Column.string("uuid") val log_db = SQL.Column.bytes("log_db")
val table = make_table(List(name, heap_size, heap_digest, uuid, log_db))
}
object Size { val name = Generic.name val heap = SQL.Column.string("heap") val log_db = SQL.Column.string("log_db")
val table = make_table(List(name, heap, log_db),
body = "SELECT name, pg_size_pretty(heap_size::bigint) as heap, " + " pg_size_pretty(length(log_db)::bigint) as log_db FROM " + Base.table.ident,
name = "size")
}
object Slices { val name = Generic.name val slice = SQL.Column.int("slice").make_primary_key val content = SQL.Column.bytes("content")
val table = make_table(List(name, slice, content), name = "slices")
}
object Slices_Size { val name = Generic.name val slice = Slices.slice val size = SQL.Column.string("size")
val table = make_table(List(name, slice, size),
body = "SELECT name, slice, pg_size_pretty(length(content)::bigint) as size FROM "+
Slices.table.ident,
name = "slices_size")
}
def read_digests(db: SQL.Database, names: Iterable[String]): Map[String, SHA1.Digest] = if (names.isEmpty) Map.empty else {
db.execute_query_statement(
Base.table.select(List(Base.name, Base.heap_digest),
sql = Generic.name.where_member(names)),
List.from[(String, String)],
res => res.string(Base.name) -> res.string(Base.heap_digest)
).collect({ case (name, digest) if digest.nonEmpty => name -> SHA1.fake_digest(digest)
}).toMap
}
def store(
db: SQL.Database,
session: Store.Session,
slice: Space,
cache: Compress.Cache = Compress.Cache.none,
progress: Progress = new Progress
): Unit = { val log_db = for {
path <- session.log_db
uuid <- proper_string(Store.read_build_uuid(path, session.name))
} yield Log_DB(uuid, Bytes.read(path))
val heap_digest = session.heap.map(write_file_digest) val heap_size =
session.heap match { case Some(heap) => File.size(heap) - sha1_length case None => 0L
}
val slice_size = slice.bytes max Space.MiB(1).bytes val slices = (heap_size.toDouble / slice_size.toDouble).ceil.toInt val step = if (slices == 0) 0L else (heap_size.toDouble / slices.toDouble).ceil.toLong
def slice_content(i: Int): Bytes = { val j = i + 1 val offset = step * i val limit = if (j < slices) step * j else heap_size
Bytes.read_file(session.the_heap, offset = offset, limit = limit)
.compress(cache = cache)
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.