private List <T> GetKeyValuePairs <T>(IDataHolder obj, Func <TableDefinition, T> listCreator) where T : KeyValueListBase { DataHolderDefinition holderDefinition = this.m_mapping.GetDataHolderDefinition(obj.GetType()); List <T> source = new List <T>(this.m_mapping.TableDefinitions.Length); for (int index1 = 0; index1 < this.m_mapping.TableDefinitions.Length; ++index1) { TableDefinition table = this.m_mapping.TableDefinitions[index1]; for (int index2 = 0; index2 < table.ColumnDefinitions.Length; ++index2) { SimpleDataColumn columnDefinition = table.ColumnDefinitions[index2]; for (int index3 = 0; index3 < columnDefinition.FieldList.Count; ++index3) { IFlatDataFieldAccessor field = columnDefinition.FieldList[index3]; if (field.DataHolderDefinition == holderDefinition) { T obj1 = source.FirstOrDefault <T>((Func <T, bool>)(l => l.TableName == table.Name)); if ((object)obj1 == null) { source.Add(obj1 = listCreator(table)); } object obj2 = field.Get(obj); obj1.AddPair(columnDefinition.ColumnName, (object)obj2.ToString()); } } } } return(source); }
static void AddMapping(LightDBDefinitionSet defs, TableDefinition[] defaultTables, SimpleFlatFieldDefinition fieldDef, Dictionary<string, List<SimpleDataColumn>> mappedFields, IFlatDataFieldAccessor accessor, MemberInfo member) { var column = fieldDef.Column; var tables = defs.EnsureTables(fieldDef.Table, defaultTables); object defaultValue; if (!String.IsNullOrEmpty(fieldDef.DefaultStringValue)) { defaultValue = StringParser.Parse(fieldDef.DefaultStringValue, member.GetVariableType()); } else { if (String.IsNullOrEmpty(column)) { return; } defaultValue = null; } foreach (var table in tables) { var dataHolders = defs.m_tableDataHolderMap.GetOrCreate(table); if (!dataHolders.Contains(accessor.DataHolderDefinition)) { dataHolders.Add(accessor.DataHolderDefinition); } var mappedFieldMap = mappedFields.GetOrCreate(table.Name); SimpleDataColumn dataColumn; var dbAttrs = member.GetCustomAttributes<DBAttribute>(); var attr = dbAttrs.Where(attribute => attribute is PersistentAttribute).FirstOrDefault() as PersistentAttribute; if (String.IsNullOrEmpty(column)) { // use default value mappedFieldMap.Add(dataColumn = new SimpleDataColumn(fieldDef.Name, defaultValue)); } else { dataColumn = mappedFieldMap.Find((cmpField) => cmpField.ColumnName == column); if (dataColumn == null) { var type = member.GetActualType(); if (attr != null) type = attr.ReadType ?? type; var reader = Converters.GetReader(type); mappedFieldMap.Add(dataColumn = new SimpleDataColumn(column, reader)); } } dataColumn.FieldList.Add(accessor); } }
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); }
/// <summary> /// Fetches all sets of objects, defined through the given mapping. /// </summary> /// <returns></returns> public void Fetch() { List <Action> actionList = new List <Action>(10000); TableDefinition[] tableDefinitions = this.m_mapping.TableDefinitions; DataHolderDefinition holderDefinition1 = (DataHolderDefinition)null; for (int tableIndex = 0; tableIndex < tableDefinitions.Length; ++tableIndex) { TableDefinition def = tableDefinitions[tableIndex]; try { using (IDataReader reader = this.m_db.CreateReader(def, tableIndex)) { SimpleDataColumn[] columnDefinitions = def.ColumnDefinitions; while (reader.Read()) { object key = def.GetId(reader); DataHolderDefinition holderDefinition2 = (DataHolderDefinition)null; IDataHolder dataHolder1 = (IDataHolder)null; object firstValue = (object)null; SimpleDataColumn simpleDataColumn = (SimpleDataColumn)null; try { for (int index1 = 0; index1 < columnDefinitions.Length; ++index1) { simpleDataColumn = columnDefinitions[index1]; firstValue = (object)null; firstValue = simpleDataColumn.ReadValue(reader); for (int index2 = 0; index2 < simpleDataColumn.FieldList.Count; ++index2) { IFlatDataFieldAccessor field = simpleDataColumn.FieldList[index2]; holderDefinition1 = field.DataHolderDefinition; if (holderDefinition1 == null) { throw new DataHolderException( "Invalid DataField did not have a DataHolderDefinition: " + (object)field, new object[0]); } IDataHolder dataHolder2; if (holderDefinition2 != field.DataHolderDefinition || dataHolder1 == null) { Dictionary <object, IDataHolder> dictionary = this.dataHolderMap.GetOrCreate <Type, object, IDataHolder>( holderDefinition1.Type); if (!dictionary.TryGetValue(key, out dataHolder2)) { if (!def.IsDefaultTable) { LightDBMgr.OnInvalidData( "Invalid DataHolder was not defined in its Default-Tables - DataHolder: {0}; Id(s): {1}; Table: {2}", (object)holderDefinition1, key, (object)def); index1 = columnDefinitions.Length; break; } dictionary.Add(key, dataHolder2 = (IDataHolder)holderDefinition1.CreateHolder(firstValue)); actionList.Add(new Action(dataHolder2.FinalizeDataHolder)); } dataHolder1 = dataHolder2; holderDefinition2 = holderDefinition1; } else { dataHolder2 = dataHolder1; } field.Set(dataHolder2, firstValue); } } } catch (Exception ex) { object[] objArray1; if (!(key is Array)) { objArray1 = new object[1] { key } } ; else { objArray1 = (object[])key; } object[] objArray2 = objArray1; throw new DataHolderException(ex, "Unable to parse data-cell (Column: {0}, Id(s): {1}{2})", new object[3] { (object)simpleDataColumn, (object)((IEnumerable <object>)objArray2).ToString <object>(", ", (Func <object, object>)(idObj => idObj.GetType().IsEnum ? Convert.ChangeType(idObj, Enum.GetUnderlyingType(idObj.GetType())) : idObj)), firstValue != null ? (object)(", Value: " + firstValue) : (object)"" }); } } } } catch (Exception ex) { throw new DataHolderException(ex, "Failed to read from Table \"{0}\" {1}", new object[2] { (object)def, holderDefinition1 != null ? (object)("DataHolder: " + (object)holderDefinition1) : (object)"" }); } } for (int index = 0; index < actionList.Count; ++index) { actionList[index](); } this.dataHolderMap.Clear(); this.m_fetched = true; }
private static void AddMapping(LightDBDefinitionSet defs, TableDefinition[] defaultTables, SimpleFlatFieldDefinition fieldDef, Dictionary <string, List <SimpleDataColumn> > mappedFields, IFlatDataFieldAccessor accessor, MemberInfo member) { string column = fieldDef.Column; TableDefinition[] tableDefinitionArray = defs.EnsureTables(fieldDef.Table, defaultTables); object defaultValue; if (!string.IsNullOrEmpty(fieldDef.DefaultStringValue)) { defaultValue = StringParser.Parse(fieldDef.DefaultStringValue, member.GetVariableType()); } else { if (string.IsNullOrEmpty(column)) { return; } defaultValue = (object)null; } foreach (TableDefinition key in tableDefinitionArray) { List <DataHolderDefinition> holderDefinitionList = defs.m_tableDataHolderMap.GetOrCreate <TableDefinition, DataHolderDefinition>(key); if (!holderDefinitionList.Contains(accessor.DataHolderDefinition)) { holderDefinitionList.Add(accessor.DataHolderDefinition); } List <SimpleDataColumn> simpleDataColumnList = mappedFields.GetOrCreate <string, SimpleDataColumn>(key.Name); PersistentAttribute persistentAttribute = ((IEnumerable <DBAttribute>)member.GetCustomAttributes <DBAttribute>()) .Where <DBAttribute>((Func <DBAttribute, bool>)(attribute => attribute is PersistentAttribute)) .FirstOrDefault <DBAttribute>() as PersistentAttribute; SimpleDataColumn simpleDataColumn; if (string.IsNullOrEmpty(column)) { simpleDataColumnList.Add(simpleDataColumn = new SimpleDataColumn(fieldDef.Name, defaultValue)); } else { simpleDataColumn = simpleDataColumnList.Find( (Predicate <SimpleDataColumn>)(cmpField => cmpField.ColumnName == column)); if (simpleDataColumn == null) { Type type1 = member.GetActualType(); if (persistentAttribute != null) { Type type2 = persistentAttribute.ReadType; if ((object)type2 == null) { type2 = type1; } type1 = type2; } IFieldReader reader = Converters.GetReader(type1); simpleDataColumnList.Add(simpleDataColumn = new SimpleDataColumn(column, reader)); } } simpleDataColumn.FieldList.Add(accessor); } }
static void AddMapping(LightDBDefinitionSet defs, TableDefinition[] defaultTables, SimpleFlatFieldDefinition fieldDef, Dictionary<string, List<SimpleDataColumn>> mappedFields, IFlatDataFieldAccessor accessor, MemberInfo member) { var column = fieldDef.Column; var tables = defs.EnsureTables(fieldDef.Table, defaultTables); object defaultValue; if (!String.IsNullOrEmpty(fieldDef.DefaultStringValue)) { defaultValue = Utility.Parse(fieldDef.DefaultStringValue, member.GetVariableType()); } else { if (String.IsNullOrEmpty(column)) { return; } defaultValue = null; } if (accessor.DataHolderDefinition.Type.Name.EndsWith("TrainerEntry")) { defs.ToString(); } foreach (var table in tables) { var dataHolders = defs.m_tableDataHolderMap.GetOrCreate(table); if (!dataHolders.Contains(accessor.DataHolderDefinition)) { dataHolders.Add(accessor.DataHolderDefinition); } var mappedFieldMap = mappedFields.GetOrCreate(table.Name); SimpleDataColumn dataColumn; if (String.IsNullOrEmpty(column)) { // use default value mappedFieldMap.Add(dataColumn = new SimpleDataColumn(fieldDef.Name, defaultValue)); } else { dataColumn = mappedFieldMap.Find((cmpField) => cmpField.ColumnName == column); if (dataColumn == null) { mappedFieldMap.Add(dataColumn = new SimpleDataColumn(column, Converters.GetReader(member.GetActualType()))); } } dataColumn.FieldList.Add(accessor); } }
static void AddMapping(LightDBDefinitionSet defs, TableDefinition[] defaultTables, SimpleFlatFieldDefinition fieldDef, Dictionary <string, List <SimpleDataColumn> > mappedFields, IFlatDataFieldAccessor accessor, MemberInfo member) { var column = fieldDef.Column; var tables = defs.EnsureTables(fieldDef.Table, defaultTables); object defaultValue; if (!String.IsNullOrEmpty(fieldDef.DefaultStringValue)) { defaultValue = StringParser.Parse(fieldDef.DefaultStringValue, member.GetVariableType()); } else { if (String.IsNullOrEmpty(column)) { return; } defaultValue = null; } foreach (var table in tables) { var dataHolders = defs.m_tableDataHolderMap.GetOrCreate(table); if (!dataHolders.Contains(accessor.DataHolderDefinition)) { dataHolders.Add(accessor.DataHolderDefinition); } var mappedFieldMap = mappedFields.GetOrCreate(table.Name); SimpleDataColumn dataColumn; var dbAttrs = member.GetCustomAttributes <DBAttribute>(); var attr = dbAttrs.Where(attribute => attribute is PersistentAttribute).FirstOrDefault() as PersistentAttribute; if (String.IsNullOrEmpty(column)) { // use default value mappedFieldMap.Add(dataColumn = new SimpleDataColumn(fieldDef.Name, defaultValue)); } else { dataColumn = mappedFieldMap.Find((cmpField) => cmpField.ColumnName == column); if (dataColumn == null) { var type = member.GetActualType(); if (attr != null) { type = attr.ReadType ?? type; } var reader = Converters.GetReader(type); mappedFieldMap.Add(dataColumn = new SimpleDataColumn(column, reader)); } } dataColumn.FieldList.Add(accessor); } }