|
From: SVN by r. <sv...@ca...> - 2009-09-19 12:55:30
|
Author: roy
Date: 2009-09-19 14:55:14 +0200 (Sat, 19 Sep 2009)
New Revision: 418
Added:
src/test/java/nl/improved/sqlclient/SQLCommandTest.java
Modified:
ChangeLog
src/main/java/nl/improved/sqlclient/SQLCommand.java
src/main/java/nl/improved/sqlclient/commands/SettingsCommand.java
Log:
added initial support for variables
see 'help set' for more information
Modified: ChangeLog
===================================================================
--- ChangeLog 2009-09-18 11:55:18 UTC (rev 417)
+++ ChangeLog 2009-09-19 12:55:14 UTC (rev 418)
@@ -3,6 +3,7 @@
- improved group by and order by
- added support for aliases in table names
* Added initial settings command (to change for the current login session) the horizontal or vertical separator character
+ * Added initial support for variables (in settings command.. see 'help set' for more information)
0.6.2 (2009-02-20)
* Commandline input support
Modified: src/main/java/nl/improved/sqlclient/SQLCommand.java
===================================================================
--- src/main/java/nl/improved/sqlclient/SQLCommand.java 2009-09-18 11:55:18 UTC (rev 417)
+++ src/main/java/nl/improved/sqlclient/SQLCommand.java 2009-09-19 12:55:14 UTC (rev 418)
@@ -2,12 +2,16 @@
import java.util.List;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.Iterator;
+import java.util.Map;
public class SQLCommand {
private List<StringBuffer> commandLines;
+ private static Map<String, String> variables = new HashMap<String, String>();
+
/**
* Constructor.
*/
@@ -23,6 +27,24 @@
commandLines.add(new StringBuffer(cmd));
}
+ /**
+ * Register variables.
+ * @param var the variable name
+ * @param value the variable value
+ * @return the previous value, if any
+ */
+ public static String registerVariable(String var, String value) {
+ return variables.put(var, value);
+ }
+ /**
+ * Unregister variables.
+ * @param var the variable name
+ * @return the value, if any
+ */
+ public static String unregisterVariable(String var) {
+ return variables.remove(var);
+ }
+
public List<StringBuffer> getEditableLines() {
return commandLines;
}
@@ -65,11 +87,52 @@
}
return returnValue.toString();
}
+
+ /**
+ * Returns the command string with variables replaced.
+ * @return
+ */
public String getCommandString() {
String returnString = getUntrimmedCommandString();
if (returnString.endsWith(";")) {
returnString = returnString.substring(0, returnString.length()-1).trim();
}
- return returnString;
+ return replaceVariables(returnString);
}
+
+ private String replaceVariables(String returnString) {
+ StringBuffer returnValue = new StringBuffer();
+ int lastIndex = 0;
+ int previous = 0;
+ while ( (lastIndex = returnString.indexOf('@', lastIndex)) > 0) {
+ returnValue.append(returnString.substring(previous, lastIndex));
+ if (getQuoteCount(returnValue) %2 == 1) {
+ previous = lastIndex;
+ continue;
+ }
+ int end = returnString.indexOf(' ', lastIndex);
+ if (end < 0) {
+ end = returnString.indexOf(';', lastIndex);
+ if (end < 0) {
+ end = returnString.length();
+ }
+ }
+ String varName = returnString.substring(lastIndex+1, end);
+ returnValue.append(variables.get(varName));
+ previous = end;
+ lastIndex = end;
+ }
+ returnValue.append(returnString.substring(previous));
+ return returnValue.toString();
+ }
+
+ static int getQuoteCount(StringBuffer returnValue) {
+ int amount = 0;
+ int lastIndex = 0;
+ while ( (lastIndex = returnValue.indexOf("\'", lastIndex) ) > 0) {
+ amount++;
+ lastIndex++;
+ }
+ return amount;
+ }
}
Modified: src/main/java/nl/improved/sqlclient/commands/SettingsCommand.java
===================================================================
--- src/main/java/nl/improved/sqlclient/commands/SettingsCommand.java 2009-09-18 11:55:18 UTC (rev 417)
+++ src/main/java/nl/improved/sqlclient/commands/SettingsCommand.java 2009-09-19 12:55:14 UTC (rev 418)
@@ -21,18 +21,27 @@
public CommandResult execute(SQLCommand cmd) {
String cmdString = cmd.getUntrimmedCommandString().substring("set ".length()).trim();
- if (cmdString.indexOf(' ') < 0) {
- return new SimpleCommandResult(false, "Please provide an argument");
- }
- String setter = cmdString.substring(0, cmdString.indexOf(' '));
+ String setter = cmdString.substring(0, cmdString.indexOf('='));
if (setter.equals("hSeparatorChar")) {
- ResultBuilder.setHorizontalSeparator(cmdString.charAt(cmdString.indexOf(' ')+1));
+ ResultBuilder.setHorizontalSeparator(cmdString.charAt(cmdString.indexOf('=')+1));
return new SimpleCommandResult(true, "Horizontal separator updated to '"+ResultBuilder.getHorizontalSeparator()+"'.");
}
if (setter.equals("vSeparatorChar")) {
- ResultBuilder.setVerticalSeparator(cmdString.charAt(cmdString.indexOf(' ')+1));
+ ResultBuilder.setVerticalSeparator(cmdString.charAt(cmdString.indexOf('=')+1));
return new SimpleCommandResult(true, "Vertical separator updated to '"+ResultBuilder.getVerticalSeparator()+"'.");
}
+ if (setter.startsWith("@")) { // variable
+ // see
+ // http://www.science.uva.nl/ict/ossdocs/mysql/manual_Reference.html
+ if (!cmdString.contains("=")) {
+ return new SimpleCommandResult(false, "Setter of variable '"+ setter+"' requires an assignment..");
+ }
+ String varName = cmdString.substring(1, cmdString.indexOf('=')).trim();
+ String varValue = cmdString.substring(cmdString.indexOf('=')+1).trim();
+ SQLCommand.registerVariable(varName, varValue);
+ return new SimpleCommandResult(true, "Registred variable '"+varName+"' to value '"+varValue+"'");
+
+ }
return new SimpleCommandResult(false, "Please provide a valid argument");
}
@@ -49,7 +58,8 @@
return "Change settings of sqlshell properties" +
"Settings are:\n"+
"hSeparatorChar\n"+
- "vSeparatorChar";
+ "vSeparatorChar\n" +
+ "@variable=value";
}
public boolean abort() {
Added: src/test/java/nl/improved/sqlclient/SQLCommandTest.java
===================================================================
--- src/test/java/nl/improved/sqlclient/SQLCommandTest.java 2009-09-18 11:55:18 UTC (rev 417)
+++ src/test/java/nl/improved/sqlclient/SQLCommandTest.java 2009-09-19 12:55:14 UTC (rev 418)
@@ -0,0 +1,66 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package nl.improved.sqlclient;
+
+import java.util.List;
+import junit.framework.TestCase;
+
+/**
+ *
+ * @author roy
+ */
+public class SQLCommandTest extends TestCase {
+
+ public SQLCommandTest(String testName) {
+ super(testName);
+ }
+
+ /**
+ * Test of registerVariable method, of class SQLCommand.
+ */
+ public void testRegisterVariable() {
+ String var = "test";
+ String value = "value";
+ String expResult = null;
+ String result = SQLCommand.registerVariable(var, value);
+ assertEquals(expResult, result);
+ value = "value2";
+ expResult = "value";
+ result = SQLCommand.registerVariable(var, value);
+ assertEquals(expResult, result);
+ }
+
+ /**
+ * Test of getCommandString method, of class SQLCommand.
+ */
+ public void testGetCommandString() {
+ SQLCommand cmd = new SQLCommand("select * from test");
+ assertEquals("select * from test", cmd.getCommandString());
+ cmd = new SQLCommand("select * from test;");
+ assertEquals("select * from test", cmd.getCommandString());
+
+ cmd = new SQLCommand("select * from test where a='b';");
+ assertEquals("select * from test where a='b'", cmd.getCommandString());
+
+ // with variables
+ cmd = new SQLCommand("select * from test where a=@b;");
+ assertEquals("select * from test where a=null", cmd.getCommandString());
+ SQLCommand.registerVariable("b", "'b'");
+ assertEquals("select * from test where a='b'", cmd.getCommandString());
+ cmd = new SQLCommand("select * from test where a='@b';");
+ assertEquals("select * from test where a='@b'", cmd.getCommandString());
+ }
+
+ public void testQuoteCount() {
+ StringBuffer buf = new StringBuffer("select * from test");
+ assertEquals(0, SQLCommand.getQuoteCount(buf));
+ buf.append(" where a='b");
+ assertEquals(1, SQLCommand.getQuoteCount(buf));
+ buf.append(" '");
+ assertEquals(2, SQLCommand.getQuoteCount(buf));
+
+ }
+}
|