using LSWLib; using System; using System.Data; using System.Data.SqlClient; using System.Text; using spl = LSWLib.CLog; namespace syncEdosLocal { class Program { public static DataSet ds = null; static System.Data.SqlClient.SqlInfoMessageEventHandler iMessage = new SqlInfoMessageEventHandler(Connection_InfoMessage); static bool error = false; static bool warning = false; static StringBuilder messages = null; static string splunkMessage = string.Empty; static spl spLog; static LSWLib.Bulker Bulker; public static bool DoorloopToDo(System.Data.SqlClient.SqlConnection fromConnection, string toConstr, System.Data.SqlClient.SqlInfoMessageEventHandler im, ref bool error, ref bool warning, ref StringBuilder messages) { ds = new DataSet(); DataTable dtTables = new DataTable("Tables"); ds.Tables.Add(dtTables); DataTable dtActions = new DataTable("Actions"); ds.Tables.Add(dtActions); { using (var cmd = new System.Data.SqlClient.SqlCommand("syncloc.SynchroToLocalTables", fromConnection)) { spLog.KvClear(); cmd.CommandType = CommandType.StoredProcedure; spLog.kvAddCommand(spl.skeys.sqlQuery, cmd); using (var ncta = new System.Data.SqlClient.SqlDataAdapter(cmd)) { try { ncta.Fill(dtTables); int r = dtTables.Rows.Count; spLog.KvAdd(spl.skeys.recordsAffected, r); spLog.WriteSplunkLog(string.Empty, spl.iseverity.info, "LoadTables"); } catch (System.Exception ex) { spLog.WriteSplunkLog(string.Empty, spl.iseverity.err, "LoadTables", ex.Message); } } } spLog.KvClear(); dtTables.PrimaryKey = new DataColumn[] { dtTables.Columns["object_id"] }; using (var cmd = new System.Data.SqlClient.SqlCommand("syncloc.SynchroToLocalActions", fromConnection)) { cmd.CommandType = CommandType.StoredProcedure; using (var ncta = new System.Data.SqlClient.SqlDataAdapter(cmd)) { try { ncta.Fill(dtActions); spLog.KvAdd(spl.skeys.recordsAffected, dtActions.Rows.Count); spLog.WriteSplunkLog(string.Empty, spl.iseverity.info, "LoadActions"); } catch (System.Exception ex) { spLog.WriteSplunkLog(string.Empty, spl.iseverity.err, "LoadActions", ex.Message); } } } dtActions.PrimaryKey = new DataColumn[] { dtActions.Columns["object_id"], dtActions.Columns["Type"], dtActions.Columns["r"] }; dtActions.ParentRelations.Add(new DataRelation("pObject", dtTables.Columns["object_id"], dtActions.Columns["object_id"])); StringBuilder sqlCmdsActivate = null; StringBuilder sqlCmdsDeActivate = null; string Task = string.Empty; string dest = string.Empty; string qry = string.Empty; using (System.Data.SqlClient.SqlConnection toConnection = new SqlConnection(toConstr)) { spLog.KvClear(); spLog.KvAdd(toConnection); toConnection.InfoMessage += im; toConnection.Open(); if (toConnection.State == ConnectionState.Open) using (var ucmd = new System.Data.SqlClient.SqlCommand("syncloc.SynchroToLocalTablesUpdate".ToString(), fromConnection)) { ucmd.CommandType = CommandType.StoredProcedure; SqlParameter pa = new SqlParameter("OBJECT_ID", SqlDbType.Int, 4); ucmd.Parameters.Add(pa); pa = new SqlParameter("lastRecords", SqlDbType.Int, 4); ucmd.Parameters.Add(pa); pa = new SqlParameter("constraintsDeactivated", SqlDbType.Bit); ucmd.Parameters.Add(pa); pa = new SqlParameter("constraintsActivated", SqlDbType.Bit); ucmd.Parameters.Add(pa); pa = new SqlParameter("syncError", SqlDbType.Bit); ucmd.Parameters.Add(pa); if (fromConnection.State == ConnectionState.Closed) fromConnection.Open(); foreach (DataRow rtr in dtTables.Rows) { ucmd.Parameters["OBJECT_ID"].Value = (int)rtr[0]; string src=rtr[1].ToString(); dest = rtr[2].ToString(); var x = rtr.GetChildRows(dtActions.ParentRelations[0]); Task = $"Table {dest}"; System.Console.WriteLine($"*** Step {rtr[1].ToString()}"); if (x.Length > 0) { sqlCmdsActivate = new StringBuilder(); sqlCmdsDeActivate = new StringBuilder(); foreach (DataRow aa in x) { sqlCmdsDeActivate.Append($" {aa["ActionDeActivate"].ToString()};"); sqlCmdsActivate.Append($" {aa["ActionActivate"].ToString()};"); } } else { sqlCmdsActivate = sqlCmdsDeActivate = null; } int res = 0; if (sqlCmdsDeActivate != null) using (var cmd = new System.Data.SqlClient.SqlCommand(sqlCmdsDeActivate.ToString(), toConnection)) { cmd.CommandType = CommandType.Text; try { spLog.SeverityReset(); res = cmd.ExecuteNonQuery(); messages.AppendLine($"Success:Query={sqlCmdsDeActivate.ToString()}"); ucmd.Parameters["constraintsDeactivated"].Value = true; spLog.WriteSplunkLog(string.Empty, spLog.splunkSeverity, "constraintsDeactivated", string.Empty); } catch (System.Exception ex) { spLog.setErrorException(ex); error = true; messages.AppendLine(spLog.splunkError); ucmd.Parameters["constraintsDeactivated"].Value = false; spLog.WriteSplunkLog(string.Empty, spLog.splunkSeverity, "constraintsDeactivated", spLog.splunkError); } } int cnt = 0; qry = LSWLib.SqlCommands.getColumnsQry(fromConnection, src); SqlConnection[] curDests = new SqlConnection[] { toConnection }; cnt = Bulker.Execute(Task, fromConnection, curDests, qry, CommandType.Text, dest, 0, ref error, ref messages); ucmd.Parameters["lastRecords"].Value = cnt; if (sqlCmdsActivate != null) using (var cmd = new System.Data.SqlClient.SqlCommand(sqlCmdsActivate.ToString(), toConnection)) { cmd.CommandType = CommandType.Text; spLog.KvClear(); spLog.kvAddCommand(spl.skeys.sqlQuery, cmd); try { spLog.SeverityReset(); res = cmd.ExecuteNonQuery(); messages.AppendLine($"Success:Query={sqlCmdsActivate.ToString()}"); ucmd.Parameters["constraintsActivated"].Value = true; spLog.WriteSplunkLog(string.Empty, spLog.splunkSeverity, "constraintsActivated", spLog.splunkError); } catch (System.Exception ex) { spLog.setErrorException(ex); error = true; ucmd.Parameters["constraintsActivated"].Value = false; messages.AppendLine(spLog.splunkError); spLog.WriteSplunkLog(string.Empty, spLog.splunkSeverity, "constraintsActivated", spLog.splunkError); } } ucmd.Parameters["syncError"].Value = error; ucmd.ExecuteNonQuery(); if (error) break; } } } } return error; } static void Main(string[] args) { //Sync need both var SourceCoStr = System.Configuration.ConfigurationManager.ConnectionStrings["eDosConnectionString"].ConnectionString; var LocalCoStr = System.Configuration.ConfigurationManager.ConnectionStrings["LocalConnectionString"].ConnectionString; spLog = new spl("SynceDosLocal"); Bulker = new LSWLib.Bulker(spLog, true); messages = Bulker.messages; messages.AppendLine(spLog.GetStartInfoString()); try { using (System.Data.SqlClient.SqlConnection eDosLocalCon = new SqlConnection(LocalCoStr)) { eDosLocalCon.Open(); int? StationID = Bulker.SqlCommands.ExecProcScalar("Get Station ID", eDosLocalCon, "GetID_LocalStation", true, ref error) as int?; using (System.Data.SqlClient.SqlConnection eDosCon = new SqlConnection(SourceCoStr)) { eDosCon.InfoMessage += Connection_InfoMessage; DoorloopToDo(eDosCon, LocalCoStr, iMessage, ref error, ref warning, ref messages); DoorloopVisits(eDosLocalCon, eDosCon, Bulker.spLog); } eDosLocalCon.Close(); } } catch (System.Exception ex) { error = true; spLog.WriteSplunkLog(string.Empty, spl.iseverity.err, "syncEdosLocal", ex.Message); } if (error) goto final; final: messages.AppendLine($"Process:End,tm={System.DateTime.Now.ToString("yyyy-MM-ddTHH:mm")}, Errors={error}, Warnings={warning}"); System.Diagnostics.Debug.WriteLine(messages.ToString()); Console.WriteLine(messages.ToString()); var smtpFrom = System.Configuration.ConfigurationManager.AppSettings["smtpFrom"]; var smtpServer = System.Configuration.ConfigurationManager.AppSettings["smtpServer"]; using (System.Net.Mail.MailMessage m = new System.Net.Mail.MailMessage()) { m.From = new System.Net.Mail.MailAddress(smtpFrom); m.To.Add("lvandenb@sckcen.be"); m.Subject = "SynceDosLocal " + (error ? "Error" : "No errors") + (warning ? " Warnings" : ""); m.IsBodyHtml = true; m.Body = Bulker.htmlLog.ToString(); using (var mc = new System.Net.Mail.SmtpClient(smtpServer)) mc.Send(m); } spLog.CloseSplunkLog(); } static void DoorloopVisits(SqlConnection coLocal, SqlConnection coCentral, spl spLog) { const string sStep = "Doorloop Visits"; int VisitsNew = 0, VisitsAddedEntries = 0, VisitsAddedExits = 0, VisitsSkipped = 0; spLog.WriteSplunkLog(sStep, spl.iseverity.info); DataSet1 ds = new DataSet1(); DataSet1.CentralVisitsRow cr; try { using (var ta = new DataSet1TableAdapters.LocalVisitsTableAdapter()) using (var tc = new DataSet1TableAdapters.CentralVisitsTableAdapter()) { ta.Connection = coLocal; tc.Connection = coCentral; tc.ClearBeforeFill = false; ta.Fill(ds.LocalVisits); spLog.KvAdd(spl.skeys.recordsAffected, ds.LocalVisits.Rows.Count); foreach (DataSet1.LocalVisitsRow lr in ds.LocalVisits.Rows) { tc.Fill(ds.CentralVisits, lr.ID_Station, lr.ID_Visit); cr = ds.CentralVisits.FindByID_StationID_Visit(lr.ID_Station, lr.ID_Visit); if (cr == null) { VisitsNew++; copyrow(lr, ds.CentralVisits); } else switch (cr.VisitStatus) { case 3: lr.syncedEntry = lr.syncedExit = true; VisitsSkipped++; break; case 1: if ((lr.VisitStatus & 2) == 2) { copyExit(lr, cr); lr.syncedExit = true; VisitsAddedExits++; } break; case 2: if ((lr.VisitStatus & 1) == 1) { copyEntry(lr, cr); lr.syncedEntry = true; VisitsAddedEntries++; } break; } } ta.Update(ds.LocalVisits); tc.Update(ds.CentralVisits); } spLog.KvClear(); string r = $"Success: {VisitsNew} new , {VisitsAddedEntries} Added Entries, {VisitsAddedExits} Added Exits, {VisitsSkipped} skipped"; spLog.WriteSplunkLog(sStep, spl.iseverity.info, "end", r); } catch (System.Exception ex) { spLog.setErrorException(ex); spLog.WriteSplunkLog(sStep, spLog.splunkSeverity, null, spLog.splunkError); } } private static void copyEntry(DataSet1.LocalVisitsRow lr, DataSet1.CentralVisitsRow cr) { cr["ID_Station"] = lr["ID_Station"]; cr["ID_Visit"] = lr["ID_Visit"]; cr["Inst_CODE"] = lr["Inst_CODE"]; cr["PersID"] = lr["PersID"]; cr["ID_Task"] = lr["ID_Task"]; cr["EntryTime"] = lr["EntryTime"]; cr["ID_EPD"] = lr["ID_EPD"]; cr["isBG"] = lr["isBG"]; cr["ENTRY_EPD_CLOCK"] = lr["ENTRY_EPD_CLOCK"]; } private static void copyExit(DataSet1.LocalVisitsRow lr, DataSet1.CentralVisitsRow cr) { cr["ReturnTime"] = lr["ReturnTime"]; cr["Hp10Dose"] = lr["Hp10Dose"]; cr["Hp07Dose"] = lr["Hp07Dose"]; cr["Hp10Total"] = lr["Hp10Total"]; cr["Hp07Total"] = lr["Hp07Total"]; cr["Hp10Peak"] = lr["Hp10Peak"]; cr["Hp07Peak"] = lr["Hp07Peak"]; cr["Hp10Time"] = lr["Hp10Time"]; cr["Hp07Time"] = lr["Hp07Time"]; cr["QualityData"] = lr["QualityData"]; cr["K1"] = lr["K1"]; cr["K2"] = lr["K2"]; cr["K3"] = lr["K3"]; cr["K4"] = lr["K4"]; cr["K5"] = lr["K5"]; cr["K6"] = lr["K6"]; cr["SG"] = lr["SG"]; cr["BC"] = lr["BC"]; cr["FB"] = lr["FB"]; cr["HG"] = lr["HG"]; cr["alarmStatus"] = lr["alarmStatus"]; cr["otherAlarms"] = lr["otherAlarms"]; cr["errorStatus"] = lr["errorStatus"]; cr["operatingStatus"] = lr["operatingStatus"]; cr["isAlarm"] = lr["isAlarm"]; cr["isAlarmCleared"] = lr["isAlarmCleared"]; cr["EXIT_EPD_CLOCK"] = lr["EXIT_EPD_CLOCK"]; cr["TIME_LOST"] = lr["TIME_LOST"]; } private static DataSet1.CentralVisitsRow copyrow(DataSet1.LocalVisitsRow lr, DataSet1.CentralVisitsDataTable centralVisits) { DataSet1.CentralVisitsRow cr = centralVisits.NewCentralVisitsRow(); foreach (DataColumn sc in lr.Table.Columns) cr[sc.ColumnName] = lr[sc.ColumnName]; centralVisits.AddCentralVisitsRow(cr); return cr; } private static void Connection_InfoMessage(object sender, System.Data.SqlClient.SqlInfoMessageEventArgs e) { spLog.Connection_InfoMessageLog(e, ref messages); } } }