@@ -79,28 +79,60 @@ func (v KtQueryValue) Type() string {
7979 panic ("no type for KtQueryValue: " + v .Name )
8080}
8181
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+
8298func (v KtQueryValue ) Params () string {
8399 if v .isEmpty () {
84100 return ""
85101 }
86102 var out []string
87103 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 ))
89105 } else {
90106 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 ))
92108 }
93109 }
94110 return strings .Join (out , "\n " )
95111}
96112
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+
97129func (v KtQueryValue ) ResultSet () string {
98130 var out []string
99131 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 ))
101133 } else {
102134 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 ))
104136 }
105137 }
106138 ret := strings .Join (out , ",\n " )
@@ -110,19 +142,6 @@ func (v KtQueryValue) ResultSet() string {
110142 return ret
111143}
112144
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-
126145// A struct used to generate methods and fields on the Queries struct
127146type KtQuery struct {
128147 ClassName string
@@ -279,6 +298,25 @@ func QueryKtImports(r KtGenerateable, settings dinosql.CombinedSettings, filenam
279298 return false
280299 }
281300
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+
282320 std := map [string ]struct {}{
283321 "java.sql.Connection" : {},
284322 "java.sql.SQLException" : {},
@@ -295,6 +333,9 @@ func QueryKtImports(r KtGenerateable, settings dinosql.CombinedSettings, filenam
295333 if uses ("OffsetDateTime" ) {
296334 std ["java.time.OffsetDateTime" ] = struct {}{}
297335 }
336+ if hasEnum () {
337+ std ["java.sql.Types" ] = struct {}{}
338+ }
298339
299340 pkg := make (map [string ]struct {})
300341
@@ -422,7 +463,7 @@ type ktType struct {
422463func (t ktType ) String () string {
423464 v := t .Name
424465 if t .IsArray {
425- v = fmt .Sprintf ("Array <%s>" , v )
466+ v = fmt .Sprintf ("List <%s>" , v )
426467 } else if t .IsNull {
427468 v += "?"
428469 }
@@ -433,18 +474,11 @@ func (t ktType) jdbcSetter() string {
433474 return "set" + t .jdbcType ()
434475}
435476
436- func (t ktType ) jdbcGetter () string {
437- return "get" + t .jdbcType ()
438- }
439-
440477func (t ktType ) jdbcType () string {
441478 if t .IsArray {
442479 return "Array"
443480 }
444- if t .IsEnum {
445- return "String"
446- }
447- if t .IsTime () {
481+ if t .IsEnum || t .IsTime () {
448482 return "Object"
449483 }
450484 return t .Name
@@ -454,36 +488,6 @@ func (t ktType) IsTime() bool {
454488 return t .Name == "LocalDate" || t .Name == "LocalDateTime" || t .Name == "LocalTime" || t .Name == "OffsetDateTime"
455489}
456490
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-
487491func (r Result ) ktType (col core.Column , settings dinosql.CombinedSettings ) ktType {
488492 typ , isEnum := r .ktInnerType (col , settings )
489493 return ktType {
@@ -777,7 +781,12 @@ enum class {{.Name}}(val value: String) {
777781 {{- range $i, $e := .Constants}}
778782 {{- if $i }},{{end}}
779783 {{.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+ }
781790}
782791{{end}}
783792
0 commit comments