// SetTarget can be called to change the target used for subsequent calls. func (conn *TabletBson) SetTarget(keyspace, shard string, tabletType pbt.TabletType) error { conn.mu.Lock() defer conn.mu.Unlock() if conn.target == nil { return fmt.Errorf("cannot set target on sessionId based conn") } if tabletType == pbt.TabletType_UNKNOWN { return fmt.Errorf("cannot set tablet type to UNKNOWN") } conn.target = &tproto.Target{ Keyspace: keyspace, Shard: shard, TabletType: tproto.TabletType(tabletType), } return nil }
// DialTablet creates and initializes TabletBson. func DialTablet(ctx context.Context, endPoint *pbt.EndPoint, keyspace, shard string, tabletType pbt.TabletType, timeout time.Duration) (tabletconn.TabletConn, error) { addr := netutil.JoinHostPort(endPoint.Host, endPoint.PortMap["vt"]) conn := &TabletBson{endPoint: endPoint} var err error if *tabletBsonUsername != "" { conn.rpcClient, err = bsonrpc.DialAuthHTTP("tcp", addr, *tabletBsonUsername, *tabletBsonPassword, timeout) } else { conn.rpcClient, err = bsonrpc.DialHTTP("tcp", addr, timeout) } if err != nil { return nil, tabletError(err) } if tabletType == pbt.TabletType_UNKNOWN { // we use session var sessionInfo tproto.SessionInfo if err = conn.rpcClient.Call(ctx, "SqlQuery.GetSessionId", tproto.SessionParams{Keyspace: keyspace, Shard: shard}, &sessionInfo); err != nil { conn.rpcClient.Close() return nil, tabletError(err) } // SqlQuery.GetSessionId might return an application error inside the SessionInfo if err = vterrors.FromRPCError(sessionInfo.Err); err != nil { conn.rpcClient.Close() return nil, tabletError(err) } conn.sessionID = sessionInfo.SessionId } else { // we use target conn.target = &tproto.Target{ Keyspace: keyspace, Shard: shard, TabletType: tproto.TabletType(tabletType), } } return conn, nil }