src/Pure/ML/ml_heap.scala
author wenzelm
Tue, 27 Jun 2023 10:24:32 +0200
changeset 78213 fd0430a7b7a4
parent 78204 0aa5360fa88b
child 78266 d8c99a497502
permissions -rw-r--r--
avoid repeated open_database_server: synchronized transaction_lock;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
76991
6a078c80eab6 clarified modules;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/ML/ml_heap.scala
6a078c80eab6 clarified modules;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
6a078c80eab6 clarified modules;
wenzelm
parents:
diff changeset
     3
6a078c80eab6 clarified modules;
wenzelm
parents:
diff changeset
     4
ML heap operations.
6a078c80eab6 clarified modules;
wenzelm
parents:
diff changeset
     5
*/
6a078c80eab6 clarified modules;
wenzelm
parents:
diff changeset
     6
6a078c80eab6 clarified modules;
wenzelm
parents:
diff changeset
     7
package isabelle
6a078c80eab6 clarified modules;
wenzelm
parents:
diff changeset
     8
6a078c80eab6 clarified modules;
wenzelm
parents:
diff changeset
     9
6a078c80eab6 clarified modules;
wenzelm
parents:
diff changeset
    10
import java.nio.ByteBuffer
6a078c80eab6 clarified modules;
wenzelm
parents:
diff changeset
    11
import java.nio.channels.FileChannel
6a078c80eab6 clarified modules;
wenzelm
parents:
diff changeset
    12
import java.nio.file.StandardOpenOption
6a078c80eab6 clarified modules;
wenzelm
parents:
diff changeset
    13
6a078c80eab6 clarified modules;
wenzelm
parents:
diff changeset
    14
6a078c80eab6 clarified modules;
wenzelm
parents:
diff changeset
    15
object ML_Heap {
6a078c80eab6 clarified modules;
wenzelm
parents:
diff changeset
    16
  /** heap file with SHA1 digest **/
6a078c80eab6 clarified modules;
wenzelm
parents:
diff changeset
    17
6a078c80eab6 clarified modules;
wenzelm
parents:
diff changeset
    18
  private val sha1_prefix = "SHA1:"
6a078c80eab6 clarified modules;
wenzelm
parents:
diff changeset
    19
78182
31835adf148a tuned signature;
wenzelm
parents: 77720
diff changeset
    20
  def read_file_digest(heap: Path): Option[SHA1.Digest] = {
76991
6a078c80eab6 clarified modules;
wenzelm
parents:
diff changeset
    21
    if (heap.is_file) {
77711
25fd62cba347 clarified signature: more general operation Bytes.read_slice;
wenzelm
parents: 77206
diff changeset
    22
      val l = sha1_prefix.length
25fd62cba347 clarified signature: more general operation Bytes.read_slice;
wenzelm
parents: 77206
diff changeset
    23
      val m = l + SHA1.digest_length
25fd62cba347 clarified signature: more general operation Bytes.read_slice;
wenzelm
parents: 77206
diff changeset
    24
      val n = heap.file.length
77718
6ad3a412ed97 clarified signature;
wenzelm
parents: 77711
diff changeset
    25
      val bs = Bytes.read_file(heap.file, offset = n - m)
77711
25fd62cba347 clarified signature: more general operation Bytes.read_slice;
wenzelm
parents: 77206
diff changeset
    26
      if (bs.length == m) {
25fd62cba347 clarified signature: more general operation Bytes.read_slice;
wenzelm
parents: 77206
diff changeset
    27
        val s = bs.text
25fd62cba347 clarified signature: more general operation Bytes.read_slice;
wenzelm
parents: 77206
diff changeset
    28
        if (s.startsWith(sha1_prefix)) Some(SHA1.fake_digest(s.substring(l)))
76991
6a078c80eab6 clarified modules;
wenzelm
parents:
diff changeset
    29
        else None
6a078c80eab6 clarified modules;
wenzelm
parents:
diff changeset
    30
      }
77711
25fd62cba347 clarified signature: more general operation Bytes.read_slice;
wenzelm
parents: 77206
diff changeset
    31
      else None
76991
6a078c80eab6 clarified modules;
wenzelm
parents:
diff changeset
    32
    }
6a078c80eab6 clarified modules;
wenzelm
parents:
diff changeset
    33
    else None
6a078c80eab6 clarified modules;
wenzelm
parents:
diff changeset
    34
  }
6a078c80eab6 clarified modules;
wenzelm
parents:
diff changeset
    35
78182
31835adf148a tuned signature;
wenzelm
parents: 77720
diff changeset
    36
  def write_file_digest(heap: Path): SHA1.Digest =
31835adf148a tuned signature;
wenzelm
parents: 77720
diff changeset
    37
    read_file_digest(heap) getOrElse {
77206
6784eaef7d0c prefer explicit shasum;
wenzelm
parents: 76992
diff changeset
    38
      val digest = SHA1.digest(heap)
6784eaef7d0c prefer explicit shasum;
wenzelm
parents: 76992
diff changeset
    39
      File.append(heap, sha1_prefix + digest.toString)
6784eaef7d0c prefer explicit shasum;
wenzelm
parents: 76992
diff changeset
    40
      digest
76991
6a078c80eab6 clarified modules;
wenzelm
parents:
diff changeset
    41
    }
77720
f750047e9386 tuned comments;
wenzelm
parents: 77718
diff changeset
    42
f750047e9386 tuned comments;
wenzelm
parents: 77718
diff changeset
    43
f750047e9386 tuned comments;
wenzelm
parents: 77718
diff changeset
    44
  /* SQL data model */
f750047e9386 tuned comments;
wenzelm
parents: 77718
diff changeset
    45
78187
2df0f3604a67 clarified signature: more explicit class SQL.Data;
wenzelm
parents: 78186
diff changeset
    46
  object Data extends SQL.Data("isabelle_heaps") {
2df0f3604a67 clarified signature: more explicit class SQL.Data;
wenzelm
parents: 78186
diff changeset
    47
    override lazy val tables = SQL.Tables(Base.table, Slices.table)
78183
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    48
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    49
    object Generic {
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    50
      val name = SQL.Column.string("name").make_primary_key
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    51
    }
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    52
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    53
    object Base {
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    54
      val name = Generic.name
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    55
      val size = SQL.Column.long("size")
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    56
      val digest = SQL.Column.string("digest")
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    57
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    58
      val table = make_table("", List(name, size, digest))
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    59
    }
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    60
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    61
    object Slices {
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    62
      val name = Generic.name
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    63
      val slice = SQL.Column.int("slice").make_primary_key
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    64
      val content = SQL.Column.bytes("content")
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    65
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    66
      val table = make_table("slices", List(name, slice, content))
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    67
    }
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    68
78196
140a6f2e3728 restore heaps from database, which takes precedence over file-system;
wenzelm
parents: 78193
diff changeset
    69
    def get_entry(db: SQL.Database, name: String): Option[SHA1.Digest] =
78183
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    70
      db.execute_query_statementO[String](
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    71
        Base.table.select(List(Base.digest), sql = Generic.name.where_equal(name)),
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    72
        _.string(Base.digest)
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    73
      ).flatMap(proper_string).map(SHA1.fake_digest)
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    74
78196
140a6f2e3728 restore heaps from database, which takes precedence over file-system;
wenzelm
parents: 78193
diff changeset
    75
    def read_entry(db: SQL.Database, name: String): List[Bytes] =
140a6f2e3728 restore heaps from database, which takes precedence over file-system;
wenzelm
parents: 78193
diff changeset
    76
      db.execute_query_statement(
140a6f2e3728 restore heaps from database, which takes precedence over file-system;
wenzelm
parents: 78193
diff changeset
    77
        Slices.table.select(List(Slices.content),
140a6f2e3728 restore heaps from database, which takes precedence over file-system;
wenzelm
parents: 78193
diff changeset
    78
          sql = Generic.name.where_equal(name) + SQL.order_by(List(Slices.slice))),
140a6f2e3728 restore heaps from database, which takes precedence over file-system;
wenzelm
parents: 78193
diff changeset
    79
        List.from[Bytes], _.bytes(Slices.content))
140a6f2e3728 restore heaps from database, which takes precedence over file-system;
wenzelm
parents: 78193
diff changeset
    80
78183
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    81
    def clean_entry(db: SQL.Database, name: String): Unit = {
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    82
      for (table <- List(Base.table, Slices.table)) {
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    83
        db.execute_statement(table.delete(sql = Base.name.where_equal(name)))
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    84
      }
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    85
    }
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    86
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    87
    def prepare_entry(db: SQL.Database, name: String): Unit =
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    88
      db.execute_statement(Base.table.insert(), body =
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    89
        { stmt =>
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    90
          stmt.string(1) = name
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    91
          stmt.long(2) = None
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    92
          stmt.string(3) = None
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    93
        })
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    94
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    95
    def write_entry(db: SQL.Database, name: String, slice: Int, content: Bytes): Unit =
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    96
      db.execute_statement(Slices.table.insert(), body =
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    97
      { stmt =>
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    98
        stmt.string(1) = name
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
    99
        stmt.int(2) = slice
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   100
        stmt.bytes(3) = content
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   101
      })
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   102
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   103
    def finish_entry(db: SQL.Database, name: String, size: Long, digest: SHA1.Digest): Unit =
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   104
      db.execute_statement(
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   105
        Base.table.update(List(Base.size, Base.digest), sql = Base.name.where_equal(name)),
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   106
        body =
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   107
          { stmt =>
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   108
            stmt.long(1) = size
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   109
            stmt.string(2) = digest.toString
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   110
          })
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   111
  }
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   112
78204
0aa5360fa88b clarified signature;
wenzelm
parents: 78197
diff changeset
   113
  def clean_entry(db: SQL.Database, session_name: String): Unit =
78213
fd0430a7b7a4 avoid repeated open_database_server: synchronized transaction_lock;
wenzelm
parents: 78204
diff changeset
   114
    Data.transaction_lock(db, create = true, synchronized = true) {
fd0430a7b7a4 avoid repeated open_database_server: synchronized transaction_lock;
wenzelm
parents: 78204
diff changeset
   115
      Data.clean_entry(db, session_name)
fd0430a7b7a4 avoid repeated open_database_server: synchronized transaction_lock;
wenzelm
parents: 78204
diff changeset
   116
    }
78186
721c118f7001 proper ML_Heap.clean_entry;
wenzelm
parents: 78183
diff changeset
   117
78204
0aa5360fa88b clarified signature;
wenzelm
parents: 78197
diff changeset
   118
  def get_entry(db: SQL.Database, session_name: String): Option[SHA1.Digest] =
78213
fd0430a7b7a4 avoid repeated open_database_server: synchronized transaction_lock;
wenzelm
parents: 78204
diff changeset
   119
    Data.transaction_lock(db, create = true, synchronized = true) {
fd0430a7b7a4 avoid repeated open_database_server: synchronized transaction_lock;
wenzelm
parents: 78204
diff changeset
   120
      Data.get_entry(db, session_name)
fd0430a7b7a4 avoid repeated open_database_server: synchronized transaction_lock;
wenzelm
parents: 78204
diff changeset
   121
    }
78196
140a6f2e3728 restore heaps from database, which takes precedence over file-system;
wenzelm
parents: 78193
diff changeset
   122
78191
6e52cda26ad4 tuned signature;
wenzelm
parents: 78188
diff changeset
   123
  def store(
78183
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   124
    database: Option[SQL.Database],
78204
0aa5360fa88b clarified signature;
wenzelm
parents: 78197
diff changeset
   125
    session_name: String,
78183
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   126
    heap: Path,
78188
fd68b98de1f6 prefer system option;
wenzelm
parents: 78187
diff changeset
   127
    slice: Long,
78193
wenzelm
parents: 78191
diff changeset
   128
    cache: Compress.Cache = Compress.Cache.none
78183
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   129
  ): SHA1.Digest = {
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   130
    val digest = write_file_digest(heap)
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   131
    database match {
78204
0aa5360fa88b clarified signature;
wenzelm
parents: 78197
diff changeset
   132
      case None =>
78183
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   133
      case Some(db) =>
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   134
        val size = File.space(heap).bytes - sha1_prefix.length - SHA1.digest_length
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   135
78188
fd68b98de1f6 prefer system option;
wenzelm
parents: 78187
diff changeset
   136
        val slices = (size.toDouble / slice.toDouble).ceil.toInt
78183
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   137
        val step = (size.toDouble / slices.toDouble).ceil.toLong
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   138
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   139
        try {
78213
fd0430a7b7a4 avoid repeated open_database_server: synchronized transaction_lock;
wenzelm
parents: 78204
diff changeset
   140
          Data.transaction_lock(db, create = true, synchronized = true) {
fd0430a7b7a4 avoid repeated open_database_server: synchronized transaction_lock;
wenzelm
parents: 78204
diff changeset
   141
            Data.prepare_entry(db, session_name)
fd0430a7b7a4 avoid repeated open_database_server: synchronized transaction_lock;
wenzelm
parents: 78204
diff changeset
   142
          }
78183
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   143
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   144
          for (i <- 0 until slices) {
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   145
            val j = i + 1
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   146
            val offset = step * i
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   147
            val limit = if (j < slices) step * j else size
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   148
            val content =
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   149
              Bytes.read_file(heap.file, offset = offset, limit = limit)
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   150
                .compress(cache = cache)
78213
fd0430a7b7a4 avoid repeated open_database_server: synchronized transaction_lock;
wenzelm
parents: 78204
diff changeset
   151
            Data.transaction_lock(db, synchronized = true) {
fd0430a7b7a4 avoid repeated open_database_server: synchronized transaction_lock;
wenzelm
parents: 78204
diff changeset
   152
              Data.write_entry(db, session_name, i, content)
fd0430a7b7a4 avoid repeated open_database_server: synchronized transaction_lock;
wenzelm
parents: 78204
diff changeset
   153
            }
78183
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   154
          }
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   155
78213
fd0430a7b7a4 avoid repeated open_database_server: synchronized transaction_lock;
wenzelm
parents: 78204
diff changeset
   156
          Data.transaction_lock(db, synchronized = true) {
fd0430a7b7a4 avoid repeated open_database_server: synchronized transaction_lock;
wenzelm
parents: 78204
diff changeset
   157
            Data.finish_entry(db, session_name, size, digest)
fd0430a7b7a4 avoid repeated open_database_server: synchronized transaction_lock;
wenzelm
parents: 78204
diff changeset
   158
          }
78183
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   159
        }
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   160
        catch { case exn: Throwable =>
78213
fd0430a7b7a4 avoid repeated open_database_server: synchronized transaction_lock;
wenzelm
parents: 78204
diff changeset
   161
          Data.transaction_lock(db, create = true, synchronized = true) {
fd0430a7b7a4 avoid repeated open_database_server: synchronized transaction_lock;
wenzelm
parents: 78204
diff changeset
   162
            Data.clean_entry(db, session_name)
fd0430a7b7a4 avoid repeated open_database_server: synchronized transaction_lock;
wenzelm
parents: 78204
diff changeset
   163
          }
78183
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   164
          throw exn
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   165
        }
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   166
    }
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   167
    digest
8d57ed9e27a7 store heaps within database server;
wenzelm
parents: 78182
diff changeset
   168
  }
78196
140a6f2e3728 restore heaps from database, which takes precedence over file-system;
wenzelm
parents: 78193
diff changeset
   169
140a6f2e3728 restore heaps from database, which takes precedence over file-system;
wenzelm
parents: 78193
diff changeset
   170
  def restore(
78204
0aa5360fa88b clarified signature;
wenzelm
parents: 78197
diff changeset
   171
    database: Option[SQL.Database],
0aa5360fa88b clarified signature;
wenzelm
parents: 78197
diff changeset
   172
    session_name: String,
78196
140a6f2e3728 restore heaps from database, which takes precedence over file-system;
wenzelm
parents: 78193
diff changeset
   173
    heap: Path,
140a6f2e3728 restore heaps from database, which takes precedence over file-system;
wenzelm
parents: 78193
diff changeset
   174
    cache: Compress.Cache = Compress.Cache.none
140a6f2e3728 restore heaps from database, which takes precedence over file-system;
wenzelm
parents: 78193
diff changeset
   175
  ): Unit = {
78204
0aa5360fa88b clarified signature;
wenzelm
parents: 78197
diff changeset
   176
    database match {
0aa5360fa88b clarified signature;
wenzelm
parents: 78197
diff changeset
   177
      case None =>
0aa5360fa88b clarified signature;
wenzelm
parents: 78197
diff changeset
   178
      case Some(db) =>
78213
fd0430a7b7a4 avoid repeated open_database_server: synchronized transaction_lock;
wenzelm
parents: 78204
diff changeset
   179
        Data.transaction_lock(db, create = true, synchronized = true) {
78204
0aa5360fa88b clarified signature;
wenzelm
parents: 78197
diff changeset
   180
          val db_digest = Data.get_entry(db, session_name)
0aa5360fa88b clarified signature;
wenzelm
parents: 78197
diff changeset
   181
          val file_digest = read_file_digest(heap)
78196
140a6f2e3728 restore heaps from database, which takes precedence over file-system;
wenzelm
parents: 78193
diff changeset
   182
78204
0aa5360fa88b clarified signature;
wenzelm
parents: 78197
diff changeset
   183
          if (db_digest.isDefined && db_digest != file_digest) {
0aa5360fa88b clarified signature;
wenzelm
parents: 78197
diff changeset
   184
            Isabelle_System.make_directory(heap.expand.dir)
0aa5360fa88b clarified signature;
wenzelm
parents: 78197
diff changeset
   185
            Bytes.write(heap, Bytes.empty)
0aa5360fa88b clarified signature;
wenzelm
parents: 78197
diff changeset
   186
              for (slice <- Data.read_entry(db, session_name)) {
0aa5360fa88b clarified signature;
wenzelm
parents: 78197
diff changeset
   187
                Bytes.append(heap, slice.uncompress(cache = cache))
0aa5360fa88b clarified signature;
wenzelm
parents: 78197
diff changeset
   188
              }
0aa5360fa88b clarified signature;
wenzelm
parents: 78197
diff changeset
   189
            val digest = write_file_digest(heap)
0aa5360fa88b clarified signature;
wenzelm
parents: 78197
diff changeset
   190
            if (db_digest.get != digest) error("Incoherent content for file " + heap)
78196
140a6f2e3728 restore heaps from database, which takes precedence over file-system;
wenzelm
parents: 78193
diff changeset
   191
          }
78204
0aa5360fa88b clarified signature;
wenzelm
parents: 78197
diff changeset
   192
        }
78196
140a6f2e3728 restore heaps from database, which takes precedence over file-system;
wenzelm
parents: 78193
diff changeset
   193
    }
140a6f2e3728 restore heaps from database, which takes precedence over file-system;
wenzelm
parents: 78193
diff changeset
   194
  }
76991
6a078c80eab6 clarified modules;
wenzelm
parents:
diff changeset
   195
}