o
    y¬´\  ã                   @   s    d 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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 <http://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.


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

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

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

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

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

é   )ÚMySQLCompiler)ÚMySQLDialect)ÚMySQLExecutionContext)ÚMySQLIdentifierPreparer)ÚTEXTé   )Úsql)Úutilc                   @   s   e Zd Zedd„ ƒZdS )ÚMySQLExecutionContext_mysqldbc                 C   s   t | dƒr| jS | jjS )NÚ	_rowcount)Úhasattrr   ÚcursorÚrowcount)Úself© r   úS/var/www/html/env/lib/python3.10/site-packages/sqlalchemy/dialects/mysql/mysqldb.pyr   <   s   
z&MySQLExecutionContext_mysqldb.rowcountN)Ú__name__Ú
__module__Ú__qualname__Úpropertyr   r   r   r   r   r
   ;   s    r
   c                   @   ó   e Zd ZdS )ÚMySQLCompiler_mysqldbN©r   r   r   r   r   r   r   r   D   ó    r   c                   @   r   )ÚMySQLIdentifierPreparer_mysqldbNr   r   r   r   r   r   H   r   r   c                       s¤   e Zd ZdZdZdZdZdZdZe	Z
eZeZd‡ fdd„	Zejjdd„ ƒZed	d
„ ƒZddd„Z‡ fdd„Zdd„ Zdd„ Zdd„ Zeg d¢ƒZ‡ fdd„Z‡  ZS )ÚMySQLDialect_mysqldbÚmysqldbTÚformatFc                    s    t t| ƒjdi |¤Ž || _d S )Nr   )Úsuperr   Ú__init__Úserver_side_cursors)r   r    Úkwargs©Ú	__class__r   r   r   Y   s   
zMySQLDialect_mysqldb.__init__c              	   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   r%   r   r   r   Úsupports_server_side_cursors]   s   
ÿz1MySQLDialect_mysqldb.supports_server_side_cursorsc                 C   s   t dƒS )NÚMySQLdb)r$   )Úclsr   r   r   Údbapif   s   zMySQLDialect_mysqldb.dbapiNc                 C   s"   |  ||¡}|d ur||_d S d S ©N)Úexecutemanyr   )r   r   Ú	statementÚ
parametersÚcontextr   r   r   r   Údo_executemanyj   s   
ÿz#MySQLDialect_mysqldb.do_executemanyc                    sj   | j dko| d| j d¡| j d¡f ¡}|r*t t t d¡tdd�¡d¡g}ng }t	t
| ƒ ||¡S )	N)é   z:show collation where %s = 'utf8mb4' and %s = 'utf8mb4_bin'ÚCharsetÚ	Collationz'test collated returns'Úutf8mb4)ÚcharsetÚutf8mb4_bin)Úserver_version_infoÚscalarÚidentifier_preparerÚquoter   ÚcollateÚcastÚliteral_columnr   r   r   Ú_check_unicode_returns)r   Ú
connectionÚhas_utf8mb4_binÚadditional_testsr"   r   r   rA   o   s,   


þÿÿþ	þûÿ

ÿz+MySQLDialect_mysqldb._check_unicode_returnsc              	   C   sL  |j dddd�}| |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 }g d¢}|D ]}||v rl|| ||dd … < t ||dd … t¡ ||= qN|rs||d< | d	d¡}| j	d ur¢zt
| j	jd ƒjj}||jO }W n ttfy�   d| _Y nw ||d	< g |gS )NÚdbÚuserÚpasswd)ÚdatabaseÚusernameÚpasswordÚcompressÚconnect_timeoutÚread_timeoutÚwrite_timeoutÚclient_flagÚlocal_infileÚuse_unicoder8   )Ússl_caÚssl_keyÚssl_certÚ
ssl_capathÚ
ssl_cipheré   Ússlé    z.constants.CLIENTF)Útranslate_connect_argsÚupdateÚqueryr	   Úcoerce_kw_typeÚboolÚintÚstrÚgetr-   r$   r   Ú	constantsÚCLIENTÚ
FOUND_ROWSr)   r(   Úsupports_sane_rowcount)r   ÚurlÚoptsrX   ÚkeysÚkeyrO   ÚCLIENT_FLAGSr   r   r   Úcreate_connect_args�   sH   ÿ€

ÿþ
ÿz(MySQLDialect_mysqldb.create_connect_argsc                 C   s
   |j d S )NrY   )Ú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)rB   Úcharacter_set_namer)   r	   Úwarn)r   rB   Ú	cset_namer   r   r   Ú_detect_charset½   s   

÷ÿùz$MySQLDialect_mysqldb._detect_charset)ÚSERIALIZABLEzREAD UNCOMMITTEDzREAD COMMITTEDzREPEATABLE READÚ
AUTOCOMMITc                    s6   |dkr|  d¡ d S |  d¡ tt| ƒ ||¡ d S )Nru   TF)Ú
autocommitr   r   Ú_set_isolation_level)r   rB   Úlevelr"   r   r   rw   Ù   s   

ÿz)MySQLDialect_mysqldb._set_isolation_level)Fr.   )r   r   r   ÚdriverÚsupports_unicode_statementsre   Úsupports_sane_multi_rowcountÚsupports_native_decimalÚdefault_paramstyler
   Úexecution_ctx_clsr   Ústatement_compilerr   Úpreparerr   r	   ÚlanghelpersÚmemoized_propertyr*   Úclassmethodr-   r3   rA   rk   rn   rs   ÚsetÚ_isolation_lookuprw   Ú__classcell__r   r   r"   r   r   L   s0    


-ÿ
r   N)Ú__doc__Úbaser   r   r   r   r   Ú r   r	   r
   r   r   r   Údialectr   r   r   r   Ú<module>   s   *	 