8
8
9
9
"github.com/jinzhu/inflection"
10
10
"github.com/kyleconroy/sqlc/internal/dinosql"
11
+ core "github.com/kyleconroy/sqlc/internal/pg"
11
12
"vitess.io/vitess/go/vt/sqlparser"
12
13
)
13
14
@@ -67,7 +68,8 @@ func (r *Result) Structs(settings dinosql.GenerateSettings) []dinosql.GoStruct {
67
68
var structs []dinosql.GoStruct
68
69
for tableName , cols := range r .Schema .tables {
69
70
s := dinosql.GoStruct {
70
- Name : inflection .Singular (dinosql .StructName (tableName , settings )),
71
+ Name : inflection .Singular (dinosql .StructName (tableName , settings )),
72
+ Table : core.FQN {tableName , "" , "" }, // TODO: Complete hack. Only need for equality check to see if struct can be reused between queries
71
73
}
72
74
73
75
for _ , col := range cols {
@@ -136,8 +138,8 @@ func (r *Result) GoQueries(settings dinosql.GenerateSettings) []dinosql.GoQuery
136
138
if len (query .Columns ) == 1 {
137
139
c := query .Columns [0 ]
138
140
gq .Ret = dinosql.GoQueryValue {
139
- Name : columnName (c , 0 ),
140
- Typ : goTypeCol (c , settings ),
141
+ Name : columnName (c . ColumnDefinition , 0 ),
142
+ Typ : goTypeCol (c . ColumnDefinition , settings ),
141
143
}
142
144
} else if len (query .Columns ) > 1 {
143
145
var gs * dinosql.GoStruct
@@ -150,11 +152,13 @@ func (r *Result) GoQueries(settings dinosql.GenerateSettings) []dinosql.GoQuery
150
152
same := true
151
153
for i , f := range s .Fields {
152
154
c := query .Columns [i ]
153
- sameName := f .Name == dinosql .StructName (columnName (c , i ), settings )
154
- sameType := f .Type == goTypeCol (c , settings )
155
- // TODO: consider making this deep equality from stdlib?
156
- // sameFQN := s.Table.EqualTo(&c.Table)
157
- if ! sameName || ! sameType || true { // !sameFQN
155
+ sameName := f .Name == dinosql .StructName (columnName (c .ColumnDefinition , i ), settings )
156
+ sameType := f .Type == goTypeCol (c .ColumnDefinition , settings )
157
+
158
+ hackedFQN := core.FQN {c .Table , "" , "" } // TODO: only check needed here is equality to see if struct can be reused, this type should be removed or properly used
159
+ sameTable := s .Table .Catalog == hackedFQN .Catalog && s .Table .Schema == hackedFQN .Schema && s .Table .Rel == hackedFQN .Rel
160
+
161
+ if ! sameName || ! sameType || ! sameTable {
158
162
same = false
159
163
}
160
164
}
@@ -169,7 +173,7 @@ func (r *Result) GoQueries(settings dinosql.GenerateSettings) []dinosql.GoQuery
169
173
for i := range query .Columns {
170
174
structInfo [i ] = structParams {
171
175
originalName : query .Columns [i ].Name .String (),
172
- goType : goTypeCol (query .Columns [i ], settings ),
176
+ goType : goTypeCol (query .Columns [i ]. ColumnDefinition , settings ),
173
177
}
174
178
}
175
179
gs = r .columnsToStruct (gq .MethodName + "Row" , structInfo , settings )
@@ -219,30 +223,38 @@ func (r *Result) columnsToStruct(name string, items []structParams, settings din
219
223
220
224
func goTypeCol (col * sqlparser.ColumnDefinition , settings dinosql.GenerateSettings ) string {
221
225
switch t := col .Type .Type ; {
222
- case "varchar" == t , "text" == t :
226
+ case "varchar" == t , "text" == t , "char" == t ,
227
+ "tinytext" == t , "mediumtext" == t , "longtext" == t :
223
228
if col .Type .NotNull {
224
229
return "string"
225
230
}
226
231
return "sql.NullString"
227
- case "int" == t , "integer" == t :
232
+ case "int" == t , "integer" == t , t == "smallint" ,
233
+ t == "tinyint" , "mediumint" == t , "bigint" == t , "year" == t :
228
234
if col .Type .NotNull {
229
235
return "int"
230
236
}
231
237
return "sql.NullInt64"
238
+ case "blob" == t , "binary" == t , "varbinary" == t , "tinyblob" == t ,
239
+ "mediumblob" == t , "longblob" == t :
240
+ return "[]byte"
232
241
case "float" == t , strings .HasPrefix (strings .ToLower (t ), "decimal" ):
233
242
if col .Type .NotNull {
234
243
return "float64"
235
244
}
236
245
return "sql.NullFloat64"
237
246
case "enum" == t :
238
247
return enumNameFromColDef (col , settings )
239
- case "date" == t , "timestamp" == t , "datetime" == t :
248
+ case "date" == t , "timestamp" == t , "datetime" == t , "time" == t :
240
249
if col .Type .NotNull {
241
250
return "time.Time"
242
251
}
243
252
return "sql.NullTime"
244
253
case "boolean" == t :
245
- return "bool"
254
+ if col .Type .NotNull {
255
+ return "bool"
256
+ }
257
+ return "sql.NullBool"
246
258
default :
247
259
log .Printf ("unknown MySQL type: %s\n " , t )
248
260
return "interface{}"
0 commit comments