RowChangeData Objects
RowChangeData is information that has been written into the THL in row format, and therefore consists of rows of individual data divided
into the individual columns that make up each row-based change. Processing of these individual changes must be performed one row at a time using the
list of OneRowChange objects provided.
The following methods are supported for the RowChangeData object:
| Method | Description |
|---|---|
appendOneRowChange(rowChange) | Appends a single row change to the event, using the supplied OneRowChange object. |
getRowChanges() | Returns an array list of all the changes as OneRowChange objects. |
setRowChanges(rowChanges) | Sets the row changes within the event using the supplied list of OneRowChange objects. |
For example, a typical row-based process will operate as follows:
if (d != null && d instanceof com.continuent.tungsten.replicator.dbms.RowChangeData)
{
rowChanges = d.getRowChanges();
for(j = 0; j < rowChanges.size(); j++)
{
oneRowChange = rowChanges.get(j);
// Do row filter
The OneRowChange object contains the changes for just one row within the event. The class contains the information about the tables,
field names and field values. The following methods are supported:
| Method | Description |
|---|---|
getAction() | Returns the row action type, i.e. whether the row change is an INSERT, UPDATE or DELETE |
getColumnSpec() | Returns the specification of each column within the row change |
getColumnValues() | Returns the value of each column within the row change |
getSchemaName() | Gets the schema name of the row change |
getTableName() | Gets the table name of the row change |
setColumnSpec() | Sets the column specification using an array of column specifications |
setColumnValues() | Sets the column values |
setSchemaName() | Sets the schema name |
setTableName() | Sets the table name |
Changing Schema or Table Names
The schema, table and column names are exposed at different levels within the OneRowChange object. Updating the schema name can be
achieved by getting and setting the name through the getSchemaName() and setSchemaName() methods. For example, to add a
prefix to a schema name:
rowchange.setSchemaName('prefix_' + rowchange.getSchemaName());
To update a table name, the getTableName() and setTableName() can be used in the same manner:
oneRowChange.setTableName('prefix_' + oneRowChange.getTableName());
Getting Action Types
Row operations are categorised according to the action of the row change, i.e. whether the change was an insert, update or delete operation. This
information can be extracted from each row change by using the getAction() method:
action = oneRowChange.getAction();
The action information is returned as a string, i.e. INSERT, UPDATE, or DELETE. This enables information to be
filtered according to the changes; for example by selectively modifying or altering events.
For example, DELETE events could be removed from the list of row changes:
for(j=0;j<rowChanges.size();j++)
{
oneRowChange = rowChanges.get(j);
if (oneRowChange.actionType == 'DELETE')
{
rowChanges.remove(j);
j--;
}
}
The j-- is required because as each row change is removed, the size of the array changes and our current index within the array needs to
be explicitly modified.
Extracting Column Definitions
To extract the row data, the getColumnValues() method returns an array containing the value of each column in the row change. Obtaining
the column specification information using getColumnSpec() returns a corresponding specification of each corresponding column. The column
data can be used to obtain the column type information
To change column names or values, first the column information should be identified. The column information in each row change should be retrieved and/or
updated. The getColumnSpec() returns the column specification of the row change. The information is returned as an array of the individual
columns and their specification:
columns = oneRowChange.getColumnSpec();
For each column specification a ColumnSpec object is returned, which supports the following methods:
| Method | Description |
|---|---|
getIndex() | Gets the index of the column within the row change |
getLength() | Gets the length of the column |
getName() | Returns the column name if available |
getType() | Gets the type number of the column |
getTypeDescription() | |
isBlob() | Returns true if the column is a blob |
isNotNull() | Returns true if the column is configured as NOT NULL |
isUnsigned() | Returns true if the column is unsigned. |
setBlob() | Set the column blob specification |
setIndex() | Set the column index order |
setLength() | Sets the column length |
setName() | Set the column name |
setNotNull() | Set whether the column is configured as NOT NULL |
setSigned() | Set whether the column data is signed |
setType() | Set the column type |
setTypeDescription() | Set the column type description |
To identify the column type, use the getType() method which returns an integer matching the underlying data type. There are no predefined
types, but common values include:
| Type | Value | Notes |
|---|---|---|
INT | 4 | |
CHAR or VARCHAR | 12 | |
TEXT or BLOB | 2004 | Use isBlob() to identify if the column is a blob or not |
TIME | 92 | |
DATE | 91 | |
DATETIME or TIMESTAMP | 92 | |
DOUBLE | 8 |
Other information about the column, such as the length, and value types (unsigned, null, etc.) can be determined using the other functions against the column specification.
Extracting Row Data
The getColumnValues() method returns an array that corresponds to the information returned by the getColumnSpec() method.
That is, the method returns a complementary array of the row change values, one element for each row, where each row is itself a further array of
each column:
values = oneRowChange.getColumnValues();
This means that index 0 of the array from getColumnSpec() refers to the same column as index 0 of the array for a single row from
getColumnValues().
getColumnSpec() | msgid | message | msgdate |
|---|---|---|---|
getColumnValues() | |||
[0] | 1 | Hello New York! | Thursday, June 13, 2013 |
[1] | 2 | Hello San Francisco! | Thursday, June 13, 2013 |
[2] | 3 | Hello Chicago! | Thursday, June 13, 2013 |
This enables the script to identify the column type by the index, and then the corresponding value update using the same index. In the above example,
the message field will always be index 1 within the corresponding values.
Each value object supports the following methods:
| Method | Description |
|---|---|
getValue() | Get the current column value |
setValue() | Set the column value to the supplied value |
setValueNull() | Set the column value to NULL |
For example, within the zerodate2null sample, dates with a zero value are set to NULL using the following code:
columns = oneRowChange.getColumnSpec();
columnValues = oneRowChange.getColumnValues();
for (c = 0; c < columns.size(); c++)
{
columnSpec = columns.get(c);
type = columnSpec.getType();
if (type == TypesDATE || type == TypesTIMESTAMP)
{
for (row = 0; row < columnValues.size(); row++)
{
values = columnValues.get(row);
value = values.get(c);
if (value.getValue() == 0)
{
value.setValueNull()
}
}
}
}
In the above example, the column specification is retrieved to determine which columns are date types. Then the list of embedded row values is
extracted, and iterates over each row, setting the value for a date that is zero (0) to be NULL using the setValueNull() method.
An alternative would be to update to an explicit value using the setValue() method.