o
    Šåg6%  ã                   @   s˜   d 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
 G dd„ deƒZG dd„ deƒZG dd„ deƒZeZdS )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`.

é    Né   )ÚMySQLCompiler)ÚMySQLDialect)ÚMySQLExecutionContext)ÚMySQLIdentifierPreparer)ÚTEXTé   )Úsql)Úutilc                   @   ó   e Zd ZdS )ÚMySQLExecutionContext_mysqldbN©Ú__name__Ú
__module__Ú__qualname__© r   r   ú]/var/www/html/flaskapp/venv/lib/python3.10/site-packages/sqlalchemy/dialects/mysql/mysqldb.pyr   e   ó    r   c                   @   r   )ÚMySQLCompiler_mysqldbNr   r   r   r   r   r   i   r   r   c                       sÈ   e Zd ZdZdZdZdZdZdZdZ	e
ZeZeZ‡ fdd„Zdd„ Zejjdd	„ ƒZed
d„ ƒZ‡ fdd„Zdd„ Zd!dd„Z‡ fdd„Zd!dd„Zdd„ Zdd„ Zdd„ Zdd„ Z ‡ fdd „Z!‡  Z"S )"ÚMySQLDialect_mysqldbÚmysqldbTÚformatc                    sF   t ƒ jdi |¤Ž | jd urt| jdƒr|  | jj¡| _d S d| _d S )NÚ__version__©r   r   r   r   )ÚsuperÚ__init__ÚdbapiÚhasattrÚ_parse_dbapi_versionr   Ú_mysql_dbapi_version)ÚselfÚkwargs©Ú	__class__r   r   r   {   s   ÿÿýzMySQLDialect_mysqldb.__init__c                 C   s0   t  d|¡}|rtdd„ | ddd¡D ƒƒS dS )Nz(\d+)\.(\d+)(?:\.(\d+))?c                 s   s    � | ]}|d urt |ƒV  qd S ©N)Úint)Ú.0Úxr   r   r   Ú	<genexpr>†   s   € z<MySQLDialect_mysqldb._parse_dbapi_version.<locals>.<genexpr>r   é   r   r   )ÚreÚmatchÚtupleÚgroup)r    ÚversionÚmr   r   r   r   ƒ   s   z)MySQLDialect_mysqldb._parse_dbapi_versionc              	   C   s2   zt dƒj}|j| _W dS  ttfy   Y dS w )NzMySQLdb.cursorsTF)Ú
__import__ÚcursorsÚSSCursorÚ	_sscursorÚImportErrorÚAttributeError)r    r1   r   r   r   Úsupports_server_side_cursorsŠ   s   
ÿz1MySQLDialect_mysqldb.supports_server_side_cursorsc                 C   s   t dƒS )NÚMySQLdb)r0   )Úclsr   r   r   Úimport_dbapi“   s   z!MySQLDialect_mysqldb.import_dbapic                    s   t ƒ  ¡ ‰ ‡ fdd„}|S )Nc                    sF   ˆ d urˆ | ƒ |   ¡ }|d ur!|  ¡ }| d| ¡ | ¡  d S d S )NzSET NAMES %s)Úcharacter_set_nameÚcursorÚexecuteÚclose)ÚconnÚcharset_namer;   ©Úsuper_r   r   Ú
on_connectš   s   ýz3MySQLDialect_mysqldb.on_connect.<locals>.on_connect)r   rB   )r    rB   r"   r@   r   rB   —   s   
zMySQLDialect_mysqldb.on_connectc                 C   s   |  ¡  dS )NT)Úping©r    Údbapi_connectionr   r   r   Údo_ping§   s   zMySQLDialect_mysqldb.do_pingNc                 C   s"   |  ||¡}|d ur||_d S d S r$   )ÚexecutemanyÚ	_rowcount)r    r;   Ú	statementÚ
parametersÚcontextÚrowcountr   r   r   Údo_executemany«   s   
ÿz#MySQLDialect_mysqldb.do_executemanyc                    sn   |  d| j d¡| j d¡f ¡ ¡ }| jdko|}|r.t t t d¡t	dd�¡d¡g}ng }t
ƒ  ||¡S )	Nz:show collation where %s = 'utf8mb4' and %s = 'utf8mb4_bin'ÚCharsetÚ	Collation)é   z'test collated returns'Úutf8mb4)ÚcharsetÚutf8mb4_bin)Úexec_driver_sqlÚidentifier_preparerÚquoteÚscalarÚserver_version_infor	   ÚcollateÚcastÚliteral_columnr   r   Ú_check_unicode_returns)r    Ú
connectionÚ	collationÚhas_utf8mb4_binÚadditional_testsr"   r   r   r\   °   s*   

þÿÿúþûÿ
z+MySQLDialect_mysqldb._check_unicode_returnsc           
      C   sT  |d u rt dddd�}|jdi |¤Ž}| |j¡ t |dt¡ t |dt¡ t |dt¡ t |dt¡ t |d	t¡ t |d
t¡ t |dt¡ t |dt¡ i }dtfdtfdtfdtfdtfdtfg}|D ] \}}||v r‰|| ||dd … < t ||dd … |¡ ||= qi|r�||d< | 	d	d¡}|  
¡ }	|	d ur¦||	O }||d	< g |gS )NÚdbÚuserÚpasswd)ÚdatabaseÚusernameÚpasswordÚcompressÚconnect_timeoutÚread_timeoutÚwrite_timeoutÚclient_flagÚlocal_infileÚuse_unicoderR   Ú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)
r    ÚurlÚ_translate_argsÚoptsru   ÚkeysÚkeyÚkw_typerk   Úclient_flag_found_rowsr   r   r   Úcreate_connect_argsË   sH   ÿú€z(MySQLDialect_mysqldb.create_connect_argsc              	   C   sD   | j d ur zt| j jd ƒjj}W |jS  ttfy   Y d S w d S )Nz.constants.CLIENT)r   r0   r   Ú	constantsÚCLIENTr5   r4   Ú
FOUND_ROWS)r    ÚCLIENT_FLAGSr   r   r   r~   þ   s   

ÿþýÿz,MySQLDialect_mysqldb._found_rows_client_flagc                 C   s
   |j d S )Nr   )Úargs)r    Ú	exceptionr   r   r   Ú_extract_error_code  s   
z(MySQLDialect_mysqldb._extract_error_codec                 C   s0   z|j j}W |ƒ S  ty   t d¡ Y dS 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)r]   r:   r5   r
   Úwarn)r    r]   Ú	cset_namer   r   r   Ú_detect_charset  s   

÷ÿùz$MySQLDialect_mysqldb._detect_charsetc                 C   s   dS )N)ÚSERIALIZABLEzREAD UNCOMMITTEDzREAD COMMITTEDzREPEATABLE READÚ
AUTOCOMMITr   rD   r   r   r   Úget_isolation_level_values   s   z/MySQLDialect_mysqldb.get_isolation_level_valuesc                    s2   |dkr|  d¡ d S |  d¡ tƒ  ||¡ d S )Nr“   TF)Ú
autocommitr   Úset_isolation_level)r    rE   Úlevelr"   r   r   r–   )  s   
z(MySQLDialect_mysqldb.set_isolation_levelr$   )#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   Úpreparerr   r   r
   ÚlanghelpersÚmemoized_propertyr6   Úclassmethodr9   rB   rF   rM   r\   r†   r~   r�   r‘   r”   r–   Ú__classcell__r   r   r"   r   r   m   s6    



3	r   )Ú__doc__r*   Úbaser   r   r   r   r   Ú r	   r
   r   r   r   Údialectr   r   r   r   Ú<module>   s   	P E