If a plugin's database tables have not been created, simply omit that
part of the status report.
When a log file rolls over, copy it to <name>.<start>.<end> in an archive dir
Test and fixes for when no archive directory is set.
Correcting checkable counts -- only count records where last_check <> 0.
Test for loading data from the database into a Dimension object.
Simplify tests for exceptions with assertRaisesMsg().
Test for Checkable.fd_parse() when the file is empty, fixed fd_parse
to handle this case properly.
The purge table is examined differently from the migr table. We just
want to look for purge locks there. That will be implemented shortly
in a future commit.
'epoch' turns YYYY.mmdd.HH.MM.SS into an epoch time. 'ymd' does the
opposite, converting an epoch time to YYYY.mmdd HH:MM:SS.
Order MPRA reports by record_create_time. Update mpra table to record
type (migr or purge), time of scan, start of time interval being
examined, end of time interval, and number of hits in the interval.
Update 'mpra age' to accept ymdhms format for -s and -e
Expand the formats that util.epoch() can handle.
Using the expanded formats
Implement 'mpra history'
 - Look for/report expired purge locks.
 - Improved time marks for mpra reports.
 - If the admin moves the configured age back in time, we need to
   reset the start of the interval to the beginning of time rather
   than searching on an empty intersection. Redefine 'recent' to be
   the end time associated with the max scan time rather than max end
   time.