Esempio n. 1
0
        public static void SaveDefinitionStub(string file, DataHolderDefinition dataHolderDef)
        {
            XmlDataHolderDefinition holderDefinition = new XmlDataHolderDefinition()
            {
                Name          = dataHolderDef.Name,
                DefaultTables = new string[1] {
                    " "
                },
                Fields = new DataFieldDefinition[dataHolderDef.Fields.Count]
            };
            int num = 0;

            foreach (IDataField field in dataHolderDef.Fields.Values)
            {
                holderDefinition.Fields[num++] = LightDBMgr.DataFieldCreators[(int)field.DataFieldType](field);
            }
            LightRecordXmlConfig lightRecordXmlConfig = new LightRecordXmlConfig();

            lightRecordXmlConfig.FileName    = file;
            lightRecordXmlConfig.DataHolders = new XmlDataHolderDefinition[1]
            {
                holderDefinition
            };
            lightRecordXmlConfig.Save();
        }
Esempio n. 2
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);
        }
Esempio n. 3
0
 internal void SetMainDataHolder(DataHolderDefinition dataDef, bool isDefaultTable)
 {
     if (this.MainDataHolder != null)
     {
         return;
     }
     this.m_mainDataHolder = dataDef;
     this.m_isDefaultTable = isDefaultTable;
 }
Esempio n. 4
0
 internal void SetMainDataHolder(DataHolderDefinition dataDef, bool isDefaultTable)
 {
     if (MainDataHolder != null)
     {
         return;
         //throw new DataHolderException("Table was set as DefaultTable for more than one DataHolder: \"" + dataDef + "\" and \"" + MainDataHolder + "\"");
     }
     m_mainDataHolder = dataDef;
     m_isDefaultTable = isDefaultTable;
 }
 public static void CompleteStep2(DataHolderDefinition dataHolder, string filterText = null)
 {
     if (filterText != null)
     {
         UIMap.FilterDatasetsDatatables(filterText);
     }
     UIMap.SelectDatasetOrDatatableByName(dataHolder.Name.Replace(",", "\\,"));
     UIMap.NextButton().WaitForControlEnabled();
     UIMap.ClickNextButton();
 }
Esempio n. 6
0
 public void SaveCache(string filename)
 {
     using (BinaryWriter writer =
                new BinaryWriter((Stream) new FileStream(filename, FileMode.Create, FileAccess.Write)))
     {
         this.WriteHeader(writer);
         for (int index = 0; index < this.m_mapping.DataHolderDefinitions.Length; ++index)
         {
             DataHolderDefinition holderDefinition = this.m_mapping.DataHolderDefinitions[index];
             object obj = holderDefinition.CacheGetter.Invoke((object)null, new object[0]);
             new BinaryContentStream(holderDefinition).WriteAll(writer, (IEnumerable)obj);
         }
     }
 }
Esempio n. 7
0
        public static void SaveDefinitionStub(string file, DataHolderDefinition dataHolderDef)
        {
            var def = new XmlDataHolderDefinition {
                Name          = dataHolderDef.Name,
                DefaultTables = new[] { " " },
                Fields        = new DataFieldDefinition[dataHolderDef.Fields.Count]
            };

            int i = 0;

            foreach (var field in dataHolderDef.Fields.Values)
            {
                def.Fields[i++] = DataFieldCreators[(int)field.DataFieldType](field);
            }

            var cfg = new LightRecordXmlConfig {
                FileName    = file,
                DataHolders = new[] { def }
            };

            cfg.Save();
        }
Esempio n. 8
0
        private static bool AddTables(ICollection <DataHolderDefinition> allDefs, DataHolderDefinition def,
                                      Dictionary <DataHolderDefinition, List <TableDefinition> > dataHolderToTable,
                                      HashSet <DataHolderDefinition> dataHolders, HashSet <TableDefinition> tables)
        {
            if (!allDefs.Contains(def))
            {
                return(false);
            }
            allDefs.Remove(def);
            dataHolders.Add(def);
            foreach (TableDefinition tableDefinition in dataHolderToTable[def])
            {
                tables.Add(tableDefinition);
                foreach (DataHolderDefinition holderDefinition in tableDefinition.DataHolderDefinitions)
                {
                    dataHolders.Add(holderDefinition);
                    AddTables(allDefs, holderDefinition, dataHolderToTable, dataHolders, tables);
                }
            }

            return(true);
        }
Esempio n. 9
0
        private List <KeyValuePair <string, object> > GetWherePairs(TableDefinition table, IDataHolder obj)
        {
            DataHolderDefinition holderDefinition = this.m_mapping.GetDataHolderDefinition(obj.GetType());
            List <KeyValuePair <string, object> > keyValuePairList = new List <KeyValuePair <string, object> >(2);

            foreach (PrimaryColumn primaryColumn in table.PrimaryColumns)
            {
                foreach (IFlatDataFieldAccessor field in primaryColumn.DataColumn.FieldList)
                {
                    if (field.DataHolderDefinition == holderDefinition)
                    {
                        object obj1 = field.Get(obj);
                        if (obj1 != null)
                        {
                            keyValuePairList.Add(
                                new KeyValuePair <string, object>(primaryColumn.Name, (object)obj1.ToString()));
                        }
                    }
                }
            }

            return(keyValuePairList);
        }
 static bool AddTables(ICollection <DataHolderDefinition> allDefs,
                       DataHolderDefinition def,
                       Dictionary <DataHolderDefinition, List <TableDefinition> > dataHolderToTable,
                       HashSet <DataHolderDefinition> dataHolders,
                       HashSet <TableDefinition> tables)
 {
     if (allDefs.Contains(def))
     {
         allDefs.Remove(def);
         dataHolders.Add(def);
         foreach (var table in dataHolderToTable[def])
         {
             tables.Add(table);
             foreach (var dataHolder in table.DataHolderDefinitions)
             {
                 dataHolders.Add(dataHolder);
                 AddTables(allDefs, dataHolder, dataHolderToTable, dataHolders, tables);
             }
         }
         return(true);
     }
     return(false);
 }
Esempio n. 11
0
 public string CodeFromDataHolder(DataHolderDefinition dh)
 {
     return(ChainType == ChainTypes.TimeSeries
         ? ((Dataset)dh).Code
         : ((Datatable)dh).Code);
 }
Esempio n. 12
0
 public DataFieldProxy(string fieldName, DataHolderDefinition dataHolderDef)
 {
     m_FieldName = fieldName;
     m_DataHolderDef = dataHolderDef;
 }
Esempio n. 13
0
        /// <summary>
        /// Fetches all sets of objects, defined through the given mapping.
        /// </summary>
        /// <returns></returns>
        public void Fetch()
        {
            // Map of objects, mapped by DataHolder-Type, DataHolder-Id and field-Name
            //var objects = new Dictionary<Type, Dictionary<object, Dictionary<string, object>>>();
            var actions = new List <Action>(10000);
            var tables  = m_mapping.TableDefinitions;
            DataHolderDefinition holderDef = null;

            for (var t = 0; t < tables.Length; t++)
            {
                var table = tables[t];
                try
                {
                    using (var rs = m_db.CreateReader(table, t))
                    {
                        var mappedFields = table.ColumnDefinitions;
                        while (rs.Read())
                        {
                            var id = table.GetId(rs);

                            DataHolderDefinition lastDataHolderDef = null;
                            IDataHolder          lastDataHolder    = null;
                            object           value  = null;
                            SimpleDataColumn column = null;
                            int columnN;
                            try
                            {
                                for (columnN = 0; columnN < mappedFields.Length; columnN++)
                                {
                                    column = mappedFields[columnN];
                                    value  = null;
                                    value  = column.ReadValue(rs);
                                    for (var i = 0; i < column.FieldList.Count; i++)
                                    {
                                        var dataField = column.FieldList[i];
                                        holderDef = dataField.DataHolderDefinition;
                                        if (holderDef == null)
                                        {
                                            throw new DataHolderException(
                                                      "Invalid DataField did not have a DataHolderDefinition: " +
                                                      dataField);
                                        }

                                        IDataHolder holder;
                                        if (lastDataHolderDef != dataField.DataHolderDefinition || lastDataHolder == null)
                                        {
                                            // only get the DataHolder, if its different from the last one
                                            var dataHolders = dataHolderMap.GetOrCreate(holderDef.Type);
                                            if (!dataHolders.TryGetValue(id, out holder))
                                            {
                                                // create new DataHolder object if this is one of the DataHolder's default tables
                                                if (!table.IsDefaultTable)
                                                {
                                                    // ignore DataHolders that are not defined in their DefaultTables
                                                    LightDBMgr.OnInvalidData(
                                                        "Invalid DataHolder was not defined in its Default-Tables - " +
                                                        "DataHolder: {0}; Id(s): {1}; Table: {2}", holderDef, id, table);
                                                    // little trick to skip the parent loop
                                                    columnN = mappedFields.Length;
                                                    break;
                                                }

                                                // init with Id(s)
                                                dataHolders.Add(id, holder = (IDataHolder)holderDef.CreateHolder(value));
                                                //table.SetDefaults(id, holder);
                                                actions.Add(holder.FinalizeDataHolder);
                                            }

                                            lastDataHolder    = holder;
                                            lastDataHolderDef = holderDef;
                                        }
                                        else
                                        {
                                            holder = lastDataHolder;
                                        }

                                        // set value
                                        dataField.Set(holder, value);
                                    }
                                }
                            }
                            catch (Exception e)
                            {
                                var ids = (id is Array ? ((object[])id) : new[] { id });
                                throw new DataHolderException(e, "Unable to parse data-cell (Column: {0}, Id(s): {1}{2})", column,
                                                              ids.ToString(", ", (idObj) => {
                                    return(idObj.GetType().IsEnum ? Convert.ChangeType(idObj, Enum.GetUnderlyingType(idObj.GetType())) : idObj);
                                }), value != null ? (", Value: " + value) : "");
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    throw new DataHolderException(e, "Failed to read from Table \"{0}\" {1}", table,
                                                  holderDef != null ? ("DataHolder: " + holderDef) : "");
                }
            }

            for (var i = 0; i < actions.Count; i++)
            {
                var action = actions[i];
                action();
            }

            dataHolderMap.Clear();
            m_fetched = true;
        }
Esempio n. 14
0
 public DataFieldProxy(string fieldName, DataHolderDefinition dataHolderDef)
 {
     this.m_FieldName     = fieldName;
     this.m_DataHolderDef = dataHolderDef;
 }
Esempio n. 15
0
 public TableDefinition[] EnsureTables(string tableName, DataHolderDefinition def)
 {
     return(EnsureTables(tableName, GetDefaultTables(def)));
 }
Esempio n. 16
0
 public TableDefinition[] GetDefaultTables(DataHolderDefinition def)
 {
     TableDefinition[] tableDefinitionArray;
     DefaultTables.TryGetValue(def.Name, out tableDefinitionArray);
     return(tableDefinitionArray);
 }
Esempio n. 17
0
        private void RegisterDefintion(LightRecordXmlConfig cfg, Dictionary <string, List <SimpleDataColumn> > fieldMap)
        {
            DataHolderDefinition[]  holderDefinitions = DataHolderDefinitions;
            XmlDataHolderDefinition holderDefinition1 = null;

            foreach (XmlDataHolderDefinition holderDefinition2 in cfg)
            {
                XmlDataHolderDefinition dataRawDef = holderDefinition2;
                try
                {
                    if (dataRawDef.Name == null)
                    {
                        throw new DataHolderException("Invalid DataHolder-definition has no name ({0}).", holderDefinition1 == null
              ? (object)"First in file"
              : (object)("After: " + (object)holderDefinition1));
                    }
                    dataRawDef.EnsureFieldsNotNull();
                    DataHolderDefinition dataDef = holderDefinitions
                                                   .Where(def =>
                                                          def.Name.Equals(dataRawDef.Name, StringComparison.InvariantCultureIgnoreCase))
                                                   .FirstOrDefault();
                    if (dataDef == null)
                    {
                        LightDBMgr.OnInvalidData("Invalid DataHolder-definition refers to non-existing DataHolder: " +
                                                 dataRawDef.Name);
                    }
                    else
                    {
                        TableDefinition[] tableDefinitionArray;
                        TableDefinition[] array;
                        if (DefaultTables.TryGetValue(dataDef.Name, out tableDefinitionArray))
                        {
                            array = tableDefinitionArray;
                        }
                        else
                        {
                            array = null;
                            tableDefinitionArray = dataRawDef.DefaultTables == null
                ? new TableDefinition[0]
                : new TableDefinition[dataRawDef.DefaultTables.Length];
                        }

                        for (int index = 0; index < tableDefinitionArray.Length; ++index)
                        {
                            string          key = dataRawDef.DefaultTables[index].Trim();
                            TableDefinition tableDefinition;
                            if (!TableDefinitionMap.TryGetValue(key, out tableDefinition))
                            {
                                throw new DataHolderException(
                                          "DefaultTable \"{0}\" of DataHolder \"{1}\" is not defined - Make sure to define the table in the Table collection.",
                                          (object)key, (object)dataRawDef);
                            }
                            tableDefinitionArray[index] = tableDefinition;
                            tableDefinition.SetMainDataHolder(dataDef, true);
                        }

                        DefaultTables[dataDef.Name] = tableDefinitionArray;
                        if (dataRawDef.DataHolderName.Contains("Trainer"))
                        {
                            ToString();
                        }
                        AddFieldMappings(dataRawDef.Fields,
                                         dataDef.Fields, fieldMap);
                        if (array != null)
                        {
                            int length = array.Length;
                            Array.Resize(ref array, array.Length + tableDefinitionArray.Length);
                            Array.Copy(tableDefinitionArray, 0, array, length,
                                       tableDefinitionArray.Length);
                            DefaultTables[dataDef.Name] = array;
                        }

                        holderDefinition1 = dataRawDef;
                    }
                }
                catch (Exception ex)
                {
                    throw new DataHolderException(ex,
                                                  "Failed to parse DataHolder-definition \"" + dataRawDef + "\" from {0}", (object)cfg.FileName);
                }
            }
        }
Esempio n. 18
0
        public static DataHolderTableMapping[] CreateDataHolderTableMappings(
            Dictionary <TableDefinition, List <DataHolderDefinition> > tableDataHolderMap,
            DataHolderDefinition[] dataHolderDefinitions)
        {
            Dictionary <DataHolderDefinition, List <TableDefinition> > dictionary =
                new Dictionary <DataHolderDefinition, List <TableDefinition> >();

            foreach (KeyValuePair <TableDefinition, List <DataHolderDefinition> > tableDataHolder in tableDataHolderMap)
            {
                if (tableDataHolder.Value == null)
                {
                    log.Warn(
                        "Table-definition \"{0}\" has no used columns (and can possibly be removed from the config).");
                }
                else
                {
                    tableDataHolder.Key.DataHolderDefinitions = tableDataHolder.Value.ToArray();
                    foreach (DataHolderDefinition holderDefinition in tableDataHolder.Key.DataHolderDefinitions)
                    {
                        dictionary.GetOrCreate(holderDefinition)
                        .Add(tableDataHolder.Key);
                    }
                }
            }

            List <DataHolderTableMapping>  holderTableMappingList = new List <DataHolderTableMapping>();
            HashSet <DataHolderDefinition> holderDefinitionSet1   =
                new HashSet <DataHolderDefinition>(
                    dictionary.Keys.ToArray());
            HashSet <DataHolderDefinition> holderDefinitionSet2 = new HashSet <DataHolderDefinition>();
            HashSet <TableDefinition>      tableDefinitionSet   = new HashSet <TableDefinition>();

            foreach (DataHolderDefinition key in dictionary.Keys)
            {
                if (AddTables(holderDefinitionSet1, key,
                              dictionary, holderDefinitionSet2, tableDefinitionSet))
                {
                    DataHolderTableMapping holderTableMapping = new DataHolderTableMapping(
                        holderDefinitionSet2.ToArray(),
                        tableDefinitionSet.ToArray());
                    holderTableMappingList.Add(holderTableMapping);
                    holderDefinitionSet2.Clear();
                    tableDefinitionSet.Clear();
                }
            }

            foreach (TableDefinition key in tableDataHolderMap.Keys)
            {
                TableDefinition table = key;
                foreach (SimpleDataColumn columnDefinition in table.ColumnDefinitions)
                {
                    if (columnDefinition is IDataFieldBase)
                    {
                        DataHolderDefinition holderDefinition =
                            ((IDataFieldBase)columnDefinition).DataHolderDefinition;
                        if (!holderDefinitionSet2.Contains(holderDefinition))
                        {
                            DataHolderTableMapping holderTableMapping =
                                holderTableMappingList.Find(map =>
                                                            map.TableDefinitions.Contains(
                                                                table));
                            DataHolderDefinition[] holderDefinitions = holderTableMapping.DataHolderDefinitions;
                            holderTableMapping.DataHolderDefinitions =
                                new DataHolderDefinition[holderDefinitions.Length + 1];
                            Array.Copy(holderDefinitions, holderTableMapping.TableDefinitions,
                                       holderDefinitions.Length);
                            holderTableMapping.DataHolderDefinitions[holderDefinitions.Length] = holderDefinition;
                        }
                    }
                }
            }

            return(holderTableMappingList.ToArray());
        }
Esempio n. 19
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);
        }
Esempio n. 20
0
 protected DataFieldBase(DataHolderDefinition dataHolder, IGetterSetter accessor, INestedDataField parent)
 {
     this.m_DataHolderDefinition = dataHolder;
     this.m_parent   = parent;
     this.m_accessor = accessor;
 }
        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);
        }
Esempio n. 22
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;
        }