private void ParseDatabaseName(ParserString parserString, string name) { parserString.DatabaseName = name; if (parserString.DatabaseName.StartsWith(parserString.QuotePrefix)) { parserString.DatabaseName = parserString.DatabaseName.Substring(1); } if (parserString.DatabaseName.EndsWith(parserString.QuoteSuffix)) { parserString.DatabaseName = parserString.DatabaseName.Substring(0, parserString.DatabaseName.Length - 1); } parserString.QuotedDatabaseName = string.Concat(parserString.QuotePrefix, parserString.DatabaseName, parserString.QuoteSuffix); }
private static void ParseObjectName(ParserString parserString, string name) { parserString.ObjectName = name; if (parserString.ObjectName.StartsWith(parserString.QuotePrefix)) { parserString.ObjectName = parserString.ObjectName.Substring(1); } if (parserString.ObjectName.EndsWith(parserString.QuoteSuffix)) { parserString.ObjectName = parserString.ObjectName.Substring(0, parserString.ObjectName.Length - 1); } parserString.QuotedObjectName = string.Concat(parserString.QuotePrefix, parserString.ObjectName, parserString.QuoteSuffix); }
private void ParseSchemaName(ParserString parserString, string name) { parserString.SchemaName = name; if (!string.IsNullOrEmpty(parserString.SchemaName)) { if (parserString.SchemaName.StartsWith(parserString.QuotePrefix)) { parserString.SchemaName = this.SchemaName.Substring(1); } if (parserString.SchemaName.EndsWith(parserString.QuoteSuffix)) { parserString.SchemaName = parserString.SchemaName.Substring(0, parserString.SchemaName.Length - 1); } parserString.QuotedSchemaName = string.Concat(parserString.QuotePrefix, this.SchemaName, parserString.QuoteSuffix); } }
/// <summary> /// Parse the input string and Get a non bracket object name : /// "[Client] ==> Client " /// "[dbo].[client] === > dbo client " /// "dbo.client === > dbo client " /// "Fabrikam.[dbo].[client] === > Fabrikam dbo client " /// </summary> private void ParseString(string input, string leftQuote = null, string rightQuote = null) { input = input == null ? string.Empty : input.Trim(); this.key = input; if (!string.IsNullOrEmpty(leftQuote) && !string.IsNullOrEmpty(rightQuote)) { this.key = $"{leftQuote}^{rightQuote}^{input}"; } else if (!string.IsNullOrEmpty(leftQuote)) { this.key = $"{leftQuote}^{leftQuote}^{input}"; } // check cache if (parsers.ContainsKey(this.key)) { return; } var parserString = new ParserString(); parsers.Add(this.key, parserString); if (!string.IsNullOrEmpty(leftQuote)) { parserString.QuotePrefix = leftQuote; parserString.QuoteSuffix = leftQuote; } if (!string.IsNullOrEmpty(rightQuote)) { parserString.QuoteSuffix = rightQuote; } parserString.DatabaseName = string.Empty; parserString.QuotedDatabaseName = string.Empty; parserString.SchemaName = string.Empty; parserString.QuotedSchemaName = string.Empty; parserString.ObjectName = string.Empty; parserString.QuotedObjectName = string.Empty; //var regex = new Regex(string.Format(CultureInfo.InvariantCulture, // "(?:(?<space>\\s+)*)*(?:(?<open>\\[)*)*(?(open)(?<quoted>[^\\]]+)*|(?<unquoted>[^\\.\\s\\]]+)*)", // Regex.Escape(parserString.QuotePrefix), Regex.Escape(parserString.QuoteSuffix)), RegexOptions.IgnorePatternWhitespace); var regexExpression = string.Format(CultureInfo.InvariantCulture, "(?<quoted>\\w[^\\{0}\\{1}\\.]*)", parserString.QuotePrefix, parserString.QuoteSuffix); var regex = new Regex(regexExpression, RegexOptions.IgnorePatternWhitespace | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant); var matchCollections = regex.Matches(input); string[] strMatches = new string[3]; int matchCounts = 0; foreach (Match match in matchCollections) { if (matchCounts >= 3) { break; } if (!match.Success || string.IsNullOrWhiteSpace(match.Value)) { continue; } var quotedGroup = match.Groups["quoted"]; if (quotedGroup == null || string.IsNullOrEmpty(quotedGroup.Value)) { continue; } strMatches[matchCounts] = quotedGroup.Value.Trim(); matchCounts++; } switch (matchCounts) { case 1: { this.ParseObjectName(parserString, strMatches[0]); return; } case 2: { this.ParseSchemaName(parserString, strMatches[0]); this.ParseObjectName(parserString, strMatches[1]); return; } case 3: { this.ParseDatabaseName(parserString, strMatches[0]); this.ParseSchemaName(parserString, strMatches[1]); this.ParseObjectName(parserString, strMatches[2]); return; } default: { return; } } }
private static ParserString InternalParse(string key) { var t = key.Split('^'); string leftQuote; string rightQuote; string input; if (t.Length == 1) { leftQuote = string.Empty; rightQuote = string.Empty; input = t[0]; } else if (t.Length == 2) { leftQuote = t[0]; rightQuote = t[0]; input = t[1]; } else if (t.Length == 3) { leftQuote = t[0]; rightQuote = t[1]; input = t[2]; } else { throw new Exception("Lengh of Parser key splitted with ^ is invalid"); } // Preparing a new instance ParserString parserString = new ParserString(); if (!string.IsNullOrEmpty(leftQuote)) { parserString.QuotePrefix = leftQuote; parserString.QuoteSuffix = leftQuote; } if (!string.IsNullOrEmpty(rightQuote)) { parserString.QuoteSuffix = rightQuote; } parserString.DatabaseName = string.Empty; parserString.QuotedDatabaseName = string.Empty; parserString.SchemaName = string.Empty; parserString.QuotedSchemaName = string.Empty; parserString.ObjectName = string.Empty; parserString.QuotedObjectName = string.Empty; //var regex = new Regex(string.Format(CultureInfo.InvariantCulture, // "(?:(?<space>\\s+)*)*(?:(?<open>\\[)*)*(?(open)(?<quoted>[^\\]]+)*|(?<unquoted>[^\\.\\s\\]]+)*)", // Regex.Escape(parserString.QuotePrefix), Regex.Escape(parserString.QuoteSuffix)), RegexOptions.IgnorePatternWhitespace); var regexExpression = string.Format(CultureInfo.InvariantCulture, "(?<quoted>\\w[^\\{0}\\{1}\\.]*)", parserString.QuotePrefix, parserString.QuoteSuffix); var regex = new Regex(regexExpression, RegexOptions.IgnorePatternWhitespace | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant); var matchCollections = regex.Matches(input); string[] strMatches = new string[3]; int matchCounts = 0; foreach (Match match in matchCollections) { if (matchCounts >= 3) { break; } if (!match.Success || string.IsNullOrWhiteSpace(match.Value)) { continue; } var quotedGroup = match.Groups["quoted"]; if (quotedGroup == null || string.IsNullOrEmpty(quotedGroup.Value)) { continue; } strMatches[matchCounts] = quotedGroup.Value.Trim(); matchCounts++; } switch (matchCounts) { case 1: { ParseObjectName(parserString, strMatches[0]); return(parserString); } case 2: { ParseSchemaName(parserString, strMatches[0]); ParseObjectName(parserString, strMatches[1]); return(parserString); } case 3: { ParseDatabaseName(parserString, strMatches[0]); ParseSchemaName(parserString, strMatches[1]); ParseObjectName(parserString, strMatches[2]); return(parserString); } default: { return(parserString); } } }