diff --git a/gaseous-signature-ingestor/Program.cs b/gaseous-signature-ingestor/Program.cs index 878bfb9..e40afb1 100644 --- a/gaseous-signature-ingestor/Program.cs +++ b/gaseous-signature-ingestor/Program.cs @@ -53,6 +53,8 @@ if (!Directory.Exists(Config.ConfigurationPath)) // connect to database Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); +// initialise the db +db.InitDB(); // process provided files Console.WriteLine("Processing input files:"); diff --git a/gaseous-tools/Database.cs b/gaseous-tools/Database.cs index 31e1bc1..81ffa47 100644 --- a/gaseous-tools/Database.cs +++ b/gaseous-tools/Database.cs @@ -2,6 +2,7 @@ using System.Data; using System.Data.SqlClient; using System.Diagnostics; +using System.Reflection; using MySql.Data.MySqlClient; namespace gaseous_tools @@ -52,13 +53,84 @@ namespace gaseous_tools } } + public void InitDB() + { + // load resources + var assembly = Assembly.GetExecutingAssembly(); - public DataTable ExecuteCMD(string Command, Dictionary Parameters, int Timeout = 30) - { switch (_ConnectorType) { case databaseType.MySql: - MySQLServerConnector conn = new MySQLServerConnector(_ConnectionString); + // check if the database exists first - first run must have permissions to create a database + string sql = "CREATE DATABASE IF NOT EXISTS `" + Config.DatabaseConfiguration.DatabaseName + "`;"; + Dictionary dbDict = new Dictionary(); + ExecuteCMD(sql, dbDict, 30, "server=" + Config.DatabaseConfiguration.HostName + ";port=" + Config.DatabaseConfiguration.Port + ";userid=" + Config.DatabaseConfiguration.UserName + ";password=" + Config.DatabaseConfiguration.Password); + + // check if schema version table is in place - if not, create the schema version table + sql = "SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'gaseous' AND TABLE_NAME = 'schema_version';"; + DataTable SchemaVersionPresent = ExecuteCMD(sql, dbDict); + if (SchemaVersionPresent.Rows.Count == 0) + { + // no schema table present - create it + sql = "CREATE TABLE `schema_version` (`schema_version` INT NOT NULL, PRIMARY KEY (`schema_version`)); INSERT INTO `schema_version` (`schema_version`) VALUES (0);"; + ExecuteCMD(sql, dbDict); + } + + for (int i = 1000; i < 10000; i++) + { + string resourceName = "gaseous_tools.Database.MySQL.gaseous-" + i + ".sql"; + string dbScript = ""; + + try + { + using (Stream stream = assembly.GetManifestResourceStream(resourceName)) + using (StreamReader reader = new StreamReader(stream)) + { + dbScript = reader.ReadToEnd(); + + // apply script + sql = "SELECT schema_version FROM schema_version;"; + DataTable SchemaVersion = ExecuteCMD(sql, dbDict); + if (SchemaVersion.Rows.Count == 0) + { + // something is broken here... where's the table? + throw new Exception("schema_version table is missing!"); + } + else + { + int SchemaVer = (int)SchemaVersion.Rows[0][0]; + if (SchemaVer < i) + { + // apply schema! + ExecuteCMD(dbScript, dbDict); + + sql = "UPDATE schema_version SET schema_version=@schemaver"; + dbDict.Add("schemaver", i); + ExecuteCMD(sql, dbDict); + } + if (SchemaVer == i) + { + // no more updates, no point looping anymore + break; + } + } + } + } catch + { + break; + } + } + break; + } + } + + public DataTable ExecuteCMD(string Command, Dictionary Parameters, int Timeout = 30, string ConnectionString = "") + { + if (ConnectionString == "") { ConnectionString = _ConnectionString; } + switch (_ConnectorType) + { + case databaseType.MySql: + MySQLServerConnector conn = new MySQLServerConnector(ConnectionString); return (DataTable)conn.ExecCMD(Command, Parameters, Timeout); default: return new DataTable(); diff --git a/gaseous-tools/Database/MySQL/gaseous.sql b/gaseous-tools/Database/MySQL/gaseous-1000.sql similarity index 100% rename from gaseous-tools/Database/MySQL/gaseous.sql rename to gaseous-tools/Database/MySQL/gaseous-1000.sql diff --git a/gaseous-tools/gaseous-tools.csproj b/gaseous-tools/gaseous-tools.csproj index 5420952..c3b885a 100644 --- a/gaseous-tools/gaseous-tools.csproj +++ b/gaseous-tools/gaseous-tools.csproj @@ -14,9 +14,13 @@ + + + +