using System; using System.Linq; using System.Configuration; using System.Collections.Generic; using System.Threading; using MongoDB.Bson; using MongoDB.Bson.Serialization; using MongoDB.Driver; using ServiceStack.ServiceHost; using ServiceStackBenchmark.Model; namespace ServiceStackBenchmark { public static class AppHostConfigHelper { public static bool InitMongoDB(this Funq.Container container) { try { // Register the MySql Database Connection Factory var mongoDbConnectionString = ConfigurationManager.ConnectionStrings["MongoDB"].ConnectionString; var client = new MongoClient(mongoDbConnectionString); var server = client.GetServer(); var database = server.GetDatabase("hello_world"); container.Register(c => database); BsonClassMap.RegisterClassMap(cm => { cm.MapProperty(c => c.id); cm.MapProperty(c => c.randomNumber); }); BsonClassMap.RegisterClassMap(cm => { cm.MapProperty(c => c.id); cm.MapProperty(c => c.message); }); // Create needed tables in MySql Server if they do not exist return database.CreateWorldTable() && database.CreateFortuneTable(); } catch { // Unregister failed database connection factory container.Register(c => null); return false; } } public static bool InitMySQL(this Funq.Container container) { try { // Register the MySql Database Connection Factory var mySqlConnectionString = ConfigurationManager.ConnectionStrings["MySQL"]; var mySqlFactory = new MySqlOrmLiteConnectionFactory(mySqlConnectionString.ConnectionString); mySqlFactory.DialectProvider.UseUnicode = true; container.Register(c => mySqlFactory); // Create needed tables in MySql Server if they do not exist using (var conn = mySqlFactory.OpenDbConnection()) { return conn.CreateWorldTable() && conn.CreateFortuneTable(); } } catch (Exception ex) { // Unregister failed database connection factory container.Register(c => null); return false; } } public static bool InitPostgreSQL(this Funq.Container container) { try { // Register the PostgreSQL Database Connection Factory var postgreSqlConnectionString = ConfigurationManager.ConnectionStrings["PostgreSQL"]; var postgreSqlFactory = new PostgreSqlOrmLiteConnectionFactory(postgreSqlConnectionString.ConnectionString); postgreSqlFactory.DialectProvider.UseUnicode = true; container.Register(c => postgreSqlFactory); // Create needed tables in PostgreSql Server if they do not exist using (var conn = postgreSqlFactory.OpenDbConnection()) { return conn.CreateWorldTable() && conn.CreateFortuneTable(); } } catch (Exception ex) { // Unregister failed database connection factory container.Register(c => null); return false; } } public static bool InitSQLServer(this Funq.Container container) { try { // Register the Microsoft Sql Server Database Connection Factory var sqlServerConnectionString = ConfigurationManager.ConnectionStrings["SQLServer"]; var sqlServerFactory = new SqlServerOrmLiteConnectionFactory(sqlServerConnectionString.ConnectionString); sqlServerFactory.DialectProvider.UseUnicode = true; container.Register(c => sqlServerFactory); // Create needed tables in Microsoft Sql Server if they do not exist using (var conn = sqlServerFactory.OpenDbConnection()) { return conn.CreateWorldTable() && conn.CreateFortuneTable(); } } catch (Exception ex) { // Unregister failed database connection factory container.Register(c => null); return false; } } public static void InitDatabaseRoutes(this Funq.Container container, IServiceRoutes routes) { if (container.InitMongoDB()) { routes.Add("/mongodb/db", "GET"); routes.Add("/mongodb/queries/{queries}", "GET"); routes.Add("/mongodb/fortunes", "GET"); routes.Add("/mongodb/updates/{queries}", "GET"); routes.Add("/mongodb/cached/db", "GET"); } if (container.InitMySQL()) { routes.Add("/mysql/db", "GET"); routes.Add("/mysql/queries/{queries}", "GET"); routes.Add("/mysql/fortunes", "GET"); routes.Add("/mysql/updates/{queries}", "GET"); routes.Add("/mysql/cached/db", "GET"); } if (container.InitPostgreSQL()) { routes.Add("/postgresql/db", "GET"); routes.Add("/postgresql/queries/{queries}", "GET"); routes.Add("/postgresql/fortunes", "GET"); routes.Add("/postgresql/updates/{queries}", "GET"); routes.Add("/postgresql/cached/db", "GET"); } if (container.InitSQLServer()) { routes.Add("/sqlserver/db", "GET"); routes.Add("/sqlserver/queries/{queries}", "GET"); routes.Add("/sqlserver/fortunes", "GET"); routes.Add("/sqlserver/updates/{queries}", "GET"); routes.Add("/sqlserver/cached/db", "GET"); } } public static Feature GetDisabledFeatures() { try { var disabled = ConfigurationManager.AppSettings.Get("DisabledFeatures"); Feature d; if (Enum.TryParse(disabled, true, out d)) return d; return Feature.None; } catch { return Feature.None; } } /// /// Method to config the Minimum number of Worker Threads per Logical Processor Count. /// /// the Completion Port Threads are set to their defaults as there is no IO concerrency in our app public static void ConfigThreadPool() { string minTPLPSetting = ConfigurationManager.AppSettings["minWorkerThreadsPerLogicalProcessor"]; if (minTPLPSetting == null) return; int sysMinWorkerThreads, sysMinCompletionPortThreads; ThreadPool.GetMinThreads(out sysMinWorkerThreads, out sysMinCompletionPortThreads); int newMinWorkerThreadsPerCPU = Math.Max(1, Convert.ToInt32(minTPLPSetting)); var minWorkerThreads = Environment.ProcessorCount * newMinWorkerThreadsPerCPU; ThreadPool.SetMinThreads(minWorkerThreads, sysMinCompletionPortThreads); } } }