@@ -79,28 +79,60 @@ func (v KtQueryValue) Type() string {
79
79
panic ("no type for KtQueryValue: " + v .Name )
80
80
}
81
81
82
+ func jdbcSet (t ktType , idx int , name string ) string {
83
+ if t .IsEnum && t .IsArray {
84
+ return fmt .Sprintf (`stmt.setArray(%d, conn.createArrayOf("%s", %s.map { v -> v.value }.toTypedArray()))` , idx , t .DataType , name )
85
+ }
86
+ if t .IsEnum {
87
+ return fmt .Sprintf ("stmt.setObject(%d, %s.value, %s)" , idx , name , "Types.OTHER" )
88
+ }
89
+ if t .IsArray {
90
+ return fmt .Sprintf (`stmt.setArray(%d, conn.createArrayOf("%s", %s.toTypedArray()))` , idx , t .DataType , name )
91
+ }
92
+ if t .IsTime () {
93
+ return fmt .Sprintf ("stmt.setObject(%d, %s)" , idx , name )
94
+ }
95
+ return fmt .Sprintf ("stmt.set%s(%d, %s)" , t .Name , idx , name )
96
+ }
97
+
82
98
func (v KtQueryValue ) Params () string {
83
99
if v .isEmpty () {
84
100
return ""
85
101
}
86
102
var out []string
87
103
if v .Struct == nil {
88
- out = append (out , fmt . Sprintf ( "stmt.%s(%d, %s)" , v .Typ . jdbcSetter () , 1 , v .Typ . jdbcValue ( v . Name ) ))
104
+ out = append (out , jdbcSet ( v .Typ , 1 , v .Name ))
89
105
} else {
90
106
for i , f := range v .Struct .Fields {
91
- out = append (out , fmt . Sprintf ( "stmt.%s(%d, %s)" , f .Type . jdbcSetter () , i + 1 , f . Type . jdbcValue ( v .Name + "." + f .Name ) ))
107
+ out = append (out , jdbcSet ( f .Type , i + 1 , v .Name + "." + f .Name ))
92
108
}
93
109
}
94
110
return strings .Join (out , "\n " )
95
111
}
96
112
113
+ func jdbcGet (t ktType , idx int ) string {
114
+ if t .IsEnum && t .IsArray {
115
+ return fmt .Sprintf (`(results.getArray(%d).array as Array<String>).map { v -> %s.lookup(v)!! }.toList()` , idx , t .Name )
116
+ }
117
+ if t .IsEnum {
118
+ return fmt .Sprintf ("%s.lookup(results.getString(%d))!!" , t .Name , idx )
119
+ }
120
+ if t .IsArray {
121
+ return fmt .Sprintf (`(results.getArray(%d).array as Array<%s>).toList()` , idx , t .Name )
122
+ }
123
+ if t .IsTime () {
124
+ return fmt .Sprintf (`results.getObject(%d, %s::class.java)` , idx , t .Name )
125
+ }
126
+ return fmt .Sprintf (`results.get%s(%d)` , t .Name , idx )
127
+ }
128
+
97
129
func (v KtQueryValue ) ResultSet () string {
98
130
var out []string
99
131
if v .Struct == nil {
100
- out = append (out , v . Typ . fromJDBCValue ( fmt . Sprintf ( "%s.%s(%d)" , v . Name , v . Typ . jdbcGetter () , 1 ) ))
132
+ out = append (out , jdbcGet ( v . Typ , 1 ))
101
133
} else {
102
134
for i , f := range v .Struct .Fields {
103
- out = append (out , f . Type . fromJDBCValue ( fmt . Sprintf ( "%s.%s(%d)" , v . Name , f .Type . jdbcGetter () , i + 1 ) ))
135
+ out = append (out , jdbcGet ( f .Type , i + 1 ))
104
136
}
105
137
}
106
138
ret := strings .Join (out , ",\n " )
@@ -110,19 +142,6 @@ func (v KtQueryValue) ResultSet() string {
110
142
return ret
111
143
}
112
144
113
- type KtQueryParam struct {
114
- Name string
115
- Typ string
116
- }
117
-
118
- func (p KtQueryParam ) Getter () string {
119
- return "get" + strings .TrimSuffix (p .Typ , "?" )
120
- }
121
-
122
- func (p KtQueryParam ) Setter () string {
123
- return "set" + strings .TrimSuffix (p .Typ , "?" )
124
- }
125
-
126
145
// A struct used to generate methods and fields on the Queries struct
127
146
type KtQuery struct {
128
147
ClassName string
@@ -279,6 +298,25 @@ func QueryKtImports(r KtGenerateable, settings dinosql.CombinedSettings, filenam
279
298
return false
280
299
}
281
300
301
+ hasEnum := func () bool {
302
+ for _ , q := range gq {
303
+ if ! q .Arg .isEmpty () {
304
+ if q .Arg .IsStruct () {
305
+ for _ , f := range q .Arg .Struct .Fields {
306
+ if f .Type .IsEnum {
307
+ return true
308
+ }
309
+ }
310
+ } else {
311
+ if q .Arg .Typ .IsEnum {
312
+ return true
313
+ }
314
+ }
315
+ }
316
+ }
317
+ return false
318
+ }
319
+
282
320
std := map [string ]struct {}{
283
321
"java.sql.Connection" : {},
284
322
"java.sql.SQLException" : {},
@@ -295,6 +333,9 @@ func QueryKtImports(r KtGenerateable, settings dinosql.CombinedSettings, filenam
295
333
if uses ("OffsetDateTime" ) {
296
334
std ["java.time.OffsetDateTime" ] = struct {}{}
297
335
}
336
+ if hasEnum () {
337
+ std ["java.sql.Types" ] = struct {}{}
338
+ }
298
339
299
340
pkg := make (map [string ]struct {})
300
341
@@ -422,7 +463,7 @@ type ktType struct {
422
463
func (t ktType ) String () string {
423
464
v := t .Name
424
465
if t .IsArray {
425
- v = fmt .Sprintf ("Array <%s>" , v )
466
+ v = fmt .Sprintf ("List <%s>" , v )
426
467
} else if t .IsNull {
427
468
v += "?"
428
469
}
@@ -433,18 +474,11 @@ func (t ktType) jdbcSetter() string {
433
474
return "set" + t .jdbcType ()
434
475
}
435
476
436
- func (t ktType ) jdbcGetter () string {
437
- return "get" + t .jdbcType ()
438
- }
439
-
440
477
func (t ktType ) jdbcType () string {
441
478
if t .IsArray {
442
479
return "Array"
443
480
}
444
- if t .IsEnum {
445
- return "String"
446
- }
447
- if t .IsTime () {
481
+ if t .IsEnum || t .IsTime () {
448
482
return "Object"
449
483
}
450
484
return t .Name
@@ -454,36 +488,6 @@ func (t ktType) IsTime() bool {
454
488
return t .Name == "LocalDate" || t .Name == "LocalDateTime" || t .Name == "LocalTime" || t .Name == "OffsetDateTime"
455
489
}
456
490
457
- func (t ktType ) jdbcValue (name string ) string {
458
- if t .IsEnum && t .IsArray {
459
- return fmt .Sprintf (`conn.createArrayOf("%s", %s.map { v -> v.value }.toTypedArray())` , t .DataType , name )
460
- }
461
- if t .IsEnum {
462
- return name + ".value"
463
- }
464
- if t .IsArray {
465
- return fmt .Sprintf (`conn.createArrayOf("%s", %s)` , t .DataType , name )
466
- }
467
- return name
468
- }
469
-
470
- func (t ktType ) fromJDBCValue (expr string ) string {
471
- if t .IsEnum && t .IsArray {
472
- return fmt .Sprintf (`(%s.array as Array<String>).map { v -> %s.valueOf(v) }.toTypedArray()` , expr , t .Name )
473
- }
474
- if t .IsEnum {
475
- return fmt .Sprintf ("%s.valueOf(%s)" , t .Name , expr )
476
- }
477
- if t .IsArray {
478
- return fmt .Sprintf (`%s.array as Array<%s>` , expr , t .Name )
479
- }
480
- if t .IsTime () {
481
- expr = strings .TrimSuffix (expr , ")" )
482
- return fmt .Sprintf (`%s, %s::class.java)` , expr , t .Name )
483
- }
484
- return expr
485
- }
486
-
487
491
func (r Result ) ktType (col core.Column , settings dinosql.CombinedSettings ) ktType {
488
492
typ , isEnum := r .ktInnerType (col , settings )
489
493
return ktType {
@@ -777,7 +781,12 @@ enum class {{.Name}}(val value: String) {
777
781
{{- range $i, $e := .Constants}}
778
782
{{- if $i }},{{end}}
779
783
{{.Name}}("{{.Value}}")
780
- {{- end}}
784
+ {{- end}};
785
+
786
+ companion object {
787
+ private val map = {{.Name}}.values().associateBy({{.Name}}::value)
788
+ fun lookup(value: String) = map[value]
789
+ }
781
790
}
782
791
{{end}}
783
792
0 commit comments