Thu, 19 Nov 2020 13:58:54 +0100
migrates DAO classes
/* * Copyright 2020 Mike Becker. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ package de.uapcore.lightpit.dao import java.sql.PreparedStatement import java.sql.ResultSet import java.sql.Types abstract class AbstractDao<T> { abstract fun mapResult(rs: ResultSet): T protected fun list(stmt: PreparedStatement): List<T> { return sequence { stmt.executeQuery().use { result -> while (result.next()) yield(mapResult(result)) } }.toList() } protected fun find(stmt: PreparedStatement): T? { stmt.executeQuery().use { result -> return if (result.next()) { mapResult(result) } else { null } } } // TODO: create PreparedStatement abstraction that provides some features // TODO: remove the following legacy code helper function protected fun <T> setForeignKeyOrNull(stmt: PreparedStatement, index: Int, instance: T?, keyGetter: (obj: T) -> Int) { if (instance == null) { stmt.setNull(index, Types.INTEGER) } else { stmt.setInt(index, keyGetter(instance)) } } }