forked from cashapp/sqldelight
-
Notifications
You must be signed in to change notification settings - Fork 0
/
MySqlType.kt
69 lines (60 loc) · 2.44 KB
/
MySqlType.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package app.cash.sqldelight.dialects.mysql
import app.cash.sqldelight.dialect.api.DialectType
import com.squareup.kotlinpoet.BOOLEAN
import com.squareup.kotlinpoet.BYTE
import com.squareup.kotlinpoet.ClassName
import com.squareup.kotlinpoet.CodeBlock
import com.squareup.kotlinpoet.INT
import com.squareup.kotlinpoet.LONG
import com.squareup.kotlinpoet.SHORT
import com.squareup.kotlinpoet.TypeName
internal enum class MySqlType(override val javaType: TypeName) : DialectType {
TINY_INT(BYTE) {
override fun decode(value: CodeBlock) = CodeBlock.of("%L.toByte()", value)
override fun encode(value: CodeBlock) = CodeBlock.of("%L.toLong()", value)
},
TINY_INT_BOOL(BOOLEAN) {
override fun decode(value: CodeBlock) = CodeBlock.of("%L == 1L", value)
override fun encode(value: CodeBlock) = CodeBlock.of("if (%L) 1L else 0L", value)
},
SMALL_INT(SHORT) {
override fun decode(value: CodeBlock) = CodeBlock.of("%L.toShort()", value)
override fun encode(value: CodeBlock) = CodeBlock.of("%L.toLong()", value)
},
INTEGER(INT) {
override fun decode(value: CodeBlock) = CodeBlock.of("%L.toInt()", value)
override fun encode(value: CodeBlock) = CodeBlock.of("%L.toLong()", value)
},
BIG_INT(LONG),
BIT(BOOLEAN) {
override fun decode(value: CodeBlock) = CodeBlock.of("%L == 1L", value)
override fun encode(value: CodeBlock) = CodeBlock.of("if (%L) 1L else 0L", value)
},
NUMERIC(ClassName("java.math", "BigDecimal")),
DATE(ClassName("java.time", "LocalDate")),
TIME(ClassName("java.time", "LocalTime")),
DATETIME(ClassName("java.time", "LocalDateTime")),
TIMESTAMP(ClassName("java.time", "OffsetDateTime"))
;
override fun prepareStatementBinder(columnIndex: String, value: CodeBlock): CodeBlock {
return CodeBlock.builder()
.add(
when (this) {
TINY_INT, TINY_INT_BOOL, SMALL_INT, INTEGER, BIG_INT, BIT -> "bindLong"
DATE, TIME, DATETIME, TIMESTAMP -> "bindObject"
NUMERIC -> "bindBigDecimal"
},
)
.add("($columnIndex, %L)\n", value)
.build()
}
override fun cursorGetter(columnIndex: Int, cursorName: String): CodeBlock {
return CodeBlock.of(
when (this) {
TINY_INT, TINY_INT_BOOL, SMALL_INT, INTEGER, BIG_INT, BIT -> "$cursorName.getLong($columnIndex)"
DATE, TIME, DATETIME, TIMESTAMP -> "$cursorName.getObject<$javaType>($columnIndex)"
NUMERIC -> "$cursorName.getBigDecimal($columnIndex)"
},
)
}
}