Skip to content

Commit ec25eb8

Browse files
tester dato/tidspunkter
1 parent f8cebb9 commit ec25eb8

2 files changed

Lines changed: 56 additions & 13 deletions

File tree

  • sql-dsl/src
    • main/kotlin/com/github/navikt/tbd_libs/sql_dsl
    • test/kotlin/com/github/navikt/tbd_libs/sql_dsl

sql-dsl/src/main/kotlin/com/github/navikt/tbd_libs/sql_dsl/Query.kt

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
package com.github.navikt.tbd_libs.sql_dsl
22

33
import java.sql.Connection
4-
import java.sql.Date
54
import java.sql.PreparedStatement
65
import java.sql.ResultSet
7-
import java.sql.Timestamp
6+
import java.sql.Types
87
import java.time.Instant
98
import java.time.LocalDate
109
import java.time.LocalDateTime
1110
import java.time.OffsetDateTime
1211
import java.time.ZoneId
1312
import java.time.ZonedDateTime
14-
import java.util.UUID
13+
import java.util.*
1514
import javax.sql.DataSource
1615

1716
fun <R> DataSource.connection(block: Connection.() -> R): R {
@@ -135,10 +134,7 @@ data class ParametersBuilder(
135134
* siden Instant alltid er UTC-tid så er det ett fett hvilken kolonne som brukes.
136135
*/
137136
fun withParameter(name: String, value: Instant) {
138-
// relevant dokumentasjon: https://jdbc.postgresql.org/documentation/query/#using-java-8-date-and-time-classes
139-
// > ZonedDateTime , Instant and OffsetTime / TIME WITH TIME ZONE are not supported
140-
// derfor lagrer vi via java.sql.Timestamp
141-
withParameter(name) { setObject(it, Timestamp.from(value)) }
137+
withParameter(name) { setObject(it, value, Types.OTHER) }
142138
}
143139

144140
/**
@@ -175,7 +171,7 @@ data class ParametersBuilder(
175171
}
176172

177173
fun withParameter(name: String, value: LocalDate) {
178-
withParameter(name) { setDate(it, Date.valueOf(value)) }
174+
withParameter(name) { setObject(it, value, Types.DATE) }
179175
}
180176

181177
inline fun <reified T> withParameter(name: String, value: List<T>) {

sql-dsl/src/test/kotlin/com/github/navikt/tbd_libs/sql_dsl/QueryTest.kt

Lines changed: 52 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,12 @@ import com.github.navikt.tbd_libs.test_support.DatabaseContainers
44
import java.sql.Connection
55
import java.sql.ResultSet
66
import java.time.Instant
7+
import java.time.LocalDate
8+
import java.time.LocalDateTime
79
import java.time.OffsetDateTime
10+
import java.time.ZoneOffset
811
import java.time.temporal.ChronoUnit.MILLIS
12+
import java.time.temporal.Temporal
913
import java.util.UUID
1014
import javax.sql.DataSource
1115
import org.intellij.lang.annotations.Language
@@ -183,22 +187,64 @@ class QueryTest {
183187
}
184188

185189
@Test
186-
fun `setter tidspunkt`() = setupTest { connection ->
190+
fun `parameter - localdate`() = setupTest { connection ->
191+
@Language("PostgreSQL")
192+
val sql = """create table datotest ( dato date )"""
193+
connection.createStatement().execute(sql)
194+
195+
val dato = LocalDate.now()
196+
connection.prepareStatementWithNamedParameters("insert into datotest (dato) values (:dato)") {
197+
withParameter("dato", dato)
198+
}.use { it.execute() }
199+
200+
val result = connection.prepareStatement("select dato from datotest").use {
201+
it.executeQuery().single { rs -> rs.getObject("dato", LocalDate::class.java) }
202+
}
203+
204+
assertEquals(dato, result)
205+
}
206+
207+
@Test
208+
fun `parameter - instant - timestamptz`() = setupTest { connection ->
187209
val instant = Instant.now()
188-
connection.prepareStatementWithNamedParameters("insert into name (name, created) values (:navn, :tidspunkt)") {
210+
connection.prepareStatementWithNamedParameters("insert into name (name, created_tz) values (:navn, :tidspunkt)") {
189211
withParameter("navn", "trude")
190212
withParameter("tidspunkt", instant)
191213
}.execute()
192214

193-
val tidspunkt = connection.prepareStatementWithNamedParameters("select created from name where name = :navn") {
215+
val tidspunkt = connection.prepareStatementWithNamedParameters("select created_tz from name where name = :navn") {
194216
withParameter("navn", "trude")
195217
}.use {
196-
it.executeQuery().single { rs -> rs.getObject("created", OffsetDateTime::class.java) }
218+
it.executeQuery().single { rs -> rs.getObject("created_tz", OffsetDateTime::class.java) }
197219
}.toInstant()
198220

199221
assertEquals(instant.truncatedTo(MILLIS), tidspunkt.truncatedTo(MILLIS))
200222
}
201223

224+
@Test
225+
fun `parameter - instant - timestamp`() = setupTest { connection ->
226+
val instant = Instant.now()
227+
connection.prepareStatementWithNamedParameters("insert into name (name, created_ts) values (:navn, :tidspunkt)") {
228+
withParameter("navn", "trude")
229+
withParameter("tidspunkt", instant)
230+
}.execute()
231+
232+
fun <T: Temporal> hentTidspunkt(mapper: (ResultSet) -> T): T {
233+
return connection.prepareStatementWithNamedParameters("select created_ts from name where name = :navn") {
234+
withParameter("navn", "trude")
235+
}.use {
236+
it.executeQuery().single(mapper)
237+
}
238+
}
239+
240+
hentTidspunkt { rs -> rs.getObject("created_ts", OffsetDateTime::class.java) }
241+
.toInstant()
242+
.also { tidspunkt -> assertEquals(instant.truncatedTo(MILLIS), tidspunkt.truncatedTo(MILLIS)) }
243+
244+
hentTidspunkt { rs -> rs.getObject("created_ts", LocalDateTime::class.java) }
245+
.toInstant(ZoneOffset.UTC)
246+
.also { tidspunkt -> assertEquals(instant.truncatedTo(MILLIS), tidspunkt.truncatedTo(MILLIS)) }
247+
}
202248

203249
@Test
204250
fun `named parameters`() {
@@ -231,7 +277,8 @@ class QueryTest {
231277
val sql = """create table name (
232278
id bigint primary key generated always as identity,
233279
name text,
234-
created timestamptz not null default now()
280+
created_tz timestamptz not null default now(),
281+
created_ts timestamp not null default now()
235282
)"""
236283
createStatement().execute(sql)
237284
}

0 commit comments

Comments
 (0)