diff --git a/Program.cs b/Program.cs index 7b701f8..3f92cbb 100644 --- a/Program.cs +++ b/Program.cs @@ -1,313 +1,313 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Text; -using System.Text.RegularExpressions; -using CumulusMX; -using MySqlConnector; - -namespace ExportToMySQL -{ - internal class Program - { - private static string MySqlHost; - private static int MySqlPort; - private static string MySqlUser; - private static string MySqlPass; - private static string MySqlDatabase; - private static string MySqlMonthlyTable; - private static string MySqlDayfileTable; - - private static string[] compassp = { "N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW" }; - - private static MySqlCommand cmd; - - private static void Main(string[] args) - { - string param = ""; - MySqlConnection mySqlConn = new MySqlConnection(); - - if (args.Length == 0) - { - Console.WriteLine("Specify 'dayfile', 'monthly', or the path to a monthly log file"); - Environment.Exit(0); - } - else - { - param = args[0]; - Console.WriteLine("Parameter: " + param); - } - - if (!File.Exists("Cumulus.ini")) - { - Console.WriteLine("Cannot find Cumulus.ini"); - Environment.Exit(0); - } - - IniFile ini = new IniFile("Cumulus.ini"); - - MySqlHost = ini.GetValue("MySQL", "Host", "127.0.0.1"); - MySqlPort = ini.GetValue("MySQL", "Port", 3306); - MySqlUser = ini.GetValue("MySQL", "User", ""); - MySqlPass = ini.GetValue("MySQL", "Pass", ""); - MySqlDatabase = ini.GetValue("MySQL", "Database", "database"); - MySqlMonthlyTable = ini.GetValue("MySQL", "MonthlyTable", "Monthly"); - MySqlDayfileTable = ini.GetValue("MySQL", "DayfileTable", "Dayfile"); - - if (File.Exists("strings.ini")) - { - IniFile iniStrs = new IniFile("strings.ini"); - compassp[0] = iniStrs.GetValue("Compass", "N", "N"); - compassp[1] = iniStrs.GetValue("Compass", "NNE", "NNE"); - compassp[2] = iniStrs.GetValue("Compass", "NE", "NE"); - compassp[3] = iniStrs.GetValue("Compass", "ENE", "ENE"); - compassp[4] = iniStrs.GetValue("Compass", "E", "E"); - compassp[5] = iniStrs.GetValue("Compass", "ESE", "ESE"); - compassp[6] = iniStrs.GetValue("Compass", "SE", "SE"); - compassp[7] = iniStrs.GetValue("Compass", "SSE", "SSE"); - compassp[8] = iniStrs.GetValue("Compass", "S", "S"); - compassp[9] = iniStrs.GetValue("Compass", "SSW", "SSW"); - compassp[10] = iniStrs.GetValue("Compass", "SW", "SW"); - compassp[11] = iniStrs.GetValue("Compass", "WSW", "WSW"); - compassp[12] = iniStrs.GetValue("Compass", "W", "W"); - compassp[13] = iniStrs.GetValue("Compass", "WNW", "WNW"); - compassp[14] = iniStrs.GetValue("Compass", "NW", "NW"); - compassp[15] = iniStrs.GetValue("Compass", "NNW", "NNW"); - } - - try - { - mySqlConn = new MySqlConnection($"server={MySqlHost};port={MySqlPort};user={MySqlUser};password={MySqlPass};database={MySqlDatabase}"); - } - catch (Exception ex) - { - Console.WriteLine("Error encountered opening MySQL connection"); - Console.WriteLine(ex.Message); - Environment.Exit(0); - } - - cmd = new MySqlCommand - { - Connection = mySqlConn - }; - - try - { - mySqlConn.Open(); - } - catch (Exception ex) - { - Console.WriteLine("Error encountered opening MySQL connection"); - Console.WriteLine(ex.Message); - Environment.Exit(0); - } - - - if (param.ToLower().Equals("dayfile")) - { - DoDayfileExport(); - } - else if (param.ToLower().Equals("monthly")) - { - DoMonthlyExport(); - } - else - { - if (File.Exists(param)) - { - DoSingleMonthlyExport(param); - } - else - { - Console.WriteLine("Cannot find file: " + param); - } - } - - mySqlConn.Close(); - - Console.WriteLine(); - } - - private static void DoSingleMonthlyExport(string filename) - { - var StartOfMonthlyInsertSQL = "INSERT IGNORE INTO " + MySqlMonthlyTable + " (LogDateTime,Temp,Humidity,Dewpoint,Windspeed,Windgust,Windbearing,RainRate,TodayRainSoFar,Pressure,Raincounter,InsideTemp,InsideHumidity,LatestWindGust,WindChill,HeatIndex,UVindex,SolarRad,Evapotrans,AnnualEvapTran,ApparentTemp,MaxSolarRad,HrsSunShine,CurrWindBearing,RG11rain,RainSinceMidnight,FeelsLike,Humidex,WindbearingSym,CurrWindBearingSym)"; - - using (var sr = new StreamReader(filename)) - { - const int MaxBatchSize = 1000; - StringBuilder sb = new StringBuilder("", MaxBatchSize * 2100); - - int linenum = 0; - do - { - sb.Clear(); - sb.Append(StartOfMonthlyInsertSQL + " Values "); - - // now process each record in the file - try - { - for (int a = 0; a < MaxBatchSize && !(sr.EndOfStream); a++) - { - var line = sr.ReadLine(); - linenum++; - var st = new List(Regex.Split(line, CultureInfo.CurrentCulture.TextInfo.ListSeparator)); - - var logfiledate = st[0]; - // 01234567 - // dd/mm/yy - - var logfiletime = st[1]; - // 01234 - // hh:mm - - //Console.WriteLine(st[0]); - - string sqldate = logfiledate.Substring(6, 2) + '-' + logfiledate.Substring(3, 2) + '-' + logfiledate.Substring(0, 2) + ' ' + logfiletime.Substring(0,2) + ':'+ logfiletime.Substring(3,2); - - Console.Write(sqldate + "\r"); - sb.Append($"('{sqldate}',"); - - for (int i = 2; i < 29; i++) - { - if (i < st.Count && !string.IsNullOrEmpty(st[i])) - { - sb.Append($"'{st[i].Replace(',', '.')}',"); - } - else - { - sb.Append("NULL,"); - } - } - sb.Append($"'{CompassPoint(Convert.ToInt32(st[7]))}',"); - if (st.Count > 24 && !string.IsNullOrEmpty(st[24])) - { - sb.Append($"'{CompassPoint(Convert.ToInt32(st[24]))}'),"); - } - else - { - sb.Append("NULL),"); - } - } // End For loop for the batch - - // remove the last "," - sb.Length--; - sb.AppendLine(";"); - - cmd.CommandText = sb.ToString(); - //Console.WriteLine(sb.ToString()); - - int aff = cmd.ExecuteNonQuery(); - - //Console.WriteLine(); - } - catch (Exception ex) - { - Console.WriteLine(ex.Message); - } - } while (!(sr.EndOfStream)); - } - } - - private static void DoMonthlyExport() - { - for (int y = 2000; y < 2100; y++) - { - for (int m = 1; m < 12; m++) - { - DateTime logfiledate = new DateTime(y, m, 1); - - var datestring = logfiledate.ToString("MMMyy").Replace(".", ""); - - var filename = "data" + Path.DirectorySeparatorChar + datestring + "log.txt"; - - if (File.Exists(filename)) - { - DoSingleMonthlyExport(filename); - } - } - } - } - - private static void DoDayfileExport() - { - var filename = "data" + Path.DirectorySeparatorChar + "dayfile.txt"; - - Console.WriteLine("Exporting dayfile: "+filename); - - if (File.Exists(filename)) - { - Console.WriteLine("Dayfile exists, beginning export"); - string StartOfDayfileInsertSQL = "INSERT IGNORE INTO " + MySqlDayfileTable + " (LogDate,HighWindGust,HWindGBear,THWindG,MinTemp,TMinTemp,MaxTemp,TMaxTemp,MinPress,TMinPress,MaxPress,TMaxPress,MaxRainRate,TMaxRR,TotRainFall,AvgTemp,TotWindRun,HighAvgWSpeed,THAvgWSpeed,LowHum,TLowHum,HighHum,THighHum,TotalEvap,HoursSun,HighHeatInd,THighHeatInd,HighAppTemp,THighAppTemp,LowAppTemp,TLowAppTemp,HighHourRain,THighHourRain,LowWindChill,TLowWindChill,HighDewPoint,THighDewPoint,LowDewPoint,TLowDewPoint,DomWindDir,HeatDegDays,CoolDegDays,HighSolarRad,THighSolarRad,HighUV,THighUV,MaxFeelsLike,TMaxFeelsLike,MinFeelsLike,TMinFeelsLike,MaxHumidex,TMaxHumidex,HWindGBearSym,DomWindDirSym)"; - - int linenum = 0; - - using (var sr = new StreamReader(filename)) - { - Console.WriteLine("Dayfile opened"); - - do - { - // now process each record in the file - try - { - var line = sr.ReadLine(); - linenum++; - var st = new List(Regex.Split(line, CultureInfo.CurrentCulture.TextInfo.ListSeparator)); - - var dayfiledate = st[0]; - // 01234567 - // dd/mm/yy - - string sqldate = dayfiledate.Substring(6, 2) + '-' + dayfiledate.Substring(3, 2) + '-' + dayfiledate.Substring(0, 2); - - Console.Write(sqldate + "\r"); - - StringBuilder sb = new StringBuilder(StartOfDayfileInsertSQL + " Values('" + sqldate + "',"); - - for (int i = 1; i < 52; i++) - { - if (i < st.Count && !string.IsNullOrEmpty(st[i])) - { - sb.Append("'" + st[i].Replace(',', '.') + "',"); - } - else - { - sb.Append("NULL,"); - } - } - sb.Append("'" + CompassPoint(Convert.ToInt32(st[2])) + "',"); - if (st.Count > 39 && !string.IsNullOrEmpty(st[39])) - { - sb.Append("'" + CompassPoint(Convert.ToInt32(st[39])) + "')"); - } - else - { - sb.Append("NULL)"); - } - - cmd.CommandText = sb.ToString(); - //Console.WriteLine(sb.ToString()); - - int aff = cmd.ExecuteNonQuery(); - - //Console.WriteLine(); - } - catch (Exception ex) - { - Console.WriteLine(ex.Message); - } - } while (!(sr.EndOfStream)); - } - - Console.WriteLine(); - Console.WriteLine(linenum+" entries processed"); - } - } - - private static string CompassPoint(int bearing) - { - return bearing == 0 ? "-" : compassp[(((bearing * 100) + 1125) % 36000) / 2250]; - } - } -} +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; +using CumulusMX; +using MySqlConnector; + +namespace ExportToMySQL +{ + internal class Program + { + private static string MySqlHost; + private static int MySqlPort; + private static string MySqlUser; + private static string MySqlPass; + private static string MySqlDatabase; + private static string MySqlMonthlyTable; + private static string MySqlDayfileTable; + + private static string[] compassp = { "N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW" }; + + private static MySqlCommand cmd; + + private static void Main(string[] args) + { + string param = ""; + MySqlConnection mySqlConn = new MySqlConnection(); + + if (args.Length == 0) + { + Console.WriteLine("Specify 'dayfile', 'monthly', or the path to a monthly log file"); + Environment.Exit(0); + } + else + { + param = args[0]; + Console.WriteLine("Parameter: " + param); + } + + if (!File.Exists("Cumulus.ini")) + { + Console.WriteLine("Cannot find Cumulus.ini"); + Environment.Exit(0); + } + + IniFile ini = new IniFile("Cumulus.ini"); + + MySqlHost = ini.GetValue("MySQL", "Host", "127.0.0.1"); + MySqlPort = ini.GetValue("MySQL", "Port", 3306); + MySqlUser = ini.GetValue("MySQL", "User", ""); + MySqlPass = ini.GetValue("MySQL", "Pass", ""); + MySqlDatabase = ini.GetValue("MySQL", "Database", "database"); + MySqlMonthlyTable = ini.GetValue("MySQL", "MonthlyTable", "Monthly"); + MySqlDayfileTable = ini.GetValue("MySQL", "DayfileTable", "Dayfile"); + + if (File.Exists("strings.ini")) + { + IniFile iniStrs = new IniFile("strings.ini"); + compassp[0] = iniStrs.GetValue("Compass", "N", "N"); + compassp[1] = iniStrs.GetValue("Compass", "NNE", "NNE"); + compassp[2] = iniStrs.GetValue("Compass", "NE", "NE"); + compassp[3] = iniStrs.GetValue("Compass", "ENE", "ENE"); + compassp[4] = iniStrs.GetValue("Compass", "E", "E"); + compassp[5] = iniStrs.GetValue("Compass", "ESE", "ESE"); + compassp[6] = iniStrs.GetValue("Compass", "SE", "SE"); + compassp[7] = iniStrs.GetValue("Compass", "SSE", "SSE"); + compassp[8] = iniStrs.GetValue("Compass", "S", "S"); + compassp[9] = iniStrs.GetValue("Compass", "SSW", "SSW"); + compassp[10] = iniStrs.GetValue("Compass", "SW", "SW"); + compassp[11] = iniStrs.GetValue("Compass", "WSW", "WSW"); + compassp[12] = iniStrs.GetValue("Compass", "W", "W"); + compassp[13] = iniStrs.GetValue("Compass", "WNW", "WNW"); + compassp[14] = iniStrs.GetValue("Compass", "NW", "NW"); + compassp[15] = iniStrs.GetValue("Compass", "NNW", "NNW"); + } + + try + { + mySqlConn = new MySqlConnection($"server={MySqlHost};port={MySqlPort};user={MySqlUser};password={MySqlPass};database={MySqlDatabase}"); + } + catch (Exception ex) + { + Console.WriteLine("Error encountered opening MySQL connection"); + Console.WriteLine(ex.Message); + Environment.Exit(0); + } + + cmd = new MySqlCommand + { + Connection = mySqlConn + }; + + try + { + mySqlConn.Open(); + } + catch (Exception ex) + { + Console.WriteLine("Error encountered opening MySQL connection"); + Console.WriteLine(ex.Message); + Environment.Exit(0); + } + + + if (param.ToLower().Equals("dayfile")) + { + DoDayfileExport(); + } + else if (param.ToLower().Equals("monthly")) + { + DoMonthlyExport(); + } + else + { + if (File.Exists(param)) + { + DoSingleMonthlyExport(param); + } + else + { + Console.WriteLine("Cannot find file: " + param); + } + } + + mySqlConn.Close(); + + Console.WriteLine(); + } + + private static void DoSingleMonthlyExport(string filename) + { + var StartOfMonthlyInsertSQL = "INSERT IGNORE INTO " + MySqlMonthlyTable + " (LogDateTime,Temp,Humidity,Dewpoint,Windspeed,Windgust,Windbearing,RainRate,TodayRainSoFar,Pressure,Raincounter,InsideTemp,InsideHumidity,LatestWindGust,WindChill,HeatIndex,UVindex,SolarRad,Evapotrans,AnnualEvapTran,ApparentTemp,MaxSolarRad,HrsSunShine,CurrWindBearing,RG11rain,RainSinceMidnight,FeelsLike,Humidex,WindbearingSym,CurrWindBearingSym)"; + + using (var sr = new StreamReader(filename)) + { + const int MaxBatchSize = 1000; + StringBuilder sb = new StringBuilder("", MaxBatchSize * 2100); + + int linenum = 0; + do + { + sb.Clear(); + sb.Append(StartOfMonthlyInsertSQL + " Values "); + + // now process each record in the file + try + { + for (int a = 0; a < MaxBatchSize && !(sr.EndOfStream); a++) + { + var line = sr.ReadLine(); + linenum++; + var st = new List(Regex.Split(line, CultureInfo.CurrentCulture.TextInfo.ListSeparator)); + + var logfiledate = st[0]; + // 01234567 + // dd/mm/yy + + var logfiletime = st[1]; + // 01234 + // hh:mm + + //Console.WriteLine(st[0]); + + string sqldate = logfiledate.Substring(6, 2) + '-' + logfiledate.Substring(3, 2) + '-' + logfiledate.Substring(0, 2) + ' ' + logfiletime.Substring(0,2) + ':'+ logfiletime.Substring(3,2); + + Console.Write(sqldate + "\r"); + sb.Append($"('{sqldate}',"); + + for (int i = 2; i < 29; i++) + { + if (i < st.Count && !string.IsNullOrEmpty(st[i])) + { + sb.Append($"'{st[i].Replace(',', '.')}',"); + } + else + { + sb.Append("NULL,"); + } + } + sb.Append($"'{CompassPoint(Convert.ToInt32(st[7]))}',"); + if (st.Count > 24 && !string.IsNullOrEmpty(st[24])) + { + sb.Append($"'{CompassPoint(Convert.ToInt32(st[24]))}'),"); + } + else + { + sb.Append("NULL),"); + } + } // End For loop for the batch + + // remove the last "," + sb.Length--; + sb.AppendLine(";"); + + cmd.CommandText = sb.ToString(); + //Console.WriteLine(sb.ToString()); + + int aff = cmd.ExecuteNonQuery(); + + //Console.WriteLine(); + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + } while (!(sr.EndOfStream)); + } + } + + private static void DoMonthlyExport() + { + for (int y = 2000; y < 2100; y++) + { + for (int m = 1; m <= 12; m++) + { + DateTime logfiledate = new DateTime(y, m, 1); + + var datestring = logfiledate.ToString("MMMyy").Replace(".", ""); + + var filename = "data" + Path.DirectorySeparatorChar + datestring + "log.txt"; + + if (File.Exists(filename)) + { + DoSingleMonthlyExport(filename); + } + } + } + } + + private static void DoDayfileExport() + { + var filename = "data" + Path.DirectorySeparatorChar + "dayfile.txt"; + + Console.WriteLine("Exporting dayfile: "+filename); + + if (File.Exists(filename)) + { + Console.WriteLine("Dayfile exists, beginning export"); + string StartOfDayfileInsertSQL = "INSERT IGNORE INTO " + MySqlDayfileTable + " (LogDate,HighWindGust,HWindGBear,THWindG,MinTemp,TMinTemp,MaxTemp,TMaxTemp,MinPress,TMinPress,MaxPress,TMaxPress,MaxRainRate,TMaxRR,TotRainFall,AvgTemp,TotWindRun,HighAvgWSpeed,THAvgWSpeed,LowHum,TLowHum,HighHum,THighHum,TotalEvap,HoursSun,HighHeatInd,THighHeatInd,HighAppTemp,THighAppTemp,LowAppTemp,TLowAppTemp,HighHourRain,THighHourRain,LowWindChill,TLowWindChill,HighDewPoint,THighDewPoint,LowDewPoint,TLowDewPoint,DomWindDir,HeatDegDays,CoolDegDays,HighSolarRad,THighSolarRad,HighUV,THighUV,MaxFeelsLike,TMaxFeelsLike,MinFeelsLike,TMinFeelsLike,MaxHumidex,TMaxHumidex,HWindGBearSym,DomWindDirSym)"; + + int linenum = 0; + + using (var sr = new StreamReader(filename)) + { + Console.WriteLine("Dayfile opened"); + + do + { + // now process each record in the file + try + { + var line = sr.ReadLine(); + linenum++; + var st = new List(Regex.Split(line, CultureInfo.CurrentCulture.TextInfo.ListSeparator)); + + var dayfiledate = st[0]; + // 01234567 + // dd/mm/yy + + string sqldate = dayfiledate.Substring(6, 2) + '-' + dayfiledate.Substring(3, 2) + '-' + dayfiledate.Substring(0, 2); + + Console.Write(sqldate + "\r"); + + StringBuilder sb = new StringBuilder(StartOfDayfileInsertSQL + " Values('" + sqldate + "',"); + + for (int i = 1; i < 52; i++) + { + if (i < st.Count && !string.IsNullOrEmpty(st[i])) + { + sb.Append("'" + st[i].Replace(',', '.') + "',"); + } + else + { + sb.Append("NULL,"); + } + } + sb.Append("'" + CompassPoint(Convert.ToInt32(st[2])) + "',"); + if (st.Count > 39 && !string.IsNullOrEmpty(st[39])) + { + sb.Append("'" + CompassPoint(Convert.ToInt32(st[39])) + "')"); + } + else + { + sb.Append("NULL)"); + } + + cmd.CommandText = sb.ToString(); + //Console.WriteLine(sb.ToString()); + + int aff = cmd.ExecuteNonQuery(); + + //Console.WriteLine(); + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + } while (!(sr.EndOfStream)); + } + + Console.WriteLine(); + Console.WriteLine(linenum+" entries processed"); + } + } + + private static string CompassPoint(int bearing) + { + return bearing == 0 ? "-" : compassp[(((bearing * 100) + 1125) % 36000) / 2250]; + } + } +} diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index abcd7db..c953a3a 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -1,36 +1,36 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("ExportToMySQL")] -[assembly: AssemblyDescription("Exports Cumulus data files to MySQL")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("ExportToMySQL")] -[assembly: AssemblyCopyright("Copyright © 2015-2021")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("0669b8eb-ef10-4269-a8ab-6335bd7f5816")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.3.0.0")] -[assembly: AssemblyFileVersion("1.3.0.0")] +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ExportToMySQL")] +[assembly: AssemblyDescription("Exports Cumulus data files to MySQL")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ExportToMySQL")] +[assembly: AssemblyCopyright("Copyright © 2015-2021")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("0669b8eb-ef10-4269-a8ab-6335bd7f5816")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.3.1.0")] +[assembly: AssemblyFileVersion("1.3.1.0")] diff --git a/Updates.txt b/Updates.txt index bb1a139..9d06e45 100644 --- a/Updates.txt +++ b/Updates.txt @@ -1,20 +1,28 @@ -ver 1.2.3 -————————— -- Fix: Inserts where the user locale uses comma decimals - - -ver 1.2.2 -————————— -- Fix: Reading all log files failed for locales that use a "." in the abbreviated month name - - -Ver 1.2.1 -————————— -- Fix: Batch mode working on Windows OS -- Change: Improved MySQL login handing, now done once per run rather than per file - - -Ver 1.2.0 -————————— -- Initial release of ExportToMySQL in its new form +ver 1.3.1 +————————— +- Fix: Bug that prevented December being imported when performing an import of all files + +ver 1.3.0 +————————— +- Supports the library changes in Cumulus MX v3.11.0 with a swap to MySqlConnector + +ver 1.2.3 +————————— +- Fix: Inserts where the user locale uses comma decimals + + +ver 1.2.2 +————————— +- Fix: Reading all log files failed for locales that use a "." in the abbreviated month name + + +Ver 1.2.1 +————————— +- Fix: Batch mode working on Windows OS +- Change: Improved MySQL login handing, now done once per run rather than per file + + +Ver 1.2.0 +————————— +- Initial release of ExportToMySQL in its new form - Thanks to Hans for contributing the batch mode \ No newline at end of file