EscapeTokenizer.java
上传用户:sxlinghang
上传日期:2022-07-20
资源大小:1405k
文件大小:5k
源码类别:

数据库编程

开发平台:

Java

  1. /*
  2.    Copyright (C) 2002 MySQL AB
  3.       This program is free software; you can redistribute it and/or modify
  4.       it under the terms of the GNU General Public License as published by
  5.       the Free Software Foundation; either version 2 of the License, or
  6.       (at your option) any later version.
  7.       This program is distributed in the hope that it will be useful,
  8.       but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10.       GNU General Public License for more details.
  11.       You should have received a copy of the GNU General Public License
  12.       along with this program; if not, write to the Free Software
  13.       Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  14.  */
  15. package com.mysql.jdbc;
  16. /**
  17.  * EscapeTokenizer breaks up an SQL statement into SQL and
  18.  * escape code parts.
  19.  *
  20.  * @author Mark Matthews
  21.  */
  22. public class EscapeTokenizer {
  23.     private String source = null;
  24.     private boolean emittingEscapeCode = false;
  25.     private boolean inComment = false;
  26.     private boolean inQuotes = false;
  27.     private char lastChar = 0;
  28.     private char lastLastChar = 0;
  29.     private char quoteChar = 0;
  30.     private int bracesLevel = 0;
  31.     private int pos = 0;
  32.     private int sourceLength = 0;
  33.     /**
  34.      * Creates a new EscapeTokenizer object.
  35.      *
  36.      * @param s the string to tokenize
  37.      */
  38.     public EscapeTokenizer(String s) {
  39.         source = s;
  40.         sourceLength = s.length();
  41.         pos = 0;
  42.     }
  43.     /**
  44.      * Does this tokenizer have more tokens available?
  45.      *
  46.      * @return if this tokenizer has more tokens available
  47.      */
  48.     public synchronized boolean hasMoreTokens() {
  49.         return (pos < sourceLength);
  50.     }
  51.     /**
  52.      * Returns the next token
  53.      *
  54.      * @return the next token.
  55.      */
  56.     public synchronized String nextToken() {
  57.         StringBuffer tokenBuf = new StringBuffer();
  58.         if (emittingEscapeCode) {
  59.             tokenBuf.append("{");
  60.             emittingEscapeCode = false;
  61.         }
  62.         for (; pos < sourceLength; pos++) {
  63.             char c = source.charAt(pos);
  64.             if (c == ''') {
  65.                 if (lastChar != '\') {
  66.                     if (inQuotes) {
  67.                         if (quoteChar == c) {
  68.                             inQuotes = false;
  69.                         }
  70.                     } else {
  71.                         inQuotes = true;
  72.                         quoteChar = c;
  73.                     }
  74.                 } else if (lastLastChar == '\') {
  75.                     if (inQuotes) {
  76.                         if (quoteChar == c) {
  77.                             inQuotes = false;
  78.                         }
  79.                     } else {
  80.                         inQuotes = true;
  81.                         quoteChar = c;
  82.                     }
  83.                 }
  84.                 tokenBuf.append(c);
  85.             } else if (c == '"') {
  86.                 if ((lastChar != '\') && (lastChar != '"')) {
  87.                     if (inQuotes) {
  88.                         if (quoteChar == c) {
  89.                             inQuotes = false;
  90.                         }
  91.                     } else {
  92.                         inQuotes = true;
  93.                         quoteChar = c;
  94.                     }
  95.                 } else if (lastLastChar == '\') {
  96.                     if (inQuotes) {
  97.                         if (quoteChar == c) {
  98.                             inQuotes = false;
  99.                         }
  100.                     } else {
  101.                         inQuotes = true;
  102.                         quoteChar = c;
  103.                     }
  104.                 }
  105.                 tokenBuf.append(c);
  106.             } else if (c == '-') {
  107.                 if ((lastChar == '-') && ((lastLastChar != '\') & !inQuotes)) {
  108.                     inComment = true;
  109.                 }
  110.                 tokenBuf.append(c);
  111.             } else if ((c == 'n') || (c == 'r')) {
  112.                 inComment = false;
  113.                 tokenBuf.append(c);
  114.             } else if (c == '{') {
  115.                 if (inQuotes || inComment) {
  116.                     tokenBuf.append(c);
  117.                 } else {
  118.                     bracesLevel++;
  119.                     if (bracesLevel == 1) {
  120.                         pos++;
  121.                         emittingEscapeCode = true;
  122.                         return tokenBuf.toString();
  123.                     } else {
  124.                         tokenBuf.append(c);
  125.                     }
  126.                 }
  127.             } else if (c == '}') {
  128.                 tokenBuf.append(c);
  129.                 if (!inQuotes && !inComment) {
  130.                     lastChar = c;
  131.                     bracesLevel--;
  132.                     if (bracesLevel == 0) {
  133.                         pos++;
  134.                         return tokenBuf.toString();
  135.                     }
  136.                 }
  137.             } else {
  138.                 tokenBuf.append(c);
  139.             }
  140.             lastLastChar = lastChar;
  141.             lastChar = c;
  142.         }
  143.         return tokenBuf.toString();
  144.     }
  145. }