Skip to content

Commit 6d9be1f

Browse files
committed
jdbc: fix NPE in update
Updated constants to be in sync with tarantool IPROTO. Added integration tests for the working JDBC functionality. Fixed travis script to use tarantool 2.0 which is required for SQL. Fixed failing user permission calls in tarantool initialization script. Closes tarantool#39
1 parent 04078db commit 6d9be1f

9 files changed

+608
-3
lines changed

pom.xml

+13
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,19 @@
5050
<artifactId>maven-surefire-plugin</artifactId>
5151
<version>2.22.0</version>
5252
</plugin>
53+
<plugin>
54+
<groupId>org.apache.maven.plugins</groupId>
55+
<artifactId>maven-failsafe-plugin</artifactId>
56+
<version>2.22.0</version>
57+
<executions>
58+
<execution>
59+
<goals>
60+
<goal>integration-test</goal>
61+
<goal>verify</goal>
62+
</goals>
63+
</execution>
64+
</executions>
65+
</plugin>
5366
</plugins>
5467
</build>
5568

src/main/java/org/tarantool/Key.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@ public enum Key implements Callable<Integer> {
1818
UPSERT_OPS(0x28),
1919
DATA(0x30), ERROR(0x31),
2020

21-
SQL_FIELD_NAME(0x29),
21+
SQL_FIELD_NAME(0),
2222
SQL_METADATA(0x32),
2323
SQL_TEXT(0x40),
2424
SQL_BIND(0x41),
2525
SQL_OPTIONS(0x42),
26-
SQL_INFO(0x43),
27-
SQL_ROW_COUNT(0x44);
26+
SQL_INFO(0x42),
27+
SQL_ROW_COUNT(0);
2828

2929
int id;
3030

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
package org.tarantool.jdbc;
2+
3+
import org.junit.jupiter.api.AfterAll;
4+
import org.junit.jupiter.api.AfterEach;
5+
import org.junit.jupiter.api.BeforeAll;
6+
import org.junit.jupiter.api.BeforeEach;
7+
import org.tarantool.TarantoolConnection;
8+
9+
import java.io.IOException;
10+
import java.net.InetSocketAddress;
11+
import java.net.Socket;
12+
import java.sql.Connection;
13+
import java.sql.DriverManager;
14+
import java.sql.SQLException;
15+
import java.util.Arrays;
16+
import java.util.Collections;
17+
import java.util.List;
18+
19+
import static org.junit.jupiter.api.Assertions.assertNotNull;
20+
21+
//mvn -DtntHost=localhost -DtntPort=3301 -DtntUser=test -DtntPass=test verify
22+
public abstract class AbstractJdbcIT {
23+
private static final String host = System.getProperty("tntHost", "localhost");
24+
private static final Integer port = Integer.valueOf(System.getProperty("tntPort", "3301"));
25+
private static final String user = System.getProperty("tntUser", "test");
26+
private static final String pass = System.getProperty("tntPass", "test");
27+
private static String URL = String.format("tarantool://%s:%d?user=%s&password=%s", host, port, user, pass);
28+
29+
private static String[] initSql = new String[] {
30+
"DROP TABLE IF EXISTS test",
31+
"DROP TABLE IF EXISTS test_types",
32+
33+
"CREATE TABLE test(id INT PRIMARY KEY, val VARCHAR(100))",
34+
"INSERT INTO test VALUES (1, 'one'), (2, 'two'), (3, 'three')",
35+
36+
"CREATE TABLE test_types(" +
37+
"f1 INT PRIMARY KEY, " +
38+
"f2 CHAR(4), " +
39+
"f3 VARCHAR(100), " +
40+
"f4 LONGVARCHAR(100), " +
41+
"f5 NUMERIC, " +
42+
"f6 DECIMAL, " +
43+
"f7 BIT, " +
44+
"f8 TINYINT, " +
45+
"f9 SMALLINT, " +
46+
"f10 INTEGER, " +
47+
"f11 BIGINT," +
48+
"f12 REAL, " +
49+
"f13 FLOAT, " +
50+
"f14 BINARY(4), " +
51+
"f15 VARBINARY(128), " +
52+
"f16 LONGVARBINARY(2048), " +
53+
"f17 DATE, " +
54+
"f18 TIME, " +
55+
"f19 TIMESTAMP)",
56+
57+
"INSERT INTO test_types VALUES(" +
58+
"1," +
59+
"'abcd'," + //CHAR
60+
"'000000000000000000001'," + //VARCHAR
61+
"'0000000000000000000000000000000001'," + //LONGVARCHAR
62+
"100," + // NUMERIC
63+
"100.1," + // DECIMAL
64+
"1," + //BIT
65+
"7," + //TINYINT
66+
"1000," + //SMALLINT
67+
"100," + //INTEGER
68+
"100000000000000000," + //BIGINT
69+
"-100.2," + //REAL
70+
"100.3," + //FLOAT
71+
"X'01020304'," + //BINARY
72+
"X'0102030405'," +//VARBINARY
73+
"X'010203040506'," + //LONGVARBINARY
74+
"'1983-03-14'," + //DATE
75+
"'12:01:06'," + //TIME
76+
"129479994)" //TIMESTAMP
77+
};
78+
79+
private static String[] cleanSql = new String[] {
80+
"DROP TABLE IF EXISTS test",
81+
"DROP TABLE IF EXISTS test_types"
82+
};
83+
84+
Connection conn;
85+
86+
@BeforeAll
87+
public static void setupEnv() throws Exception {
88+
sqlExec(initSql);
89+
}
90+
91+
@AfterAll
92+
public static void teardownEnv() throws Exception {
93+
sqlExec(cleanSql);
94+
}
95+
96+
@BeforeEach
97+
public void setUpConnection() throws SQLException {
98+
conn = DriverManager.getConnection(URL);
99+
assertNotNull(conn);
100+
}
101+
102+
@AfterEach
103+
public void tearDownConnection() throws SQLException {
104+
if (conn != null && !conn.isClosed())
105+
conn.close();
106+
}
107+
108+
private static void sqlExec(String[] text) throws IOException {
109+
Socket socket = new Socket();
110+
try {
111+
socket.connect(new InetSocketAddress(host, port));
112+
TarantoolConnection con = new TarantoolConnection(user, pass, socket);
113+
try {
114+
for (String cmd : text)
115+
con.eval("box.sql.execute(\"" + cmd + "\")");
116+
}
117+
finally {
118+
con.close();
119+
socket = null;
120+
}
121+
}
122+
finally {
123+
if (socket != null)
124+
socket.close();
125+
}
126+
}
127+
128+
static List<?> getRow(String space, Object key) throws IOException {
129+
Socket socket = new Socket();
130+
try {
131+
socket.connect(new InetSocketAddress(host, port));
132+
TarantoolConnection con = new TarantoolConnection(user, pass, socket);
133+
try {
134+
List<?> l = con.select(281, 2, Arrays.asList(space.toUpperCase()), 0, 1, 0);
135+
Integer spaceId = (Integer) ((List) l.get(0)).get(0);
136+
l = con.select(spaceId, 0, Arrays.asList(key), 0, 1, 0);
137+
return (l == null || l.size() == 0) ? Collections.emptyList() : (List<?>) l.get(0);
138+
}
139+
finally {
140+
con.close();
141+
socket = null;
142+
}
143+
}
144+
finally {
145+
if (socket != null)
146+
socket.close();
147+
}
148+
}
149+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package org.tarantool.jdbc;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import java.sql.DatabaseMetaData;
6+
import java.sql.PreparedStatement;
7+
import java.sql.SQLException;
8+
import java.sql.Statement;
9+
10+
import static org.junit.jupiter.api.Assertions.assertFalse;
11+
import static org.junit.jupiter.api.Assertions.assertNotNull;
12+
import static org.junit.jupiter.api.Assertions.assertTrue;
13+
14+
public class JdbcConnectionIT extends AbstractJdbcIT {
15+
@Test
16+
public void testCreateStatement() throws SQLException {
17+
Statement stmt = conn.createStatement();
18+
assertNotNull(stmt);
19+
stmt.close();
20+
}
21+
22+
@Test
23+
public void testPrepareStatement() throws SQLException {
24+
PreparedStatement prep = conn.prepareStatement("INSERT INTO test(id, val) VALUES(?, ?)");
25+
assertNotNull(prep);
26+
prep.close();
27+
}
28+
29+
@Test
30+
public void testCloseIsClosed() throws SQLException {
31+
assertFalse(conn.isClosed());
32+
conn.close();
33+
assertTrue(conn.isClosed());
34+
conn.close();
35+
}
36+
37+
@Test
38+
public void testGetMetaData() throws SQLException {
39+
DatabaseMetaData meta = conn.getMetaData();
40+
assertNotNull(meta);
41+
}
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package org.tarantool.jdbc;
2+
3+
import org.junit.jupiter.api.Disabled;
4+
import org.junit.jupiter.api.Test;
5+
import org.junit.jupiter.api.BeforeEach;
6+
7+
import java.sql.DatabaseMetaData;
8+
import java.sql.ResultSet;
9+
import java.sql.SQLException;
10+
11+
import static org.junit.jupiter.api.Assertions.assertEquals;
12+
import static org.junit.jupiter.api.Assertions.assertFalse;
13+
import static org.junit.jupiter.api.Assertions.assertNotNull;
14+
import static org.junit.jupiter.api.Assertions.assertNull;
15+
import static org.junit.jupiter.api.Assertions.assertTrue;
16+
17+
public class JdbcDatabaseMetaDataIT extends AbstractJdbcIT {
18+
private DatabaseMetaData meta;
19+
20+
@BeforeEach
21+
public void setUp() throws Exception {
22+
meta = conn.getMetaData();
23+
}
24+
25+
@Test
26+
public void testGetTableTypes() throws SQLException {
27+
ResultSet rs = meta.getTableTypes();
28+
assertNotNull(rs);
29+
30+
assertTrue(rs.next());
31+
assertEquals("TABLE", rs.getString("TABLE_TYPE"));
32+
assertFalse(rs.next());
33+
34+
rs.close();
35+
}
36+
37+
@Test
38+
public void testGetAllTables() throws SQLException {
39+
ResultSet rs = meta.getTables(null, null, null, new String[] {"TABLE"});
40+
assertNotNull(rs);
41+
42+
assertTrue(rs.next());
43+
assertEquals("TEST", rs.getString("TABLE_NAME"));
44+
45+
assertTrue(rs.next());
46+
assertEquals("TEST_TYPES", rs.getString("TABLE_NAME"));
47+
48+
assertFalse(rs.next());
49+
50+
rs.close();
51+
}
52+
53+
@Test
54+
public void testGetTable() throws SQLException {
55+
ResultSet rs = meta.getTables(null, null, "TEST", new String[] {"TABLE"});
56+
assertNotNull(rs);
57+
assertTrue(rs.next());
58+
assertEquals("TEST", rs.getString("TABLE_NAME"));
59+
60+
assertFalse(rs.next());
61+
62+
rs.close();
63+
}
64+
65+
@Test
66+
public void testGetColumns() throws SQLException {
67+
ResultSet rs = meta.getColumns(null, null, "TEST", null);
68+
assertNotNull(rs);
69+
70+
assertTrue(rs.next());
71+
72+
assertEquals("TEST", rs.getString("TABLE_NAME"));
73+
assertEquals("ID", rs.getString("COLUMN_NAME"));
74+
assertEquals(1, rs.getInt("ORDINAL_POSITION"));
75+
76+
assertTrue(rs.next());
77+
78+
assertEquals("TEST", rs.getString("TABLE_NAME"));
79+
assertEquals("VAL", rs.getString("COLUMN_NAME"));
80+
assertEquals(2, rs.getInt("ORDINAL_POSITION"));
81+
82+
assertFalse(rs.next());
83+
84+
rs.close();
85+
}
86+
87+
@Disabled(value="Test ignored, issue#41")
88+
@Test
89+
public void testGetPrimaryKeys() throws SQLException {
90+
ResultSet rs = meta.getPrimaryKeys(null, null, "TEST");
91+
92+
assertNotNull(rs);
93+
assertTrue(rs.next());
94+
95+
assertNull(rs.getString("TABLE_CAT"));
96+
assertNull(rs.getString("TABLE_SCHEM"));
97+
assertEquals("TEST", rs.getString("TABLE_NAME"));
98+
assertEquals("ID", rs.getString("COLUMN_NAME"));
99+
assertEquals(1, rs.getInt("KEY_SEQ"));
100+
assertEquals("pk_unnamed_TEST_1", rs.getString("PK_NAME"));
101+
102+
assertFalse(rs.next());
103+
104+
rs.close();
105+
}
106+
}

0 commit comments

Comments
 (0)