Skip to content

Commit

Permalink
0000942: Add a router type of 'audit' that captures changes in an dyn…
Browse files Browse the repository at this point in the history
…amically created audit table.
  • Loading branch information
chenson42 committed Dec 6, 2012
1 parent 21fdeb5 commit 8af040b
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 37 deletions.
2 changes: 1 addition & 1 deletion symmetric-assemble/src/docbook/configuration.xml
Expand Up @@ -980,7 +980,7 @@ values
as the original table with the same data types only each column is nullable with no default
values. </para>

<para>Three extra "AUDIT" columns are added: <itemizedlist>
<para>Three extra "AUDIT" columns are added to the table: <itemizedlist>
<listitem>AUDIT_ID - the primary key of the table.</listitem>
<listitem>AUDIT_TIME - the time at which the change occurred.</listitem>
<listitem>AUDIT_EVENT - the DML type that happened to the row.</listitem>
Expand Down
Expand Up @@ -14,6 +14,7 @@
import org.jumpmind.db.sql.ISqlTemplate;
import org.jumpmind.symmetric.ISymmetricEngine;
import org.jumpmind.symmetric.common.ParameterConstants;
import org.jumpmind.symmetric.io.data.DataEventType;
import org.jumpmind.symmetric.model.DataMetaData;
import org.jumpmind.symmetric.model.Node;
import org.jumpmind.symmetric.model.TriggerHistory;
Expand All @@ -37,44 +38,47 @@ public AuditTableDataRouter(ISymmetricEngine engine) {

public Set<String> routeToNodes(SimpleRouterContext context, DataMetaData dataMetaData,
Set<Node> nodes, boolean initialLoad) {
IParameterService parameterService = engine.getParameterService();
IDatabasePlatform platform = engine.getDatabasePlatform();
TriggerHistory triggerHistory = dataMetaData.getTriggerHistory();
Table table = dataMetaData.getTable().copyAndFilterColumns(
triggerHistory.getParsedColumnNames(), triggerHistory.getParsedPkColumnNames(),
true);
String tableName = table.getFullyQualifiedTableName();
Table auditTable = auditTables.get(tableName);
if (auditTable == null) {
auditTable = toAuditTable(table);
auditTables.put(tableName, auditTable);
if (parameterService.is(ParameterConstants.AUTO_CONFIGURE_DATABASE)) {
platform.alterTables(true, auditTable);
DataEventType eventType = dataMetaData.getData().getDataEventType();
if (eventType == DataEventType.INSERT || eventType == DataEventType.UPDATE
|| eventType == DataEventType.DELETE) {
IParameterService parameterService = engine.getParameterService();
IDatabasePlatform platform = engine.getDatabasePlatform();
TriggerHistory triggerHistory = dataMetaData.getTriggerHistory();
Table table = dataMetaData.getTable().copyAndFilterColumns(
triggerHistory.getParsedColumnNames(), triggerHistory.getParsedPkColumnNames(),
true);
String tableName = table.getFullyQualifiedTableName();
Table auditTable = auditTables.get(tableName);
if (auditTable == null) {
auditTable = toAuditTable(table);
auditTables.put(tableName, auditTable);
if (parameterService.is(ParameterConstants.AUTO_CONFIGURE_DATABASE)) {
platform.alterTables(true, auditTable);
}
}
}
String auditTableName = auditTable.getFullyQualifiedTableName(platform.getDatabaseInfo()
.getDelimiterToken());
String auditTableName = auditTable.getFullyQualifiedTableName(platform
.getDatabaseInfo().getDelimiterToken());

ISqlTemplate template = platform.getSqlTemplate();
Map<String, Object> values = new HashMap<String, Object>(getNewDataAsObject(null,
dataMetaData, engine.getSymmetricDialect()));
Long sequence = (Long)context.get(auditTableName);
if (sequence == null) {
sequence = 1l + template.queryForLong(String.format("select max(%s) from %s", COLUMN_AUDIT_ID,
auditTableName));
} else {
sequence = 1l + sequence;
ISqlTemplate template = platform.getSqlTemplate();
Map<String, Object> values = new HashMap<String, Object>(getNewDataAsObject(null,
dataMetaData, engine.getSymmetricDialect()));
Long sequence = (Long) context.get(auditTableName);
if (sequence == null) {
sequence = 1l + template.queryForLong(String.format("select max(%s) from %s",
COLUMN_AUDIT_ID, auditTableName));
} else {
sequence = 1l + sequence;
}
context.put(auditTableName, sequence);
values.put(COLUMN_AUDIT_ID, sequence);
values.put(COLUMN_AUDIT_TIME, new Date());
values.put(COLUMN_AUDIT_EVENT, dataMetaData.getData().getDataEventType().getCode());
DmlStatement statement = platform.createDmlStatement(DmlType.INSERT, auditTable);
int[] types = statement.getTypes();
Object[] args = statement.getValueArray(values);
String sql = statement.getSql();
template.update(sql, args, types);
}
context.put(auditTableName, sequence);
values.put(COLUMN_AUDIT_ID,
sequence);
values.put(COLUMN_AUDIT_TIME, new Date());
values.put(COLUMN_AUDIT_EVENT, dataMetaData.getData().getDataEventType().getCode());
DmlStatement statement = platform.createDmlStatement(DmlType.INSERT, auditTable);
int[] types = statement.getTypes();
Object[] args = statement.getValueArray(values);
String sql = statement.getSql();
template.update(sql, args, types);
return null;
}

Expand Down
2 changes: 1 addition & 1 deletion symmetric-core/src/main/resources/symmetric-schema.xml
Expand Up @@ -49,7 +49,7 @@
<table name="node_group_link" description="A source node_group sends its data updates to a target NodeGroup using a pull, push, or custom technique.">
<column name="source_node_group_id" type="VARCHAR" size="50" required="true" primaryKey="true" description="The node group where data changes should be captured." />
<column name="target_node_group_id" type="VARCHAR" size="50" required="true" primaryKey="true" description="The node group where data changes will be sent." />
<column name="data_event_action" type="CHAR" size="1" default="W" required="true" description="The notification scheme used to send data changes to the target node group. (P = Push, W = Wait for Pull) " />
<column name="data_event_action" type="CHAR" size="1" default="W" required="true" description="The notification scheme used to send data changes to the target node group. (P = Push, W = Wait for Pull, ) " />
<foreign-key foreignTable="node_group" name="fk_lnk_2_grp_src">
<reference local="source_node_group_id" foreign="node_group_id" />
</foreign-key>
Expand Down

0 comments on commit 8af040b

Please sign in to comment.