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 => |