Search in sources :

Example 26 with ISqlTemplate

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

the class AuditTableDataRouter method routeToNodes.

public Set<String> routeToNodes(SimpleRouterContext context, DataMetaData dataMetaData, Set<Node> nodes, boolean initialLoad, boolean initialLoadSelectUsed, TriggerRouter triggerRouter) {
    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);
            if (parameterService.is(ParameterConstants.AUTO_CONFIGURE_DATABASE)) {
                platform.alterTables(true, auditTable);
            }
            auditTable = platform.getTableFromCache(auditTable.getCatalog(), auditTable.getSchema(), auditTable.getName(), false);
            auditTables.put(tableName, auditTable);
        }
        DatabaseInfo dbInfo = platform.getDatabaseInfo();
        String auditTableName = auditTable.getQualifiedTableName(dbInfo.getDelimiterToken(), dbInfo.getCatalogSeparator(), dbInfo.getSchemaSeparator());
        ISqlTemplate template = platform.getSqlTemplate();
        Map<String, Object> values = null;
        if (eventType != DataEventType.DELETE) {
            values = new HashMap<String, Object>(getNewDataAsObject(null, dataMetaData, engine.getSymmetricDialect(), false));
        } else {
            values = new HashMap<String, Object>(getOldDataAsObject(null, dataMetaData, engine.getSymmetricDialect(), false));
        }
        Long sequence = (Long) context.get(auditTableName);
        if (sequence == null) {
            sequence = 1l + template.queryForLong(String.format("select max(%s) from %s", auditTable.getColumnWithName(COLUMN_AUDIT_ID).getName(), auditTableName));
        } else {
            sequence = 1l + sequence;
        }
        context.put(auditTable.getName(), sequence);
        values.put(auditTable.getColumnWithName(COLUMN_AUDIT_ID).getName(), sequence);
        values.put(auditTable.getColumnWithName(COLUMN_AUDIT_TIME).getName(), new Date());
        values.put(auditTable.getColumnWithName(COLUMN_AUDIT_EVENT).getName(), eventType.getCode());
        DmlStatement statement = platform.createDmlStatement(DmlType.INSERT, auditTable, null);
        int[] types = statement.getTypes();
        Object[] args = statement.getValueArray(values);
        String sql = statement.getSql();
        template.update(sql, args, types);
    }
    return null;
}
Also used : IDatabasePlatform(org.jumpmind.db.platform.IDatabasePlatform) Table(org.jumpmind.db.model.Table) DatabaseInfo(org.jumpmind.db.platform.DatabaseInfo) DataEventType(org.jumpmind.symmetric.io.data.DataEventType) IParameterService(org.jumpmind.symmetric.service.IParameterService) Date(java.util.Date) ISqlTemplate(org.jumpmind.db.sql.ISqlTemplate) TriggerHistory(org.jumpmind.symmetric.model.TriggerHistory) DmlStatement(org.jumpmind.db.sql.DmlStatement)

Example 27 with ISqlTemplate

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

the class LookupTableDataRouter method getLookupTable.

@SuppressWarnings("unchecked")
protected Map<String, Set<String>> getLookupTable(final Map<String, String> params, Router router, SimpleRouterContext routingContext) {
    final String CTX_CACHE_KEY = LOOKUP_TABLE_KEY + "." + params.get(PARAM_TABLE);
    Map<String, Set<String>> lookupMap = (Map<String, Set<String>>) routingContext.getContextCache().get(CTX_CACHE_KEY);
    if (lookupMap == null) {
        ISqlTemplate template = symmetricDialect.getPlatform().getSqlTemplate();
        final Map<String, Set<String>> fillMap = new HashMap<String, Set<String>>();
        template.query(String.format("select %s, %s from %s", params.get(PARAM_MAPPED_KEY_COLUMN), params.get(PARAM_EXTERNAL_ID_COLUMN), params.get(PARAM_TABLE)), new ISqlRowMapper<Object>() {

            public Object mapRow(Row rs) {
                String key = rs.getString(params.get(PARAM_MAPPED_KEY_COLUMN));
                String value = rs.getString(params.get(PARAM_EXTERNAL_ID_COLUMN));
                Set<String> ids = fillMap.get(key);
                if (ids == null) {
                    ids = new HashSet<String>();
                    fillMap.put(key, ids);
                }
                ids.add(value);
                return value;
            }
        });
        lookupMap = fillMap;
        routingContext.getContextCache().put(CTX_CACHE_KEY, lookupMap);
    }
    return lookupMap;
}
Also used : ISqlTemplate(org.jumpmind.db.sql.ISqlTemplate) Set(java.util.Set) HashSet(java.util.HashSet) HashMap(java.util.HashMap) Row(org.jumpmind.db.sql.Row) HashMap(java.util.HashMap) Map(java.util.Map) HashSet(java.util.HashSet)

Example 28 with ISqlTemplate

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

the class SubSelectDataRouter method routeToNodes.

public Set<String> routeToNodes(SimpleRouterContext routingContext, DataMetaData dataMetaData, Set<Node> nodes, boolean initialLoad, boolean initialLoadSelectUsed, TriggerRouter triggerRouter) {
    String sql = FormatUtils.replaceToken(SQL, "prefixName", symmetricDialect.getTablePrefix(), true);
    String subSelect = dataMetaData.getRouter().getRouterExpression();
    Set<String> nodeIds = null;
    if (!StringUtils.isBlank(subSelect) && !initialLoadSelectUsed) {
        try {
            Map<String, Object> sqlParams = getDataObjectMap(dataMetaData, symmetricDialect, true);
            sqlParams.put("NODE_GROUP_ID", dataMetaData.getRouter().getNodeGroupLink().getTargetNodeGroupId());
            sqlParams.put("EXTERNAL_DATA", dataMetaData.getData().getExternalData());
            ISqlTemplate template = symmetricDialect.getPlatform().getSqlTemplate();
            List<String> ids = template.query(String.format("%s%s", sql, subSelect), new StringMapper(), sqlParams);
            if (ids != null) {
                nodeIds = new HashSet<String>(ids);
            }
        } catch (InvalidSqlException ex) {
            log.error("The subselect expression was invalid for the {} subselect router for the '{}' event for table '{}'", new Object[] { dataMetaData.getRouter().getRouterId(), dataMetaData.getData().getDataEventType().name(), dataMetaData.getData().getTableName() });
            throw ex;
        }
    } else if (initialLoadSelectUsed) {
        nodeIds = toNodeIds(nodes, null);
    } else {
        throw new InvalidSqlException("The subselect expression is missing for the %s router", dataMetaData.getRouter().getRouterId());
    }
    return nodeIds;
}
Also used : StringMapper(org.jumpmind.db.sql.mapper.StringMapper) ISqlTemplate(org.jumpmind.db.sql.ISqlTemplate) InvalidSqlException(org.jumpmind.db.sql.InvalidSqlException)

Example 29 with ISqlTemplate

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

the class GroupletService method deleteGrouplet.

public void deleteGrouplet(Grouplet grouplet) {
    List<GroupletLink> links = grouplet.getGroupletLinks();
    for (GroupletLink link : links) {
        deleteGroupletLink(grouplet, link);
    }
    List<TriggerRouterGrouplet> triggerRouters = grouplet.getTriggerRouterGrouplets();
    for (TriggerRouterGrouplet triggerRouterGrouplet : triggerRouters) {
        deleteTriggerRouterGrouplet(grouplet, triggerRouterGrouplet);
    }
    ISqlTemplate sqlTemplate = platform.getSqlTemplate();
    sqlTemplate.update(getSql("deleteGroupletSql"), new Object[] { grouplet.getGroupletId() }, new int[] { Types.VARCHAR });
}
Also used : ISqlTemplate(org.jumpmind.db.sql.ISqlTemplate) TriggerRouterGrouplet(org.jumpmind.symmetric.model.TriggerRouterGrouplet) GroupletLink(org.jumpmind.symmetric.model.GroupletLink)

Example 30 with ISqlTemplate

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

the class GroupletService method deleteGroupletLink.

public void deleteGroupletLink(Grouplet grouplet, GroupletLink link) {
    ISqlTemplate sqlTemplate = platform.getSqlTemplate();
    sqlTemplate.update(getSql("deleteGroupletLinkSql"), new Object[] { grouplet.getGroupletId(), link.getExternalId() }, new int[] { Types.VARCHAR, Types.VARCHAR });
}
Also used : ISqlTemplate(org.jumpmind.db.sql.ISqlTemplate)

Aggregations

ISqlTemplate (org.jumpmind.db.sql.ISqlTemplate)35 Test (org.junit.Test)8 Row (org.jumpmind.db.sql.Row)7 Date (java.util.Date)6 IDatabasePlatform (org.jumpmind.db.platform.IDatabasePlatform)5 ISqlTransaction (org.jumpmind.db.sql.ISqlTransaction)5 DataGap (org.jumpmind.symmetric.model.DataGap)5 Table (org.jumpmind.db.model.Table)4 Column (org.jumpmind.db.model.Column)3 SqlException (org.jumpmind.db.sql.SqlException)3 DbExport (org.jumpmind.symmetric.io.data.DbExport)3 AbstractServiceTest (org.jumpmind.symmetric.service.impl.AbstractServiceTest)3 SQLException (java.sql.SQLException)2 HashMap (java.util.HashMap)2 HashSet (java.util.HashSet)2 Map (java.util.Map)2 Database (org.jumpmind.db.model.Database)2 DmlStatement (org.jumpmind.db.sql.DmlStatement)2 ISqlRowMapper (org.jumpmind.db.sql.ISqlRowMapper)2 SymmetricException (org.jumpmind.symmetric.SymmetricException)2