protected DatabaseAccess() : this(/*initialize*/ false) { } // Used By PlatformDatabaseAcesss

        /// <summary>
        /// Create a new instance of the <see cref="DatabaseAccess"/> class using the given <c>IDatabaseServices</c>.
        /// </summary>
        /// <param name="initialize">True to initialize the providers, false otherwise</param>
        private DatabaseAccess(bool initialize)
        {
            if (initialize)
            {
                var source = AccessRequester;

                systemProvider  = CreatePlatformDatabaseAccessProvider(source, DatabaseSettingsSerialization.User.Runtime);
                sessionProvider = CreatePlatformDatabaseAccessProvider(source, DatabaseSettingsSerialization.User.Session);
                loggingProvider = CreatePlatformDatabaseAccessProvider(source, DatabaseSettingsSerialization.User.Log);
            }
        }
Beispiel #2
0
        /// <summary>
        /// Create a new instance of the <see cref="DatabaseAccess"/> class using the given <c>IDatabaseServices</c>.
        /// </summary>
        /// <param name="initialize">True to initialize the providers, false otherwise</param>
        /// <param name="settingsProvider">True to initialize the providers, false otherwise</param>
        private DatabaseAccess(bool initialize, ISettingsProvider settingsProvider)
        {
            if (initialize)
            {
                this.settingsProvider = settingsProvider;
                var source = settingsProvider.Get <bool>(RuntimePlatformSettings.Application.IsApplication) ? DatabaseSettingsSerialization.Source.Application : DatabaseSettingsSerialization.Source.Services;

                systemProvider = CreatePlatformDatabaseAccessProvider(source, DatabaseSettingsSerialization.User.Runtime, DatabaseSettingsSerialization.DataSpace.Platform, settingsProvider);
#if SPLIT_DEVELOPMENT
                runtimeProvider = CreatePlatformDatabaseAccessProvider(source, DatabaseSettingsSerialization.User.Runtime, DatabaseSettingsSerialization.DataSpace.Business, settingsProvider);
#endif
            }
        }
        /// <summary>
        /// The DatabaseAccessProvider responsible for connecting to a specific external database connection
        /// </summary>
        /// <param name="connectionName">Name of the connection.</param>
        /// <returns>An object to access the database</returns>
        protected internal virtual DatabaseAccessProvider <IDatabaseServices> GetDBConnectionProvider(string connectionName)
        {
            connectionName = connectionName.ToUpperInvariant();
            DatabaseAccessProvider <IDatabaseServices> provider;

            if (!dbConnectionProviders.TryGetValue(connectionName, out provider))
            {
                lock (dbConnectionProviders) {
                    if (!dbConnectionProviders.TryGetValue(connectionName, out provider))
                    {
                        ITransactionManager transactionManager = GetTransactionManager(connectionName);
                        provider = new DatabaseAccessProvider <IDatabaseServices>(transactionManager.TransactionService.DatabaseServices, transactionManager);
                        dbConnectionProviders.Add(connectionName, provider);
                    }
                }
            }
            return(provider);
        }
        protected static DatabaseAccessProvider <IPlatformDatabaseServices> GetProviderForDatabase(IRuntimeDatabaseConfiguration configurationForDatabase,
                                                                                                   DatabaseSettingsSerialization.User user, DatabaseAccessProvider <IPlatformDatabaseServices> systemDatabaseProvider,
                                                                                                   IDictionary <string, DatabaseAccessProvider <IPlatformDatabaseServices> > providersByIdentifier,
                                                                                                   IDictionary <string, ITransactionManager> transactionManagersByIdentifier)
        {
            if (configurationForDatabase == null)
            {
                return(systemDatabaseProvider);
            }

            bool supportsUnifiedTransactionManager = (user == DatabaseSettingsSerialization.User.Admin) ||
                                                     Settings.GetBool(Settings.Configs.SupportUnifiedMDC);

            var systemConfig = systemDatabaseProvider.DatabaseServices.DatabaseConfiguration;

            string managerIdentifier = supportsUnifiedTransactionManager ?
                                       configurationForDatabase.Username
                : configurationForDatabase.DatabaseIdentifier;

            string systemManagerIdentifier = supportsUnifiedTransactionManager ?
                                             systemConfig.Username
                : systemConfig.DatabaseIdentifier;

            bool sameIdentifier = managerIdentifier.EqualsIgnoreCase(systemManagerIdentifier);
            // If using the system manager to access the system database, we can use the SystemProvider
            bool sameDatabase = configurationForDatabase.DatabaseIdentifier.EqualsIgnoreCase(systemConfig.DatabaseIdentifier);

            if (sameIdentifier && sameDatabase)
            {
                return(systemDatabaseProvider);
            }

            // In unified MDC scenarios, we want to use a provider with a shared transaction manager
            // while keeping the original configuration that uses the correct database identifier
            string providerIdentifier = managerIdentifier + (supportsUnifiedTransactionManager ? "-" + configurationForDatabase.DatabaseIdentifier : "");
            DatabaseAccessProvider <IPlatformDatabaseServices> provider;

            if (!providersByIdentifier.TryGetValue(providerIdentifier, out provider))
            {
                lock (providersByIdentifier) {
                    if (!providersByIdentifier.TryGetValue(providerIdentifier, out provider))
                    {
                        ITransactionManager manager = sameIdentifier ? systemDatabaseProvider.TransactionManager : null;
                        if (manager == null && !transactionManagersByIdentifier.TryGetValue(managerIdentifier, out manager))
                        {
                            var services = PlatformDatabasePluginProvider
                                           .GetImplementation(configurationForDatabase.ProviderKey())
                                           .GetPlatformDatabaseServices(configurationForDatabase);
                            manager = services.TransactionService.CreateTransactionManager();
                            transactionManagersByIdentifier.Add(managerIdentifier, manager);
                        }

                        // TODO: Check with the Stack Team if we can optimized this
                        var dapServices = PlatformDatabasePluginProvider
                                          .GetImplementation(configurationForDatabase.ProviderKey())
                                          .GetPlatformDatabaseServices(configurationForDatabase);

                        dapServices.IntrospectionService.QueryTimeout = IntrospectionQueryTimeout;
                        provider = new DatabaseAccessProvider <IPlatformDatabaseServices>(
                            dapServices,
                            manager);

                        providersByIdentifier.Add(providerIdentifier, provider);
                    }
                }
            }
            return(provider);
        }
Beispiel #5
0
        protected static DatabaseAccessProvider <IPlatformDatabaseServices> GetProviderForDatabase(IRuntimeDatabaseConfiguration configurationForDatabase,
                                                                                                   DatabaseSettingsSerialization.User user, DatabaseAccessProvider <IPlatformDatabaseServices> baseProvider,
                                                                                                   IDictionary <string, DatabaseAccessProvider <IPlatformDatabaseServices> > providersByIdentifier,
                                                                                                   IDictionary <string, ITransactionManager> transactionManagersByIdentifier)
        {
            if (configurationForDatabase == null)
            {
                return(baseProvider);
            }

            // ***************** MDC STUFF ***************************
            var databaseConfig = baseProvider.DatabaseServices.DatabaseConfiguration;

            string managerIdentifier         = configurationForDatabase.Username;
            string databaseManagerIdentifier = databaseConfig.Username;

            bool sameIdentifier = managerIdentifier.EqualsIgnoreCase(databaseManagerIdentifier);
            // If using the system manager to access the system database, we can use the SystemProvider
            bool sameDatabase = configurationForDatabase.DatabaseIdentifier.EqualsIgnoreCase(databaseConfig.DatabaseIdentifier);

            if (sameIdentifier && sameDatabase)
            {
                return(baseProvider);
            }

            // In unified MDC scenarios, we want to use a provider with a shared transaction manager
            // while keeping the original configuration that uses the correct database identifier
            string providerIdentifier = managerIdentifier + "-" + configurationForDatabase.DatabaseIdentifier;
            DatabaseAccessProvider <IPlatformDatabaseServices> provider;

            if (!providersByIdentifier.TryGetValue(providerIdentifier, out provider))
            {
                lock (providersByIdentifier) {
                    if (!providersByIdentifier.TryGetValue(providerIdentifier, out provider))
                    {
                        ITransactionManager manager = sameIdentifier ? baseProvider.TransactionManager : null;
                        if (manager == null && !transactionManagersByIdentifier.TryGetValue(managerIdentifier, out manager))
                        {
                            var services = PlatformDatabasePluginProvider
                                           .GetImplementation(configurationForDatabase.DatabaseProvider.Key)
                                           .GetPlatformDatabaseServices(configurationForDatabase);
                            manager = services.TransactionService.CreateTransactionManager();
                            transactionManagersByIdentifier.Add(managerIdentifier, manager);
                        }

                        // TODO: Check with the Stack Team if we can optimized this
                        var dapServices = PlatformDatabasePluginProvider
                                          .GetImplementation(configurationForDatabase.DatabaseProvider.Key)
                                          .GetPlatformDatabaseServices(configurationForDatabase);

                        provider = new DatabaseAccessProvider <IPlatformDatabaseServices>(
                            dapServices,
                            manager);

                        providersByIdentifier.Add(providerIdentifier, provider);
                    }
                }
            }
            // ***************** MDC STUFF ***************************
            return(provider);
        }