// mapColumns creates a list of field addresses and column maps, to // make looking up the column for a field address easier. Note that // it doesn't do any special handling for overridden fields, because // passing the address of a field that has been overridden is // difficult to do accidentally. func (plan *QueryPlan) mapColumns(table *gorp.TableMap, value reflect.Value) (err error) { value = value.Elem() valueType := value.Type() if plan.colMap == nil { plan.colMap = make(structColumnMap, 0, value.NumField()) } queryableFields := 0 quotedTableName := plan.dbMap.Dialect.QuotedTableForQuery(table.SchemaName, table.TableName) for i := 0; i < value.NumField(); i++ { fieldType := valueType.Field(i) fieldVal := value.Field(i) if fieldType.Anonymous { if fieldVal.Kind() != reflect.Ptr { fieldVal = fieldVal.Addr() } plan.mapColumns(table, fieldVal) } else if fieldType.PkgPath == "" { col := table.ColMap(fieldType.Name) quotedCol := plan.dbMap.Dialect.QuoteField(col.ColumnName) fieldMap := fieldColumnMap{ addr: fieldVal.Addr().Interface(), column: col, quotedTable: quotedTableName, quotedColumn: quotedCol, } plan.colMap = append(plan.colMap, fieldMap) if !col.Transient { queryableFields++ } } } if queryableFields == 0 { return errors.New("No fields in the target struct are mappable.") } return }
func setColumnSizes(t *gorp.TableMap, colSizes map[string]int) { for col, size := range colSizes { t.ColMap(col).MaxSize = size } }