diff --git a/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/Database.kt b/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/Database.kt index d5b4e0cab6..39462eed8f 100644 --- a/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/Database.kt +++ b/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/Database.kt @@ -70,6 +70,7 @@ class Database private constructor(private val resolvedVendor: String? = null, v registerDialect(OracleDialect.dialectName) { OracleDialect() } registerDialect(SQLServerDialect.dialectName) { SQLServerDialect() } registerDialect(MariaDBDialect.dialectName) { MariaDBDialect() } + registerDialect(DB2Dialect.dialectName) { DB2Dialect() } } fun registerDialect(prefix:String, dialect: () -> DatabaseDialect) { @@ -131,6 +132,7 @@ class Database private constructor(private val resolvedVendor: String? = null, v url.startsWith("jdbc:oracle") -> "oracle.jdbc.OracleDriver" url.startsWith("jdbc:sqlite") -> "org.sqlite.JDBC" url.startsWith("jdbc:sqlserver") -> "com.microsoft.sqlserver.jdbc.SQLServerDriver" + url.startsWith("jdbc:as400") -> "com.ibm.as400.access.AS400JDBCDriver" else -> error("Database driver not found for $url") } @@ -143,6 +145,7 @@ class Database private constructor(private val resolvedVendor: String? = null, v url.startsWith("jdbc:oracle") -> OracleDialect.dialectName url.startsWith("jdbc:sqlite") -> SQLiteDialect.dialectName url.startsWith("jdbc:sqlserver") -> SQLServerDialect.dialectName + url.startsWith("jdbc:as400") -> DB2Dialect.dialectName else -> error("Can't resolve dialect for connection: $url") } } diff --git a/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/vendors/DB2.kt b/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/vendors/DB2.kt new file mode 100644 index 0000000000..2f18ebbc33 --- /dev/null +++ b/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/vendors/DB2.kt @@ -0,0 +1,37 @@ +package org.jetbrains.exposed.sql.vendors + +import org.jetbrains.exposed.sql.* + +internal object DB2DataTypeProvider : DataTypeProvider() { + override fun binaryType(): String { + exposedLogger.error("The length of the Binary column is missing.") + error("The length of the Binary column is missing.") + } + + override fun dateTimeType(): String = "TIMESTAMP" + + override fun ulongType(): String = "BIGINT" + + override fun textType(): String = "VARCHAR(32704)" +} + +internal open class DB2FunctionProvider : FunctionProvider() { + internal object INSTANCE : DB2FunctionProvider() + + override fun random(seed: Int?) = "RAND(${seed?.toString().orEmpty()})" +} + +/** + * DB2 dialect implementation. + */ +class DB2Dialect : VendorDialect(dialectName, DB2DataTypeProvider, DB2FunctionProvider.INSTANCE) { + override val name: String = dialectName + override val functionProvider: FunctionProvider = MariaDBFunctionProvider + override val supportsOnlyIdentifiersInGeneratedKeys: Boolean = true + + + companion object { + /** DB2 dialect name */ + const val dialectName: String = "db2" + } +} \ No newline at end of file diff --git a/exposed-jdbc/src/main/kotlin/org/jetbrains/exposed/sql/statements/jdbc/JdbcDatabaseMetadataImpl.kt b/exposed-jdbc/src/main/kotlin/org/jetbrains/exposed/sql/statements/jdbc/JdbcDatabaseMetadataImpl.kt index d30b3c54a3..6121452f1c 100644 --- a/exposed-jdbc/src/main/kotlin/org/jetbrains/exposed/sql/statements/jdbc/JdbcDatabaseMetadataImpl.kt +++ b/exposed-jdbc/src/main/kotlin/org/jetbrains/exposed/sql/statements/jdbc/JdbcDatabaseMetadataImpl.kt @@ -28,6 +28,7 @@ class JdbcDatabaseMetadataImpl(database: String, val metadata: DatabaseMetaData) "pgjdbc-ng" -> PostgreSQLNGDialect.dialectName "PostgreSQL JDBC Driver" -> PostgreSQLDialect.dialectName "Oracle JDBC driver" -> OracleDialect.dialectName + "AS/400 Toolbox for Java JDBC Driver" -> DB2Dialect.dialectName else -> { if (driverName.startsWith("Microsoft JDBC Driver ")) SQLServerDialect.dialectName