/*
* This software is distributed under the terms of the FSF
* Gnu Lesser General Public License (see lgpl.txt).
*
* This program is distributed WITHOUT ANY WARRANTY. See the
* GNU General Public License for more details.
*/
package com.scooterframework.orm.sqldataexpress.object;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.scooterframework.common.logging.LogUtil;
/**
* JdbcStatement class.
*
* @author (Fei) John Chen
*/
public class JdbcStatement {
public JdbcStatement() {}
public JdbcStatement(String name, String jdbcStatementString) {
this.name = name;
this.jdbcStatementString = jdbcStatementString;
}
/**
* Returns name
*/
public String getName() {
return name;
}
/**
* Returns the original SQL statement string
*/
public String getOriginalJdbcStatementString() {
return jdbcStatementString;
}
/**
* Returns executable SQL statement string
*/
public String getExecutableJdbcStatementString() {
if (executableJdbcString == null) {
executableJdbcString = convertToExecutable(jdbcStatementString);
}
return executableJdbcString;
}
/**
* isInsertStatement
*/
public boolean isInsertStatement() {
boolean insertStatement = false;
if ( jdbcStatementString != null &&
jdbcStatementString.toUpperCase().trim().startsWith("INSERT")) {
insertStatement = true;
}
return insertStatement;
}
/**
* isSelectStatement
*/
public boolean isSelectStatement() {
boolean selectStatement = false;
if ( jdbcStatementString != null &&
jdbcStatementString.toUpperCase().trim().startsWith("SELECT")) {
selectStatement = true;
}
return selectStatement;
}
/**
* isUpdateStatement
*/
public boolean isUpdateStatement() {
boolean updateStatement = false;
if ( jdbcStatementString != null &&
jdbcStatementString.toUpperCase().trim().startsWith("UPDATE")) {
updateStatement = true;
}
return updateStatement;
}
/**
* Returns count of parameters
*/
public int getParameterCount() {
return parameters.size();
}
/**
* Returns parameters
*/
public List<Parameter> getParameters() {
return parameters;
}
/**
* Adds a parameter
*/
public void addParameter(Parameter param) {
parameters.add(param);
}
/**
* Returns cursor
*/
public Cursor getCursor(String cursorName, ResultSet rs) {
Cursor cursor = (Cursor)cursors.get(cursorName);
if ( cursor == null ) {
cursor = new Cursor(cursorName, rs);
addCursor(cursorName, cursor);
}
return cursor;
}
public boolean hasLoadedParameterProperties() {
return loadedParameterProperties;
}
public void setLoadedParameterProperties(boolean loadedParameterProperties) {
this.loadedParameterProperties = loadedParameterProperties;
}
public boolean hasLoadedParameterMetaData() {
return loadedParameterMetaData;
}
public void setLoadedParameterMetaData(boolean loadedParameterMetaData) {
this.loadedParameterMetaData = loadedParameterMetaData;
}
/**
* Returns a string representation of the object.
*
* @return String
*/
public String toString() {
StringBuilder sb = new StringBuilder();
String LINE_BREAK = "\r\n";
sb.append("name = " + name).append(LINE_BREAK);
sb.append("jdbcStatementString = " + jdbcStatementString).append(LINE_BREAK);
sb.append("executableJdbcString = " + executableJdbcString).append(LINE_BREAK);
if (parameters != null) {
int psize = parameters.size();
sb.append("parameters size = " + psize).append(LINE_BREAK);
Iterator<Parameter> it = parameters.iterator();
while (it.hasNext()) {
Parameter p = it.next();
if (p == null) continue;
sb.append(p.toString()).append(LINE_BREAK);
}
}
if (cursors != null) {
int csize = cursors.size();
sb.append("coursors size = " + csize).append(LINE_BREAK);
for (Map.Entry<String, Cursor> entry : cursors.entrySet()) {
sb.append(entry.getKey()).append(": ").append(entry.getValue()).append(LINE_BREAK);
}
}
return sb.toString();
}
/**
* Adds a cursor
*/
private void addCursor(String cursorName, Cursor cursor) {
cursors.put(cursorName, cursor);
}
/**
* Converts the original jdbc statement string to executable.
*
* <pre>
* The original jdbc statement string may be like :
* <code>SELECT name FROM user WHERE id = ?ID</code>
*
* The corresponding executable jdbc statement string is:
* <code>SELECT name FROM user WHERE id = ?</code>
* </ptr>
*
* @param original
* @return
*/
private String convertToExecutable(String original) {
if (original.indexOf('?') == -1) return original;
boolean allowedChar = true;
int length = original.length();
char[] newChars = new char[length];
for (int i = 0; i < length; i++) {
char c = original.charAt(i);
newChars[i] = ' ';
if ('?' == c) {
allowedChar = false;
newChars[i] = c;
}
else if (QuestionMarkStopper.indexOf(c) != -1) {
allowedChar = true;
}
if (allowedChar) newChars[i] = c;
}
return new String(newChars);
}
public static final String QuestionMarkStopper = " ,|><=(){}+-*/";
private boolean loadedParameterProperties = false;
private String name = null;
private String jdbcStatementString = null;
private List<Parameter> parameters = new ArrayList<Parameter>();
private Map<String, Cursor> cursors = new HashMap<String, Cursor>();
private boolean loadedParameterMetaData = false;
private String executableJdbcString;
protected LogUtil log = LogUtil.getLogger(this.getClass().getName());
}