private static bool ProcessSearchResults(List<string> extensions, bool backups, bool allowParsingErrors, PoorMansTSqlFormatterLib.SqlFormattingManager formattingManager, FileSystemInfo[] matchingObjects, StreamWriter singleFileWriter, string replaceFromFolderPath, string replaceToFolderPath, ref bool warningEncountered) { bool fileFound = false; foreach (var fsEntry in matchingObjects) { if (fsEntry is FileInfo) { if (extensions.Contains(fsEntry.Extension)) { ReFormatFile((FileInfo)fsEntry, formattingManager, backups, allowParsingErrors, singleFileWriter, replaceFromFolderPath, replaceToFolderPath, ref warningEncountered); fileFound = true; } } else { if (ProcessSearchResults(extensions, backups, allowParsingErrors, formattingManager, ((System.IO.DirectoryInfo)fsEntry).GetFileSystemInfos(), singleFileWriter, replaceFromFolderPath, replaceToFolderPath, ref warningEncountered)) fileFound = true; } } return fileFound; }
private static void ReFormatFile(FileInfo fileInfo, PoorMansTSqlFormatterLib.SqlFormattingManager formattingManager, bool backups, bool allowParsingErrors, StreamWriter singleFileWriter, string replaceFromFolderPath, string replaceToFolderPath, ref bool warningEncountered) { bool failedBackup = false; string oldFileContents = ""; string newFileContents = ""; bool parsingError = false; bool failedFolder = false; Exception parseException = null; //TODO: play with / test encoding complexities //TODO: consider using auto-detection - read binary, autodetect, convert. //TODO: consider whether to keep same output encoding as source file, or always use same, and if so whether to make parameter-based. try { oldFileContents = System.IO.File.ReadAllText(fileInfo.FullName); } catch (Exception ex) { Console.Error.WriteLine(string.Format(_generalResourceManager.GetString("FileReadFailureWarningMessage"), fileInfo.FullName)); Console.Error.WriteLine(string.Format(_generalResourceManager.GetString("ErrorDetailMessageFragment"), ex.Message)); warningEncountered = true; } if (oldFileContents.Length > 0) { try { newFileContents = formattingManager.Format(oldFileContents, ref parsingError); //hide any handled parsing issues if they were requested to be allowed if (allowParsingErrors) parsingError = false; } catch (Exception ex) { parseException = ex; parsingError = true; } if (parsingError) { Console.Error.WriteLine(string.Format(_generalResourceManager.GetString("ParsingErrorWarningMessage"), fileInfo.FullName)); if (parseException != null) Console.Error.WriteLine(string.Format(_generalResourceManager.GetString("ErrorDetailMessageFragment"), parseException.Message)); warningEncountered = true; } } if (!parsingError && ( (newFileContents.Length > 0 && !oldFileContents.Equals(newFileContents) ) || singleFileWriter != null || (replaceFromFolderPath != null && replaceToFolderPath != null) ) ) { if (backups) { try { fileInfo.CopyTo(fileInfo.FullName + ".bak", true); } catch (Exception ex) { Console.Error.WriteLine(string.Format(_generalResourceManager.GetString("BackupFailureWarningMessage"), fileInfo.FullName, Environment.NewLine)); Console.Error.WriteLine(string.Format(_generalResourceManager.GetString("ErrorDetailMessageFragment"), ex.Message)); failedBackup = true; warningEncountered = true; } } if (!failedBackup) { if (singleFileWriter != null) { //we'll assume that running out of disk space, and other while-you-are-writing errors, and not worth worrying about singleFileWriter.WriteLine(newFileContents); singleFileWriter.WriteLine("GO"); } else { string fullTargetPath = fileInfo.FullName; if (replaceFromFolderPath != null && replaceToFolderPath != null) { fullTargetPath = fullTargetPath.Replace(replaceFromFolderPath, replaceToFolderPath); string targetFolder = Path.GetDirectoryName(fullTargetPath); try { if (!Directory.Exists(targetFolder)) Directory.CreateDirectory(targetFolder); } catch (Exception ex) { Console.Error.WriteLine(string.Format(_generalResourceManager.GetString("FolderCreationFailureWarningMessage"), targetFolder)); Console.Error.WriteLine(string.Format(_generalResourceManager.GetString("ErrorDetailMessageFragment"), ex.Message)); failedFolder = true; warningEncountered = true; } } if (!failedFolder) { WriteResultFile(fullTargetPath, replaceFromFolderPath, replaceToFolderPath, ref warningEncountered, newFileContents); } } } } }
private string FormatTSqlWithFormatter(string inputString, PoorMansTSqlFormatterLib.Interfaces.ISqlTreeFormatter formatter) { //free use is all very nice, but I REALLY don't want anyone linking to this web service from some // other site or app: they should just download the library and incorporate or host it directly. // (assuming the project is GPL-compatible) // string allowedHost = System.Configuration.ConfigurationSettings.AppSettings["ReferrerHostValidation"]; //no error handling, just do the bare (safe) minimum. if (string.IsNullOrEmpty(allowedHost) || (Context.Request.UrlReferrer != null && Context.Request.UrlReferrer.Host != null && Context.Request.UrlReferrer.Host.Equals(allowedHost) ) ) { PoorMansTSqlFormatterLib.SqlFormattingManager fullFormatter = new PoorMansTSqlFormatterLib.SqlFormattingManager(new PoorMansTSqlFormatterLib.Formatters.HtmlPageWrapper(formatter)); return fullFormatter.Format(inputString); } else { return string.Format("Sorry, this web service can only be called from code hosted at {0}.", allowedHost); } }