Skip to content

Commit

Permalink
Fix for EXPOSED-86, allowing blobs with streams of unknown size
Browse files Browse the repository at this point in the history
  • Loading branch information
elektro-wolle committed Feb 19, 2024
1 parent 1999d3f commit adce458
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,15 @@ import org.jetbrains.exposed.sql.BlobColumnType
import org.jetbrains.exposed.sql.IColumnType
import org.jetbrains.exposed.sql.statements.StatementResult
import org.jetbrains.exposed.sql.statements.api.PreparedStatementApi
import java.io.ByteArrayInputStream
import java.io.FileInputStream
import org.jetbrains.exposed.sql.vendors.SQLiteDialect
import org.jetbrains.exposed.sql.vendors.currentDialect
import java.io.InputStream
import java.sql.PreparedStatement
import java.sql.ResultSet
import java.sql.Statement
import java.sql.SQLFeatureNotSupportedException
import java.sql.Types

/**
Expand Down Expand Up @@ -80,7 +83,25 @@ class JdbcPreparedStatementImpl(
}

override fun setInputStream(index: Int, inputStream: InputStream) {
statement.setBinaryStream(index, inputStream, inputStream.available())
try {
when {
// streams with known length where available matches the actual length
inputStream is ByteArrayInputStream ->
statement.setBinaryStream(index, inputStream, inputStream.available())

// FileInputStream.available() returns returns Int.MAX_VALUE
// if the underlying file is larger than 2GB
inputStream is FileInputStream && inputStream.available() < Int.MAX_VALUE ->
statement.setBinaryStream(index, inputStream, inputStream.available())

// default handling for unknown length
else -> statement.setBinaryStream(index, inputStream)

}
} catch (e: SQLFeatureNotSupportedException) {
// fallback to bytes
statement.setBytes(index, inputStream.readBytes())
}
}

override fun setArray(index: Int, type: String, array: Array<*>) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ import org.jetbrains.exposed.sql.vendors.SQLiteDialect
import org.junit.Assume
import org.junit.Test
import org.postgresql.util.PGobject
import java.io.ByteArrayInputStream
import java.io.SequenceInputStream
import java.util.*
import kotlin.random.Random
import kotlin.test.assertNotNull
Expand Down Expand Up @@ -612,7 +614,12 @@ class DDLTests : DatabaseTestsBase() {
val shortBytes = "Hello there!".toByteArray()
val longBytes = Random.nextBytes(1024)
val shortBlob = ExposedBlob(shortBytes)
val longBlob = ExposedBlob(longBytes)
val longBlob = ExposedBlob(
inputStream = SequenceInputStream(
ByteArrayInputStream(longBytes, 0, 512),
ByteArrayInputStream(longBytes, 512, 512)
)
)

val id1 = t.insert {
it[t.b] = shortBlob
Expand Down

0 comments on commit adce458

Please sign in to comment.