From f4c9056bcc7f22ac5519f1bc25405874a1155c50 Mon Sep 17 00:00:00 2001 From: sya-ri Date: Fri, 29 May 2020 23:31:11 +0900 Subject: [PATCH] =?UTF-8?q?ResultSet=E3=81=AE=E6=8B=A1=E5=BC=B5=E9=96=A2?= =?UTF-8?q?=E6=95=B0=E3=82=92=E8=BF=BD=E5=8A=A0=E3=81=97=E3=81=BE=E3=81=97?= =?UTF-8?q?=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 2 +- .../kotlin/me/syari/ss/core/sql/Database.kt | 117 +++++++++++++++++- 2 files changed, 114 insertions(+), 5 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 4e0848d..9f86260 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } group = "me.syari.ss.core" -version = "2.8.1" +version = "2.9" val ssMavenRepoUploadURL: String by extra val ssMavenRepoUploadUser: String by extra diff --git a/src/main/kotlin/me/syari/ss/core/sql/Database.kt b/src/main/kotlin/me/syari/ss/core/sql/Database.kt index 13b6342..14e342c 100644 --- a/src/main/kotlin/me/syari/ss/core/sql/Database.kt +++ b/src/main/kotlin/me/syari/ss/core/sql/Database.kt @@ -1,6 +1,7 @@ package me.syari.ss.core.sql import java.sql.Connection +import java.sql.ResultSet import java.sql.SQLException import java.sql.Statement @@ -30,17 +31,125 @@ interface Database { /** * データベースを使用します + * @param R 任意の戻り値型 * @param run データベースに対して実行する処理 - * @return [Boolean] + * @return [R]? */ - fun use(run: Statement.() -> Unit): Boolean { + fun use(run: Statement.() -> R): R? { return try { getConnection().use { connection -> connection.createStatement().use(run) } - true } catch (ex: SQLException) { - false + null + } + } + + companion object { + /** + * 値が存在していれば 処理を実行し、していなければ null を返します + * @param R 任意のデータ型 + * @param run 値が存在していた時に実行する処理 + * @return [R]? + */ + inline fun ResultSet.nextOrNull(run: ResultSet.() -> R): R? { + return if (next()) { + run.invoke(this) + } else { + null + } + } + + /** + * 全ての値を [Set] に変換します + * @param R 任意のデータ型 + * @param run それぞれの値に対する処理 + * @return [List]<[R]> + */ + inline fun ResultSet.asSet(run: ResultSet.() -> R?): Set { + return mutableSetOf().also { list -> + while (next()) { + list.add(run.invoke(this)) + } + } + } + + /** + * 全ての値を [Set] に変換します + * @param R 任意のデータ型 + * @param run それぞれの値に対する処理 + * @return [List]<[R]> + */ + inline fun ResultSet.asSetNotNull(run: ResultSet.() -> R?): Set { + return mutableSetOf().also { list -> + while (next()) { + run.invoke(this)?.let { list.add(it) } + } + } + } + + /** + * 全ての値を [List] に変換します + * @param R 任意のデータ型 + * @param run それぞれの値に対する処理 + * @return [List]<[R]> + */ + inline fun ResultSet.asList(run: ResultSet.() -> R?): List { + return mutableListOf().also { list -> + while (next()) { + list.add(run.invoke(this)) + } + } + } + + /** + * 全ての値を [List] に変換します + * @param R 任意のデータ型 + * @param run それぞれの値に対する処理 + * @return [List]<[R]> + */ + inline fun ResultSet.asListNotNull(run: ResultSet.() -> R?): List { + return mutableListOf().also { list -> + while (next()) { + run.invoke(this)?.let { list.add(it) } + } + } + } + + /** + * 全ての値を [Map] に変換します + * @param K マップのキーの型 + * @param V マップの値の型 + * @param run それぞれの値に対する処理 + * @return [Map]<[K], [V]> + */ + inline fun ResultSet.asMap(run: ResultSet.() -> Pair?): Map { + return mutableMapOf().also { map -> + while (next()) { + run.invoke(this)?.let { (key, value) -> + map[key] = value + } + } + } + } + + /** + * 全ての値を [Map] に変換します + * @param K マップのキーの型 + * @param V マップの値の型 + * @param run それぞれの値に対する処理 + * @return [Map]<[K], [V]> + */ + inline fun ResultSet.asMapNotNull(run: ResultSet.() -> Pair?): Map { + return mutableMapOf().also { map -> + while (next()) { + run.invoke(this)?.let { (key, value) -> + if (value != null) { + map[key] = value + } + } + } + } } } } \ No newline at end of file