code: func (c *conn) PrepareContext(ctx context.Context, query string) (stmt driver.Stmt, err error) {
  	if c.session.IsBad() {
  		return nil, driver.ErrBadConn
  	}
  
  	done := make(chan struct{})
  	go func() {
  		prepareQuery, bulkInsert := checkBulkInsert(query)
  		var (
  			qt             p.QueryType
  			id             uint64
  			prmFieldSet    *p.ParameterFieldSet
  			resultFieldSet *p.ResultFieldSet
  		)
  		qt, id, prmFieldSet, resultFieldSet, err = c.session.Prepare(prepareQuery)
  		if err != nil {
  			goto done
  		}
  		select {
  		default:
  		case <-ctx.Done():
  			return
  		}
  		if bulkInsert {
  			stmt, err = newBulkInsertStmt(c.session, prepareQuery, id, prmFieldSet)
  		} else {
  			stmt, err = newStmt(qt, c.session, prepareQuery, id, prmFieldSet, resultFieldSet)
  		}
  	done:
  		close(done)
  	}()
  
  	select {
  	case <-ctx.Done():
  		return nil, ctx.Err()
  	case <-done:
  		return stmt, err
  	}
  }
docs: // database connection