package com.med.sql;
import java.io.PrintStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
import schemacrawler.schema.Column;
import schemacrawler.schema.Schema;
import schemacrawler.schema.Table;
import com.medecision.eda.event100.EventDocument;
/**
* Prototypical CDC event generater for newly installed Alineo databases.
*
* @author Jane Eisenstein
*/
public class InstallCDCEventWriter {
/**
* NOTE: printEvents should be only be run against a database containing initial, model data.
*
* @param schemas
* @param targetDbms
* @param out
* @param ds
* @param debug
* @throws Exception
*/
public void printCreateEntityEvents(
List<Schema> schemas, DbmsInfo.Product targetDbms, DataSource ds, PrintStream out, boolean debug) throws Exception {
TableOrder to = new TableOrder();
List<Table> orderedTables = to.getTableLoadOrder(schemas, null);
List<Table> valuedTables = to.getValuedTablesInOrder(ds, orderedTables, null);
Connection cn = null;
try {
cn = ds.getConnection();
Timestamp txnTimestamp = null;
for (Table table : valuedTables) {
final String tableName = table.toString();
final String entityType = CDCUtils.getEntityType(table);
if (CDCUtils.isNonauditedEntity(entityType))
continue;
int primaryKeyColumnCount = 0;
Column primaryKeyColumn = null;
// collect all columns
List<Column> dataColumnList = new ArrayList<Column>();
final Column[] columns = table.getColumns();
for (int j = 0; j < columns.length; j++) {
final Column column = columns[j];
if (column.isPartOfPrimaryKey()) {
primaryKeyColumn = column;
primaryKeyColumnCount++;
} else { // non-PK column
dataColumnList.add(column);
}
}
if (!dataColumnList.isEmpty() && 1 == primaryKeyColumnCount) {
txnTimestamp = null;
String pkColumnId = primaryKeyColumn.getName();
if (debug && out != null) out.println("pk column: "+pkColumnId);
Column[] dataColumns = new Column[dataColumnList.size()];
for (int i = 0; i < dataColumns.length; i++)
dataColumns[i] = dataColumnList.get(i);
String columnCommaIdList = SqlUtils.getCommaIdList(dataColumns);
if (debug && out != null) out.println(columnCommaIdList);
Statement stmt = null;
ResultSet rs = null;
try {
stmt = cn.createStatement();
String sql = "SELECT " + columnCommaIdList + ", " + pkColumnId +" FROM " + tableName;
if (debug && out != null) out.println(sql);
rs = stmt.executeQuery(sql);
while (rs.next()) {
int colCount = dataColumns.length;
String[] values = new String[colCount];
String pkValue = null;
int i = 0;
for ( ; i < colCount; i++) {
Column column = dataColumns[i];
// TODO: verify this logic is right
String value = rs.getString(i + 1);
if (value != null) {
value = CDCUtils.getColumnValueString(column, value);
}
values[i] = value;
}
String value = rs.getString(i + 1);
if (value != null) {
pkValue = CDCUtils.getColumnValueString(primaryKeyColumn, value);
}
EventDocument eventDoc =
CDCUtils.createEventDoc(entityType, dataColumns, colCount, values, pkValue);
if (out != null) {
String xml = CDCUtils.getEventXML(eventDoc);
out.println(xml);
}
} // while
} catch (Exception e) {
e.printStackTrace();
} finally {
try { rs.close(); } catch (SQLException e) {}
rs = null;
try { stmt.close(); } catch (SQLException e) {}
stmt = null;
}
}
} // for
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
cn.close();
} catch (SQLException e) { }
cn = null;
}
}
}