Files
SteamWare/SteamWareLib/dbUpdateManager.cs
T
Samuele E. Locatelli 31b34a2024 Update filemover
2020-02-20 17:30:00 +01:00

161 lines
6.0 KiB
C#

using System;
using System.Data.SqlClient;
namespace SteamWare
{
/// <summary>
/// classe di gestione dei db x creazione/update alla versione richiesta
/// </summary>
public class dbUpdateManager
{
/// <summary>
/// oggetto connessione
/// </summary>
protected SqlConnection conn = null;
/// <summary>
/// stringa di connessione
/// </summary>
protected string _connString;
/// <summary>
/// dir che contiene gli script da eseguire...
/// </summary>
protected string _sqlScriptDir;
/// <summary>
/// formato del file SQL impiegato (nel senso di formato come iFormat del tipo "App_{0:0000}.sql" --> da App_0001.sql ad App_9999.sql)
/// </summary>
protected string _sqlFileFormat;
/// <summary>
/// avvio protected della classe
/// </summary>
public dbUpdateManager(string connectionString, string sqlDir, string sqlFileFormat)
{
// salvo valori di avvio
_sqlFileFormat = sqlFileFormat;
_connString = connectionString;
try
{
_sqlScriptDir = fileMover.getFilePath(sqlDir);
}
catch
{
_sqlScriptDir = sqlDir;
}
//logger.lg.scriviLog(_sqlScriptDir, tipoLog.INFO);
}
/// <summary>
/// esegue gli script di sql di update dal file richiesto
/// </summary>
/// <param name="nomeFile"></param>
/// <param name="timeout"></param>
/// <returns></returns>
public bool execSql(string nomeFile, int timeout)
{
bool answ = false;
// avvio connessione
conn = new SqlConnection(_connString);
// apro il file in lettura
fileMover.obj.setDirectory(_sqlScriptDir);
string sqlCmd = fileMover.obj.scaricaFileString(nomeFile).Replace("???", "");
try
{
// apro connessione
conn.Open();
// creo e popolo comando
logger.lg.scriviLog(string.Format("Inizio esecuzione comandl SQL del file {0}", nomeFile), tipoLog.INFO);
DateTime inizio = DateTime.Now;
SqlCommand comando = conn.CreateCommand();
// eseguo un comando alla volta (fino al GO...)
string singleSqlCmd = "";
int i_GO = sqlCmd.IndexOf("GO\r\n");
while (i_GO != -1)
{
// prendo stringa... escluso GO...
singleSqlCmd = sqlCmd.Substring(0, i_GO);
// tolgo dalla string la parte eseguita... escluso GO...
sqlCmd = sqlCmd.Substring(i_GO + 2, sqlCmd.Length - i_GO - 2);
// eseguo singolo comando
comando.CommandText = singleSqlCmd;
comando.CommandTimeout = timeout;
// eseguo
comando.ExecuteNonQuery();
// ricaolco posizione prox GO...
i_GO = sqlCmd.IndexOf("GO\r\n");
}
logger.lg.scriviLog(string.Format("Completata esecuzione SQL {0} in {1} msec", nomeFile, DateTime.Now.Subtract(inizio).TotalMilliseconds), tipoLog.INFO);
// segno come fatto
answ = true;
}
catch (Exception e)
{
logger.lg.scriviLog(string.Format("Errore durante l'esecuzione SQL {0}, errore \n\r {1}", nomeFile, e), tipoLog.EXCEPTION);
}
finally
{
// chiude connessione
if (conn != null)
{
try
{
conn.Close();
conn.Dispose();
}
catch (Exception e)
{
logger.lg.scriviLog(string.Format("Errore durante la chiusura della connessione, errore:\n\r {0}", e), tipoLog.EXCEPTION);
}
}
}
return answ;
}
/// <summary>
/// Aggiorna il db eseguendo gli script dalla versione di partenza a quella di arrivo
///
/// NB: per definizione rev 0 = resetta svuotando DB, rev 1 crea tabelle iniziali, rev 2 inserisce i valori di default
/// </summary>
/// <param name="nomeDB">nome DB di cui cercare script</param>
/// <param name="revFrom">revisione di partenza</param>
/// <param name="revTo">revisione di arrivo</param>
/// <param name="timeout">timeout max per ogni operazione</param>
/// <returns></returns>
public bool updateDbToRev(string nomeDB, int revFrom, int revTo, int timeout)
{
bool answ = false;
// ciclo tra le revisioni richieste e chiedo esecuzione...
for (int i = revFrom; i < revTo + 1; i++)
{
execSql(string.Format(_sqlFileFormat, nomeDB, i), timeout);
}
return answ;
}
/// <summary>
/// verifica se il db indicato esiste o meno...
/// </summary>
/// <param name="dbname"></param>
/// <param name="connectionString"></param>
/// <returns></returns>
public bool checkDbExisting(string dbname, string connectionString)
{
bool answ = false;
// !!!FARE!!!
return answ;
}
/// <summary>
/// crea il db indicato con i parametri di connessione specificati
/// </summary>
/// <param name="dbname"></param>
/// <param name="connectionString"></param>
/// <returns></returns>
public bool createDb(string dbname, string connectionString)
{
bool answ = false;
// !!!FARE!!! per ora non c'è creazione ma SOLO fasi di update...
return answ;
}
}
}