init commit
This commit is contained in:
commit
1b7fdc4a53
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
bin/
|
||||||
|
obj/
|
||||||
|
/packages/
|
||||||
|
riderModule.iml
|
||||||
|
/_ReSharper.Caches/
|
||||||
16
tbfDBBackup.sln
Normal file
16
tbfDBBackup.sln
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "tbfDBBackup", "tbfDBBackup\tbfDBBackup.csproj", "{9F4F004F-8E31-42B3-BE6D-EA9453EADC7F}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{9F4F004F-8E31-42B3-BE6D-EA9453EADC7F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{9F4F004F-8E31-42B3-BE6D-EA9453EADC7F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{9F4F004F-8E31-42B3-BE6D-EA9453EADC7F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{9F4F004F-8E31-42B3-BE6D-EA9453EADC7F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
15
tbfDBBackup/BackupCombination.cs
Normal file
15
tbfDBBackup/BackupCombination.cs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
using tbfDBBackup.configuration;
|
||||||
|
|
||||||
|
namespace tbfDBBackup;
|
||||||
|
|
||||||
|
public struct BackupCombination
|
||||||
|
{
|
||||||
|
public PathWrapper Path { get; init; }
|
||||||
|
public string DatabaseName { get; set; }
|
||||||
|
public string BackupFilePath { get; set; }
|
||||||
|
public string UserName { get; set; }
|
||||||
|
public string Password { get; set; }
|
||||||
|
public string CommandPath { get; set; }
|
||||||
|
|
||||||
|
public string ServerName { get; set; }
|
||||||
|
}
|
||||||
117
tbfDBBackup/Configuration.cs
Normal file
117
tbfDBBackup/Configuration.cs
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
using System.Text.Json;
|
||||||
|
using tbfDBBackup.configuration;
|
||||||
|
|
||||||
|
namespace tbfDBBackup;
|
||||||
|
|
||||||
|
public class Configuration
|
||||||
|
{
|
||||||
|
public const string ConfigDir = "config";
|
||||||
|
public const string FileName = "configuration.json";
|
||||||
|
|
||||||
|
public string? PathToDumpMysql { get; set; }
|
||||||
|
public Boolean? WaitOnEndCmdOpen { get; set; }
|
||||||
|
public Boolean? PrintConfigurationEnabled { get; set; }
|
||||||
|
|
||||||
|
public List<DbConnection>? DbConnectionStrings { get; set; }
|
||||||
|
public List<Update>? UpdateString { get; set; }
|
||||||
|
public List<Backup>? BackupDB { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
public static Configuration DeserializeFromJson(string jsonString)
|
||||||
|
{
|
||||||
|
return JsonSerializer.Deserialize<Configuration>(jsonString);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Serialize method for saving
|
||||||
|
public string SerializeToJson()
|
||||||
|
{
|
||||||
|
return JsonSerializer.Serialize(this, new JsonSerializerOptions { WriteIndented = true });
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PrintConfiguration()
|
||||||
|
{
|
||||||
|
if (DbConnectionStrings != null)
|
||||||
|
{
|
||||||
|
Console.WriteLine("-- DbConnectionStrings:");
|
||||||
|
foreach (var dbConnection in DbConnectionStrings)
|
||||||
|
{
|
||||||
|
Console.WriteLine(dbConnection.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (UpdateString != null)
|
||||||
|
{
|
||||||
|
Console.WriteLine("-- UpdateString:");
|
||||||
|
foreach (var update in UpdateString)
|
||||||
|
{
|
||||||
|
Console.WriteLine(update.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (BackupDB != null)
|
||||||
|
{
|
||||||
|
Console.WriteLine("-- BackupResults:");
|
||||||
|
foreach (var backup in BackupDB)
|
||||||
|
{
|
||||||
|
Console.WriteLine(backup.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<BackupCombination> GetBackupCombinations()
|
||||||
|
{
|
||||||
|
List<BackupCombination> combinations = new List<BackupCombination>();
|
||||||
|
|
||||||
|
if (DbConnectionStrings != null)
|
||||||
|
{
|
||||||
|
foreach (DbConnection dbConnection in DbConnectionStrings)
|
||||||
|
{
|
||||||
|
if (!(dbConnection.Enabled ?? true))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
combinations.AddRange(GetBackupCombinations(BackupDB, dbConnection));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return combinations;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<BackupCombination> GetBackupCombinations(List<Backup>? backups, DbConnection dbConnection)
|
||||||
|
{
|
||||||
|
List<BackupCombination> combinations = new List<BackupCombination>();
|
||||||
|
|
||||||
|
if (backups != null)
|
||||||
|
{
|
||||||
|
foreach (Backup backup in backups)
|
||||||
|
{
|
||||||
|
if (!(backup.Enabled??true) || backup.DbConnectionStringsName != dbConnection.Name )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (PathWrapper path in backup.StoreDirPaths)
|
||||||
|
{
|
||||||
|
if ((path.Enabled ?? true))
|
||||||
|
{
|
||||||
|
combinations.Add(new BackupCombination
|
||||||
|
{
|
||||||
|
Path = path,
|
||||||
|
DatabaseName = dbConnection.DatabaseName,
|
||||||
|
ServerName = dbConnection.getServer(),
|
||||||
|
Password = dbConnection.getPassword(),
|
||||||
|
UserName = dbConnection.getUserName(),
|
||||||
|
CommandPath = PathToDumpMysql ?? "",
|
||||||
|
BackupFilePath = path.Path
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return combinations;
|
||||||
|
}
|
||||||
|
}
|
||||||
276
tbfDBBackup/Program.cs
Normal file
276
tbfDBBackup/Program.cs
Normal file
@ -0,0 +1,276 @@
|
|||||||
|
// See https://aka.ms/new-console-template for more information
|
||||||
|
|
||||||
|
using System.Diagnostics;
|
||||||
|
using MySqlConnector;
|
||||||
|
using tbfDBBackup;
|
||||||
|
using tbfDBBackup.configuration;
|
||||||
|
|
||||||
|
|
||||||
|
Console.WriteLine("---- TBF DB Backup process started -----");
|
||||||
|
//Read configuration
|
||||||
|
Configuration? configuration = GetConfiguration();
|
||||||
|
|
||||||
|
if (configuration == null)
|
||||||
|
{
|
||||||
|
Console.WriteLine("**** Configuration no found!! ***");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//update part
|
||||||
|
if (configuration.UpdateString != null){
|
||||||
|
try
|
||||||
|
{
|
||||||
|
UpdateDb(configuration);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Console.WriteLine("------ MySql Data uprade FAILED!! *** -----");
|
||||||
|
Console.WriteLine(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//database backup part
|
||||||
|
List<BackupCombination> backupCombinations = configuration.GetBackupCombinations();
|
||||||
|
foreach (BackupCombination combination in backupCombinations)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
BackupDatabase(combination);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"------ MySql backup of database: {combination.DatabaseName} FAILED!! *** -----");
|
||||||
|
Console.WriteLine(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Update one time config
|
||||||
|
|
||||||
|
//store configuration
|
||||||
|
SaveConfiguration(configuration);
|
||||||
|
|
||||||
|
//final info
|
||||||
|
Console.WriteLine("Program finished correctly!!");
|
||||||
|
|
||||||
|
//wait to end
|
||||||
|
if (configuration != null && (configuration.WaitOnEndCmdOpen ?? false))
|
||||||
|
{
|
||||||
|
Console.ReadLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
//program END
|
||||||
|
return 0;
|
||||||
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
Configuration? GetConfiguration()
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Console.WriteLine($"---- program started path: {Environment.CurrentDirectory}");
|
||||||
|
string fileNamePath = ConfigurationFileNamePath();
|
||||||
|
Console.WriteLine($"- full config file path: {fileNamePath}");
|
||||||
|
|
||||||
|
|
||||||
|
string jsonConfiguration = "";
|
||||||
|
using (StreamReader reader = new StreamReader(fileNamePath))
|
||||||
|
{
|
||||||
|
jsonConfiguration = reader.ReadToEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
Configuration? configurationDeserialized = Configuration.DeserializeFromJson(jsonConfiguration);
|
||||||
|
if (configurationDeserialized != null && (configurationDeserialized.PrintConfigurationEnabled ?? false))
|
||||||
|
{
|
||||||
|
configurationDeserialized.PrintConfiguration();
|
||||||
|
}
|
||||||
|
|
||||||
|
return configurationDeserialized;
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Console.WriteLine(e);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SaveConfiguration(Configuration configuration)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Serialize the configuration back to JSON
|
||||||
|
string jsonString = configuration.SerializeToJson();
|
||||||
|
|
||||||
|
string fileNamePath = ConfigurationFileNamePath();
|
||||||
|
Console.WriteLine($"- full config file path: {fileNamePath}");
|
||||||
|
|
||||||
|
// Write the JSON string to the file
|
||||||
|
using (StreamWriter writer = new StreamWriter(fileNamePath))
|
||||||
|
{
|
||||||
|
writer.Write(jsonString);
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine("Configuration saved successfully.");
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Error saving configuration: {e}");
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void BackupDatabase(BackupCombination backupCombination)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"------ MySql backup of database: {backupCombination.DatabaseName} started -----");
|
||||||
|
DateTime currentTime = DateTime.Now; // Get current date and time
|
||||||
|
|
||||||
|
// Format the date and time as yyyyMMdd_HHmmss (e.g., 20241015_142530)
|
||||||
|
string time = currentTime.ToString("yyyyMMdd_HHmmss");
|
||||||
|
|
||||||
|
// Create the file name by appending the formatted time to the database name
|
||||||
|
string fileName = backupCombination.DatabaseName.Trim()
|
||||||
|
.Replace('\\', '_')
|
||||||
|
.Replace(' ', '_')
|
||||||
|
.ToLower() + "_backup_" + time + ".sql";
|
||||||
|
|
||||||
|
string filePathName = Path.Combine(backupCombination.BackupFilePath, fileName);
|
||||||
|
// Set up the mysqldump command
|
||||||
|
string dumpCommand =
|
||||||
|
$"mysqldump --user={backupCombination.UserName} --password={backupCombination.Password} --host={backupCombination.ServerName} {backupCombination.DatabaseName} --result-file=\"{filePathName}\" --routines --events";
|
||||||
|
|
||||||
|
// Check if the directory exists, and create it if not
|
||||||
|
if (!Directory.Exists(backupCombination.BackupFilePath))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(backupCombination.BackupFilePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Execute the mysqldump command
|
||||||
|
ProcessStartInfo processInfo = new ProcessStartInfo
|
||||||
|
{
|
||||||
|
FileName = "cmd.exe",
|
||||||
|
RedirectStandardInput = true,
|
||||||
|
RedirectStandardOutput = true,
|
||||||
|
RedirectStandardError = true,
|
||||||
|
UseShellExecute = false,
|
||||||
|
CreateNoWindow = true
|
||||||
|
};
|
||||||
|
|
||||||
|
Process process = new Process
|
||||||
|
{
|
||||||
|
StartInfo = processInfo
|
||||||
|
};
|
||||||
|
|
||||||
|
process.Start();
|
||||||
|
|
||||||
|
using (var writer = process.StandardInput)
|
||||||
|
{
|
||||||
|
if (writer.BaseStream.CanWrite)
|
||||||
|
{
|
||||||
|
if (backupCombination.CommandPath.Length == 0)
|
||||||
|
{
|
||||||
|
writer.WriteLine(dumpCommand);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Split the dumpCommand into the executable and the arguments
|
||||||
|
string[]
|
||||||
|
parts = dumpCommand.Split(' ', 2); // Split into two parts: the command and the rest (arguments)
|
||||||
|
|
||||||
|
// Combine the commandPath with the executable (first part of dumpCommand)
|
||||||
|
string fullCommand = Path.Combine(backupCombination.CommandPath, parts[0]) + " " + parts[1];
|
||||||
|
|
||||||
|
// Execute the command with the full path
|
||||||
|
writer.WriteLine(fullCommand);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process.WaitForExit();
|
||||||
|
|
||||||
|
string result = process.StandardOutput.ReadToEnd();
|
||||||
|
string error = process.StandardError.ReadToEnd();
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(error))
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Error: {error}");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Backup created successfully at {filePathName}");
|
||||||
|
}
|
||||||
|
|
||||||
|
process.Close();
|
||||||
|
|
||||||
|
//Deactivate if only one time possible run
|
||||||
|
|
||||||
|
if ((backupCombination.Path.IsOneTimeOpaque ?? false) && (backupCombination.Path.Enabled??false))
|
||||||
|
{
|
||||||
|
backupCombination.Path.Enabled = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateDb(Configuration dbConfiguration)
|
||||||
|
{
|
||||||
|
if (dbConfiguration.DbConnectionStrings != null)
|
||||||
|
foreach (DbConnection dbConnection in dbConfiguration.DbConnectionStrings)
|
||||||
|
{
|
||||||
|
if (!(dbConnection.Enabled ?? true))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dbConfiguration.UpdateString != null)
|
||||||
|
foreach (Update update in dbConfiguration.UpdateString)
|
||||||
|
{
|
||||||
|
if (!(update.Enabled ?? true) || dbConnection.DatabaseName != update.DatabaseName)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Console.WriteLine($"------ MySql Data upgrade name: {update.Name} starting -----");
|
||||||
|
string connectionString =
|
||||||
|
dbConnection.Connection.Replace("{DatabaseName}", dbConnection.DatabaseName);
|
||||||
|
MySqlConnection connection = new MySqlConnection(connectionString);
|
||||||
|
connection.Open();
|
||||||
|
|
||||||
|
|
||||||
|
MySqlCommand command =
|
||||||
|
new MySqlCommand(update.Query.Replace("{DatabaseName}", update.DatabaseName), connection);
|
||||||
|
int affectedItems = command.ExecuteNonQuery();
|
||||||
|
|
||||||
|
Console.WriteLine($"Affected items: {affectedItems}");
|
||||||
|
|
||||||
|
connection.Close();
|
||||||
|
|
||||||
|
if (update.IsOneTimeOpaque ?? false)
|
||||||
|
{
|
||||||
|
update.Enabled = false;
|
||||||
|
}
|
||||||
|
Console.WriteLine($"------ MySql Data upgrade name: {update.Name} finished! -----");
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"------ MySql Data upgrade name: {update.Name} ERROR!");
|
||||||
|
Console.WriteLine(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
string ConfigurationFileNamePath()
|
||||||
|
{
|
||||||
|
string s;
|
||||||
|
#if DEBUG
|
||||||
|
Console.WriteLine("-- DEV version of THE PROJECT -- ");
|
||||||
|
string projectPath = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.FullName;
|
||||||
|
|
||||||
|
s = Path.Combine(projectPath, Configuration.ConfigDir, Configuration.FileName);
|
||||||
|
#else
|
||||||
|
// For release mode, use an absolute path or the application base directory
|
||||||
|
Console.WriteLine("-- PROD version of THE PROJECT -- ");
|
||||||
|
fileNamePath = Path.Combine(Environment.CurrentDirectory, Configuration.ConfigDir, Configuration.FileName);
|
||||||
|
#endif
|
||||||
|
return s;
|
||||||
|
}
|
||||||
55
tbfDBBackup/config/configuration.json
Normal file
55
tbfDBBackup/config/configuration.json
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
{
|
||||||
|
"PathToDumpMysql": "C:\\xampp\\mysql\\bin",
|
||||||
|
"WaitOnEndCmdOpen": false,
|
||||||
|
"PrintConfigurationEnabled": false,
|
||||||
|
"DbConnectionStrings": [
|
||||||
|
{
|
||||||
|
"Enabled": false,
|
||||||
|
"Name": "Settings DB",
|
||||||
|
"Connection": "SERVER=localhost; DATABASE={DatabaseName}; UID=root; PASSWORD=; CHARSET=utf8;",
|
||||||
|
"DatabaseName": "wrcswindon298"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Enabled": true,
|
||||||
|
"Name": "Results DB",
|
||||||
|
"Connection": "SERVER=localhost; DATABASE={DatabaseName}; UID=root; PASSWORD=; CHARSET=utf8;",
|
||||||
|
"DatabaseName": "wrcswindon298-r"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"UpdateString": [
|
||||||
|
{
|
||||||
|
"Enabled": false,
|
||||||
|
"Name": "Alter table Water Meter",
|
||||||
|
"Query": "ALTER TABLE `{DatabaseName}`.`WaterMeter` ADD COLUMN `RadioAddress` BOOLEAN;",
|
||||||
|
"DatabaseName": "wrcswindon298-r"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"BackupDB": [
|
||||||
|
{
|
||||||
|
"Enabled": true,
|
||||||
|
"DbConnectionStringsName": "Results DB",
|
||||||
|
"StoreDirPaths": [
|
||||||
|
{
|
||||||
|
"Path": "C:\\TBF\\"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Path": "C:\\TBF\\storeString",
|
||||||
|
"Enable": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Enabled": false,
|
||||||
|
"DbConnectionStringsName": "Settings DB",
|
||||||
|
"StoreDirPaths": [
|
||||||
|
{
|
||||||
|
"Path": "C:\\TBF\\"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Path": "C:\\TBF\\storeString",
|
||||||
|
"Enable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
55
tbfDBBackup/config/configuration_backup.json
Normal file
55
tbfDBBackup/config/configuration_backup.json
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
{
|
||||||
|
"PathToDumpMysql": "C:\\xampp\\mysql\\bin",
|
||||||
|
"WaitOnEndCmdOpen": false,
|
||||||
|
"PrintConfigurationEnabled": false,
|
||||||
|
"DbConnectionStrings": [
|
||||||
|
{
|
||||||
|
"Enabled": false,
|
||||||
|
"Name": "Settings DB",
|
||||||
|
"Connection": "SERVER=localhost; DATABASE={DatabaseName}; UID=root; PASSWORD=; CHARSET=utf8;",
|
||||||
|
"DatabaseName": "wrcswindon298"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Enabled": true,
|
||||||
|
"Name": "Results DB",
|
||||||
|
"Connection": "SERVER=localhost; DATABASE={DatabaseName}; UID=root; PASSWORD=; CHARSET=utf8;",
|
||||||
|
"DatabaseName": "wrcswindon298-r"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"UpdateString": [
|
||||||
|
{
|
||||||
|
"Enabled": false,
|
||||||
|
"Name": "Alter table Water Meter",
|
||||||
|
"Query": "ALTER TABLE `{DatabaseName}`.`WaterMeter` ADD COLUMN `RadioAddress` BOOLEAN;",
|
||||||
|
"DatabaseName": "wrcswindon298-r"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"BackupDB": [
|
||||||
|
{
|
||||||
|
"Enabled": true,
|
||||||
|
"DbConnectionStringsName": "Results DB",
|
||||||
|
"StoreDirPaths": [
|
||||||
|
{
|
||||||
|
"Path": "C:\\TBF\\"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Path": "C:\\TBF\\storeString",
|
||||||
|
"Enable": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Enabled": false,
|
||||||
|
"DbConnectionStringsName": "Settings DB",
|
||||||
|
"StoreDirPaths": [
|
||||||
|
{
|
||||||
|
"Path": "C:\\TBF\\"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Path": "C:\\TBF\\storeString",
|
||||||
|
"Enable": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
15
tbfDBBackup/configuration/Backup.cs
Normal file
15
tbfDBBackup/configuration/Backup.cs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
using System.Text.Json;
|
||||||
|
|
||||||
|
namespace tbfDBBackup.configuration;
|
||||||
|
|
||||||
|
public class Backup : StandardBehaviour
|
||||||
|
{
|
||||||
|
|
||||||
|
public string DbConnectionStringsName { get; set; }
|
||||||
|
public List<PathWrapper> StoreDirPaths { get; set; }
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return JsonSerializer.Serialize(this, new JsonSerializerOptions { WriteIndented = true });
|
||||||
|
}
|
||||||
|
}
|
||||||
40
tbfDBBackup/configuration/DbConnection.cs
Normal file
40
tbfDBBackup/configuration/DbConnection.cs
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
using System.Text.Json;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
|
namespace tbfDBBackup.configuration;
|
||||||
|
|
||||||
|
public class DbConnection : StandardBehaviour
|
||||||
|
{
|
||||||
|
|
||||||
|
public string Name { get; set; }
|
||||||
|
public string Connection { get; set; }
|
||||||
|
public string DatabaseName { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
public string getServer()
|
||||||
|
{
|
||||||
|
return ExtractValueUsingRegex(Connection, @"SERVER=([^;]+)");
|
||||||
|
}
|
||||||
|
|
||||||
|
public string getPassword()
|
||||||
|
{
|
||||||
|
return ExtractValueUsingRegex(Connection, @"PASSWORD=([^;]+)");
|
||||||
|
}
|
||||||
|
|
||||||
|
public string getUserName()
|
||||||
|
{
|
||||||
|
return ExtractValueUsingRegex(Connection, @"UID=([^;]+)");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper function to extract value using regex
|
||||||
|
public static string ExtractValueUsingRegex(string input, string pattern)
|
||||||
|
{
|
||||||
|
Match match = Regex.Match(input, pattern);
|
||||||
|
return match.Success ? match.Groups[1].Value : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return JsonSerializer.Serialize(this, new JsonSerializerOptions { WriteIndented = true });
|
||||||
|
}
|
||||||
|
}
|
||||||
7
tbfDBBackup/configuration/IStandartBehaviour.cs
Normal file
7
tbfDBBackup/configuration/IStandartBehaviour.cs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
namespace tbfDBBackup.configuration;
|
||||||
|
|
||||||
|
public interface IStandartBehaviour
|
||||||
|
{
|
||||||
|
bool IsEnabled();
|
||||||
|
bool IsOneTimeOpaque();
|
||||||
|
}
|
||||||
13
tbfDBBackup/configuration/PathWrapper.cs
Normal file
13
tbfDBBackup/configuration/PathWrapper.cs
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
using System.Text.Json;
|
||||||
|
|
||||||
|
namespace tbfDBBackup.configuration;
|
||||||
|
|
||||||
|
public class PathWrapper : StandardBehaviour
|
||||||
|
{
|
||||||
|
public string Path { get; set; }
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return JsonSerializer.Serialize(this, new JsonSerializerOptions { WriteIndented = true });
|
||||||
|
}
|
||||||
|
}
|
||||||
7
tbfDBBackup/configuration/StandardBehaviour.cs
Normal file
7
tbfDBBackup/configuration/StandardBehaviour.cs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
namespace tbfDBBackup.configuration;
|
||||||
|
|
||||||
|
public class StandardBehaviour
|
||||||
|
{
|
||||||
|
public Boolean? Enabled { get; set; }
|
||||||
|
public Boolean? IsOneTimeOpaque { get; set; }
|
||||||
|
}
|
||||||
16
tbfDBBackup/configuration/Update.cs
Normal file
16
tbfDBBackup/configuration/Update.cs
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
using System.Text.Json;
|
||||||
|
|
||||||
|
namespace tbfDBBackup.configuration;
|
||||||
|
|
||||||
|
public class Update : StandardBehaviour
|
||||||
|
{
|
||||||
|
|
||||||
|
public string Name { get; set; }
|
||||||
|
public string Query { get; set; }
|
||||||
|
public string DatabaseName { get; set; }
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return JsonSerializer.Serialize(this, new JsonSerializerOptions { WriteIndented = true });
|
||||||
|
}
|
||||||
|
}
|
||||||
14
tbfDBBackup/tbfDBBackup.csproj
Normal file
14
tbfDBBackup/tbfDBBackup.csproj
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="MySqlConnector" Version="2.4.0-beta.1" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
Loading…
Reference in New Issue
Block a user