src/Pure/Admin/build_log.scala
changeset 65643 a54371226182
parent 65642 1423cbbc542d
child 65645 2c704ae04db1
equal deleted inserted replaced
65642:1423cbbc542d 65643:a54371226182
   432   object Session_Status extends Enumeration
   432   object Session_Status extends Enumeration
   433   {
   433   {
   434     val existing, finished, failed, cancelled = Value
   434     val existing, finished, failed, cancelled = Value
   435   }
   435   }
   436 
   436 
       
   437   object Session_Entry
       
   438   {
       
   439     val empty: Session_Entry = Session_Entry()
       
   440   }
       
   441 
   437   sealed case class Session_Entry(
   442   sealed case class Session_Entry(
   438     chapter: String,
   443     chapter: String = "",
   439     groups: List[String],
   444     groups: List[String] = Nil,
   440     threads: Option[Int],
   445     threads: Option[Int] = None,
   441     timing: Timing,
   446     timing: Timing = Timing.zero,
   442     ml_timing: Timing,
   447     ml_timing: Timing = Timing.zero,
   443     heap_size: Option[Long],
   448     heap_size: Option[Long] = None,
   444     status: Session_Status.Value,
   449     status: Option[Session_Status.Value] = None,
   445     ml_statistics: List[Properties.T])
   450     ml_statistics: List[Properties.T] = Nil)
   446   {
   451   {
   447     def proper_chapter: Option[String] = if (chapter == "") None else Some(chapter)
   452     def proper_chapter: Option[String] = if (chapter == "") None else Some(chapter)
   448     def proper_groups: Option[String] = if (groups.isEmpty) None else Some(cat_lines(groups))
   453     def proper_groups: Option[String] = if (groups.isEmpty) None else Some(cat_lines(groups))
   449     def finished: Boolean = status == Session_Status.finished
   454     def finished: Boolean = status == Some(Session_Status.finished)
   450   }
   455   }
   451 
   456 
   452   object Build_Info
   457   object Build_Info
   453   {
   458   {
   454     val session_name = SQL.Column.string("session_name", primary_key = true)
   459     val session_name = SQL.Column.string("session_name", primary_key = true)
   466     val ml_statistics = SQL.Column.bytes("ml_statistics")
   471     val ml_statistics = SQL.Column.bytes("ml_statistics")
   467 
   472 
   468     val table = SQL.Table("isabelle_build_log_build_info",
   473     val table = SQL.Table("isabelle_build_log_build_info",
   469       List(Meta_Info.log_name, session_name, chapter, groups, threads, timing_elapsed, timing_cpu,
   474       List(Meta_Info.log_name, session_name, chapter, groups, threads, timing_elapsed, timing_cpu,
   470         timing_gc, ml_timing_elapsed, ml_timing_cpu, ml_timing_gc, heap_size, status, ml_statistics))
   475         timing_gc, ml_timing_elapsed, ml_timing_cpu, ml_timing_gc, heap_size, status, ml_statistics))
   471 
       
   472     val table0 = table.copy(columns = table.columns.take(2))
       
   473   }
   476   }
   474 
   477 
   475   sealed case class Build_Info(sessions: Map[String, Session_Entry])
   478   sealed case class Build_Info(sessions: Map[String, Session_Entry])
   476   {
   479   {
   477     def session(name: String): Session_Entry = sessions(name)
   480     def session(name: String): Session_Entry = sessions(name)
   589               Session_Status.finished
   592               Session_Status.finished
   590             else if (started(name)) Session_Status.failed
   593             else if (started(name)) Session_Status.failed
   591             else Session_Status.existing
   594             else Session_Status.existing
   592           val entry =
   595           val entry =
   593             Session_Entry(
   596             Session_Entry(
   594               chapter.getOrElse(name, ""),
   597               chapter = chapter.getOrElse(name, ""),
   595               groups.getOrElse(name, Nil),
   598               groups = groups.getOrElse(name, Nil),
   596               threads.get(name),
   599               threads = threads.get(name),
   597               timing.getOrElse(name, Timing.zero),
   600               timing = timing.getOrElse(name, Timing.zero),
   598               ml_timing.getOrElse(name, Timing.zero),
   601               ml_timing = ml_timing.getOrElse(name, Timing.zero),
   599               heap_sizes.get(name),
   602               heap_size = heap_sizes.get(name),
   600               status,
   603               status = Some(status),
   601               ml_statistics.getOrElse(name, Nil).reverse)
   604               ml_statistics = ml_statistics.getOrElse(name, Nil).reverse)
   602           (name -> entry)
   605           (name -> entry)
   603         }):_*)
   606         }):_*)
   604     Build_Info(sessions)
   607     Build_Info(sessions)
   605   }
   608   }
   606 
   609 
   679       val build_info = log_file.parse_build_info()
   682       val build_info = log_file.parse_build_info()
   680       val table = Build_Info.table
   683       val table = Build_Info.table
   681 
   684 
   682       db.transaction {
   685       db.transaction {
   683         using(db.delete(table, Meta_Info.log_name.sql_where_equal(log_file.name)))(_.execute)
   686         using(db.delete(table, Meta_Info.log_name.sql_where_equal(log_file.name)))(_.execute)
   684 
   687         using(db.insert(table))(stmt =>
   685         if (build_info.sessions.isEmpty) {
   688         {
   686           using(db.insert(Build_Info.table0))(stmt =>
   689           val iterator =
   687           {
   690             if (build_info.sessions.isEmpty) Iterator("" -> Session_Entry.empty)
       
   691             else build_info.sessions.iterator
       
   692           for ((session_name, session) <- iterator) {
   688             db.set_string(stmt, 1, log_file.name)
   693             db.set_string(stmt, 1, log_file.name)
   689             db.set_string(stmt, 2, "")
   694             db.set_string(stmt, 2, session_name)
       
   695             db.set_string(stmt, 3, session.proper_chapter)
       
   696             db.set_string(stmt, 4, session.proper_groups)
       
   697             db.set_int(stmt, 5, session.threads)
       
   698             db.set_long(stmt, 6, session.timing.elapsed.proper_ms)
       
   699             db.set_long(stmt, 7, session.timing.cpu.proper_ms)
       
   700             db.set_long(stmt, 8, session.timing.gc.proper_ms)
       
   701             db.set_long(stmt, 9, session.ml_timing.elapsed.proper_ms)
       
   702             db.set_long(stmt, 10, session.ml_timing.cpu.proper_ms)
       
   703             db.set_long(stmt, 11, session.ml_timing.gc.proper_ms)
       
   704             db.set_long(stmt, 12, session.heap_size)
       
   705             db.set_string(stmt, 13, session.status.map(_.toString))
       
   706             db.set_bytes(stmt, 14, compress_properties(session.ml_statistics).proper)
   690             stmt.execute()
   707             stmt.execute()
   691           })
   708           }
   692         }
   709         })
   693         else {
       
   694           using(db.insert(table))(stmt =>
       
   695           {
       
   696             for ((session_name, session) <- build_info.sessions.iterator) {
       
   697               db.set_string(stmt, 1, log_file.name)
       
   698               db.set_string(stmt, 2, session_name)
       
   699               db.set_string(stmt, 3, session.proper_chapter)
       
   700               db.set_string(stmt, 4, session.proper_groups)
       
   701               db.set_int(stmt, 5, session.threads)
       
   702               db.set_long(stmt, 6, session.timing.elapsed.proper_ms)
       
   703               db.set_long(stmt, 7, session.timing.cpu.proper_ms)
       
   704               db.set_long(stmt, 8, session.timing.gc.proper_ms)
       
   705               db.set_long(stmt, 9, session.ml_timing.elapsed.proper_ms)
       
   706               db.set_long(stmt, 10, session.ml_timing.cpu.proper_ms)
       
   707               db.set_long(stmt, 11, session.ml_timing.gc.proper_ms)
       
   708               db.set_long(stmt, 12, session.heap_size)
       
   709               db.set_string(stmt, 13, session.status.toString)
       
   710               db.set_bytes(stmt, 14, compress_properties(session.ml_statistics).proper)
       
   711               stmt.execute()
       
   712             }
       
   713           })
       
   714         }
       
   715       }
   710       }
   716     }
   711     }
   717 
   712 
   718     def write_info(db: SQL.Database, files: List[JFile], group: Int = 100)
   713     def write_info(db: SQL.Database, files: List[JFile], group: Int = 100)
   719     {
   714     {
   808                 ml_timing =
   803                 ml_timing =
   809                   Timing(Time.ms(db.long(rs, Build_Info.ml_timing_elapsed)),
   804                   Timing(Time.ms(db.long(rs, Build_Info.ml_timing_elapsed)),
   810                     Time.ms(db.long(rs, Build_Info.ml_timing_cpu)),
   805                     Time.ms(db.long(rs, Build_Info.ml_timing_cpu)),
   811                     Time.ms(db.long(rs, Build_Info.ml_timing_gc))),
   806                     Time.ms(db.long(rs, Build_Info.ml_timing_gc))),
   812                 heap_size = db.get(rs, Build_Info.heap_size, db.long _),
   807                 heap_size = db.get(rs, Build_Info.heap_size, db.long _),
   813                 status = Session_Status.withName(db.string(rs, Build_Info.status)),
   808                 status =
       
   809                   db.get(rs, Build_Info.status, db.string _).
       
   810                     map(Session_Status.withName(_)),
   814                 ml_statistics =
   811                 ml_statistics =
   815                   if (ml_statistics) uncompress_properties(db.bytes(rs, Build_Info.ml_statistics))
   812                   if (ml_statistics) uncompress_properties(db.bytes(rs, Build_Info.ml_statistics))
   816                   else Nil)
   813                   else Nil)
   817             session_name -> session_entry
   814             session_name -> session_entry
   818           }).toMap
   815           }).toMap