/// /// Copyright (c) 2015 Sensus Metering Systems /// Author: Milan Hanajík /// using System; using System.Collections.Generic; using System.IO; using log4net; using Oracle.DataAccess.Client; // ODP.NET Oracle managed provider using Oracle.DataAccess.Types; using TBF.BenchControl; using TBF.Resources; namespace TBF.BenchControl.DB.SensusOracle { public class Database : ComponentBase, IOperation, GenericDevices.IResultsWriter, Generic.IDevice { private static readonly ILog log = LogManager.GetLogger(typeof(Database)); public override string ToString() { return string.Format("ResultsWriters.Basic({0})", Cfg.ToString(1)); } readonly DatabaseCfg dbCfg; OracleConnection conn; /// Oracle database connection /// /// Result items to print /// IList resultItems; bool combined; /// /// Results to print /// Entities.Procedure procedure; IList unsortedResults; DateTime dateTime; StreamWriter writer; string separatorStr; public Database() { } public Database(DatabaseCfg cfg) : base(cfg) { dbCfg = cfg; switch (cfg.Separator) { default: case Separator.None: separatorStr = string.Empty; break; case Separator.Space: separatorStr = " "; break; case Separator.Tabulator: separatorStr = "\t"; break; case Separator.Comma: separatorStr = ","; break; case Separator.Semicolon: separatorStr = ";"; break; } log.Debug(this.ToString()); } public void Initialize() { if (dbCfg.DBUsed == DBUsed.Test) { conn = new OracleConnection("Data Source=STARA_TEST.WORLD;User Id=deltachef;Password=deltachef;"); } else if (dbCfg.DBUsed == DBUsed.Production) { conn = new OracleConnection("Data Source=STARA01.WORLD;User Id=deltachef;Password=deltachef;"); } else if (dbCfg.DBUsed == DBUsed.Quality) { /// Temporarily use test database conn = new OracleConnection("Data Source=STARA_TEST.WORLD;User Id=deltachef;Password=deltachef;"); } /// /// Do something with the database to see if the connection works well /// conn.Open(); string rslt = "none"; OracleCommand cmd = new OracleCommand("select Standort from ANBIETER_SD where ANBID = 4", conn); OracleDataReader dr = cmd.ExecuteReader(); if (dr.Read()) rslt = dr.GetString(0); conn.Close(); } public void RunDeviceBefore() {} public void RunDeviceAfter() {} public void StopDevice() { if (conn != null) conn.Dispose(); } /// /// Eliminate spaces conditionally, depesing on bool WriterCfg.EliminateSpaces /// /// Input string /// Output string string ElSpaces(string item) { if (dbCfg.EliminateSpaces) return item.Replace(" ", string.Empty); else return item; } /// /// Returns a file name derived from a DateTime structure. /// Creates directories on this path as a side effect. /// /// Date and time /// File name string GetFilename(DateTime time) { string directory = dbCfg.DestinationPath; /// Ends with "\\"; Directory.CreateDirectory(directory); if (dbCfg.YearFolders) { directory = string.Format("{0}{1}\\", directory, time.Year.ToString()); Directory.CreateDirectory(directory); } if (dbCfg.MonthFolders) { string monthStr /* = now.Month.ToString("D2")*/; switch (time.Month) { default: case 1: monthStr = "January"; break; case 2: monthStr = "February"; break; case 3: monthStr = "March"; break; case 4: monthStr = "April"; break; case 5: monthStr = "May"; break; case 6: monthStr = "June"; break; case 7: monthStr = "July"; break; case 8: monthStr = "August"; break; case 9: monthStr = "September"; break; case 10: monthStr = "October"; break; case 11: monthStr = "November"; break; case 12: monthStr = "December"; break; } directory = string.Format("{0}{1}\\", directory, monthStr); Directory.CreateDirectory(directory); } if (dbCfg.DayFolders) { directory = string.Format("{0}{1}\\", directory, time.Day.ToString("D2")); Directory.CreateDirectory(directory); } return string.Format("{0}{1}{2}{3}-{4}{5}.txt", directory, (time.Year % 100).ToString("D2"), time.Month.ToString("D2"), time.Day.ToString("D2"), time.Hour.ToString("D2"), time.Minute.ToString("D2")); } /// /// Writes the test cycle results into a file, Events: Event.ResultsWritten /// /// Procedure to print the results of /// Results to write into the file /// Reference to the operation public IOperation WriteResultsOp(Entities.Procedure procedure, IList unsortedResults) { if ((procedure == null) || (unsortedResults == null) || (unsortedResults.Count < 1)) { return null; } this.procedure = procedure; this.unsortedResults = unsortedResults; combined = (procedure.MetersKind == Entities.MetersKind.Combined); if (combined) { resultItems = Forms.ResultItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Disk_CombinedWM); } else { resultItems = Forms.ResultItemSpec.FromStrArray(Program.LocalSettings.RsltItems_Disk_SingleWM); } try { dateTime = DateTime.Now; writer = new StreamWriter(System.IO.File.Create(GetFilename(dateTime))); } catch { writer = null; } return this; } /// Start this operation public void Start() { if (writer == null) return; ///---------- /// Header ///---------- writer.WriteLine(unsortedResults[0].ProtocolTitle); writer.WriteLine(string.Empty); string[] leftColumn = new string[] { "Batch number: ", "Date and time: ", "Procedure:", Strings.User_, "Ambient temperature: ", "Ambient pressure: ", "Ambient humidity: ", }; string[] rightColumn = new string[] { unsortedResults[0].BatchNr.ToString(), //dateTime.ToShortDateString() + " " + dateTime.ToShortTimeString(), string.Format("{0}.{1}.{2} {3}:{4}", dateTime.Year.ToString("D4"), dateTime.Month.ToString("D2"), dateTime.Day.ToString("D2"), dateTime.Hour.ToString("D2"), dateTime.Minute.ToString("D2")), procedure.Name, Entities.User.CurrentUser.Name, unsortedResults[0].AmbientTempAve.ToString("F1") + " °C", unsortedResults[0].AmbientPressAve.ToString("F0") + " mbar", unsortedResults[0].AmbientHumiAve.ToString("F0") + " %", }; /// Determine max. left column width in characters int maxLen = 0; foreach (var s in leftColumn) if (s.Length > maxLen) maxLen = s.Length; /// Write aligned columns for (int i = 0; i < Math.Min(leftColumn.Length, rightColumn.Length); i++) { writer.Write(leftColumn[i]); writer.Write(new string(' ', maxLen - leftColumn[i].Length + 3)); writer.WriteLine(rightColumn[i]); } writer.WriteLine(string.Empty); ///-------- /// Body ///-------- if (combined) { for (int wmNr = 0; wmNr < Program.CompoundWMsCount; wmNr++) WriteCombinedWM(wmNr + 1); /// wmNr is 0-based } else { /// Open the Oracle database conn.Open(); for (int wmNr = 0; wmNr < Program.WMsCount; wmNr++) /// wmNr is 0-based { if (!unsortedResults[0].Meters[wmNr].Disabled) { IList results = Utils.GetSortedTestResults(procedure, unsortedResults, Utils.PartNr(wmNr + 1, combined)); WriteSingleWM(wmNr, wmNr + 1, results); SaveSingleWM2DB(wmNr, results); } } /// Close the Oracle database conn.Close(); } } /// /// Write one meter results into the database /// /// /// void SaveSingleWM2DB(int wmNr, IList results) { if (string.IsNullOrEmpty(unsortedResults[0].Meters[wmNr].SerialNr)) return; /// No database activity possible w/o PCB number string pcbNr = unsortedResults[0].Meters[wmNr].SerialNr; /// /// Read a list of all prufindexes for a given PCB Number /// IList pruefindexes = new List(); { OracleParameter parm = new OracleParameter(); parm.OracleDbType = OracleDbType.Varchar2; parm.Value = pcbNr; OracleCommand cmd1 = new OracleCommand("select MAX_Pruefindex from VT_ZAEHLER_PD where VT_Fernum = :1 AND ANBID = 4", conn); cmd1.Parameters.Add(parm); OracleDataReader dr = cmd1.ExecuteReader(); while (dr.Read()) { pruefindexes.Add(dr.GetInt32(0)); } } /// /// Determine MAX_Pruefindex /// int maxpruefindexLowPart = 0; foreach (var v in pruefindexes) { if ((v % 100) > maxpruefindexLowPart) maxpruefindexLowPart = (v % 100); } int MAX_Pruefindex = 100 * dbCfg.TestBenchId + maxpruefindexLowPart + 1; bool passed = true; int Sekundaere_Adr; int Hydr_Pruefung; foreach (var r in results) { if (!r.DoNotEvaluate && !r.Meters[wmNr].Passed) passed = false; } if (!passed) { /// Failed Sekundaere_Adr = 0; Hydr_Pruefung = 97; /// Hydr. tets failed, Pressure test passed } else { /// Passed Sekundaere_Adr = 1; if (maxpruefindexLowPart == 0) Hydr_Pruefung = 96; else Hydr_Pruefung = 224; } if (passed) { string pOrder = string.IsNullOrEmpty(unsortedResults[0].PurchaseOrder) ? string.Empty : unsortedResults[0].PurchaseOrder; OracleParameter parm1 = new OracleParameter(); parm1.OracleDbType = OracleDbType.Varchar2; parm1.Value = pOrder; OracleParameter parm2 = new OracleParameter(); parm2.OracleDbType = OracleDbType.Varchar2; parm2.Value = "IPBATMXX"; OracleParameter parm3 = new OracleParameter(); parm3.OracleDbType = OracleDbType.Varchar2; parm3.Value = pcbNr; OracleParameter parm4 = new OracleParameter(); parm4.OracleDbType = OracleDbType.Int32; parm4.Value = MAX_Pruefindex; OracleParameter parm5 = new OracleParameter(); parm5.OracleDbType = OracleDbType.Int32; parm5.Value = -1; OracleParameter parm6 = new OracleParameter(); parm6.OracleDbType = OracleDbType.Int32; parm6.Value = Sekundaere_Adr; OracleParameter parm7 = new OracleParameter(); parm7.OracleDbType = OracleDbType.Int32; parm7.Value = Hydr_Pruefung; OracleParameter parm8 = new OracleParameter(); parm8.OracleDbType = OracleDbType.Int32; parm8.Value = 6; OracleParameter parm9 = new OracleParameter(); parm9.OracleDbType = OracleDbType.Int32; parm9.Value = 4; /// = ANBID Stara Tura if (MAX_Pruefindex % 100 == 1) { OracleCommand cmd = new OracleCommand(); cmd.Connection = conn; cmd.CommandText = "INSERT INTO VT_ZAEHLER_PD(Auftragsnummer, VT_Identnummer, VT_Fernum, Max_Pruefindex, Zaehlernummer, Sekundaere_Adr, Hydr_Pruefung, ID_Benutzer, ANBID) VALUES (:1, :2, :3, :4, :5, :6, :7, :8, :9)"; cmd.Parameters.Add(parm1); cmd.Parameters.Add(parm2); cmd.Parameters.Add(parm3); cmd.Parameters.Add(parm4); cmd.Parameters.Add(parm5); cmd.Parameters.Add(parm6); cmd.Parameters.Add(parm7); cmd.Parameters.Add(parm8); cmd.Parameters.Add(parm9); int rowsUpdated = cmd.ExecuteNonQuery(); } else { //OracleCommand cmd = new OracleCommand(); //cmd.Connection = conn; //cmd.CommandText = "UPDATE VT_ZAEHLER_PD SET Auftragsnummer = :1, VT_Identnummer = :2, Max_Pruefindex = :4, Zaehlernummer = :5, Sekundaere_Adr= :6, Hydr_Pruefung= :7, ID_Benutzer= :8 WHERE VT_Fernum = :3 and ANBID = :9"; //cmd.Parameters.Add(parm1); //cmd.Parameters.Add(parm2); //cmd.Parameters.Add(parm3); //cmd.Parameters.Add(parm4); //cmd.Parameters.Add(parm5); //cmd.Parameters.Add(parm6); //cmd.Parameters.Add(parm7); //cmd.Parameters.Add(parm8); //cmd.Parameters.Add(parm9); //int rowsUpdated = cmd.ExecuteNonQuery(); OracleTransaction transaction = conn.BeginTransaction(); try { OracleCommand cmd = new OracleCommand(); cmd.Connection = conn; cmd.CommandText = "UPDATE VT_ZAEHLER_PD SET Auftragsnummer = :1, VT_Identnummer = :2, Max_Pruefindex = :4, Zaehlernummer = :5, Sekundaere_Adr= :6, Hydr_Pruefung= :7, ID_Benutzer= :8 WHERE VT_Fernum = :3 and ANBID = :9"; cmd.Parameters.Add(parm1); cmd.Parameters.Add(parm2); cmd.Parameters.Add(parm3); cmd.Parameters.Add(parm4); cmd.Parameters.Add(parm5); cmd.Parameters.Add(parm6); cmd.Parameters.Add(parm7); cmd.Parameters.Add(parm8); cmd.Parameters.Add(parm9); int rowsUpdated = cmd.ExecuteNonQuery(); transaction.Commit(); } catch { transaction.Rollback(); } } } } /// /// Write one water meter results into a file /// /// Water meter number (0-based) void WriteSingleWM(int wmNr, int printedWMNr, IList results) { /// Determine column widths int[] columnWidths = new int[resultItems.Count]; int totalWidth = 0; for (int i = 0; i < resultItems.Count; i++) { columnWidths[i] = ElSpaces(resultItems[i].ClmnHeaderText).Length; foreach (var tr in results) { if (tr != null) { string text = resultItems[i].Print(tr.Meters[wmNr]); /// Get rid of the color information string[] texts = text.Split(new char[] { '|' }); if (texts.Length == 2) { text = texts[0]; } int len = ElSpaces(text).Length; if (len > columnWidths[i]) columnWidths[i] = len; } } totalWidth += columnWidths[i]; } totalWidth += 3 * (resultItems.Count - 1); /// Write water meter number and s/n writer.Write(string.Format("Water meter {0}", printedWMNr)); if (!string.IsNullOrEmpty(unsortedResults[0].Meters[wmNr].SerialNr)) { writer.Write(string.Format(" s/n: {0}", unsortedResults[0].Meters[wmNr].SerialNr)); } writer.WriteLine(string.Empty); writer.WriteLine(new String('-', totalWidth)); /// Horizontal line above the header /// Write column headers for (int i = 0; i < resultItems.Count; i++) { writer.Write(ElSpaces(resultItems[i].ClmnHeaderText)); if (i < resultItems.Count - 1) { if (!dbCfg.EliminateSpaces) { writer.Write(new string(' ', columnWidths[i] - resultItems[i].ClmnHeaderText.Length + 3)); } writer.Write(separatorStr); } else { writer.WriteLine(string.Empty); } } writer.WriteLine(new String('-', totalWidth)); /// Horizontal line between the header and the body /// Write table data foreach (var tr in results) { if (tr != null) { for (int i = 0; i < resultItems.Count; i++) { string text = resultItems[i].Print(tr.Meters[wmNr]); /// Get rid of the color information string[] texts = text.Split(new char[] { '|' }); if (texts.Length == 2) { text = texts[0]; } writer.Write(ElSpaces(text)); if (i < resultItems.Count - 1) { if (!dbCfg.EliminateSpaces) { writer.Write(new string(' ', columnWidths[i] - text.Length + 3)); } writer.Write(separatorStr); } else { writer.WriteLine(string.Empty); } } } } writer.WriteLine(new String('-', totalWidth)); /// Horizontal line below the body writer.WriteLine(string.Empty); } /// /// Write one combined water meter results /// /// Combined water meter number (1-based) void WriteCombinedWM(int wmNr1) { IList results = Utils.GetSortedTestResults(procedure, unsortedResults, Utils.PartNr(wmNr1, combined)); /// Determin column widths int[] columnWidths = new int[resultItems.Count]; int totalWidth = 0; for (int i = 0; i < resultItems.Count; i++) { columnWidths[i] = ElSpaces(resultItems[i].ClmnHeaderText).Length; foreach (var tr in results) { if (tr != null) { string text = resultItems[i].PrintCombined(tr.Meters[2 * wmNr1 - 2], tr.Meters[2 * wmNr1 - 1], tr.CombinedMeters[wmNr1 - 1]); int len = ElSpaces(text).Length; if (len > columnWidths[i]) columnWidths[i] = len; } } totalWidth += columnWidths[i]; } totalWidth += 3 * (resultItems.Count - 1); /// Write water meter number and two s/n-s writer.Write(string.Format("Water meter {0}", wmNr1)); if (!string.IsNullOrEmpty(unsortedResults[0].Meters[2 * wmNr1 - 2].SerialNr)) { writer.Write(string.Format(", Main s/n: {0}", unsortedResults[0].Meters[2 * wmNr1 - 2].SerialNr)); } if (!string.IsNullOrEmpty(unsortedResults[0].Meters[2 * wmNr1 - 1].SerialNr)) { writer.Write(string.Format(", Aux. s/n:{0}", unsortedResults[0].Meters[2 * wmNr1 - 1].SerialNr)); } writer.WriteLine(string.Empty); writer.WriteLine(new String('-', totalWidth)); /// Horizontal line above the header for (int i = 0; i < resultItems.Count; i++) { writer.Write(ElSpaces(resultItems[i].ClmnHeaderText)); if (i < resultItems.Count - 1) { if (!dbCfg.EliminateSpaces) { writer.Write(new string(' ', columnWidths[i] - resultItems[i].ClmnHeaderText.Length + 3)); } writer.Write(separatorStr); } else { writer.WriteLine(string.Empty); } } writer.WriteLine(new String('-', totalWidth)); /// Horizontal line between the header and the body foreach (var tr in results) { if (tr != null) { for (int i = 0; i < resultItems.Count; i++) { string text = resultItems[i].PrintCombined(tr.Meters[2 * wmNr1 - 2], tr.Meters[2 * wmNr1 - 1], tr.CombinedMeters[wmNr1 - 1]); /// Get rid of the color information string[] texts = text.Split(new char[] { '|' }); if (texts.Length == 2) { text = texts[0]; } writer.Write(ElSpaces(text)); if (i < resultItems.Count - 1) { if (!dbCfg.EliminateSpaces) { writer.Write(new string(' ', columnWidths[i] - text.Length + 3)); } writer.Write(separatorStr); } else { writer.WriteLine(string.Empty); } } } } writer.WriteLine(new String('-', totalWidth)); /// Horizontal line below the body writer.WriteLine(string.Empty); } /// Run this operation /// Event.ResultsWritten public Event Run() { return Event.ResultsWritten; } /// Stop this operation public void Stop() { if (writer != null) writer.Close(); writer = null; } } }