tbf/MergeResultsDBs/Program.cs
Michal Buzik 0daefb93bb Add CJMS11 enhancements, logging, and resolution support
- Extended CJMS11 camera handling with new functionalities, including image grabbing, resolution configuration, and improved ROI support.
- Added new `ToString` method implementations for enhanced debugging and logging in key classes like `JmsMessage`, `JmsPacket`, and `RoiCfg`.
- Introduced additional commands (`start_stream_images`, `stop_stream_images`) in `CommandM` and its enum.
- Implemented new resolution handling in `RoiCfg` with support for configurable image frames.
- Refactored resolution-related UI elements in `RoiCfgCtrl` to add a dropdown for selecting resolution.
- Made minor UX improvements by replacing inconsistent string formats with verbatim strings in console messages.
- Updated project dependencies with new resolution-related utilities (`Frame` and `ResolutionFrames`).
- Resolved camera-specific symbolic issues by transitioning to `CJMS11.Camera` over prior naming inconsistencies.
2025-07-18 08:50:22 +02:00

191 lines
8.0 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using log4net;
using NHibernate;
using FluentNHibernate;
using Results;
using Results.Entities;
namespace MergeResultsDBs
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(@"A range of records from the 2nd database will be appended to the 1st database.");
Console.WriteLine(@"Enter the 1st (target) database name:");
string firstDB = Console.ReadLine();
Console.WriteLine(@"Enter the 2nd database name:");
string secondDB = Console.ReadLine();
Console.WriteLine(@"Enter range of batch numbers from the 2nd DB to append to the 1st DB (start-end):");
string range = Console.ReadLine();
ISession session1;
IList<Components> componentsList;
int componentsListInitialCount;
IList<TestData> testDataList;
int testDataListInitialCount;
IList<WaterMeterData> waterMeterDataList;
int waterMeterDataListInitialCount;
try
{
DB.ConnectionString = string.Format("SERVER=localhost; DATABASE={0}; UID=root; PASSWORD=kraken; CHARSET=utf8;", firstDB);
session1 = DB.CreateSession();
componentsList = session1.QueryOver<Components>().List();
componentsListInitialCount = componentsList.Count;
testDataList = session1.QueryOver<TestData>().List();
testDataListInitialCount = testDataList.Count();
waterMeterDataList = session1.QueryOver<WaterMeterData>().List();
waterMeterDataListInitialCount = waterMeterDataList.Count();
}
catch (Exception exc)
{
MessageBox.Show(string.Format("Cannot open the 1st database:\r\n{0}", exc.Message));
return;
}
ISession session2;
IList<Components> oriComponentsList;
IList<TestData> oriTestDataList;
IList<WaterMeterData> oriWMDataList;
try
{
DB.ConnectionString = string.Format("SERVER=localhost; DATABASE={0}; UID=root; PASSWORD=kraken; CHARSET=utf8;", secondDB);
session2 = DB.CreateSession();
oriComponentsList = session2.QueryOver<Components>().List();
oriTestDataList = session2.QueryOver<TestData>().List();
oriWMDataList = session2.QueryOver<WaterMeterData>().List();
}
catch (Exception exc)
{
MessageBox.Show(string.Format("Cannot open the 2nd database:\r\n{0}", exc.Message));
return;
}
int batchNrStart;
int batchNrEnd;
string[] fields = range.Split(new char[] { '-' });
if (fields.Length != 2 ||
!int.TryParse(fields[0], out batchNrStart) ||
!int.TryParse(fields[1], out batchNrEnd) ||
batchNrEnd < batchNrStart)
{
MessageBox.Show("Invalid range of batch numbers");
return;
}
Console.WriteLine(string.Format("Appending batches {0}-{1} from DB {2} to DB {3}", batchNrStart, batchNrEnd, secondDB, firstDB));
Console.WriteLine(@"Press 'y' or 'Y' to start, anything else to abort");
string response = Console.ReadLine();
if (response != "y" && response != "Y")
{
return;
}
Console.WriteLine(@"PROCESSING DATABASES ...");
for (int batchNr = batchNrStart; batchNr <= batchNrEnd; batchNr++)
{
Console.Write(string.Format("{0} ", batchNr));
/// Copy one batch from the 2nd to the 1st database
var oriBatches = session2.QueryOver<Batch>()
.Where(x => (x.BatchNr == batchNr))
.List();
if (oriBatches.Count != 1) continue;
///---------------------------------------------------------------
Batch oriBatch = oriBatches[0];
var transaction = session1.BeginTransaction();
try
{
Batch batch = new Batch(oriBatch);
oriBatch.TestRslts = session2.QueryOver<TestRslt>()
.Where(x => (x.Batch.Id == oriBatch.Id))
.List();
foreach (var oriTR in oriBatch.TestRslts)
{
/// Find appropriate Components
Components components = oriTR.Components == null
? null
: Components.UpdateList(componentsList, new Components(oriTR.Components));
if (components != null) session1.SaveOrUpdate(components);
/// Find appropriate TestData
TestData testData = TestData.UpdateList(testDataList, new TestData(oriTR.TestData));
session1.SaveOrUpdate(testData);
TestRslt tr = new TestRslt();
tr.CopyContentFrom(oriTR);
tr.Batch = batch;
tr.Components = components;
tr.TestData = testData;
batch.TestRslts.Add(tr);
session1.SaveOrUpdate(tr);
}
oriBatch.WaterMeters = session2.QueryOver<WaterMeter>()
.Where(x => (x.Batch.Id == oriBatch.Id))
.List();
foreach (var oriWM in oriBatch.WaterMeters)
{
/// Find appropriate WaterMeterData
WaterMeterData wmData = WaterMeterData.UpdateList(waterMeterDataList, new WaterMeterData(oriWM.WaterMeterData));
session1.SaveOrUpdate(wmData);
WaterMeter wm = new WaterMeter();
wm.CopyContentFrom(oriWM);
wm.Batch = batch;
wm.WaterMeterData = wmData;
foreach (var oriMTR in oriWM.MeterTestRslts)
{
MeterTestRslt mtr = new MeterTestRslt(oriMTR);
mtr.WaterMeter = wm;
mtr.TestRslt = batch.TestRslts.FirstOrDefault<TestRslt>(x => (x.Name() == oriMTR.TestRslt.Name() &&
x.Part == oriMTR.TestRslt.Part &&
x.RepetitionNr == oriMTR.TestRslt.RepetitionNr));
if (mtr.TestRslt == null)
{
throw new Exception("Something strange happened");
}
wm.MeterTestRslts.Add(mtr);
session1.SaveOrUpdate(mtr);
}
batch.WaterMeters.Add(wm);
session1.SaveOrUpdate(wm);
}
session1.SaveOrUpdate(batch);
transaction.Commit();
}
catch
{
transaction.Rollback();
throw new Exception("Commit failed - transaction reverted");
}
}
Console.WriteLine();
session1.Flush();
session1.Close();
session2.Close();
Console.WriteLine(@"Successfully completed");
Console.ReadLine();
}
}
}