feat: added capability of creating/updating the database schema

This commit is contained in:
Michael Green
2023-03-01 11:50:58 +11:00
parent 055d09d77a
commit 85726ada7a
4 changed files with 81 additions and 3 deletions

View File

@@ -53,6 +53,8 @@ if (!Directory.Exists(Config.ConfigurationPath))
// connect to database // connect to database
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString); Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
// initialise the db
db.InitDB();
// process provided files // process provided files
Console.WriteLine("Processing input files:"); Console.WriteLine("Processing input files:");

View File

@@ -2,6 +2,7 @@
using System.Data; using System.Data;
using System.Data.SqlClient; using System.Data.SqlClient;
using System.Diagnostics; using System.Diagnostics;
using System.Reflection;
using MySql.Data.MySqlClient; using MySql.Data.MySqlClient;
namespace gaseous_tools 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<string, object> Parameters, int Timeout = 30)
{
switch (_ConnectorType) switch (_ConnectorType)
{ {
case databaseType.MySql: 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<string, object> dbDict = new Dictionary<string, object>();
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<string, object> 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); return (DataTable)conn.ExecCMD(Command, Parameters, Timeout);
default: default:
return new DataTable(); return new DataTable();

View File

@@ -14,9 +14,13 @@
<ItemGroup> <ItemGroup>
<None Remove="Database\" /> <None Remove="Database\" />
<None Remove="Database\MySQL\" /> <None Remove="Database\MySQL\" />
<None Remove="Database\MySQL\gaseous-1000.sql" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Folder Include="Database\" /> <Folder Include="Database\" />
<Folder Include="Database\MySQL\" /> <Folder Include="Database\MySQL\" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Database\MySQL\gaseous-1000.sql" />
</ItemGroup>
</Project> </Project>