Ë
    r™ãj¢(  ã                  óV  — 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 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)ÚLiteral)ÚOptional)ÚTYPE_CHECKINGé   )ÚMySQLCompiler)ÚMySQLDialect)ÚMySQLExecutionContext)ÚMySQLIdentifierPrepareré   )Úutil)Ú
Connection)Ú_DBAPIMultiExecuteParams)ÚConnectArgsType)ÚDBAPIConnection)ÚDBAPICursor)ÚDBAPIModule)ÚExecutionContext)ÚIsolationLevel)ÚURLc                  ó   — e Zd Zy)ÚMySQLExecutionContext_mysqldbN©Ú__name__Ú
__module__Ú__qualname__© ó    úl/var/www/html/python-recuperauto-other/env/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/mysqldb.pyr   r   u   ó   „ Ør!   r   c                  ó   — e Zd Zy)ÚMySQLCompiler_mysqldbNr   r    r!   r"   r%   r%   y   r#   r!   r%   c                  ó,  ‡ — 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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Úformatztuple[int, ...]Úserver_version_infoc                óÆ   — t        |dd «      }|�3t        j                  t        t	        j
                  d„ |«      «      «      S t        j                  t        |dd «      «      S )NÚversion_infoc                ó"   — t        | t        «      S ©N)Ú
isinstanceÚint)Úparts    r"   ú<lambda>z=MySQLDialect_mysqldb.retrieve_dbapi_version.<locals>.<lambda>š   s   € ¤Z°´cÓ%:€ r!   Ú__version__)Úgetattrr   ÚVersionInfoÚtupleÚ	itertoolsÚ	takewhileÚparse_version_string)ÚselfÚdbapir,   s      r"   Úretrieve_dbapi_versionz+MySQLDialect_mysqldb.retrieve_dbapi_versionŒ   sb   € ô ˜u n°dÓ;ˆØÐ#Ü×#Ñ#ÜÜ×'Ñ'Ù:¸Lóóóð ô ×(Ñ(¬°¸ÀtÓ)LÓMÐMr!   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)r:   r?   s     r"   Úsupports_server_side_cursorsz1MySQLDialect_mysqldb.supports_server_side_cursors    s?   € ð	Ü Ð!2Ó3×;Ñ;ˆGØ$×-Ñ-ˆDŒNØøÜœ^Ð,ò 	Ùð	ús   ‚&) ©;º;c                ó   — t        d«      S )NÚMySQLdb)r>   )Ú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_namerL   Úsuper_s      €r"   Ú
on_connectz3MySQLDialect_mysqldb.on_connect.<locals>.on_connect°   sN   ø€ ØÐ!Ù�t”à×2Ñ2Ó4ˆLàÐ'ØŸ™›�Ø—‘˜~°Ñ<Ô=Ø—‘•ð (r!   )rO   r   ÚreturnÚNone)ÚsuperrR   )r:   rR   rQ   Ú	__class__s     @€r"   rR   zMySQLDialect_mysqldb.on_connect­   s   ù€ Ü‘Ñ#Ó%ˆõ		ð Ðr!   c                ó$   — |j                  «        y)NT)Úping)r:   Údbapi_connections     r"   Údo_pingzMySQLDialect_mysqldb.do_ping½   s   € Ø×ÑÔØr!   c                óX   — |j                  ||«      }|�|t        t        |«      _        y y r.   )Úexecutemanyr   r   Ú	_rowcount)r:   rL   Ú	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Úboolr0   ÚstrÚgetÚ_found_rows_client_flag)
r:   ÚurlÚ_translate_argsÚoptsry   ÚkeysÚkeyÚkw_typern   Ú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)r;   r>   r   Ú	constantsÚCLIENTÚ
FOUND_ROWSrC   rB   )r:   Ú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)r:   Ú	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)Ú
connectionrK   rC   r   Úwarn)r:   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    ©r:   Ú
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_setting1  s   € Ø×(Ñ(Ó*Ð*r!   c                óv   •— |dk(  r|j                  d«       y |j                  d«       t        ‰| �	  ||«       y )Nrœ   TF)Ú
autocommitrU   Úset_isolation_level)r:   rY   ÚlevelrV   s      €r"   r¥   z(MySQLDialect_mysqldb.set_isolation_level4  s9   ø€ ð �LÒ Ø×'Ñ'¨Õ-à×'Ñ'¨Ô.Ü‰GÑ'Ð(8¸%Õ@r!   )r;   r   rS   zutil.VersionInfo)rS   r   )rS   r   )rS   z!Callable[[DBAPIConnection], None])rY   r   rS   zLiteral[True]r.   )
rL   r   r^   r€   r_   r   r`   zOptional[ExecutionContext]rS   rT   )rƒ   r   r„   zOptional[dict[str, Any]]rS   r   )rS   zOptional[int])r’   zDBAPIModule.ErrorrS   r0   )r–   r   rS   r€   )rž   r   rS   ztuple[IsolationLevel, ...])rž   r   rS   r   )rY   r   r¦   r   rS   rT   )#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__r<   r   ÚlanghelpersÚmemoized_propertyrD   ÚclassmethodrH   rR   rZ   rb   rŠ   r‚   r“   r™   rŸ   r¢   r¥   Ú__classcell__)rV   s   @r"   r'   r'   }   s<  ø… Ø€FØ#ÐØ"&ÐØ!ÐØ#'Ð à"Ðà!ÐØ5ÐØ.ÐØ&€HØ(Ó(óNð( 
×Ñ×'Ñ'òó (ðð ò%ó ð%õó ð /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   r7   Útypingr   r   r   r   r   r	   Úbaser   r   r   r   Ú r   Ú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ô 	ô~A˜<ô ~AðB �r!   