/// <summary>
        /// Этот метод переопределён, чтобы создать словарь соответствия длинных и коротких имён для псевдонимов.
        /// </summary>
        /// <param name="storageStruct">
        /// The storage Struct.
        /// </param>
        /// <param name="addNotMainKeys">
        /// The add Not Main Keys.
        /// </param>
        /// <param name="addMasterFieldsCustomizer">
        /// The add Master Fields Customizer.
        /// </param>
        /// <param name="AddingAdvansedField">
        /// The Adding Advansed Field.
        /// </param>
        /// <param name="AddingKeysCount">
        /// The Adding Keys Count.
        /// </param>
        /// <param name="SelectTypesIds">
        /// The Select Types Ids.
        /// </param>
        /// <returns>
        /// The <see cref="string"/>.
        /// </returns>
        public override string GenerateSQLSelectByStorageStruct(
            StorageStructForView storageStruct,
            bool addNotMainKeys,
            bool addMasterFieldsCustomizer,
            string AddingAdvansedField,
            int AddingKeysCount,
            bool SelectTypesIds)
        {
            StorageStructForView.PropSource source = storageStruct.sources;
            foreach (StorageStructForView.PropSource subSource in source.LinckedStorages)
            {
                for (int j = 0; j < subSource.storage.Length; j++)
                {
                    string curAlias = subSource.Name + j;
                    GenerateShortName(curAlias);
                }
            }

            for (int i = 0; i < storageStruct.props.Length; i++)
            {
                StorageStructForView.PropStorage prop = storageStruct.props[i];
                if (prop.MultipleProp)
                {
                    continue;
                }

                bool propStored = prop.Stored;
                if (propStored && (string.IsNullOrEmpty(prop.Expression) || this.IsExpressionContainAttrubuteCheckOnly(prop.Expression)))
                {
                    if (prop.MastersTypesCount > 0)
                    {
                        string deniedAccessValue = string.Empty;
                        bool   isAccessDenied    = SecurityManager.UseRightsOnAttribute &&
                                                   !SecurityManager.CheckAccessToAttribute(
                            prop.Expression,
                            out deniedAccessValue);

                        for (int j = 0; j < prop.storage.Length; j++)
                        {
                            for (int k = 0; k < prop.MastersTypes[j].Length; k++)
                            {
                                string curName = isAccessDenied ? deniedAccessValue : prop.source.Name + j;
                                GenerateShortName(curName);
                            }
                        }
                    }
                    else
                    {
                        for (int j = 0; j < prop.storage.Length; j++)
                        {
                            GenerateShortName(prop.source.Name + j);
                        }
                    }
                }
            }

            return(base.GenerateSQLSelectByStorageStruct(storageStruct, addNotMainKeys, addMasterFieldsCustomizer, AddingAdvansedField, AddingKeysCount, SelectTypesIds));
        }
Example #2
0
        /// <summary>
        /// Возвращает сформированную таблицу данных для указанного запроса в виде lcs
        /// </summary>
        /// <param name="customizationStruct">lcs для формирования запроса данных</param>
        /// <param name="storageStructs">Структуры хранения, которые будут получены из lcs.</param>
        /// <param name="maxCountKeys">Максимальное колличество ключей для структур хранения.</param>
        /// <returns></returns>
        private DataTable GetDataSet(LoadingCustomizationStruct customizationStruct, out StorageStructForView[] storageStructs,
                                     out int maxCountKeys)
        {
            var resData = new DataTable("ResultTable");

            maxCountKeys   = 0;
            storageStructs = new StorageStructForView[customizationStruct.LoadingTypes.Length];

            if (customizationStruct.LoadingTypes.Length == 0)
            {
                return(resData);
            }

            var countKeys = new int[customizationStruct.LoadingTypes.Length];

            for (int i = 0; i < customizationStruct.LoadingTypes.Length; i++)
            {
                storageStructs[i] = Information.GetStorageStructForView(customizationStruct.View, customizationStruct.LoadingTypes[i],
                                                                        StorageTypeEnum.SimpleStorage, null, GetType());
                countKeys[i] = Utils.CountMasterKeysInSelect(storageStructs[i]);

                if (countKeys[i] > maxCountKeys)
                {
                    maxCountKeys = countKeys[i];
                }
            }

            resData.TableName = "__" + customizationStruct.LoadingTypes[0].Name;
            List <ColumnInfo> columnsInfo = AddColumnsToDataTable(resData, storageStructs);

            for (int i = 0; i < storageStructs.Length; i++)
            {
                FillDataTable(resData, storageStructs[i], columnsInfo, i);
            }

            //TODO разобраться с for (int j = 0; j < addingKeysCount;  j++) AddColumn(STORMJoinedMasterKey)


            return(resData);
        }
Example #3
0
        /// <summary>
        /// Добавляет в таблицу новые строки с заполненными данными для указанной структуры
        /// </summary>
        /// <param name="dt">Таблица, в которую добавляются строки.</param>
        /// <param name="storageStruct">Структура хранения на основе которой будут добавлять строки.</param>
        /// <param name="columnsInfo">Информация о колонках для определения, что и в какие колонки записывать.</param>
        /// <param name="structIndex">
        /// Номер структуры.
        /// Необходим для того, чтобы достать настройки из информации о колонках.
        /// Если необходимо заполнить таблицу одним массивом данных и структура была одна, то необходимо передать 0.
        /// </param>
        private void FillDataTable(DataTable dt, StorageStructForView storageStruct, List <ColumnInfo> columnsInfo,
                                   int structIndex)
        {
            DataTable mainDataTable  = _dataSet.Tables[storageStruct.sources.storage[0].Storage];
            int       startRowsIndex = dt.Rows.Count;

            // Добавляем столько строк, сколько их в таблице основного объекта данных
            for (int i = 0; i < mainDataTable.Rows.Count; i++)
            {
                dt.Rows.Add(dt.NewRow());
            }

            // В этот список будут записаны мастеровые таблицы после соединения.
            var masterTables = new Dictionary <StorageStructForView.PropSource, DataTable>();

            SetAllMasterTables(storageStruct.sources, mainDataTable, masterTables);

            // Далее заполняем таблицу по ячейкам.
            foreach (var columnInfo in columnsInfo)
            {
                StorageStructForView.PropStorage propStorage = columnInfo.PropStorages == null
                                                                   ? null
                                                                   : columnInfo.PropStorages[structIndex];
                StorageStructForView.PropSource propSource = columnInfo.PropSources == null
                                                                 ? null
                                                                 : columnInfo.PropSources[structIndex];

                // Если это свойство хранимое
                if (propStorage != null && propStorage.Stored && !columnInfo.IsStormDataObjectType &&
                    !columnInfo.IsStormJoinedMasterKey && !columnInfo.IsStormMainObjectKey)
                {
                    // Если это свойство является собственным для основного объекта данных, то ищем в основной таблице.
                    if (propSource == storageStruct.sources)
                    {
                        for (int i = 0; i < mainDataTable.Rows.Count; i++)
                        {
                            dt.Rows[i + startRowsIndex][columnInfo.ColumnName] = mainDataTable.Rows[i][propStorage.Name];
                        }
                    }
                    else if (masterTables.ContainsKey(propSource))
                    {
                        // иначе это свойство мастера и надо брать его из таблицы мастеров после соединения
                        for (int i = 0; i < mainDataTable.Rows.Count; i++)
                        {
                            dt.Rows[i + startRowsIndex][columnInfo.ColumnName] =
                                masterTables[propSource].Rows[i][propStorage.simpleName];
                        }
                    }
                }
                else
                {
                    if (columnInfo.IsStormMainObjectKey)
                    {
                        // в эту колонку записываются первичные ключи основного объекта данных
                        for (int i = 0; i < mainDataTable.Rows.Count; i++)
                        {
                            dt.Rows[i + startRowsIndex][columnInfo.ColumnName] =
                                mainDataTable.Rows[i][storageStruct.sources.storage[0].PrimaryKeyStorageName];
                        }
                    }
                    else if (columnInfo.IsStormDataObjectType)
                    {
                        // В эту колонку записывается номер типа для загрузки данных.
                        // Он необходим когда читаются наследники через базовый класс.
                        for (int i = 0; i < mainDataTable.Rows.Count; i++)
                        {
                            dt.Rows[i + startRowsIndex][columnInfo.ColumnName] = structIndex;
                        }
                    }
                    else if (columnInfo.IsStormJoinedMasterKey)
                    {
                        // если этот мастер был указан в представлении, то его можно вытянуть через PropStorage
                        string simpleName = propStorage != null
                                                ? propStorage.simpleName
                                                : propSource.storage[0].PrimaryKeyStorageName;

                        // в эти колонки записываются первичные ключи мастеров
                        for (int i = 0; i < mainDataTable.Rows.Count; i++)
                        {
                            // Ключ мастера храниться в таблице мастера
                            if (masterTables.ContainsKey(propSource))
                            {
                                dt.Rows[i + startRowsIndex][columnInfo.ColumnName] =
                                    masterTables[propSource].Rows[i][simpleName];
                            }
                            else
                            {
                                // или его можно взять сразу из таблицы основного объекта данных
                                dt.Rows[i + startRowsIndex][columnInfo.ColumnName] = mainDataTable.Rows[i][simpleName];
                            }
                        }
                    }
                }
            }
        }
Example #4
0
        /// <summary>
        /// Заполнить объект данных.
        /// </summary>
        /// <param name="dobject">Объект данных.</param>
        /// <param name="values">Значения для заполнения.</param>
        /// <param name="storageStruct">Метаданные структуры хранения.</param>
        /// <param name="customizationStruct">Настройка выборки данных.</param>
        /// <param name="typesByKeys">Служебная структура, увязывающая типы мастеров и их ключи.</param>
        /// <param name="advCols">Дополнительные колонки.</param>
        /// <param name="dataObjectCache">Кэш объектов данных.</param>
        /// <param name="securityManager">Менеджер полномочий.</param>
        public static void FillRowSetToDataObject(DataObject dobject, object[] values, StorageStructForView storageStruct, LoadingCustomizationStruct customizationStruct, System.Collections.SortedList typesByKeys, AdvansedColumn[] advCols, DataObjectCache dataObjectCache, ISecurityManager securityManager)
        {
            Type dobjectType = dobject.GetType();

            /* access type */

            if (!securityManager.AccessObjectCheck(dobjectType, tTypeAccess.Full, false))
            {
                securityManager.AccessObjectCheck(dobjectType, tTypeAccess.Read, true);
            }

            /* access type */

            // Заливаем данные в объект данных.
            int customizationStructViewPropertiesLength = customizationStruct.View.Properties.Length;
            int advColsLength = advCols.Length;

            Information.SetPropValueByName(dobject, "__PrimaryKey", values[customizationStructViewPropertiesLength + advColsLength]);

            // 1. создаем структуру мастеров(свойств-объектов данных).
            System.Collections.SortedList assList = new System.Collections.SortedList();
            int index = customizationStructViewPropertiesLength + 1 + advColsLength;

            CreateMastersStruct(dobject, values, ref index, 0, storageStruct.sources, assList, typesByKeys, dataObjectCache);
            assList.Add(storageStruct.sources, new object[] { dobject, 0 });

            // 2. заливаем данные.
            System.Collections.ArrayList properiesValues = new System.Collections.ArrayList();
            StringCollection             allAdvCols      = new StringCollection();

            int masterPosition = index;

            for (int i = 0; i < advColsLength; i++)
            {
                object value = values[i + customizationStructViewPropertiesLength];
                if (value == DBNull.Value)
                {
                    value = null;
                }

                properiesValues.Add(new[] { advCols[i].Name, value, dobject });
                allAdvCols.Add(advCols[i].Name);
                dobject.DynamicProperties.Add(advCols[i].Name, null);
            }

            for (int i = 0; i < customizationStructViewPropertiesLength; i++)
            {
                StorageStructForView.PropStorage prop = storageStruct.props[i];
                if (Information.IsStoredProperty(dobjectType, prop.Name) || prop.Expression != null)
                {
                    if (prop.MastersTypes == null)
                    {
                        object[] tmp = (object[])assList[prop.source];
                        object   value;
                        if (customizationStruct.ColumnsOrder != null && customizationStruct.ColumnsOrder.Length >= customizationStructViewPropertiesLength)
                        {
                            value = values[Array.IndexOf(customizationStruct.ColumnsOrder, prop.Name)];
                        }
                        else
                        {
                            value = values[i];
                        }

                        if (value == DBNull.Value)
                        {
                            value = null;
                        }

                        if (tmp != null)
                        {
                            properiesValues.Add(
                                new[] { prop.simpleName, value, tmp[0] });
                        }
                    }
                    else
                    {
                        object[] tmp = (object[])assList[prop.source];
                        if (tmp != null)
                        {
                            // Ищем позицию.
                            int tmp1 = (int)tmp[1];
                            int curMasterPosition = masterPosition;
                            for (int j = 0; j < tmp1; j++)
                            {
                                curMasterPosition += prop.MastersTypes[j].Length;
                            }

                            int    k     = 0;
                            object value = values[curMasterPosition];
                            if (value == DBNull.Value)
                            {
                                value = null;
                            }

                            while (k < prop.MastersTypes[tmp1].Length - 1 && value == null)
                            {
                                k++;
                                value = values[curMasterPosition + k];
                                if (value == DBNull.Value)
                                {
                                    value = null;
                                }
                            }

                            object tmp0 = tmp[0];
                            if (value != null)
                            {
                                if (Information.GetPropValueByName((DataObject)tmp0, prop.simpleName) == null)
                                {
                                    DataObject no = dataObjectCache.CreateDataObject(prop.MastersTypes[tmp1][k], value);
                                    if (no.GetStatus(false) == ObjectStatus.Created)
                                    {
                                        no.SetStatus(ObjectStatus.UnAltered);
                                        no.SetLoadingState(LoadingState.LightLoaded);
                                        no.InitDataCopy(dataObjectCache);
                                    }

                                    value = no;
                                    properiesValues.Add(new[] { prop.simpleName, value, tmp0 });
                                }
                                else
                                {
                                    // changed by fat
                                    properiesValues.Add(new[] { prop.simpleName, Information.GetPropValueByName((DataObject)tmp0, prop.simpleName), tmp0 });
                                }
                            }
                            else
                            {
                                properiesValues.Add(new[] { prop.simpleName, null, tmp0 });
                            }
                        }

                        masterPosition += prop.MastersTypesCount;
                    }
                }
            }

            // 2.2 Записываем в объекты.
            System.Collections.SortedList curObjProperiesValues = new System.Collections.SortedList();
            while (properiesValues.Count > 0)
            {
                // a. Выбираем для текущего объекта все свойства.
                object[]   tmp    = (object[])properiesValues[0];
                DataObject curobj = (DataObject)tmp[2];
                dobjectType = curobj.GetType();
                curObjProperiesValues.Clear();

                List <string> loadedPropsColl = curobj.GetLoadedPropertiesList();

                for (int i = properiesValues.Count - 1; i >= 0; i--)
                {
                    tmp = (object[])properiesValues[i];
                    if (tmp[2] == curobj)
                    {
                        object tmp0 = tmp[0];
                        if (!curObjProperiesValues.ContainsKey(tmp0))
                        {
                            curObjProperiesValues.Add(tmp0, tmp[1]);
                            if (!loadedPropsColl.Contains((string)tmp0))
                            {
                                loadedPropsColl.Add((string)tmp0);
                            }
                        }

                        properiesValues.RemoveAt(i);
                    }
                }

                // b. Раскидываем согласно LoadOrder;
                string[] loadOrder       = Information.GetLoadingOrder(dobjectType);
                int      loadOrderLength = loadOrder.Length;
                for (int i = 0; i < loadOrderLength; i++)
                {
                    string propName = loadOrder[i];
                    if (curObjProperiesValues.ContainsKey(propName))
                    {
                        Information.SetPropValueByName(curobj, propName, curObjProperiesValues[propName]);
                        curObjProperiesValues.Remove(propName);
                    }
                }

                int curObjPropertiesValuesCount = curObjProperiesValues.Count;
                for (int i = 0; i < curObjPropertiesValuesCount; i++)
                {
                    Information.SetPropValueByName(curobj, (string)curObjProperiesValues.GetKey(i), curObjProperiesValues.GetByIndex(i));
                }

                if (loadedPropsColl.Count >= Information.GetAllPropertyNames(dobjectType).Length)
                {
                    curobj.SetLoadingState(LoadingState.Loaded);
                }
                else
                {
                    curobj.SetLoadingState(LoadingState.LightLoaded);
                    curobj.AddLoadedProperties(loadedPropsColl);
                }

                curobj.SetStatus(ObjectStatus.UnAltered);
            }
        }