Skip to content

Commit a117037

Browse files
authored
Refactor JdbcAdmin (Part 2) (#3157)
1 parent 36d27b9 commit a117037

File tree

14 files changed

+103
-115
lines changed

14 files changed

+103
-115
lines changed

core/src/integration-test/java/com/scalar/db/storage/jdbc/JdbcAdminTestUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ private void execute(String sql) throws SQLException {
9090
@Override
9191
public boolean tableExists(String namespace, String table) throws Exception {
9292
String fullTableName = rdbEngine.encloseFullTableName(namespace, table);
93-
String sql = rdbEngine.tableExistsInternalTableCheckSql(fullTableName);
93+
String sql = rdbEngine.internalTableExistsCheckSql(fullTableName);
9494
try (Connection connection = dataSource.getConnection();
9595
Statement statement = connection.createStatement()) {
9696
statement.execute(sql);

core/src/integration-test/java/com/scalar/db/storage/multistorage/MultiStorageAdminTestUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ private boolean tableExistsOnCassandra(String namespace, String table) {
227227

228228
private boolean tableExistsOnJdbc(String namespace, String table) throws Exception {
229229
String fullTableName = rdbEngine.encloseFullTableName(namespace, table);
230-
String sql = rdbEngine.tableExistsInternalTableCheckSql(fullTableName);
230+
String sql = rdbEngine.internalTableExistsCheckSql(fullTableName);
231231
try (Connection connection = dataSource.getConnection();
232232
Statement statement = connection.createStatement()) {
233233
statement.execute(sql);

core/src/main/java/com/scalar/db/storage/dynamo/DynamoAdmin.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ private void createTableInternal(
304304
requestBuilder.tableName(getFullTableName(namespace, table));
305305

306306
try {
307-
if (!(ifNotExists && tableExistsInternal(namespace, table))) {
307+
if (!(ifNotExists && internalTableExists(namespace, table))) {
308308
client.createTable(requestBuilder.build());
309309
waitForTableCreation(namespace, table);
310310
}
@@ -543,14 +543,14 @@ private void createMetadataTableIfNotExists(boolean noBackup) throws ExecutionEx
543543
}
544544

545545
private boolean metadataTableExists() throws ExecutionException {
546-
return tableExistsInternal(Namespace.of(metadataNamespace), METADATA_TABLE);
546+
return internalTableExists(Namespace.of(metadataNamespace), METADATA_TABLE);
547547
}
548548

549549
private boolean namespacesTableExists() throws ExecutionException {
550-
return tableExistsInternal(Namespace.of(metadataNamespace), NAMESPACES_TABLE);
550+
return internalTableExists(Namespace.of(metadataNamespace), NAMESPACES_TABLE);
551551
}
552552

553-
private boolean tableExistsInternal(Namespace namespace, String table) throws ExecutionException {
553+
private boolean internalTableExists(Namespace namespace, String table) throws ExecutionException {
554554
try {
555555
client.describeTable(
556556
DescribeTableRequest.builder().tableName(getFullTableName(namespace, table)).build());

core/src/main/java/com/scalar/db/storage/jdbc/JdbcAdmin.java

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ public class JdbcAdmin implements DistributedStorageAdmin {
5959

6060
private final RdbEngineStrategy rdbEngine;
6161
private final BasicDataSource dataSource;
62+
private final String metadataSchema;
6263
private final TableMetadataService tableMetadataService;
6364
private final NamespaceMetadataService namespaceMetadataService;
6465

@@ -67,16 +68,18 @@ public JdbcAdmin(DatabaseConfig databaseConfig) {
6768
JdbcConfig config = new JdbcConfig(databaseConfig);
6869
rdbEngine = RdbEngineFactory.create(config);
6970
dataSource = JdbcUtils.initDataSourceForAdmin(config, rdbEngine);
70-
tableMetadataService = new TableMetadataService(config.getMetadataSchema(), rdbEngine);
71-
namespaceMetadataService = new NamespaceMetadataService(config.getMetadataSchema(), rdbEngine);
71+
metadataSchema = config.getMetadataSchema();
72+
tableMetadataService = new TableMetadataService(metadataSchema, rdbEngine);
73+
namespaceMetadataService = new NamespaceMetadataService(metadataSchema, rdbEngine);
7274
}
7375

7476
@SuppressFBWarnings("EI_EXPOSE_REP2")
7577
public JdbcAdmin(BasicDataSource dataSource, JdbcConfig config) {
7678
rdbEngine = RdbEngineFactory.create(config);
7779
this.dataSource = dataSource;
78-
tableMetadataService = new TableMetadataService(config.getMetadataSchema(), rdbEngine);
79-
namespaceMetadataService = new NamespaceMetadataService(config.getMetadataSchema(), rdbEngine);
80+
metadataSchema = config.getMetadataSchema();
81+
tableMetadataService = new TableMetadataService(metadataSchema, rdbEngine);
82+
namespaceMetadataService = new NamespaceMetadataService(metadataSchema, rdbEngine);
8083
}
8184

8285
private static boolean hasDescClusteringOrder(TableMetadata metadata) {
@@ -105,6 +108,7 @@ public void createNamespace(String namespace, Map<String, String> options)
105108

106109
try (Connection connection = dataSource.getConnection()) {
107110
execute(connection, rdbEngine.createSchemaSqls(namespace));
111+
createMetadataSchemaIfNotExists(connection);
108112
createNamespacesTableIfNotExists(connection);
109113
namespaceMetadataService.insertIntoNamespacesTable(connection, namespace);
110114
} catch (SQLException e) {
@@ -117,6 +121,7 @@ public void createTable(
117121
String namespace, String table, TableMetadata metadata, Map<String, String> options)
118122
throws ExecutionException {
119123
try (Connection connection = dataSource.getConnection()) {
124+
createMetadataSchemaIfNotExists(connection);
120125
createTableInternal(connection, namespace, table, metadata, false);
121126
addTableMetadata(connection, namespace, table, metadata, true, false);
122127
} catch (SQLException e) {
@@ -221,6 +226,7 @@ public void dropNamespace(String namespace) throws ExecutionException {
221226
execute(connection, rdbEngine.dropNamespaceSql(namespace));
222227
namespaceMetadataService.deleteFromNamespacesTable(connection, namespace);
223228
namespaceMetadataService.deleteNamespacesTableIfEmpty(connection);
229+
deleteMetadataSchemaIfEmpty(connection);
224230
} catch (SQLException e) {
225231
rdbEngine.dropNamespaceTranslateSQLException(e, namespace);
226232
}
@@ -282,7 +288,7 @@ TableMetadata getImportTableMetadata(
282288
String catalogName = rdbEngine.getCatalogName(namespace);
283289
String schemaName = rdbEngine.getSchemaName(namespace);
284290

285-
if (!tableExistsInternal(connection, namespace, table)) {
291+
if (!internalTableExists(connection, namespace, table)) {
286292
throw new IllegalArgumentException(
287293
CoreError.TABLE_NOT_FOUND.buildMessage(getFullTableName(namespace, table)));
288294
}
@@ -337,6 +343,7 @@ public void importTable(
337343

338344
try (Connection connection = dataSource.getConnection()) {
339345
TableMetadata tableMetadata = getImportTableMetadata(namespace, table, overrideColumnsType);
346+
createMetadataSchemaIfNotExists(connection);
340347
createNamespacesTableIfNotExists(connection);
341348
upsertIntoNamespacesTable(connection, namespace);
342349
addTableMetadata(connection, namespace, table, tableMetadata, true, false);
@@ -473,6 +480,7 @@ public void repairNamespace(String namespace, Map<String, String> options)
473480

474481
try (Connection connection = dataSource.getConnection()) {
475482
createSchemaIfNotExists(connection, namespace);
483+
createMetadataSchemaIfNotExists(connection);
476484
createNamespacesTableIfNotExists(connection);
477485
upsertIntoNamespacesTable(connection, namespace);
478486
} catch (SQLException e) {
@@ -485,6 +493,7 @@ public void repairTable(
485493
String namespace, String table, TableMetadata metadata, Map<String, String> options)
486494
throws ExecutionException {
487495
try (Connection connection = dataSource.getConnection()) {
496+
createMetadataSchemaIfNotExists(connection);
488497
createTableInternal(connection, namespace, table, metadata, true);
489498
addTableMetadata(connection, namespace, table, metadata, true, true);
490499
} catch (SQLException e) {
@@ -720,6 +729,7 @@ public void upgrade(Map<String, String> options) throws ExecutionException {
720729
return;
721730
}
722731

732+
createMetadataSchemaIfNotExists(connection);
723733
createNamespacesTableIfNotExists(connection);
724734
for (String namespace : namespaceNamesOfExistingTables) {
725735
upsertIntoNamespacesTable(connection, namespace);
@@ -762,6 +772,20 @@ void upsertIntoNamespacesTable(Connection connection, String namespace) throws S
762772
namespaceMetadataService.upsertIntoNamespacesTable(connection, namespace);
763773
}
764774

775+
private void createMetadataSchemaIfNotExists(Connection connection) throws SQLException {
776+
createSchemaIfNotExists(connection, metadataSchema);
777+
}
778+
779+
private void deleteMetadataSchemaIfEmpty(Connection connection) throws SQLException {
780+
Set<String> internalTableNames = getInternalTableNames(connection, metadataSchema);
781+
if (!internalTableNames.isEmpty()) {
782+
return;
783+
}
784+
785+
String sql = rdbEngine.deleteMetadataSchemaSql(metadataSchema);
786+
execute(connection, sql);
787+
}
788+
765789
private void createTable(Connection connection, String createTableStatement, boolean ifNotExists)
766790
throws SQLException {
767791
String stmt = createTableStatement;
@@ -778,10 +802,10 @@ private void createTable(Connection connection, String createTableStatement, boo
778802
}
779803
}
780804

781-
private boolean tableExistsInternal(Connection connection, String namespace, String table)
805+
private boolean internalTableExists(Connection connection, String namespace, String table)
782806
throws ExecutionException {
783807
String fullTableName = encloseFullTableName(namespace, table);
784-
String sql = rdbEngine.tableExistsInternalTableCheckSql(fullTableName);
808+
String sql = rdbEngine.internalTableExistsCheckSql(fullTableName);
785809
try {
786810
execute(connection, sql);
787811
return true;

core/src/main/java/com/scalar/db/storage/jdbc/NamespaceMetadataService.java

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,10 @@ public class NamespaceMetadataService {
2727
}
2828

2929
void createNamespacesTableIfNotExists(Connection connection) throws SQLException {
30-
if (tableExistsInternal(connection, metadataSchema, TABLE_NAME)) {
30+
if (internalTableExists(connection, metadataSchema, TABLE_NAME)) {
3131
return;
3232
}
3333

34-
createSchemaIfNotExists(connection, metadataSchema);
3534
String createTableStatement =
3635
"CREATE TABLE "
3736
+ encloseFullTableName(metadataSchema, TABLE_NAME)
@@ -52,7 +51,6 @@ void createNamespacesTableIfNotExists(Connection connection) throws SQLException
5251
void deleteNamespacesTableIfEmpty(Connection connection) throws SQLException {
5352
if (isNamespacesTableEmpty(connection)) {
5453
deleteTable(connection, encloseFullTableName(metadataSchema, TABLE_NAME));
55-
deleteMetadataSchema(connection);
5654
}
5755
}
5856

@@ -75,11 +73,6 @@ private boolean isNamespacesTableEmpty(Connection connection) throws SQLExceptio
7573
return namespaces.size() == 1 && namespaces.contains(metadataSchema);
7674
}
7775

78-
private void deleteMetadataSchema(Connection connection) throws SQLException {
79-
String sql = rdbEngine.deleteMetadataSchemaSql(metadataSchema);
80-
execute(connection, sql);
81-
}
82-
8376
void insertIntoNamespacesTable(Connection connection, String namespaceName) throws SQLException {
8477
String insertStatement =
8578
"INSERT INTO " + encloseFullTableName(metadataSchema, TABLE_NAME) + " VALUES (?)";
@@ -178,10 +171,10 @@ private void createTable(Connection connection, String createTableStatement, boo
178171
}
179172
}
180173

181-
private boolean tableExistsInternal(Connection connection, String namespace, String table)
174+
private boolean internalTableExists(Connection connection, String namespace, String table)
182175
throws SQLException {
183176
String fullTableName = encloseFullTableName(namespace, table);
184-
String sql = rdbEngine.tableExistsInternalTableCheckSql(fullTableName);
177+
String sql = rdbEngine.internalTableExistsCheckSql(fullTableName);
185178
try {
186179
execute(connection, sql);
187180
return true;
@@ -201,18 +194,6 @@ private void deleteTable(Connection connection, String fullTableName) throws SQL
201194
execute(connection, dropTableStatement);
202195
}
203196

204-
private void createSchemaIfNotExists(Connection connection, String schema) throws SQLException {
205-
String[] sqls = rdbEngine.createSchemaIfNotExistsSqls(schema);
206-
try {
207-
execute(connection, sqls);
208-
} catch (SQLException e) {
209-
// Suppress exceptions indicating the duplicate metadata schema
210-
if (!rdbEngine.isCreateMetadataSchemaDuplicateSchemaError(e)) {
211-
throw e;
212-
}
213-
}
214-
}
215-
216197
private String enclose(String name) {
217198
return rdbEngine.enclose(name);
218199
}

core/src/main/java/com/scalar/db/storage/jdbc/RdbEngineDb2.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ public String[] alterColumnTypeSql(
283283
}
284284

285285
@Override
286-
public String tableExistsInternalTableCheckSql(String fullTableName) {
286+
public String internalTableExistsCheckSql(String fullTableName) {
287287
return "SELECT 1 FROM " + fullTableName + " LIMIT 1";
288288
}
289289

core/src/main/java/com/scalar/db/storage/jdbc/RdbEngineMysql.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ public String[] alterColumnTypeSql(
153153
}
154154

155155
@Override
156-
public String tableExistsInternalTableCheckSql(String fullTableName) {
156+
public String internalTableExistsCheckSql(String fullTableName) {
157157
return "SELECT 1 FROM " + fullTableName + " LIMIT 1";
158158
}
159159

core/src/main/java/com/scalar/db/storage/jdbc/RdbEngineOracle.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ public String[] alterColumnTypeSql(
159159
}
160160

161161
@Override
162-
public String tableExistsInternalTableCheckSql(String fullTableName) {
162+
public String internalTableExistsCheckSql(String fullTableName) {
163163
return "SELECT 1 FROM " + fullTableName + " FETCH FIRST 1 ROWS ONLY";
164164
}
165165

core/src/main/java/com/scalar/db/storage/jdbc/RdbEnginePostgresql.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ public String[] alterColumnTypeSql(
133133
}
134134

135135
@Override
136-
public String tableExistsInternalTableCheckSql(String fullTableName) {
136+
public String internalTableExistsCheckSql(String fullTableName) {
137137
return "SELECT 1 FROM " + fullTableName + " LIMIT 1";
138138
}
139139

core/src/main/java/com/scalar/db/storage/jdbc/RdbEngineSqlServer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ public String[] alterColumnTypeSql(
140140
}
141141

142142
@Override
143-
public String tableExistsInternalTableCheckSql(String fullTableName) {
143+
public String internalTableExistsCheckSql(String fullTableName) {
144144
return "SELECT TOP 1 1 FROM " + fullTableName;
145145
}
146146

0 commit comments

Comments
 (0)