feat: added capability of creating/updating the database schema
This commit is contained in:
@@ -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:");
|
||||||
|
@@ -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();
|
||||||
|
@@ -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>
|
||||||
|
Reference in New Issue
Block a user