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)); + + } +} |