package fr.postgresjson.connexion import com.fasterxml.jackson.core.type.TypeReference import com.github.jasync.sql.db.QueryResult import fr.postgresjson.entity.EntityI class Query(override val name: String, private val sql: String, override val connection: Connection) : EmbedExecutable { override fun toString(): String { return sql } /* Select One */ override fun select( typeReference: TypeReference, values: List, block: (QueryResult, R?) -> Unit ): R? { return connection.select(this.toString(), typeReference, values, block) } inline fun selectOne( values: List = emptyList(), noinline block: SelectOneCallback = {} ): R? = select(object : TypeReference() {}, values, block) override fun select( typeReference: TypeReference, values: Map, block: (QueryResult, R?) -> Unit ): R? { return connection.select(this.toString(), typeReference, values, block) } inline fun selectOne( values: Map, noinline block: SelectOneCallback = {} ): R? = select(object : TypeReference() {}, values, block) /* Select Multiples */ override fun select( typeReference: TypeReference>, values: List, block: (QueryResult, List) -> Unit ): List { return connection.select(this.toString(), typeReference, values, block) } inline fun select( values: List = emptyList(), noinline block: SelectCallback = {} ): List = select(object : TypeReference>() {}, values, block) override fun select( typeReference: TypeReference>, values: Map, block: (QueryResult, List) -> Unit ): List { return connection.select(this.toString(), typeReference, values, block) } inline fun select( values: Map, noinline block: SelectCallback = {} ): List = select(object : TypeReference>() {}, values, block) override fun select( page: Int, limit: Int, typeReference: TypeReference>, values: Map, block: (QueryResult, Paginated) -> Unit ): Paginated { return connection.select(this.toString(), page, limit, typeReference, values, block) } /* Select Paginated */ inline fun select( page: Int, limit: Int, values: Map = emptyMap(), noinline block: SelectPaginatedCallback = {} ): Paginated = select(page, limit, object : TypeReference>() {}, values, block) /* Execute function without traitements */ override fun exec(values: List): QueryResult { return connection.exec(sql, values) } override fun exec(values: Map): QueryResult { return connection.exec(sql, values) } override fun sendQuery(values: List): Int { return connection.sendQuery(sql, values) } override fun sendQuery(values: Map): Int { return connection.sendQuery(sql, values) } }