The way the program flow is right now, the Master agent checks the master
DB first, then the relay, then starts copying. Because of the way we have
MySQL set up as a master, there is a point in the program where if it
fails without completing, some data will never be copied over to the relay
because it resets the time range to copy. I added a column in the MySQL
CTIDtoTimestamp table that gets a 0 written to it when a line is inserted,
then in the cleanup init table (the last method in the Master.Run()
function) it writes a 1. I know this isn't great design, but until I have
time to rewrite more of it I don't want to mess with the program flow and
risk breaking our current working Tesla agents, so I'm leaving this one
until a different sprint.

Not sure why we were originally casting it to an Int64 in the first place,
although I seem to remember that MySQL stored a lot of things as Int64
where MSSQL didn't. Anyways, it was throwing cast errors and now it's not.

There are some cast errors popping up after ordering by ordinal_position,
so we're also ordering by table name first since the code looks like it
depends on all of the columns in a table being grouped.

Even though the columns normally come back from information_schema in the
correct order, we ran into a place where apparently they're not getting
called in the correct order, so we're changing the query that
MySQLDataUtils uses to get the fields and specifying to order by
ORDINAL_POSITION.

In MySQL , there's a field called longtext that has the CHARACTER_MAXIMUM_SIZE
defined as some huge number that's longer than an Int32 can handle, so we're
changing the struct and a couple of methods to use Int64s and Nullable<Int64>s
instead.