FunctionalTests/NuGetOperations.FunctionalTests/NuGetOperations.FunctionalTests.Helpers/DataBaseHelper.cs (154 lines of code) (raw):

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data; using System.Data.SqlClient; using AnglicanGeek.DbExecutor; using NuGetGallery.Operations; namespace NuGetOperations.FunctionalTests.Helpers { public class DataBaseHelper { #region PublicMethods /// <summary> /// Given a db name, checks if the DB creation is in progress and waits till the timeout to see if it goes to online state. /// </summary> /// <param name="dbName"></param> /// <param name="timeOut"></param> /// <returns></returns> public static bool VerifyDataBaseCreation(string dbName, int timeOut = 10 * 60 * 1000) { if (GetDataBaseState(dbName) == DataBaseState.Copying) { while(GetDataBaseState(dbName) == DataBaseState.Copying && timeOut > 0) { timeOut -= 30 * 1000; } return (GetDataBaseState(dbName) == DataBaseState.Online); } else { Console.WriteLine(" The backup database state is not in progress right after the execution of the BackupDataBase task"); return false; } } /// <summary> /// Given the dbName, returns its state. /// </summary> /// <param name="dbName"></param> /// <returns></returns> public static DataBaseState GetDataBaseState(string dbName) { var dbs = MasterDataBaseExecutor.Query<Database>( "SELECT name, state FROM sys.databases WHERE name = @dbName", new { dbName }); return GetDataBaseStateFromCode(dbs.FirstOrDefault().State); } /// <summary> /// Returns the count of total backup databases present in the current server. /// </summary> /// <returns></returns> public static int GetTotalBackupDataBaseCount() { return MasterDataBaseExecutor.Query<Database>( "SELECT name FROM sys.databases WHERE name LIKE 'Backup_%' AND state = @state", new { state = Util.OnlineState }).ToArray().Length; } /// <summary> /// Returns the list of all database backups present in the server. /// </summary> /// <returns></returns> public static List<Database> GetAllDatabaseBackups() { return MasterDataBaseExecutor.Query<Database>( "SELECT name FROM sys.databases WHERE name LIKE 'Backup_%' AND state = @state", new { state = Util.OnlineState }).ToList(); } /// <summary> /// Deletes the given database. /// </summary> /// <param name="dbName"></param> public static void DeleteDataBase(string dbName) { MasterDataBaseExecutor.Execute(string.Format("DROP DATABASE {0}", dbName)); } /// <summary> /// Creates a new database with the given name. /// </summary> /// <param name="dbName"></param> public static void CreateDataBase(string dbName, bool waitTillCreation=false) { MasterDataBaseExecutor.Execute(string.Format("Create DATABASE {0}", dbName)); if (waitTillCreation) { VerifyDataBaseCreation(dbName); } } /// <summary> /// Given a database returns the count of tables present in it. /// </summary> /// <param name="dbName"></param> /// <returns></returns> public static int GetTableCount(string dbName) { SqlExecutor executor = GetDataBaseExecutorFor(dbName); return executor.Query<Int32>("SELECT COUNT (*) FROM information_schema.tables").SingleOrDefault(); } /// <summary> /// Returns the total download from the Gallery DB. /// </summary> /// <returns></returns> public static int GetTotalDownCount() { return DataBaseExecutor.Query<Int32>("SELECT [TotalDownloadCount] FROM [dbo].[GallerySettings]").SingleOrDefault(); } /// <summary> /// Given the database name, returns the connection string for it. /// </summary> /// <param name="dbName"></param> /// <returns></returns> public static string GetConnectionStringForDataBase(string dbName) { var connectionStringBuilder = new SqlConnectionStringBuilder(DBConnectionString) { InitialCatalog = dbName }; return connectionStringBuilder.ToString(); } /// <summary> /// Given the database name, returns the sqlexecutor for it ( with a open connection). /// </summary> /// <param name="dbName"></param> /// <returns></returns> public static SqlExecutor GetDataBaseExecutorFor(string dbName) { var connectionStringBuilder = new SqlConnectionStringBuilder(DBConnectionString) { InitialCatalog = dbName }; SqlConnection connection = new SqlConnection( connectionStringBuilder.ToString()); SqlExecutor executor = new SqlExecutor(connection); if (connection.State == ConnectionState.Closed) { connection.Open(); } return executor; } #endregion PublicMethods #region PrivateMembers internal static DataBaseState GetDataBaseStateFromCode(byte state) { if (state == 7) return DataBaseState.Copying; else return DataBaseState.Online; } internal static SqlExecutor MasterDataBaseExecutor { get { if (mdbExecutor == null) { mdbSqlConnection = new SqlConnection(Util.GetMasterConnectionString(EnvironmentSettings.DataBaseConnectionString)); mdbExecutor = new SqlExecutor(mdbSqlConnection); mdbSqlConnection.Open(); } return mdbExecutor; } } internal static SqlExecutor DataBaseExecutor { get { if (dbExecutor == null) { dbSqlConnection = new SqlConnection(EnvironmentSettings.DataBaseConnectionString); dbExecutor = new SqlExecutor(dbSqlConnection); dbSqlConnection.Open(); } return dbExecutor; } } internal static string MasterDBConnectionString { get { return Util.GetMasterConnectionString(EnvironmentSettings.DataBaseConnectionString); } } internal static string DBConnectionString { get { return EnvironmentSettings.DataBaseConnectionString; } } internal static string WarehouseDBConnectionString { get { return EnvironmentSettings.WarehouseConnectionString; } } private static SqlExecutor mdbExecutor; private static SqlExecutor dbExecutor; private static SqlConnection mdbSqlConnection; private static SqlConnection dbSqlConnection; #endregion PrivateMembers } public enum DataBaseState { Copying, Online } }