示例#1
0
        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);
        }
示例#3
0
        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);
            }
        }
示例#4
0
        /// <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);
            }
            }
        }