Ë
    ðmxi×&  ã                  ón  — d Z ddlmZ ddlZddlmZ ddlmZ ddlmZ ddlmZ ddlm	Z	 dd	lm
Z
 dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ er6ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z   G d„ de«      Z! G d„ de«      Z" G d „ d!e«      Z#e#Z$y)"a¨  

.. dialect:: mysql+mysqldb
    :name: mysqlclient (maintained fork of MySQL-Python)
    :dbapi: mysqldb
    :connectstring: mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
    :url: https://pypi.org/project/mysqlclient/

Driver Status
-------------

The mysqlclient DBAPI is a maintained fork of the
`MySQL-Python <https://sourceforge.net/projects/mysql-python>`_ DBAPI
that is no longer maintained.  `mysqlclient`_ supports Python 2 and Python 3
and is very stable.

.. _mysqlclient: https://github.com/PyMySQL/mysqlclient-python

.. _mysqldb_unicode:

Unicode
-------

Please see :ref:`mysql_unicode` for current recommendations on unicode
handling.

.. _mysqldb_ssl:

SSL Connections
----------------

The mysqlclient and PyMySQL DBAPIs accept an additional dictionary under the
key "ssl", which may be specified using the
:paramref:`_sa.create_engine.connect_args` dictionary::

    engine = create_engine(
        "mysql+mysqldb://scott:tiger@192.168.0.134/test",
        connect_args={
            "ssl": {
                "ca": "/home/gord/client-ssl/ca.pem",
                "cert": "/home/gord/client-ssl/client-cert.pem",
                "key": "/home/gord/client-ssl/client-key.pem",
            }
        },
    )

For convenience, the following keys may also be specified inline within the URL
where they will be interpreted into the "ssl" dictionary automatically:
"ssl_ca", "ssl_cert", "ssl_key", "ssl_capath", "ssl_cipher",
"ssl_check_hostname". An example is as follows::

    connection_uri = (
        "mysql+mysqldb://scott:tiger@192.168.0.134/test"
        "?ssl_ca=/home/gord/client-ssl/ca.pem"
        "&ssl_cert=/home/gord/client-ssl/client-cert.pem"
        "&ssl_key=/home/gord/client-ssl/client-key.pem"
    )

.. seealso::

    :ref:`pymysql_ssl` in the PyMySQL dialect


Using MySQLdb with Google Cloud SQL
-----------------------------------

Google Cloud SQL now recommends use of the MySQLdb dialect.  Connect
using a URL like the following:

.. sourcecode:: text

    mysql+mysqldb://root@/<dbname>?unix_socket=/cloudsql/<projectid>:<instancename>

Server Side Cursors
-------------------

The mysqldb dialect supports server-side cursors. See :ref:`mysql_ss_cursors`.

é    )ÚannotationsN)ÚAny)ÚCallable)Úcast)ÚDict)ÚOptional)ÚTuple)ÚTYPE_CHECKINGé   )ÚMySQLCompiler)ÚMySQLDialect)ÚMySQLExecutionContext)ÚMySQLIdentifierPrepareré   )Úutil)ÚLiteral)Ú
Connection)Ú_DBAPIMultiExecuteParams)ÚConnectArgsType)ÚDBAPIConnection)ÚDBAPICursor)ÚDBAPIModule)ÚExecutionContext)ÚIsolationLevel)ÚURLc                  ó   — e Zd Zy)ÚMySQLExecutionContext_mysqldbN©Ú__name__Ú
__module__Ú__qualname__© ó    úX/home/htdocs/ttos/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/mysqldb.pyr   r   v   ó   „ Ør#   r   c                  ó   — e Zd Zy)ÚMySQLCompiler_mysqldbNr   r"   r#   r$   r'   r'   z   r%   r#   r'   c                  ó8  ‡ — e Zd ZU dZdZdZdZdZdZdZ	e
ZeZeZded<   dˆ fd„Zdd„Zej(                  j*                  dd„«       Zedd	„«       Zdˆ fd
„Zdd„Z	 d	 	 	 	 	 	 	 	 	 dd„Z	 d	 	 	 	 	 dd„Zdd„Zdd„Zdd„Z	 	 	 	 d d„Z d!d„Z!	 	 	 	 	 	 d"ˆ fd„Z"ˆ xZ#S )#ÚMySQLDialect_mysqldbÚmysqldbTÚformatúTuple[int, ...]Úserver_version_infoc                óÌ   •— t        ‰| �  di |¤Ž | j                  �At        | j                  d«      r+| j	                  | j                  j
                  «      | _        y d| _        y )NÚ__version__©r   r   r   r"   )ÚsuperÚ__init__ÚdbapiÚhasattrÚ_parse_dbapi_versionr/   Ú_mysql_dbapi_version)ÚselfÚkwargsÚ	__class__s     €r$   r2   zMySQLDialect_mysqldb.__init__�   s[   ø€ Ü‰ÑÑ"˜6Ò"ð �z‰zÐ%¬'°$·*±*¸mÔ*Lð ×%Ñ% d§j¡j×&<Ñ&<Ó=ð 	Õ!ð ð 	Õ!r#   c                óz   — t        j                  d|«      }|r#t        d„ |j                  ddd«      D «       «      S y)Nz(\d+)\.(\d+)(?:\.(\d+))?c              3  ó8   K  — | ]  }|€Œt        |«      –— Œ y ­w©N)Úint)Ú.0Úxs     r$   ú	<genexpr>z<MySQLDialect_mysqldb._parse_dbapi_version.<locals>.<genexpr>˜   s   è ø€ ÒK A¸Q¹]œ˜QŸÑKùs   ‚Šr   é   r   r0   )ÚreÚmatchÚtupleÚgroup)r7   ÚversionÚms      r$   r5   z)MySQLDialect_mysqldb._parse_dbapi_version•   s7   € Ü�H‰HÐ0°'Ó:ˆÙÜÑK¨¯©°°A°qÓ)9ÔKÓKÐKàr#   c                ó|   — 	 t        d«      j                  }|j                  | _        y# t        t
        f$ r Y yw xY w)NzMySQLdb.cursorsTF)Ú
__import__ÚcursorsÚSSCursorÚ	_sscursorÚImportErrorÚAttributeError)r7   rJ   s     r$   Úsupports_server_side_cursorsz1MySQLDialect_mysqldb.supports_server_side_cursorsœ   s?   € ð	Ü Ð!2Ó3×;Ñ;ˆGØ$×-Ñ-ˆDŒNØøÜœ^Ð,ò 	Ùð	ús   ‚&) ©;º;c                ó   — t        d«      S )NÚMySQLdb)rI   )Úclss    r$   Úimport_dbapiz!MySQLDialect_mysqldb.import_dbapi¥   s   € ä˜)Ó$Ð$r#   c                ó2   •‡— t         ‰| �  «       Šdˆfd„}|S )Nc                ó¨   •— ‰� ‰| «       | j                  «       }|�5| j                  «       }|j                  d|z  «       |j                  «        y y )NzSET NAMES %s)Úcharacter_set_nameÚcursorÚexecuteÚclose)ÚconnÚcharset_namerW   Úsuper_s      €r$   Ú
on_connectz3MySQLDialect_mysqldb.on_connect.<locals>.on_connect¬   sN   ø€ ØÐ!Ù�t”à×2Ñ2Ó4ˆLàÐ'ØŸ™›�Ø—‘˜~°Ñ<Ô=Ø—‘•ð (r#   )rZ   r   ÚreturnÚNone)r1   r]   )r7   r]   r\   r9   s     @€r$   r]   zMySQLDialect_mysqldb.on_connect©   s   ù€ Ü‘Ñ#Ó%ˆõ		ð Ðr#   c                ó$   — |j                  «        y)NT)Úping)r7   Údbapi_connections     r$   Údo_pingzMySQLDialect_mysqldb.do_ping¹   s   € Ø×ÑÔØr#   c                óX   — |j                  ||«      }|�|t        t        |«      _        y y r<   )Úexecutemanyr   r   Ú	_rowcount)r7   rW   Ú	statementÚ
parametersÚcontextÚrowcounts         r$   Údo_executemanyz#MySQLDialect_mysqldb.do_executemany½   s1   € ð ×%Ñ% i°Ó<ˆØÐØ=EŒDÔ&¨Ó0Õ:ð r#   c                óh  — |€t        ddd¬«      } |j                  di |¤Ž}|j                  |j                  «       t	        j
                  |dt        «       t	        j
                  |dt        «       t	        j
                  |dt        «       t	        j
                  |dt        «       t	        j
                  |d	t        «       t	        j
                  |d
t        «       t	        j
                  |dt        «       t	        j
                  |dt        «       i }dt        fdt        fdt        fdt        fdt        fdt        fg}|D ]2  \  }}||v sŒ||   ||dd  <   t	        j
                  ||dd  |«       ||= Œ4 |r||d<   |j                  d	d«      }| j                  «       }	|	�
||	z  }||d	<   g |fS )NÚdbÚuserÚpasswd)ÚdatabaseÚusernameÚpasswordÚcompressÚconnect_timeoutÚread_timeoutÚwrite_timeoutÚclient_flagÚlocal_infileÚuse_unicodeÚcharsetÚssl_caÚssl_keyÚssl_certÚ
ssl_capathÚ
ssl_cipherÚssl_check_hostnameé   Ússlr   r"   )ÚdictÚtranslate_connect_argsÚupdateÚqueryr   Úcoerce_kw_typeÚboolr=   ÚstrÚgetÚ_found_rows_client_flag)
r7   ÚurlÚ_translate_argsÚoptsr‚   ÚkeysÚkeyÚkw_typerw   Úclient_flag_found_rowss
             r$   Úcreate_connect_argsz(MySQLDialect_mysqldb.create_connect_argsÈ   s³  € ð Ð"Ü"Ø¨¸ôˆOð *ˆs×)Ñ)Ñ<¨OÑ<ˆØ�‰�C—I‘IÔä×Ñ˜D *¬dÔ3Ü×Ñ˜DÐ"3´SÔ9Ü×Ñ˜D .´#Ô6Ü×Ñ˜D /´3Ô7Ü×Ñ˜D -´Ô5Ü×Ñ˜D .´$Ô7ô 	×Ñ˜D -´Ô6Ü×Ñ˜D )¬SÔ1ð
 ˆà”sˆOØœÐØœÐØœ3ÐØœ3ÐØ!¤4Ð(ð
ˆð !ò 	‰LˆC�Ø�dŠ{Ø# C™y��C˜˜�G‘Ü×#Ñ# C¨¨Q¨R¨°'Ô:Ø˜‘Ið		ñ
 ØˆD�‰Kð —h‘h˜}¨aÓ0ˆà!%×!=Ñ!=Ó!?ÐØ!Ð-ØÐ1Ñ1ˆKØ"-ˆD�ÑØ�4ˆxˆr#   c                óÌ   — | j                   �C	 t        | j                   j                  dz   «      j                  j                  }|j
                  S y # t        t        f$ r Y y w xY w)Nz.constants.CLIENT)r3   rI   r   Ú	constantsÚCLIENTÚ
FOUND_ROWSrN   rM   )r7   ÚCLIENT_FLAGSs     r$   r‹   z,MySQLDialect_mysqldb._found_rows_client_flagý   sd   € Ø�:‰:Ð!ð/Ü)Ø—J‘J×'Ñ'Ð*=Ñ=ó ç‘)ŸF™Fð ð $×.Ñ.Ð.àøô #¤KÐ0ò Ùðús   Ž6A ÁA#Á"A#c                ó    — |j                   d   S )Nr   )Úargs)r7   Ú	exceptions     r$   Ú_extract_error_codez(MySQLDialect_mysqldb._extract_error_code
  s   € Ø�~‰~˜aÑ Ð r#   c                ó†   — 	 |j                   j                  } |«       S # t        $ r t        j                  d«       Y yw xY w)z:Sniff out the character set in use for connection results.z�No 'character_set_name' can be detected with this MySQL-Python version; please upgrade to a recent version of MySQL-Python.  Assuming latin1.Úlatin1)Ú
connectionrV   rN   r   Úwarn)r7   rŸ   Ú	cset_names      r$   Ú_detect_charsetz$MySQLDialect_mysqldb._detect_charset  sN   € ð	ð
 ×%Ñ%×8Ñ8ð ñ “;Ðøô ò 	Ü�I‰Ið#ôñ ð	ús   ‚ ŸA ¿A c                 ó   — y)N)ÚSERIALIZABLEzREAD UNCOMMITTEDzREAD COMMITTEDzREPEATABLE READÚ
AUTOCOMMITr"   ©r7   Ú
dbapi_conns     r$   Úget_isolation_level_valuesz/MySQLDialect_mysqldb.get_isolation_level_values"  s   € ð
r#   c                ó"   — |j                  «       S r<   )Úget_autocommitr¦   s     r$   Údetect_autocommit_settingz.MySQLDialect_mysqldb.detect_autocommit_setting-  s   € Ø×(Ñ(Ó*Ð*r#   c                óv   •— |dk(  r|j                  d«       y |j                  d«       t        ‰| �	  ||«       y )Nr¥   TF)Ú
autocommitr1   Úset_isolation_level)r7   rb   Úlevelr9   s      €r$   r®   z(MySQLDialect_mysqldb.set_isolation_level0  s9   ø€ ð �LÒ Ø×'Ñ'¨Õ-à×'Ñ'¨Ô.Ü‰GÑ'Ð(8¸%Õ@r#   )r8   r   )rF   r‰   r^   r,   )r^   rˆ   )r^   r   )r^   z!Callable[[DBAPIConnection], None])rb   r   r^   zLiteral[True]r<   )
rW   r   rg   r‰   rh   r   ri   zOptional[ExecutionContext]r^   r_   )rŒ   r   r�   zOptional[Dict[str, Any]]r^   r   )r^   zOptional[int])r›   zDBAPIModule.Errorr^   r=   )rŸ   r   r^   r‰   )r§   r   r^   zTuple[IsolationLevel, ...])r§   r   r^   rˆ   )rb   r   r¯   r   r^   r_   )$r   r    r!   ÚdriverÚsupports_statement_cacheÚsupports_unicode_statementsÚsupports_sane_rowcountÚsupports_sane_multi_rowcountÚsupports_native_decimalÚdefault_paramstyler   Úexecution_ctx_clsr'   Ústatement_compilerr   ÚpreparerÚ__annotations__r2   r5   r   ÚlanghelpersÚmemoized_propertyrO   ÚclassmethodrS   r]   rc   rk   r“   r‹   rœ   r¢   r¨   r«   r®   Ú__classcell__)r9   s   @r$   r)   r)   ~   s@  ø… Ø€FØ#ÐØ"&ÐØ!ÐØ#'Ð à"Ðà!ÐØ5ÐØ.ÐØ&€HØ(Ó(õ
óð 
×Ñ×'Ñ'òó (ðð ò%ó ð%õó ð /3ð	Fàð	Fð ð	Fð -ð		Fð
 ,ð	Fð 
ó	Fð EIð3Øð3Ø)Að3à	ó3ójó!óð*	
Ø)ð	
à	#ó	
ó+ðAØ /ðAØ8FðAà	÷Añ Ar#   r)   )%Ú__doc__Ú
__future__r   rB   Útypingr   r   r   r   r   r	   r
   Úbaser   r   r   r   Ú r   Úutil.typingr   Úengine.baser   Úengine.interfacesr   r   r   r   r   r   r   Ú
engine.urlr   r   r'   r)   Údialectr"   r#   r$   ú<module>rÉ      sŠ   ðñNõ^ #ã 	Ý Ý Ý Ý Ý Ý Ý  å Ý Ý 'Ý )Ý Ý "áå)Ý=Ý4Ý4Ý0Ý0Ý5Ý3Ý!ô	Ð$9ô 	ô	˜Mô 	ôyA˜<ô yAðx �r#   