|
From: SVN by r. <sv...@ca...> - 2008-02-27 15:30:07
|
Author: roy
Date: 2008-02-27 16:29:54 +0100 (Wed, 27 Feb 2008)
New Revision: 242
Modified:
src/main/java/nl/improved/sqlclient/SQLShell.java
Log:
fix queries
Modified: src/main/java/nl/improved/sqlclient/SQLShell.java
===================================================================
--- src/main/java/nl/improved/sqlclient/SQLShell.java 2008-02-27 09:49:14 UTC (rev 241)
+++ src/main/java/nl/improved/sqlclient/SQLShell.java 2008-02-27 15:29:54 UTC (rev 242)
@@ -128,6 +128,7 @@
commands.register("EXIT[\\s]*", new QuitCommand("exit"));
//commands.register("\\\\Q[\\s]*", new QuitCommand("\\q"));
commands.register("@.*", new ExecuteBatchCommand());
+ commands.register("(SELECT|UPDATE|ALTER|INSERT|DELETE).*;[\\s]*", new QueryCommand());
// keys
actionKeys.put(Integer.toString(InputChar.KEY_LEFT), new KeyAction() {
@@ -736,8 +737,11 @@
}
return true;
}
- final Command command = createCommand(commandString);
+ Command command = createCommand(commandString); // first try to find a match without ;
if (command == null) {
+ command = createCommand(sqlCommand.getUntrimmedCommandString()); // then with ; for sql statements...
+ }
+ if (command == null) {
return false;
}
// make sure only one command is run at once
@@ -748,6 +752,7 @@
Logger.getLogger(SQLShell.class.getName()).log(Level.SEVERE, null, ex);
}
}
+ output(commandString+"\n");
if (direct || !command.backgroundProcessSupported()) {
output(command.execute(sqlCommand));
} else {
@@ -766,7 +771,7 @@
if (command != null) {
return command;
}
- if (commandString.endsWith(";")) {
+ if (commandString.matches(".*;[\\s]*")) {
return new QueryCommand(); // TODO is this ever reached???
}
return null;
@@ -1381,7 +1386,7 @@
// Exec cmd
String commandString = cmd.toString();
currentCommand = createCommand(commandString);
- output(commandString);
+ output(commandString+"\n");
output(currentCommand.execute(new InputCommand(commandString)));
cmd=new StringBuilder();
}
@@ -1498,7 +1503,6 @@
execute();
} finally {
showPrompt = true;
- try { Thread.sleep(500);} catch(InterruptedException e) {} // hack
paint();
}
}
|
|
From: SVN by r. <sv...@ca...> - 2008-03-02 12:10:01
|
Author: roy
Date: 2008-03-02 13:09:49 +0100 (Sun, 02 Mar 2008)
New Revision: 243
Modified:
src/main/java/nl/improved/sqlclient/SQLShell.java
Log:
made output synchronized as well
Modified: src/main/java/nl/improved/sqlclient/SQLShell.java
===================================================================
--- src/main/java/nl/improved/sqlclient/SQLShell.java 2008-02-27 15:29:54 UTC (rev 242)
+++ src/main/java/nl/improved/sqlclient/SQLShell.java 2008-03-02 12:09:49 UTC (rev 243)
@@ -540,7 +540,7 @@
* Output data to the screen.
* @param data the data to print to the screen.
*/
- protected void output(CharSequence data) {
+ protected synchronized void output(CharSequence data) {
screenBuffer.addAll(getLines(data));
if (spoolWriter != null) {
try {
|
|
From: SVN by r. <sv...@ca...> - 2008-03-02 13:48:55
|
Author: roy
Date: 2008-03-02 14:48:44 +0100 (Sun, 02 Mar 2008)
New Revision: 244
Modified:
src/main/java/nl/improved/sqlclient/SQLShell.java
Log:
made the order of the help for keymappings a little more readable (grouped)
Modified: src/main/java/nl/improved/sqlclient/SQLShell.java
===================================================================
--- src/main/java/nl/improved/sqlclient/SQLShell.java 2008-03-02 12:09:49 UTC (rev 243)
+++ src/main/java/nl/improved/sqlclient/SQLShell.java 2008-03-02 13:48:44 UTC (rev 244)
@@ -24,7 +24,7 @@
import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import java.util.HashMap;
+import java.util.LinkedHashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import jcurses.widgets.Window;
@@ -98,7 +98,7 @@
*/
private CommandManager commands = new CommandManager();
- private Map<String, KeyAction> actionKeys = new HashMap<String, KeyAction>();
+ private Map<String, KeyAction> actionKeys = new LinkedHashMap<String, KeyAction>();
/**
* Constructor.
@@ -184,6 +184,32 @@
return "Arrow Down:\tBrowse to next command in the history";
}
});
+ actionKeys.put(Integer.toString(InputChar.KEY_END),new KeyAction() {
+ public void execute() {
+ int curLineEnd = commandLines.getLines().get(cursorPosition.y).length();
+ if (cursorPosition.x == curLineEnd) {
+ cursorPosition.y = commandLines.getLines().size()-1;
+ CharSequence lineBuffer = commandLines.getLines().get(cursorPosition.y);
+ cursorPosition.x = lineBuffer.length();
+ } else {
+ cursorPosition.x = curLineEnd;
+ }
+ }
+ public CharSequence getHelp() {
+ return "End:\tMove the cursor to the end of the line, of if already there to the end of the command";
+ }
+ });
+ actionKeys.put(Integer.toString(InputChar.KEY_HOME), new KeyAction() {
+ public void execute() {
+ if (cursorPosition.x == 0) {
+ cursorPosition.y = 0;
+ }
+ cursorPosition.x = 0;
+ }
+ public CharSequence getHelp() {
+ return "Home:\tMove the cursor to the start of the line, of if already there to the start of the command";
+ }
+ });
actionKeys.put(Integer.toString(InputChar.KEY_BACKSPACE), new KeyAction() {
public void execute() {
if (cursorPosition.x == 0) {
@@ -218,54 +244,6 @@
return "Del:\tDelete the charactor at the current cursor position";
}
});
- actionKeys.put(Integer.toString(InputChar.KEY_PPAGE), new KeyAction() {
- public void execute() {
- if ((screenBuffer.size() + commandLines.getLines().size()
- - (Toolkit.getScreenHeight()/2) * pageUpCount) > 0) {
- pageUpCount++;
-
- }
- }
- public CharSequence getHelp() {
- return "PageUp:\tMove back in screen history";
- }
- });
- actionKeys.put(Integer.toString(InputChar.KEY_NPAGE), new KeyAction() {
- public void execute() {
- if (pageUpCount > 0) {
- pageUpCount--;
- }
- }
- public CharSequence getHelp() {
- return "PageDown:\tMove forward in screen history";
- }
- });
- actionKeys.put(Integer.toString(InputChar.KEY_END),new KeyAction() {
- public void execute() {
- int curLineEnd = commandLines.getLines().get(cursorPosition.y).length();
- if (cursorPosition.x == curLineEnd) {
- cursorPosition.y = commandLines.getLines().size()-1;
- CharSequence lineBuffer = commandLines.getLines().get(cursorPosition.y);
- cursorPosition.x = lineBuffer.length();
- } else {
- cursorPosition.x = curLineEnd;
- }
- }
- public CharSequence getHelp() {
- return "End:\tMove the cursor to the end of the line, of if already there at the end of the command";
- }
- });
- actionKeys.put(Integer.toString(InputChar.KEY_HOME), new KeyAction() {
- public void execute() {
- if (cursorPosition.x == 0) {
- cursorPosition.y = 0;
- }
- cursorPosition.x = 0;
- }
- public CharSequence getHelp() {
- return "End:\tMove the cursor to the start of the line, of if already there at the start of the command";
- }
- });
actionKeys.put("", new KeyAction() {
public void execute() {
StringBuilder lineBuffer = commandLines.getEditableLines().get(cursorPosition.y);
@@ -297,6 +275,28 @@
return "Control-U:\tRemove all characters before the cursor position";
}
});
+ actionKeys.put(Integer.toString(InputChar.KEY_PPAGE), new KeyAction() {
+ public void execute() {
+ if ((screenBuffer.size() + commandLines.getLines().size()
+ - (Toolkit.getScreenHeight()/2) * pageUpCount) > 0) {
+ pageUpCount++;
+
+ }
+ }
+ public CharSequence getHelp() {
+ return "PageUp:\tMove back in screen history";
+ }
+ });
+ actionKeys.put(Integer.toString(InputChar.KEY_NPAGE), new KeyAction() {
+ public void execute() {
+ if (pageUpCount > 0) {
+ pageUpCount--;
+ }
+ }
+ public CharSequence getHelp() {
+ return "PageDown:\tMove forward in screen history";
+ }
+ });
actionKeys.put("", new KeyAction() { //Ctrl+D
public void execute() {
if (commandLines.getCommandString().length() == 0) { //Quit on empty commandline, ignore otherwise
|
|
From: SVN by r. <sv...@ca...> - 2008-03-02 13:51:05
|
Author: roy
Date: 2008-03-02 14:50:55 +0100 (Sun, 02 Mar 2008)
New Revision: 245
Modified:
src/main/java/nl/improved/sqlclient/SQLShell.java
Log:
added some javadoc
Modified: src/main/java/nl/improved/sqlclient/SQLShell.java
===================================================================
--- src/main/java/nl/improved/sqlclient/SQLShell.java 2008-03-02 13:48:44 UTC (rev 244)
+++ src/main/java/nl/improved/sqlclient/SQLShell.java 2008-03-02 13:50:55 UTC (rev 245)
@@ -40,7 +40,14 @@
*/
public class SQLShell extends Window {
+ /**
+ * The current command thread executing a SQLShell command.
+ */
private CommandThread commandThread;
+ /**
+ * True when the prompt should be visible.
+ * Normally it is not visible during the execution of a command
+ */
private boolean showPrompt = true;
/**
@@ -98,6 +105,9 @@
*/
private CommandManager commands = new CommandManager();
+ /**
+ * A map of string key representation to a action that should be executed when a specific key is pressed.
+ */
private Map<String, KeyAction> actionKeys = new LinkedHashMap<String, KeyAction>();
/**
|
|
From: SVN by r. <sv...@ca...> - 2008-03-02 14:09:00
|
Author: roy
Date: 2008-03-02 15:08:49 +0100 (Sun, 02 Mar 2008)
New Revision: 246
Modified:
src/main/java/nl/improved/sqlclient/SQLShell.java
Log:
output fixes
removed border of 1 pix around interface
Modified: src/main/java/nl/improved/sqlclient/SQLShell.java
===================================================================
--- src/main/java/nl/improved/sqlclient/SQLShell.java 2008-03-02 13:50:55 UTC (rev 245)
+++ src/main/java/nl/improved/sqlclient/SQLShell.java 2008-03-02 14:08:49 UTC (rev 246)
@@ -115,7 +115,7 @@
*/
public SQLShell() {
super(Toolkit.getScreenWidth(),Toolkit.getScreenHeight(), true, "SQLShell");
- char[] emptyLineChar = new char[Toolkit.getScreenWidth()-2];
+ char[] emptyLineChar = new char[Toolkit.getScreenWidth()];
Arrays.fill(emptyLineChar, ' ');
emptyLine = new String(emptyLineChar);
@@ -329,7 +329,7 @@
}
});
- MAX_LINE_LENGTH = Toolkit.getScreenWidth()-(2+PROMPT.length()+2+1); // 2 spaces bouds.. prompt + "> "
+ MAX_LINE_LENGTH = Toolkit.getScreenWidth()-(PROMPT.length()+2+1); // prompt + "> "
output("Welcome to the SQLShell client.");
output("Type 'help' to get a list of available commands other then the default sql input.");
@@ -395,7 +395,7 @@
* @param inp the character that is being pressed by the user.
*/
protected void handleInput(InputChar inp) {
- debug("Input: " + inp.getCode());
+ //debug("Input: " + inp.getCode());
try {
if (inp.getCode() != InputChar.KEY_PPAGE && inp.getCode() != InputChar.KEY_NPAGE) {
pageUpCount = 0; // some character entered, so reset pageup count
@@ -793,7 +793,6 @@
*/
@Override
protected synchronized void paint() {
- Toolkit.clearScreen(new CharColor(CharColor.WHITE, CharColor.BLACK, CharColor.REVERSE, CharColor.REVERSE));
CharColor color = new CharColor(CharColor.BLACK, CharColor.WHITE, CharColor.BOLD, CharColor.BOLD);
List<CharSequence> tmpList = new ArrayList<CharSequence>();
@@ -810,8 +809,8 @@
}
}
int startLine;
- if (tmpList.size() > Toolkit.getScreenHeight()-4) {
- startLine = tmpList.size() - (Toolkit.getScreenHeight()-4);
+ if (tmpList.size() > Toolkit.getScreenHeight()-1) {
+ startLine = tmpList.size() - (Toolkit.getScreenHeight()-1);
if (pageUpCount > 0) {
startLine -= (pageUpCount * Toolkit.getScreenHeight()/2);
if (startLine < 0) {
@@ -822,11 +821,15 @@
startLine = 0;
}
int lineNr;
- for (lineNr = startLine;lineNr < tmpList.size() && lineNr - startLine < Toolkit.getScreenHeight()-4; lineNr++) {
- CharSequence line = tmpList.get(lineNr);
- Toolkit.printString(line.toString()
- , 1, lineNr+1-startLine, color);
+ for (lineNr = startLine;lineNr < tmpList.size() && lineNr - startLine < Toolkit.getScreenHeight()-1; lineNr++) {
+ CharSequence linePart = tmpList.get(lineNr);
+ String line = linePart + emptyLine.substring(linePart.length());
+ Toolkit.printString(line
+ , 0, lineNr-startLine, color);
}
+ for (int lNr = lineNr; lNr < Toolkit.getScreenHeight(); lNr++) {
+ Toolkit.printString(emptyLine, 0, lNr, color);
+ }
// paint cursor
color = new CharColor(CharColor.BLACK, CharColor.WHITE, CharColor.REVERSE, CharColor.REVERSE);
@@ -837,7 +840,7 @@
cursorChar = tmp.substring(cursorPosition.x, cursorPosition.x+1);
}
}
- Toolkit.printString(cursorChar, PROMPT.length() +"> ".length() + cursorPosition.x+1, lineNr-(commandLines.getLines().size() -cursorPosition.y-1)-startLine, color);
+ Toolkit.printString(cursorChar, PROMPT.length() +"> ".length() + cursorPosition.x, lineNr-(commandLines.getLines().size() -cursorPosition.y)-startLine, color);
}
private void debug(String debug) {
@@ -851,7 +854,7 @@
* @return the text devided into multiple lines to match the screen width
*/
private static List<CharSequence> getLines(CharSequence text) {
- int maxWidth = Toolkit.getScreenWidth()-2;
+ int maxWidth = Toolkit.getScreenWidth();
List<CharSequence> list = new ArrayList<CharSequence>();
StringBuilder buffer = new StringBuilder();
for (int i=0; i<text.length(); i++) {
@@ -885,7 +888,7 @@
maxWidth = Math.max(maxWidth, iValues.next().length());
}
maxWidth+=2;// add extra space
- int nrOfColumns = (Toolkit.getScreenWidth()-2) / maxWidth;
+ int nrOfColumns = (Toolkit.getScreenWidth()) / maxWidth;
StringBuilder returnValue = new StringBuilder();
for (int row = 0; row < values.size(); row+=nrOfColumns) {
for (int col = 0; col < nrOfColumns && row + col < values.size(); col++) {
|
|
From: SVN by r. <sv...@ca...> - 2008-03-03 10:47:21
|
Author: roy
Date: 2008-03-03 11:42:27 +0100 (Mon, 03 Mar 2008)
New Revision: 249
Modified:
src/main/java/nl/improved/sqlclient/SQLShell.java
Log:
small cleanup of code
made exit sqlshell the last keybinding in the help overview
Modified: src/main/java/nl/improved/sqlclient/SQLShell.java
===================================================================
--- src/main/java/nl/improved/sqlclient/SQLShell.java 2008-03-03 07:39:20 UTC (rev 248)
+++ src/main/java/nl/improved/sqlclient/SQLShell.java 2008-03-03 10:42:27 UTC (rev 249)
@@ -307,25 +307,25 @@
return "PageDown:\tMove forward in screen history";
}
});
- actionKeys.put("", new KeyAction() { //Ctrl+D
+ actionKeys.put("", new KeyAction() { // ctrl+a
public void execute() {
- if (commandLines.getCommandString().length() == 0) { //Quit on empty commandline, ignore otherwise
- executeCommand(new InputCommand("quit"));
+ output("Abort requested");
+ if (commandThread.isAlive() && commandThread.getCommand().abort()) {
+ output("Abort done..");
}
}
public CharSequence getHelp() {
- return "Control-D:\tExit sqlshell";
+ return "Control-A:\tAbort current command (if it is supported by that command)";
}
});
- actionKeys.put("", new KeyAction() { // ctrl+a
+ actionKeys.put("", new KeyAction() { //Ctrl+D
public void execute() {
- output("Abort requested");
- if (commandThread.isAlive() && commandThread.getCommand().abort()) {
- output("Abort done..");
+ if (commandLines.getCommandString().length() == 0) { //Quit on empty commandline, ignore otherwise
+ executeCommand(new InputCommand("quit"));
}
}
public CharSequence getHelp() {
- return "Control-A:\tAbort current command (if it is supported by that command)";
+ return "Control-D:\tExit sqlshell";
}
});
@@ -762,7 +762,7 @@
Logger.getLogger(SQLShell.class.getName()).log(Level.SEVERE, null, ex);
}
}
- output(commandString+"\n");
+ output(commandString);
if (direct || !command.backgroundProcessSupported()) {
output(command.execute(sqlCommand));
} else {
@@ -1383,7 +1383,7 @@
FileInputStream fin = null;
try {
fin = new FileInputStream(toFileName(command.substring(1)));
- output("Reading file: "+ toFileName(command.substring(1))+"\n");
+ output("Reading file: "+ toFileName(command.substring(1)));
BufferedReader reader = new BufferedReader(new InputStreamReader(fin));
StringBuilder cmd = new StringBuilder();
String line;
@@ -1399,7 +1399,7 @@
// Exec cmd
String commandString = cmd.toString();
currentCommand = createCommand(commandString);
- output(commandString+"\n");
+ output(commandString);
output(currentCommand.execute(new InputCommand(commandString)));
cmd=new StringBuilder();
}
|
|
From: SVN by r. <sv...@ca...> - 2008-03-04 10:52:56
|
Author: roy
Date: 2008-03-04 11:52:42 +0100 (Tue, 04 Mar 2008)
New Revision: 250
Modified:
src/main/java/nl/improved/sqlclient/SQLShell.java
Log:
try to fix more paint issues...
really hard to track though
Modified: src/main/java/nl/improved/sqlclient/SQLShell.java
===================================================================
--- src/main/java/nl/improved/sqlclient/SQLShell.java 2008-03-03 10:42:27 UTC (rev 249)
+++ src/main/java/nl/improved/sqlclient/SQLShell.java 2008-03-04 10:52:42 UTC (rev 250)
@@ -561,14 +561,13 @@
error(e);
}
}
- paint(); // refresh screen
}
/**
* Output error exception to the screen.
* @param e the error to print to the screen
*/
- protected void error(Throwable e) {
+ protected synchronized void error(Throwable e) {
output(e.getMessage() == null ? e.toString() : e.getMessage());
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
@@ -1402,6 +1401,7 @@
output(commandString);
output(currentCommand.execute(new InputCommand(commandString)));
cmd=new StringBuilder();
+ new Thread() { public void run() { paint();}}.start();
}
}
} catch(IOException e) {
|
|
From: SVN by r. <sv...@ca...> - 2008-03-14 15:14:50
|
Author: roy
Date: 2008-03-14 16:14:40 +0100 (Fri, 14 Mar 2008)
New Revision: 253
Modified:
src/main/java/nl/improved/sqlclient/SQLShell.java
Log:
hopefully an indexoutof bounds fixed
Modified: src/main/java/nl/improved/sqlclient/SQLShell.java
===================================================================
--- src/main/java/nl/improved/sqlclient/SQLShell.java 2008-03-14 12:39:55 UTC (rev 252)
+++ src/main/java/nl/improved/sqlclient/SQLShell.java 2008-03-14 15:14:40 UTC (rev 253)
@@ -822,7 +822,7 @@
int lineNr;
for (lineNr = startLine;lineNr < tmpList.size() && lineNr - startLine < Toolkit.getScreenHeight()-1; lineNr++) {
CharSequence linePart = tmpList.get(lineNr);
- String line = linePart + emptyLine.substring(linePart.length());
+ String line = linePart.length() >= emptyLine.length() ? linePart.toString() : linePart + emptyLine.substring(linePart.length());
Toolkit.printString(line
, 0, lineNr-startLine, color);
}
|
|
From: SVN by r. <sv...@ca...> - 2008-03-18 20:56:30
|
Author: roy
Date: 2008-03-18 21:56:18 +0100 (Tue, 18 Mar 2008)
New Revision: 254
Modified:
src/main/java/nl/improved/sqlclient/SQLShell.java
Log:
fix desc for columns containging numbers
Modified: src/main/java/nl/improved/sqlclient/SQLShell.java
===================================================================
--- src/main/java/nl/improved/sqlclient/SQLShell.java 2008-03-14 15:14:40 UTC (rev 253)
+++ src/main/java/nl/improved/sqlclient/SQLShell.java 2008-03-18 20:56:18 UTC (rev 254)
@@ -128,7 +128,7 @@
commands.register("CONNECT[\\s]*.*", new ConnectCommand());
commands.register("DISCONNECT[\\s]*", new DisConnectCommand());
commands.register("SHOW[\\s]+[A-Z]+(|[A-Z]|_|\\.)*(|[\\s]+HAVING[\\s][A-Z]*.*)", new ShowCommand());
- commands.register("DESC[\\s]+[A-Z]+(|[A-Z]|_|\\.)*", new DescCommand());
+ commands.register("DESC[\\s]+[A-Z]+(|[0-9]|[A-Z]|_|-|\\.)*", new DescCommand());
commands.register("WINDOW[\\s]+[A-Z]+", new WindowCommand());
commands.register("INFO[\\s]*", new InfoCommand());
commands.register("HELP[\\s]*.*", new HelpCommand());
|
|
From: SVN by r. <sv...@ca...> - 2008-04-03 13:20:30
|
Author: roy
Date: 2008-04-03 15:20:14 +0200 (Thu, 03 Apr 2008)
New Revision: 257
Modified:
src/main/java/nl/improved/sqlclient/SQLShell.java
Log:
added extra check for indexoutofbounds exception
Modified: src/main/java/nl/improved/sqlclient/SQLShell.java
===================================================================
--- src/main/java/nl/improved/sqlclient/SQLShell.java 2008-03-18 21:19:11 UTC (rev 256)
+++ src/main/java/nl/improved/sqlclient/SQLShell.java 2008-04-03 13:20:14 UTC (rev 257)
@@ -836,6 +836,10 @@
String cursorChar = " ";
if (commandLines.getLines().size() > 0) {
String tmp = commandLines.getLines().get(cursorPosition.y).toString();
+ if (cursorPosition.x < 0) {
+ debug("Cursor position was: "+ cursorPosition +" fixing");
+ cursorPosition.x = 0;
+ }
if (cursorPosition.x < tmp.length()) {
cursorChar = tmp.substring(cursorPosition.x, cursorPosition.x+1);
}
|
|
From: SVN by r. <sv...@ca...> - 2008-05-19 20:28:59
|
Author: roy
Date: 2008-05-19 22:28:44 +0200 (Mon, 19 May 2008)
New Revision: 261
Modified:
src/main/java/nl/improved/sqlclient/DBConnector.java
src/main/java/nl/improved/sqlclient/SQLShell.java
Log:
mysql fixes (table names are case sensitive)
Modified: src/main/java/nl/improved/sqlclient/DBConnector.java
===================================================================
--- src/main/java/nl/improved/sqlclient/DBConnector.java 2008-04-04 18:43:39 UTC (rev 260)
+++ src/main/java/nl/improved/sqlclient/DBConnector.java 2008-05-19 20:28:44 UTC (rev 261)
@@ -22,8 +22,7 @@
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
+import java.util.HashMap;
import java.util.Hashtable;
import java.util.Set;
import java.util.Map;
@@ -50,8 +49,8 @@
private static final String DEFAULT_TIME_PATTERN = "HH:mm:ss";
private static DBConnector instance = null;
- private boolean tableNamesUppercase = false;
+ private Map<String, String> tableNames;
private Map<String, ConnectionSettings> predefinedConnections;
private String defaultConnector;
@@ -100,10 +99,8 @@
if (name == null) {
return null;
}
- if (tableNamesUppercase) {
- return name.toUpperCase();
- }
- return name.toLowerCase();
+ String returnValue = tableNames == null ? null : tableNames.get(name.toLowerCase());
+ return returnValue == null ? name : returnValue;
}
public boolean treatDateAsTimestamp() {
@@ -287,18 +284,14 @@
activeConnection = DriverManager.getConnection(settings.getConnectionURL(), username, password);
activeConnection.setAutoCommit(autoCommit);
// INITIALIZE database settings
+ tableNames = new HashMap<String, String>();
try {
DatabaseMetaData metaData = activeConnection.getMetaData();
ResultSet rs = metaData.getTables(activeConnection.getCatalog(), getSchema()
, null, new String[]{"TABLE"});
while (rs.next()) {
String tableName = rs.getString("TABLE_NAME");
- for (int i = 0; i < tableName.length(); i++) {
- if (Character.isLetter(tableName.charAt(i))) {
- this.tableNamesUppercase = Character.isUpperCase(tableName.charAt(i));
- break;
- }
- }
+ tableNames.put(tableName.toLowerCase(), tableName);
}
rs = metaData.getTypeInfo();
dateIsTimeStamp = true;
@@ -331,6 +324,7 @@
activeConnection = null;
}
queryExecutor = null;
+ tableNames = null;
}
public Connection getConnection() {
Modified: src/main/java/nl/improved/sqlclient/SQLShell.java
===================================================================
--- src/main/java/nl/improved/sqlclient/SQLShell.java 2008-04-04 18:43:39 UTC (rev 260)
+++ src/main/java/nl/improved/sqlclient/SQLShell.java 2008-05-19 20:28:44 UTC (rev 261)
@@ -660,11 +660,12 @@
}
if (match != null) {
if (sub.length() > 0) {
- if (Character.isUpperCase(sub.charAt(0))) {
+ /*if (Character.isUpperCase(sub.charAt(0))) {
match = match.toUpperCase();
} else {
match = match.toLowerCase();
- }
+ }*/
+ match = DBConnector.getInstance().translateDbVar(match);
}
return match.substring(sub.length());
}
|
|
From: SVN by r. <sv...@ca...> - 2008-07-16 21:03:15
|
Author: roy
Date: 2008-07-16 23:03:05 +0200 (Wed, 16 Jul 2008)
New Revision: 264
Modified:
src/main/java/nl/improved/sqlclient/SQLShell.java
Log:
rollback quit
improvements to ctrl+w
Modified: src/main/java/nl/improved/sqlclient/SQLShell.java
===================================================================
--- src/main/java/nl/improved/sqlclient/SQLShell.java 2008-07-16 20:47:38 UTC (rev 263)
+++ src/main/java/nl/improved/sqlclient/SQLShell.java 2008-07-16 21:03:05 UTC (rev 264)
@@ -225,11 +225,7 @@
public void execute() {
if (cursorPosition.x == 0) {
if (cursorPosition.y > 0) {
- StringBuilder line = getEditableCommand().getEditableLines().remove(cursorPosition.y);
- cursorPosition.y--;
- StringBuilder lineBuffer = commandLines.getEditableLines().get(cursorPosition.y);
- cursorPosition.x = lineBuffer.length();
- lineBuffer.append(line);
+ joinLine();
}
} else {
StringBuilder tmp = getEditableCommand().getEditableLines().get(cursorPosition.y);
@@ -256,7 +252,13 @@
}
});
actionKeys.put("", new KeyAction() {
- public void execute() {
+ public void execute() { // ctrl+w
+ if (cursorPosition.x == 0) {
+ if (cursorPosition.y > 0) {
+ joinLine();
+ }
+ return;
+ }
StringBuilder lineBuffer = commandLines.getEditableLines().get(cursorPosition.y);
int previousBreak = SQLUtil.getLastBreakIndex(lineBuffer.substring(0, cursorPosition.x-1));
if (lineBuffer.charAt(previousBreak) == ' ' || lineBuffer.charAt(previousBreak) == '\t') {
@@ -580,7 +582,7 @@
e.printStackTrace(new PrintWriter(sw));
sw.flush();
lastExceptionDetails = sw.toString();
- output(sw.toString());
+ //output(sw.toString());
}
/**
@@ -1166,9 +1168,7 @@
}
@Override
public CharSequence execute(SQLCommand command) {
- //close();
hide();
- Window.closeAllWindows();
return "Application terminated.";
}
@Override
@@ -1607,6 +1607,13 @@
}
+ private void joinLine() {
+ StringBuilder line = getEditableCommand().getEditableLines().remove(cursorPosition.y);
+ cursorPosition.y--;
+ StringBuilder lineBuffer = commandLines.getEditableLines().get(cursorPosition.y);
+ cursorPosition.x = lineBuffer.length();
+ lineBuffer.append(line);
+ }
private interface KeyAction {
void execute();
CharSequence getHelp();
@@ -1614,9 +1621,7 @@
public static void main(String[] args) {
SQLShell shell = new SQLShell();
- shell.setVisible(false);
- shell.setVisible(true);
- //shell.show();
+ shell.show();
//Interpret first argument as a connect argument
if (args.length > 0) {
|
|
From: SVN by r. <sv...@ca...> - 2008-07-23 09:50:24
|
Author: roy Date: 2008-07-23 11:50:14 +0200 (Wed, 23 Jul 2008) New Revision: 266 Modified: src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java Log: added dump/read command implementation.. not final yet though! Modified: src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java =================================================================== --- src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java 2008-07-23 07:24:09 UTC (rev 265) +++ src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java 2008-07-23 09:50:14 UTC (rev 266) @@ -17,8 +17,14 @@ import java.io.*; import java.sql.Connection; +import java.sql.Date; +import java.sql.PreparedStatement; import java.sql.ResultSet; +import java.sql.ResultSetMetaData; import java.sql.SQLException; +import java.sql.Statement; +import java.sql.Types; +import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.ArrayList; import java.util.Iterator; @@ -28,7 +34,13 @@ import java.util.LinkedHashMap; import java.util.logging.Level; import java.util.logging.Logger; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; import nl.improved.sqlclient.commands.*; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; /** * The SQLShell main class. @@ -130,6 +142,8 @@ commands.register("HELP[\\s]*.*", new HelpCommand()); commands.register("HISTORY[\\s]*.*", new HistoryCommand()); commands.register("SPOOL[\\s]*.*", new SpoolCommand()); + commands.register("DUMP[\\s]*.*[A-Z]+.*", new DumpCommand()); + commands.register("READ[\\s]*.*[A-Z]+.*", new ReadCommand()); commands.register("QUIT[\\s]*", new QuitCommand("quit")); commands.register("EXIT[\\s]*", new QuitCommand("exit")); //commands.register("\\\\Q[\\s]*", new QuitCommand("\\q")); @@ -1273,7 +1287,210 @@ return false; } } + /** + * Writes the result of a query into a dump file so that it can be read back. + */ + private class DumpCommand implements Command { + private String fileName; + private FileWriter dumpWriter; + @Override + public CharSequence execute(SQLCommand cmd) { + String command = cmd.getCommandString(); + String nextPart = command.substring("dump".length()).trim(); + String dumpFileName; + if (nextPart.indexOf(' ') > 0) { + dumpFileName = nextPart.substring(0, nextPart.indexOf(' ')); + } else { + dumpFileName = nextPart; + } + try { + File f = new File(toFileName(dumpFileName +".dmp")); + fileName = f.getAbsolutePath(); + if ((f.exists() && !f.canWrite()) || (!f.exists() && !f.createNewFile())) { + throw new IllegalStateException("Failed to create spool to file: '"+fileName+"'"); + } + dumpWriter = new FileWriter(fileName); + dumpWriter.write("<dump tablename=\"" + dumpFileName+"\">\n"); + String query = "select * from " + nextPart; + Connection c = DBConnector.getInstance().getConnection(); + Statement stmt = c.createStatement(); + ResultSet rs = stmt.executeQuery(query); + SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss"); + while (rs.next()) { + dumpWriter.write(" <row>\n"); + ResultSetMetaData metaData = rs.getMetaData(); + for (int col = 1; col <= metaData.getColumnCount(); col++) { + dumpWriter.write(" <col name=\""+metaData.getColumnName(col)+"\""); + if (metaData.getColumnType(col) == Types.DATE) { + dumpWriter.write(" type=\"date\">"); + Date date = rs.getDate(col); + if (date != null) { + dumpWriter.write(formatter.format(date)); + } + } else { + dumpWriter.write(">"); + if (rs.getString(col) != null) { + dumpWriter.write(rs.getString(col)); // TODO fix xml + } + } + dumpWriter.write("</col>\n"); + } + dumpWriter.write(" </row>\n"); + } + dumpWriter.write("</dump>"); + } catch (SQLException e) { + throw new IllegalStateException("Failed to execute query for dump("+fileName+"): " + e.toString(), e); + } catch (IOException e) { + throw new IllegalStateException("Failed to create dump ("+fileName+"): " + e.toString(), e); + } finally { + try { + dumpWriter.close(); + } catch (IOException ex) { + Logger.getLogger(AbstractSQLShellWindow.class.getName()).log(Level.SEVERE, null, ex); + } + } + return "Dump to "+fileName+" done."; + } + + @Override + public CharSequence getCommandString() { + return "dump"; + } + + /** + * Returns some tab completion info for the specified command. + * @param commandInfo the command lines + * @param commandPoint the cursor position + * @return some tab completion info for the specified command. + */ + @Override + public TabCompletionInfo getTabCompletionInfo(SQLCommand command, Point commandPoint) { + return null; + } + @Override + public CharSequence getHelp() { + return "tablename [where clause]"; + } + @Override + public boolean abort() { + return false;// not implemented + } + @Override + public boolean backgroundProcessSupported() { + return false; + } + } + /** + * Read the result of a dump file. + */ + private class ReadCommand implements Command { + private String fileName; + + @Override + public CharSequence execute(SQLCommand cmd) { + String command = cmd.getCommandString(); + String nextPart = command.substring("read".length()).trim(); + String dumpFileName; + if (nextPart.indexOf(' ') > 0) { + dumpFileName = nextPart.substring(0, nextPart.indexOf(' ')); + } else { + dumpFileName = nextPart; + } + try { + File f = new File(toFileName(dumpFileName +".dmp")); + fileName = f.getAbsolutePath(); + if (!f.exists() && !f.canRead()) { + throw new IllegalStateException("Failed to read dump file: '"+fileName+"'"); + } + // Step 1: create a DocumentBuilderFactory + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + + // Step 2: create a DocumentBuilder + DocumentBuilder db = dbf.newDocumentBuilder(); + + // Step 3: parse the input file to get a Document object + Document doc = db.parse(new File(fileName)); + + Element documentElement = doc.getDocumentElement(); + String tableName = documentElement.getAttribute("tablename"); + NodeList nodeList = documentElement.getElementsByTagName("row"); + + String query = "insert into " + tableName +" ("; + String values = ") values ("; + Element n = (Element) nodeList.item(0); // row + NodeList cols = n.getElementsByTagName("col"); + output("LENGTH : "+ n.getNodeName() +"/ "+ cols.getLength()); + for (int colNr = 0; colNr < cols.getLength(); colNr++) { + query += cols.item(colNr).getAttributes().getNamedItem("name").getNodeValue(); + values += "?"; + if (colNr +1 < cols.getLength()) { + query +=", "; + values +=", "; + } + } + query = query + values +")"; + Connection c = DBConnector.getInstance().getConnection(); + PreparedStatement pstmt = c.prepareStatement(query); + SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss"); + for (int nodeNr = 0; nodeNr < nodeList.getLength(); nodeNr++) { + Element row = (Element) nodeList.item(0); // row + NodeList columns = row.getElementsByTagName("col"); + for (int colNr = 0; colNr < columns.getLength(); colNr++) { + Element column = (Element) columns.item(colNr); + Node type = column.getAttributes().getNamedItem("type"); + if (type != null && type.getNodeValue().equals("date")) { + String nodeValue = column.getTextContent(); + if (nodeValue == null || nodeValue.equals("")) { + pstmt.setDate(colNr+1, null); + } else { + pstmt.setDate(colNr+1, new Date(formatter.parse(nodeValue).getTime())); + } + } else { + pstmt.setString(colNr+1, column.getTextContent()); + } + } + pstmt.executeUpdate(); + } + } catch (SQLException e) { + throw new IllegalStateException("Failed to execute update query for dump("+fileName+"): " + e.toString(), e); + } catch (IOException e) { + throw new IllegalStateException("Failed to read dump ("+fileName+"): " + e.toString(), e); + } catch (Exception e) { + throw new IllegalStateException("Failed to read dump ("+fileName+"): " + e.toString(), e); + } + return "Read from "+fileName+" done."; + } + + @Override + public CharSequence getCommandString() { + return "read"; + } + + /** + * Returns some tab completion info for the specified command. + * @param commandInfo the command lines + * @param commandPoint the cursor position + * @return some tab completion info for the specified command. + */ + @Override + public TabCompletionInfo getTabCompletionInfo(SQLCommand command, Point commandPoint) { + return null; // TODO + } + @Override + public CharSequence getHelp() { + return "filename: read dump file from filename\n"; + } + @Override + public boolean abort() { + return false;// not implemented + } + @Override + public boolean backgroundProcessSupported() { + return false; + } + } + private class ExecuteBatchCommand implements Command { private boolean cancelled; private Command currentCommand; |
|
From: SVN by r. <sv...@ca...> - 2008-07-23 20:57:23
|
Author: roy
Date: 2008-07-23 22:57:12 +0200 (Wed, 23 Jul 2008)
New Revision: 268
Modified:
src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java
Log:
fix error in read.. not reading first row everytime
Modified: src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java
===================================================================
--- src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java 2008-07-23 10:25:10 UTC (rev 267)
+++ src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java 2008-07-23 20:57:12 UTC (rev 268)
@@ -1434,7 +1434,7 @@
PreparedStatement pstmt = c.prepareStatement(query);
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
for (int nodeNr = 0; nodeNr < nodeList.getLength(); nodeNr++) {
- Element row = (Element) nodeList.item(0); // row
+ Element row = (Element) nodeList.item(nodeNr); // row
NodeList columns = row.getElementsByTagName("col");
for (int colNr = 0; colNr < columns.getLength(); colNr++) {
Element column = (Element) columns.item(colNr);
@@ -1447,6 +1447,7 @@
pstmt.setDate(colNr+1, new Date(formatter.parse(nodeValue).getTime()));
}
} else {
+ //debug(nodeNr +" ? "+column.getTextContent());
pstmt.setString(colNr+1, column.getTextContent());
}
}
|
|
From: SVN by r. <sv...@ca...> - 2008-07-27 11:27:41
|
Author: roy
Date: 2008-07-27 13:27:29 +0200 (Sun, 27 Jul 2008)
New Revision: 269
Modified:
src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java
src/main/java/nl/improved/sqlclient/SQLUtil.java
Log:
fixes in 'autobreak' to nextline code
Modified: src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java
===================================================================
--- src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java 2008-07-23 20:57:12 UTC (rev 268)
+++ src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java 2008-07-27 11:27:29 UTC (rev 269)
@@ -503,6 +503,7 @@
if (currentLine.length() > MAX_LINE_LENGTH) {
// TODO search for lastspace that is not between '' ??
int lastSpace = SQLUtil.getLastBreakIndex(currentLine.toString());//currentLine.lastIndexOf(" ");
+ int lastChar = currentLine.charAt(lastSpace);
if (lastSpace == -1) {
lastSpace = currentLine.length();
}
@@ -522,16 +523,20 @@
// fetch the next line
StringBuilder nextLine = editableLines.get(cursorPosition.y+1);
// if the nextline already has some text.. add a space in front of it
- if (nextLine.length() > 0) {
+ // if there is not already a 'breaking character' there
+ if (nextLine.length() > 0 && ! SQLUtil.isBreakCharacter(nextLine.charAt(0))) {
nextLine.insert(0, ' ');
}
// insert the new text at the beginning
- nextLine.insert(0, currentLine.subSequence(lastSpace+1, currentLine.length()));
+ nextLine.insert(0, currentLine.subSequence(lastSpace, currentLine.length()));
currentLine.delete(lastSpace, currentLine.length());
+ if (lastChar == ' ') {
+ nextLine.deleteCharAt(0);
+ }
// check if the cursor postition > the new line length
// calculate new x and go to nextline
if (cursorPosition.x >= lastSpace) {
- cursorPosition.x = cursorPosition.x - (lastSpace+1);
+ cursorPosition.x = cursorPosition.x - (lastSpace);
cursorPosition.y++;
}
}
Modified: src/main/java/nl/improved/sqlclient/SQLUtil.java
===================================================================
--- src/main/java/nl/improved/sqlclient/SQLUtil.java 2008-07-23 20:57:12 UTC (rev 268)
+++ src/main/java/nl/improved/sqlclient/SQLUtil.java 2008-07-27 11:27:29 UTC (rev 269)
@@ -26,6 +26,7 @@
*/
public class SQLUtil {
+ final static char[] breakCharacters = new char[]{' ', '\t', '.', ','};
/**
* A regular expression statement for name chars.
*/
@@ -293,13 +294,21 @@
}
+ public static boolean isBreakCharacter(char c) {
+ for (char breakChar : breakCharacters) {
+ if (c == breakChar) {
+ return true;
+ }
+ }
+ return false;
+ }
+
/**
* Returns the index of last spacing in the string.
* this method is used for clearing or breaking lines.
*/
public static int getLastBreakIndex(String s) {
int spaceIndex = 0;
- char[] breakCharacters = new char[]{' ', '\t', '.', ','};
for (int i = 0; i < breakCharacters.length; i++) {
int tmpIndex = s.lastIndexOf(breakCharacters[i]);
if (tmpIndex > 0 && tmpIndex > spaceIndex) {
|
|
From: SVN by r. <sv...@ca...> - 2008-07-27 11:36:55
|
Author: roy
Date: 2008-07-27 13:36:47 +0200 (Sun, 27 Jul 2008)
New Revision: 270
Modified:
src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java
Log:
catch exceptions in paint()
print sql command as entered
Modified: src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java
===================================================================
--- src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java 2008-07-27 11:27:29 UTC (rev 269)
+++ src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java 2008-07-27 11:36:47 UTC (rev 270)
@@ -361,7 +361,11 @@
public abstract int getScreenHeight();
private void repaint() {
if (paint) {
- paint();
+ try {
+ paint();
+ } catch(Throwable t) {
+ error(t);
+ }
}
}
public abstract void paint();
@@ -453,9 +457,6 @@
}
beep(); // TODO clear search??
return;
- /*} else if (sqlCommand.getCommandString().equalsIgnoreCase("exit")) {
- close();
- return;*/
} else if (executeCommand(sqlCommand)) {
// clear command history
if (commandIndex != commandHistory.size()-1) {
@@ -577,6 +578,15 @@
* Output data to the screen.
* @param data the data to print to the screen.
*/
+ protected synchronized void output(List<? extends CharSequence> data) {
+ for(CharSequence c : data) {
+ output(c);
+ }
+ }
+ /**
+ * Output data to the screen.
+ * @param data the data to print to the screen.
+ */
protected synchronized void output(CharSequence data) {
screenBuffer.addAll(getLines(data));
if (spoolWriter != null) {
@@ -777,7 +787,7 @@
Logger.getLogger(AbstractSQLShellWindow.class.getName()).log(Level.SEVERE, null, ex);
}
}
- output(commandString);
+ output(sqlCommand.getLines());
if (direct || !command.backgroundProcessSupported()) {
output(command.execute(sqlCommand));
} else {
|
|
From: SVN by r. <sv...@ca...> - 2008-07-27 11:40:08
|
Author: roy
Date: 2008-07-27 13:40:00 +0200 (Sun, 27 Jul 2008)
New Revision: 271
Modified:
src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java
Log:
fix regression bug for pageup count reset
Modified: src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java
===================================================================
--- src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java 2008-07-27 11:36:47 UTC (rev 270)
+++ src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java 2008-07-27 11:40:00 UTC (rev 271)
@@ -417,7 +417,7 @@
*/
protected void handleInput(InputKey inp) {
try {
- if (inp.isSpecialKey() && inp.getSpecialKeyValue() != InputKey.SpecialKey.PAGE_UP && inp.getSpecialKeyValue() != InputKey.SpecialKey.PAGE_DOWN) {
+ if (!inp.isSpecialKey() || (inp.getSpecialKeyValue() != InputKey.SpecialKey.PAGE_UP && inp.getSpecialKeyValue() != InputKey.SpecialKey.PAGE_DOWN)) {
pageUpCount = 0; // some character entered, so reset pageup count
}
if (inp.isSpecialKey()) {
|
|
From: SVN by r. <sv...@ca...> - 2008-07-28 20:20:35
|
Author: roy Date: 2008-07-28 22:20:24 +0200 (Mon, 28 Jul 2008) New Revision: 272 Modified: src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java Log: initial rewrite for non blocking pasting of commands Modified: src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java =================================================================== --- src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java 2008-07-27 11:40:00 UTC (rev 271) +++ src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java 2008-07-28 20:20:24 UTC (rev 272) @@ -15,7 +15,15 @@ */ package nl.improved.sqlclient; -import java.io.*; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.io.Writer; import java.sql.Connection; import java.sql.Date; import java.sql.PreparedStatement; @@ -32,6 +40,8 @@ import java.util.List; import java.util.Map; import java.util.LinkedHashMap; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; import javax.xml.parsers.DocumentBuilder; @@ -113,12 +123,15 @@ */ protected CommandManager commands = new CommandManager(); + private ArrayBlockingQueue<CommandInfo> commandQueue = new ArrayBlockingQueue<CommandInfo>(10, true); // true means fair + /** * A map of string key representation to a action that should be executed when a specific key is pressed. */ private Map<String, KeyAction> actionKeys = new LinkedHashMap<String, KeyAction>(); private Map<InputKey.SpecialKey, KeyAction> specialActionKeys = new LinkedHashMap<InputKey.SpecialKey, KeyAction>(); private boolean paint = true; + private boolean run = true; // set to false on quit /** * Constructor. @@ -152,6 +165,7 @@ // keys specialActionKeys.put(InputKey.SpecialKey.LEFT, new KeyAction() { + @Override public void execute() { if (cursorPosition.x > 0) { cursorPosition.x--; @@ -160,11 +174,13 @@ cursorPosition.x = commandLines.getLines().get(cursorPosition.y).length(); } } + @Override public CharSequence getHelp() { return "Arrow Left:\tMove cursor to the left"; } }); specialActionKeys.put(InputKey.SpecialKey.RIGHT, new KeyAction() { + @Override public void execute() { CharSequence tmp = commandLines.getLines().get(cursorPosition.y); if (cursorPosition.x < tmp.length()) { @@ -174,11 +190,13 @@ cursorPosition.y++; } } + @Override public CharSequence getHelp() { return "Arrow Right:\tMove cursor to the right"; } }); specialActionKeys.put(InputKey.SpecialKey.UP, new KeyAction() { + @Override public void execute() { if (commandIndex > 0) { commandLines = commandHistory.get(--commandIndex); @@ -187,11 +205,13 @@ cursorPosition.x = lineBuffer.length(); } } + @Override public CharSequence getHelp() { return "Arrow Up:\tBrowse to previous command in the history"; } }); specialActionKeys.put(InputKey.SpecialKey.DOWN, new KeyAction() { + @Override public void execute() { if (commandIndex < commandHistory.size()-1) { commandLines = commandHistory.get(++commandIndex); @@ -200,11 +220,13 @@ cursorPosition.x = lineBuffer.length(); } } + @Override public CharSequence getHelp() { return "Arrow Down:\tBrowse to next command in the history"; } }); specialActionKeys.put(InputKey.SpecialKey.END,new KeyAction() { + @Override public void execute() { int curLineEnd = commandLines.getLines().get(cursorPosition.y).length(); if (cursorPosition.x == curLineEnd) { @@ -215,22 +237,26 @@ cursorPosition.x = curLineEnd; } } + @Override public CharSequence getHelp() { return "End:\tMove the cursor to the end of the line, of if already there to the end of the command"; } }); specialActionKeys.put(InputKey.SpecialKey.HOME, new KeyAction() { + @Override public void execute() { if (cursorPosition.x == 0) { cursorPosition.y = 0; } cursorPosition.x = 0; } + @Override public CharSequence getHelp() { return "Home:\tMove the cursor to the start of the line, of if already there to the start of the command"; } }); specialActionKeys.put(InputKey.SpecialKey.BACKSPACE, new KeyAction() { + @Override public void execute() { if (cursorPosition.x == 0) { if (cursorPosition.y > 0) { @@ -244,11 +270,13 @@ } } } + @Override public CharSequence getHelp() { return "Backspace:\tRemove the character before the cursor position"; } }); specialActionKeys.put(InputKey.SpecialKey.DELETE, new KeyAction() { + @Override public void execute() { StringBuilder lineBuffer = commandLines.getEditableLines().get(cursorPosition.y); if (cursorPosition.x < lineBuffer.length()) { @@ -256,6 +284,7 @@ tmp.deleteCharAt(cursorPosition.x); } } + @Override public CharSequence getHelp() { return "Del:\tDelete the charactor at the current cursor position"; } @@ -269,6 +298,7 @@ } } + @Override public CharSequence getHelp() { return "PageUp:\tMove back in screen history"; } @@ -280,11 +310,13 @@ pageUpCount--; } } + @Override public CharSequence getHelp() { return "PageDown:\tMove forward in screen history"; } }); actionKeys.put("", new KeyAction() { + @Override public void execute() { // ctrl+w if (cursorPosition.x == 0) { if (cursorPosition.y > 0) { @@ -300,11 +332,13 @@ lineBuffer.delete(previousBreak, cursorPosition.x); cursorPosition.x = previousBreak; } + @Override public CharSequence getHelp() { return "Control-W:\tRemove word before cursor position"; } }); actionKeys.put("", new KeyAction() { // ctrl+u + @Override public void execute() { if (cursorPosition.x > 0) { StringBuilder lineBuffer = commandLines.getEditableLines().get(cursorPosition.y); @@ -320,6 +354,7 @@ lineBuffer.delete(0, lineBuffer.length()); } } + @Override public CharSequence getHelp() { return "Control-U:\tRemove all characters before the cursor position"; } @@ -354,6 +389,51 @@ output("Welcome to the SQLShell client."); output("Type 'help' to get a list of available commands other then the default sql input."); + + Runnable r = new Runnable() { + @Override + public void run() { + while ( run ) { + final CommandInfo cmd; + try { + cmd = commandQueue.poll(5, TimeUnit.SECONDS); + } catch (InterruptedException ex) { + Logger.getLogger(AbstractSQLShellWindow.class.getName()).log(Level.SEVERE, null, ex); + continue; + } + if (cmd == null) { + // TODO update waiting dot or something + continue; + } + // make sure only one command is run at once + if (commandThread != null && commandThread.isAlive()) { + try { + commandThread.join(); + } catch (InterruptedException ex) { + Logger.getLogger(AbstractSQLShellWindow.class.getName()).log(Level.SEVERE, null, ex); + } + } + output(cmd.sql.getLines()); + repaint(); + if (/*direct ||*/ !cmd.cmd.backgroundProcessSupported()) { + output(cmd.cmd.execute(cmd.sql)); + repaint(); + } else { + commandThread = new CommandThread(cmd.cmd) { + @Override + void execute() { + output(getCommand().execute(cmd.sql)); + } + }; + commandThread.start(); + } + + } + } + }; + Thread t = new Thread(r); + t.setDaemon(true); + t.start(); } @@ -758,7 +838,7 @@ * @param command the command to try and execute * @return true if it succeeded. */ - protected boolean executeCommand(SQLCommand sqlCommand) { + private boolean executeCommand(SQLCommand sqlCommand) { return executeCommand(sqlCommand, false); } @@ -779,26 +859,7 @@ if (command == null) { return false; } - // make sure only one command is run at once - if (commandThread != null && commandThread.isAlive()) { - try { - commandThread.join(); - } catch (InterruptedException ex) { - Logger.getLogger(AbstractSQLShellWindow.class.getName()).log(Level.SEVERE, null, ex); - } - } - output(sqlCommand.getLines()); - if (direct || !command.backgroundProcessSupported()) { - output(command.execute(sqlCommand)); - } else { - commandThread = new CommandThread(command) { - @Override - void execute() { - output(getCommand().execute(sqlCommand)); - } - }; - commandThread.start(); - } + commandQueue.add(new CommandInfo(sqlCommand, command)); return true; } private Command createCommand(String commandString) { @@ -1077,6 +1138,7 @@ @Override public CharSequence execute(SQLCommand command) { paint = false; + run = false; close(); return "Application terminated."; } @@ -1731,4 +1793,14 @@ void execute(); CharSequence getHelp(); } + + private class CommandInfo { + private SQLCommand sql; + private Command cmd; + + public CommandInfo(SQLCommand sql, Command cmd) { + this.sql = sql; + this.cmd = cmd; + } + } } |
|
From: SVN by r. <sv...@ca...> - 2008-07-28 20:59:59
|
Author: roy
Date: 2008-07-28 22:59:50 +0200 (Mon, 28 Jul 2008)
New Revision: 274
Modified:
src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java
Log:
made repaint synchronized
Modified: src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java
===================================================================
--- src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java 2008-07-28 20:54:09 UTC (rev 273)
+++ src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java 2008-07-28 20:59:50 UTC (rev 274)
@@ -421,7 +421,7 @@
public abstract int getScreenWidth();
public abstract int getScreenHeight();
- protected void repaint() {
+ protected synchronized void repaint() {
if (paint) {
try {
paint(screen);
|
|
From: SVN by r. <sv...@ca...> - 2008-08-03 12:15:28
|
Author: roy
Date: 2008-08-03 14:15:17 +0200 (Sun, 03 Aug 2008)
New Revision: 279
Modified:
src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java
Log:
added support for encoding..
TODO add support for 'blob' binaries
Modified: src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java
===================================================================
--- src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java 2008-08-03 11:37:34 UTC (rev 278)
+++ src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java 2008-08-03 12:15:17 UTC (rev 279)
@@ -20,6 +20,7 @@
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
+import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringWriter;
@@ -46,12 +47,20 @@
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.sax.SAXTransformerFactory;
+import javax.xml.transform.sax.TransformerHandler;
+import javax.xml.transform.stream.StreamResult;
import nl.improved.sqlclient.commands.*;
import nl.improved.sqlclient.util.LimitedArrayList;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.AttributesImpl;
/**
* The SQLShell abstract main class.
@@ -1380,7 +1389,6 @@
*/
private class DumpCommand implements Command {
private String fileName;
- private FileWriter dumpWriter;
@Override
public CharSequence execute(SQLCommand cmd) {
@@ -1393,51 +1401,80 @@
dumpFileName = nextPart;
}
int rowCount = 0;
+ PrintWriter out = null;
try {
File f = new File(toFileName(dumpFileName +".dmp"));
fileName = f.getAbsolutePath();
if ((f.exists() && !f.canWrite()) || (!f.exists() && !f.createNewFile())) {
throw new IllegalStateException("Failed to create spool to file: '"+fileName+"'");
}
- dumpWriter = new FileWriter(fileName);
- dumpWriter.write("<dump tablename=\"" + dumpFileName+"\">\n");
+ out = new PrintWriter(new FileWriter(fileName));
+ StreamResult streamResult = new StreamResult(out);
+ SAXTransformerFactory tf = (SAXTransformerFactory) SAXTransformerFactory.newInstance();
+ // SAX2.0 ContentHandler.
+ TransformerHandler hd = tf.newTransformerHandler();
+ Transformer serializer = hd.getTransformer();
+ serializer.setOutputProperty(OutputKeys.ENCODING,"ISO-8859-1");
+ serializer.setOutputProperty(OutputKeys.INDENT,"yes");
+ hd.setResult(streamResult);
+ hd.startDocument();
+ AttributesImpl atts = new AttributesImpl();
+ atts.addAttribute("", "", "tablename", "", dumpFileName);
+ // USERS tag.
+ hd.startElement("","","dump",atts);
+
String query = "select * from " + nextPart;
Connection c = DBConnector.getInstance().getConnection();
Statement stmt = c.createStatement();
ResultSet rs = stmt.executeQuery(query);
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
while (rs.next()) {
- dumpWriter.write(" <row>\n");
+ atts.clear();
+ hd.startElement("","","row",atts);
ResultSetMetaData metaData = rs.getMetaData();
for (int col = 1; col <= metaData.getColumnCount(); col++) {
- dumpWriter.write(" <col name=\""+metaData.getColumnName(col)+"\"");
+ atts.addAttribute("","","name","",metaData.getColumnName(col));
if (metaData.getColumnType(col) == Types.DATE) {
- dumpWriter.write(" type=\"date\">");
+ atts.addAttribute("","","type","","date");
+ hd.startElement("","","col",atts);
Date date = rs.getDate(col);
if (date != null) {
- dumpWriter.write(formatter.format(date));
+ String dateString = formatter.format(date);
+ hd.characters(dateString.toCharArray(), 0, dateString.length());
}
+ } else if (metaData.getColumnType(col) == Types.BINARY ||
+ metaData.getColumnType(col) == Types.BLOB ||
+ metaData.getColumnType(col) == Types.CLOB ||
+ metaData.getColumnType(col) == Types.LONGNVARCHAR) {
+ InputStream valueStream = rs.getBinaryStream(col);
+ //Base64
+ atts.addAttribute("","","type","","binary");
+ hd.startElement("","","col",atts);
} else {
- dumpWriter.write(">");
- if (rs.getString(col) != null) {
- dumpWriter.write(rs.getString(col)); // TODO fix xml
+ hd.startElement("","","col",atts);
+ String value= rs.getString(col);
+ if (value != null) {
+ hd.characters(value.toCharArray(), 0, value.length());
}
}
- dumpWriter.write("</col>\n");
+ hd.endElement("","","col");
}
- dumpWriter.write(" </row>\n");
+ hd.endElement("","","row");
rowCount++;
}
- dumpWriter.write("</dump>");
+ hd.endElement("","","dump");
+ hd.endDocument();
+ } catch (SAXException ex) {
+ Logger.getLogger(AbstractSQLShellWindow.class.getName()).log(Level.SEVERE, null, ex);
+ } catch (TransformerConfigurationException e) {
+ throw new IllegalStateException("Failed to create xml handler: " + e.toString(), e);
} catch (SQLException e) {
throw new IllegalStateException("Failed to execute query for dump("+fileName+"): " + e.toString(), e);
} catch (IOException e) {
throw new IllegalStateException("Failed to create dump ("+fileName+"): " + e.toString(), e);
} finally {
- try {
- dumpWriter.close();
- } catch (IOException ex) {
- Logger.getLogger(AbstractSQLShellWindow.class.getName()).log(Level.SEVERE, null, ex);
+ if (out != null) {
+ out.close();
}
}
return "Dump to "+fileName+" done. ("+ rowCount+" rows written)";
|
|
From: SVN by r. <sv...@ca...> - 2008-08-03 20:01:52
|
Author: roy Date: 2008-08-03 22:01:43 +0200 (Sun, 03 Aug 2008) New Revision: 280 Modified: src/main/java/nl/improved/sqlclient/SQLShell.java Log: made deprecated Modified: src/main/java/nl/improved/sqlclient/SQLShell.java =================================================================== --- src/main/java/nl/improved/sqlclient/SQLShell.java 2008-08-03 12:15:17 UTC (rev 279) +++ src/main/java/nl/improved/sqlclient/SQLShell.java 2008-08-03 20:01:43 UTC (rev 280) @@ -15,1617 +15,18 @@ */ package nl.improved.sqlclient; -import java.io.*; -import java.sql.Connection; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.Arrays; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.LinkedHashMap; -import java.util.logging.Level; -import java.util.logging.Logger; -import jcurses.widgets.Window; -import jcurses.system.InputChar; -import jcurses.system.Toolkit; -import jcurses.system.CharColor; -import jcurses.widgets.PopUpMenu; -import nl.improved.sqlclient.commands.*; +import nl.improved.sqlclient.jcurses.SQLShellWindow; + /** * The SQLShell main class. * This class provides a (textbased) window for entering sql commands. */ -public class SQLShell extends Window { +public class SQLShell { - /** - * The current command thread executing a SQLShell command. - */ - private CommandThread commandThread; - /** - * True when the prompt should be visible. - * Normally it is not visible during the execution of a command - */ - private boolean showPrompt = true; - - /** - * The (default) maximum matches to show in a selection dialog. - */ - private static final int MAX_MATCH_SIZE = 15; - private int MAX_LINE_LENGTH; // not static and final.. since it can change on window resize - - /** - * Page up count 0 means were at the bottom of our screen. - * Increasement of the pageup count moves the visible part of the screen up. - */ - private int pageUpCount = 0; - /** - * All lines in a screen. - */ - private List<CharSequence> screenBuffer = new LimitedArrayList<CharSequence>(1000); - /** - * The current command lines. - */ - private SQLCommand commandLines; - /** - * All commands in history. - */ - private List<SQLCommand> commandHistory = new LimitedArrayList<SQLCommand>(50); - /** - * Index for browsing commands. - */ - private int commandIndex = 0; - /** - * An empty line for easy line completion (fill with spaces). - */ - private String emptyLine; - /** - * The cursor position in the command lines list. - * 0,0 means it is at the first line at the first character - * 10,5 means it is at the 11th character at the 6th line - */ - private Point cursorPosition = new Point(0,0); - /** - * The prompt to show when entering sql commands. - */ - private static final String PROMPT = "SQL"; - /** - * Some debug info holding the last trace of an exception. - */ - private String lastExceptionDetails; - - /** - * The output file when spool is on. - */ - private Writer spoolWriter; - /** - * A manager for available commands. - */ - private CommandManager commands = new CommandManager(); - - /** - * A map of string key representation to a action that should be executed when a specific key is pressed. - */ - private Map<String, KeyAction> actionKeys = new LinkedHashMap<String, KeyAction>(); - - /** - * Constructor. - */ - public SQLShell() { - super(Toolkit.getScreenWidth(),Toolkit.getScreenHeight(), true, "SQLShell"); - char[] emptyLineChar = new char[Toolkit.getScreenWidth()]; - Arrays.fill(emptyLineChar, ' '); - emptyLine = new String(emptyLineChar); - - // initialize the command shell - commandLines = new SQLCommand(); - commandHistory.add(commandLines); - newLine(); - - // Register all known commands - commands.register("CONNECT[\\s]*.*", new ConnectCommand()); - commands.register("DISCONNECT[\\s]*", new DisConnectCommand()); - commands.register("SHOW[\\s]+[A-Z]+(|[A-Z]|_|\\.)*(|[\\s]+HAVING[\\s][A-Z]*.*)", new ShowCommand()); - commands.register("DESC[\\s]+[A-Z]+(|[0-9]|[A-Z]|_|-|\\.)*", new DescCommand()); - commands.register("WINDOW[\\s]+[A-Z]+", new WindowCommand()); - commands.register("INFO[\\s]*", new InfoCommand()); - commands.register("HELP[\\s]*.*", new HelpCommand()); - commands.register("HISTORY[\\s]*.*", new HistoryCommand()); - commands.register("SPOOL[\\s]*.*", new SpoolCommand()); - commands.register("QUIT[\\s]*", new QuitCommand("quit")); - commands.register("EXIT[\\s]*", new QuitCommand("exit")); - //commands.register("\\\\Q[\\s]*", new QuitCommand("\\q")); - commands.register("@.*", new ExecuteBatchCommand()); - commands.register("(SELECT|UPDATE|ALTER|INSERT|DELETE).*;[\\s]*", new QueryCommand()); - - // keys - actionKeys.put(Integer.toString(InputChar.KEY_LEFT), new KeyAction() { - public void execute() { - if (cursorPosition.x > 0) { - cursorPosition.x--; - } else if (cursorPosition.y > 0) { - cursorPosition.y--; - cursorPosition.x = commandLines.getLines().get(cursorPosition.y).length(); - } - } - public CharSequence getHelp() { - return "Arrow Left:\tMove cursor to the left"; - } - }); - actionKeys.put(Integer.toString(InputChar.KEY_RIGHT), new KeyAction() { - public void execute() { - CharSequence tmp = commandLines.getLines().get(cursorPosition.y); - if (cursorPosition.x < tmp.length()) { - cursorPosition.x++; - } else if (cursorPosition.y < commandLines.getLines().size()-1) { - cursorPosition.x = 0; - cursorPosition.y++; - } - } - public CharSequence getHelp() { - return "Arrow Right:\tMove cursor to the right"; - } - }); - actionKeys.put(Integer.toString(InputChar.KEY_UP), new KeyAction() { - public void execute() { - if (commandIndex > 0) { - commandLines = commandHistory.get(--commandIndex); - cursorPosition.y = commandLines.getLines().size()-1; - CharSequence lineBuffer = commandLines.getLines().get(cursorPosition.y); - cursorPosition.x = lineBuffer.length(); - } - } - public CharSequence getHelp() { - return "Arrow Up:\tBrowse to previous command in the history"; - } - }); - actionKeys.put(Integer.toString(InputChar.KEY_DOWN), new KeyAction() { - public void execute() { - if (commandIndex < commandHistory.size()-1) { - commandLines = commandHistory.get(++commandIndex); - cursorPosition.y = commandLines.getLines().size()-1; - CharSequence lineBuffer = commandLines.getLines().get(cursorPosition.y); - cursorPosition.x = lineBuffer.length(); - } - } - public CharSequence getHelp() { - return "Arrow Down:\tBrowse to next command in the history"; - } - }); - actionKeys.put(Integer.toString(InputChar.KEY_END),new KeyAction() { - public void execute() { - int curLineEnd = commandLines.getLines().get(cursorPosition.y).length(); - if (cursorPosition.x == curLineEnd) { - cursorPosition.y = commandLines.getLines().size()-1; - CharSequence lineBuffer = commandLines.getLines().get(cursorPosition.y); - cursorPosition.x = lineBuffer.length(); - } else { - cursorPosition.x = curLineEnd; - } - } - public CharSequence getHelp() { - return "End:\tMove the cursor to the end of the line, of if already there to the end of the command"; - } - }); - actionKeys.put(Integer.toString(InputChar.KEY_HOME), new KeyAction() { - public void execute() { - if (cursorPosition.x == 0) { - cursorPosition.y = 0; - } - cursorPosition.x = 0; - } - public CharSequence getHelp() { - return "Home:\tMove the cursor to the start of the line, of if already there to the start of the command"; - } - }); - actionKeys.put(Integer.toString(InputChar.KEY_BACKSPACE), new KeyAction() { - public void execute() { - if (cursorPosition.x == 0) { - if (cursorPosition.y > 0) { - joinLine(); - } - } else { - StringBuilder tmp = getEditableCommand().getEditableLines().get(cursorPosition.y); - if (cursorPosition.x > 0) { - tmp.deleteCharAt(cursorPosition.x-1); - cursorPosition.x--; - } - } - } - public CharSequence getHelp() { - return "Backspace:\tRemove the character before the cursor position"; - } - }); - actionKeys.put(Integer.toString(InputChar.KEY_DC), new KeyAction() { - public void execute() { - StringBuilder lineBuffer = commandLines.getEditableLines().get(cursorPosition.y); - if (cursorPosition.x < lineBuffer.length()) { - StringBuilder tmp = getEditableCommand().getEditableLines().get(cursorPosition.y); - tmp.deleteCharAt(cursorPosition.x); - } - } - public CharSequence getHelp() { - return "Del:\tDelete the charactor at the current cursor position"; - } - }); - actionKeys.put("", new KeyAction() { - public void execute() { // ctrl+w - if (cursorPosition.x == 0) { - if (cursorPosition.y > 0) { - joinLine(); - } - return; - } - StringBuilder lineBuffer = commandLines.getEditableLines().get(cursorPosition.y); - int previousBreak = SQLUtil.getLastBreakIndex(lineBuffer.substring(0, cursorPosition.x-1)); - if (lineBuffer.charAt(previousBreak) == ' ' || lineBuffer.charAt(previousBreak) == '\t') { - previousBreak++; - } - lineBuffer.delete(previousBreak, cursorPosition.x); - cursorPosition.x = previousBreak; - } - public CharSequence getHelp() { - return "Control-W:\tRemove word before cursor position"; - } - }); - actionKeys.put("", new KeyAction() { // ctrl+u - public void execute() { - if (cursorPosition.x > 0) { - StringBuilder lineBuffer = commandLines.getEditableLines().get(cursorPosition.y); - lineBuffer.delete(0, cursorPosition.x); - cursorPosition.x = 0; - } else if (cursorPosition.y > 0) { - StringBuilder lineBuffer = commandLines.getEditableLines().get(cursorPosition.y); - if (lineBuffer.length() == 0) { - commandLines.getEditableLines().remove(cursorPosition.y); - } - cursorPosition.y--; - lineBuffer = commandLines.getEditableLines().get(cursorPosition.y); - lineBuffer.delete(0, lineBuffer.length()); - } - } - public CharSequence getHelp() { - return "Control-U:\tRemove all characters before the cursor position"; - } - }); - actionKeys.put(Integer.toString(InputChar.KEY_PPAGE), new KeyAction() { - public void execute() { - if ((screenBuffer.size() + commandLines.getLines().size() - - (Toolkit.getScreenHeight()/2) * pageUpCount) > 0) { - pageUpCount++; - - } - } - public CharSequence getHelp() { - return "PageUp:\tMove back in screen history"; - } - }); - actionKeys.put(Integer.toString(InputChar.KEY_NPAGE), new KeyAction() { - public void execute() { - if (pageUpCount > 0) { - pageUpCount--; - } - } - public CharSequence getHelp() { - return "PageDown:\tMove forward in screen history"; - } - }); - actionKeys.put("", new KeyAction() { // ctrl+a - public void execute() { - output("Abort requested"); - if (commandThread.isAlive() && commandThread.getCommand().abort()) { - output("Abort done.."); - } - } - public CharSequence getHelp() { - return "Control-A:\tAbort current command (if it is supported by that command)"; - } - }); - actionKeys.put("", new KeyAction() { //Ctrl+D - public void execute() { - if (commandLines.getCommandString().length() == 0) { //Quit on empty commandline, ignore otherwise - executeCommand(new InputCommand("quit")); - } - } - public CharSequence getHelp() { - return "Control-D:\tExit sqlshell"; - } - }); - - MAX_LINE_LENGTH = Toolkit.getScreenWidth()-(PROMPT.length()+2+1); // prompt + "> " - - output("Welcome to the SQLShell client."); - output("Type 'help' to get a list of available commands other then the default sql input."); + public static void main(String[] args) throws InterruptedException { + System.out.println("This class is no longer used. Please start nl.improved.sqlclient.jcurses.SQLShellWindow"); + Thread.sleep(2000); + SQLShellWindow.main(args); } - - - /** - * Returns the connection to the database - * @return the connection to the database - */ - public Connection getConnection() { - return DBConnector.getInstance().getConnection(); - } - /** - * Shows this window. - * Override to make sure paint content is called. - */ - @Override - public void show() { - super.show(); - paint(); - } - - /** - * Hides this window. - * Override to make sure the spool writer is closed when it was open - */ - @Override - public void hide() { - try { - if (spoolWriter != null) { - try { - spoolWriter.close(); - spoolWriter = null; - } catch(Exception e) {/*ignore*/} - } - } finally { - super.hide(); - } - } - - /** - * Returns a string representation of the current command. - * @return a string representation of the current command. - */ - private SQLCommand getCommand() { - return commandLines; - } - - /** - * Add a new line to the command lines buffer. - */ - private StringBuilder newLine() { - cursorPosition.x = 0; - StringBuilder newLine = new StringBuilder(); - getEditableCommand().getEditableLines().add(newLine); - cursorPosition.y = commandLines.getLines().size()-1; - return newLine; - } - - /** - * Handle key input. - * @param inp the character that is being pressed by the user. - */ - protected void handleInput(InputChar inp) { - //debug("Input: " + inp.getCode()); - try { - if (inp.getCode() != InputChar.KEY_PPAGE && inp.getCode() != InputChar.KEY_NPAGE) { - pageUpCount = 0; // some character entered, so reset pageup count - } - if (inp.isSpecialCode()) { - KeyAction ke = actionKeys.get(Integer.toString(inp.getCode()));// || inp.toString().equals("") || inp.toString().equals("")) { - if (ke != null) { - ke.execute(); - } else { - debug("Unknown character: "+ inp.getCode()); - } - } else { - KeyAction ke = actionKeys.get(inp.toString()); - if (ke != null) { - ke.execute(); - } else { - if (inp.getCharacter() == '\n') { // newline... see if the command can be executed - // execute the command - SQLCommand sqlCommand = getCommand(); - String command = sqlCommand.getCommandString(); - // search command... - if (command.length() > 0 && command.charAt(0) == '/') { // search in history - String matchPattern=".*"+command.substring(1,command.length())+".*"; - for (int cIndex = commandHistory.size()-1; cIndex >=0; cIndex--) { - if (cIndex == commandIndex) { - continue; // skip current command - } - SQLCommand newSqlCommand = commandHistory.get(cIndex); - String commandString = newSqlCommand.getCommandString(); - if (commandString.matches(matchPattern)) { - commandHistory.remove(commandIndex); - commandIndex = commandHistory.indexOf(newSqlCommand); - commandLines = newSqlCommand; - cursorPosition.y = 0; - cursorPosition.x = 0; - paint(); // force repaint - return; - } - } - Toolkit.beep(); // TODO clear search?? - return; - } else if (executeCommand(sqlCommand)) { - // clear command history - if (commandIndex != commandHistory.size()-1) { - SQLCommand tmpLines = commandLines; - commandLines = commandHistory.get(commandHistory.size()-1); - if (commandLines.getCommandString().equals("")) { - commandHistory.add(commandHistory.size()-1, tmpLines); - } else { - commandHistory.add(tmpLines); - commandLines = tmpLines; - } - } - if (!commandLines.getCommandString().equals("")) { - commandLines = new SQLCommand(); - commandHistory.add(commandLines); - newLine(); - } - commandIndex = commandHistory.size()-1; - cursorPosition.y = commandLines.getLines().size()-1; - cursorPosition.x = commandLines.getLines().get(cursorPosition.y).length(); - paint(); // force repaint - return; - } - } - CharSequence newText; - if (inp.getCharacter() == '\t') { - try { - newText = getTabCompletion(commandLines, cursorPosition); - } catch(IllegalStateException e) { - output(getCommand().getCommandString()); // add command as well... - error(e); - return; - } - } else { - newText = Character.toString(inp.getCharacter()); - } - if (newText.equals("\n")) { - newLine(); // TODO Fix return in middle of an other line - } else { - List<StringBuilder> editableLines = getEditableCommand().getEditableLines(); - StringBuilder currentLine = editableLines.get(cursorPosition.y); - currentLine.insert(cursorPosition.x, newText); - cursorPosition.x += newText.length(); - // check if the new line is becoming too long - if (currentLine.length() > MAX_LINE_LENGTH) { - // TODO search for lastspace that is not between '' ?? - int lastSpace = SQLUtil.getLastBreakIndex(currentLine.toString());//currentLine.lastIndexOf(" "); - if (lastSpace == -1) { - lastSpace = currentLine.length(); - } - // check if there are enough 'next' lines - // if not.. add one - if (editableLines.size()-1 == cursorPosition.y) { - StringBuilder newLine = new StringBuilder(); - editableLines.add(newLine); - } - // check if the nextline has enough room for the new word - // if not.. add a new line - if (editableLines.get(cursorPosition.y+1).length() - + (currentLine.length()-lastSpace+1) > MAX_LINE_LENGTH) { - StringBuilder newLine = new StringBuilder(); - editableLines.add(cursorPosition.y+1, newLine); - } - // fetch the next line - StringBuilder nextLine = editableLines.get(cursorPosition.y+1); - // if the nextline already has some text.. add a space in front of it - if (nextLine.length() > 0) { - nextLine.insert(0, ' '); - } - // insert the new text at the beginning - nextLine.insert(0, currentLine.subSequence(lastSpace+1, currentLine.length())); - currentLine.delete(lastSpace, currentLine.length()); - // check if the cursor postition > the new line length - // calculate new x and go to nextline - if (cursorPosition.x >= lastSpace) { - cursorPosition.x = cursorPosition.x - (lastSpace+1); - cursorPosition.y++; - } - } - } - } - } - } catch(Throwable t) { - error(t); - } - paint(); - } - - /** - * Return the editable version of the commandlines. - * If editing a previous command clone it and return the clone - * @return the editable version of the commandlines. - */ - protected SQLCommand getEditableCommand() { - if (commandHistory.indexOf(commandLines) != commandHistory.size()-1) { - List<? extends CharSequence> tmp = commandLines.getLines(); - if (commandHistory.get(commandHistory.size()-1).getLines().size() == 1 - && commandHistory.get(commandHistory.size()-1).getLines().get(0).length() == 0) { - commandLines = commandHistory.get(commandHistory.size()-1); - commandLines.getEditableLines().remove(0); - } else { - commandLines = new SQLCommand(); - commandHistory.add(commandLines); - } - for (int i = 0; i < tmp.size(); i++) { - commandLines.getEditableLines().add(new StringBuilder(tmp.get(i))); - } - commandIndex = commandHistory.size()-1; - } - return commandLines; - } - - /** - * Output data to the screen. - * @param data the data to print to the screen. - */ - protected synchronized void output(CharSequence data) { - screenBuffer.addAll(getLines(data)); - if (spoolWriter != null) { - try { - spoolWriter.write(data.toString()); - spoolWriter.write("\n"); - } catch(IOException e) { - screenBuffer.add("WARNING: Could not write to spool file"); - error(e); - } - } - } - - /** - * Output error exception to the screen. - * @param e the error to print to the screen - */ - protected synchronized void error(Throwable e) { - output(e.getMessage() == null ? e.toString() : e.getMessage()); - StringWriter sw = new StringWriter(); - e.printStackTrace(new PrintWriter(sw)); - sw.flush(); - lastExceptionDetails = sw.toString(); - //output(sw.toString()); - } - - /** - * Return a list of table names available for the current connection. - * @return a list of table names available for the current connection. - */ - protected List<String> getTableNames() { - List<String> returnValue = new ArrayList<String>(); - try { - ResultSet rs = getConnection().getMetaData().getTables(getConnection().getCatalog(), DBConnector.getInstance().getSchema(), null, new String[]{"TABLE"}); - while (rs.next()) { - if (!returnValue.contains(rs.getString("TABLE_NAME"))) { - returnValue.add(rs.getString("TABLE_NAME")); - } - } - return returnValue; - } catch (SQLException ex) { - ex.printStackTrace(); - Logger.getLogger(SQLShell.class.getName()).log(Level.SEVERE, null, ex); - return null; - } - } - - /** - * Return a list of column names for the specified list of table names. - * @param tableNames a list of tableNames - * @return a list of column names for the specified list of table names. - */ - protected List<String> getColumnNames(List<String> tableNames) { - List<String> returnValues = new ArrayList<String>(); - Iterator<String> iTableNames = tableNames.iterator(); - while (iTableNames.hasNext()) { - String tableName = DBConnector.getInstance().translateDbVar(iTableNames.next().trim()); - try { - ResultSet rs = getConnection().getMetaData().getColumns(getConnection().getCatalog(), DBConnector.getInstance().getSchema(), tableName, "%"); - while (rs.next()) { - if (!returnValues.contains(rs.getString("COLUMN_NAME"))) { - returnValues.add(rs.getString("COLUMN_NAME")); - } - } - } catch (SQLException ex) { - throw new IllegalStateException("Failed to find columnnames for table: "+ tableName, ex); - } - } - return returnValues; - } - - /** - * Try to find a match in the provided list starging with sub. - * If more matches apply show the user a dialog to choose a match or simply display all matches in the window - * @param values all possible values to choose from (not limited with the sub parameter) - * @param sub the start of the match - * @return the match starting with sub minus the sub itself in the correct casing - */ - protected CharSequence findMatch(List<String> values, String sub) { - List<String> matches = new ArrayList<String>(); - Iterator<String> iValues = values.iterator(); - while (iValues.hasNext()) { - String value = iValues.next(); - if (value.toUpperCase().startsWith(sub.toUpperCase())) { - matches.add(value); - } - } - //debug("Matches found: "+ matches.size() +" --> "+ sub +" / "+ values); - String match = null; - if (matches.size() == 1) { - match = matches.get(0); - } else if (matches.size() > 1 && matches.size() < MAX_MATCH_SIZE) { - int y; - if (screenBuffer.size() + cursorPosition.y > Toolkit.getScreenHeight()-3) { - y = Toolkit.getScreenHeight()-4; - } else { - y = screenBuffer.size() + cursorPosition.y; - } - PopUpMenu menu = new PopUpMenu(cursorPosition.x,Math.max(2, y-matches.size()), "Find match"); - Iterator<String> iMatches = matches.iterator(); - while (iMatches.hasNext()) { - menu.add(iMatches.next()); - } - menu.show(); - match = menu.getSelectedItem(); - } else if (matches.size() > 1) { - output("\n"+toColumns(matches)); - } - if (match != null) { - if (sub.length() > 0) { - /*if (Character.isUpperCase(sub.charAt(0))) { - match = match.toUpperCase(); - } else { - match = match.toLowerCase(); - }*/ - match = DBConnector.getInstance().translateDbVar(match); - } - return match.substring(sub.length()); - } - return null; - } - - /** - * Simple method to change a null value to an empty charsequence. - * @param... [truncated message content] |
|
From: SVN by r. <sv...@ca...> - 2008-08-19 08:01:46
|
Author: roy
Date: 2008-08-19 10:01:34 +0200 (Tue, 19 Aug 2008)
New Revision: 285
Modified:
src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java
src/main/java/nl/improved/sqlclient/SQLCommand.java
Log:
use stringbuffer instead of stringbuilder since commands are used in a multithreaded environment
Modified: src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java
===================================================================
--- src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java 2008-08-06 20:32:52 UTC (rev 284)
+++ src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java 2008-08-19 08:01:34 UTC (rev 285)
@@ -55,6 +55,9 @@
import javax.xml.transform.stream.StreamResult;
import nl.improved.sqlclient.DBConnector.ConnectionSettings;
import nl.improved.sqlclient.commands.*;
+import nl.improved.sqlclient.history.HistoryPersister;
+import nl.improved.sqlclient.history.exception.CouldNotLoadHistoryException;
+import nl.improved.sqlclient.history.exception.CouldNotSaveHistoryException;
import nl.improved.sqlclient.util.LimitedArrayList;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
@@ -70,6 +73,7 @@
*/
public abstract class AbstractSQLShellWindow {
+ private String ident;
/**
* The current command thread executing a SQLShell command.
*/
@@ -262,7 +266,7 @@
joinLine();
}
} else {
- StringBuilder tmp = getEditableCommand().getEditableLines().get(cursorPosition.y);
+ StringBuffer tmp = getEditableCommand().getEditableLines().get(cursorPosition.y);
if (cursorPosition.x > 0) {
tmp.deleteCharAt(cursorPosition.x-1);
cursorPosition.x--;
@@ -278,9 +282,9 @@
@Override
public void execute() {
Point cursorPosition = screen.getCursorPosition();
- StringBuilder lineBuffer = commandLines.getEditableLines().get(cursorPosition.y);
+ StringBuffer lineBuffer = commandLines.getEditableLines().get(cursorPosition.y);
if (cursorPosition.x < lineBuffer.length()) {
- StringBuilder tmp = getEditableCommand().getEditableLines().get(cursorPosition.y);
+ StringBuffer tmp = getEditableCommand().getEditableLines().get(cursorPosition.y);
tmp.deleteCharAt(cursorPosition.x);
}
}
@@ -326,7 +330,7 @@
}
return;
}
- StringBuilder lineBuffer = commandLines.getEditableLines().get(cursorPosition.y);
+ StringBuffer lineBuffer = commandLines.getEditableLines().get(cursorPosition.y);
int previousBreak = SQLUtil.getLastBreakIndex(lineBuffer.substring(0, cursorPosition.x-1));
if (lineBuffer.charAt(previousBreak) == ' ' || lineBuffer.charAt(previousBreak) == '\t') {
previousBreak++;
@@ -344,11 +348,11 @@
public void execute() {
Point cursorPosition = screen.getCursorPosition();
if (cursorPosition.x > 0) {
- StringBuilder lineBuffer = commandLines.getEditableLines().get(cursorPosition.y);
+ StringBuffer lineBuffer = commandLines.getEditableLines().get(cursorPosition.y);
lineBuffer.delete(0, cursorPosition.x);
cursorPosition.x = 0;
} else if (cursorPosition.y > 0) {
- StringBuilder lineBuffer = commandLines.getEditableLines().get(cursorPosition.y);
+ StringBuffer lineBuffer = commandLines.getEditableLines().get(cursorPosition.y);
if (lineBuffer.length() == 0) {
commandLines.getEditableLines().remove(cursorPosition.y);
}
@@ -446,8 +450,28 @@
t.start();
}
+ /**
+ * Returns the current command history.
+ * @return
+ */
+ public List<SQLCommand> getCommandHistory() {
+ return commandHistory;
+ }
+ public int getCommandIndex() {
+ return commandIndex;
+ }
+
/**
+ * Change the current command index.
+ * @param i
+ */
+ public void setCommandIndex(int i) {
+ this.commandIndex = i;
+ }
+
+
+ /**
* Return the visible screen width.
* @return the visible screen width.
*/
@@ -458,6 +482,7 @@
*/
public abstract int getScreenHeight();
+
/**
* Repaint the screen.
*/
@@ -530,10 +555,10 @@
/**
* Add a new line to the command lines buffer.
*/
- private StringBuilder newLine() {
+ private StringBuffer newLine() {
Point cursorPosition = screen.getCursorPosition();
cursorPosition.x = 0;
- StringBuilder newLine = new StringBuilder();
+ StringBuffer newLine = new StringBuffer();
getEditableCommand().getEditableLines().add(newLine);
cursorPosition.y = commandLines.getLines().size()-1;
return newLine;
@@ -597,6 +622,7 @@
commandHistory.add(tmpLines);
commandLines = tmpLines;
}
+ commandHistory.remove(commandIndex);
}
if (!commandLines.getCommandString().equals("")) {
commandLines = new SQLCommand();
@@ -628,8 +654,8 @@
newLine(); // TODO Fix return in middle of an other line
} else {
Point cursorPosition = screen.getCursorPosition();
- List<StringBuilder> editableLines = getEditableCommand().getEditableLines();
- StringBuilder currentLine = editableLines.get(cursorPosition.y);
+ List<StringBuffer> editableLines = getEditableCommand().getEditableLines();
+ StringBuffer currentLine = editableLines.get(cursorPosition.y);
if (cursorPosition.x > currentLine.length()) {
for (int i = currentLine.length(); i < cursorPosition.x; i++) {
currentLine.append(' ');
@@ -649,18 +675,18 @@
// check if there are enough 'next' lines
// if not.. add one
if (editableLines.size()-1 == cursorPosition.y) {
- StringBuilder newLine = new StringBuilder();
+ StringBuffer newLine = new StringBuffer();
editableLines.add(newLine);
}
// check if the nextline has enough room for the new word
// if not.. add a new line
if (editableLines.get(cursorPosition.y+1).length()
+ (currentLine.length()-lastSpace+1) > screen.MAX_LINE_LENGTH) {
- StringBuilder newLine = new StringBuilder();
+ StringBuffer newLine = new StringBuffer();
editableLines.add(cursorPosition.y+1, newLine);
}
// fetch the next line
- StringBuilder nextLine = editableLines.get(cursorPosition.y+1);
+ StringBuffer nextLine = editableLines.get(cursorPosition.y+1);
// if the nextline already has some text.. add a space in front of it
// if there is not already a 'breaking character' there
if (nextLine.length() > 0 && ! SQLUtil.isBreakCharacter(nextLine.charAt(0))) {
@@ -706,7 +732,7 @@
commandHistory.add(commandLines);
}
for (int i = 0; i < tmp.size(); i++) {
- commandLines.getEditableLines().add(new StringBuilder(tmp.get(i)));
+ commandLines.getEditableLines().add(new StringBuffer(tmp.get(i)));
}
commandIndex = commandHistory.size()-1;
}
@@ -754,7 +780,8 @@
e.printStackTrace(new PrintWriter(sw));
sw.flush();
lastExceptionDetails = sw.toString();
- //output(sw.toString());
+ //output(lastExceptionDetails);
+ //repaint();
}
/**
@@ -838,7 +865,7 @@
match = DBConnector.getInstance().translateDbVar(match);
if (sub.length() > 0 && !match.startsWith(sub)) { // case insensitive change
Point cursorPosition = screen.getCursorPosition();
- List<StringBuilder> lines = getEditableCommand().getEditableLines();
+ List<StringBuffer> lines = getEditableCommand().getEditableLines();
if (lines.get(cursorPosition.y).length() >=sub.length()) {
cursorPosition.x-=sub.length();
lines.get(cursorPosition.y).delete(cursorPosition.x, cursorPosition.x + sub.length());
@@ -956,13 +983,13 @@
private List<CharSequence> getLines(CharSequence text) {
int maxWidth = getScreenWidth();
List<CharSequence> list = new ArrayList<CharSequence>();
- StringBuilder buffer = new StringBuilder();
+ StringBuffer buffer = new StringBuffer();
for (int i=0; i<text.length(); i++) {
char c = text.charAt(i);
if (c=='\n' || buffer.length() == maxWidth) {
String line = buffer.toString();
list.add(line);
- buffer = new StringBuilder();
+ buffer = new StringBuffer();
if (c != '\n') {
buffer.append(c);
}
@@ -981,7 +1008,7 @@
/**
* Convert a list to a presentable text devided into multiple columns.
*/
- private StringBuilder toColumns(List<? extends CharSequence> values) {
+ private StringBuffer toColumns(List<? extends CharSequence> values) {
int maxWidth = 0;
Iterator<? extends CharSequence> iValues = values.iterator();
while (iValues.hasNext()) {
@@ -989,7 +1016,7 @@
}
maxWidth+=2;// add extra space
int nrOfColumns = (getScreenWidth()) / maxWidth;
- StringBuilder returnValue = new StringBuilder();
+ StringBuffer returnValue = new StringBuffer();
for (int row = 0; row < values.size(); row+=nrOfColumns) {
for (int col = 0; col < nrOfColumns && row + col < values.size(); col++) {
returnValue.append(values.get(row+col) + screen.getEmptyLine().substring(0, maxWidth - values.get(row+col).length()));
@@ -1016,14 +1043,21 @@
if (cmdString.length() > 0 && cmdString.charAt(cmdString.length()-1) == ';') {
cmdString = cmdString.substring(0, cmdString.length()-1);
}
- if (connect(cmdString) != null) {
- return "Connected.\n\n";
- } else {
+ if (connect(cmdString) == null) {
return "Connect failed. Unknown reason\n\n";
}
} catch(SQLException e) {
throw new IllegalStateException("Failed to connect: " + e.getMessage(), e);
}
+ try {
+ int tot = HistoryPersister.loadHistory(AbstractSQLShellWindow.this, ident,
+ getScreen().MAX_LINE_LENGTH, getScreen().MAX_LINE_LENGTH);
+ return "Connected and history loaded (" + tot + " command(s)).\n\n";
+ } catch (CouldNotLoadHistoryException e) {
+ // this.shell.setCommandIndex(0);
+ return "Connected (no history loaded).\n\n";
+ }
+
}
@Override
public CharSequence getCommandString() {
@@ -1056,11 +1090,14 @@
Iterator<String> idents = DBConnector.getInstance().getPredefinedConnectionIdentifiers().iterator();
while (idents.hasNext()) {
buf.append(' ');
- String ident = idents.next();
- buf.append(ident);
- if (ident.equals(DBConnector.getInstance().getDefaultIdentifier())) {
+ String availableIdent = idents.next();
+ buf.append(availableIdent);
+ if (availableIdent.equals(DBConnector.getInstance().getDefaultIdentifier())) {
buf.append(" *");
}
+ if (availableIdent.equals(ident)) {
+ buf.append(" (connected)");
+ }
if (idents.hasNext()) {
buf.append('\n');
}
@@ -1131,7 +1168,7 @@
public Connection connect(String connectString) throws SQLException {
//Shortcut - no need to try and parse everything if we already know we're empty
DBConnector dbConnector = DBConnector.getInstance();
- String ident = dbConnector.getDefaultIdentifier();
+ ident = dbConnector.getDefaultIdentifier();
String username = null;
String password = null;
if (connectString != null && connectString.trim().length() > 0) {
@@ -1170,12 +1207,23 @@
/**
* Command that enables the user to close a connection.
*/
- private static class DisConnectCommand implements Command {
+ private class DisConnectCommand implements Command {
+
@Override
public CharSequence execute(SQLCommand cmd) {
try {
DBConnector.getInstance().disconnect();
- return "Disconnected.\n\n";
+ if (ident != null) {
+ try {
+ HistoryPersister.saveHistory(AbstractSQLShellWindow.this, ident, true);
+ ident = null;
+ return "Disconnected (history saved).\n\n";
+ } catch (CouldNotSaveHistoryException e) {
+ return "Disconnected, could not save history: " + e.getMessage()
+ + "\n\n";
+ }
+ }
+ return "Disconnected";
} catch(SQLException e) {
throw new IllegalStateException("Failed to disconnect: " + e.getMessage(), e);
}
@@ -1215,11 +1263,19 @@
private class HistoryCommand implements Command {
@Override
public CharSequence execute(SQLCommand command) {
- StringBuilder returnValue = new StringBuilder();
+ StringBuffer returnValue = new StringBuffer();
Iterator<SQLCommand> iCommands = commandHistory.iterator();
+ returnValue.append("\n**** History Overview ****\n");
+ int index = 0;
while (iCommands.hasNext()) {
SQLCommand cmd = iCommands.next();
- returnValue.append(cmd.getCommandString());
+ String cmdString = cmd.getCommandString();
+ if (cmdString.trim().length() == 0) {
+ continue;
+ }
+ returnValue.append(++index);
+ returnValue.append("> ");
+ returnValue.append(cmdString);
returnValue.append('\n');
}
return returnValue;
@@ -1266,6 +1322,7 @@
@Override
public CharSequence execute(SQLCommand command) {
run = false;
+ new DisConnectCommand().execute(null);
close();
return "Application terminated.";
}
@@ -1315,7 +1372,7 @@
if (cmdString.length() > 0) {
if (cmdString.startsWith("-k")) {
String keyword = cmdString.subSequence(cmdString.indexOf(" "), cmdString.length()).toString().trim();
- StringBuilder returnValue = new StringBuilder();
+ StringBuffer returnValue = new StringBuffer();
Iterator<Command> iCommands = commands.getCommands().iterator();
while (iCommands.hasNext()) {
Command cmd= iCommands.next();
@@ -1348,7 +1405,7 @@
}
// default print all commands
// TODO iterate
- StringBuilder returnValue = new StringBuilder();
+ StringBuffer returnValue = new StringBuffer();
returnValue.append("Available key mappings:\n");
int max = 0;
List<KeyAction> keys = new ArrayList<KeyAction>(actionKeys.values());
@@ -1768,7 +1825,7 @@
fin = new FileInputStream(toFileName(command.substring(1)));
output("Reading file: "+ toFileName(command.substring(1)));
BufferedReader reader = new BufferedReader(new InputStreamReader(fin));
- StringBuilder cmd = new StringBuilder();
+ StringBuffer cmd = new StringBuffer();
String line;
while ( ((line = reader.readLine()) != null)) {
if (cancelled) {
@@ -1784,7 +1841,7 @@
currentCommand = createCommand(commandString);
output(commandString);
output(currentCommand.execute(new InputCommand(commandString)));
- cmd=new StringBuilder();
+ cmd=new StringBuffer();
new Thread() {
@Override
public void run() {
@@ -1869,13 +1926,13 @@
* will eventually execute the Connect command.
*/
private static class InputCommand extends SQLCommand {
- private StringBuilder command;
+ private StringBuffer command;
public InputCommand(String command) {
- this.command = new StringBuilder(command);
+ this.command = new StringBuffer(command);
}
- public InputCommand(StringBuilder command) {
+ public InputCommand(StringBuffer command) {
this.command = command;
}
@@ -1884,12 +1941,12 @@
return command.toString();
}
@Override
- public List<StringBuilder> getEditableLines() {
- return Arrays.asList(new StringBuilder[]{command});
+ public List<StringBuffer> getEditableLines() {
+ return Arrays.asList(new StringBuffer[]{command});
}
@Override
public List<? extends CharSequence> getLines() {
- return Arrays.asList(new StringBuilder[]{command});
+ return Arrays.asList(new StringBuffer[]{command});
}
}
@@ -1976,9 +2033,9 @@
private void joinLine() {
Point cursorPosition = screen.getCursorPosition();
- StringBuilder line = getEditableCommand().getEditableLines().remove(cursorPosition.y);
+ StringBuffer line = getEditableCommand().getEditableLines().remove(cursorPosition.y);
cursorPosition.y--;
- StringBuilder lineBuffer = commandLines.getEditableLines().get(cursorPosition.y);
+ StringBuffer lineBuffer = commandLines.getEditableLines().get(cursorPosition.y);
cursorPosition.x = lineBuffer.length();
lineBuffer.append(line);
}
Modified: src/main/java/nl/improved/sqlclient/SQLCommand.java
===================================================================
--- src/main/java/nl/improved/sqlclient/SQLCommand.java 2008-08-06 20:32:52 UTC (rev 284)
+++ src/main/java/nl/improved/sqlclient/SQLCommand.java 2008-08-19 08:01:34 UTC (rev 285)
@@ -6,16 +6,16 @@
public class SQLCommand {
- private List<StringBuilder> commandLines;
+ private List<StringBuffer> commandLines;
/**
* Constructor.
*/
public SQLCommand() {
- commandLines = new ArrayList<StringBuilder>();
+ commandLines = new ArrayList<StringBuffer>();
}
- public List<StringBuilder> getEditableLines() {
+ public List<StringBuffer> getEditableLines() {
return commandLines;
}
public List<? extends CharSequence> getLines() {
@@ -28,7 +28,7 @@
* @return the part of the command that is before the cursor position.
*/
public CharSequence getSubCommand(Point cursorPosition) {
- StringBuilder commandBuffer = new StringBuilder();
+ StringBuffer commandBuffer = new StringBuffer();
for (int i = 0; i <= cursorPosition.y; i++) {
if (i == cursorPosition.y) {
commandBuffer.append(commandLines.get(i).substring(0, cursorPosition.x));
@@ -47,7 +47,7 @@
}
public String getUntrimmedCommandString() {
- StringBuilder returnValue = new StringBuilder();
+ StringBuffer returnValue = new StringBuffer();
Iterator<? extends CharSequence> parts = getLines().iterator();
while (parts.hasNext()) {
if (returnValue.length() > 0 && returnValue.charAt(returnValue.length()-1) != '\n') {
|
|
From: SVN by r. <sv...@ca...> - 2008-08-19 11:00:19
|
Author: roy
Date: 2008-08-19 13:00:11 +0200 (Tue, 19 Aug 2008)
New Revision: 287
Modified:
src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java
Log:
add more comments
add tabcompletion to spool command
some code cleanups
Modified: src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java
===================================================================
--- src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java 2008-08-19 10:59:06 UTC (rev 286)
+++ src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java 2008-08-19 11:00:11 UTC (rev 287)
@@ -1486,6 +1486,68 @@
}
/**
+ * Returns tabcompletion information based on a filename prefix input string.
+ * @param fileNamePrefix the filename prefix to search for matches
+ * @param otherMatches an optional list of other matches that are not filenames
+ * @return the tabcompletion information found based on the filename prefix and other matches (optional)
+ */
+ private static TabCompletionInfo getFileNameTabCompletionInfo(String fileNamePrefix, String... otherMatches) {
+ String dirName;
+ if (fileNamePrefix.equals("")) {
+ fileNamePrefix = ".";
+ dirName = ".";
+ } else {
+ fileNamePrefix = toFileName(fileNamePrefix);
+ if (fileNamePrefix.indexOf('/') >= 0) {
+ File file = new File(fileNamePrefix);
+ if (file.isDirectory()) {
+ fileNamePrefix = "";
+ dirName = file.getAbsolutePath()+"/";
+ } else {
+ fileNamePrefix = file.getName();
+ dirName = file.getParent();
+ }
+ } else {
+ dirName = ".";
+ }
+ }
+ List<String> matches = new ArrayList<String>(10);
+ for (String otherMatch : otherMatches) {
+ matches.add(otherMatch);
+ }
+ matches.addAll(Arrays.asList(new File(dirName).list()));
+ return new TabCompletionInfo(TabCompletionInfo.MatchType.OTHER, matches, fileNamePrefix);
+ }
+
+ /**
+ * Join two lines.
+ */
+ private void joinLine() {
+ Point cursorPosition = screen.getCursorPosition();
+ StringBuffer line = getEditableCommand().getEditableLines().remove(cursorPosition.y);
+ cursorPosition.y--;
+ StringBuffer lineBuffer = commandLines.getEditableLines().get(cursorPosition.y);
+ cursorPosition.x = lineBuffer.length();
+ lineBuffer.append(line);
+ }
+
+ /**
+ * Return true if the programm is still running.
+ * @return true if the program is still running
+ */
+ protected boolean isRunning() {
+ return run;
+ }
+
+ /**
+ * Returns the screen implementation.
+ * @return the screen.
+ */
+ protected Screen getScreen() {
+ return screen;
+ }
+
+ /**
* Writes in/output to a file.
*/
private class SpoolCommand implements Command {
@@ -1506,6 +1568,17 @@
return "No spool to close.";
}
} else {
+ StringBuffer returnValue = new StringBuffer(100);
+ if (spoolWriter != null) {
+ returnValue.append("Closing previous spool to : ");
+ returnValue.append(fileName);
+ returnValue.append('\n');
+ try {
+ spoolWriter.close();
+ } catch (IOException ex) {
+ /* ignore */
+ }
+ }
try {
File f = new File(toFileName(nextPart.trim()));
fileName = f.getAbsolutePath();
@@ -1516,7 +1589,8 @@
} catch (IOException e) {
throw new IllegalStateException("Failed to create spool ("+fileName+"): " + e.toString(), e);
}
- return "Spool to "+fileName+" created.";
+ returnValue.append("Spool to "+fileName+" created.");
+ return returnValue.toString();
}
}
@@ -1533,6 +1607,11 @@
*/
@Override
public TabCompletionInfo getTabCompletionInfo(SQLCommand command, Point commandPoint) {
+ String cmd = command.getCommandString();
+ if (cmd.startsWith("spool")) {
+ String fn = command.getCommandString().substring("spool".length()).trim(); // cutoff 'spool'
+ return getFileNameTabCompletionInfo(fn, "off");
+ }
return null;
}
@Override
@@ -1875,26 +1954,7 @@
@Override
public TabCompletionInfo getTabCompletionInfo(SQLCommand command, Point commandPoint) {
String fileName = command.getCommandString().substring(1).trim(); // cutoff '@'
- String dirName;
- if (fileName.equals("")) {
- fileName = ".";
- dirName = ".";
- } else {
- fileName = toFileName(fileName);
- if (fileName.indexOf('/') >= 0) {
- File file = new File(fileName);
- if (file.isDirectory()) {
- fileName = "";
- dirName = file.getAbsolutePath()+"/";
- } else {
- fileName = file.getName();
- dirName = file.getParent();
- }
- } else {
- dirName = ".";
- }
- }
- return new TabCompletionInfo(TabCompletionInfo.MatchType.OTHER,Arrays.asList(new File(dirName).list()) , fileName);
+ return getFileNameTabCompletionInfo(fileName);
}
@Override
@@ -1950,12 +2010,23 @@
}
}
+ /**
+ * Command thread responsible for executing commands in the background.
+ * It holds a reference to the current command that is being executed.
+ */
private abstract class CommandThread extends Thread {
private Command cmd;
+ /**
+ * Constructor.
+ * @param cmd the command to be executed in the background
+ */
public CommandThread(Command cmd) {
this.cmd = cmd;
}
+ /**
+ * Execute the command and disable prompt.
+ */
@Override
public final void run() {
screen.setShowPrompt(false);
@@ -1968,20 +2039,35 @@
}
}
+ /**
+ * Override to implement the execution of the command.
+ */
abstract void execute();
+ /**
+ * Returns the command that is being executed by this thread.
+ * @return the command that is being executed by this thread.
+ */
Command getCommand() {
return cmd;
}
}
+ /**
+ * Query command responsible for executing a sql query.
+ */
private class QueryCommand implements Command {
/**
- * Executor for SQL Statements
+ * Executor for SQL Statements.
*/
private StatementExecutor statementExecutor;
+ /**
+ * Execute the sql query.
+ * @param cmd the sqlcommand containing the sql query
+ * @return the result of the sql query.
+ */
@Override
public CharSequence execute(SQLCommand cmd) {
try {
@@ -2010,6 +2096,7 @@
@Override
public TabCompletionInfo getTabCompletionInfo(SQLCommand commandInfo, Point commandPoint) {
// TODO call SQLUTil..
+ debug("GET TAB COMPLETION OF QUERY COMMAND");
return null;
}
@@ -2031,23 +2118,7 @@
}
- private void joinLine() {
- Point cursorPosition = screen.getCursorPosition();
- StringBuffer line = getEditableCommand().getEditableLines().remove(cursorPosition.y);
- cursorPosition.y--;
- StringBuffer lineBuffer = commandLines.getEditableLines().get(cursorPosition.y);
- cursorPosition.x = lineBuffer.length();
- lineBuffer.append(line);
- }
- protected boolean isRunning() {
- return run;
- }
-
- protected Screen getScreen() {
- return screen;
- }
-
private interface KeyAction {
void execute();
CharSequence getHelp();
|
|
From: SVN by r. <sv...@ca...> - 2008-08-19 11:10:10
|
Author: roy
Date: 2008-08-19 13:10:00 +0200 (Tue, 19 Aug 2008)
New Revision: 289
Modified:
src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java
Log:
add tab completion to read command
Modified: src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java
===================================================================
--- src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java 2008-08-19 11:05:39 UTC (rev 288)
+++ src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java 2008-08-19 11:10:00 UTC (rev 289)
@@ -1873,8 +1873,10 @@
*/
@Override
public TabCompletionInfo getTabCompletionInfo(SQLCommand command, Point commandPoint) {
- return null; // TODO
+ String fn = command.getCommandString().substring("read".length()).trim();
+ return getFileNameTabCompletionInfo(fn);
}
+
@Override
public CharSequence getHelp() {
return "filename: read dump file from filename\n"+
@@ -2119,11 +2121,18 @@
}
+ /**
+ * The key action interface.
+ * Implement this interface for handling key actions.
+ */
private interface KeyAction {
void execute();
CharSequence getHelp();
}
+ /**
+ * Simple class that holds the SQLCommand and it's matching Command information.
+ */
private class CommandInfo {
private SQLCommand sql;
private Command cmd;
|
|
From: SVN by r. <sv...@ca...> - 2008-08-19 11:23:35
|
Author: roy
Date: 2008-08-19 13:23:25 +0200 (Tue, 19 Aug 2008)
New Revision: 290
Modified:
src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java
Log:
some initial tab completion for dump
Modified: src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java
===================================================================
--- src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java 2008-08-19 11:10:00 UTC (rev 289)
+++ src/main/java/nl/improved/sqlclient/AbstractSQLShellWindow.java 2008-08-19 11:23:25 UTC (rev 290)
@@ -1760,8 +1760,14 @@
*/
@Override
public TabCompletionInfo getTabCompletionInfo(SQLCommand command, Point commandPoint) {
- return null;
+ List<String> commandInfo = new ArrayList<String>(2);
+ commandInfo.add("SELECT * FROM");
+ commandInfo.add(command.getCommandString().substring("dump ".length()));
+ debug(commandInfo.toString());
+ Point point = new Point(commandPoint.x - "dump ".length(), commandPoint.y+1);
+ return SQLUtil.getTabCompletionInfo(commandInfo, point);
}
+
@Override
public CharSequence getHelp() {
return "tablename [where clause]\n" +
|