blob: 44f3ddad44f50c5acb0c884f2e33bce7f7a03f23 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ignite.jdbc.thin;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Arrays;
import java.util.HashSet;
import java.util.concurrent.Callable;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.testframework.GridTestUtils;
import org.apache.ignite.testframework.ListeningTestLogger;
import org.apache.ignite.testframework.LogListener;
import org.junit.Test;
/**
* Statement test.
*/
public class JdbcThinInsertStatementSelfTest extends JdbcThinAbstractDmlStatementSelfTest {
/** SQL query. */
private static final String SQL = "insert into Person(_key, id, firstName, lastName, age) values " +
"('p1', 1, 'John', 'White', 25), " +
"('p2', 2, 'Joe', 'Black', 35), " +
"('p3', 3, 'Mike', 'Green', 40)";
/** SQL query. */
private static final String SQL_PREPARED = "insert into Person(_key, id, firstName, lastName, age) values " +
"(?, ?, ?, ?, ?), (?, ?, ?, ?, ?), (?, ?, ?, ?, ?)";
/** Test logger. */
private static ListeningTestLogger srvLog;
/** Arguments for prepared statement. */
private final Object[][] args = new Object[][] {
{"p1", 1, "John", "White", 25},
{"p3", 3, "Mike", "Green", 40},
{"p2", 2, "Joe", "Black", 35}
};
/** Statement. */
private Statement stmt;
/** Prepared statement. */
private PreparedStatement prepStmt;
/** {@inheritDoc} */
@Override protected void beforeTestsStarted() throws Exception {
srvLog = new ListeningTestLogger(log);
super.beforeTestsStarted();
}
/** {@inheritDoc} */
@Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
return super.getConfiguration(igniteInstanceName)
.setGridLogger(srvLog);
}
/** {@inheritDoc} */
@Override protected void beforeTest() throws Exception {
super.beforeTest();
stmt = conn.createStatement();
prepStmt = conn.prepareStatement(SQL_PREPARED);
assertNotNull(stmt);
assertFalse(stmt.isClosed());
assertNotNull(prepStmt);
assertFalse(prepStmt.isClosed());
int paramCnt = 1;
for (Object[] arg : args) {
prepStmt.setString(paramCnt++, (String)arg[0]);
prepStmt.setInt(paramCnt++, (Integer)arg[1]);
prepStmt.setString(paramCnt++, (String)arg[2]);
prepStmt.setString(paramCnt++, (String)arg[3]);
prepStmt.setInt(paramCnt++, (Integer)arg[4]);
}
}
/** {@inheritDoc} */
@Override protected void afterTest() throws Exception {
try (Statement selStmt = conn.createStatement()) {
assertTrue(selStmt.execute(SQL_SELECT));
ResultSet rs = selStmt.getResultSet();
assert rs != null;
while (rs.next()) {
int id = rs.getInt("id");
switch (id) {
case 1:
assertEquals("p1", rs.getString("_key"));
assertEquals("John", rs.getString("firstName"));
assertEquals("White", rs.getString("lastName"));
assertEquals(25, rs.getInt("age"));
break;
case 2:
assertEquals("p2", rs.getString("_key"));
assertEquals("Joe", rs.getString("firstName"));
assertEquals("Black", rs.getString("lastName"));
assertEquals(35, rs.getInt("age"));
break;
case 3:
assertEquals("p3", rs.getString("_key"));
assertEquals("Mike", rs.getString("firstName"));
assertEquals("Green", rs.getString("lastName"));
assertEquals(40, rs.getInt("age"));
break;
case 4:
assertEquals("p4", rs.getString("_key"));
assertEquals("Leah", rs.getString("firstName"));
assertEquals("Grey", rs.getString("lastName"));
assertEquals(22, rs.getInt("age"));
break;
default:
assert false : "Invalid ID: " + id;
}
}
}
if (stmt != null && !stmt.isClosed())
stmt.close();
if (prepStmt != null && !prepStmt.isClosed())
prepStmt.close();
assertTrue(prepStmt.isClosed());
assertTrue(stmt.isClosed());
super.afterTest();
}
/**
* @throws SQLException If failed.
*/
@Test
public void testExecuteUpdate() throws SQLException {
assertEquals(3, stmt.executeUpdate(SQL));
}
/**
* @throws SQLException If failed.
*/
@Test
public void testPreparedExecuteUpdate() throws SQLException {
assertEquals(3, prepStmt.executeUpdate());
}
/**
* @throws SQLException If failed.
*/
@Test
public void testExecute() throws SQLException {
assertFalse(stmt.execute(SQL));
}
/**
* @throws SQLException If failed.
*/
@Test
public void testPreparedExecute() throws SQLException {
assertFalse(prepStmt.execute());
}
/**
*
*/
@Test
public void testDuplicateKeys() throws InterruptedException {
jcache(0).put("p2", new Person(2, "Joe", "Black", 35));
LogListener lsnr = LogListener
.matches("Failed to execute SQL query")
.build();
srvLog.registerListener(lsnr);
GridTestUtils.assertThrowsAnyCause(log, new Callable<Object>() {
/** {@inheritDoc} */
@Override public Object call() throws Exception {
return stmt.execute(SQL);
}
}, SQLException.class,
"Failed to INSERT some keys because they are already in cache [keys=[p2]]");
assertFalse(lsnr.check(1000L));
assertEquals(3, jcache(0).withKeepBinary().getAll(new HashSet<>(Arrays.asList("p1", "p2", "p3"))).size());
}
}