in go/adbc/driver/flightsql/flightsql_adbc.go [614:686]
func (d *database) Open(ctx context.Context) (adbc.Connection, error) {
cl, err := getFlightClient(ctx, d.uri.String(), d)
if err != nil {
return nil, err
}
cache := gcache.New(20).LRU().
Expiration(5 * time.Minute).
LoaderFunc(func(loc interface{}) (interface{}, error) {
uri, ok := loc.(string)
if !ok {
return nil, adbc.Error{Msg: fmt.Sprintf("Location must be a string, got %#v", uri), Code: adbc.StatusInternal}
}
cl, err := getFlightClient(context.Background(), uri, d)
if err != nil {
return nil, err
}
cl.Alloc = d.alloc
return cl, nil
}).
EvictedFunc(func(_, client interface{}) {
conn := client.(*flightsql.Client)
conn.Close()
}).Build()
var cnxnSupport support
info, err := cl.GetSqlInfo(ctx, []flightsql.SqlInfo{flightsql.SqlInfoFlightSqlServerTransaction}, d.timeout)
// ignore this if it fails
if err == nil {
const int32code = 3
for _, endpoint := range info.Endpoint {
rdr, err := doGet(ctx, cl, endpoint, cache, d.timeout)
if err != nil {
continue
}
defer rdr.Release()
for rdr.Next() {
rec := rdr.Record()
codes := rec.Column(0).(*array.Uint32)
values := rec.Column(1).(*array.DenseUnion)
int32Value := values.Field(int32code).(*array.Int32)
for i := 0; i < int(rec.NumRows()); i++ {
switch codes.Value(i) {
case uint32(flightsql.SqlInfoFlightSqlServerTransaction):
if values.TypeCode(i) != int32code {
continue
}
idx := values.ValueOffset(i)
if !int32Value.IsValid(int(idx)) {
continue
}
value := int32Value.Value(int(idx))
cnxnSupport.transactions =
value == int32(flightsql.SqlTransactionTransaction) ||
value == int32(flightsql.SqlTransactionSavepoint)
}
}
}
}
}
return &cnxn{cl: cl, db: d, clientCache: cache,
hdrs: make(metadata.MD), timeouts: d.timeout,
supportInfo: cnxnSupport}, nil
}