Пример #1
0
        /// <summary>
        /// For internal use only!!!
        /// This method will create the store if the interfaceType has not been configured.
        /// </summary>
        /// <param name="interfaceType"></param>
        /// <param name="providerName"></param>
        // Helper
        public static void EnsureCreateStore(Type interfaceType, string providerName)
        {
            DataTypeDescriptor dataTypeDescriptor;

            if (!TryGetDataTypeDescriptor(interfaceType, out dataTypeDescriptor))
            {
                dataTypeDescriptor = BuildNewDataTypeDescriptor(interfaceType);
            }

            if (providerName == null)
            {
                // Checking if any of exising dynamic data providers already has a store for the specified interface type
                if (DataProviderRegistry.DynamicDataProviderNames
                    .Select(DataProviderPluginFacade.GetDataProvider)
                    .Cast <IDynamicDataProvider>()
                    .Any(dynamicDataProvider => dynamicDataProvider.GetKnownInterfaces().Contains(interfaceType)))
                {
                    return;
                }

                providerName = DataProviderRegistry.DefaultDynamicTypeDataProviderName;
            }
            else
            {
                var dataProvider = (IDynamicDataProvider)DataProviderPluginFacade.GetDataProvider(providerName);
                if (dataProvider.GetKnownInterfaces().Contains(interfaceType))
                {
                    return;
                }
            }

            CreateStore(providerName, dataTypeDescriptor, true);
            CodeGenerationManager.GenerateCompositeGeneratedAssembly(true);
        }
Пример #2
0
        public void GetCodeToCompile(CodeGenerationBuilder builder)
        {
            var sqlDataProvider = (SqlDataProvider)DataProviderPluginFacade.GetDataProvider(ProviderName);

            sqlDataProvider.BuildAllCode(builder);
        }
        private void CopyData(Type interfaceType)
        {
            IWritableDataProvider targetDataProvider = DataProviderPluginFacade.GetDataProvider(TargetProviderName) as IWritableDataProvider;

            Verify.IsNotNull(targetDataProvider, "Failed to get target data provider, probably it's not writeable.");

            foreach (DataScopeIdentifier dataScopeIdentifier in interfaceType.GetSupportedDataScopes())
            {
                Log.LogVerbose(LogTitle, "Copying scope '{0}' data for type '{1}'".FormatWith(dataScopeIdentifier.Name, interfaceType.FullName));

                foreach (CultureInfo cultureInfo in GetSupportedCultures(interfaceType))
                {
                    using (new DataScope(dataScopeIdentifier, cultureInfo))
                    {
                        List <IData> dataset;
                        try
                        {
                            dataset = DataFacade.GetData(interfaceType, SourceProviderName).ToDataList();

                            if (_specialHandleInterfaces.ContainsKey(interfaceType))
                            {
                                _specialHandleInterfaces[interfaceType](dataset, this.SourceProviderName,
                                                                        this.TargetProviderName);
                            }
                        }
                        catch (Exception)
                        {
                            Log.LogCritical(LogTitle, "Failed to read data from type '{0}'. See the log for the details."
                                            .FormatWith(interfaceType.FullName));
                            throw;
                        }


                        List <IData>     filteredDataset = null;
                        HashSet <string> dataIDs         = null;

                        if (IgnorePrimaryKeyViolation)
                        {
                            filteredDataset = new List <IData>();
                            dataIDs         = new HashSet <string>();
                        }

                        foreach (var data in dataset)
                        {
                            if (IgnorePrimaryKeyViolation)
                            {
                                string dataId = data.DataSourceId.ToString();
                                if (dataIDs.Contains(dataId))
                                {
                                    LoggingService.LogWarning(LogTitle, "Cannot insert a data row, since it's data ID is already used. DataID: '{0}'".FormatWith(dataId));
                                    continue;
                                }
                                dataIDs.Add(dataId);

                                filteredDataset.Add(data);
                            }
                            FixData(data);
                        }

                        if (IgnorePrimaryKeyViolation)
                        {
                            dataIDs = null;
                            dataset = filteredDataset;
                        }

                        try
                        {
                            AddData(interfaceType, dataset, targetDataProvider);
                        }
                        catch (Exception e)
                        {
                            Log.LogError(LogTitle, $"Adding failed while adding {interfaceType.Namespace}.{interfaceType.Name} because {e.Message}");
                            Log.LogError(LogTitle, e.InnerException);
                            throw;
                        }
                    }
                }
            }
        }