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 |