public async Task InitializeMembershipTable(GlobalConfiguration config, bool tryInitTableVersion, TraceLogger traceLogger) { logger = traceLogger; deploymentId = config.DeploymentId; if (logger.IsVerbose3) { logger.Verbose3("SqlMembershipTable.InitializeMembershipTable called."); } database = RelationalStorageUtilities.CreateGenericStorageInstance(config.AdoInvariant, config.DataConnectionString); //This initializes all of Orleans operational queries from the database using a well known view //and assumes the database with appropriate defintions exists already. queryConstants = await database.InitializeOrleansQueriesAsync(); // even if I am not the one who created the table, // try to insert an initial table version if it is not already there, // so we always have a first table version row, before this silo starts working. if (tryInitTableVersion) { var wasCreated = await InitTableAsync(); if (wasCreated) { logger.Info("Created new table version row."); } } }
public static QueryConstantsBag CreateTestManagementQueries(string invariantName) { //This is probably the same for all the databases. const string DeleteAllDataTemplate = @"DELETE OrleansStatisticsTable; DELETE OrleansClientMetricsTable; DELETE OrleansSiloMetricsTable; DELETE OrleansRemindersTable; DELETE OrleansMembershipTable; DELETE OrleansMembershipVersionTable;"; var queryBag = new QueryConstantsBag(); queryBag.AddOrModifyQueryConstant(AdoNetInvariants.InvariantNameSqlServer, RelationalTestingConstants.DeleteAllDataKey, DeleteAllDataTemplate); switch (invariantName) { case (AdoNetInvariants.InvariantNameSqlServer): { return(CreateSqlServerQueries()); } default: { break; } } return(queryBag); }
/// <summary> /// Initializes Orleans queries from the database. Orleans uses only these queries and the variables therein, nothing more. /// </summary> /// <param name="storage">The storage to use.</param> /// <returns>Orleans queries have been loaded to silo or client memory.</returns> /// <remarks>This is public only to be usable to the statistics providers. Not intended for public use otherwise.</remarks> public static async Task <QueryConstantsBag> InitializeOrleansQueriesAsync(this IRelationalStorage storage) { var queryConstants = new QueryConstantsBag(); var query = queryConstants.GetConstant(storage.InvariantName, QueryKeys.OrleansQueriesKey); var orleansQueries = await storage.ReadAsync(query, _ => { }, (selector, _) => { return(Tuple.Create(selector.GetValue <string>("QueryKey"), selector.GetValue <string>("QueryText"))); }).ConfigureAwait(continueOnCapturedContext: false); //The queries need to be added to be used later with a given key. foreach (var orleansQuery in orleansQueries) { queryConstants.AddOrModifyQueryConstant(storage.InvariantName, orleansQuery.Item1, orleansQuery.Item2); } //Check that all the required keys are loaded and throw an exception giving the keys expected but not loaded. var loadedQueriesKeys = queryConstants.GetAllConstants(storage.InvariantName).Keys; var missingQueryKeys = QueryKeys.Keys.Except(loadedQueriesKeys); if (missingQueryKeys.Any()) { throw new ArgumentException(string.Format("Not all required queries found when loading from the database. Missing are: {0}", string.Join(",", missingQueryKeys))); } return(await Task.FromResult(queryConstants)); }
/// <summary> /// Initializes Orleans queries from the database. Orleans uses only these queries and the variables therein, nothing more. /// </summary> /// <param name="storage">The storage to use.</param> /// <returns>Orleans queries have been loaded to silo or client memory.</returns> /// <remarks>This is public only to be usable to the statistics providers. Not intended for public use otherwise.</remarks> public static async Task<QueryConstantsBag> InitializeOrleansQueriesAsync(this IRelationalStorage storage) { var queryConstants = new QueryConstantsBag(); var query = queryConstants.GetConstant(storage.InvariantName, QueryKeys.OrleansQueriesKey); var orleansQueries = await storage.ReadAsync(query, _ => { }, (selector, _) => { return Tuple.Create(selector.GetValue<string>("QueryKey"), selector.GetValue<string>("QueryText")); }).ConfigureAwait(continueOnCapturedContext: false); //The queries need to be added to be used later with a given key. foreach(var orleansQuery in orleansQueries) { queryConstants.AddOrModifyQueryConstant(storage.InvariantName, orleansQuery.Item1, orleansQuery.Item2); } //Check that all the required keys are loaded and throw an exception giving the keys expected but not loaded. var loadedQueriesKeys = queryConstants.GetAllConstants(storage.InvariantName).Keys; var missingQueryKeys = QueryKeys.Keys.Except(loadedQueriesKeys); if(missingQueryKeys.Any()) { throw new ArgumentException(string.Format("Not all required queries found when loading from the database. Missing are: {0}", string.Join(",", missingQueryKeys))); } return await Task.FromResult(queryConstants); }
public async Task Init(GlobalConfiguration config, TraceLogger logger) { serviceId = config.ServiceId.ToString(); deploymentId = config.DeploymentId; database = RelationalStorageUtilities.CreateGenericStorageInstance(config.AdoInvariantForReminders, config.DataConnectionStringForReminders); queryConstants = await database.InitializeOrleansQueriesAsync(); }
public async Task InitializeGatewayListProvider(ClientConfiguration config, TraceLogger traceLogger) { logger = traceLogger; if (logger.IsVerbose3) { logger.Verbose3("SqlMembershipTable.InitializeGatewayListProvider called."); } deploymentId = config.DeploymentId; maxStaleness = config.GatewayListRefreshPeriod; database = RelationalStorageUtilities.CreateGenericStorageInstance(config.AdoInvariant, config.DataConnectionString); //This initializes all of Orleans operational queries from the database using a well known view //and assumes the database with appropriate defintions exists already. queryConstants = await database.InitializeOrleansQueriesAsync(); }
public async Task Init(string name, IProviderRuntime providerRuntime, IProviderConfiguration config) { Name = name; logger = providerRuntime.GetLogger("SqlStatisticsPublisher"); string adoInvariant = AdoNetInvariants.InvariantNameSqlServer; if (config.Properties.ContainsKey("AdoInvariant")) { adoInvariant = config.Properties["AdoInvariant"]; } database = RelationalStorageUtilities.CreateGenericStorageInstance(adoInvariant, config.Properties["ConnectionString"]); queryConstants = await database.InitializeOrleansQueriesAsync(); }
/// <summary> /// Seeks for database provider factory classes from GAC or as indicated by /// the configuration file, see at <see href="https://msdn.microsoft.com/en-us/library/dd0w4a2z%28v=vs.110%29.aspx">Obtaining a DbProviderFactory</see>. /// </summary> /// <returns>Database constants with values from <see cref="DbProviderFactories"/>.</returns> /// <remarks>Every call may potentially update data as it is refreshed from <see cref="DbProviderFactories"/>.</remarks> public static QueryConstantsBag GetAdoNetFactoryData() { var queryBag = new QueryConstantsBag(); //This method seeks for factory classes either from the GAC or as indicated in a config file. var factoryData = DbProviderFactories.GetFactoryClasses(); //The provided default information will be loaded from here to the factory constants //which are further augmented with predefined query templates. foreach (DataRow row in factoryData.Rows) { var invariantName = row[AdoNetInvariants.InvariantNameKey].ToString(); queryBag.AddOrModifyQueryConstant(invariantName, AdoNetInvariants.InvariantNameKey, invariantName); queryBag.AddOrModifyQueryConstant(invariantName, AdoNetInvariants.NameKey, row[AdoNetInvariants.NameKey].ToString()); queryBag.AddOrModifyQueryConstant(invariantName, AdoNetInvariants.DescriptionKey, row[AdoNetInvariants.DescriptionKey].ToString()); queryBag.AddOrModifyQueryConstant(invariantName, AdoNetInvariants.AssemblyQualifiedNameKey, row[AdoNetInvariants.AssemblyQualifiedNameKey].ToString()); } return(queryBag); }
/// <summary> /// Seeks for database provider factory classes from GAC or as indicated by /// the configuration file, see at <see href="https://msdn.microsoft.com/en-us/library/dd0w4a2z%28v=vs.110%29.aspx">Obtaining a DbProviderFactory</see>. /// </summary> /// <returns>Database constants with values from <see cref="DbProviderFactories"/>.</returns> /// <remarks>Every call may potentially update data as it is refreshed from <see cref="DbProviderFactories"/>.</remarks> public static QueryConstantsBag GetAdoNetFactoryData() { var queryBag = new QueryConstantsBag(); //This method seeks for factory classes either from the GAC or as indicated in a config file. var factoryData = DbProviderFactories.GetFactoryClasses(); //The provided default information will be loaded from here to the factory constants //which are further augmented with predefined query templates. foreach(DataRow row in factoryData.Rows) { var invariantName = row[AdoNetInvariants.InvariantNameKey].ToString(); queryBag.AddOrModifyQueryConstant(invariantName, AdoNetInvariants.InvariantNameKey, invariantName); queryBag.AddOrModifyQueryConstant(invariantName, AdoNetInvariants.NameKey, row[AdoNetInvariants.NameKey].ToString()); queryBag.AddOrModifyQueryConstant(invariantName, AdoNetInvariants.DescriptionKey, row[AdoNetInvariants.DescriptionKey].ToString()); queryBag.AddOrModifyQueryConstant(invariantName, AdoNetInvariants.AssemblyQualifiedNameKey, row[AdoNetInvariants.AssemblyQualifiedNameKey].ToString()); } return queryBag; }
private static QueryConstantsBag CreateSqlServerQueries() { var queryBag = new QueryConstantsBag(); queryBag.AddOrModifyQueryConstant(AdoNetInvariants.InvariantNameSqlServer, RelationalTestingConstants.DefaultConnectionStringKey, @"Data Source=(localdb)\MSSQLLocalDB;Database=Master;Integrated Security=True;Asynchronous Processing=True;Max Pool Size=200; MultipleActiveResultSets=True"); queryBag.AddOrModifyQueryConstant(AdoNetInvariants.InvariantNameSqlServer, RelationalTestingConstants.ExistsDatabaseKey, "SELECT CAST(COUNT(1) AS BIT) FROM sys.databases WHERE name = @databaseName"); queryBag.AddOrModifyQueryConstant(AdoNetInvariants.InvariantNameSqlServer, RelationalTestingConstants.CreateDatabaseKey, @"USE [Master]; DECLARE @fileName AS NVARCHAR(255) = CONVERT(NVARCHAR(255), SERVERPROPERTY('instancedefaultdatapath')) + N'{0}'; EXEC('CREATE DATABASE [{0}] ON PRIMARY ( NAME = [{0}], FILENAME =''' + @fileName + ''', SIZE = 5MB, MAXSIZE = 100MB, FILEGROWTH = 5MB )')"); queryBag.AddOrModifyQueryConstant(AdoNetInvariants.InvariantNameSqlServer, RelationalTestingConstants.DropDatabaseKey, @"USE [Master]; ALTER DATABASE [{0}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; DROP DATABASE [{0}];"); return(queryBag); }
async Task IClientMetricsDataPublisher.Init(ClientConfiguration config, IPAddress address, string clientId) { database = RelationalStorageUtilities.CreateGenericStorageInstance(config.AdoInvariant, config.DataConnectionString); queryConstants = await database.InitializeOrleansQueriesAsync(); }