示例#1
0
        /// <summary>
        /// Проверка данных в шельве
        /// </summary>
        /// <param name="tdlink"></param>
        /// <returns></returns>
        public Boolean ChekExistsShelveset(TfsDbLink tdlink)
        {
            using (TFSRoutineBL tfsbl = new TFSRoutineBL())
            {
                // Проверяем настройки TFS
                SendStat("Подключаемся к TFS");
                tfsbl.VersionControl(tdlink.ServerUri);

                SendStat("Проверка несохраненных данных в шельве");
                return(tfsbl.ExistsShelveset());
            }
        }
示例#2
0
        /// <summary>
        /// Удаление из шельвы TFS данных неудачной накатки
        /// </summary>
        /// <param name="tdlink"></param>
        /// <returns></returns>
        public void DeleteShelveset(TfsDbLink tdlink)
        {
            using (TFSRoutineBL tfsbl = new TFSRoutineBL())
            {
                // Проверяем настройки TFS
                SendStat("Подключаемся к TFS");
                tfsbl.VersionControl(tdlink.ServerUri);

                SendStat("Проверка несохраненных данных в шельве");
                if (!tfsbl.ExistsShelveset())
                {
                    return;
                }

                SendStat("Удаление шельвы в TFS");
                tfsbl.DeleteShelveset();
            }
        }
示例#3
0
        /// <summary>
        /// Накатить скрипт
        /// </summary>
        /// <param name="tdlink">Настройка связки TFS-DB</param>
        /// <param name="sqlScript">Тело скрипта</param>
        /// <param name="comment">Комментарий к заливке</param>
        /// <returns></returns>
        public String SaveScript(
            TfsDbLink tdlink,
            String sqlScript,
            String comment,
            Boolean inTaransaction,
            List <int> linkedTask)
        {
            try
            {
                if (comment.IsNullOrWhiteSpace())
                {
                    return("Необходимо заполнить комментрарий");
                }

                if (sqlScript.IsNullOrWhiteSpace())
                {
                    return("Тело скрипта пустое");
                }


                if (checkSqlScriptOnUSE(sqlScript))
                {
                    return("В скрипте используется USE БД.");
                }

                if (!linkedTask.Any())
                {
                    return("Для накатки необходимо привязать задачу.");
                }

                Func <String, String> trimLines = (a) =>
                {
                    a = a.Trim();

                    var colStr = a.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);

                    for (int i = 0; i < colStr.Length; i++)
                    {
                        colStr[i] = colStr[i].TrimEnd();
                    }

                    return(colStr.JoinValuesToString(Environment.NewLine, false));
                };

                // причесываем текстовки
                sqlScript = trimLines(sqlScript);

                comment = trimLines(comment);
                var commentforSQL = "--" + comment.Replace(Environment.NewLine, Environment.NewLine + "--") + Environment.NewLine;

                UpdateDbSetting upsets           = null;
                bool            useSqlConnection = false;

                using (TFSRoutineBL tfsbl = new TFSRoutineBL())
                {
                    // Проверяем переданные соединения с TFS и БД

                    // Проверяем настройки TFS
                    SendStat("Подключаемся к TFS");
                    tfsbl.VersionControl(tdlink.ServerUri);

                    SendStat("Получение настроек поднятия версии.");
                    var tempfile = Path.Combine(DomainContext.TempPath, Guid.NewGuid().ToString());
                    tfsbl.DownloadFile(tdlink.ServerPathToSettings, tempfile);

                    try
                    {
                        upsets = File.ReadAllBytes(tempfile).DeserializeAesDecrypt <UpdateDbSetting>(tdlink.ServerPathToSettings);
                    }
                    catch (Exception ex)
                    {
                        String msg = ex.Expand();
                        if (ex.GetType().Name == "TargetInvocationException" && ex.InnerException != null)
                        {
                            msg = ex.InnerException.Message;
                        }
                        return("Получение файла настроек неуспешно. Exception: " + msg);
                    }

                    if (upsets == null || upsets.ServerPathScripts.IsNullOrWhiteSpace())
                    {
                        return("Получение файла настроек неуспешно");
                    }

                    SendStat("Получение типа соединения");

                    Type conn = typeof(SqlConnection);
                    useSqlConnection = true;

                    if (upsets.TypeConnectionFullName != conn.ToString())
                    {
                        if (upsets.AssemplyWithImplementDbConnection == null)
                        {
                            return($"В настроках указан тип DbConnection '{upsets.TypeConnectionFullName}', но отсутствует бинарное представление сборки реализации");
                        }

                        conn = null;
                        Assembly conAss = null;

                        foreach (var asmly in AppDomain.CurrentDomain.GetAssemblies())
                        {
                            conn = asmly.GetType(upsets.TypeConnectionFullName, false);

                            if (conn != null)
                            {
                                conAss = asmly;
                                break;
                            }
                        }

                        if (conn == null)
                        {
                            conAss = AppDomain.CurrentDomain.Load(upsets.AssemplyWithImplementDbConnection);
                        }

                        conn = conAss.ExportedTypes.FirstOrDefault(x => x.FullName == upsets.TypeConnectionFullName);

                        if (conn == null)
                        {
                            return($"Не удалось найти тип DbConnection '{upsets.TypeConnectionFullName}'");
                        }
                        useSqlConnection = false;
                    }

                    SendStat("Проверка несохраненных данных в шельве");
                    if (tfsbl.ExistsShelveset())
                    {
                        return($"В шельве присутствуют несохраненные изменения");
                    }

                    SendStat("Подключаемся к БД");
                    DomainContext.InitConnection(conn, upsets.ConnectionStringModelDb);


                    tfsbl.MapTempWorkspace(upsets.ServerPathScripts);

                    // TODO  Проверить скрип на корректность
                    // В частности, отсутствие USE. Ещеб как нить замутить просто проверку, а не выполнение

                    SendStat("Обработка файла версионности");

                    String VerFileName = "_lastVer.xml";
                    String PathVerFile = Path.Combine(tfsbl.Tempdir, VerFileName);

                    if (tfsbl.GetLastFile(VerFileName) == 0)
                    {
                        //файла нет
                        if (!File.Exists(PathVerFile))
                        {
                            // сохраняем новую чистую версию ДБ
                            (new VerDB()).XMLSerialize(PathVerFile);
                            tfsbl.AddFile(PathVerFile);
                            tfsbl.CheckIn("Добавлен файл версионности", linkedTask);
                        }
                    }

                    if (!tfsbl.LockFile(VerFileName))
                    {
                        return("Производится накатка. Повторите позже");
                    }

                    if (!tfsbl.CheckOut(PathVerFile))
                    {
                        return("Извлечение файла текущей версии неуспешно. Повторите позже");
                    }

                    var CurVerDB = PathVerFile.XMLDeserializeFromFile <VerDB>() ?? new VerDB();

                    CurVerDB.VersionBD  += 1;
                    CurVerDB.DateVersion = new DateTimeOffset(DateTime.Now).DateTime;

                    List <String> scts = new List <string>();

                    if (useSqlConnection)
                    {
                        scts.AddRange(SplitSqlTExtOnGO(sqlScript));
                    }
                    else
                    {
                        scts.Add(sqlScript);
                    }

                    SendStat("Накатка скрипта на БД");

                    DbTransactionScope tran = null;

                    try
                    {
                        if (inTaransaction)
                        {
                            tran = new DbTransactionScope();
                        }

                        #region накатываем скрипты

                        foreach (var sct in scts)
                        {
                            adapter.ExecScript(sct);
                        }

                        adapter.ExecScript(String.Format(upsets.ScriptUpdateVer, CurVerDB));

                        #endregion

                        #region формируем файл и чекиним

                        SendStat("Генерация файла скрипта");

                        var sb = new StringBuilder();

                        sb.AppendLine(commentforSQL);

                        if (inTaransaction)
                        {
                            sb.AppendLine(upsets.ScriptPartBeforeBodyWithTran);
                        }

                        foreach (var item in scts)
                        {
                            var script = item;
                            if (useSqlConnection)
                            {
                                script = "EXEC('" + script.Replace("'", "''") + "')";
                            }

                            sb.AppendLine(script);
                        }

                        sb.AppendLine(String.Format(upsets.ScriptUpdateVer, CurVerDB));

                        if (inTaransaction)
                        {
                            sb.Append(upsets.ScriptPartAfterBodyWithTran);
                        }

                        String FileNameNewVer = Path.Combine(tfsbl.Tempdir, CurVerDB + ".sql");

                        File.WriteAllText(FileNameNewVer, sb.ToString());
                        CurVerDB.XMLSerialize(PathVerFile);
                        tfsbl.AddFile(FileNameNewVer);

                        SendStat("Кладем в шельву в TFS");

                        tfsbl.CreateShelveset(comment, linkedTask);

                        if (tran != null)
                        {
                            tran.Complete();
                            ((IDisposable)tran).Dispose();
                            tran = null;
                        }

                        SendStat("Чекин в TFS");
                        tfsbl.CheckIn(comment, linkedTask);

                        SendStat("Удаление шельвы в TFS");
                        tfsbl.DeleteShelveset();

                        SendStat("Готово");

                        #endregion
                    }
                    catch
                    {
                        throw;
                    }
                    finally
                    {
                        if (tran != null)
                        {
                            ((IDisposable)tran).Dispose();
                        }
                    }
                }

                return(null);
            }
            catch (Exception ex)
            {
                String msg = ex.Expand();
                if (ex.GetType().Name == "TargetInvocationException" && ex.InnerException != null)
                {
                    msg = ex.InnerException.Message;
                }
                return(msg);
            }
        }