Search in sources :

Example 1 with Row

use of org.jumpmind.db.sql.Row in project symmetric-ds by JumpMind.

the class DbCompareDiffWriter method writeInsert.

public void writeInsert(DbCompareRow sourceCompareRow) {
    if (stream == null) {
        return;
    }
    Table targetTable = tables.getTargetTable();
    DmlStatement statement = targetEngine.getDatabasePlatform().createDmlStatement(DmlType.INSERT, targetTable.getCatalog(), targetTable.getSchema(), targetTable.getName(), targetTable.getPrimaryKeyColumns(), targetTable.getColumns(), null, null);
    Row row = new Row(targetTable.getColumnCount());
    for (Column sourceColumn : tables.getSourceTable().getColumns()) {
        Column targetColumn = tables.getColumnMapping().get(sourceColumn);
        if (targetColumn == null) {
            continue;
        }
        row.put(targetColumn.getName(), sourceCompareRow.getRowValues().get(sourceColumn.getName()));
    }
    String sql = statement.buildDynamicSql(BinaryEncoding.HEX, row, false, false);
    writeLine(sql);
}
Also used : Table(org.jumpmind.db.model.Table) Column(org.jumpmind.db.model.Column) DmlStatement(org.jumpmind.db.sql.DmlStatement) Row(org.jumpmind.db.sql.Row)

Example 2 with Row

use of org.jumpmind.db.sql.Row in project symmetric-ds by JumpMind.

the class DataService method getForeignTableRows.

protected List<TableRow> getForeignTableRows(List<TableRow> tableRows, Set<TableRow> visited) throws CloneNotSupportedException {
    List<TableRow> fkDepList = new ArrayList<TableRow>();
    for (TableRow tableRow : tableRows) {
        if (!visited.contains(tableRow)) {
            visited.add(tableRow);
            for (ForeignKey fk : tableRow.getTable().getForeignKeys()) {
                Table table = platform.getTableFromCache(fk.getForeignTableName(), false);
                if (table == null) {
                    table = fk.getForeignTable();
                    if (table == null) {
                        table = platform.getTableFromCache(tableRow.getTable().getCatalog(), tableRow.getTable().getSchema(), fk.getForeignTableName(), false);
                    }
                }
                if (table != null) {
                    Table foreignTable = (Table) table.clone();
                    for (Column column : foreignTable.getColumns()) {
                        column.setPrimaryKey(false);
                    }
                    Row whereRow = new Row(fk.getReferenceCount());
                    String referenceColumnName = null;
                    boolean[] nullValues = new boolean[fk.getReferenceCount()];
                    int index = 0;
                    for (Reference ref : fk.getReferences()) {
                        Column foreignColumn = foreignTable.findColumn(ref.getForeignColumnName());
                        Object value = tableRow.getRow().get(ref.getLocalColumnName());
                        nullValues[index++] = value == null;
                        referenceColumnName = ref.getLocalColumnName();
                        whereRow.put(foreignColumn.getName(), value);
                        foreignColumn.setPrimaryKey(true);
                    }
                    boolean allNullValues = true;
                    for (boolean b : nullValues) {
                        if (!b) {
                            allNullValues = false;
                            break;
                        }
                    }
                    if (!allNullValues) {
                        DmlStatement whereSt = platform.createDmlStatement(DmlType.WHERE, foreignTable.getCatalog(), foreignTable.getSchema(), foreignTable.getName(), foreignTable.getPrimaryKeyColumns(), foreignTable.getColumns(), nullValues, null);
                        String whereSql = whereSt.buildDynamicSql(symmetricDialect.getBinaryEncoding(), whereRow, false, true, foreignTable.getPrimaryKeyColumns()).substring(6);
                        String delimiter = platform.getDatabaseInfo().getSqlCommandDelimiter();
                        if (delimiter != null && delimiter.length() > 0) {
                            whereSql = whereSql.substring(0, whereSql.length() - delimiter.length());
                        }
                        Row foreignRow = new Row(foreignTable.getColumnCount());
                        if (foreignTable.getForeignKeyCount() > 0) {
                            DmlStatement selectSt = platform.createDmlStatement(DmlType.SELECT, foreignTable, null);
                            Object[] keys = whereRow.toArray(foreignTable.getPrimaryKeyColumnNames());
                            Map<String, Object> values = sqlTemplate.queryForMap(selectSt.getSql(), keys);
                            if (values == null) {
                                log.warn("Unable to reload rows for missing foreign key data for table '{}', parent data not found.  Using sql='{}' with keys '{}'", table.getName(), selectSt.getSql(), keys);
                            } else {
                                foreignRow.putAll(values);
                            }
                        }
                        TableRow foreignTableRow = new TableRow(foreignTable, foreignRow, whereSql, referenceColumnName, fk.getName());
                        fkDepList.add(foreignTableRow);
                        log.debug("Add foreign table reference '{}' whereSql='{}'", foreignTable.getName(), whereSql);
                    } else {
                        log.debug("The foreign table reference was null for {}", foreignTable.getName());
                    }
                } else {
                    log.debug("Foreign table '{}' not found for foreign key '{}'", fk.getForeignTableName(), fk.getName());
                }
                if (fkDepList.size() > 0) {
                    fkDepList.addAll(getForeignTableRows(fkDepList, visited));
                }
            }
        }
    }
    return fkDepList;
}
Also used : Table(org.jumpmind.db.model.Table) Reference(org.jumpmind.db.model.Reference) ArrayList(java.util.ArrayList) ForeignKey(org.jumpmind.db.model.ForeignKey) Column(org.jumpmind.db.model.Column) DmlStatement(org.jumpmind.db.sql.DmlStatement) Row(org.jumpmind.db.sql.Row)

Example 3 with Row

use of org.jumpmind.db.sql.Row in project symmetric-ds by JumpMind.

the class OracleDdlReader method getTableNames.

public List<String> getTableNames(final String catalog, final String schema, final String[] tableTypes) {
    List<String> tableNames = new ArrayList<String>();
    JdbcSqlTemplate sqlTemplate = (JdbcSqlTemplate) platform.getSqlTemplate();
    StringBuilder sql = new StringBuilder("select TABLE_NAME from ALL_TABLES");
    Object[] params = null;
    if (isNotBlank(schema)) {
        sql.append(" where OWNER=?");
        params = new Object[] { schema };
    }
    tableNames = sqlTemplate.query(sql.toString(), new ISqlRowMapper<String>() {

        public String mapRow(Row row) {
            return row.getString("TABLE_NAME");
        }
    }, params);
    return tableNames;
}
Also used : JdbcSqlTemplate(org.jumpmind.db.sql.JdbcSqlTemplate) ArrayList(java.util.ArrayList) Row(org.jumpmind.db.sql.Row) ISqlRowMapper(org.jumpmind.db.sql.ISqlRowMapper)

Example 4 with Row

use of org.jumpmind.db.sql.Row in project symmetric-ds by JumpMind.

the class RedshiftDdlReader method getTriggers.

public List<Trigger> getTriggers(final String catalog, final String schema, final String tableName) {
    List<Trigger> triggers = new ArrayList<Trigger>();
    log.debug("Reading triggers for: " + tableName);
    JdbcSqlTemplate sqlTemplate = (JdbcSqlTemplate) platform.getSqlTemplate();
    String sql = "SELECT " + "trigger_name, " + "trigger_schema, " + "trigger_catalog, " + "event_manipulation AS trigger_type, " + "event_object_table AS table_name," + "trig.*, " + "pgproc.prosrc " + "FROM INFORMATION_SCHEMA.TRIGGERS AS trig " + "INNER JOIN pg_catalog.pg_trigger AS pgtrig " + "ON pgtrig.tgname=trig.trigger_name " + "INNER JOIN pg_catalog.pg_proc AS pgproc " + "ON pgproc.oid=pgtrig.tgfoid " + "WHERE event_object_table=? AND event_object_schema=?;";
    triggers = sqlTemplate.query(sql, new ISqlRowMapper<Trigger>() {

        public Trigger mapRow(Row row) {
            Trigger trigger = new Trigger();
            trigger.setName(row.getString("trigger_name"));
            trigger.setCatalogName(row.getString("trigger_catalog"));
            trigger.setSchemaName(row.getString("trigger_schema"));
            trigger.setTableName(row.getString("table_name"));
            trigger.setEnabled(true);
            trigger.setSource(row.getString("prosrc"));
            row.remove("prosrc");
            String triggerType = row.getString("trigger_type");
            if (triggerType.equals("DELETE") || triggerType.equals("INSERT") || triggerType.equals("UPDATE")) {
                trigger.setTriggerType(TriggerType.valueOf(triggerType));
            }
            trigger.setMetaData(row);
            return trigger;
        }
    }, tableName, schema);
    return triggers;
}
Also used : JdbcSqlTemplate(org.jumpmind.db.sql.JdbcSqlTemplate) Trigger(org.jumpmind.db.model.Trigger) ArrayList(java.util.ArrayList) Row(org.jumpmind.db.sql.Row) ISqlRowMapper(org.jumpmind.db.sql.ISqlRowMapper)

Example 5 with Row

use of org.jumpmind.db.sql.Row in project symmetric-ds by JumpMind.

the class OracleDdlReader method getTriggers.

public List<Trigger> getTriggers(final String catalog, final String schema, final String tableName) throws SqlException {
    List<Trigger> triggers = new ArrayList<Trigger>();
    log.debug("Reading triggers for: " + tableName);
    JdbcSqlTemplate sqlTemplate = (JdbcSqlTemplate) platform.getSqlTemplate();
    String sql = "SELECT * FROM ALL_TRIGGERS " + "WHERE TABLE_NAME=? and OWNER=?";
    triggers = sqlTemplate.query(sql, new ISqlRowMapper<Trigger>() {

        public Trigger mapRow(Row row) {
            Trigger trigger = new Trigger();
            trigger.setName(row.getString("TRIGGER_NAME"));
            trigger.setSchemaName(row.getString("OWNER"));
            trigger.setTableName(row.getString("TABLE_NAME"));
            trigger.setEnabled(Boolean.valueOf(row.getString("STATUS")));
            trigger.setSource("create ");
            String triggerType = row.getString("TRIGGERING_EVENT");
            if (triggerType.equals("DELETE") || triggerType.equals("INSERT") || triggerType.equals("UPDATE")) {
                trigger.setTriggerType(TriggerType.valueOf(triggerType));
            }
            trigger.setMetaData(row);
            return trigger;
        }
    }, tableName, schema);
    for (final Trigger trigger : triggers) {
        String name = trigger.getName();
        String sourceSql = "select TEXT from all_source " + "where NAME=? order by LINE ";
        sqlTemplate.query(sourceSql, new ISqlRowMapper<Trigger>() {

            public Trigger mapRow(Row row) {
                trigger.setSource(trigger.getSource() + "\n" + row.getString("TEXT"));
                ;
                return trigger;
            }
        }, name);
    }
    return triggers;
}
Also used : JdbcSqlTemplate(org.jumpmind.db.sql.JdbcSqlTemplate) Trigger(org.jumpmind.db.model.Trigger) ArrayList(java.util.ArrayList) Row(org.jumpmind.db.sql.Row) ISqlRowMapper(org.jumpmind.db.sql.ISqlRowMapper)

Aggregations

Row (org.jumpmind.db.sql.Row)78 ArrayList (java.util.ArrayList)31 ISqlRowMapper (org.jumpmind.db.sql.ISqlRowMapper)23 Trigger (org.jumpmind.db.model.Trigger)19 DmlStatement (org.jumpmind.db.sql.DmlStatement)19 JdbcSqlTemplate (org.jumpmind.db.sql.JdbcSqlTemplate)19 Column (org.jumpmind.db.model.Column)15 Table (org.jumpmind.db.model.Table)12 Date (java.util.Date)11 SqlException (org.jumpmind.db.sql.SqlException)9 ISqlTemplate (org.jumpmind.db.sql.ISqlTemplate)8 Test (org.junit.Test)8 HashMap (java.util.HashMap)7 InvocationTargetException (java.lang.reflect.InvocationTargetException)3 HashSet (java.util.HashSet)3 Map (java.util.Map)3 IDatabasePlatform (org.jumpmind.db.platform.IDatabasePlatform)3 IoException (org.jumpmind.exception.IoException)3 NetworkedNode (org.jumpmind.symmetric.model.NetworkedNode)3 Node (org.jumpmind.symmetric.model.Node)3