From 7d884df97c5e9c6bad6b2eaf0ff2b81b154a5371 Mon Sep 17 00:00:00 2001
From: JPaja <44926986+JPaja@users.noreply.github.com>
Date: Tue, 20 Jun 2023 16:02:25 +0200
Subject: [PATCH 1/7] Expose ReadOnly Intent in TDSSQLTestClient
---
TDSClient/TDSClient/TDS/Client/TDSSQLTestClient.cs | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/TDSClient/TDSClient/TDS/Client/TDSSQLTestClient.cs b/TDSClient/TDSClient/TDS/Client/TDSSQLTestClient.cs
index 6f46112..6fae755 100644
--- a/TDSClient/TDSClient/TDS/Client/TDSSQLTestClient.cs
+++ b/TDSClient/TDSClient/TDS/Client/TDSSQLTestClient.cs
@@ -40,7 +40,7 @@ public class TDSSQLTestClient
/// User password
/// Database to connect to
/// Encryption Protocol
- public TDSSQLTestClient(string server, int port, string userID, string password, string database, SslProtocols encryptionProtocol = SslProtocols.Tls12)
+ public TDSSQLTestClient(string server, int port, string userID, string password, string database, SslProtocols encryptionProtocol = SslProtocols.Tls12, TDSLogin7TypeFlagsReadOnlyIntent readOnlyIntent = TDSLogin7TypeFlagsReadOnlyIntent.Off)
{
if (string.IsNullOrEmpty(server) || string.IsNullOrEmpty(userID) || string.IsNullOrEmpty(password) || string.IsNullOrEmpty(database))
{
@@ -55,6 +55,7 @@ public TDSSQLTestClient(string server, int port, string userID, string password,
this.Password = password;
this.Database = database;
this.EncryptionProtocol = encryptionProtocol;
+ this.ReadOnlyIntent = readOnlyIntent;
this.connectionAttempt = 0;
LoggingUtilities.WriteLog($" Instantiating TDSSQLTestClient with the following parameters:");
@@ -110,6 +111,11 @@ public TDSSQLTestClient(string server, int port, string userID, string password,
///
public SslProtocols EncryptionProtocol { get; set; }
+ ///
+ /// Gets or sets the ReadOnly Intent Policy.
+ ///
+ public TDSLogin7TypeFlagsReadOnlyIntent ReadOnlyIntent {get; set;}
+
///
/// Sends PreLogin message to the server.
///
@@ -163,7 +169,7 @@ public void SendLogin7()
tdsMessageBody.TypeFlags.OLEDB = TDSLogin7TypeFlagsOLEDB.On;
tdsMessageBody.TypeFlags.SQLType = TDSLogin7TypeFlagsSQLType.DFLT;
- tdsMessageBody.TypeFlags.ReadOnlyIntent = TDSLogin7TypeFlagsReadOnlyIntent.On;
+ tdsMessageBody.TypeFlags.ReadOnlyIntent = this.ReadOnlyIntent;
this.TdsCommunicator.SendTDSMessage(tdsMessageBody);
From c1a36709ea4fe09369f257df0de6c6361e63376f Mon Sep 17 00:00:00 2001
From: JPaja
Date: Tue, 19 Sep 2023 14:06:07 +0200
Subject: [PATCH 2/7] Add: Base query support
Fix: Program
Fix: Program
---
.../TDSClient/TDS/Client/TDSSQLTestClient.cs | 126 ++++++++++++------
.../TDSClient/TDS/Comms/TDSCommunicator.cs | 25 +++-
.../TDS/Comms/TDSCommunicatorState.cs | 7 +-
.../TDS/Tranasction/Header/HeaderType.cs | 13 ++
.../Headers/QueryNotificationsHeaderData.cs | 38 ++++++
.../Header/Headers/TraceActivityHeaderData.cs | 26 ++++
.../TransactionDescriptorHeaderData.cs | 42 ++++++
.../TDS/Tranasction/Header/ISqlHeaderData.cs | 14 ++
.../Header/SqlAllHeadersPacketData.cs | 30 +++++
.../Tranasction/Header/SqlHeaderPacketData.cs | 60 +++++++++
.../TDS/Tranasction/TDSSqlBatchPacketData.cs | 49 +++++++
.../TDS/Utilities/BigEndianUtilities.cs | 33 +++++
TDSClient/TDSClientLiveTest/Program.cs | 9 +-
13 files changed, 425 insertions(+), 47 deletions(-)
create mode 100644 TDSClient/TDSClient/TDS/Tranasction/Header/HeaderType.cs
create mode 100644 TDSClient/TDSClient/TDS/Tranasction/Header/Headers/QueryNotificationsHeaderData.cs
create mode 100644 TDSClient/TDSClient/TDS/Tranasction/Header/Headers/TraceActivityHeaderData.cs
create mode 100644 TDSClient/TDSClient/TDS/Tranasction/Header/Headers/TransactionDescriptorHeaderData.cs
create mode 100644 TDSClient/TDSClient/TDS/Tranasction/Header/ISqlHeaderData.cs
create mode 100644 TDSClient/TDSClient/TDS/Tranasction/Header/SqlAllHeadersPacketData.cs
create mode 100644 TDSClient/TDSClient/TDS/Tranasction/Header/SqlHeaderPacketData.cs
create mode 100644 TDSClient/TDSClient/TDS/Tranasction/TDSSqlBatchPacketData.cs
diff --git a/TDSClient/TDSClient/TDS/Client/TDSSQLTestClient.cs b/TDSClient/TDSClient/TDS/Client/TDSSQLTestClient.cs
index 6f46112..7e3c23d 100644
--- a/TDSClient/TDSClient/TDS/Client/TDSSQLTestClient.cs
+++ b/TDSClient/TDSClient/TDS/Client/TDSSQLTestClient.cs
@@ -7,16 +7,21 @@
namespace TDSClient.TDS.Client
{
using System;
+ using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Security.Authentication;
+ using System.Threading;
using TDSClient.TDS.Comms;
using TDSClient.TDS.Header;
using TDSClient.TDS.Login7;
using TDSClient.TDS.PreLogin;
+ using TDSClient.TDS.Query;
using TDSClient.TDS.Tokens;
+ using TDSClient.TDS.Tranasction.Header.Headers;
+ using TDSClient.TDS.Tranasction.Headers;
using TDSClient.TDS.Utilities;
///
@@ -212,46 +217,7 @@ public void ReceiveLogin7Response()
{
foreach (var token in response.Tokens)
{
- if (token is TDSEnvChangeToken)
- {
- var envChangeToken = token as TDSEnvChangeToken;
- if (envChangeToken.Type == Tokens.EnvChange.TDSEnvChangeType.Routing)
- {
- LoggingUtilities.WriteLog($" Client received EnvChange routing token, client is being routed.");
- this.Server = envChangeToken.Values["AlternateServer"];
- this.Port = int.Parse(envChangeToken.Values["ProtocolProperty"]);
- this.reconnect = true;
- LoggingUtilities.WriteLog($" Redirect to {this.Server}:{this.Port}", writeToSummaryLog: true, writeToVerboseLog: false);
- }
- }
- else if (token is TDSErrorToken)
- {
- var errorToken = token as TDSErrorToken;
- LoggingUtilities.WriteLog($" Client received Error token, Number: {errorToken.Number}, State: {errorToken.State}", writeToSummaryLog: true); ;
- LoggingUtilities.WriteLog($" MsgText: {errorToken.MsgText}");
- LoggingUtilities.WriteLog($" Class: {errorToken.Class}");
- LoggingUtilities.WriteLog($" ServerName: {errorToken.ServerName}");
- LoggingUtilities.WriteLog($" ProcName: {errorToken.ProcName}");
- LoggingUtilities.WriteLog($" LineNumber: {errorToken.LineNumber}");
-
- if (errorToken.Number == 18456)
- {
- throw new Exception("Login failure.");
- }
- }
- else if (token is TDSInfoToken)
- {
- var infoToken = token as TDSInfoToken;
- LoggingUtilities.WriteLog($" Client received Info token:");
-
- LoggingUtilities.WriteLog($" Number: {infoToken.Number}");
- LoggingUtilities.WriteLog($" State: {infoToken.State}");
- LoggingUtilities.WriteLog($" Class: {infoToken.Class}");
- LoggingUtilities.WriteLog($" MsgText: {infoToken.MsgText}");
- LoggingUtilities.WriteLog($" ServerName: {infoToken.ServerName}");
- LoggingUtilities.WriteLog($" ProcName: {infoToken.ProcName}");
- LoggingUtilities.WriteLog($" LineNumber: {infoToken.LineNumber}");
- }
+ PrintTdsToken(token);
}
}
else
@@ -262,6 +228,50 @@ public void ReceiveLogin7Response()
LoggingUtilities.WriteLog($" Login7 response received.");
}
+ private void PrintTdsToken(TDSToken token)
+ {
+ if (token is TDSEnvChangeToken)
+ {
+ var envChangeToken = token as TDSEnvChangeToken;
+ if (envChangeToken.Type == Tokens.EnvChange.TDSEnvChangeType.Routing)
+ {
+ LoggingUtilities.WriteLog($" Client received EnvChange routing token, client is being routed.");
+ this.Server = envChangeToken.Values["AlternateServer"];
+ this.Port = int.Parse(envChangeToken.Values["ProtocolProperty"]);
+ this.reconnect = true;
+ LoggingUtilities.WriteLog($" Redirect to {this.Server}:{this.Port}", writeToSummaryLog: true, writeToVerboseLog: false);
+ }
+ }
+ else if (token is TDSErrorToken)
+ {
+ var errorToken = token as TDSErrorToken;
+ LoggingUtilities.WriteLog($" Client received Error token, Number: {errorToken.Number}, State: {errorToken.State}", writeToSummaryLog: true); ;
+ LoggingUtilities.WriteLog($" MsgText: {errorToken.MsgText}");
+ LoggingUtilities.WriteLog($" Class: {errorToken.Class}");
+ LoggingUtilities.WriteLog($" ServerName: {errorToken.ServerName}");
+ LoggingUtilities.WriteLog($" ProcName: {errorToken.ProcName}");
+ LoggingUtilities.WriteLog($" LineNumber: {errorToken.LineNumber}");
+
+ if (errorToken.Number == 18456)
+ {
+ throw new Exception("Login failure.");
+ }
+ }
+ else if (token is TDSInfoToken)
+ {
+ var infoToken = token as TDSInfoToken;
+ LoggingUtilities.WriteLog($" Client received Info token:");
+
+ LoggingUtilities.WriteLog($" Number: {infoToken.Number}");
+ LoggingUtilities.WriteLog($" State: {infoToken.State}");
+ LoggingUtilities.WriteLog($" Class: {infoToken.Class}");
+ LoggingUtilities.WriteLog($" MsgText: {infoToken.MsgText}");
+ LoggingUtilities.WriteLog($" ServerName: {infoToken.ServerName}");
+ LoggingUtilities.WriteLog($" ProcName: {infoToken.ProcName}");
+ LoggingUtilities.WriteLog($" LineNumber: {infoToken.LineNumber}");
+ }
+ }
+
///
/// Connect to the server.
///
@@ -332,6 +342,42 @@ public void Connect()
}
}
+ public int queryCount = 0;
+ public Dictionary