📄 sqlfile.java
字号:
} if ((!gracefulExit) && possiblyUncommitteds.get()) { errprintln("Rolling back SQL transaction."); curConn.rollback(); possiblyUncommitteds.set(false); } } } /** * Returns a copy of given string without a terminating semicolon. * If there is no terminating semicolon, null is returned. * * @param inString Base String, which will not be modified (because * a "copy" will be returned). */ private static String deTerminated(String inString) { int index = inString.lastIndexOf(';'); if (index < 0) { return null; } for (int i = index + 1; i < inString.length(); i++) { if (!Character.isWhitespace(inString.charAt(i))) { return null; } } return inString.substring(0, index); } /** * Utility nested Exception class for internal use. */ private class BadSpecial extends Exception { private BadSpecial(String s) { super(s); } } /** * Utility nested Exception class for internal use. * This must extend SqlToolError because it has to percolate up from * recursions of SqlTool.execute(), yet SqlTool.execute() is public * and external users should not declare (or expect!) QuitNows to be * thrown. * SqlTool.execute() on throws a QuitNow if it is in a recursive call. */ private class QuitNow extends SqlToolError { public QuitNow(String s) { super(s); } public QuitNow() { super(); } } /** * Utility nested Exception class for internal use. * Very similar to QuitNow. */ private class BreakException extends SqlToolError { public BreakException() { super(); } public BreakException(String s) { super(s); } } /** * Utility nested Exception class for internal use. * Very similar to QuitNow. */ private class ContinueException extends SqlToolError { public ContinueException() { super(); } public ContinueException(String s) { super(s); } } /** * Utility nested Exception class for internal use. */ private class BadSwitch extends Exception { private BadSwitch(int i) { super(Integer.toString(i)); } } /** * Process a Buffer/Edit Command. * * Due to the nature of the goal here, we don't trim() "other" like * we do for other kinds of commands. * * @param inString Complete command, less the leading ':' character. * @throws SQLException Passed through from processSQL() * @throws BadSpecial Runtime error() */ private void processBuffer(String inString) throws BadSpecial, SQLException { int index = 0; int special; char commandChar = 'i'; String other = null; if (inString.length() > 0) { commandChar = inString.charAt(0); other = inString.substring(1); if (other.trim().length() == 0) { other = null; } } switch (commandChar) { case ';' : curCommand = commandFromHistory(0); stdprintln("Executing command from buffer:\n" + curCommand + '\n'); processSQL(); return; case 'a' : case 'A' : stringBuffer.append(commandFromHistory(0)); if (other != null) { String deTerminated = deTerminated(other); if (!other.equals(";")) { stringBuffer.append(((deTerminated == null) ? other : deTerminated)); } if (deTerminated != null) { // If we reach here, then stringBuffer contains a // complete SQL command. curCommand = stringBuffer.toString(); setBuf(curCommand); stdprintln("Executing:\n" + curCommand + '\n'); processSQL(); stringBuffer.setLength(0); return; } } stdprintln("Appending to:\n" + stringBuffer); return; case 'l' : case 'L' : stdprintln("Current Buffer:\n" + commandFromHistory(0)); return; case 's' : case 'S' : // Sat Apr 23 14:14:57 EDT 2005. Changing history behavior. // It's very inconvenient to lose all modified SQL // commands from history just because _some_ may be modified // because they are bad or obsolete. boolean modeIC = false; boolean modeGlobal = false; boolean modeExecute = false; int modeLine = 0; try { String fromHist = commandFromHistory(0); StringBuffer sb = new StringBuffer(fromHist); if (other == null) { throw new BadSwitch(0); } String delim = other.substring(0, 1); StringTokenizer toker = new StringTokenizer(other, delim, true); if (toker.countTokens() < 4 ||!toker.nextToken().equals(delim)) { throw new BadSwitch(1); } String from = toker.nextToken().replace('$', '\n'); if (!toker.nextToken().equals(delim)) { throw new BadSwitch(2); } String to = toker.nextToken().replace('$', '\n'); if (to.equals(delim)) { to = ""; } else { if (toker.countTokens() > 0 &&!toker.nextToken().equals(delim)) { throw new BadSwitch(3); } } if (toker.countTokens() > 0) { String opts = toker.nextToken(""); for (int j = 0; j < opts.length(); j++) { switch (opts.charAt(j)) { case 'i' : modeIC = true; break; case ';' : modeExecute = true; break; case 'g' : modeGlobal = true; break; case '1' : case '2' : case '3' : case '4' : case '5' : case '6' : case '7' : case '8' : case '9' : modeLine = Character.digit(opts.charAt(j), 10); break; default : throw new BadSpecial( "Unknown Substitution option: " + opts.charAt(j)); } } } if (modeIC) { fromHist = fromHist.toUpperCase(); from = from.toUpperCase(); } // lineStart will be either 0 or char FOLLOWING a \n. int lineStart = 0; // lineStop is the \n AFTER what we consider. int lineStop = -1; if (modeLine > 0) { for (int j = 1; j < modeLine; j++) { lineStart = fromHist.indexOf('\n', lineStart) + 1; if (lineStart < 1) { throw new BadSpecial( "There are not " + modeLine + " lines in the buffer."); } } lineStop = fromHist.indexOf('\n', lineStart); } if (lineStop < 0) { lineStop = fromHist.length(); } // System.err.println("[" // + fromHist.substring(lineStart, lineStop) + ']'); int i; if (modeGlobal) { i = lineStop; while ((i = fromHist.lastIndexOf(from, i - 1)) >= lineStart) { sb.replace(i, i + from.length(), to); } } else if ((i = fromHist.indexOf(from, lineStart)) > -1 && i < lineStop) { sb.replace(i, i + from.length(), to); } //statementHistory[curHist] = sb.toString(); curCommand = sb.toString(); setBuf(curCommand); stdprintln((modeExecute ? "Executing" : "Current Buffer") + ":\n" + curCommand); if (modeExecute) { stdprintln(); } } catch (BadSwitch badswitch) { throw new BadSpecial( "Substitution syntax: \":s/from this/to that/i;g2\". " + "Use '$' for line separations. [" + badswitch.getMessage() + ']'); } if (modeExecute) { processSQL(); stringBuffer.setLength(0); } return; case '?' : stdprintln(BUFFER_HELP_TEXT); return; } throw new BadSpecial("Unknown Buffer Command"); } private boolean doPrepare = false; private String prepareVar = null; /** * Process a Special Command. * * @param inString Complete command, less the leading '\' character. * @throws SQLException Passed through from processSQL() * @throws BadSpecial Runtime error() * @throws QuitNot Command execution (but not the JVM!) should stop */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -