/// <summary> /// It is called when SQL batch request arrives /// </summary> public virtual TDSMessageCollection OnSQLBatchRequest(ITDSServerSession session, TDSMessage message) { // Delegate to the query engine TDSMessageCollection responseMessage = Engine.ExecuteBatch(session, message); // Check if session packet size is different than the engine packet size if (session.PacketSize != Arguments.PacketSize) { // Get the first message TDSMessage firstMessage = responseMessage[0]; // Find DONE token in it int indexOfDone = firstMessage.IndexOf(firstMessage.Where(t => t is TDSDoneToken).First()); // Create new packet size environment change token TDSEnvChangeToken envChange = new TDSEnvChangeToken(TDSEnvChangeTokenType.PacketSize, Arguments.PacketSize.ToString(), session.PacketSize.ToString()); // Log response TDSUtilities.Log(Arguments.Log, "Response", envChange); // Insert env change before done token firstMessage.Insert(indexOfDone, envChange); // Update session with the new packet size session.PacketSize = (uint)Arguments.PacketSize; } return(responseMessage); }
/// <summary> /// Complete login sequence /// </summary> protected override TDSMessageCollection OnAuthenticationCompleted(ITDSServerSession session) { // Delegate to the base class TDSMessageCollection responseMessageCollection = base.OnAuthenticationCompleted(session); // Check if arguments are of routing server if (Arguments is RoutingTDSServerArguments) { // Cast to routing server arguments RoutingTDSServerArguments serverArguments = Arguments as RoutingTDSServerArguments; // Check routing condition if (serverArguments.RouteOnPacket == TDSMessageType.TDS7Login) { // Construct routing token TDSPacketToken routingToken = CreateRoutingToken(); // Log response TDSUtilities.Log(Arguments.Log, "Response", routingToken); // Get the first message TDSMessage targetMessage = responseMessageCollection[0]; // Index at which to insert the routing token int insertIndex = targetMessage.Count - 1; // VSTS# 1021027 - Read-Only Routing yields TDS protocol error // Resolution: Send TDS FeatureExtAct token before TDS ENVCHANGE token with routing information TDSPacketToken featureExtAckToken = targetMessage.Find(t => t is TDSFeatureExtAckToken); // Check if found if (featureExtAckToken != null) { // Find token position insertIndex = targetMessage.IndexOf(featureExtAckToken); } // Insert right before the done token targetMessage.Insert(insertIndex, routingToken); } } return(responseMessageCollection); }