Skip to content

Commit bbd0bc4

Browse files
committed
feat: mysql support
1 parent cba35d0 commit bbd0bc4

File tree

11 files changed

+431
-77
lines changed

11 files changed

+431
-77
lines changed

internal/codegen/enums.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package codegen
2+
3+
import (
4+
"fmt"
5+
"github.com/iancoleman/strcase"
6+
"github.com/tandemdude/sqlc-gen-java/internal/core"
7+
"regexp"
8+
"strings"
9+
"unicode"
10+
"unicode/utf8"
11+
)
12+
13+
var javaInvalidIdentChars = regexp.MustCompile("[^$\\w]")
14+
15+
func EnumClassName(qualifiedName, defaultSchema string) string {
16+
return strcase.ToCamel(strings.TrimPrefix(qualifiedName, defaultSchema+"."))
17+
}
18+
19+
func enumValueName(value string) string {
20+
rep := strings.NewReplacer("-", "_", ":", "_", "/", "_", ".", "_")
21+
name := rep.Replace(value)
22+
name = strings.ToUpper(name)
23+
name = javaInvalidIdentChars.ReplaceAllString(name, "")
24+
25+
r, _ := utf8.DecodeRuneInString(name)
26+
if unicode.IsDigit(r) {
27+
name = "_" + name
28+
}
29+
return name
30+
}
31+
32+
func BuildEnumFile(engine string, conf core.Config, qualName string, enum core.Enum, defaultSchema string) (string, []byte, error) {
33+
className := EnumClassName(qualName, defaultSchema)
34+
35+
sb := IndentStringBuilder{indentChar: conf.IndentChar, charsPerIndentLevel: conf.CharsPerIndentLevel}
36+
sb.writeSqlcHeader()
37+
sb.WriteString("\n")
38+
sb.WriteString("package " + conf.Package + ".enums;\n")
39+
sb.WriteString("\n")
40+
sb.WriteString("public enum " + className + " {\n")
41+
42+
if engine == "mysql" {
43+
sb.WriteIndentedString(1, "BLANK(\"\"),\n")
44+
}
45+
46+
// write other values
47+
for i, value := range enum.Values {
48+
name := enumValueName(value)
49+
sb.WriteIndentedString(1, fmt.Sprintf("%s(\"%s\")", name, value))
50+
51+
if i < len(enum.Values)-1 {
52+
sb.WriteString(",\n")
53+
}
54+
}
55+
sb.WriteString(";\n\n")
56+
sb.WriteIndentedString(1, "private final String value;\n")
57+
sb.WriteIndentedString(1, className+"(final String value) {this.value = value;}\n")
58+
sb.WriteIndentedString(1, "public String getValue() {return this.value;}\n")
59+
sb.WriteString("}\n")
60+
61+
return fmt.Sprintf("enums/%s.java", className), []byte(sb.String()), nil
62+
}

internal/core/models.go

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ type JavaType struct {
4141
Type string
4242
IsList bool
4343
IsNullable bool
44+
IsEnum bool
4445
}
4546

4647
type QueryArg struct {
@@ -94,6 +95,10 @@ func (q QueryArg) BindStmt() string {
9495
return fmt.Sprintf("%s == null ? stmt.setNull(%d, java.sql.Types.%s) : %s", q.Name, q.Number, javaSqlType, rawSet)
9596
}
9697

98+
if q.JavaType.IsEnum {
99+
return fmt.Sprintf("stmt.setString(%d, %s.getValue());", q.Number, q.Name)
100+
}
101+
97102
return fmt.Sprintf("stmt.setObject(%d, %s);", q.Number, q.Name)
98103
}
99104

@@ -107,7 +112,6 @@ func (q QueryReturn) ResultStmt(number int) string {
107112
typeOnly := q.JavaType.Type[strings.LastIndex(q.JavaType.Type, ".")+1:]
108113

109114
if q.JavaType.IsList {
110-
// TODO - check for nullable array support
111115
if q.JavaType.IsNullable {
112116
return fmt.Sprintf("getList(results, %d, %s[].class)", number, typeOnly)
113117
}
@@ -127,6 +131,13 @@ func (q QueryReturn) ResultStmt(number int) string {
127131
return fmt.Sprintf("results.get%s(%d)", typeOnly, number)
128132
}
129133

134+
if q.JavaType.IsEnum {
135+
if q.JavaType.IsNullable {
136+
return fmt.Sprintf("Optional.ofNullable(results.getSting(%d)).map(%s::valueOf).orElse(null)", number, typeOnly)
137+
}
138+
return fmt.Sprintf("%s.valueOf(results.getString(%d))", typeOnly, number)
139+
}
140+
130141
return fmt.Sprintf("results.getObject(%d, %s.class)", number, typeOnly)
131142
}
132143

@@ -149,7 +160,15 @@ type NullableHelpers struct {
149160
List bool
150161
}
151162

163+
type Enum struct {
164+
Schema string
165+
Name string
166+
Values []string
167+
}
168+
152169
type (
153170
Queries map[string][]Query
154171
EmbeddedModels map[string][]QueryReturn
172+
// Enums is a map of "schema_name.enum_name" to enum value.
173+
Enums map[string]Enum
155174
)

0 commit comments

Comments
 (0)