/*
* 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.internal.jdbc2;
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.cache.CachePeekMode;
import org.apache.ignite.internal.processors.query.IgniteSQLException;
import org.apache.ignite.testframework.GridTestUtils;
/**
* Statement test.
*/
public class JdbcInsertStatementSelfTest extends JdbcAbstractDmlStatementSelfTest {
/** 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 " +
"(?, ?, ?, ?, ?), (?, ?, ?, ?, ?)";
/** Statement. */
private Statement stmt;
/** Prepared statement. */
private PreparedStatement prepStmt;
/** {@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());
}
/** {@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;
}
}
}
grid(0).cache(DEFAULT_CACHE_NAME).clear();
assertEquals(0, grid(0).cache(DEFAULT_CACHE_NAME).size(CachePeekMode.ALL));
super.afterTest();
if (stmt != null && !stmt.isClosed())
stmt.close();
if (prepStmt != null && !prepStmt.isClosed())
prepStmt.close();
conn.close();
assertTrue(prepStmt.isClosed());
assertTrue(stmt.isClosed());
assertTrue(conn.isClosed());
}
/**
* @throws SQLException If failed.
*/
public void testExecuteUpdate() throws SQLException {
int res = stmt.executeUpdate(SQL);
assertEquals(3, res);
}
/**
* @throws SQLException If failed.
*/
public void testExecute() throws SQLException {
boolean res = stmt.execute(SQL);
assertEquals(false, res);
}
/**
*
*/
public void testDuplicateKeys() {
jcache(0).put("p2", new Person(2, "Joe", "Black", 35));
Throwable reason = GridTestUtils.assertThrows(log, new Callable<Object>() {
/** {@inheritDoc} */
@Override public Object call() throws Exception {
return stmt.execute(SQL);
}
}, SQLException.class, null);
assertNotNull(reason.getCause());
reason = reason.getCause().getCause();
assertNotNull(reason);
assertEquals(IgniteSQLException.class, reason.getClass());
assertEquals("Failed to INSERT some keys because they are already in cache [keys=[p2]]", reason.getMessage());
assertEquals(3, jcache(0).withKeepBinary().getAll(new HashSet<>(Arrays.asList("p1", "p2", "p3"))).size());
}
}