@@ -4,9 +4,12 @@ import org.jetbrains.exposed.sql.BinaryColumnType
4
4
import org.jetbrains.exposed.sql.BlobColumnType
5
5
import org.jetbrains.exposed.sql.IColumnType
6
6
import org.jetbrains.exposed.sql.statements.api.PreparedStatementApi
7
+ import java.io.ByteArrayInputStream
8
+ import java.io.FileInputStream
7
9
import java.io.InputStream
8
10
import java.sql.PreparedStatement
9
11
import java.sql.ResultSet
12
+ import java.sql.SQLFeatureNotSupportedException
10
13
import java.sql.Types
11
14
12
15
class JdbcPreparedStatementImpl (val statement : PreparedStatement , val wasGeneratedKeysRequested : Boolean ) : PreparedStatementApi {
@@ -15,7 +18,9 @@ class JdbcPreparedStatementImpl(val statement: PreparedStatement, val wasGenerat
15
18
16
19
override var fetchSize: Int?
17
20
get() = statement.fetchSize
18
- set(value) { value?.let { statement.fetchSize = value } }
21
+ set(value) {
22
+ value?.let { statement.fetchSize = value }
23
+ }
19
24
20
25
override fun addBatch () {
21
26
statement.addBatch()
@@ -38,7 +43,25 @@ class JdbcPreparedStatementImpl(val statement: PreparedStatement, val wasGenerat
38
43
}
39
44
40
45
override fun setInputStream (index : Int , inputStream : InputStream ) {
41
- statement.setBinaryStream(index, inputStream, inputStream.available())
46
+ try {
47
+ when {
48
+ // streams with known length where available matches the actual length
49
+ inputStream is ByteArrayInputStream ->
50
+ statement.setBinaryStream(index, inputStream, inputStream.available())
51
+
52
+ // FileInputStream.available() returns returns Int.MAX_VALUE
53
+ // if the underlying file is larger than 2GB
54
+ inputStream is FileInputStream && inputStream.available() < Int .MAX_VALUE ->
55
+ statement.setBinaryStream(index, inputStream, inputStream.available())
56
+
57
+ // default handling for unknown length
58
+ else -> statement.setBinaryStream(index, inputStream)
59
+
60
+ }
61
+ } catch (e: SQLFeatureNotSupportedException ) {
62
+ // fallback to bytes
63
+ statement.setBytes(index, inputStream.readAllBytes())
64
+ }
42
65
}
43
66
44
67
override fun closeIfPossible () {
0 commit comments