public void Feedback(object owner, string content, FeedbackInfoType infoType = FeedbackInfoType.Info, bool enableLog = true) { if (infoType == FeedbackInfoType.Error) { this.hasError = true; } FeedbackInfo info = new FeedbackInfo() { InfoType = infoType, Message = StringHelper.ToSingleEmptyLine(content), Owner = owner }; FeedbackHelper.Feedback(this.observer, info, enableLog); if (this.OnFeedback != null) { this.OnFeedback(info); } }
private string ParseDefinition(string definition) { var tokens = this.ParseTokens(definition); bool changed = false; definition = this.HandleDefinition(definition, tokens, out changed); StringBuilder sb = new StringBuilder(); bool ignore = false; if (changed) { tokens = this.ParseTokens(definition); } TSQLTokenType previousType = TSQLTokenType.Whitespace; string previousText = ""; for (int i = 0; i < tokens.Count; i++) { if (ignore) { ignore = false; continue; } var token = tokens[i]; var tokenType = token.Type; string text = token.Text; switch (tokenType) { case TSQLTokenType.Identifier: if (dataTypes.Contains(text)) { sb.Append(text); continue; } var nextToken = i + 1 < tokens.Count ? tokens[i + 1] : null; //Remove owner name if (nextToken != null && nextToken.Text.Trim() != "(" && text.Trim('"') == sourceOwnerName && i + 1 < tokens.Count && tokens[i + 1].Text == "." ) { ignore = true; continue; } else if (nextToken != null && nextToken.Text.Trim() == "(") //function handle { IEnumerable<FunctionMapping> funcMappings = functionMappings.FirstOrDefault(item => item.Any(t => t.DbType == sourceDbInterpreter.DatabaseType.ToString() && t.Function.Split(',').Any(m => m.ToLower() == text.ToLower()))); if (funcMappings != null) { string targetFunction = funcMappings.FirstOrDefault(item => item.DbType == targetDbInterpreter.DatabaseType.ToString())?.Function.Split(',')?.FirstOrDefault(); if (!string.IsNullOrEmpty(targetFunction)) { sb.Append(targetFunction); } } else { sb.Append(text); } } else { sb.Append($"{targetDbInterpreter.QuotationLeftChar}{text.Trim('"')}{targetDbInterpreter.QuotationRightChar}"); } break; case TSQLTokenType.StringLiteral: if (previousType != TSQLTokenType.Whitespace && previousText.ToLower() == "as") { sb.Append($"{targetDbInterpreter.QuotationLeftChar}{text.Trim('\'', '"')}{targetDbInterpreter.QuotationRightChar}"); } else { sb.Append(text); } break; case TSQLTokenType.SingleLineComment: case TSQLTokenType.MultilineComment: continue; case TSQLTokenType.Keyword: switch (text.ToUpper()) { case "AS": if (targetDbInterpreter is OracleInterpreter) { var previousKeyword = (from t in tokens where t.Type == TSQLTokenType.Keyword && t.EndPosition < token.BeginPosition select t).LastOrDefault(); if (previousKeyword != null && previousKeyword.Text.ToUpper() == "FROM") { continue; } } break; } sb.Append(token.Text); break; default: sb.Append(token.Text); break; } if (!string.IsNullOrWhiteSpace(text)) { previousText = text; previousType = tokenType; } } definition = sb.ToString(); #region Handle join cluase for mysql which has no "on", so it needs to make up that. try { if (this.sourceDbInterpreter.GetType() == typeof(MySqlInterpreter)) { bool hasError = false; string formattedDefinition = this.FormatSql(definition, out hasError); if (!hasError) { string[] lines = formattedDefinition.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); Regex joinRegex = new Regex("\\b(join)\\b", RegexOptions.IgnoreCase); Regex onRegex = new Regex("\\b(on)\\b", RegexOptions.IgnoreCase); Regex wordRegex = new Regex("([a-zA-Z(]+)", RegexOptions.IgnoreCase); sb = new StringBuilder(); foreach (string line in lines) { bool hasChanged = false; if (joinRegex.IsMatch(line)) { string leftStr = line.Substring(line.ToLower().LastIndexOf("join") + 4); if (!onRegex.IsMatch(line) && !wordRegex.IsMatch(leftStr)) { hasChanged = true; sb.AppendLine($"{line} ON 1=1 "); } } if (!hasChanged) { sb.AppendLine(line); } } definition = sb.ToString(); } } } catch (Exception ex) { FeedbackInfo info = new FeedbackInfo() { InfoType = FeedbackInfoType.Error, Message = ExceptionHelper.GetExceptionDetails(ex), Owner = this }; FeedbackHelper.Feedback(info); } #endregion return definition.Trim(); }