Skip to content

Commit a5dbf4c

Browse files
Abhi/connection properties (#126)
* Exposing more connection properties WIP 1 * fix dictionary key checks
1 parent a09d4e7 commit a5dbf4c

File tree

3 files changed

+75
-11
lines changed

3 files changed

+75
-11
lines changed

mssqlcli/jsonrpc/contracts/connectionservice.py

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,20 +85,34 @@ class ConnectionDetails(object):
8585
"""
8686

8787
def __init__(self, parameters):
88+
# Required params
8889
self.ServerName = parameters[u'ServerName']
8990
self.DatabaseName = parameters[u'DatabaseName']
9091
self.UserName = parameters[u'UserName']
9192
self.Password = parameters[u'Password']
9293
self.AuthenticationType = parameters[u'AuthenticationType']
9394
self.MultipleActiveResultSets = parameters[u'MultipleActiveResultSets']
95+
# Optional Params
96+
if u'Encrypt' in parameters:
97+
self.Encrypt = parameters[u'Encrypt']
98+
if u'TrustServerCertificate' in parameters:
99+
self.TrustServerCertificate = parameters[u'TrustServerCertificate']
100+
if u'ConnectTimeout' in parameters:
101+
self.ConnectTimeout = parameters[u'ConnectTimeout']
102+
if u'ApplicationIntent' in parameters:
103+
self.ApplicationIntent = parameters[u'ApplicationIntent']
104+
if u'MultiSubnetFailover' in parameters:
105+
self.MultiSubnetFailover = parameters[u'MultiSubnetFailover']
106+
if u'PacketSize' in parameters:
107+
self.PacketSize = parameters[u'PacketSize']
94108

95109
def format(self):
96110
return vars(self)
97111

98112

99113
class ConnectionParams(object):
100114
def __init__(self, parameters):
101-
self.owner_uri = parameters['OwnerUri']
115+
self.owner_uri = parameters[u'OwnerUri']
102116
self.connection_details = ConnectionDetails(parameters)
103117

104118
def format(self):
@@ -119,9 +133,13 @@ def __init__(self, params):
119133
self.error_message = inner_params[u'errorMessage']
120134
self.error_number = inner_params[u'errorNumber']
121135
# server information.
122-
self.is_cloud = inner_params[u'serverInfo'][u'isCloud'] if u'serverInfo' in inner_params else False
123-
self.server_version = inner_params[u'serverInfo'][u'serverVersion'] if u'serverInfo' in inner_params else None
124-
self.server_edition = inner_params[u'serverInfo'][u'serverEdition'] if u'serverInfo' in inner_params else None
136+
if u'serverInfo' in inner_params and inner_params[u'serverInfo']:
137+
self.is_cloud = inner_params[u'serverInfo'][u'isCloud'] if \
138+
u'isCloud' in inner_params[u'serverInfo'] else False
139+
self.server_version = inner_params[u'serverInfo'][u'serverVersion'] if \
140+
u'serverVersion' in inner_params[u'serverInfo'] else None
141+
self.server_edition = inner_params[u'serverInfo'][u'serverEdition'] if \
142+
u'serverEdition' in inner_params[u'serverInfo'] else None
125143

126144

127145
class ConnectionResponse(object):

mssqlcli/main.py

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,8 @@ def initialize_logging(self):
259259
root_logger.debug('Log file %r.', log_file)
260260

261261
def connect(self, database='', server='', user='', port='', passwd='',
262-
dsn='', **kwargs):
262+
dsn='', encrypt=None, trust_server_certificate=None, connection_timeout=None, application_intent=None,
263+
multi_subnet_failover=None, packet_size=None, **kwargs):
263264
# Connect to the database.
264265

265266
if not user and not self.integrated_auth:
@@ -304,7 +305,13 @@ def connect(self, database='', server='', user='', port='', passwd='',
304305

305306
self.mssqlcliclient_query_execution = MssqlCliClient(self.sqltoolsclient, server, user, passwd,
306307
database=database,
307-
authentication_type=authentication_type, **kwargs)
308+
authentication_type=authentication_type,
309+
encrypt=encrypt,
310+
trust_server_certificate=trust_server_certificate,
311+
connection_timeout=connection_timeout,
312+
application_intent=application_intent,
313+
multi_subnet_failover=multi_subnet_failover,
314+
packet_size=packet_size,**kwargs)
308315

309316
if not self.mssqlcliclient_query_execution.connect():
310317
click.secho(
@@ -674,9 +681,23 @@ def get_last_query(self):
674681
help='Skip intro on startup and goodbye on exit.')
675682
@click.option('--auto-vertical-output', is_flag=True,
676683
help='Automatically switch to vertical output mode if the result is wider than the terminal width.')
677-
def cli(username, server, prompt_passwd,
678-
database, version, mssqlclirc, row_limit,
679-
less_chatty, auto_vertical_output, integrated_auth):
684+
@click.option('-N', '--encrypt', is_flag=True, default=False,
685+
help='SQL Server uses SSL encryption for all data if the server has a certificate installed.')
686+
@click.option('-C', '--trust-server-certificate', is_flag=True, default=False,
687+
help='The channel will be encrypted while bypassing walking the certificate chain to validate trust.')
688+
@click.option('-l', '--connect-timeout', default=0, type=int,
689+
help='Time in seconds to wait for a connection to the server before terminating request.')
690+
@click.option('-K', '--application-intent', default='',
691+
help='Declares the application workload type when connecting to a database in a SQL Server Availability '
692+
'Group.')
693+
@click.option('-M', '--multi-subnet-failover', is_flag=True, default=False,
694+
help='If application is connecting to AlwaysOn AG on different subnets, setting this provides faster '
695+
'detection and connection to currently active server.')
696+
@click.option('-a', '--packet-size', default=0, type=int,
697+
help='Size in bytes of the network packets used to communicate with SQL Server.')
698+
def cli(username, server, prompt_passwd, database, version, mssqlclirc, row_limit, less_chatty, auto_vertical_output,
699+
integrated_auth, encrypt, trust_server_certificate, connect_timeout, application_intent, multi_subnet_failover,
700+
packet_size):
680701

681702
if version:
682703
print('Version:', __version__)
@@ -695,7 +716,10 @@ def cli(username, server, prompt_passwd,
695716
mssqlclirc_file=mssqlclirc, less_chatty=less_chatty, auto_vertical_output=auto_vertical_output,
696717
integrated_auth=integrated_auth)
697718

698-
mssqlcli.connect(database, server, username, port='')
719+
mssqlcli.connect(database, server, username, port='', encrypt=encrypt,
720+
trust_server_certificate=trust_server_certificate, connection_timeout=connect_timeout,
721+
application_intent=application_intent, multi_subnet_failover=multi_subnet_failover,
722+
packet_size=packet_size)
699723

700724
mssqlcli.logger.debug('Launch Params: \n'
701725
'\tdatabase: %r'

mssqlcli/mssqlcliclient.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ class MssqlCliClient(object):
2222

2323
def __init__(self, sql_tools_client, server_name, user_name, password,
2424
authentication_type=u'SqlLogin', database=u'master', owner_uri=None, multiple_active_result_sets=True,
25-
**kwargs):
25+
encrypt=None, trust_server_certificate=None, connection_timeout=None, application_intent=None,
26+
multi_subnet_failover=None, packet_size=None, **kwargs):
2627
self.server_name = server_name
2728
self.user_name = user_name
2829
self.password = password
@@ -31,6 +32,12 @@ def __init__(self, sql_tools_client, server_name, user_name, password,
3132
self.owner_uri = owner_uri
3233
self.is_connected = False
3334
self.multiple_active_result_sets = multiple_active_result_sets
35+
self.encrypt = encrypt
36+
self.trust_server_certificate = trust_server_certificate
37+
self.connection_timeout = connection_timeout
38+
self.application_intent = application_intent
39+
self.multi_subnet_failover = multi_subnet_failover
40+
self.packet_size = packet_size
3441
self.extra_params = {k: v for k, v in kwargs.items()}
3542
self.sql_tools_client = sql_tools_client
3643
self.server_version = None
@@ -51,6 +58,7 @@ def connect(self):
5158
if self.is_connected:
5259
return self.owner_uri
5360

61+
# Required params
5462
connection_params = {u'ServerName': self.server_name,
5563
u'DatabaseName': self.database,
5664
u'UserName': self.user_name,
@@ -59,6 +67,20 @@ def connect(self):
5967
u'OwnerUri': self.owner_uri,
6068
u'MultipleActiveResultSets': self.multiple_active_result_sets}
6169

70+
# Optional params
71+
if self.encrypt:
72+
connection_params[u'Encrypt'] = self.encrypt
73+
if self.trust_server_certificate:
74+
connection_params[u'TrustServerCertificate'] = self.trust_server_certificate
75+
if self.connection_timeout:
76+
connection_params[u'ConnectTimeout'] = self.connection_timeout
77+
if self.application_intent:
78+
connection_params[u'ApplicationIntent'] = self.application_intent
79+
if self.multi_subnet_failover:
80+
connection_params[u'MultiSubnetFailover'] = self.multi_subnet_failover
81+
if self.packet_size:
82+
connection_params[u'PacketSize'] = self.packet_size
83+
6284
connection_params.update(self.extra_params)
6385

6486
connection_request = self.sql_tools_client.create_request(

0 commit comments

Comments
 (0)