public static void GetFileScFromFiles(string folder, string[] subfolders, out string[] texts) { DialogResultExt dialogResult = DialogResultExt.Yes; bool isUsrTs = false; Forms.AddUsrTsForm addUsrTsForm; texts = new string[subfolders.Length]; for (int i = 0; i < subfolders.Length; ++i) { //сортированный список строк патча. ключи - приоритеты, значения - строки SortedList <int, string> lines = new SortedList <int, string>(new DuplicateKeyComparer <int>()); foreach (string filename in Directory.EnumerateFiles(subfolders[i], "*.*", SearchOption.AllDirectories)) { string filenameUPPER = filename.ToUpper(); string relFileName = new FileInfo(filenameUPPER).Name; if (IsValidFileName(relFileName)) { string prefix; int priority = Priority(filename, out prefix); string schema = ""; if (prefix == "ORA") { if (dialogResult != DialogResultExt.YesAll) //если решили добавлять все, то добавляем { if (filename.ToUpper().IndexOf("\\USER\\") != -1 || filename.ToUpper().IndexOf("\\TABLESPACE\\") != -1) { isUsrTs = true; if (dialogResult != DialogResultExt.NoAll) //если решили не добавлять все, то не спрашиваем снова { addUsrTsForm = new Forms.AddUsrTsForm(filename); addUsrTsForm.ShowDialog(); dialogResult = addUsrTsForm.dialogResult; } } else { isUsrTs = false; } } if (!isUsrTs || dialogResult == DialogResultExt.Yes || dialogResult == DialogResultExt.YesAll) //если это не добавление пользователя или тс, или если мы решили все равно добавлять { int startIndex = filename.ToUpper().IndexOf("DB_SCRIPTS") + "DB_SCRIPTS".Length + 1; int endIndex = filename.IndexOf("@"); schema = "||" + filename.Substring(startIndex, endIndex - startIndex); lines.Add(priority, prefix + "||" + filename.Substring(folder.Length + 1) + schema); } isUsrTs = false; } else { lines.Add(priority, prefix + "||" + filename.Substring(folder.Length + 1)); } } } texts[i] = string.Join(Environment.NewLine, lines.Values); } }
//сохраняется в texts public static void GetFileScFromScs(string folder, string[] subfolders, string[] texts, out string dbxmlFilesNotExistsMessage, out string linesNotExistsMessage, ref bool quit) { DialogResultExt dialogResult = DialogResultExt.Yes; Forms.AddUsrTsForm addUsrTsForm; dbxmlFilesNotExistsMessage = ""; //не найденные файлы, указанные в сценарии linesNotExistsMessage = ""; //не указанные в сценарии, но существующие в папках патчей for (int i = 0; i < subfolders.Length; ++i) { if (texts[i] != null) { string[] lines = texts[i].Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); List <string> newLines = new List <string>(); string relSubfolderName = new DirectoryInfo(subfolders[i]).Name; //первые 2 строчки не исполняемые for (int j = 2; j < lines.Length; ++j) { int startPath = lines[j].IndexOf("||") + 2; //находим, где кончается первые || lines[j] = lines[j].Insert(startPath, relSubfolderName + "\\"); //вставляем туда название подпапки string prefix = lines[j].Substring(0, startPath - 2); //ORA, IPC или STWF int endPath = lines[j].IndexOf("||", startPath); //находим вторые || endPath = endPath == -1 ? lines[j].Length : endPath; //если их нет, берем до конца string relPath = lines[j].Substring(startPath, endPath - startPath); //получаем путь до файла string fullPath = folder + "\\" + relPath; //получаем полный путь bool isUsrTs = false; if (prefix == "ORA" && dialogResult != DialogResultExt.YesAll) //если решили добавлять все, то добавляем { if (lines[j].ToUpper().IndexOf("\\USER\\") != -1 || lines[j].ToUpper().IndexOf("\\TABLESPACE\\") != -1) //пользователи и табличные пространства обычно добавляются вручную { isUsrTs = true; if (dialogResult != DialogResultExt.NoAll) //если решили не добавлять все, то не спрашиваем снова { addUsrTsForm = new Forms.AddUsrTsForm(fullPath); addUsrTsForm.ShowDialog(); dialogResult = addUsrTsForm.dialogResult; } } else { isUsrTs = false; } } if (!isUsrTs || dialogResult == DialogResultExt.Yes || dialogResult == DialogResultExt.YesAll) //если это не добавление пользователя или тс, или если мы решили все равно добавлять { if (IsValidFileName(new FileInfo(relPath).Name.ToUpper())) //если это накатываемый файл { newLines.Add(lines[j]); } if (!File.Exists(fullPath)) { dbxmlFilesNotExistsMessage += relPath + Environment.NewLine; } } isUsrTs = false; //для следующей строки предполагаем, что все в порядке } texts[i] = String.Join(Environment.NewLine, newLines); //объединяем полученные строчки //проверка, что все файлы в папках присутствуют в файле сценария foreach (string filename in Directory.EnumerateFiles(folder + "\\" + relSubfolderName, "*.*", SearchOption.AllDirectories)) { string filenameUPPER = filename.ToUpper(); string relFileName = new FileInfo(filenameUPPER).Name; //отсечение rn, файлов сценария и файлов vss if (IsValidFileName(relFileName)) { bool found = false; for (int j = 2; j < lines.Length && !found; ++j) { //получаем название файлов из строк int startPath = lines[j].IndexOf("||") + 2; int endPath = lines[j].IndexOf("||", startPath); endPath = endPath == -1 ? lines[j].Length : endPath; string fileFromSc = (folder + "\\" + lines[j].Substring(startPath, endPath - startPath)).ToUpper(); //сверяем с файлом в папке found = filenameUPPER == fileFromSc; } if (!found) //если не нашли нужного, добавляем строку к ошибке { linesNotExistsMessage += filename.Substring(folder.Length + 1) + Environment.NewLine; } } } } } //все dbatools ставим после всех dwh for (int k = 0; k < texts.Length; ++k) { List <string> lines = texts[k].Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList <string>(); List <string> dbatoolsLines = new List <string>(); bool dwhSchemaFound = false; for (int i = 0; i < lines.Count; ++i) { Match matchSchema = Regex.Match(lines[i], @"ORA.*\|\|([^\|]*)$"); if (matchSchema.Success) { string schema1 = matchSchema.Groups[1].Value; //находим строчку DWH if (schema1.Equals("DWH", StringComparison.CurrentCultureIgnoreCase)) { dwhSchemaFound = true; break; } } } if (dwhSchemaFound) { for (int i = lines.Count - 1; i >= 0; --i) { Match matchSchema = Regex.Match(lines[i], @"ORA.*\|\|([^\|]*)$"); if (matchSchema.Success) { string schema1 = matchSchema.Groups[1].Value; //находим строчку DBATOOLS if (schema1.Equals("DBATOOLS", StringComparison.CurrentCultureIgnoreCase)) { //вставляем в начало, тк идем с конца dbatoolsLines.Insert(0, lines[i]); lines.RemoveAt(i); } } } int dwhSchemaIndex = 0; for (int i = lines.Count - 1; i >= 0; --i) { Match matchSchema = Regex.Match(lines[i], @"ORA.*\|\|([^\|]*)$"); if (matchSchema.Success) { string schema1 = matchSchema.Groups[1].Value; //находим строчку DWH if (schema1.Equals("DWH", StringComparison.CurrentCultureIgnoreCase)) { dwhSchemaIndex = i; break; } } } lines.InsertRange(dwhSchemaIndex + 1, dbatoolsLines); } texts[k] = string.Join(Environment.NewLine, lines); } if (dbxmlFilesNotExistsMessage != "" || linesNotExistsMessage != "") { using (ShowWarningsForm swf = new ShowWarningsForm(dbxmlFilesNotExistsMessage, linesNotExistsMessage)) { swf.ShowDialog(); quit = swf.dialogResult != DialogResult.Yes; } } }