Skip to content
This repository has been archived by the owner on Jan 4, 2021. It is now read-only.

Commit

Permalink
ResultSetの拡張関数を追加しました
Browse files Browse the repository at this point in the history
  • Loading branch information
sya-ri committed May 29, 2020
1 parent c6b22d2 commit f4c9056
Show file tree
Hide file tree
Showing 2 changed files with 114 additions and 5 deletions.
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
117 changes: 113 additions & 4 deletions src/main/kotlin/me/syari/ss/core/sql/Database.kt
Original file line number Diff line number Diff line change
@@ -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

Expand Down Expand Up @@ -30,17 +31,125 @@ interface Database {

/**
* データベースを使用します
* @param R 任意の戻り値型
* @param run データベースに対して実行する処理
* @return [Boolean]
* @return [R]?
*/
fun use(run: Statement.() -> Unit): Boolean {
fun <R> 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 <R> ResultSet.nextOrNull(run: ResultSet.() -> R): R? {
return if (next()) {
run.invoke(this)
} else {
null
}
}

/**
* 全ての値を [Set] に変換します
* @param R 任意のデータ型
* @param run それぞれの値に対する処理
* @return [List]<[R]>
*/
inline fun <R> ResultSet.asSet(run: ResultSet.() -> R?): Set<R?> {
return mutableSetOf<R?>().also { list ->
while (next()) {
list.add(run.invoke(this))
}
}
}

/**
* 全ての値を [Set] に変換します
* @param R 任意のデータ型
* @param run それぞれの値に対する処理
* @return [List]<[R]>
*/
inline fun <R> ResultSet.asSetNotNull(run: ResultSet.() -> R?): Set<R> {
return mutableSetOf<R>().also { list ->
while (next()) {
run.invoke(this)?.let { list.add(it) }
}
}
}

/**
* 全ての値を [List] に変換します
* @param R 任意のデータ型
* @param run それぞれの値に対する処理
* @return [List]<[R]>
*/
inline fun <R> ResultSet.asList(run: ResultSet.() -> R?): List<R?> {
return mutableListOf<R?>().also { list ->
while (next()) {
list.add(run.invoke(this))
}
}
}

/**
* 全ての値を [List] に変換します
* @param R 任意のデータ型
* @param run それぞれの値に対する処理
* @return [List]<[R]>
*/
inline fun <R> ResultSet.asListNotNull(run: ResultSet.() -> R?): List<R> {
return mutableListOf<R>().also { list ->
while (next()) {
run.invoke(this)?.let { list.add(it) }
}
}
}

/**
* 全ての値を [Map] に変換します
* @param K マップのキーの型
* @param V マップの値の型
* @param run それぞれの値に対する処理
* @return [Map]<[K], [V]>
*/
inline fun <K, V> ResultSet.asMap(run: ResultSet.() -> Pair<K, V?>?): Map<K, V?> {
return mutableMapOf<K, V?>().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 <K, V> ResultSet.asMapNotNull(run: ResultSet.() -> Pair<K, V?>?): Map<K, V> {
return mutableMapOf<K, V>().also { map ->
while (next()) {
run.invoke(this)?.let { (key, value) ->
if (value != null) {
map[key] = value
}
}
}
}
}
}
}

0 comments on commit f4c9056

Please sign in to comment.