Skip to content

Commit

Permalink
HSQLDB Unit Tests Pass!
Browse files Browse the repository at this point in the history
  • Loading branch information
chenson42 committed Dec 29, 2007
1 parent c4f49d8 commit f6277aa
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 28 deletions.
Expand Up @@ -48,9 +48,9 @@
*/
public abstract class AbstractEmbeddedTrigger {

static final Log logger = LogFactory.getLog(AbstractEmbeddedTrigger.class);
protected static final Log logger = LogFactory.getLog(AbstractEmbeddedTrigger.class);

static final FastDateFormat dateFormatter = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss.S");
protected static final FastDateFormat dateFormatter = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss.S");

protected IDataService dataService;

Expand Down
Expand Up @@ -21,6 +21,7 @@

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;

import org.apache.commons.lang.ArrayUtils;
Expand All @@ -43,11 +44,7 @@ public class HsqlDbTrigger extends AbstractEmbeddedTrigger implements org.hsqldb

String nodeSelectSql;

boolean conditionalWhereExistsForUpdate;

boolean conditionalWhereExistsForInsert;

boolean conditionalWhereExistsForDelete;
boolean conditionalExists;

public void fire(int type, String triggerName, String tableName, Object[] oldRow, Object[] newRow) {
try {
Expand All @@ -74,13 +71,13 @@ protected List<Node> findTargetNodes(Object[] oldRow, Object[] newRow) {
values = getOrderedColumnValues(newRow);
break;
case UPDATE:
values = getOrderedColumnValues(ArrayUtils.add(newRow, oldRow));
values = ArrayUtils.addAll(getOrderedColumnValues(newRow), getOrderedColumnValues(oldRow));
break;
case DELETE:
values = getOrderedColumnValues(oldRow);
break;
}
return (List<Node>) getDbDialect().getJdbcTemplate().query(nodeSelectSql, values, new RowMapper() {
return (List<Node>) getDbDialect().getJdbcTemplate().query(fillVirtualTableSql(nodeSelectSql, values), new RowMapper() {
public Object mapRow(ResultSet rs, int index) throws SQLException {
Node node = new Node();
node.setNodeId(rs.getString(1));
Expand All @@ -90,19 +87,24 @@ public Object mapRow(ResultSet rs, int index) throws SQLException {
}

private boolean isInsertDataEvent(Object[] oldRow, Object[] newRow) {
Object[] values = null;
switch (triggerType) {
case INSERT:
values = getOrderedColumnValues(newRow);
break;
case UPDATE:
values = getOrderedColumnValues(ArrayUtils.add(newRow, oldRow));
break;
case DELETE:
values = getOrderedColumnValues(oldRow);
break;
if (conditionalExists) {
Object[] values = null;
switch (triggerType) {
case INSERT:
values = getOrderedColumnValues(newRow);
break;
case UPDATE:
values = ArrayUtils.addAll(getOrderedColumnValues(newRow), getOrderedColumnValues(oldRow));
break;
case DELETE:
values = getOrderedColumnValues(oldRow);
break;
}
int count = getDbDialect().getJdbcTemplate().queryForInt(fillVirtualTableSql(dataSelectSql, values));
return count > 0;
} else {
return true;
}
return getDbDialect().getJdbcTemplate().queryForInt(dataSelectSql, values) > 0;
}

private void init(int type, String triggerName, String tableName) {
Expand Down Expand Up @@ -139,6 +141,35 @@ private String buildVirtualTableSql() {
return b.toString();
}

/**
* I wanted to do this as a preparedstatement but hsqldb doesn't seem to support it.
*/
private String fillVirtualTableSql(String sql, Object[] values) {
StringBuilder out = new StringBuilder();
String[] tokens = StringUtils.split(sql, "?");
for (int i = 0; i < tokens.length; i++) {
out.append(tokens[i]);
if (i < values.length) {
Object value = values[i];
if (value instanceof String) {
out.append("'");
out.append(value);
out.append("'");
} else if (value instanceof Number) {
out.append(value);
} else if (value instanceof Date) {
out.append("'");
out.append(AbstractEmbeddedTrigger.dateFormatter.format(value));
out.append("'");
} else {
// anything else is unsupported
out.append("null");
}
}
}
return out.toString();
}

private void buildNodeSelectSql() {
StringBuilder b = new StringBuilder("select node_id from ");
b.append(dbDialect.getTablePrefix());
Expand All @@ -157,21 +188,21 @@ private void buildDataSelectSql() {
switch (triggerType) {
case INSERT:
if (!StringUtils.isBlank(trigger.getSyncOnInsertCondition())) {
conditionalWhereExistsForInsert = true;
conditionalExists = true;
b.append("where ");
b.append(trigger.getSyncOnInsertCondition());
}
break;
case UPDATE:
if (!StringUtils.isBlank(trigger.getSyncOnUpdateCondition())) {
conditionalWhereExistsForUpdate = true;
conditionalExists = true;
b.append("where ");
b.append(trigger.getSyncOnUpdateCondition());
}
break;
case DELETE:
if (!StringUtils.isBlank(trigger.getSyncOnDeleteCondition())) {
conditionalWhereExistsForDelete = true;
conditionalExists = true;
b.append("where ");
b.append(trigger.getSyncOnDeleteCondition());
}
Expand All @@ -188,7 +219,6 @@ private String replaceOldNewTriggerTokens(String b) {

private DataEventType getDataEventType(int type) {
switch (type) {

case org.hsqldb.Trigger.INSERT_AFTER_ROW:
return DataEventType.INSERT;
case org.hsqldb.Trigger.UPDATE_AFTER_ROW:
Expand Down
Expand Up @@ -68,7 +68,7 @@ public void testLifecycle() {
testPurge();
testHeartbeat();
} catch (AssertionError ex) {
throw ex;
throw ex;
} catch (Exception ex) {
logger.error(ex, ex);
Assert.fail();
Expand Down Expand Up @@ -97,7 +97,7 @@ protected void initialLoad() {
nodeService.findNodeByExternalId(TestConstants.TEST_CLIENT_NODE_GROUP,
TestConstants.TEST_CLIENT_EXTERNAL_ID).getNodeId());
getClientEngine().pull();

// TODO - need to add validation here
}

Expand All @@ -120,7 +120,7 @@ protected void testSyncToClient() {
}

if (getRootDbDialect().isBlobSyncSupported()) {
byte[] data = (byte[])clientJdbcTemplate.queryForObject(
byte[] data = (byte[]) clientJdbcTemplate.queryForObject(
"select icon from test_customer where customer_id=101", byte[].class);
Assert.assertTrue(ArrayUtils.isEquals(data, BINARY_DATA),
"The BLOB icon field on customer was not sync'd to the client.");
Expand Down

0 comments on commit f6277aa

Please sign in to comment.