mirror of https://github.com/apache/nifi.git
NIFI-977: Allow SQL Data Types with numerals that are negative
This commit is contained in:
parent
49ee06b0a2
commit
84db372538
|
@ -74,19 +74,19 @@ import org.apache.nifi.stream.io.StreamUtils;
|
|||
+ "with the naming convention sql.args.N.type and sql.args.N.value, where N is a positive integer. The sql.args.N.type is expected to be "
|
||||
+ "a number indicating the JDBC Type. The content of the FlowFile is expected to be in UTF-8 format.")
|
||||
@ReadsAttributes({
|
||||
@ReadsAttribute(attribute="fragment.identifier", description="If the <Support Fragment Transactions> property is true, this attribute is used to determine whether or "
|
||||
@ReadsAttribute(attribute = "fragment.identifier", description = "If the <Support Fragment Transactions> property is true, this attribute is used to determine whether or "
|
||||
+ "not two FlowFiles belong to the same transaction."),
|
||||
@ReadsAttribute(attribute="fragment.count", description="If the <Support Fragment Transactions> property is true, this attribute is used to determine how many FlowFiles "
|
||||
@ReadsAttribute(attribute = "fragment.count", description = "If the <Support Fragment Transactions> property is true, this attribute is used to determine how many FlowFiles "
|
||||
+ "are needed to complete the transaction."),
|
||||
@ReadsAttribute(attribute="fragment.index", description="If the <Support Fragment Transactions> property is true, this attribute is used to determine the order that the FlowFiles "
|
||||
@ReadsAttribute(attribute = "fragment.index", description = "If the <Support Fragment Transactions> property is true, this attribute is used to determine the order that the FlowFiles "
|
||||
+ "in a transaction should be evaluated."),
|
||||
@ReadsAttribute(attribute="sql.args.N.type", description="Incoming FlowFiles are expected to be parameterized SQL statements. The type of each Parameter is specified as an integer "
|
||||
@ReadsAttribute(attribute = "sql.args.N.type", description = "Incoming FlowFiles are expected to be parameterized SQL statements. The type of each Parameter is specified as an integer "
|
||||
+ "that represents the JDBC Type of the parameter."),
|
||||
@ReadsAttribute(attribute="sql.args.N.value", description="Incoming FlowFiles are expected to be parameterized SQL statements. The value of the Parameters are specified as "
|
||||
@ReadsAttribute(attribute = "sql.args.N.value", description = "Incoming FlowFiles are expected to be parameterized SQL statements. The value of the Parameters are specified as "
|
||||
+ "sql.args.1.value, sql.args.2.value, sql.args.3.value, and so on. The type of the sql.args.1.value Parameter is specified by the sql.args.1.type attribute.")
|
||||
})
|
||||
@WritesAttributes({
|
||||
@WritesAttribute(attribute="sql.generated.key", description="If the database generated a key for an INSERT statement and the Obtain Generated Keys property is set to true, "
|
||||
@WritesAttribute(attribute = "sql.generated.key", description = "If the database generated a key for an INSERT statement and the Obtain Generated Keys property is set to true, "
|
||||
+ "this attribute will be added to indicate the generated key, if possible. This feature is not supported by all database vendors.")
|
||||
})
|
||||
public class PutSQL extends AbstractProcessor {
|
||||
|
@ -144,7 +144,7 @@ public class PutSQL extends AbstractProcessor {
|
|||
.build();
|
||||
|
||||
private static final Pattern SQL_TYPE_ATTRIBUTE_PATTERN = Pattern.compile("sql\\.args\\.(\\d+)\\.type");
|
||||
private static final Pattern NUMBER_PATTERN = Pattern.compile("\\d+");
|
||||
private static final Pattern NUMBER_PATTERN = Pattern.compile("-?\\d+");
|
||||
|
||||
private static final String FRAGMENT_ID_ATTR = "fragment.identifier";
|
||||
private static final String FRAGMENT_INDEX_ATTR = "fragment.index";
|
||||
|
@ -300,7 +300,7 @@ public class PutSQL extends AbstractProcessor {
|
|||
int failureCount = 0;
|
||||
int successCount = 0;
|
||||
int retryCount = 0;
|
||||
for (int i=0; i < updateCounts.length; i++) {
|
||||
for (int i = 0; i < updateCounts.length; i++) {
|
||||
final int updateCount = updateCounts[i];
|
||||
final FlowFile flowFile = batchFlowFiles.get(i);
|
||||
if (updateCount == Statement.EXECUTE_FAILED) {
|
||||
|
|
|
@ -103,6 +103,7 @@ public class TestPutSQL {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testInsertWithGeneratedKeys() throws InitializationException, ProcessException, SQLException, IOException {
|
||||
final TestRunner runner = TestRunners.newTestRunner(PutSQL.class);
|
||||
|
@ -256,6 +257,41 @@ public class TestPutSQL {
|
|||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testUsingSqlDataTypesWithNegativeValues() throws InitializationException, ProcessException, SQLException, IOException {
|
||||
final TestRunner runner = TestRunners.newTestRunner(PutSQL.class);
|
||||
final File tempDir = folder.getRoot();
|
||||
final File dbDir = new File(tempDir, "db");
|
||||
final DBCPService service = new MockDBCPService(dbDir.getAbsolutePath());
|
||||
runner.addControllerService("dbcp", service);
|
||||
runner.enableControllerService(service);
|
||||
|
||||
try (final Connection conn = service.getConnection()) {
|
||||
try (final Statement stmt = conn.createStatement()) {
|
||||
stmt.executeUpdate("CREATE TABLE PERSONS (id integer primary key, name varchar(100), code bigint)");
|
||||
}
|
||||
}
|
||||
|
||||
runner.setProperty(PutSQL.CONNECTION_POOL, "dbcp");
|
||||
final Map<String, String> attributes = new HashMap<>();
|
||||
attributes.put("sql.args.1.type", "-5");
|
||||
attributes.put("sql.args.1.value", "84");
|
||||
runner.enqueue("INSERT INTO PERSONS (ID, NAME, CODE) VALUES (1, 'Mark', ?)".getBytes(), attributes);
|
||||
runner.run();
|
||||
|
||||
runner.assertAllFlowFilesTransferred(PutSQL.REL_SUCCESS, 1);
|
||||
|
||||
try (final Connection conn = service.getConnection()) {
|
||||
try (final Statement stmt = conn.createStatement()) {
|
||||
final ResultSet rs = stmt.executeQuery("SELECT * FROM PERSONS");
|
||||
assertTrue(rs.next());
|
||||
assertEquals(1, rs.getInt(1));
|
||||
assertEquals("Mark", rs.getString(2));
|
||||
assertEquals(84, rs.getInt(3));
|
||||
assertFalse(rs.next());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testStatementsWithPreparedParameters() throws InitializationException, ProcessException, SQLException, IOException {
|
||||
|
|
Loading…
Reference in New Issue