src/Pure/Thy/sessions.scala
changeset 65934 5f202ba9f590
parent 65857 5d29d93766ef
child 65937 fde7b5d209d5
equal deleted inserted replaced
65933:f3e4f9e6c485 65934:5f202ba9f590
   733     // Build_Log.Session_Info
   733     // Build_Log.Session_Info
   734     val session_timing = SQL.Column.bytes("session_timing")
   734     val session_timing = SQL.Column.bytes("session_timing")
   735     val command_timings = SQL.Column.bytes("command_timings")
   735     val command_timings = SQL.Column.bytes("command_timings")
   736     val ml_statistics = SQL.Column.bytes("ml_statistics")
   736     val ml_statistics = SQL.Column.bytes("ml_statistics")
   737     val task_statistics = SQL.Column.bytes("task_statistics")
   737     val task_statistics = SQL.Column.bytes("task_statistics")
       
   738     val errors = SQL.Column.bytes("errors")
   738     val build_log_columns =
   739     val build_log_columns =
   739       List(session_name, session_timing, command_timings, ml_statistics, task_statistics)
   740       List(session_name, session_timing, command_timings, ml_statistics, task_statistics, errors)
   740 
   741 
   741     // Build.Session_Info
   742     // Build.Session_Info
   742     val sources = SQL.Column.string("sources")
   743     val sources = SQL.Column.string("sources")
   743     val input_heaps = SQL.Column.string("input_heaps")
   744     val input_heaps = SQL.Column.string("input_heaps")
   744     val output_heap = SQL.Column.string("output_heap")
   745     val output_heap = SQL.Column.string("output_heap")
   811         error("Unknown logic " + quote(name) + " -- no heap file found in:\n" +
   812         error("Unknown logic " + quote(name) + " -- no heap file found in:\n" +
   812           cat_lines(input_dirs.map(dir => "  " + dir.expand.implode)))
   813           cat_lines(input_dirs.map(dir => "  " + dir.expand.implode)))
   813 
   814 
   814 
   815 
   815     /* session info */
   816     /* session info */
       
   817 
       
   818     def compress_errors(errors: List[String]): Option[Bytes] =
       
   819       if (errors.isEmpty) None
       
   820       else Some(Bytes(YXML.string_of_body(XML.Encode.list(XML.Encode.string)(errors))).compress())
       
   821 
       
   822     def uncompress_errors(bytes: Bytes): List[String] =
       
   823       if (bytes.isEmpty) Nil
       
   824       else XML.Decode.list(YXML.string_of_body(_))(YXML.parse_body(bytes.uncompress().text))
   816 
   825 
   817     def write_session_info(
   826     def write_session_info(
   818       db: SQL.Database,
   827       db: SQL.Database,
   819       name: String,
   828       name: String,
   820       build_log: Build_Log.Session_Info,
   829       build_log: Build_Log.Session_Info,
   829           stmt.string(1) = name
   838           stmt.string(1) = name
   830           stmt.bytes(2) = Properties.encode(build_log.session_timing)
   839           stmt.bytes(2) = Properties.encode(build_log.session_timing)
   831           stmt.bytes(3) = Properties.compress(build_log.command_timings)
   840           stmt.bytes(3) = Properties.compress(build_log.command_timings)
   832           stmt.bytes(4) = Properties.compress(build_log.ml_statistics)
   841           stmt.bytes(4) = Properties.compress(build_log.ml_statistics)
   833           stmt.bytes(5) = Properties.compress(build_log.task_statistics)
   842           stmt.bytes(5) = Properties.compress(build_log.task_statistics)
   834           stmt.string(6) = cat_lines(build.sources)
   843           stmt.bytes(6) = compress_errors(build_log.errors)
   835           stmt.string(7) = cat_lines(build.input_heaps)
   844           stmt.string(7) = cat_lines(build.sources)
   836           stmt.string(8) = build.output_heap getOrElse ""
   845           stmt.string(8) = cat_lines(build.input_heaps)
   837           stmt.int(9) = build.return_code
   846           stmt.string(9) = build.output_heap getOrElse ""
       
   847           stmt.int(10) = build.return_code
   838           stmt.execute()
   848           stmt.execute()
   839         })
   849         })
   840       }
   850       }
   841     }
   851     }
   842 
   852 
   859     {
   869     {
   860       Build_Log.Session_Info(
   870       Build_Log.Session_Info(
   861         session_timing = read_session_timing(db, name),
   871         session_timing = read_session_timing(db, name),
   862         command_timings = if (command_timings) read_command_timings(db, name) else Nil,
   872         command_timings = if (command_timings) read_command_timings(db, name) else Nil,
   863         ml_statistics = if (ml_statistics) read_ml_statistics(db, name) else Nil,
   873         ml_statistics = if (ml_statistics) read_ml_statistics(db, name) else Nil,
   864         task_statistics = if (task_statistics) read_task_statistics(db, name) else Nil)
   874         task_statistics = if (task_statistics) read_task_statistics(db, name) else Nil,
       
   875         errors = uncompress_errors(read_bytes(db, name, Session_Info.errors)))
   865     }
   876     }
   866 
   877 
   867     def read_build(db: SQL.Database, name: String): Option[Build.Session_Info] =
   878     def read_build(db: SQL.Database, name: String): Option[Build.Session_Info] =
   868       db.using_statement(Session_Info.table.select(Session_Info.build_columns,
   879       db.using_statement(Session_Info.table.select(Session_Info.build_columns,
   869         Session_Info.session_name.where_equal(name)))(stmt =>
   880         Session_Info.session_name.where_equal(name)))(stmt =>