denisenkom / pytds

Python DBAPI driver for MSSQL using pure Python TDS (Tabular Data Stream) protocol implementation

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

readonly=True is not working

takoau opened this issue · comments

Pull request is #138

  1. Currently readonly flag does not work on AG database. The type flag is not correct. It should be 2<<4 instead of 2<<5.
    if login.readonly:
    type_flags |= (2 << 5)
    w.put_byte(type_flags)

  2. Secondly readonly flag not working for SSPI authentication. Socket connects twice if you connect over AG listeners. One connecting to AG listener and second one actually connect to database server. However second connection always fails as SPN not changing to database host. It throws SEC_E_INVALID_HANDLE at the end.

conn = pytds.connect(dsn='TestAG', readonly=True, port=1901, use_sso=True, database='dba')
SPN is : MSSQLSvc@TestAG:1901
Opening socket to TestAG:1901
Get socket done
SPN is : MSSQLSvc@TestAG:1901
Opening socket to TestDB:1901
Get socket done

Traceback (most recent call last):
File "C:\Users\mau.conda\envs\venv\lib\site-packages\IPython\core\interactiveshell.py", line 3457, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "", line 1, in
conn = pytds.connect(dsn='TestAG', readonly=True, port=1901, use_sso=True, database='dba')
File "C:\Users\mau.conda\envs\venv\lib\site-packages\pytds_init_.py", line 1362, in connect
conn.open(sock=sock)
File "C:\Users\mau.conda\envs\venv\lib\site-packages\pytds_init
.py", line 388, in _open
self.try_open(timeout=retry_time, sock=sock)
File "C:\Users\mau.conda\envs\venv\lib\site-packages\pytds_init
.py", line 370, in _try_open
self.connect(host=host, port=port, instance=instance, timeout=timeout, sock=sock)
File "C:\Users\mau.conda\envs\venv\lib\site-packages\pytds_init
.py", line 327, in connect
timeout=timeout)
File "C:\Users\mau.conda\envs\venv\lib\site-packages\pytds_init
.py", line 320, in _connect
route = conn.login(login, sock, self._tzinfo_factory)
File "C:\Users\mau.conda\envs\venv\lib\site-packages\pytds\tds.py", line 1705, in login
self._main_session.tds7_send_login(login)
File "C:\Users\mau.conda\envs\venv\lib\site-packages\pytds\tds.py", line 1389, in tds7_send_login
auth_packet = login.auth.create_packet()
File "C:\Users\mau.conda\envs\venv\lib\site-packages\pytds\login.py", line 71, in create_packet
output_buffers=[(sspi.SECBUFFER_TOKEN, buf)])
File "C:\Users\mau.conda\envs\venv\lib\site-packages\pytds\sspi.py", line 377, in create_context
byref(ctx._ts))
File "C:\Users\mau.conda\envs\venv\lib\site-packages\pytds\sspi.py", line 164, in ret_val
raise Exception('SSPI Error {0}'.format(Status.getname(value)))
Exception: SSPI Error SEC_E_INVALID_HANDLE

@denisenkom we're struggling with this same problem, and @takoau 's PR: #138 fixes it.

@denisenkom we're struggling with this same problem, and @takoau 's PR: #138 fixes it.

@ecly I'm struggling with codecov. Is there anything I can do to make it pass? I have no knowledge on what codecov is. I am a database admin not a dev.

A solution is here, whilst the project author seemed to have abandoned the project so no further code merge.