using System;
using System.Data.SqlClient;
namespace SteamWare
{
///
/// classe di gestione dei db x creazione/update alla versione richiesta
///
public class dbUpdateManager
{
///
/// oggetto connessione
///
protected SqlConnection conn = null;
///
/// stringa di connessione
///
protected string _connString;
///
/// dir che contiene gli script da eseguire...
///
protected string _sqlScriptDir;
///
/// 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)
///
protected string _sqlFileFormat;
///
/// avvio protected della classe
///
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);
}
///
/// esegue gli script di sql di update dal file richiesto
///
///
///
///
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;
}
///
/// 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
///
/// nome DB di cui cercare script
/// revisione di partenza
/// revisione di arrivo
/// timeout max per ogni operazione
///
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;
}
///
/// verifica se il db indicato esiste o meno...
///
///
///
///
public bool checkDbExisting(string dbname, string connectionString)
{
bool answ = false;
// !!!FARE!!!
return answ;
}
///
/// crea il db indicato con i parametri di connessione specificati
///
///
///
///
public bool createDb(string dbname, string connectionString)
{
bool answ = false;
// !!!FARE!!! per ora non c'è creazione ma SOLO fasi di update...
return answ;
}
}
}