use arguments::JOBLOG_8601;
use numtoa::NumToA;
use std::fs::File;
use std::io::{Write, BufWriter};
use time::{at, Timespec};
pub struct JobLog {
pub job_id: usize,
pub start_time: Timespec,
pub runtime: u64,
pub exit_value: i32,
pub signal: i32,
pub flags: u16,
pub command: String
}
impl JobLog {
pub fn write_entry(&self, joblog: &mut File, id_buffer: &mut [u8], pad: usize) {
let mut joblog = BufWriter::new(joblog);
let mut index = (self.job_id + 1).numtoa(10, id_buffer);
let _ = joblog.write(&id_buffer[index..]);
for _ in 0..pad - (20 - index) {
let _ = joblog.write(b" ");
}
if self.flags & JOBLOG_8601 != 0 {
let tm = at(self.start_time);
let _ = write!(joblog, "{}-{:02}-{:02} {:02}:{:02}:{:02} ", 1900+tm.tm_year, 1+tm.tm_mon,
tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
} else {
index = self.start_time.sec.numtoa(10, id_buffer);
let _ = joblog.write(&id_buffer[index..]);
let _ = joblog.write(b".");
let decimal = (self.start_time.nsec % 1_000_000_000) / 1_000_000;
if decimal == 0 {
let _ = joblog.write(b"000");
} else {
index = decimal.numtoa(10, id_buffer);
match 20 - index {
1 => { let _ = joblog.write(b"00"); },
2 => { let _ = joblog.write(b"0"); },
_ => (),
};
let _ = joblog.write(&id_buffer[index..]);
}
let _ = joblog.write(b" ");
}
index = (self.runtime / 1_000_000_000).numtoa(10, id_buffer);
for _ in 0..6 - (20 - index) {
let _ = joblog.write(b" ");
}
let _ = joblog.write(&id_buffer[index..]);
let _ = joblog.write(b".");
let decimal = (self.runtime % 1_000_000_000) / 1_000_000;
if decimal == 0 {
let _ = joblog.write(b"000");
} else {
index = decimal.numtoa(10, id_buffer);
match 20 - index {
1 => { let _ = joblog.write(b"00"); },
2 => { let _ = joblog.write(b"0"); },
_ => (),
};
let _ = joblog.write(&id_buffer[index..]);
}
let _ = joblog.write(b" ");
index = self.exit_value.numtoa(10, id_buffer);
let _ = joblog.write(&id_buffer[index..]);
for _ in 0..9 - (20 - index) {
let _ = joblog.write(b" ");
}
index = self.signal.numtoa(10, id_buffer);
let _ = joblog.write(&id_buffer[index..]);
for _ in 0..8 - (20 - index) {
let _ = joblog.write(b" ");
}
let _ = joblog.write(self.command.as_bytes());
let _ = joblog.write(b"\n");
}
}
pub fn create(file: &mut File, padding: usize, flags: u16) {
let mut joblog = BufWriter::new(file);
let id_column_resize = if padding < 10 { 0 } else { padding - 10 };
let _ = joblog.write(b"Sequence ");
for _ in 0..id_column_resize { let _ = joblog.write(b" "); }
if flags & JOBLOG_8601 != 0 {
let _ = joblog.write(b"StartTime(ISO-8601) ");
} else {
let _ = joblog.write(b"StartTime(s) ");
}
let _ = joblog.write(b"Runtime(s) ExitVal Signal Command\n");
}