fix(reflection): replace reflect.Ptr with reflect.Pointer
Build , Vet Test, and Lint / Run Vet Tests (1.23.x) (push) Failing after 0s
Build , Vet Test, and Lint / Run Vet Tests (1.24.x) (push) Failing after 1s
Build , Vet Test, and Lint / Lint Code (push) Failing after 0s
Build , Vet Test, and Lint / Build (push) Failing after 0s
Tests / Unit Tests (push) Failing after 1s
Tests / Integration Tests (push) Failing after 1s

* Updated all instances of reflect.Ptr to reflect.Pointer for consistency in type checking.
This commit is contained in:
Hein
2026-06-22 16:40:07 +02:00
parent 5a359a160b
commit 0e8f8925c6
18 changed files with 110 additions and 110 deletions
+15 -15
View File
@@ -39,7 +39,7 @@ func (h *QueryDebugHook) AfterQuery(ctx context.Context, event *bun.QueryEvent)
// This helps identify which specific field is causing scanning issues // This helps identify which specific field is causing scanning issues
func debugScanIntoStruct(rows interface{}, dest interface{}) error { func debugScanIntoStruct(rows interface{}, dest interface{}) error {
v := reflect.ValueOf(dest) v := reflect.ValueOf(dest)
if v.Kind() != reflect.Ptr { if v.Kind() != reflect.Pointer {
return fmt.Errorf("dest must be a pointer") return fmt.Errorf("dest must be a pointer")
} }
@@ -59,7 +59,7 @@ func debugScanIntoStruct(rows interface{}, dest interface{}) error {
logger.Debug(" Slice element type: %s", elemType) logger.Debug(" Slice element type: %s", elemType)
// If slice of pointers, get the underlying type // If slice of pointers, get the underlying type
if elemType.Kind() == reflect.Ptr { if elemType.Kind() == reflect.Pointer {
structType = elemType.Elem() structType = elemType.Elem()
} else { } else {
structType = elemType structType = elemType
@@ -747,7 +747,7 @@ func checkIfRelationAlreadyLoaded(parents reflect.Value, relationName string) (r
// Get the first parent to check the relation field // Get the first parent to check the relation field
firstParent := parents.Index(0) firstParent := parents.Index(0)
if firstParent.Kind() == reflect.Ptr { if firstParent.Kind() == reflect.Pointer {
firstParent = firstParent.Elem() firstParent = firstParent.Elem()
} }
@@ -762,7 +762,7 @@ func checkIfRelationAlreadyLoaded(parents reflect.Value, relationName string) (r
// Check if any parent has a non-empty slice // Check if any parent has a non-empty slice
for i := 0; i < parents.Len(); i++ { for i := 0; i < parents.Len(); i++ {
parent := parents.Index(i) parent := parents.Index(i)
if parent.Kind() == reflect.Ptr { if parent.Kind() == reflect.Pointer {
parent = parent.Elem() parent = parent.Elem()
} }
field := parent.FieldByName(relationName) field := parent.FieldByName(relationName)
@@ -771,7 +771,7 @@ func checkIfRelationAlreadyLoaded(parents reflect.Value, relationName string) (r
allRelated := reflect.MakeSlice(field.Type(), 0, field.Len()*parents.Len()) allRelated := reflect.MakeSlice(field.Type(), 0, field.Len()*parents.Len())
for j := 0; j < parents.Len(); j++ { for j := 0; j < parents.Len(); j++ {
p := parents.Index(j) p := parents.Index(j)
if p.Kind() == reflect.Ptr { if p.Kind() == reflect.Pointer {
p = p.Elem() p = p.Elem()
} }
f := p.FieldByName(relationName) f := p.FieldByName(relationName)
@@ -784,7 +784,7 @@ func checkIfRelationAlreadyLoaded(parents reflect.Value, relationName string) (r
return allRelated, true return allRelated, true
} }
} }
} else if relationField.Kind() == reflect.Ptr { } else if relationField.Kind() == reflect.Pointer {
// Check if it's a pointer (has-one/belongs-to) // Check if it's a pointer (has-one/belongs-to)
if !relationField.IsNil() { if !relationField.IsNil() {
// Already loaded! Collect all related records from all parents // Already loaded! Collect all related records from all parents
@@ -792,7 +792,7 @@ func checkIfRelationAlreadyLoaded(parents reflect.Value, relationName string) (r
allRelated := reflect.MakeSlice(reflect.SliceOf(relatedType), 0, parents.Len()) allRelated := reflect.MakeSlice(reflect.SliceOf(relatedType), 0, parents.Len())
for j := 0; j < parents.Len(); j++ { for j := 0; j < parents.Len(); j++ {
p := parents.Index(j) p := parents.Index(j)
if p.Kind() == reflect.Ptr { if p.Kind() == reflect.Pointer {
p = p.Elem() p = p.Elem()
} }
f := p.FieldByName(relationName) f := p.FieldByName(relationName)
@@ -816,7 +816,7 @@ func (b *BunSelectQuery) loadCustomPreloads(ctx context.Context) error {
// Get the actual data from the model // Get the actual data from the model
modelValue := reflect.ValueOf(model.Value()) modelValue := reflect.ValueOf(model.Value())
if modelValue.Kind() == reflect.Ptr { if modelValue.Kind() == reflect.Pointer {
modelValue = modelValue.Elem() modelValue = modelValue.Elem()
} }
@@ -884,7 +884,7 @@ func (b *BunSelectQuery) loadRelationLevel(ctx context.Context, parentRecords re
// Get the first record to inspect the struct type // Get the first record to inspect the struct type
firstRecord := parentRecords.Index(0) firstRecord := parentRecords.Index(0)
if firstRecord.Kind() == reflect.Ptr { if firstRecord.Kind() == reflect.Pointer {
firstRecord = firstRecord.Elem() firstRecord = firstRecord.Elem()
} }
@@ -930,7 +930,7 @@ func (b *BunSelectQuery) loadRelationLevel(ctx context.Context, parentRecords re
if isSlice { if isSlice {
relatedType = relatedType.Elem() relatedType = relatedType.Elem()
} }
if relatedType.Kind() == reflect.Ptr { if relatedType.Kind() == reflect.Pointer {
relatedType = relatedType.Elem() relatedType = relatedType.Elem()
} }
@@ -1018,7 +1018,7 @@ func extractForeignKeyValues(records reflect.Value, fkFieldName string) ([]inter
for i := 0; i < records.Len(); i++ { for i := 0; i < records.Len(); i++ {
record := records.Index(i) record := records.Index(i)
if record.Kind() == reflect.Ptr { if record.Kind() == reflect.Pointer {
record = record.Elem() record = record.Elem()
} }
@@ -1083,7 +1083,7 @@ func associateRelatedRecords(parents, related reflect.Value, fieldName string, r
for i := 0; i < related.Len(); i++ { for i := 0; i < related.Len(); i++ {
relRecord := related.Index(i) relRecord := related.Index(i)
relRecordElem := relRecord relRecordElem := relRecord
if relRecordElem.Kind() == reflect.Ptr { if relRecordElem.Kind() == reflect.Pointer {
relRecordElem = relRecordElem.Elem() relRecordElem = relRecordElem.Elem()
} }
@@ -1109,7 +1109,7 @@ func associateRelatedRecords(parents, related reflect.Value, fieldName string, r
for i := 0; i < parents.Len(); i++ { for i := 0; i < parents.Len(); i++ {
parentPtr := parents.Index(i) parentPtr := parents.Index(i)
parent := parentPtr parent := parentPtr
if parent.Kind() == reflect.Ptr { if parent.Kind() == reflect.Pointer {
parent = parent.Elem() parent = parent.Elem()
} }
@@ -1332,11 +1332,11 @@ func (b *BunSelectQuery) ScanModel(ctx context.Context) (err error) {
modelInfo = fmt.Sprintf("Model type: %T", modelValue) modelInfo = fmt.Sprintf("Model type: %T", modelValue)
v := reflect.ValueOf(modelValue) v := reflect.ValueOf(modelValue)
if v.Kind() == reflect.Ptr { if v.Kind() == reflect.Pointer {
v = v.Elem() v = v.Elem()
} }
if v.Kind() == reflect.Slice { if v.Kind() == reflect.Slice {
if v.Type().Elem().Kind() == reflect.Ptr { if v.Type().Elem().Kind() == reflect.Pointer {
modelInfo += fmt.Sprintf(", Slice of: %s", v.Type().Elem().Elem().Name()) modelInfo += fmt.Sprintf(", Slice of: %s", v.Type().Elem().Elem().Name())
} else { } else {
modelInfo += fmt.Sprintf(", Slice of: %s", v.Type().Elem().Name()) modelInfo += fmt.Sprintf(", Slice of: %s", v.Type().Elem().Name())
+1 -1
View File
@@ -800,7 +800,7 @@ func (g *GormInsertQuery) Scan(ctx context.Context, dest interface{}) (err error
col := g.returningColumns[0] col := g.returningColumns[0]
if g.model != nil { if g.model != nil {
val := reflect.ValueOf(g.model) val := reflect.ValueOf(g.model)
if val.Kind() == reflect.Ptr { if val.Kind() == reflect.Pointer {
val = val.Elem() val = val.Elem()
} }
if val.Kind() == reflect.Struct { if val.Kind() == reflect.Struct {
+8 -8
View File
@@ -1195,7 +1195,7 @@ func (p *PgSQLSelectQuery) applySubqueryPreloads(ctx context.Context, dest inter
// Use reflection to process the destination // Use reflection to process the destination
destValue := reflect.ValueOf(dest) destValue := reflect.ValueOf(dest)
if destValue.Kind() != reflect.Ptr { if destValue.Kind() != reflect.Pointer {
return fmt.Errorf("dest must be a pointer") return fmt.Errorf("dest must be a pointer")
} }
@@ -1222,7 +1222,7 @@ func (p *PgSQLSelectQuery) applySubqueryPreloads(ctx context.Context, dest inter
// loadPreloadsForRecord loads all preload relationships for a single record // loadPreloadsForRecord loads all preload relationships for a single record
func (p *PgSQLSelectQuery) loadPreloadsForRecord(ctx context.Context, record reflect.Value, preloads []preloadConfig) error { func (p *PgSQLSelectQuery) loadPreloadsForRecord(ctx context.Context, record reflect.Value, preloads []preloadConfig) error {
if record.Kind() == reflect.Ptr { if record.Kind() == reflect.Pointer {
if record.IsNil() { if record.IsNil() {
return nil return nil
} }
@@ -1299,7 +1299,7 @@ func (p *PgSQLSelectQuery) executePreloadQuery(ctx context.Context, field reflec
} else { } else {
// Single struct - create a pointer if needed // Single struct - create a pointer if needed
var target reflect.Value var target reflect.Value
if field.Kind() == reflect.Ptr { if field.Kind() == reflect.Pointer {
target = reflect.New(field.Type().Elem()) target = reflect.New(field.Type().Elem())
} else { } else {
target = reflect.New(field.Type()) target = reflect.New(field.Type())
@@ -1312,7 +1312,7 @@ func (p *PgSQLSelectQuery) executePreloadQuery(ctx context.Context, field reflec
} }
// Set the field // Set the field
if field.Kind() == reflect.Ptr { if field.Kind() == reflect.Pointer {
field.Set(target) field.Set(target)
} else { } else {
field.Set(target.Elem()) field.Set(target.Elem())
@@ -1329,7 +1329,7 @@ func (p *PgSQLSelectQuery) getRelationMetadata(fieldName string) *relationMetada
} }
modelType := reflect.TypeOf(p.model) modelType := reflect.TypeOf(p.model)
if modelType.Kind() == reflect.Ptr { if modelType.Kind() == reflect.Pointer {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
@@ -1378,7 +1378,7 @@ func (p *PgSQLSelectQuery) getRelationMetadataFromField(modelType reflect.Type,
if fieldType.Kind() == reflect.Slice { if fieldType.Kind() == reflect.Slice {
fieldType = fieldType.Elem() fieldType = fieldType.Elem()
} }
if fieldType.Kind() == reflect.Ptr { if fieldType.Kind() == reflect.Pointer {
fieldType = fieldType.Elem() fieldType = fieldType.Elem()
} }
@@ -1411,7 +1411,7 @@ func scanRows(rows *sql.Rows, dest interface{}) error {
// Get destination type // Get destination type
destValue := reflect.ValueOf(dest) destValue := reflect.ValueOf(dest)
if destValue.Kind() != reflect.Ptr { if destValue.Kind() != reflect.Pointer {
return fmt.Errorf("dest must be a pointer") return fmt.Errorf("dest must be a pointer")
} }
@@ -1466,7 +1466,7 @@ func scanRowsToMapSlice(rows *sql.Rows, columns []string, destValue reflect.Valu
// scanRowsToStructSlice scans rows into a slice of structs // scanRowsToStructSlice scans rows into a slice of structs
func scanRowsToStructSlice(rows *sql.Rows, columns []string, destValue reflect.Value) error { func scanRowsToStructSlice(rows *sql.Rows, columns []string, destValue reflect.Value) error {
elemType := destValue.Type().Elem() elemType := destValue.Type().Elem()
isPtr := elemType.Kind() == reflect.Ptr isPtr := elemType.Kind() == reflect.Pointer
if isPtr { if isPtr {
elemType = elemType.Elem() elemType = elemType.Elem()
@@ -71,7 +71,7 @@ func entityNameFromModel(model interface{}, table string) string {
} }
modelType := reflect.TypeOf(model) modelType := reflect.TypeOf(model)
for modelType != nil && (modelType.Kind() == reflect.Ptr || modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array) { for modelType != nil && (modelType.Kind() == reflect.Pointer || modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array) {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
@@ -108,7 +108,7 @@ func tableNameProviderFromModel(model interface{}) (common.TableNameProvider, bo
} }
modelType := reflect.TypeOf(model) modelType := reflect.TypeOf(model)
for modelType != nil && (modelType.Kind() == reflect.Ptr || modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array) { for modelType != nil && (modelType.Kind() == reflect.Pointer || modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array) {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
+9 -9
View File
@@ -25,7 +25,7 @@ func ValidateAndUnwrapModel(model interface{}) (*ValidateAndUnwrapModelResult, e
originalType := modelType originalType := modelType
// Unwrap pointers, slices, and arrays to get to the base struct type // Unwrap pointers, slices, and arrays to get to the base struct type
for modelType != nil && (modelType.Kind() == reflect.Ptr || modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array) { for modelType != nil && (modelType.Kind() == reflect.Pointer || modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array) {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
@@ -126,15 +126,15 @@ func GetRelationshipInfo(modelType reflect.Type, relationName string) *Relations
// Get related model type // Get related model type
if field.Type.Kind() == reflect.Slice { if field.Type.Kind() == reflect.Slice {
elemType := field.Type.Elem() elemType := field.Type.Elem()
if elemType.Kind() == reflect.Ptr { if elemType.Kind() == reflect.Pointer {
elemType = elemType.Elem() elemType = elemType.Elem()
} }
if elemType.Kind() == reflect.Struct { if elemType.Kind() == reflect.Struct {
info.RelatedModel = reflect.New(elemType).Elem().Interface() info.RelatedModel = reflect.New(elemType).Elem().Interface()
} }
} else if field.Type.Kind() == reflect.Ptr || field.Type.Kind() == reflect.Struct { } else if field.Type.Kind() == reflect.Pointer || field.Type.Kind() == reflect.Struct {
elemType := field.Type elemType := field.Type
if elemType.Kind() == reflect.Ptr { if elemType.Kind() == reflect.Pointer {
elemType = elemType.Elem() elemType = elemType.Elem()
} }
if elemType.Kind() == reflect.Struct { if elemType.Kind() == reflect.Struct {
@@ -155,16 +155,16 @@ func GetRelationshipInfo(modelType reflect.Type, relationName string) *Relations
info.RelationType = "hasMany" info.RelationType = "hasMany"
// Get the element type for slice // Get the element type for slice
elemType := field.Type.Elem() elemType := field.Type.Elem()
if elemType.Kind() == reflect.Ptr { if elemType.Kind() == reflect.Pointer {
elemType = elemType.Elem() elemType = elemType.Elem()
} }
if elemType.Kind() == reflect.Struct { if elemType.Kind() == reflect.Struct {
info.RelatedModel = reflect.New(elemType).Elem().Interface() info.RelatedModel = reflect.New(elemType).Elem().Interface()
} }
} else if field.Type.Kind() == reflect.Ptr || field.Type.Kind() == reflect.Struct { } else if field.Type.Kind() == reflect.Pointer || field.Type.Kind() == reflect.Struct {
info.RelationType = "belongsTo" info.RelationType = "belongsTo"
elemType := field.Type elemType := field.Type
if elemType.Kind() == reflect.Ptr { if elemType.Kind() == reflect.Pointer {
elemType = elemType.Elem() elemType = elemType.Elem()
} }
if elemType.Kind() == reflect.Struct { if elemType.Kind() == reflect.Struct {
@@ -177,7 +177,7 @@ func GetRelationshipInfo(modelType reflect.Type, relationName string) *Relations
// Get the element type for many2many (always slice) // Get the element type for many2many (always slice)
if field.Type.Kind() == reflect.Slice { if field.Type.Kind() == reflect.Slice {
elemType := field.Type.Elem() elemType := field.Type.Elem()
if elemType.Kind() == reflect.Ptr { if elemType.Kind() == reflect.Pointer {
elemType = elemType.Elem() elemType = elemType.Elem()
} }
if elemType.Kind() == reflect.Struct { if elemType.Kind() == reflect.Struct {
@@ -239,7 +239,7 @@ func GetTableNameFromModel(model interface{}) string {
modelType := reflect.TypeOf(model) modelType := reflect.TypeOf(model)
// Unwrap pointers // Unwrap pointers
for modelType != nil && modelType.Kind() == reflect.Ptr { for modelType != nil && modelType.Kind() == reflect.Pointer {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
+4 -4
View File
@@ -69,7 +69,7 @@ func (p *NestedCUDProcessor) ProcessNestedCUD(
// Get model type for reflection // Get model type for reflection
modelType := reflect.TypeOf(model) modelType := reflect.TypeOf(model)
for modelType != nil && (modelType.Kind() == reflect.Ptr || modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array) { for modelType != nil && (modelType.Kind() == reflect.Pointer || modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array) {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
@@ -224,7 +224,7 @@ func (p *NestedCUDProcessor) filterValidFields(data map[string]interface{}, mode
} }
modelType := reflect.TypeOf(model) modelType := reflect.TypeOf(model)
for modelType != nil && (modelType.Kind() == reflect.Ptr || modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array) { for modelType != nil && (modelType.Kind() == reflect.Pointer || modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array) {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
@@ -410,7 +410,7 @@ func (p *NestedCUDProcessor) processChildRelations(
if relatedModelType.Kind() == reflect.Slice { if relatedModelType.Kind() == reflect.Slice {
relatedModelType = relatedModelType.Elem() relatedModelType = relatedModelType.Elem()
} }
if relatedModelType.Kind() == reflect.Ptr { if relatedModelType.Kind() == reflect.Pointer {
relatedModelType = relatedModelType.Elem() relatedModelType = relatedModelType.Elem()
} }
@@ -590,7 +590,7 @@ func shouldUseNestedProcessorDepth(data map[string]interface{}, model interface{
// Get model type // Get model type
modelType := reflect.TypeOf(model) modelType := reflect.TypeOf(model)
for modelType != nil && (modelType.Kind() == reflect.Ptr || modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array) { for modelType != nil && (modelType.Kind() == reflect.Pointer || modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array) {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
+2 -2
View File
@@ -31,7 +31,7 @@ func (v *ColumnValidator) buildValidColumns() {
modelType := reflect.TypeOf(v.model) modelType := reflect.TypeOf(v.model)
// Unwrap pointers, slices, and arrays to get to the base struct type // Unwrap pointers, slices, and arrays to get to the base struct type
for modelType != nil && (modelType.Kind() == reflect.Ptr || modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array) { for modelType != nil && (modelType.Kind() == reflect.Pointer || modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array) {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
@@ -290,7 +290,7 @@ func (v *ColumnValidator) FilterRequestOptions(options RequestOptions) RequestOp
// Filter Preload columns // Filter Preload columns
validPreloads := make([]PreloadOption, 0, len(options.Preload)) validPreloads := make([]PreloadOption, 0, len(options.Preload))
modelType := reflect.TypeOf(v.model) modelType := reflect.TypeOf(v.model)
if modelType != nil && modelType.Kind() == reflect.Ptr { if modelType != nil && modelType.Kind() == reflect.Pointer {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
for idx := range options.Preload { for idx := range options.Preload {
+2 -2
View File
@@ -107,7 +107,7 @@ func (r *DefaultModelRegistry) RegisterModel(name string, model interface{}) err
originalType := modelType originalType := modelType
// Unwrap pointers, slices, and arrays to check the underlying type // Unwrap pointers, slices, and arrays to check the underlying type
for modelType.Kind() == reflect.Ptr || modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array { for modelType.Kind() == reflect.Pointer || modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
@@ -124,7 +124,7 @@ func (r *DefaultModelRegistry) RegisterModel(name string, model interface{}) err
// Additional check: ensure model is not a pointer // Additional check: ensure model is not a pointer
finalType := reflect.TypeOf(model) finalType := reflect.TypeOf(model)
if finalType.Kind() == reflect.Ptr { if finalType.Kind() == reflect.Pointer {
return fmt.Errorf("model must be a non-pointer struct, got pointer to %s. Use MyModel{} instead of &MyModel{}", finalType.Elem().Name()) return fmt.Errorf("model must be a non-pointer struct, got pointer to %s. Use MyModel{} instead of &MyModel{}", finalType.Elem().Name())
} }
+4 -4
View File
@@ -387,7 +387,7 @@ func (g *Generator) generateModelSchema(model interface{}) Schema {
} }
modelType := reflect.TypeOf(model) modelType := reflect.TypeOf(model)
if modelType.Kind() == reflect.Ptr { if modelType.Kind() == reflect.Pointer {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
if modelType.Kind() != reflect.Struct { if modelType.Kind() != reflect.Struct {
@@ -418,7 +418,7 @@ func (g *Generator) generateModelSchema(model interface{}) Schema {
schema.Properties[fieldName] = propSchema schema.Properties[fieldName] = propSchema
// Check if field is required (not a pointer and no omitempty) // Check if field is required (not a pointer and no omitempty)
if field.Type.Kind() != reflect.Ptr && !strings.Contains(jsonTag, "omitempty") { if field.Type.Kind() != reflect.Pointer && !strings.Contains(jsonTag, "omitempty") {
schema.Required = append(schema.Required, fieldName) schema.Required = append(schema.Required, fieldName)
} }
} }
@@ -431,7 +431,7 @@ func (g *Generator) generatePropertySchema(field reflect.StructField) *Schema {
schema := &Schema{} schema := &Schema{}
fieldType := field.Type fieldType := field.Type
if fieldType.Kind() == reflect.Ptr { if fieldType.Kind() == reflect.Pointer {
fieldType = fieldType.Elem() fieldType = fieldType.Elem()
} }
@@ -453,7 +453,7 @@ func (g *Generator) generatePropertySchema(field reflect.StructField) *Schema {
case reflect.Slice, reflect.Array: case reflect.Slice, reflect.Array:
schema.Type = "array" schema.Type = "array"
elemType := fieldType.Elem() elemType := fieldType.Elem()
if elemType.Kind() == reflect.Ptr { if elemType.Kind() == reflect.Pointer {
elemType = elemType.Elem() elemType = elemType.Elem()
} }
if elemType.Kind() == reflect.Struct { if elemType.Kind() == reflect.Struct {
+6 -6
View File
@@ -9,7 +9,7 @@ func Len(v any) int {
val := reflect.ValueOf(v) val := reflect.ValueOf(v)
valKind := val.Kind() valKind := val.Kind()
if valKind == reflect.Ptr { if valKind == reflect.Pointer {
val = val.Elem() val = val.Elem()
} }
@@ -57,7 +57,7 @@ func IsEmptyValue(v any) bool {
return true return true
} }
rv := reflect.ValueOf(v) rv := reflect.ValueOf(v)
if rv.Kind() == reflect.Ptr { if rv.Kind() == reflect.Pointer {
if rv.IsNil() { if rv.IsNil() {
return true return true
} }
@@ -80,12 +80,12 @@ func IsEmptyValue(v any) bool {
// If the type is a slice of pointers, it returns the element type of the pointer within the slice. // If the type is a slice of pointers, it returns the element type of the pointer within the slice.
// If neither condition is met, it returns the original type. // If neither condition is met, it returns the original type.
func GetPointerElement(v reflect.Type) reflect.Type { func GetPointerElement(v reflect.Type) reflect.Type {
if v.Kind() == reflect.Ptr { if v.Kind() == reflect.Pointer {
return v.Elem() return v.Elem()
} }
if v.Kind() == reflect.Slice && v.Elem().Kind() == reflect.Ptr { if v.Kind() == reflect.Slice && v.Elem().Kind() == reflect.Pointer {
subElem := v.Elem() subElem := v.Elem()
if subElem.Elem().Kind() == reflect.Ptr { if subElem.Elem().Kind() == reflect.Pointer {
return subElem.Elem().Elem() return subElem.Elem().Elem()
} }
return v.Elem() return v.Elem()
@@ -104,7 +104,7 @@ func GetJSONNameForField(modelType reflect.Type, fieldName string) string {
// Unwrap pointer and slice indirections to reach the struct type // Unwrap pointer and slice indirections to reach the struct type
for { for {
switch modelType.Kind() { switch modelType.Kind() {
case reflect.Ptr, reflect.Slice: case reflect.Pointer, reflect.Slice:
modelType = modelType.Elem() modelType = modelType.Elem()
continue continue
} }
+16 -16
View File
@@ -226,7 +226,7 @@ func buildJSONToDBMap(modelType reflect.Type, result map[string]string, scanOnly
// Handle embedded structs // Handle embedded structs
if field.Anonymous { if field.Anonymous {
ft := field.Type ft := field.Type
if ft.Kind() == reflect.Ptr { if ft.Kind() == reflect.Pointer {
ft = ft.Elem() ft = ft.Elem()
} }
isScanOnly := scanOnly isScanOnly := scanOnly
@@ -544,7 +544,7 @@ func IsColumnWritable(model any, columnName string) bool {
// Unwrap pointers and slices to get to the base struct type // Unwrap pointers and slices to get to the base struct type
for modelType != nil { for modelType != nil {
switch modelType.Kind() { switch modelType.Kind() {
case reflect.Ptr, reflect.Slice: case reflect.Pointer, reflect.Slice:
modelType = modelType.Elem() modelType = modelType.Elem()
continue continue
} }
@@ -709,7 +709,7 @@ func GetColumnTypeFromModel(model interface{}, colName string) reflect.Kind {
modelType := reflect.TypeOf(model) modelType := reflect.TypeOf(model)
// Dereference pointer if needed // Dereference pointer if needed
if modelType.Kind() == reflect.Ptr { if modelType.Kind() == reflect.Pointer {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
@@ -886,7 +886,7 @@ func GetRelationType(model interface{}, fieldName string) RelationType {
// Unwrap pointer → slice → pointer chains to reach the underlying struct // Unwrap pointer → slice → pointer chains to reach the underlying struct
for { for {
switch modelType.Kind() { switch modelType.Kind() {
case reflect.Ptr, reflect.Slice: case reflect.Pointer, reflect.Slice:
modelType = modelType.Elem() modelType = modelType.Elem()
continue continue
} }
@@ -947,7 +947,7 @@ func GetRelationType(model interface{}, fieldName string) RelationType {
// Slice indicates has-many or many-to-many // Slice indicates has-many or many-to-many
return RelationHasMany return RelationHasMany
} }
if fieldType.Kind() == reflect.Ptr { if fieldType.Kind() == reflect.Pointer {
// Pointer to single struct usually indicates belongs-to or has-one // Pointer to single struct usually indicates belongs-to or has-one
// Check if it has foreignKey (belongs-to) or references (has-one) // Check if it has foreignKey (belongs-to) or references (has-one)
if strings.Contains(gormTag, "foreignKey:") { if strings.Contains(gormTag, "foreignKey:") {
@@ -963,7 +963,7 @@ func GetRelationType(model interface{}, fieldName string) RelationType {
// Slice of structs → has-many // Slice of structs → has-many
return RelationHasMany return RelationHasMany
} }
if fieldType.Kind() == reflect.Ptr || fieldType.Kind() == reflect.Struct { if fieldType.Kind() == reflect.Pointer || fieldType.Kind() == reflect.Struct {
// Single struct → belongs-to (default assumption for safety) // Single struct → belongs-to (default assumption for safety)
// Using belongs-to as default ensures we use JOIN, which is safer // Using belongs-to as default ensures we use JOIN, which is safer
return RelationBelongsTo return RelationBelongsTo
@@ -990,7 +990,7 @@ func GetRelationType(model interface{}, fieldName string) RelationType {
// Strategy 1 is skipped if the matched field is a declared relation (rel:) or // Strategy 1 is skipped if the matched field is a declared relation (rel:) or
// has a GORM tag but carries no explicit FK — callers should use convention. // has a GORM tag but carries no explicit FK — callers should use convention.
func GetForeignKeyColumn(modelType reflect.Type, parentKey string) []string { func GetForeignKeyColumn(modelType reflect.Type, parentKey string) []string {
for modelType.Kind() == reflect.Ptr || modelType.Kind() == reflect.Slice { for modelType.Kind() == reflect.Pointer || modelType.Kind() == reflect.Slice {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
if modelType.Kind() != reflect.Struct { if modelType.Kind() != reflect.Struct {
@@ -1123,7 +1123,7 @@ func MapToStruct(dataMap map[string]interface{}, target interface{}) error {
} }
targetValue := reflect.ValueOf(target) targetValue := reflect.ValueOf(target)
if targetValue.Kind() != reflect.Ptr { if targetValue.Kind() != reflect.Pointer {
return fmt.Errorf("target must be a pointer to a struct") return fmt.Errorf("target must be a pointer to a struct")
} }
@@ -1226,8 +1226,8 @@ func setFieldValue(field reflect.Value, value interface{}) error {
} }
// Handle pointer fields // Handle pointer fields
if field.Kind() == reflect.Ptr { if field.Kind() == reflect.Pointer {
if valueReflect.Kind() != reflect.Ptr { if valueReflect.Kind() != reflect.Pointer {
// Create a new pointer and set its value // Create a new pointer and set its value
newPtr := reflect.New(field.Type().Elem()) newPtr := reflect.New(field.Type().Elem())
if err := setFieldValue(newPtr.Elem(), value); err != nil { if err := setFieldValue(newPtr.Elem(), value); err != nil {
@@ -1418,14 +1418,14 @@ func convertSlice(targetSlice reflect.Value, sourceSlice reflect.Value) error {
// Handle nil elements // Handle nil elements
if sourceValue == nil { if sourceValue == nil {
// For pointer types, nil is valid // For pointer types, nil is valid
if targetElemType.Kind() == reflect.Ptr { if targetElemType.Kind() == reflect.Pointer {
targetElem.Set(reflect.Zero(targetElemType)) targetElem.Set(reflect.Zero(targetElemType))
} }
continue continue
} }
// If target element type is a pointer to struct, we need to create new instances // If target element type is a pointer to struct, we need to create new instances
if targetElemType.Kind() == reflect.Ptr { if targetElemType.Kind() == reflect.Pointer {
// Create a new instance of the pointed-to type // Create a new instance of the pointed-to type
newElemPtr := reflect.New(targetElemType.Elem()) newElemPtr := reflect.New(targetElemType.Elem())
@@ -1588,7 +1588,7 @@ func GetValidJSONFieldNames(modelType reflect.Type) map[string]bool {
// Unwrap pointers and slices to get to the base struct type // Unwrap pointers and slices to get to the base struct type
for modelType != nil { for modelType != nil {
switch modelType.Kind() { switch modelType.Kind() {
case reflect.Ptr, reflect.Slice: case reflect.Pointer, reflect.Slice:
modelType = modelType.Elem() modelType = modelType.Elem()
continue continue
} }
@@ -1616,7 +1616,7 @@ func collectValidFieldNames(typ reflect.Type, validFields map[string]bool) {
// Check for embedded structs // Check for embedded structs
if field.Anonymous { if field.Anonymous {
fieldType := field.Type fieldType := field.Type
if fieldType.Kind() == reflect.Ptr { if fieldType.Kind() == reflect.Pointer {
fieldType = fieldType.Elem() fieldType = fieldType.Elem()
} }
if fieldType.Kind() == reflect.Struct { if fieldType.Kind() == reflect.Struct {
@@ -1655,7 +1655,7 @@ func getRelationModelSingleLevel(model interface{}, fieldName string) interface{
for { for {
switch modelType.Kind() { switch modelType.Kind() {
case reflect.Ptr, reflect.Slice: case reflect.Pointer, reflect.Slice:
modelType = modelType.Elem() modelType = modelType.Elem()
continue continue
} }
@@ -1724,7 +1724,7 @@ func getRelationModelSingleLevel(model interface{}, fieldName string) interface{
for { for {
switch targetType.Kind() { switch targetType.Kind() {
case reflect.Ptr, reflect.Slice: case reflect.Pointer, reflect.Slice:
targetType = targetType.Elem() targetType = targetType.Elem()
if targetType == nil { if targetType == nil {
return nil return nil
+5 -5
View File
@@ -443,7 +443,7 @@ func (h *Handler) executeCreate(ctx context.Context, schema, entity string, data
} }
// Re-fetch after insert to capture DB-generated defaults/triggers. // Re-fetch after insert to capture DB-generated defaults/triggers.
modelType := reflect.TypeOf(model) modelType := reflect.TypeOf(model)
if modelType.Kind() == reflect.Ptr { if modelType.Kind() == reflect.Pointer {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
fetchedRecord := reflect.New(modelType).Interface() fetchedRecord := reflect.New(modelType).Interface()
@@ -467,7 +467,7 @@ func (h *Handler) executeCreate(ctx context.Context, schema, entity string, data
case []interface{}: case []interface{}:
modelType := reflect.TypeOf(model) modelType := reflect.TypeOf(model)
if modelType.Kind() == reflect.Ptr { if modelType.Kind() == reflect.Pointer {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
originals := make([]map[string]interface{}, 0, len(v)) originals := make([]map[string]interface{}, 0, len(v))
@@ -567,7 +567,7 @@ func (h *Handler) executeUpdate(ctx context.Context, schema, entity, id string,
err = h.db.RunInTransaction(ctx, func(tx common.Database) error { err = h.db.RunInTransaction(ctx, func(tx common.Database) error {
// Read existing record // Read existing record
modelType := reflect.TypeOf(model) modelType := reflect.TypeOf(model)
if modelType.Kind() == reflect.Ptr { if modelType.Kind() == reflect.Pointer {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
existingRecord := reflect.New(modelType).Interface() existingRecord := reflect.New(modelType).Interface()
@@ -641,7 +641,7 @@ func (h *Handler) executeUpdate(ctx context.Context, schema, entity, id string,
// Re-fetch the record after transaction commits to capture DB-generated changes. // Re-fetch the record after transaction commits to capture DB-generated changes.
modelType := reflect.TypeOf(model) modelType := reflect.TypeOf(model)
if modelType.Kind() == reflect.Ptr { if modelType.Kind() == reflect.Pointer {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
fetchedRecord := reflect.New(modelType).Interface() fetchedRecord := reflect.New(modelType).Interface()
@@ -701,7 +701,7 @@ func (h *Handler) executeDelete(ctx context.Context, schema, entity, id string)
} }
modelType := reflect.TypeOf(model) modelType := reflect.TypeOf(model)
if modelType.Kind() == reflect.Ptr { if modelType.Kind() == reflect.Pointer {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
+3 -3
View File
@@ -67,7 +67,7 @@ func buildModelInfo(schema, entity string, model interface{}) modelInfo {
// Unwrap to base struct type // Unwrap to base struct type
modelType := reflect.TypeOf(model) modelType := reflect.TypeOf(model)
for modelType != nil && (modelType.Kind() == reflect.Ptr || modelType.Kind() == reflect.Slice) { for modelType != nil && (modelType.Kind() == reflect.Pointer || modelType.Kind() == reflect.Slice) {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
if modelType == nil || modelType.Kind() != reflect.Struct { if modelType == nil || modelType.Kind() != reflect.Struct {
@@ -87,7 +87,7 @@ func buildModelInfo(schema, entity string, model interface{}) modelInfo {
fieldType, found := modelType.FieldByName(d.Name) fieldType, found := modelType.FieldByName(d.Name)
if found { if found {
ft := fieldType.Type ft := fieldType.Type
if ft.Kind() == reflect.Ptr { if ft.Kind() == reflect.Pointer {
ft = ft.Elem() ft = ft.Elem()
} }
isUserStruct := ft.Kind() == reflect.Struct && ft.Name() != "Time" && ft.PkgPath() != "" isUserStruct := ft.Kind() == reflect.Struct && ft.Name() != "Time" && ft.PkgPath() != ""
@@ -106,7 +106,7 @@ func buildModelInfo(schema, entity string, model interface{}) modelInfo {
goType := d.DataType goType := d.DataType
if goType == "" && found { if goType == "" && found {
ft := fieldType.Type ft := fieldType.Type
for ft.Kind() == reflect.Ptr { for ft.Kind() == reflect.Pointer {
ft = ft.Elem() ft = ft.Elem()
} }
goType = ft.Name() goType = ft.Name()
+7 -7
View File
@@ -243,7 +243,7 @@ func (h *Handler) handleRead(ctx context.Context, w common.ResponseWriter, id st
// Validate and unwrap model type to get base struct // Validate and unwrap model type to get base struct
modelType := reflect.TypeOf(model) modelType := reflect.TypeOf(model)
for modelType != nil && (modelType.Kind() == reflect.Ptr || modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array) { for modelType != nil && (modelType.Kind() == reflect.Pointer || modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array) {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
@@ -1547,7 +1547,7 @@ func (h *Handler) handleDelete(ctx context.Context, w common.ResponseWriter, id
// First, fetch the record that will be deleted // First, fetch the record that will be deleted
modelType := reflect.TypeOf(model) modelType := reflect.TypeOf(model)
if modelType.Kind() == reflect.Ptr { if modelType.Kind() == reflect.Pointer {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
recordToDelete := reflect.New(modelType).Interface() recordToDelete := reflect.New(modelType).Interface()
@@ -1822,7 +1822,7 @@ func (h *Handler) generateMetadata(schema, entity string, model interface{}) *co
modelType := reflect.TypeOf(model) modelType := reflect.TypeOf(model)
// Unwrap pointers, slices, and arrays to get to the base struct type // Unwrap pointers, slices, and arrays to get to the base struct type
for modelType != nil && (modelType.Kind() == reflect.Ptr || modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array) { for modelType != nil && (modelType.Kind() == reflect.Pointer || modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array) {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
@@ -1966,7 +1966,7 @@ func getColumnType(field reflect.StructField) string {
func isNullable(field reflect.StructField) bool { func isNullable(field reflect.StructField) bool {
// Check if it's a pointer type // Check if it's a pointer type
if field.Type.Kind() == reflect.Ptr { if field.Type.Kind() == reflect.Pointer {
return true return true
} }
@@ -1992,7 +1992,7 @@ func (h *Handler) applyPreloads(model interface{}, query common.SelectQuery, pre
modelType := reflect.TypeOf(model) modelType := reflect.TypeOf(model)
// Unwrap pointers, slices, and arrays to get to the base struct type // Unwrap pointers, slices, and arrays to get to the base struct type
for modelType != nil && (modelType.Kind() == reflect.Ptr || modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array) { for modelType != nil && (modelType.Kind() == reflect.Pointer || modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array) {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
@@ -2140,7 +2140,7 @@ func toSnakeCase(s string) string {
func (h *Handler) setRowNumbersOnRecords(records interface{}, offset int) { func (h *Handler) setRowNumbersOnRecords(records interface{}, offset int) {
// Get the reflect value of the records // Get the reflect value of the records
recordsValue := reflect.ValueOf(records) recordsValue := reflect.ValueOf(records)
if recordsValue.Kind() == reflect.Ptr { if recordsValue.Kind() == reflect.Pointer {
recordsValue = recordsValue.Elem() recordsValue = recordsValue.Elem()
} }
@@ -2155,7 +2155,7 @@ func (h *Handler) setRowNumbersOnRecords(records interface{}, offset int) {
record := recordsValue.Index(i) record := recordsValue.Index(i)
// Dereference if it's a pointer // Dereference if it's a pointer
if record.Kind() == reflect.Ptr { if record.Kind() == reflect.Pointer {
if record.IsNil() { if record.IsNil() {
continue continue
} }
+15 -15
View File
@@ -349,7 +349,7 @@ func (h *Handler) handleRead(ctx context.Context, w common.ResponseWriter, id st
// Validate and unwrap model type to get base struct // Validate and unwrap model type to get base struct
modelType := reflect.TypeOf(model) modelType := reflect.TypeOf(model)
for modelType != nil && (modelType.Kind() == reflect.Ptr || modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array) { for modelType != nil && (modelType.Kind() == reflect.Pointer || modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array) {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
@@ -1892,7 +1892,7 @@ func (h *Handler) extractNestedRelations(
) (_cleanedData map[string]interface{}, _relations map[string]interface{}, _err error) { ) (_cleanedData map[string]interface{}, _relations map[string]interface{}, _err error) {
// Get model type for reflection // Get model type for reflection
modelType := reflect.TypeOf(model) modelType := reflect.TypeOf(model)
for modelType != nil && (modelType.Kind() == reflect.Ptr || modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array) { for modelType != nil && (modelType.Kind() == reflect.Pointer || modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array) {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
@@ -1934,7 +1934,7 @@ func (h *Handler) processChildRelationsWithParentID(
) error { ) error {
// Get model type for reflection // Get model type for reflection
modelType := reflect.TypeOf(parentModel) modelType := reflect.TypeOf(parentModel)
for modelType != nil && (modelType.Kind() == reflect.Ptr || modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array) { for modelType != nil && (modelType.Kind() == reflect.Pointer || modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array) {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
@@ -1990,7 +1990,7 @@ func (h *Handler) processChildRelationsForField(
if relatedModelType.Kind() == reflect.Slice { if relatedModelType.Kind() == reflect.Slice {
relatedModelType = relatedModelType.Elem() relatedModelType = relatedModelType.Elem()
} }
if relatedModelType.Kind() == reflect.Ptr { if relatedModelType.Kind() == reflect.Pointer {
relatedModelType = relatedModelType.Elem() relatedModelType = relatedModelType.Elem()
} }
@@ -2413,7 +2413,7 @@ func (h *Handler) generateMetadata(schema, entity string, model interface{}) *co
modelType := reflect.TypeOf(model) modelType := reflect.TypeOf(model)
// Unwrap pointers, slices, and arrays to get to the base struct type // Unwrap pointers, slices, and arrays to get to the base struct type
for modelType.Kind() == reflect.Ptr || modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array { for modelType.Kind() == reflect.Pointer || modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
@@ -2462,7 +2462,7 @@ func (h *Handler) generateMetadata(schema, entity string, model interface{}) *co
// Check if this is a relation field (slice or struct, but not time.Time) // Check if this is a relation field (slice or struct, but not time.Time)
if field.Type.Kind() == reflect.Slice || if field.Type.Kind() == reflect.Slice ||
(field.Type.Kind() == reflect.Struct && field.Type.Name() != "Time") || (field.Type.Kind() == reflect.Struct && field.Type.Name() != "Time") ||
(field.Type.Kind() == reflect.Ptr && field.Type.Elem().Kind() == reflect.Struct && field.Type.Elem().Name() != "Time") { (field.Type.Kind() == reflect.Pointer && field.Type.Elem().Kind() == reflect.Struct && field.Type.Elem().Name() != "Time") {
metadata.Relations = append(metadata.Relations, jsonName) metadata.Relations = append(metadata.Relations, jsonName)
continue continue
} }
@@ -2508,7 +2508,7 @@ func (h *Handler) getColumnType(t reflect.Type) string {
return "float" return "float"
case reflect.Bool: case reflect.Bool:
return "boolean" return "boolean"
case reflect.Ptr: case reflect.Pointer:
return h.getColumnType(t.Elem()) return h.getColumnType(t.Elem())
default: default:
return "unknown" return "unknown"
@@ -2516,7 +2516,7 @@ func (h *Handler) getColumnType(t reflect.Type) string {
} }
func (h *Handler) isNullable(field reflect.StructField) bool { func (h *Handler) isNullable(field reflect.StructField) bool {
return field.Type.Kind() == reflect.Ptr return field.Type.Kind() == reflect.Pointer
} }
func (h *Handler) sendResponse(w common.ResponseWriter, data interface{}, metadata *common.Metadata) { func (h *Handler) sendResponse(w common.ResponseWriter, data interface{}, metadata *common.Metadata) {
@@ -2561,7 +2561,7 @@ func (h *Handler) normalizeResultArray(data interface{}) interface{} {
// Use reflection to check if data is a slice or array // Use reflection to check if data is a slice or array
dataValue := reflect.ValueOf(data) dataValue := reflect.ValueOf(data)
if dataValue.Kind() == reflect.Ptr { if dataValue.Kind() == reflect.Pointer {
dataValue = dataValue.Elem() dataValue = dataValue.Elem()
} }
@@ -2594,7 +2594,7 @@ func (h *Handler) buildDetailFields(model interface{}) []reflection.ModelFieldDe
} }
modelType := reflect.TypeOf(model) modelType := reflect.TypeOf(model)
for modelType != nil && (modelType.Kind() == reflect.Ptr || modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array) { for modelType != nil && (modelType.Kind() == reflect.Pointer || modelType.Kind() == reflect.Slice || modelType.Kind() == reflect.Array) {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
if modelType == nil || modelType.Kind() != reflect.Struct { if modelType == nil || modelType.Kind() != reflect.Struct {
@@ -2615,7 +2615,7 @@ func (h *Handler) buildDetailFields(model interface{}) []reflection.ModelFieldDe
// Skip relation fields (slices, structs that aren't time.Time, ptrs to struct) // Skip relation fields (slices, structs that aren't time.Time, ptrs to struct)
ft := field.Type ft := field.Type
if ft.Kind() == reflect.Ptr { if ft.Kind() == reflect.Pointer {
ft = ft.Elem() ft = ft.Elem()
} }
if ft.Kind() == reflect.Slice || if ft.Kind() == reflect.Slice ||
@@ -2647,7 +2647,7 @@ func (h *Handler) buildDetailFields(model interface{}) []reflection.ModelFieldDe
sqlKey = "unique" sqlKey = "unique"
} }
nullable := field.Type.Kind() == reflect.Ptr nullable := field.Type.Kind() == reflect.Pointer
if strings.Contains(gormLower, "not null") { if strings.Contains(gormLower, "not null") {
nullable = false nullable = false
} else if strings.Contains(gormLower, "nullable") || strings.Contains(gormLower, ",null") { } else if strings.Contains(gormLower, "nullable") || strings.Contains(gormLower, ",null") {
@@ -3015,7 +3015,7 @@ func (h *Handler) buildFilterSQL(filter *common.FilterOption, tableName string)
func (h *Handler) setRowNumbersOnRecords(records any, offset int) { func (h *Handler) setRowNumbersOnRecords(records any, offset int) {
// Get the reflect value of the records // Get the reflect value of the records
recordsValue := reflect.ValueOf(records) recordsValue := reflect.ValueOf(records)
if recordsValue.Kind() == reflect.Ptr { if recordsValue.Kind() == reflect.Pointer {
recordsValue = recordsValue.Elem() recordsValue = recordsValue.Elem()
} }
@@ -3030,7 +3030,7 @@ func (h *Handler) setRowNumbersOnRecords(records any, offset int) {
record := recordsValue.Index(i) record := recordsValue.Index(i)
// Dereference if it's a pointer // Dereference if it's a pointer
if record.Kind() == reflect.Ptr { if record.Kind() == reflect.Pointer {
if record.IsNil() { if record.IsNil() {
continue continue
} }
@@ -3085,7 +3085,7 @@ func (h *Handler) filterExtendedOptions(validator *common.ColumnValidator, optio
// Filter Expand columns using the expand relation's model // Filter Expand columns using the expand relation's model
filteredExpands := make([]ExpandOption, 0, len(options.Expand)) filteredExpands := make([]ExpandOption, 0, len(options.Expand))
modelType := reflect.TypeOf(model) modelType := reflect.TypeOf(model)
if modelType.Kind() == reflect.Ptr { if modelType.Kind() == reflect.Pointer {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
+6 -6
View File
@@ -977,7 +977,7 @@ func (h *Handler) resolveRelationName(model interface{}, nameOrTable string) str
} }
// Dereference pointer if needed // Dereference pointer if needed
if modelType.Kind() == reflect.Ptr { if modelType.Kind() == reflect.Pointer {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
@@ -1012,13 +1012,13 @@ func (h *Handler) resolveRelationName(model interface{}, nameOrTable string) str
var targetType reflect.Type var targetType reflect.Type
if fieldType.Kind() == reflect.Slice { if fieldType.Kind() == reflect.Slice {
targetType = fieldType.Elem() targetType = fieldType.Elem()
} else if fieldType.Kind() == reflect.Ptr { } else if fieldType.Kind() == reflect.Pointer {
targetType = fieldType.Elem() targetType = fieldType.Elem()
} }
if targetType != nil { if targetType != nil {
// Dereference pointer if the slice contains pointers // Dereference pointer if the slice contains pointers
if targetType.Kind() == reflect.Ptr { if targetType.Kind() == reflect.Pointer {
targetType = targetType.Elem() targetType = targetType.Elem()
} }
@@ -1062,7 +1062,7 @@ func (h *Handler) resolveRelationNameWithJoinKey(model interface{}, nameOrTable
if modelType == nil { if modelType == nil {
return nameOrTable return nameOrTable
} }
if modelType.Kind() == reflect.Ptr { if modelType.Kind() == reflect.Pointer {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
if modelType == nil || modelType.Kind() != reflect.Struct { if modelType == nil || modelType.Kind() != reflect.Struct {
@@ -1089,10 +1089,10 @@ func (h *Handler) resolveRelationNameWithJoinKey(model interface{}, nameOrTable
var targetType reflect.Type var targetType reflect.Type
if fieldType.Kind() == reflect.Slice { if fieldType.Kind() == reflect.Slice {
targetType = fieldType.Elem() targetType = fieldType.Elem()
} else if fieldType.Kind() == reflect.Ptr { } else if fieldType.Kind() == reflect.Pointer {
targetType = fieldType.Elem() targetType = fieldType.Elem()
} }
if targetType != nil && targetType.Kind() == reflect.Ptr { if targetType != nil && targetType.Kind() == reflect.Pointer {
targetType = targetType.Elem() targetType = targetType.Elem()
} }
if targetType == nil || targetType.Kind() != reflect.Struct { if targetType == nil || targetType.Kind() != reflect.Struct {
+3 -3
View File
@@ -90,7 +90,7 @@ func applyRowSecurity(secCtx SecurityContext, securityList *SecurityList) error
// Get primary key name from model // Get primary key name from model
modelType := reflect.TypeOf(model) modelType := reflect.TypeOf(model)
if modelType.Kind() == reflect.Ptr { if modelType.Kind() == reflect.Pointer {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
@@ -155,13 +155,13 @@ func applyColumnSecurity(secCtx SecurityContext, securityList *SecurityList) err
// Get model type // Get model type
modelType := reflect.TypeOf(model) modelType := reflect.TypeOf(model)
if modelType.Kind() == reflect.Ptr { if modelType.Kind() == reflect.Pointer {
modelType = modelType.Elem() modelType = modelType.Elem()
} }
// Apply column security masking // Apply column security masking
resultValue := reflect.ValueOf(result) resultValue := reflect.ValueOf(result)
if resultValue.Kind() == reflect.Ptr { if resultValue.Kind() == reflect.Pointer {
resultValue = resultValue.Elem() resultValue = resultValue.Elem()
} }
+2 -2
View File
@@ -840,7 +840,7 @@ func (h *Handler) buildFilterCondition(filter common.FilterOption) (conditionStr
func (h *Handler) setRowNumbersOnRecords(records interface{}, offset int) { func (h *Handler) setRowNumbersOnRecords(records interface{}, offset int) {
// Get the reflect value of the records // Get the reflect value of the records
recordsValue := reflect.ValueOf(records) recordsValue := reflect.ValueOf(records)
if recordsValue.Kind() == reflect.Ptr { if recordsValue.Kind() == reflect.Pointer {
recordsValue = recordsValue.Elem() recordsValue = recordsValue.Elem()
} }
@@ -855,7 +855,7 @@ func (h *Handler) setRowNumbersOnRecords(records interface{}, offset int) {
record := recordsValue.Index(i) record := recordsValue.Index(i)
// Dereference if it's a pointer // Dereference if it's a pointer
if record.Kind() == reflect.Ptr { if record.Kind() == reflect.Pointer {
if record.IsNil() { if record.IsNil() {
continue continue
} }