示例#1
0
        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);
        }
示例#2
0
		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);
			}
		}
示例#3
0
        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);
        }
示例#4
0
        /// <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;
        }
示例#5
0
        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);
            }
        }
示例#6
0
		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);
			}
		}
示例#7
0
        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);
            }
        }