Scan into nullable custom types (pointers to pointers).
This commit is contained in:
@@ -379,6 +379,24 @@ func (ci *ConnInfo) Scan(oid uint32, formatCode int16, buf []byte, dest interfac
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We might be given a pointer to something that implements the decoder interface(s),
|
||||||
|
// even though the pointer itself doesn't.
|
||||||
|
refVal := reflect.ValueOf(dest)
|
||||||
|
if refVal.Kind() == reflect.Ptr && refVal.Type().Elem().Kind() == reflect.Ptr {
|
||||||
|
// If the database returned NULL, then we set dest as nil to indicate that.
|
||||||
|
if buf == nil {
|
||||||
|
nilPtr := reflect.Zero(refVal.Type().Elem())
|
||||||
|
refVal.Elem().Set(nilPtr)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// We need to allocate an element, and set the destination to it
|
||||||
|
// Then we can retry as that element.
|
||||||
|
elemPtr := reflect.New(refVal.Type().Elem().Elem())
|
||||||
|
refVal.Elem().Set(elemPtr)
|
||||||
|
return ci.Scan(oid, formatCode, buf, elemPtr.Interface())
|
||||||
|
}
|
||||||
|
|
||||||
return scanUnknownType(oid, formatCode, buf, dest)
|
return scanUnknownType(oid, formatCode, buf, dest)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user