Skip to content

Commit 0dd2349

Browse files
Backport to branch(3) : Refactor JdbcAdmin (Part 2) (#3168)
Co-authored-by: Toshihiro Suzuki <[email protected]>
1 parent 571d447 commit 0dd2349

File tree

12 files changed

+67
-45
lines changed

12 files changed

+67
-45
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
@@ -111,7 +111,7 @@ public boolean namespaceExists(String namespace) throws SQLException {
111111
@Override
112112
public boolean tableExists(String namespace, String table) throws Exception {
113113
String fullTableName = rdbEngine.encloseFullTableName(namespace, table);
114-
String sql = rdbEngine.tableExistsInternalTableCheckSql(fullTableName);
114+
String sql = rdbEngine.internalTableExistsCheckSql(fullTableName);
115115
try (Connection connection = dataSource.getConnection();
116116
Statement statement = connection.createStatement()) {
117117
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
@@ -164,7 +164,7 @@ private boolean tableExistsOnCassandra(String namespace, String table) {
164164

165165
private boolean tableExistsOnJdbc(String namespace, String table) throws Exception {
166166
String fullTableName = rdbEngine.encloseFullTableName(namespace, table);
167-
String sql = rdbEngine.tableExistsInternalTableCheckSql(fullTableName);
167+
String sql = rdbEngine.internalTableExistsCheckSql(fullTableName);
168168
try (Connection connection = dataSource.getConnection();
169169
Statement statement = connection.createStatement()) {
170170
statement.execute(sql);

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

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ public void createTable(
117117
String namespace, String table, TableMetadata metadata, Map<String, String> options)
118118
throws ExecutionException {
119119
try (Connection connection = dataSource.getConnection()) {
120+
createMetadataSchemaIfNotExists(connection);
120121
createTableInternal(connection, namespace, table, metadata, false);
121122
addTableMetadata(connection, namespace, table, metadata, true, false);
122123
} catch (SQLException e) {
@@ -197,6 +198,7 @@ public void dropTable(String namespace, String table) throws ExecutionException
197198
try (Connection connection = dataSource.getConnection()) {
198199
dropTableInternal(connection, namespace, table);
199200
tableMetadataService.deleteTableMetadata(connection, namespace, table, true);
201+
deleteMetadataSchemaIfEmpty(connection);
200202
} catch (SQLException e) {
201203
throw new ExecutionException(
202204
"Dropping the " + getFullTableName(namespace, table) + " table failed", e);
@@ -280,7 +282,7 @@ TableMetadata getImportTableMetadata(
280282
String catalogName = rdbEngine.getCatalogName(namespace);
281283
String schemaName = rdbEngine.getSchemaName(namespace);
282284

283-
if (!tableExistsInternal(connection, namespace, table)) {
285+
if (!internalTableExists(connection, namespace, table)) {
284286
throw new IllegalArgumentException(
285287
CoreError.TABLE_NOT_FOUND.buildMessage(getFullTableName(namespace, table)));
286288
}
@@ -335,6 +337,7 @@ public void importTable(
335337

336338
try (Connection connection = dataSource.getConnection()) {
337339
TableMetadata tableMetadata = getImportTableMetadata(namespace, table, overrideColumnsType);
340+
createMetadataSchemaIfNotExists(connection);
338341
addTableMetadata(connection, namespace, table, tableMetadata, true, false);
339342
} catch (SQLException | ExecutionException e) {
340343
throw new ExecutionException(
@@ -484,11 +487,12 @@ public void repairTable(
484487
rdbEngine.throwIfInvalidNamespaceName(table);
485488

486489
try (Connection connection = dataSource.getConnection()) {
487-
if (!tableExistsInternal(connection, namespace, table)) {
490+
if (!internalTableExists(connection, namespace, table)) {
488491
throw new IllegalArgumentException(
489492
CoreError.TABLE_NOT_FOUND.buildMessage(getFullTableName(namespace, table)));
490493
}
491494

495+
createMetadataSchemaIfNotExists(connection);
492496
addTableMetadata(connection, namespace, table, metadata, true, true);
493497
} catch (SQLException e) {
494498
throw new ExecutionException(
@@ -736,6 +740,21 @@ void createTableMetadataTableIfNotExists(Connection connection) throws SQLExcept
736740
tableMetadataService.createTableMetadataTableIfNotExists(connection);
737741
}
738742

743+
@VisibleForTesting
744+
void createMetadataSchemaIfNotExists(Connection connection) throws SQLException {
745+
createSchemaIfNotExists(connection, metadataSchema);
746+
}
747+
748+
private void deleteMetadataSchemaIfEmpty(Connection connection) throws SQLException {
749+
Set<String> internalTableNames = getInternalTableNames(connection, metadataSchema);
750+
if (!internalTableNames.isEmpty()) {
751+
return;
752+
}
753+
754+
String sql = rdbEngine.dropNamespaceSql(metadataSchema);
755+
execute(connection, sql);
756+
}
757+
739758
private void createTable(Connection connection, String createTableStatement, boolean ifNotExists)
740759
throws SQLException {
741760
String stmt = createTableStatement;
@@ -752,10 +771,10 @@ private void createTable(Connection connection, String createTableStatement, boo
752771
}
753772
}
754773

755-
private boolean tableExistsInternal(Connection connection, String namespace, String table)
774+
private boolean internalTableExists(Connection connection, String namespace, String table)
756775
throws ExecutionException {
757776
String fullTableName = encloseFullTableName(namespace, table);
758-
String sql = rdbEngine.tableExistsInternalTableCheckSql(fullTableName);
777+
String sql = rdbEngine.internalTableExistsCheckSql(fullTableName);
759778
try {
760779
execute(connection, sql);
761780
return true;
@@ -772,6 +791,18 @@ private boolean tableExistsInternal(Connection connection, String namespace, Str
772791
}
773792
}
774793

794+
private void createSchemaIfNotExists(Connection connection, String schema) throws SQLException {
795+
String[] sqls = rdbEngine.createSchemaIfNotExistsSqls(schema);
796+
try {
797+
execute(connection, sqls);
798+
} catch (SQLException e) {
799+
// Suppress exceptions indicating the duplicate metadata schema
800+
if (!rdbEngine.isCreateMetadataSchemaDuplicateSchemaError(e)) {
801+
throw e;
802+
}
803+
}
804+
}
805+
775806
private String enclose(String name) {
776807
return rdbEngine.enclose(name);
777808
}

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
@@ -157,7 +157,7 @@ public String[] alterColumnTypeSql(
157157
}
158158

159159
@Override
160-
public String tableExistsInternalTableCheckSql(String fullTableName) {
160+
public String internalTableExistsCheckSql(String fullTableName) {
161161
return "SELECT 1 FROM " + fullTableName + " LIMIT 1";
162162
}
163163

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
@@ -137,7 +137,7 @@ public String[] alterColumnTypeSql(
137137
}
138138

139139
@Override
140-
public String tableExistsInternalTableCheckSql(String fullTableName) {
140+
public String internalTableExistsCheckSql(String fullTableName) {
141141
return "SELECT 1 FROM " + fullTableName + " LIMIT 1";
142142
}
143143

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
@@ -144,7 +144,7 @@ public String[] alterColumnTypeSql(
144144
}
145145

146146
@Override
147-
public String tableExistsInternalTableCheckSql(String fullTableName) {
147+
public String internalTableExistsCheckSql(String fullTableName) {
148148
return "SELECT TOP 1 1 FROM " + fullTableName;
149149
}
150150

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

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

286286
@Override
287-
public String tableExistsInternalTableCheckSql(String fullTableName) {
287+
public String internalTableExistsCheckSql(String fullTableName) {
288288
return "SELECT 1 FROM " + fullTableName + " LIMIT 1";
289289
}
290290

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ default String renameColumnSql(
133133

134134
String[] alterColumnTypeSql(String namespace, String table, String columnName, String columnType);
135135

136-
String tableExistsInternalTableCheckSql(String fullTableName);
136+
String internalTableExistsCheckSql(String fullTableName);
137137

138138
default String createIndexSql(
139139
String schema, String table, String indexName, String indexedColumn) {

0 commit comments

Comments
 (0)