Skip to content

Commit 8c29c0d

Browse files
committed
Fix for metadata calls in dialects, through Transaction.exec
1 parent c601ce6 commit 8c29c0d

File tree

2 files changed

+31
-46
lines changed

2 files changed

+31
-46
lines changed

src/main/kotlin/org/jetbrains/exposed/sql/vendors/Mysql.kt

+27-38
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ internal object MysqlFunctionProvider : FunctionProvider() {
2424

2525
override fun <T : String?> ExpressionWithColumnType<T>.match(pattern: String, mode: MatchMode?): Op<Boolean> = MATCH(this, pattern, mode ?: MysqlMatchMode.STRICT)
2626

27-
private class MATCH(val expr: ExpressionWithColumnType<*>, val pattern: String, val mode: MatchMode): Op<Boolean>() {
27+
private class MATCH(val expr: ExpressionWithColumnType<*>, val pattern: String, val mode: MatchMode) : Op<Boolean>() {
2828
override fun toSQL(queryBuilder: QueryBuilder): String =
2929
"MATCH(${expr.toSQL(queryBuilder)}) AGAINST ('$pattern' ${mode.mode()})"
3030
}
3131

32-
private enum class MysqlMatchMode(val operator: String): FunctionProvider.MatchMode {
32+
private enum class MysqlMatchMode(val operator: String) : FunctionProvider.MatchMode {
3333
STRICT("IN BOOLEAN MODE"),
3434
NATURAL_LANGUAGE("IN NATURAL LANGUAGE MODE");
3535

@@ -40,21 +40,17 @@ internal object MysqlFunctionProvider : FunctionProvider() {
4040
internal object MysqlDialect : VendorDialect("mysql", MysqlDataTypeProvider, MysqlFunctionProvider) {
4141

4242
override fun tableColumns(vararg tables: Table): Map<Table, List<Pair<String, Boolean>>> {
43-
44-
val statement = TransactionManager.current().connection.createStatement()
45-
46-
try {
47-
val rs = statement.executeQuery(
48-
"SELECT DISTINCT TABLE_NAME, COLUMN_NAME, IS_NULLABLE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '${getDatabase()}'")
49-
return rs.extractColumns(tables) {
43+
return TransactionManager.current().exec(
44+
"SELECT DISTINCT TABLE_NAME, COLUMN_NAME, IS_NULLABLE FROM" +
45+
" INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '${getDatabase()}'") { rs ->
46+
rs.extractColumns(tables) {
5047
Triple(it.getString("TABLE_NAME")!!, it.getString("COLUMN_NAME")!!, it.getBoolean("IS_NULLABLE"))
5148
}
52-
} finally {
53-
statement.close()
54-
}
49+
}!!
5550
}
5651

57-
override @Synchronized fun columnConstraints(vararg tables: Table): Map<Pair<String, String>, List<ForeignKeyConstraint>> {
52+
override @Synchronized
53+
fun columnConstraints(vararg tables: Table): Map<Pair<String, String>, List<ForeignKeyConstraint>> {
5854

5955
val constraints = HashMap<Pair<String, String>, MutableList<ForeignKeyConstraint>>()
6056

@@ -67,20 +63,18 @@ internal object MysqlDialect : VendorDialect("mysql", MysqlDataTypeProvider, Mys
6763
return ""
6864
}
6965

70-
val statement = TransactionManager.current().connection.createStatement()
71-
try {
72-
val rs = statement.executeQuery(
73-
"SELECT\n" +
74-
" rc.CONSTRAINT_NAME,\n" +
75-
" ku.TABLE_NAME,\n" +
76-
" ku.COLUMN_NAME,\n" +
77-
" ku.REFERENCED_TABLE_NAME,\n" +
78-
" ku.REFERENCED_COLUMN_NAME,\n" +
79-
" rc.DELETE_RULE\n" +
80-
"FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc\n" +
81-
" INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE ku\n" +
82-
" ON ku.TABLE_SCHEMA = rc.CONSTRAINT_SCHEMA AND rc.CONSTRAINT_NAME = ku.CONSTRAINT_NAME\n" +
83-
"WHERE ku.TABLE_SCHEMA = '${getDatabase()}' ${inTableList()}")
66+
TransactionManager.current().exec(
67+
"SELECT\n" +
68+
" rc.CONSTRAINT_NAME,\n" +
69+
" ku.TABLE_NAME,\n" +
70+
" ku.COLUMN_NAME,\n" +
71+
" ku.REFERENCED_TABLE_NAME,\n" +
72+
" ku.REFERENCED_COLUMN_NAME,\n" +
73+
" rc.DELETE_RULE\n" +
74+
"FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc\n" +
75+
" INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE ku\n" +
76+
" ON ku.TABLE_SCHEMA = rc.CONSTRAINT_SCHEMA AND rc.CONSTRAINT_NAME = ku.CONSTRAINT_NAME\n" +
77+
"WHERE ku.TABLE_SCHEMA = '${getDatabase()}' ${inTableList()}") { rs ->
8478

8579
while (rs.next()) {
8680
val refereeTableName = rs.getString("TABLE_NAME")!!
@@ -92,24 +86,21 @@ internal object MysqlDialect : VendorDialect("mysql", MysqlDataTypeProvider, Mys
9286
val constraintDeleteRule = ReferenceOption.valueOf(rs.getString("DELETE_RULE")!!.replace(" ", "_"))
9387
constraints.getOrPut(Pair(refereeTableName, refereeColumnName), { arrayListOf() }).add(ForeignKeyConstraint(constraintName, refereeTableName, refereeColumnName, refTableName, refColumnName, constraintDeleteRule))
9488
}
95-
} finally {
96-
statement.close()
9789
}
9890

9991
return constraints
10092
}
10193

102-
override @Synchronized fun existingIndices(vararg tables: Table): Map<Table, List<Index>> {
94+
override @Synchronized
95+
fun existingIndices(vararg tables: Table): Map<Table, List<Index>> {
10396

10497
val constraints = HashMap<Table, MutableList<Index>>()
10598

10699
val tableNames = tables.associateBy { it.nameInDatabaseCase() }
107100

108101
val transaction = TransactionManager.current()
109-
val statement = transaction.connection.createStatement()
110-
try {
111-
val rs = statement.executeQuery(
112-
"""SELECT DISTINCT ind.* from (
102+
transaction.exec(
103+
"""SELECT DISTINCT ind.* from (
113104
SELECT
114105
TABLE_NAME, INDEX_NAME, GROUP_CONCAT(column_name ORDER BY seq_in_index) AS `COLUMNS`, NON_UNIQUE
115106
FROM INFORMATION_SCHEMA.STATISTICS s
@@ -121,7 +112,7 @@ internal object MysqlDialect : VendorDialect("mysql", MysqlDataTypeProvider, Mys
121112
and TABLE_SCHEMA = '${getDatabase()}'
122113
and kcu.REFERENCED_TABLE_NAME is not NULL
123114
WHERE kcu.COLUMN_NAME is NULL OR ind.NON_UNIQUE is FALSE;
124-
""")
115+
""") { rs ->
125116

126117
while (rs.next()) {
127118
val tableName = rs.getString("TABLE_NAME")!!
@@ -132,8 +123,6 @@ internal object MysqlDialect : VendorDialect("mysql", MysqlDataTypeProvider, Mys
132123
constraints.getOrPut(tableNames[tableName]!!, { arrayListOf() }).add(Index(indexName, tableName, columnsInIndex, isUnique))
133124
}
134125
}
135-
} finally {
136-
statement.close()
137126
}
138127

139128
return constraints
@@ -161,5 +150,5 @@ internal object MysqlDialect : VendorDialect("mysql", MysqlDataTypeProvider, Mys
161150
override fun dropIndex(tableName: String, indexName: String): String =
162151
"ALTER TABLE $tableName DROP INDEX $indexName"
163152

164-
fun isFractionDateTimeSupported() = TransactionManager.current().db.metadata.let { (it.databaseMajorVersion == 5 && it.databaseMinorVersion >= 6) ||it.databaseMajorVersion > 5 }
153+
fun isFractionDateTimeSupported() = TransactionManager.current().db.metadata.let { (it.databaseMajorVersion == 5 && it.databaseMinorVersion >= 6) || it.databaseMajorVersion > 5 }
165154
}

src/main/kotlin/org/jetbrains/exposed/sql/vendors/OracleDialect.kt

+4-8
Original file line numberDiff line numberDiff line change
@@ -74,16 +74,12 @@ internal object OracleDialect : VendorDialect("oracle", OracleDataTypeProvider,
7474

7575
override fun tableColumns(vararg tables: Table): Map<Table, List<Pair<String, Boolean>>> {
7676

77-
val statement = TransactionManager.current().connection.createStatement()
78-
try {
79-
val rs = statement.executeQuery(
80-
"SELECT DISTINCT TABLE_NAME, COLUMN_NAME, NULLABLE FROM DBA_TAB_COLS WHERE OWNER = '${getDatabase()}'")
81-
return rs.extractColumns(tables) {
77+
return TransactionManager.current().exec(
78+
"SELECT DISTINCT TABLE_NAME, COLUMN_NAME, NULLABLE FROM DBA_TAB_COLS WHERE OWNER = '${getDatabase()}'") { rs ->
79+
rs.extractColumns(tables) {
8280
Triple(it.getString("TABLE_NAME")!!, it.getString("COLUMN_NAME")!!, it.getBoolean("NULLABLE"))
8381
}
84-
} finally {
85-
statement.close()
86-
}
82+
}!!
8783
}
8884

8985
override fun allTablesNames(): List<String> {

0 commit comments

Comments
 (0)