U
    xž^¿   ã                   @   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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`.

é    Né   )Ú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 d S )NÚ	_rowcount)Úhasattrr   ÚcursorÚrowcount)Úself© r   úI/tmp/pip-install-dq5v43_d/SQLAlchemy/sqlalchemy/dialects/mysql/mysqldb.pyr   >   s    
z&MySQLExecutionContext_mysqldb.rowcountN)Ú__name__Ú
__module__Ú__qualname__Úpropertyr   r   r   r   r   r   =   s   r   c                   @   s   e Zd ZdS )ÚMySQLCompiler_mysqldbN©r   r   r   r   r   r   r   r   F   s   r   c                   @   s   e Zd ZdS )ÚMySQLIdentifierPreparer_mysqldbNr   r   r   r   r   r   J   s   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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„ Zdd„ Zdd„ Zeddddd gƒZ‡ fd!d"„Z ‡  Z!S )%ÚMySQLDialect_mysqldbZmysqldbTÚformatFc                    sF   t t| ƒjf |Ž || _| jd k	r<t| jdƒr<|  | jj¡nd| _d S )NÚ__version__©r   r   r   )	Úsuperr   Ú__init__Úserver_side_cursorsÚdbapir   Ú_parse_dbapi_versionr   Z_mysql_dbapi_version)r   r    Úkwargs©Ú	__class__r   r   r   [   s    ÿ
ÿýzMySQLDialect_mysqldb.__init__c                 C   s4   t  d|¡}|r,tdd„ | ddd¡D ƒƒS dS d S )Nz(\d+)\.(\d+)(?:\.(\d+))?c                 s   s   | ]}|d k	rt |ƒV  qd S ©N)Úint)Ú.0Úxr   r   r   Ú	<genexpr>g   s      z<MySQLDialect_mysqldb._parse_dbapi_version.<locals>.<genexpr>r   é   r   r   )ÚreÚmatchÚtupleÚgroup)r   ÚversionÚmr   r   r   r"   d   s    z)MySQLDialect_mysqldb._parse_dbapi_versionc              	   C   s8   zt dƒj}|j| _W dS  ttfk
r2   Y dS X d S )NzMySQLdb.cursorsTF)Ú
__import__ÚcursorsZSSCursorZ	_sscursorÚImportErrorÚAttributeError)r   r3   r   r   r   Úsupports_server_side_cursorsk   s    
z1MySQLDialect_mysqldb.supports_server_side_cursorsc                 C   s   t dƒS )NZMySQLdb)r2   )Úclsr   r   r   r!   t   s    zMySQLDialect_mysqldb.dbapic                    s   t t| ƒ ¡ ‰ ‡ fdd„}|S )Nc                    sB   ˆ d k	rˆ | ƒ |   ¡ }|d k	r>|  ¡ }| d| ¡ | ¡  d S )NzSET NAMES %s)Úcharacter_set_namer   ÚexecuteÚclose)ÚconnÚcharset_namer   ©Zsuper_r   r   Ú
on_connect{   s    z3MySQLDialect_mysqldb.on_connect.<locals>.on_connect)r   r   r>   )r   r>   r$   r=   r   r>   x   s    zMySQLDialect_mysqldb.on_connectc              
   C   sX   z|  d¡ W n@ | jjk
rN } z|  ||d ¡r<W Y ¢
dS ‚ W 5 d }~X Y nX dS d S )NFT)Zpingr!   ÚErrorZis_disconnect)r   Zdbapi_connectionÚerrr   r   r   Údo_pingˆ   s    
zMySQLDialect_mysqldb.do_pingNc                 C   s   |  ||¡}|d k	r||_d S r&   )Zexecutemanyr   )r   r   Z	statementÚ
parametersÚcontextr   r   r   r   Údo_executemany“   s    z#MySQLDialect_mysqldb.do_executemanyc                    sj   | j dko*| d| j d¡| j d¡f ¡}|rTt t t d¡tdd¡d¡g}ng }t	t
| ƒ ||¡S )	N)é   z:show collation where %s = 'utf8mb4' and %s = 'utf8mb4_bin'ÚCharsetZ	Collationz'test collated returns'Zutf8mb4)ÚcharsetZutf8mb4_bin)Zserver_version_infoZscalarZidentifier_preparerÚquoter	   ZcollateÚcastZliteral_columnr   r   r   Ú_check_unicode_returns)r   Ú
connectionZhas_utf8mb4_binZadditional_testsr$   r   r   rJ   ˜   s.    


þÿÿþ	þûÿ

 ÿz+MySQLDialect_mysqldb._check_unicode_returnsc              	   C   sX  |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 }dddddg}|D ]<}||kr¢|| ||dd … < t ||dd … t¡ ||= q¢|rì||d< | d	d¡}| j	d k	rPz"t
| j	jd ƒjj}||jO }W n  ttfk
rF   d| _Y nX ||d	< g |gS )NÚdbÚuserÚpasswd)ZdatabaseÚusernameÚpasswordÚcompressÚconnect_timeoutÚread_timeoutZwrite_timeoutÚclient_flagZlocal_infileZuse_unicoderG   Zssl_caZssl_keyZssl_certZ
ssl_capathZ
ssl_cipheré   Ússlr   z.constants.CLIENTF)Ztranslate_connect_argsÚupdateÚqueryr
   Zcoerce_kw_typeÚboolr'   ÚstrÚgetr!   r2   r   Ú	constantsZCLIENTZ
FOUND_ROWSr5   r4   Úsupports_sane_rowcount)r   ÚurlÚoptsrV   ÚkeysÚkeyrT   ZCLIENT_FLAGSr   r   r   Úcreate_connect_args¶   sD      ÿ
ÿz(MySQLDialect_mysqldb.create_connect_argsc                 C   s
   |j d S )Nr   )Úargs)r   Ú	exceptionr   r   r   Ú_extract_error_codeã   s    z(MySQLDialect_mysqldb._extract_error_codec                 C   s8   z|j j}W n  tk
r,   t d¡ Y dS X |ƒ S dS )z:Sniff out the character set in use for connection results.zNo 'character_set_name' can be detected with this MySQL-Python version; please upgrade to a recent version of MySQL-Python.  Assuming latin1.Úlatin1N)rK   r8   r5   r
   Úwarn)r   rK   Z	cset_namer   r   r   Ú_detect_charsetæ   s    ÿz$MySQLDialect_mysqldb._detect_charsetZSERIALIZABLEzREAD UNCOMMITTEDzREAD COMMITTEDzREPEATABLE READÚ
AUTOCOMMITc                    s4   |dkr|  d¡ n|  d¡ tt| ƒ ||¡ d S )Nri   TF)Z
autocommitr   r   Ú_set_isolation_level)r   rK   Úlevelr$   r   r   rj     s    

 ÿz)MySQLDialect_mysqldb._set_isolation_level)F)N)"r   r   r   ZdriverZsupports_unicode_statementsr]   Zsupports_sane_multi_rowcountZsupports_native_decimalZdefault_paramstyler   Zexecution_ctx_clsr   Zstatement_compilerr   Úpreparerr   r"   r
   ZlanghelpersZmemoized_propertyr6   Úclassmethodr!   r>   rA   rD   rJ   rb   re   rh   ÚsetZ_isolation_lookuprj   Ú__classcell__r   r   r$   r   r   N   s>   	


-ûÿ
r   )Ú__doc__r,   Úbaser   r   r   r   r   Ú r	   r
   r   r   r   r   Údialectr   r   r   r   Ú<module>   s   *	 ?