📄 sqlfile.java
字号:
if (recursed ||!continueOnError) {
throw ce;
}
} catch (QuitNow qn) {
throw qn;
} catch (SqlToolError ste) {
if (!continueOnError) {
throw ste;
}
}
stringBuffer.setLength(0);
}
if (inComment || stringBuffer.length() != 0) {
errprintln("Unterminated input: [" + stringBuffer + ']');
throw new SqlToolError("Unterminated input: ["
+ stringBuffer + ']');
}
gracefulExit = true;
} catch (QuitNow qn) {
gracefulExit = qn.getMessage() == null;
if ((!recursed) &&!gracefulExit) {
errprintln("Aborting: " + qn.getMessage());
}
if (recursed ||!gracefulExit) {
throw qn;
}
return;
} finally {
closeQueryOutputStream();
if (fetchingVar != null) {
errprintln("PL variable setting incomplete: " + fetchingVar);
gracefulExit = false;
}
if (br != null) {
br.close();
}
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 {
// Special-purpose constructor
private BadSpecial() {}
// Normal use constructor
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) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -