All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.lenses.jdbc4.resultset.WebSocketResultSet.kt Maven / Gradle / Ivy

There is a newer version: 3.0.2
Show newest version
package io.lenses.jdbc4.resultset

import arrow.core.Either
import arrow.core.getOrHandle
import io.lenses.jdbc4.client.JdbcError
import io.lenses.jdbc4.row.Row
import io.lenses.jdbc4.util.Logging
import org.apache.avro.Schema
import java.sql.ResultSet
import java.sql.ResultSetMetaData
import java.sql.SQLException
import java.sql.Statement
import java.util.concurrent.BlockingQueue

interface WebsocketConnection {
  val queue: BlockingQueue
  fun close()
  fun isClosed(): Boolean
}

abstract class StreamingRowResultSet : RowResultSet(),
    PullForwardOnlyResultSet,
    ImmutableResultSet,
    UnsupportedTypesResultSet,
    Logging

/**
 * An implementation of [ResultSet] that retrieves records from a websocket via a queue.
 */
class WebSocketResultSet(private val stmt: Statement?,
                         private val schema: Schema, // the schema for the records that will follow
                         private val conn: WebsocketConnection,
                         private val converter: (String, Schema) -> Either)
  : StreamingRowResultSet() {

  private var rowNumber: Int = 0
  private var row: Row? = null
  private var completed = false

  override fun next(): Boolean {
    return if (completed) false else {
      when (val msg = conn.queue.take()) {
        null -> {
          row = null
          completed = true
          conn.close()
          false
        }
        else -> {
          rowNumber++
          row = converter(msg, schema).getOrHandle { throw SQLException(it.cause) }
          row != null
        }
      }
    }
  }

  override fun isClosed(): Boolean = conn.isClosed()
  override fun close() {
    conn.close()
  }

  override fun getRow(): Int = rowNumber
  override fun currentRow(): Row = row!!

  override fun getMetaData(): ResultSetMetaData = meta()
  override fun meta(): AvroSchemaResultSetMetaData = AvroSchemaResultSetMetaData(schema)

  override fun getStatement(): Statement? = stmt
}





© 2015 - 2025 Weber Informatics LLC | Privacy Policy