Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: manage indicators on READ** #57

Merged
merged 1 commit into from
Dec 18, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
99 changes: 70 additions & 29 deletions sql/src/main/kotlin/com/smeup/dbnative/sql/SQLDBFile.kt
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,17 @@ import java.sql.PreparedStatement
import java.sql.ResultSet
import kotlin.system.measureTimeMillis

class SQLDBFile(override var name: String, override var fileMetadata: FileMetadata,
var connection: Connection,
override var logger: Logger? = null) : DBFile {
class SQLDBFile(
override var name: String, override var fileMetadata: FileMetadata,
var connection: Connection,
override var logger: Logger? = null
) : DBFile {

constructor(
name: String,
fileMetadata: FileMetadata,
connection: Connection): this(name, fileMetadata, connection, null)
connection: Connection
) : this(name, fileMetadata, connection, null)

private var preparedStatements: MutableMap<String, PreparedStatement> = mutableMapOf()
private var resultSet: ResultSet? = null
Expand All @@ -59,10 +62,10 @@ class SQLDBFile(override var name: String, override var fileMetadata: FileMetada
//}

private var adapter: Native2SQL = Native2SQL(this.fileMetadata)
private var eof:Boolean = false
private var eof: Boolean = false

private fun logEvent(loggingKey: LoggingKey, message: String, elapsedTime: Long? = null) =
logger?.logEvent(loggingKey, message, elapsedTime, lastNativeMethod, fileMetadata.name)
logger?.logEvent(loggingKey, message, elapsedTime, lastNativeMethod, fileMetadata.name)


override fun setll(key: String): Boolean {
Expand Down Expand Up @@ -101,7 +104,6 @@ class SQLDBFile(override var name: String, override var fileMetadata: FileMetada
adapter.setRead(ReadMethod.CHAIN, keys)
val read: Result
measureTimeMillis {

executeQuery(adapter.getSQLSatement())
read = readNextFromResultSet(false)
}.apply {
Expand All @@ -115,11 +117,18 @@ class SQLDBFile(override var name: String, override var fileMetadata: FileMetada
lastNativeMethod = NativeMethod.read
logEvent(LoggingKey.native_access_method, "Executing read")
val read: Result
var queryError = false
measureTimeMillis {
if (adapter.setRead(ReadMethod.READ) ) {
executeQuery(adapter.getSQLSatement())
if (adapter.setRead(ReadMethod.READ)) {
try {
executeQuery(adapter.getSQLSatement())
} catch (e: Exception) {
queryError = true
logEvent(LoggingKey.native_access_method, "Query execution failed: " + e.message)
}
}
read = readNextFromResultSet(true)
read.indicatorLO = queryError
}.apply {
logEvent(LoggingKey.native_access_method, "read executed", this)
}
Expand All @@ -131,11 +140,18 @@ class SQLDBFile(override var name: String, override var fileMetadata: FileMetada
lastNativeMethod = NativeMethod.readPrevious
logEvent(LoggingKey.native_access_method, "Executing readPrevious")
val read: Result
var queryError = false
measureTimeMillis {
if (adapter.setRead(ReadMethod.READP)) {
executeQuery(adapter.getSQLSatement())
try {
executeQuery(adapter.getSQLSatement())
} catch (e: Exception) {
queryError = true
logEvent(LoggingKey.native_access_method, "Query execution failed: " + e.message)
}
}
read = readNextFromResultSet(true)
read.indicatorLO = queryError
}.apply {
logEvent(LoggingKey.native_access_method, "readPrevious executed", this)
}
Expand All @@ -155,12 +171,18 @@ class SQLDBFile(override var name: String, override var fileMetadata: FileMetada
lastNativeMethod = NativeMethod.readEqual
logEvent(LoggingKey.native_access_method, "Executing readEqual on keys $keys")
val read: Result
var queryError = false
measureTimeMillis {

if (adapter.setRead(ReadMethod.READE, keys)) {
executeQuery(adapter.getSQLSatement())
try {
executeQuery(adapter.getSQLSatement())
} catch (e: Exception) {
queryError = true
logEvent(LoggingKey.native_access_method, "Query execution failed: " + e.message)
}
}
read = readNextFromResultSet(true)
read.indicatorLO = queryError
}.apply {
logEvent(LoggingKey.native_access_method, "readEqual executed", this)
}
Expand All @@ -181,12 +203,18 @@ class SQLDBFile(override var name: String, override var fileMetadata: FileMetada
lastNativeMethod = NativeMethod.readPreviousEqual
logEvent(LoggingKey.native_access_method, "Executing readPreviousEqual on keys $keys")
val read: Result
var queryError = false
measureTimeMillis {

if (adapter.setRead(ReadMethod.READPE, keys)) {
executeQuery(adapter.getSQLSatement())
try {
executeQuery(adapter.getSQLSatement())
} catch (e: Exception) {
queryError = true
logEvent(LoggingKey.native_access_method, "Query execution failed: " + e.message)
}
}
read = readNextFromResultSet(true)
read.indicatorLO = queryError
}.apply {
logEvent(LoggingKey.native_access_method, "readPreviousEqual executed", this)
}
Expand All @@ -196,7 +224,10 @@ class SQLDBFile(override var name: String, override var fileMetadata: FileMetada

override fun write(record: Record): Result {
lastNativeMethod = NativeMethod.write
logEvent(LoggingKey.native_access_method, "Executing write for record $record: with autocommit=${connection.autoCommit}")
logEvent(
LoggingKey.native_access_method,
"Executing write for record $record: with autocommit=${connection.autoCommit}"
)
measureTimeMillis {
// TODO: manage errors
val sql = fileMetadata.tableName.insertSQL(record)
Expand Down Expand Up @@ -231,23 +262,26 @@ class SQLDBFile(override var name: String, override var fileMetadata: FileMetada
*/

override fun update(record: Record): Result {
require(getResultSet() != null){
require(getResultSet() != null) {
"Positioning required before update "
}
lastNativeMethod = NativeMethod.update
logEvent(LoggingKey.native_access_method, "Executing update record $actualRecord to $record with autocommit=${connection.autoCommit}")
logEvent(
LoggingKey.native_access_method,
"Executing update record $actualRecord to $record with autocommit=${connection.autoCommit}"
)
measureTimeMillis {
// record before update is "actualRecord"
// record post update will be "record"
var atLeastOneFieldChanged = false
actualRecord?.forEach {
val fieldValue = record.getValue(it.key)
if(fieldValue != it.value){
if (fieldValue != it.value) {
atLeastOneFieldChanged = true
this.getResultSet()?.updateObject(it.key, fieldValue)
}
}?:logEvent(LoggingKey.native_access_method, "No previous read executed, nothing to update")
if(atLeastOneFieldChanged){
} ?: logEvent(LoggingKey.native_access_method, "No previous read executed, nothing to update")
if (atLeastOneFieldChanged) {
this.getResultSet()?.updateRow()
}
}.apply {
Expand All @@ -260,12 +294,14 @@ class SQLDBFile(override var name: String, override var fileMetadata: FileMetada

override fun delete(record: Record): Result {
lastNativeMethod = NativeMethod.delete
logEvent(LoggingKey.native_access_method, "Executing delete for current record $actualRecord with autocommit=${connection.autoCommit}")
logEvent(
LoggingKey.native_access_method,
"Executing delete for current record $actualRecord with autocommit=${connection.autoCommit}"
)
measureTimeMillis {
if(actualRecord != null) {
if (actualRecord != null) {
this.getResultSet()?.deleteRow()
}
else{
} else {
logEvent(LoggingKey.native_access_method, "No previous read executed, nothing to delete")
}
}.apply {
Expand All @@ -285,7 +321,11 @@ class SQLDBFile(override var name: String, override var fileMetadata: FileMetada
logEvent(LoggingKey.execute_inquiry, "Preparing statement for query: $sql with bingings: $values")
val stm: PreparedStatement
measureTimeMillis {
stm = preparedStatements.get(sql)?:connection.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE)
stm = preparedStatements.get(sql) ?: connection.prepareStatement(
sql,
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_UPDATABLE
)
preparedStatements.putIfAbsent(sql, stm);
stm.bind(values)
}.apply {
Expand All @@ -303,8 +343,8 @@ class SQLDBFile(override var name: String, override var fileMetadata: FileMetada
if (nextResult == null) nextResult = Result(resultSet.toValues())
val result = nextResult

var found:Boolean = false
while( !found && !eof) {
var found: Boolean = false
while (!found && !eof) {
if (adapter.lastReadMatchRecord(result!!.record)) {
logEvent(LoggingKey.read_data, "Record read: ${result.record}")
actualRecord = result.record.duplicate()
Expand All @@ -316,7 +356,8 @@ class SQLDBFile(override var name: String, override var fileMetadata: FileMetada
nextResult = Result(resultSet.toValues());

if (nextResult!!.record.isEmpty()) {
eof = true;
eof = true
result.indicatorEQ = true
closeResultSet()
logEvent(LoggingKey.read_data, "No more record to read")
}
Expand All @@ -327,7 +368,7 @@ class SQLDBFile(override var name: String, override var fileMetadata: FileMetada
return result!!
}

private fun closeResultSet(){
private fun closeResultSet() {
resultSet.closeIfOpen()
resultSet = null
}
Expand Down
33 changes: 19 additions & 14 deletions sql/src/test/kotlin/com/smeup/dbnative/sql/SQLReadTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

package com.smeup.dbnative.sql

import com.smeup.dbnative.file.Result
import com.smeup.dbnative.sql.utils.*
import org.junit.AfterClass
import org.junit.BeforeClass
Expand All @@ -29,7 +30,7 @@ class SQLReadTest {
companion object {

private lateinit var dbManager: SQLDBMManager

@BeforeClass
@JvmStatic
fun setUp() {
Expand All @@ -50,38 +51,42 @@ class SQLReadTest {
fun readUntilEof() {
val dbFile = dbManager.openFile(EMPLOYEE_VIEW_NAME)
var readed = 0;
var readResult = Result()
while (dbFile.eof() == false) {
var readResult = dbFile.read()
readResult = dbFile.read()
readed++
System.out.println("Lettura $readed: " + getEmployeeName(readResult.record))
println("Lettura $readed: " + getEmployeeName(readResult.record))
}
assertEquals(42, readed)
assertTrue(readResult.indicatorEQ)
dbManager.closeFile(EMPLOYEE_VIEW_NAME)
}

@Test
fun positioningAndReadUntilEof() {
val dbFile = dbManager.openFile(EMPLOYEE_VIEW_NAME)
var readed = 0;
val setllResult = dbFile.setll( "C01")
dbFile.setll("C01")
var readResult = Result()
while (dbFile.eof() == false) {
var readResult = dbFile.read()
readResult = dbFile.read()
readed++
System.out.println("Lettura $readed: " + getEmployeeName(readResult.record))
println("Lettura $readed: " + getEmployeeName(readResult.record))
}
assertEquals(36, readed)
assertTrue(readResult.indicatorEQ)
dbManager.closeFile(EMPLOYEE_VIEW_NAME)
}

@Test
fun positioningBlankAndReadUntilEof() {
val dbFile = dbManager.openFile(EMPLOYEE_VIEW_NAME)
var readed = 0;
val setllResult = dbFile.setll( "")
dbFile.setll("")
while (dbFile.eof() == false) {
var readResult = dbFile.read()
readed++
System.out.println("Lettura $readed: " + getEmployeeName(readResult.record))
println("Lettura $readed: " + getEmployeeName(readResult.record))
}
assertEquals(42, readed)
dbManager.closeFile(EMPLOYEE_VIEW_NAME)
Expand All @@ -91,11 +96,11 @@ class SQLReadTest {
fun multipleRead() {
val dbFile = SQLReadTest.dbManager.openFile(MUNICIPALITY_TABLE_NAME)
assertTrue(dbFile.setll(buildMunicipalityKey("IT", "LOM", "BS", "ERBUSCO")))
for(index in 0..138){
for (index in 0..138) {
var result = dbFile.read();
assertTrue{!dbFile.eof()}
if(index == 138) {
assertEquals("CO" , getMunicipalityProv(result.record))
assertTrue { !dbFile.eof() }
if (index == 138) {
assertEquals("CO", getMunicipalityProv(result.record))
}
}
SQLReadTest.dbManager.closeFile(MUNICIPALITY_TABLE_NAME)
Expand All @@ -105,11 +110,11 @@ class SQLReadTest {
fun positioningWithLessKeysAndReadUntilEof() {
val dbFile = dbManager.openFile(MUNICIPALITY_TABLE_NAME)
var readed = 0;
val setllResult = dbFile.setll( buildCountryKey("IT", "LOM", "BS"))
dbFile.setll(buildCountryKey("IT", "LOM", "BS"))
while (dbFile.eof() == false) {
var readResult = dbFile.read()
readed++
System.out.println("Lettura $readed: " + getMunicipalityName(readResult.record))
println("Lettura $readed: " + getMunicipalityName(readResult.record))
}
assertEquals(1001, readed)
dbManager.closeFile(MUNICIPALITY_TABLE_NAME)
Expand Down