@Override protected String generateDropChangeRaw(Connection conn, Change change) { return "DROP TYPE" + " " + getDbPlatform().getSubschemaPrefix(change.getPhysicalSchema(env)) + change.getObjectName(); } }
ToStringBuilder toStringBuilder() { return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE) .append(this.getSchema()) .append(this.getChangeName()) .append(this.getObjectName()) .append(this.getChangeType()) .append(this.getConvertedContent()) .append(this.getContentHash()) .append(this.getOrderWithinObject()) ; }
/** * This getDbObjectKey() string concatenation is a kludge until we refactor the DB object stuff itself out to its * own object */ public String getDbObjectKey() { return this.getSchema() + ":" + this.getObjectName(); }
@Override public String getCommandDescription() { return "Artifact Hash is mismatching for : " + this.source.getDisplayString() + "; Deployed Version - " + this.deployed.getContentHash() + "; SourceVersion - " + this.source.getContentHash() + "\n\t* Please remeber not to edit already-deployed changes in place, " + "and instead add a new Change definition" + this.source.getContentHash(); }
public boolean equalsOnContent(Change other) { return new EqualsBuilder() .append(this.getSchema(), other.getSchema()) .append(this.getObjectName(), other.getObjectName()) .append(this.getChangeType(), other.getChangeType()) .append(this.getContentHash(), other.getContentHash()) .isEquals(); }
private void insertNewChangeInternal(Connection conn, Change change, DeployExecution deployExecution) { JdbcHelper jdbcTemplate = sqlExecutor.getJdbcTemplate(); Timestamp currentTimestamp = getCurrentTimestamp(); jdbcTemplate.update( conn, "INSERT INTO " + env.getPlatform().getSchemaPrefix(change.getPhysicalSchema(env)) + dbChangeTable + " (ARTFTYPE, DBSCHEMA, ACTIVE, CHANGETYPE, CONTENTHASH, " + changeNameColumn + ", OBJECTNAME, " + rollbackContentColumn + ", " + deployUserIdColumn + ", " + timeInsertedColumn + ", " + timeUpdatedColumn + ", " + insertDeployExecutionIdColumn + ", " + updateDeployExecutionIdColumn + ") " + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" , change instanceof ChangeIncremental ? "I" : "R" , change.getSchema() , change.isActive() ? 1 : 0 , change.getChangeType().getName() , change.getContentHash() , change.getChangeName() , change.getObjectName() , change.getRollbackContent() , deployUserId , currentTimestamp , currentTimestamp , deployExecution.getId() , deployExecution.getId() ); }
when(artifact.getPhysicalSchema(env)).thenReturn(new PhysicalSchema(schema)); when(artifact.getObjectName()).thenReturn(table); when(artifact.getMetadataAttribute(TextMarkupDocumentReader.ATTR_UPDATE_TIME_COLUMN)).thenReturn( "UPDATETIMEFIELD"); when(artifact.getConvertedContent()).thenReturn( "AID^BID^STRINGFIELD^TIMESTAMPFIELD^CID^UPDATETIMEFIELD\n" + "1^2^AB,C^2012-01-01 12:12:12^^(null)\n" +
@Test public void testMissingPrimaryKeys() { expectedEx.expect(IllegalStateException.class); expectedEx.expectMessage("CSV-based static data loads require primary key or unique index on table " + table.toUpperCase() + ", but none found"); this.jdbc.execute(conn, "CREATE TABLE " + schema + "." + table + " (\n" + "AID INT NOT NULL,\n" + "BID INT NOT NULL,\n" + ")\n"); DbEnvironment env = new DbEnvironment(); env.setPlatform(PLATFORM); Change artifact = mock(Change.class); when(artifact.getPhysicalSchema(env)).thenReturn(new PhysicalSchema(schema)); when(artifact.getObjectName()).thenReturn(table); when(artifact.getConvertedContent()).thenReturn( "AID,BID\n" + "1,2\n" + "2,3\n" + "3,4\n" + "4,4\n" ); CsvStaticDataDeployer csvStaticDataDeployer = new CsvStaticDataDeployer(env, getSqlExecutor(), this.ds, metadataManager, new H2DbPlatform()); csvStaticDataDeployer.deployArtifact(artifact); }
private Bson getChangeFilter(Change change) { return Filters.and( Filters.eq(changeNameColumn, change.getChangeName()), Filters.eq("OBJECTNAME", change.getObjectName()) ); }
public String getDisplayString() { StringBuilder sb = new StringBuilder(); if (isRollbackActivated()) { sb.append("ROLLING BACK: "); } sb.append(String.format( "Object [%s]; ChangeName [%s]; Type [%s]; LogicalSchema [%s]" , this.getObjectName() , this.getChangeName() , this.getChangeType().getName() , this.getSchema() )); return sb.toString(); }
@Override public void value(Connection conn) { sqlExecutor.getJdbcTemplate().update( conn, "DELETE FROM " + env.getPlatform().getSchemaPrefix(change.getPhysicalSchema(env)) + dbChangeTable + " WHERE " + changeNameColumn + " = ? AND OBJECTNAME = ?" , change.getChangeName(), change.getObjectName()); } });
@Override public void value(Connection conn) { sqlExecutor.getJdbcTemplate().update( conn, "DELETE FROM " + env.getPlatform().getSchemaPrefix(change.getPhysicalSchema(env)) + dbChangeTable + " WHERE OBJECTNAME = ? AND CHANGETYPE = ?", change.getObjectName(), change.getChangeType().getName() ); // TODO delete this eventually sqlExecutor.getJdbcTemplate().update( conn, "DELETE FROM " + env.getPlatform().getSchemaPrefix(change.getPhysicalSchema(env)) + dbChangeTable + " WHERE OBJECTNAME = ? AND CHANGETYPE = ?", change.getObjectName(), "GRANT" ); } });
@Override public void insertNewChange(final Change change, final DeployExecution deployExecution) { sqlExecutor.executeWithinContext(change.getPhysicalSchema(env), new Procedure<Connection>() { @Override public void value(Connection conn) { insertNewChangeInternal(conn, change, deployExecution); } }); }
@Override public String valueOf(Change change) { return change.getObjectName(); } }).collect(env.getPlatform().convertDbObjectName()).toSet();
@Override public void value(Connection conn) { String dropSql = null; try { dropSql = getDropSql(conn, change); LOG.info("Dropping object with SQL: {}", dropSql); for (String drop : MultiLineStringSplitter.createSplitterOnSpaceAndLine("GO").valueOf(dropSql)) { if (!StringUtils.isBlank(drop)) { sqlExecutor.getJdbcTemplate().update(conn, drop); } } } catch (RuntimeException exc) { if (dropForRecreate) { LOG.debug("Change type {} for Object {} is being deployed anew as this sql did not execute: {}", change.getChangeType(), change.getObjectName(), dropSql); } else { throw exc; } } } });
@Override public void deploy(Change change, CommandExecutionContext cec) { MongoDatabase database = mongoClient.getDatabase(change.getPhysicalSchema(env).getPhysicalName()); final BasicDBObject command = new BasicDBObject(); command.put("eval", change.getConvertedContent()); Document result = database.runCommand(command); LOG.info("Result: {}", result); }
@Override public boolean accept(Change it) { return it.getChangeType().equals(changeType); } }), false);
void deployArtifact(Connection conn, Change artifact) { MutableList<String> sqls = MultiLineStringSplitter.createSplitterOnSpaceAndLine("GO").valueOf(artifact.getConvertedContent()); int index = 0; for (String sql : sqls) { index++; if (StringUtils.isBlank(sql)) { LOG.debug("Skipping blank sql"); } else { LOG.debug("Executing change #{} in the artifact", index); try { dialect.doTryBlockForArtifact(conn, this.sqlExecutor, artifact); this.sqlExecutor.getJdbcTemplate().update(conn, sql); } catch (DataAccessException e) { throw new DeployerRuntimeException("Could not execute DDL:\nfor artifact [[[" + artifact.getDisplayString() + "]]] while executing SQL: [[[\n" + sql + "\n]]]", e); } finally { dialect.doFinallyBlockForArtifact(conn, this.sqlExecutor, artifact); } } } } }
@Override public String valueOf(Change c) { return c.getDbObjectKey() + ":" + c.getChangeName(); } }).castToList(), containsInAnyOrder(
public PhysicalSchema getPhysicalSchema(Environment env) { return env.getPhysicalSchema(this.getSchema()); }