func benchPreparedMockQuery(b *testing.B, c *conn, stmt driver.Stmt) { rows, err := stmt.Query(nil) if err != nil { b.Fatal(err) } defer rows.Close() var dest [1]driver.Value for { if err := rows.Next(dest[:]); err != nil { if err == io.EOF { break } b.Fatal(err) } } }
func ctxDriverStmtQuery(ctx context.Context, si driver.Stmt, nvdargs []driver.NamedValue) (driver.Rows, error) { if siCtx, is := si.(driver.StmtQueryContext); is { return siCtx.QueryContext(ctx, nvdargs) } dargs, err := namedValueToValue(nvdargs) if err != nil { return nil, err } if ctx.Done() == context.Background().Done() { return si.Query(dargs) } type R struct { err error panic interface{} rowsi driver.Rows } rc := make(chan R, 1) go func() { r := R{} defer func() { if v := recover(); v != nil { r.panic = v } rc <- r }() r.rowsi, r.err = si.Query(dargs) }() select { case <-ctx.Done(): go func() { <-rc close(rc) }() return nil, ctx.Err() case r := <-rc: if r.panic != nil { panic(r.panic) } return r.rowsi, r.err } }
func rowsiFromStatement(si driver.Stmt, args ...interface{}) (driver.Rows, error) { // -1 means the driver doesn't know how to count the number of // placeholders, so we won't sanity check input here and instead let the // driver deal with errors. if want := si.NumInput(); want != -1 && len(args) != want { return nil, fmt.Errorf("sql: statement expects %d inputs; got %d", si.NumInput(), len(args)) } dargs, err := driverArgs(si, args) if err != nil { return nil, err } rowsi, err := si.Query(dargs) if err != nil { return nil, err } return rowsi, nil }
func ctxDriverStmtQuery(ctx context.Context, si driver.Stmt, nvdargs []driver.NamedValue) (driver.Rows, error) { if siCtx, is := si.(driver.StmtQueryContext); is { return siCtx.QueryContext(ctx, nvdargs) } dargs, err := namedValueToValue(nvdargs) if err != nil { return nil, err } rowsi, err := si.Query(dargs) if err == nil { select { default: case <-ctx.Done(): rowsi.Close() return nil, ctx.Err() } } return rowsi, err }