src/Pure/Thy/export.scala
changeset 68104 3795f67716e6
parent 68103 c5764b8b2a87
child 68115 23c6ae3dd3a0
equal deleted inserted replaced
68103:c5764b8b2a87 68104:3795f67716e6
    31     val select = Data.table.select(List(Data.name), Data.where_equal(session_name, theory_name))
    31     val select = Data.table.select(List(Data.name), Data.where_equal(session_name, theory_name))
    32     db.using_statement(select)(stmt =>
    32     db.using_statement(select)(stmt =>
    33       stmt.execute_query().iterator(res => res.string(Data.name)).toList)
    33       stmt.execute_query().iterator(res => res.string(Data.name)).toList)
    34   }
    34   }
    35 
    35 
       
    36   def message(msg: String, theory_name: String, name: String): String =
       
    37     msg + " " + quote(name) + " for theory " + quote(theory_name)
       
    38 
    36   sealed case class Entry(
    39   sealed case class Entry(
    37     session_name: String,
    40     session_name: String,
    38     theory_name: String,
    41     theory_name: String,
    39     name: String,
    42     name: String,
    40     compressed: Boolean,
    43     compressed: Boolean,
    41     body: Future[Bytes])
    44     body: Future[Bytes])
    42   {
    45   {
    43     override def toString: String = theory_name + ":" + name
    46     override def toString: String = theory_name + ":" + name
    44 
       
    45     def message(msg: String): String =
       
    46       msg + " " + quote(name) + " for theory " + quote(theory_name)
       
    47 
    47 
    48     def write(db: SQL.Database)
    48     def write(db: SQL.Database)
    49     {
    49     {
    50       val bytes = body.join
    50       val bytes = body.join
    51       db.using_statement(Data.table.insert())(stmt =>
    51       db.using_statement(Data.table.insert())(stmt =>
    77       if (res.next()) {
    77       if (res.next()) {
    78         val compressed = res.bool(Data.compressed)
    78         val compressed = res.bool(Data.compressed)
    79         val body = res.bytes(Data.body)
    79         val body = res.bytes(Data.body)
    80         Entry(session_name, theory_name, name, compressed, Future.value(body))
    80         Entry(session_name, theory_name, name, compressed, Future.value(body))
    81       }
    81       }
    82       else error(Entry(session_name, theory_name, name, false, Future.value(Bytes.empty)).message("Bad export"))
    82       else error(message("Bad export", theory_name, name))
    83     })
    83     })
    84   }
    84   }
    85 
    85 
    86 
    86 
    87   /* database consumer thread */
    87   /* database consumer thread */
    98       Consumer_Thread.fork(name = "export")(consume = (entry: Entry) =>
    98       Consumer_Thread.fork(name = "export")(consume = (entry: Entry) =>
    99         {
    99         {
   100           entry.body.join
   100           entry.body.join
   101           db.transaction {
   101           db.transaction {
   102             if (read_names(db, entry.session_name, entry.theory_name).contains(entry.name)) {
   102             if (read_names(db, entry.session_name, entry.theory_name).contains(entry.name)) {
   103               export_errors.change(errs => entry.message("Duplicate export") :: errs)
   103               val err = message("Duplicate export", entry.theory_name, entry.name)
       
   104               export_errors.change(errs => err :: errs)
   104             }
   105             }
   105             else entry.write(db)
   106             else entry.write(db)
   106           }
   107           }
   107           true
   108           true
   108         })
   109         })