private void CopyEDStationCommodityToDataRow(EDStation StationObject, dsEliteDB Data, ref UInt32 AutoIndex)
{
Int32 i;
String[] currentCommodityCollection = null;
String currentCommodityAttribute = null;
try
{
var existingClassification = ((dsEliteDB.tbcommodityclassificationRow[])Data.tbcommodityclassification.Select("station_id = " + StationObject.Id)).ToList();
var newCommodityClassification = new Dictionary<String, List<String>>();
// collect classification data
for(i=0 ; i<=2 ; i++)
{
switch (i)
{
case 0:
currentCommodityCollection = StationObject.ImportCommodities;
currentCommodityAttribute = "import";
break;
case 1:
currentCommodityCollection = StationObject.ExportCommodities;
currentCommodityAttribute = "export";
break;
case 2:
currentCommodityCollection = StationObject.ProhibitedCommodities;
currentCommodityAttribute = "prohibited";
break;
}
foreach (var Commodity in currentCommodityCollection)
{
// cyxle throught the <Attribute>-commodities from the station
List<String> currentClassification;
if(!newCommodityClassification.TryGetValue(Commodity, out currentClassification))
{
// this commodity is not registered at all
var newCL = new List<String>() {currentCommodityAttribute};
newCommodityClassification.Add(Commodity, newCL);
}
else
{
// this commodity is already registered
if(!currentClassification.Contains(currentCommodityAttribute))
{
// but not yet for this classification
currentClassification.Add(currentCommodityAttribute);
}
}
}
}
// process classification data
foreach (var Classification in newCommodityClassification)
{
// get the current commodity id
Int32 CommodityID = (Int32)DBConvert.From(BaseTableNameToID("commodity", Classification.Key));
UInt32 CClassifID;
// and check, if the commodity is already added to station
var Found = from dsEliteDB.tbcommodityclassificationRow relevantCommodity in existingClassification
where ((relevantCommodity.RowState != DataRowState.Deleted)
&& (relevantCommodity.commodity_id == CommodityID))
select relevantCommodity;
// if it's not existing, insert commodity
if(Found.Count() == 0)
{
var newRow = (dsEliteDB.tbcommodityclassificationRow)Data.tbcommodityclassification.NewRow();
newRow.id = AutoIndex;
newRow.station_id = StationObject.Id;
newRow.commodity_id = CommodityID;
Data.tbcommodityclassification.Rows.Add(newRow);
CClassifID = newRow.id;
AutoIndex += 1;
}
else
{
// memorize the id and remove commodity from list to mark it as "found"
CClassifID = Found.First().id;
existingClassification.Remove(Found.First());
//Debug.Print("removed " + Classification.Key);
}
var existingAttributes = ((dsEliteDB.tbcommodity_has_attributeRow[])Data.tbcommodity_has_attribute.Select("tbcommodityclassification_id = " + CClassifID)).ToList();
// now check the attributes for this commodity
foreach (var Attribute in Classification.Value)
{
// get the current attribute id
Int32 AttributeID = (Int32)DBConvert.From(BaseTableNameToID("attribute", Attribute));
// and check, if the attribute is already added to classification
var FoundCC = from dsEliteDB.tbcommodity_has_attributeRow relevantCommodity in existingAttributes
where relevantCommodity.RowState != DataRowState.Deleted
&& relevantCommodity.tbAttribute_id == AttributeID
select relevantCommodity;
// if it's not existing, insert attribute
if(FoundCC.Count() == 0)
{
var newRow = (dsEliteDB.tbcommodity_has_attributeRow)Data.tbcommodity_has_attribute.NewRow();
newRow.tbAttribute_id = AttributeID;
newRow.tbCommodityClassification_id = CClassifID;
Data.tbcommodity_has_attribute.Rows.Add(newRow);
}
else
{
// remove attribute from list to mark it as "found"
existingAttributes.Remove(FoundCC.First());
}
}
// remove all old, not more existing attributes
foreach (DataRow RemovedRow in existingAttributes)
Data.tbcommodity_has_attribute.Rows.Remove(RemovedRow);
}
// remove all old, not more existing classification
foreach (DataRow RemovedRow in existingClassification)
Data.tbcommodityclassification.Rows.Remove(RemovedRow);
}
catch (Exception ex)
{
throw new Exception("Error while copying station commodity data", ex);
}
}