// ExecuteKeyspaceIds is the RPC version of vtgateservice.VTGateService method func (vtg *VTGate) ExecuteKeyspaceIds(ctx context.Context, request *pb.ExecuteKeyspaceIdsRequest) (response *pb.ExecuteKeyspaceIdsResponse, err error) { defer vtg.server.HandlePanic(&err) ctx = callerid.NewContext(callinfo.GRPCCallInfo(ctx), request.CallerId, callerid.NewImmediateCallerID("grpc client")) reply := new(proto.QueryResult) executeErr := vtg.server.ExecuteKeyspaceIds(ctx, string(request.Query.Sql), tproto.Proto3ToBindVariables(request.Query.BindVariables), request.Keyspace, key.ProtoToKeyspaceIds(request.KeyspaceIds), request.TabletType, proto.ProtoToSession(request.Session), request.NotInTransaction, reply) response = &pb.ExecuteKeyspaceIdsResponse{ Error: vtgate.VtGateErrorToVtRPCError(executeErr, reply.Error), } if executeErr == nil { response.Result = mproto.QueryResultToProto3(reply.Result) response.Session = proto.SessionToProto(reply.Session) return response, nil } if *vtgate.RPCErrorOnlyInReply { return response, nil } return nil, executeErr }
// ExecuteKeyspaceIds is the RPC version of vtgateservice.VTGateService method func (vtg *VTGate) ExecuteKeyspaceIds(ctx context.Context, request *pb.ExecuteKeyspaceIdsRequest) (response *pb.ExecuteKeyspaceIdsResponse, err error) { defer vtg.server.HandlePanic(&err) query := &proto.KeyspaceIdQuery{ Sql: string(request.Query.Sql), BindVariables: tproto.Proto3ToBindVariables(request.Query.BindVariables), Keyspace: request.Keyspace, KeyspaceIds: key.ProtoToKeyspaceIds(request.KeyspaceIds), TabletType: topo.ProtoToTabletType(request.TabletType), Session: proto.ProtoToSession(request.Session), NotInTransaction: request.NotInTransaction, } reply := new(proto.QueryResult) executeErr := vtg.server.ExecuteKeyspaceIds(ctx, query, reply) response = &pb.ExecuteKeyspaceIdsResponse{ Error: vtgate.VtGateErrorToVtRPCError(executeErr, reply.Error), } if executeErr == nil { response.Result = mproto.QueryResultToProto3(reply.Result) response.Session = proto.SessionToProto(reply.Session) return response, nil } if *vtgate.RPCErrorOnlyInReply { return response, nil } return nil, executeErr }
func (conn *vtgateConn) ExecuteKeyspaceIds(ctx context.Context, query string, keyspace string, keyspaceIds [][]byte, bindVars map[string]interface{}, tabletType pb.TabletType, notInTransaction bool, session interface{}) (*mproto.QueryResult, interface{}, error) { var s *proto.Session if session != nil { s = session.(*proto.Session) } request := proto.KeyspaceIdQuery{ CallerID: getEffectiveCallerID(ctx), Sql: query, BindVariables: bindVars, Keyspace: keyspace, KeyspaceIds: key.ProtoToKeyspaceIds(keyspaceIds), TabletType: topo.ProtoToTabletType(tabletType), Session: s, NotInTransaction: notInTransaction, } var result proto.QueryResult if err := conn.rpcConn.Call(ctx, "VTGate.ExecuteKeyspaceIds", request, &result); err != nil { return nil, session, err } if result.Error != "" { return nil, result.Session, errors.New(result.Error) } if err := vterrors.FromRPCError(result.Err); err != nil { return nil, result.Session, err } return result.Result, result.Session, nil }
// ExecuteKeyspaceIds is the RPC version of vtgateservice.VTGateService method func (vtg *VTGateP3) ExecuteKeyspaceIds(ctx context.Context, request *pb.ExecuteKeyspaceIdsRequest, response *pb.ExecuteKeyspaceIdsResponse) (err error) { defer vtg.server.HandlePanic(&err) ctx, cancel := context.WithDeadline(ctx, time.Now().Add(*rpcTimeout)) defer cancel() ctx = callerid.NewContext(ctx, request.CallerId, callerid.NewImmediateCallerID("gorpc client")) reply := &proto.QueryResult{} vtgErr := vtg.server.ExecuteKeyspaceIds(ctx, string(request.Query.Sql), tproto.Proto3ToBindVariables(request.Query.BindVariables), request.Keyspace, key.ProtoToKeyspaceIds(request.KeyspaceIds), request.TabletType, proto.ProtoToSession(request.Session), request.NotInTransaction, reply) response.Error = vtgate.VtGateErrorToVtRPCError(vtgErr, reply.Error) response.Result = mproto.QueryResultToProto3(reply.Result) response.Session = proto.SessionToProto(reply.Session) if *vtgate.RPCErrorOnlyInReply { return nil } return vtgErr }
// StreamExecuteKeyspaceIds2 is the RPC version of // vtgateservice.VTGateService method func (vtg *VTGateP3) StreamExecuteKeyspaceIds2(ctx context.Context, request *pb.StreamExecuteKeyspaceIdsRequest, sendReply func(interface{}) error) (err error) { defer vtg.server.HandlePanic(&err) ctx = callerid.NewContext(ctx, request.CallerId, callerid.NewImmediateCallerID("gorpc client")) vtgErr := vtg.server.StreamExecuteKeyspaceIds(ctx, string(request.Query.Sql), tproto.Proto3ToBindVariables(request.Query.BindVariables), request.Keyspace, key.ProtoToKeyspaceIds(request.KeyspaceIds), request.TabletType, func(reply *proto.QueryResult) error { return sendReply(&pb.StreamExecuteKeyspaceIdsResponse{ Error: vtgate.VtGateErrorToVtRPCError(nil, reply.Error), Result: mproto.QueryResultToProto3(reply.Result), }) }) if vtgErr == nil { return nil } if *vtgate.RPCErrorOnlyInReply { // If there was an app error, send a QueryResult back with it. // Sending back errors this way is not backwards compatible. If a (new) server sends an additional // QueryResult with an error, and the (old) client doesn't know how to read it, it will cause // problems where the client will get out of sync with the number of QueryResults sent. // That's why this the error is only sent this way when the --rpc_errors_only_in_reply flag is set // (signalling that all clients are able to handle new-style errors). return sendReply(&pb.StreamExecuteKeyspaceIdsResponse{ Error: vtgate.VtGateErrorToVtRPCError(vtgErr, ""), }) } return vtgErr }
// ProtoToBoundKeyspaceIdQueries transforms a list of BoundKeyspaceIdQuery from proto3 func ProtoToBoundKeyspaceIdQueries(bsq []*pb.BoundKeyspaceIdQuery) []BoundKeyspaceIdQuery { if len(bsq) == 0 { return nil } result := make([]BoundKeyspaceIdQuery, len(bsq)) for i, q := range bsq { result[i].Sql = string(q.Query.Sql) result[i].BindVariables = tproto.Proto3ToBindVariables(q.Query.BindVariables) result[i].Keyspace = q.Keyspace result[i].KeyspaceIds = key.ProtoToKeyspaceIds(q.KeyspaceIds) } return result }
func (conn *vtgateConn) StreamExecuteKeyspaceIds2(ctx context.Context, query string, keyspace string, keyspaceIds [][]byte, bindVars map[string]interface{}, tabletType pb.TabletType) (<-chan *mproto.QueryResult, vtgateconn.ErrFunc, error) { req := &proto.KeyspaceIdQuery{ CallerID: getEffectiveCallerID(ctx), Sql: query, BindVariables: bindVars, Keyspace: keyspace, KeyspaceIds: key.ProtoToKeyspaceIds(keyspaceIds), TabletType: topo.ProtoToTabletType(tabletType), Session: nil, } sr := make(chan *proto.QueryResult, 10) c := conn.rpcConn.StreamGo("VTGate.StreamExecuteKeyspaceIds2", req, sr) return sendStreamResults(c, sr) }
// StreamExecuteKeyspaceIds is the RPC version of // vtgateservice.VTGateService method func (vtg *VTGate) StreamExecuteKeyspaceIds(request *pb.StreamExecuteKeyspaceIdsRequest, stream pbs.Vitess_StreamExecuteKeyspaceIdsServer) (err error) { defer vtg.server.HandlePanic(&err) query := &proto.KeyspaceIdQuery{ Sql: string(request.Query.Sql), BindVariables: tproto.Proto3ToBindVariables(request.Query.BindVariables), Keyspace: request.Keyspace, KeyspaceIds: key.ProtoToKeyspaceIds(request.KeyspaceIds), TabletType: topo.ProtoToTabletType(request.TabletType), } return vtg.server.StreamExecuteKeyspaceIds(stream.Context(), query, func(value *proto.QueryResult) error { return stream.Send(&pb.StreamExecuteKeyspaceIdsResponse{ Result: mproto.QueryResultToProto3(value.Result), }) }) }
// StreamExecuteKeyspaceIds is the RPC version of // vtgateservice.VTGateService method func (vtg *VTGate) StreamExecuteKeyspaceIds(request *pb.StreamExecuteKeyspaceIdsRequest, stream pbs.Vitess_StreamExecuteKeyspaceIdsServer) (err error) { defer vtg.server.HandlePanic(&err) ctx := callerid.NewContext(callinfo.GRPCCallInfo(stream.Context()), request.CallerId, callerid.NewImmediateCallerID("grpc client")) return vtg.server.StreamExecuteKeyspaceIds(ctx, string(request.Query.Sql), tproto.Proto3ToBindVariables(request.Query.BindVariables), request.Keyspace, key.ProtoToKeyspaceIds(request.KeyspaceIds), request.TabletType, func(value *proto.QueryResult) error { return stream.Send(&pb.StreamExecuteKeyspaceIdsResponse{ Result: mproto.QueryResultToProto3(value.Result), }) }) }
// ProtoToBoundKeyspaceIdQueries transforms a list of BoundKeyspaceIdQuery from proto3 func ProtoToBoundKeyspaceIdQueries(bsq []*pb.BoundKeyspaceIdQuery) ([]BoundKeyspaceIdQuery, error) { if len(bsq) == 0 { return nil, nil } result := make([]BoundKeyspaceIdQuery, len(bsq)) for i, q := range bsq { bv, err := tproto.Proto3ToBindVariables(q.Query.BindVariables) if err != nil { return nil, err } result[i].Sql = string(q.Query.Sql) result[i].BindVariables = bv result[i].Keyspace = q.Keyspace result[i].KeyspaceIds = key.ProtoToKeyspaceIds(q.KeyspaceIds) } return result, nil }
// StreamExecuteKeyspaceIds is the RPC version of // vtgateservice.VTGateService method func (vtg *VTGateP3) StreamExecuteKeyspaceIds(ctx context.Context, request *pb.StreamExecuteKeyspaceIdsRequest, sendReply func(interface{}) error) (err error) { defer vtg.server.HandlePanic(&err) ctx = callerid.NewContext(ctx, request.CallerId, callerid.NewImmediateCallerID("gorpc client")) return vtg.server.StreamExecuteKeyspaceIds(ctx, string(request.Query.Sql), tproto.Proto3ToBindVariables(request.Query.BindVariables), request.Keyspace, key.ProtoToKeyspaceIds(request.KeyspaceIds), request.TabletType, func(reply *proto.QueryResult) error { return sendReply(&pb.StreamExecuteKeyspaceIdsResponse{ Error: vtgate.VtGateErrorToVtRPCError(nil, reply.Error), Result: mproto.QueryResultToProto3(reply.Result), }) }) }
func testEchoExecute(t *testing.T, conn *vtgateconn.VTGateConn) { var qr *mproto.QueryResult var err error ctx := callerid.NewContext(context.Background(), callerID, nil) qr, err = conn.Execute(ctx, echoPrefix+query, bindVars, tabletType) checkEcho(t, "Execute", qr, err, map[string]string{ "callerId": callerIDEcho, "query": echoPrefix + query, "bindVars": bindVarsEcho, "tabletType": tabletTypeEcho, }) qr, err = conn.ExecuteShards(ctx, echoPrefix+query, keyspace, shards, bindVars, tabletType) checkEcho(t, "ExecuteShards", qr, err, map[string]string{ "callerId": callerIDEcho, "query": echoPrefix + query, "keyspace": keyspace, "shards": shardsEcho, "bindVars": bindVarsEcho, "tabletType": tabletTypeEcho, }) qr, err = conn.ExecuteKeyspaceIds(ctx, echoPrefix+query, keyspace, keyspaceIDs, bindVars, tabletType) checkEcho(t, "ExecuteKeyspaceIds", qr, err, map[string]string{ "callerId": callerIDEcho, "query": echoPrefix + query, "keyspace": keyspace, "keyspaceIds": keyspaceIDsEcho, "bindVars": bindVarsEcho, "tabletType": tabletTypeEcho, }) qr, err = conn.ExecuteKeyRanges(ctx, echoPrefix+query, keyspace, keyRanges, bindVars, tabletType) checkEcho(t, "ExecuteKeyRanges", qr, err, map[string]string{ "callerId": callerIDEcho, "query": echoPrefix + query, "keyspace": keyspace, "keyRanges": keyRangesEcho, "bindVars": bindVarsEcho, "tabletType": tabletTypeEcho, }) qr, err = conn.ExecuteEntityIds(ctx, echoPrefix+query, keyspace, "column1", entityKeyspaceIDs, bindVars, tabletType) checkEcho(t, "ExecuteEntityIds", qr, err, map[string]string{ "callerId": callerIDEcho, "query": echoPrefix + query, "keyspace": keyspace, "entityColumnName": "column1", "entityIds": entityKeyspaceIDsEcho, "bindVars": bindVarsEcho, "tabletType": tabletTypeEcho, }) var qrs []mproto.QueryResult qrs, err = conn.ExecuteBatchShards(ctx, []gproto.BoundShardQuery{ gproto.BoundShardQuery{ Sql: echoPrefix + query, Keyspace: keyspace, Shards: shards, BindVariables: bindVars, }, }, tabletType, true) checkEcho(t, "ExecuteBatchShards", &qrs[0], err, map[string]string{ "callerId": callerIDEcho, "query": echoPrefix + query, "keyspace": keyspace, "shards": shardsEcho, "bindVars": bindVarsEcho, "tabletType": tabletTypeEcho, "asTransaction": "true", }) qrs, err = conn.ExecuteBatchKeyspaceIds(ctx, []gproto.BoundKeyspaceIdQuery{ gproto.BoundKeyspaceIdQuery{ Sql: echoPrefix + query, Keyspace: keyspace, KeyspaceIds: key.ProtoToKeyspaceIds(keyspaceIDs), BindVariables: bindVars, }, }, tabletType, true) checkEcho(t, "ExecuteBatchKeyspaceIds", &qrs[0], err, map[string]string{ "callerId": callerIDEcho, "query": echoPrefix + query, "keyspace": keyspace, "keyspaceIds": keyspaceIDsEchoOld, "bindVars": bindVarsEcho, "tabletType": tabletTypeEcho, "asTransaction": "true", }) }