private void bttvQueryRefresh_Click(object sender, EventArgs e) { try { tvQuerys.Nodes.Clear(); TfsDbLink curset = cbxTfsDbLinc.SelectedItem as TfsDbLink; if (curset == null || curset.ServerUri == null || curset.ServerPathToSettings.IsNullOrWhiteSpace()) { bttvQueryRefresh.Enabled = false; return; } var tfs = new WrapTfs(); var qs = tfs.QueryItemsGet(curset.ServerUri, curset.ServerPathToSettings); Action <QueryItemNode, TreeNode> recNod = null; recNod = new Action <QueryItemNode, TreeNode>((qn, tn) => { tn.Text = qn.Name; tn.Tag = qn; tn.StateImageIndex = 0; if (!qn.IsFolder) { tn.StateImageIndex = 1; } foreach (var cqin in qn.ChildNodes) { var tnod = new TreeNode(); recNod(cqin, tnod); tn.Nodes.Add(tnod); } }); foreach (var qin in qs) { var tnod = new TreeNode(); recNod(qin, tnod); tvQuerys.Nodes.Add(tnod); } if (tvQuerys.Nodes.Count == 1) { tvQuerys.Nodes[0].Expand(); } } catch (Exception ex) { String exMsg = ex.Expand(); if (ex.GetType().Name == "TargetInvocationException" && ex.InnerException != null) { exMsg = ex.InnerException.Message; } Dialogs.ErrorF(this, exMsg); } }
/// <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()); } }
private void cbxTfsDbLinc_SelectionChangeCommitted(object sender, EventArgs e) { TfsDbLink curset = cbxTfsDbLinc.SelectedItem as TfsDbLink; this.btSaveScript.Enabled = false; formatbin = null; if (curset != null) { if (!curset.ServerPathToSettings.IsNullOrWhiteSpace() & curset.ServerUri != null) { String tempfile = null; try { // Проверяем доступность TFS // подгружаем настройку бинарныго формата using (var tfsbl = new TFSRoutineBL()) { tfsbl.VersionControl(curset.ServerUri); tempfile = Path.Combine(DomainContext.TempPath, Guid.NewGuid().ToString()); tfsbl.DownloadFile(curset.ServerPathToSettings, tempfile); var upsets = File.ReadAllBytes(tempfile).DeserializeAesDecrypt <UpdateDbSetting>(curset.ServerPathToSettings); formatbin = upsets.FormatBinary; } this.btSaveScript.Enabled = true; } catch (Exception ex) { String exMsg = ex.Expand(); if (ex.GetType().Name == "TargetInvocationException" && ex.InnerException != null) { exMsg = ex.InnerException.Message; } Dialogs.ErrorF(this, exMsg); } finally { if (!tempfile.IsNullOrWhiteSpace() && File.Exists(tempfile)) { File.Delete(tempfile); } } } Config.Instance.SelestedTFSDB = curset.Name; } bttvQueryRefresh_Click(null, null); }
/// <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(); } }
private void btAddInIDTask_Click(object sender, EventArgs e) { try { int idTask; if (!int.TryParse(tbIdTask.Text, out idTask)) { return; } TfsDbLink curset = cbxTfsDbLinc.SelectedItem as TfsDbLink; if (curset == null) { return; } if (curset.ServerUri == null) { Dialogs.InformationF(this, "В настройках связки не указан сервер TFS"); return; } var tfs = new WrapTfs(); var wi = tfs.WorkItemByIdGet(curset.ServerUri, idTask); if (lbLinkedWirkItem.Items.Cast <Lwi>().Any(x => x.ID == wi.ID)) { return; } lbLinkedWirkItem.Items.Add(new Lwi(wi)); tbIdTask.Text = null; } catch (Exception ex) { String exMsg = ex.Expand(); if (ex.GetType().Name == "TargetInvocationException" && ex.InnerException != null) { exMsg = ex.InnerException.Message; } Dialogs.ErrorF(this, exMsg); } }
private void tvQuerys_AfterSelect(object sender, TreeViewEventArgs e) { try { lbWorkItems.Items.Clear(); TfsDbLink curset = cbxTfsDbLinc.SelectedItem as TfsDbLink; if (curset == null) { return; } if (curset.ServerUri == null) { Dialogs.InformationF(this, "В настройках связки не указан сервер TFS"); return; } QueryItemNode qin = (QueryItemNode)e.Node.Tag; if (qin.IsFolder) { return; } var tfs = new WrapTfs(); var wims = tfs.WorkItemsFromQueryGet(curset.ServerUri, qin); foreach (var wi in wims) { lbWorkItems.Items.Add(new Lwi(wi)); } } catch (Exception ex) { String exMsg = ex.Expand(); if (ex.GetType().Name == "TargetInvocationException" && ex.InnerException != null) { exMsg = ex.InnerException.Message; } Dialogs.ErrorF(this, exMsg); } }
/// <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); } }