/** * Tunes CQL statement execution options (consistency level, fetch option and etc.). * * @param statement Statement. * @return Modified statement. */ private Statement tuneStatementExecutionOptions(Statement statement) { String qry = ""; if (statement instanceof BoundStatement) qry = ((BoundStatement)statement).preparedStatement().getQueryString().trim().toLowerCase(); else if (statement instanceof PreparedStatement) qry = ((PreparedStatement)statement).getQueryString().trim().toLowerCase(); boolean readStatement = qry.startsWith("select"); boolean writeStatement = statement instanceof Batch || statement instanceof BatchStatement || qry.startsWith("insert") || qry.startsWith("delete") || qry.startsWith("update"); if (readStatement && readConsistency != null) statement.setConsistencyLevel(readConsistency); if (writeStatement && writeConsistency != null) statement.setConsistencyLevel(writeConsistency); if (fetchSize != null) statement.setFetchSize(fetchSize); return statement; }
if (statement instanceof BoundStatement) { BoundStatement bs = ((BoundStatement) statement); md.update(bs.preparedStatement().getQueryString().getBytes()); values = bs.wrapper.values; } else {
protected int appendParameters(BoundStatement statement, StringBuilder buffer, int remaining) { if (remaining == 0) return 0; ColumnDefinitions metadata = statement.preparedStatement().getVariables(); int numberOfParameters = metadata.size(); if (numberOfParameters > 0) { List<ColumnDefinitions.Definition> definitions = metadata.asList(); int numberOfLoggedParameters; if (remaining == -1) { numberOfLoggedParameters = numberOfParameters; } else { numberOfLoggedParameters = Math.min(remaining, numberOfParameters); remaining -= numberOfLoggedParameters; } for (int i = 0; i < numberOfLoggedParameters; i++) { if (buffer.length() == 0) buffer.append(" ["); else buffer.append(", "); String value = statement.isSet(i) ? parameterValueAsString(definitions.get(i), statement.wrapper.values[i]) : "<UNSET>"; buffer.append(String.format("%s:%s", metadata.getName(i), value)); } if (numberOfLoggedParameters < numberOfParameters) { buffer.append(FURTHER_PARAMS_OMITTED); } } return remaining; }
assert statement instanceof BoundStatement; BoundStatement bs = (BoundStatement) statement; bs.preparedStatement().getPreparedId().resultSetMetadata = new PreparedId.PreparedMetadata( rows.metadata.metadataId, rows.metadata.columns);
remaining = append( ((BoundStatement) statement).preparedStatement().getQueryString().trim(), buffer, remaining);
columnDefs = bs.preparedStatement().getPreparedId().resultSetMetadata.variables; } else { if (newMetadataId != null) { BoundStatement bs = ((BoundStatement) actualStatement); PreparedId preparedId = bs.preparedStatement().getPreparedId(); preparedId.resultSetMetadata = new PreparedId.PreparedMetadata(newMetadataId, columnDefs);
try { size += CBUtil.sizeOfShortBytes(preparedStatement().getPreparedId().boundValuesMetadata.id.bytes); if (ProtocolFeature.PREPARED_METADATA_CHANGES.isSupportedBy(protocolVersion)) { size += CBUtil.sizeOfShortBytes(preparedStatement().getPreparedId().resultSetMetadata.id.bytes);
int findUnsetPosition(BoundStatement bs) { int size = bs.preparedStatement().getVariables().size(); for (int i = 0; i < size; i++) if (!bs.isSet(i)) return i; throw new IllegalArgumentException("found no unset position"); }
@Test(groups = "short") public void should_update_statement_id_when_metadata_changed_across_executions() { // given PreparedStatement ps = session().prepare("SELECT * FROM prepared_statement_invalidation_test WHERE a = ?"); MD5Digest idBefore = ps.getPreparedId().resultSetMetadata.id; // when session().execute("ALTER TABLE prepared_statement_invalidation_test ADD d int"); BoundStatement bs = ps.bind(1); ResultSet rows = session().execute(bs); // then MD5Digest idAfter = ps.getPreparedId().resultSetMetadata.id; assertThat(idBefore).isNotEqualTo(idAfter); assertThat(ps.getPreparedId().resultSetMetadata.variables) .hasSize(4) .containsVariable("d", DataType.cint()); assertThat(bs.preparedStatement().getPreparedId().resultSetMetadata.variables) .hasSize(4) .containsVariable("d", DataType.cint()); assertThat(rows.getColumnDefinitions()).hasSize(4).containsVariable("d", DataType.cint()); }
@Override public QueryBinder<ENTITY> setDate(String name, Date v) { for (BoundStatement statement : statements.values()) { if (statement.preparedStatement().getVariables().contains(name)) { statement.setDate(name, v); } } return this; }
@Override public QueryBinder<ENTITY> setFloat(String name, float v) { for (BoundStatement statement : statements.values()) { if (statement.preparedStatement().getVariables().contains(name)) { statement.setFloat(name, v); } } return this; }
@Override public QueryBinder<ENTITY> setBytesUnsafe(String name, ByteBuffer v) { for (BoundStatement statement : statements.values()) { if (statement.preparedStatement().getVariables().contains(name)) { statement.setBytesUnsafe(name, v); } } return this; }
@Override public QueryBinder<ENTITY> setBool(String name, boolean v) { for (BoundStatement statement : statements.values()) { if (statement.preparedStatement().getVariables().contains(name)) { statement.setBool(name, v); } } return this; }
@Override public QueryBinder<ENTITY> setInt(String name, int v) { for (BoundStatement statement : statements.values()) { if (statement.preparedStatement().getVariables().contains(name)) { statement.setInt(name, v); } } return this; }
@Override public QueryBinder<ENTITY> setLong(String name, long v) { for (BoundStatement statement : statements.values()) { if (statement.preparedStatement().getVariables().contains(name)) { statement.setLong(name, v); } } return this; }
@Override public QueryBinder<ENTITY> setDouble(String name, double v) { for (BoundStatement statement : statements.values()) { if (statement.preparedStatement().getVariables().contains(name)) { statement.setDouble(name, v); } } return this; }
@Override public QueryBinder<ENTITY> setDecimal(String name, BigDecimal v) { for (BoundStatement statement : statements.values()) { if (statement.preparedStatement().getVariables().contains(name)) { statement.setDecimal(name, v); } } return this; }
@Override public QueryBinder<ENTITY> setString(String name, String v) { for (BoundStatement statement : statements.values()) { if (statement.preparedStatement().getVariables().contains(name)) { statement.setString(name, v); } } return this; }
@Override public <K, V> QueryBinder<ENTITY> setMap(String name, Map<K, V> v) { for (BoundStatement statement : statements.values()) { if (statement.preparedStatement().getVariables().contains(name)) { statement.setMap(name, v); } } return this; }
@Override <T> void executeQuery(ExecutionTracer tracer, QueryBinderImpl<T> queryBinder, ReadFutureImpl<T> futures) { BoundStatement bStmt = queryBinder.statementFor(type); if (bStmt != null) { if (LOGGER.isTraceEnabled()) { LOGGER.trace("Submitting query for {} : {}", type, bStmt.preparedStatement().getQueryString()); } if (tracer != null) { tracer.onBeginQuery(futures.session, this, bStmt); } futures.addResultSetFuture(this, queryBinder.session.executeAsync(bStmt), queryBinder.readColumnsFor(type)); } }