using System; namespace Kreta.Framework.Logging { /// /// Adatbázis naplóvezető osztály. /// public sealed class DatabaseLogWriter : LogWriterBase { private string m_ConnectionString; private string m_ServerName; private const string insertCommandText = @" INSERT INTO T_LOG (C_TIMESTAMP, C_SERVER, C_EVENTTYPEID, C_LEVELID, C_SESSIONID, C_DETAILS, C_GENERATEDID, SERIAL) VALUES (GETDATE(), :pSERVER, :pEVENTTYPE, :pLEVEL, :pSESSIONID, :pDETAILS, :pGENERATEDID, 0)"; private const string insertCommandTextWithIntezmeny = @" INSERT INTO T_LOG (C_TIMESTAMP, C_SERVER, C_EVENTTYPEID, C_LEVELID, C_SESSIONID, C_DETAILS, C_GENERATEDID, C_INTEZMENYID, C_TANEVID, SERIAL) VALUES (GETDATE(), :pSERVER, :pEVENTTYPE, :pLEVEL, :pSESSIONID, :pDETAILS, :pGENERATEDID, :pINTEZMENYID, :pTANEVID, 0)"; /// /// Az osztály konstruktora. /// /// Az adatbázis kapcsolatot leíró karakterlánc /// A naplózót használó kiszolgáló neve public DatabaseLogWriter(string connectionString, string serverName) { if (string.IsNullOrWhiteSpace(connectionString)) { throw new ArgumentNullException(nameof(connectionString)); } if (string.IsNullOrWhiteSpace(serverName)) { throw new ArgumentNullException(nameof(serverName)); } m_ConnectionString = connectionString; m_ServerName = serverName; } private string ConnectionString { get { return m_ConnectionString; } } /// /// Naplóba vezeti az üzenetet. /// /// A naplóba vezetendő üzenet protected override Guid? DoLog(ILogMessage message) { var logId = Guid.NewGuid(); DbLog(message, logId); return logId; } protected override void DoLog(ILogMessage message, Guid logId) { DbLog(message, logId); } private bool ActivateContext() { if (UserContext.Instance == null || !UserContext.Instance.Activated) { SDAServer.Instance.SessionManager.ActivateSystemSession(); return true; } return false; } private void DbLog(ILogMessage message, Guid logId) { if (message.Level < LogLevel.INFO) { // DEBUG-ot nem tolunk le adatbázisba! return; } var sessionActivated = ActivateContext(); try { int? intezmenyId = null; int? tanevId = null; var commandText = insertCommandText; if (UserContext.Instance != null && UserContext.Instance.IntezmenyId > 0) { commandText = insertCommandTextWithIntezmeny; intezmenyId = UserContext.Instance.IntezmenyId; if (UserContext.Instance.AktivTanevId > 0) { tanevId = UserContext.Instance.AktivTanevId; } } using (SDA.DataProvider.SDAConnection connection = new SDA.DataProvider.SDAConnection(ConnectionString)) { using (SDA.DataProvider.SDACommand command = connection.CreateCommand()) { command.CommandText = commandText; if (intezmenyId.HasValue) { command.Parameters.Add("pINTEZMENYID", intezmenyId.Value); if (tanevId.HasValue) { command.Parameters.Add("pTANEVID", tanevId.Value); } else { command.Parameters.Add("pTANEVID", DBNull.Value); } } command.Parameters.Add("pSERVER", SDA.DataProvider.SDADBType.String, 36).Value = m_ServerName; command.Parameters.Add("pEVENTTYPE", SDA.DataProvider.SDADBType.Int, 9).Value = message.EventType; command.Parameters.Add("pLEVEL", SDA.DataProvider.SDADBType.Int, 9).Value = message.Level; command.Parameters.Add("pGENERATEDID", logId); command.Parameters.Add("pSESSIONID", SDA.DataProvider.SDADBType.String, 36).Value = message.SessionId == null ? DBNull.Value : (object)message.SessionId; string details = LogUtil.FormatMessageDetails(message, "\r\n"); if (string.IsNullOrWhiteSpace(details)) { command.Parameters.Add("pDETAILS", SDA.DataProvider.SDADBType.LongString).Value = DBNull.Value; } else { command.Parameters.Add("pDETAILS", SDA.DataProvider.SDADBType.LongString).Value = details; } connection.Open(); command.ExecuteNonQuery(); } } } catch (SDA.DataProvider.SDADataProviderException exception) { if (exception.Error == SDA.DataProvider.SDADataProviderError.CommunicationError) { return; } if (exception.Error == SDA.DataProvider.SDADataProviderError.UniqueKeyViolation) { // ezt a kivételt nyugodtan lenyelhetjük return; } throw; } finally { if (sessionActivated) { if (UserContext.Instance != null && UserContext.Instance.Activated) { SDAServer.Instance.SessionManager.DeactivateSystemSession(); } } } } } }