private void FinishLoading(Dictionary <string, List <SimpleDataColumn> > fieldMap) { foreach (KeyValuePair <string, List <SimpleDataColumn> > field1 in fieldMap) { TableDefinition table = GetTable(field1.Key); SimpleDataColumn[] fields = field1.Value.ToArray(); if (!string.IsNullOrEmpty(table.MainDataHolderName)) { DataHolderDefinition dataDef = DataHolderDefinitions .Where(dataHolderDef => dataHolderDef.Name.Equals(table.MainDataHolderName, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault(); if (dataDef == null) { throw new DataHolderException("Table \"{0}\" refered to invalid MainDataHolder: {1}", (object)table, (object)table.MainDataHolderName); } table.SetMainDataHolder(dataDef, false); } try { List <PrimaryColumn> primaryColumnList = new List <PrimaryColumn>(); primaryColumnList.AddRange(table.PrimaryColumns); for (int index = 0; index < fields.Length; ++index) { SimpleDataColumn field = fields[index]; PrimaryColumn primaryColumn = primaryColumnList .Where( primCol => primCol.Name == field.ColumnName) .FirstOrDefault(); if (primaryColumn != null) { primaryColumn.DataColumn = field; field.IsPrimaryKey = true; primaryColumnList.Remove(primaryColumn); } if (field.ColumnName == null && field.DefaultValue == null) { LightDBMgr.OnInvalidData( "Field-definition \"{0}\" did not define a Column nor a DefaultValue.", (object)field); } } for (int index1 = 0; index1 < fields.Length; ++index1) { SimpleDataColumn simpleDataColumn1 = fields[index1]; for (int index2 = 0; index2 < simpleDataColumn1.FieldList.Count; ++index2) { IFlatDataFieldAccessor field2 = simpleDataColumn1.FieldList[index2]; if (field2.DataHolderDefinition.DependingField == field2) { SimpleDataColumn simpleDataColumn2 = fields[0]; fields[0] = simpleDataColumn1; fields[index1] = simpleDataColumn2; } } } if (primaryColumnList.Count > 0 && table.MainDataHolder == null) { throw new DataHolderException( "Table \"{0}\" referenced PrimaryColumn(s) ({1}) but did not define a MainDataHolder explicitely.", (object)table, (object)primaryColumnList.ToString(", ")); } if (primaryColumnList.Count > 0 || table.Variables != null && table.Variables.Length > 0) { int num1 = table.Variables != null ? table.Variables.Length : 0; int destinationIndex = num1 + primaryColumnList.Count; SimpleDataColumn[] simpleDataColumnArray = new SimpleDataColumn[fields.Length + destinationIndex]; Array.Copy(fields, 0, simpleDataColumnArray, destinationIndex, fields.Length); fields = simpleDataColumnArray; if (num1 > 0) { InitVars(table, fields); } int num2 = num1; foreach (PrimaryColumn primaryColumn in primaryColumnList) { DataFieldProxy dataFieldProxy = new DataFieldProxy(primaryColumn.Name, table.MainDataHolder); IFieldReader reader = Converters.GetReader(primaryColumn.TypeName); if (reader == null) { throw new DataHolderException( "Invalid Type \"" + primaryColumn.TypeName + "\" for PrimaryColumn \"" + primaryColumn.Name + "\" in definition for Table: " + table + " - You must explicitely define the TypeName attribute inside the PrimaryColumn node, if it is only an additional table for a DataHolder!"); } SimpleDataColumn simpleDataColumn = new SimpleDataColumn(primaryColumn.Name, reader, 0) { IsPrimaryKey = true }; simpleDataColumn.FieldList.Add(dataFieldProxy); fields[num2++] = primaryColumn.DataColumn = simpleDataColumn; } } int num = 0; for (int index = 0; index < fields.Length; ++index) { SimpleDataColumn simpleDataColumn = fields[index]; if (simpleDataColumn.DefaultValue == null) { simpleDataColumn.m_index = num++; } else { simpleDataColumn.Reader = null; } } TableDefinitionMap[field1.Key].ColumnDefinitions = fields; } catch (Exception ex) { throw new DataHolderException(ex, "Unable to setup Table \"{0}\" (MainDataHolder: \"{1}\")", (object)table, (object)table.MainDataHolder); } } m_mappings = CreateDataHolderTableMappings(m_tableDataHolderMap, DataHolderDefinitions); }
private void FinishLoading(Dictionary <string, List <SimpleDataColumn> > fieldMap) { // bind mapping-objects to tables foreach (var pair in fieldMap) { var table = GetTable(pair.Key); var fields = pair.Value.ToArray(); if (!string.IsNullOrEmpty(table.MainDataHolderName)) { DataHolderDefinition defaultDef = DataHolderDefinitions.Where(dataHolderDef => dataHolderDef.Name.Equals(table.MainDataHolderName, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault(); if (defaultDef == null) { throw new DataHolderException("Table \"{0}\" refered to invalid MainDataHolder: {1}", table, table.MainDataHolderName); } table.SetMainDataHolder(defaultDef, false); } try { var primCols = new List <PrimaryColumn>(); primCols.AddRange(table.PrimaryColumns); // find Primary Columns, set defaults and consider depending fields for (var i = 0; i < fields.Length; i++) { var field = fields[i]; var col = primCols.Where(primCol => primCol.Name == field.ColumnName).FirstOrDefault(); if (col != null) { col.DataColumn = field; field.IsPrimaryKey = true; primCols.Remove(col); //var tmp = fields[0]; //fields[0] = field; //fields[i] = tmp; } if (field.ColumnName == null && field.DefaultValue == null) { LightDBMgr.OnInvalidData("Field-definition \"{0}\" did not define a Column nor a DefaultValue.", field); } } // put the depending Fields first (if any) for (var i = 0; i < fields.Length; i++) { var field = fields[i]; for (var j = 0; j < field.FieldList.Count; j++) { var dataField = field.FieldList[j]; var dataHolder = dataField.DataHolderDefinition; if (dataHolder.DependingField == dataField) { var tmp = fields[0]; fields[0] = field; fields[i] = tmp; } } } //if (primCols.Count() > 0) //{ // throw new DataHolderException("Table-definition \"{0}\" refered to non-existing PrimaryKey(s): {1}", // pair.Key, primCols.ToString(", ")); //} if (primCols.Count > 0 && table.MainDataHolder == null) { throw new DataHolderException("Table \"{0}\" referenced PrimaryColumn(s) ({1}) but did not define a MainDataHolder explicitely.", table, primCols.ToString(", ")); } // custom primary columns and variables if (primCols.Count > 0 || (table.Variables != null && table.Variables.Length > 0)) { var varCount = table.Variables != null ? table.Variables.Length : 0; var extraFields = varCount + primCols.Count; var tmpArr = new SimpleDataColumn[fields.Length + extraFields]; Array.Copy(fields, 0, tmpArr, extraFields, fields.Length); fields = tmpArr; if (varCount > 0) { InitVars(table, fields); } var i = varCount; foreach (var primaryCol in primCols) { // PrimaryKey-field is not explicitely mapped but only used as a reference var proxyField = new DataFieldProxy(primaryCol.Name, table.MainDataHolder); var reader = Converters.GetReader(primaryCol.TypeName); if (reader == null) { throw new DataHolderException("Invalid Type \"" + primaryCol.TypeName + "\" for PrimaryColumn \"" + primaryCol.Name + "\" in definition for Table: " + table + " - " + "You must explicitely define the TypeName attribute inside the PrimaryColumn node, if it is only an additional table for a DataHolder!"); } var col = new SimpleDataColumn(primaryCol.Name, reader, 0) { IsPrimaryKey = true }; col.FieldList.Add(proxyField); fields[i++] = primaryCol.DataColumn = col; } } var index = 0; for (var i = 0; i < fields.Length; i++) { var field = fields[i]; if (field.DefaultValue == null) { field.m_index = index++; } else { field.Reader = null; } } TableDefinitionMap[pair.Key].ColumnDefinitions = fields; } catch (Exception ex) { throw new DataHolderException(ex, "Unable to setup Table \"{0}\" (MainDataHolder: \"{1}\")", table, table.MainDataHolder); } } m_mappings = CreateDataHolderTableMappings(m_tableDataHolderMap, DataHolderDefinitions); }