in go/adbc/driver/flightsql/flightsql_adbc.go [854:935]
func (c *cnxn) GetInfo(ctx context.Context, infoCodes []adbc.InfoCode) (array.RecordReader, error) {
const strValTypeID arrow.UnionTypeCode = 0
if len(infoCodes) == 0 {
infoCodes = infoSupportedCodes
}
bldr := array.NewRecordBuilder(c.cl.Alloc, adbc.GetInfoSchema)
defer bldr.Release()
bldr.Reserve(len(infoCodes))
infoNameBldr := bldr.Field(0).(*array.Uint32Builder)
infoValueBldr := bldr.Field(1).(*array.DenseUnionBuilder)
strInfoBldr := infoValueBldr.Child(0).(*array.StringBuilder)
translated := make([]flightsql.SqlInfo, 0, len(infoCodes))
for _, code := range infoCodes {
if t, ok := adbcToFlightSQLInfo[code]; ok {
translated = append(translated, t)
continue
}
switch code {
case adbc.InfoDriverName:
infoNameBldr.Append(uint32(code))
infoValueBldr.Append(strValTypeID)
strInfoBldr.Append(infoDriverName)
case adbc.InfoDriverVersion:
infoNameBldr.Append(uint32(code))
infoValueBldr.Append(strValTypeID)
strInfoBldr.Append(infoDriverVersion)
case adbc.InfoDriverArrowVersion:
infoNameBldr.Append(uint32(code))
infoValueBldr.Append(strValTypeID)
strInfoBldr.Append(infoDriverArrowVersion)
}
}
ctx = metadata.NewOutgoingContext(ctx, c.hdrs)
info, err := c.cl.GetSqlInfo(ctx, translated, c.timeouts)
if err == nil {
for i, endpoint := range info.Endpoint {
rdr, err := doGet(ctx, c.cl, endpoint, c.clientCache, c.timeouts)
if err != nil {
return nil, adbcFromFlightStatus(err, "GetInfo(DoGet): endpoint %d: %s", i, endpoint.Location)
}
for rdr.Next() {
rec := rdr.Record()
field := rec.Column(0).(*array.Uint32)
info := rec.Column(1).(*array.DenseUnion)
for i := 0; i < int(rec.NumRows()); i++ {
switch flightsql.SqlInfo(field.Value(i)) {
case flightsql.SqlInfoFlightSqlServerName:
infoNameBldr.Append(uint32(adbc.InfoVendorName))
case flightsql.SqlInfoFlightSqlServerVersion:
infoNameBldr.Append(uint32(adbc.InfoVendorVersion))
case flightsql.SqlInfoFlightSqlServerArrowVersion:
infoNameBldr.Append(uint32(adbc.InfoVendorArrowVersion))
}
infoValueBldr.Append(info.TypeCode(i))
// we know we're only doing string fields here right now
v := info.Field(info.ChildID(i)).(*array.String).
Value(int(info.ValueOffset(i)))
strInfoBldr.Append(v)
}
}
if rdr.Err() != nil {
return nil, adbcFromFlightStatus(rdr.Err(), "GetInfo(DoGet): endpoint %d: %s", i, endpoint.Location)
}
}
} else if grpcstatus.Code(err) != grpccodes.Unimplemented {
return nil, adbcFromFlightStatus(err, "GetInfo(GetSqlInfo)")
}
final := bldr.NewRecord()
defer final.Release()
return array.NewRecordReader(adbc.GetInfoSchema, []arrow.Record{final})
}