Esempio n. 1
0
        internal static List <string> GetColumnList(char[] sql, Word wColumns)
        {
            List <string> columnList = new List <string>();

            List <StrSpan> tokenList = StrUtil.Split(sql, wColumns.iLeft, wColumns.iRight, ',');

            char cLeft;
            char cRight;

            StrSpan s;

            for (int i = 0; i < tokenList.Count; i++)
            {
                s = tokenList[i];

                if (s.isEmpty)
                {
                    throw new SelectDataTableException("列名 不能 为空 。 ", sql, s.iLeft);
                }

                s = StrUtil.Trim(sql, s.iLeft, s.iRight, Parser._whiteSpaces);

                if (s.isEmpty)
                {
                    throw new SelectDataTableException("列名 不能 为空 。 ", sql, s.iLeft);
                }

                cLeft = sql[s.iLeft];

                if (s.iLeft == s.iRight && (cLeft == '[' || cLeft == ']'))
                {
                    throw new SelectDataTableException("无效的 列名 \"" + cLeft + "\" 。 ", sql, s.iLeft);
                }

                cRight = sql[s.iRight];

                if (cLeft == '[' && cRight == ']')
                {
                    if (s.iLeft == s.iRight - 1)
                    {
                        throw new SelectDataTableException("列名 不能 为空 。 ", sql, s.iLeft);
                    }


                    s = StrUtil.Trim(sql, s.iLeft + 1, s.iRight - 1, Parser._whiteSpaces);

                    if (s.isEmpty)
                    {
                        throw new SelectDataTableException("列名 不能 为空 。 ", sql, s.iLeft);
                    }

                    columnList.Add(new string(sql, s.iLeft, s.iRight - s.iLeft + 1));
                }
                else if (cLeft == '[' && cRight != ']')
                {
                    throw new SelectDataTableException("中括号 [] 未成对出现 。 ", sql, s.iLeft);
                }
                else if (cLeft != '[' && cRight == ']')
                {
                    throw new SelectDataTableException("中括号 [] 未成对出现 。 ", sql, s.iRight);
                }
                else
                {
                    s = StrUtil.Trim(sql, s.iLeft, s.iRight, Parser._whiteSpaces);

                    columnList.Add(new string(sql, s.iLeft, s.iRight - s.iLeft + 1));
                }
            }

            return(columnList);
        }
Esempio n. 2
0
        internal static Word GetKeyword(char[] sql, int beginIndex, int beginWordIndex, List <Word> wordList,
                                        string keyword, out int wordIndex, bool throwException)
        {
            //Word word = wordList[0];
            //if ( word.Type != WordType.NonWrapped )
            //{
            //    throw new Exception("Sql 语句 应以 select 关键字 开始。");
            //}

            int i;
            int j;

            int iLeft  = -1;
            int iRight = 0;

            Word w;

            wordIndex = beginWordIndex;

            for (i = beginWordIndex; i < wordList.Count; i++)
            {
                wordIndex = i;

                w = wordList[i];

                if (w.type != WordType.NonWrapped)
                {
                    continue;
                }

                if (beginIndex > w.iRight)
                {
                    continue;
                }

                j = beginIndex < w.iLeft ? w.iLeft : beginIndex;

                iLeft = StrUtil.FindForward(sql, j, w.iRight, keyword);

                if (iLeft != -1)
                {
                    iRight = iLeft + keyword.Length - 1;

                    //    判断 关键字 的 两边 是否是 空格, 关键字 的 两边 应该是 空格 才是 合法的 关键字
                    //    但是, 如果 两边 和 包裹符号 () [] ''  相邻 的 话 , 也是 合法 的 关键字
                    //    因为  GetWordList()  是 按 是否 被 () [] ''  包裹 来 划分  Word 块 的
                    //    所以 如果 关键字 的 最左边 的 字符 就是 Word 块 的 最左边 字符 的话, 这是合法的,
                    //    因为 这样 要么 是 sql 字符串 的 首字符(index == 0),
                    //    要么 就是 左边相邻 的 Word 块 是 一个 被 () [] '' 包裹的 Word 块 (w.Type == WordType.Wrapped)
                    //    右边 也 同样 。
                    if (
                        (
                            iLeft == w.iLeft
                            ||
                            (iLeft > 0 && StrUtil.IsOneOf(sql[iLeft - 1], Parser._whiteSpaces))
                        )
                        &&
                        (
                            iRight == w.iRight
                            ||
                            ((iRight < sql.Length - 1) && StrUtil.IsOneOf(sql[iRight + 1], Parser._whiteSpaces))
                        )
                        )
                    {
                        break;
                    }
                }
            }


            //if (iLeft == -1)
            //    throw new Exception("找不到合法的 关键字 \"" + keyword + "\"。 注意 关键字 不能包含在 () [] '' 中。");

            if (iLeft == -1)
            {
                if (throwException)
                {
                    throw new Exception("找不到合法的 关键字 \"" + keyword + "\"。 注意 关键字 不能包含在 () [] '' 中。");
                }
                else
                {
                    return(null);
                }
            }


            return(new Word(iLeft, iRight, WordType.NonWrapped));
        }
Esempio n. 3
0
        private static StrSpan GetContent小括号(char[] sql, StrSpan s)
        {
            char cLeft  = sql[s.iLeft];
            char cRight = sql[s.iRight];


            if (s.iLeft == s.iRight)
            {
                throw new SelectDataTableException("无效的 小括号, 缺少 结束小括号 。 ", sql, s.iLeft);
            }


            if (s.iRight == s.iLeft + 1)
            {
                if (cRight == ')')
                {
                    s         = new StrSpan(s.iLeft, s.iRight);
                    s.isEmpty = true;

                    return(s);
                }
                else
                {
                    throw new SelectDataTableException("无效的 小括号, 缺少 结束小括号 。 ", sql, s.iRight);
                }
            }

            int i = FindWrapperEnd小括号(sql, s.iLeft, s.iRight);

            if (i == -1)
            {
                throw new SelectDataTableException("无效的 小括号, 缺少 结束小括号 。 ", sql, s.iRight);
            }

            if (i < s.iRight)
            {
                throw new SelectDataTableException("语法错误。存在无效的字符 。 ", sql, i + 1);
            }


            s = StrUtil.Trim(sql, s.iLeft + 1, s.iRight - 1, _whiteSpaces);  //  去掉 小括号 并 对 内容 Trim


            return(s);

            //if ( s.isEmpty )
            //{
            //    s = new StrSpan(s.iLeft, s.iRight);
            //    s.isEmpty = true;

            //    return s;
            //}


            //i = s.iLeft;
            //int j = s.iRight;

            //while (true)
            //{
            //    if (sql[i] == '(' && sql[j] == ')')
            //    {
            //        if (i + 1 == j)
            //        {
            //            s = new StrSpan(i, j);
            //            s.isEmpty = true;

            //            return s;
            //        }
            //        if (i + 1 <= j - 1)
            //        {
            //            i++;
            //            j--;
            //        }
            //    }
            //    else
            //    {
            //        break;
            //    }
            //    //return GetContent小括号(sql, s);    //  去掉 重复 括号
            //}

            //return new StrSpan(s.iLeft, s.iRight);
        }
Esempio n. 4
0
 private static int FindWrapper(char[] sql, int beginIndex, int endIndex, char[] wrapperList)
 {
     return(StrUtil.FindForward(sql, beginIndex, endIndex, wrapperList));
 }
Esempio n. 5
0
        public static Content GetContent(char[] sql, int beginIndex, int endIndex)
        {
            if (beginIndex > endIndex)
            {
                throw new SelectDataTableException("beginIndex 应 小于等于 endIndex 。 beginIndex : " + beginIndex + " endIndex : " + endIndex + " 。 ", sql, beginIndex);
            }


            StrSpan s = StrUtil.Trim(sql, beginIndex, endIndex, Parser._whiteSpaces);

            Content content;

            if (s.isEmpty)
            {
                content         = new Content(s.iLeft, s.iRight, ContentType.None);
                content.isEmpty = true;

                return(content);
            }

            char cLeft  = sql[s.iLeft];
            char cRight = sql[s.iRight];

            if (cLeft == '\'')
            {
                s = GetContent单引号(sql, s);

                content = new Content(s.iLeft, s.iRight, ContentType.String);

                if (s.isEmpty)
                {
                    content.isEmpty = true;
                }

                return(content);
            }
            else if (cLeft == '[')
            {
                s = GetContent中括号(sql, s);
            }
            else if (cLeft == '(')
            {
                s = GetContent小括号(sql, s);

                content = new Content(s.iLeft, s.iRight, ContentType.Express);

                if (s.isEmpty)
                {
                    content.isEmpty = true;
                }

                return(content);
            }

            if (StrUtil.IsNumber(sql[s.iLeft]))
            {
                return(new Content(s.iLeft, s.iRight, ContentType.Number));
            }

            return(new Content(s.iLeft, s.iRight, ContentType.Column));

            //throw new Exception("语法错误。 在 第 " + s.iLeft + " 个 字符 \"" + sql[s.iLeft] + "\" 。");
        }