diff --git a/src/main/java/com/zendesk/maxwell/scripting/Scripting.java b/src/main/java/com/zendesk/maxwell/scripting/Scripting.java index 57b57cc4c..967aab83b 100644 --- a/src/main/java/com/zendesk/maxwell/scripting/Scripting.java +++ b/src/main/java/com/zendesk/maxwell/scripting/Scripting.java @@ -54,9 +54,9 @@ public Scripting(String filename) throws IOException, ScriptException, NoSuchMet public void invoke(RowMap row) { if ( row instanceof HeartbeatRowMap && processHeartbeatFunc != null ) - processHeartbeatFunc.call(null, new WrappedHeartbeatMap((HeartbeatRowMap) row)); + processHeartbeatFunc.call(null, new WrappedHeartbeatMap((HeartbeatRowMap) row), globalJavascriptState); else if ( row instanceof DDLMap && processDDLFunc != null ) - processDDLFunc.call(null, new WrappedDDLMap((DDLMap) row)); + processDDLFunc.call(null, new WrappedDDLMap((DDLMap) row), globalJavascriptState); else if ( row instanceof RowMap && processRowFunc != null ) processRowFunc.call(null, new WrappedRowMap(row), globalJavascriptState); } diff --git a/src/test/java/com/zendesk/maxwell/scripting/ScriptingTest.java b/src/test/java/com/zendesk/maxwell/scripting/ScriptingTest.java index a72fcf539..486addf68 100644 --- a/src/test/java/com/zendesk/maxwell/scripting/ScriptingTest.java +++ b/src/test/java/com/zendesk/maxwell/scripting/ScriptingTest.java @@ -4,6 +4,8 @@ import com.zendesk.maxwell.replication.Position; import com.zendesk.maxwell.row.RowMap; +import com.zendesk.maxwell.schema.ddl.DDLMap; +import com.zendesk.maxwell.schema.ddl.ResolvedTableAlter; import java.lang.reflect.Field; import java.util.ArrayList; @@ -26,7 +28,7 @@ private T getPrivateFieldOrFail(Object obj, String fieldName) throws Excepti @Test public void TestScripting() throws Exception { // Write a simple scripting file - Scripting scripting = new Scripting("src/test/resources/scripting/test.js"); + Scripting scripting = new Scripting("src/test/resources/scripting/test-set-state.js"); // String type, String database, String table, Long timestampMillis, List pkColumns, Position position, Position nextPosition, String rowQuery RowMap row = new RowMap( @@ -48,10 +50,37 @@ public void TestScripting() throws Exception { assertEquals(globalJavascriptState.get("mykey"), "myvalue"); } + @Test + public void TestScriptingDDL() throws Exception { + // Write a simple scripting file + Scripting scripting = new Scripting("src/test/resources/scripting/test-set-state.js"); + + // String type, String database, String table, Long timestampMillis, List pkColumns, Position position, Position nextPosition, String rowQuery + RowMap row = new DDLMap( + new ResolvedTableAlter(), + 123L, + "INSERT INTO mytable VALUES (1, 2, 3)", + new Position(null, 0), + new Position(null, 0), + 13L + ); + + + // Access the private globalJavascriptState field + LinkedHashMap globalJavascriptState = + getPrivateFieldOrFail(scripting, "globalJavascriptState"); + + globalJavascriptState.put("number", "1"); + + scripting.invoke(row); + + assertEquals(globalJavascriptState.get("number"), "2"); + } + @Test public void DontFailIfScriptHasNoStateParameter() throws Exception { // Write a simple scripting file - Scripting scripting = new Scripting("src/test/resources/scripting/test-no-state.js"); + Scripting scripting = new Scripting("src/test/resources/scripting/test-no-state-suppress-row.js"); // String type, String database, String table, Long timestampMillis, List pkColumns, Position position, Position nextPosition, String rowQuery RowMap row = new RowMap( diff --git a/src/test/resources/scripting/test-set-state.js b/src/test/resources/scripting/test-set-state.js index f2b2bd249..ca56b856d 100644 --- a/src/test/resources/scripting/test-set-state.js +++ b/src/test/resources/scripting/test-set-state.js @@ -1,3 +1,8 @@ function process_row(r, state) { state.put("mykey", "myvalue"); } + +function process_ddl(ddl, state) { + var num = parseInt(state.get("number")); + state.put("number", Number(num + 1).toFixed(0)); +} \ No newline at end of file