B
    þ¦†\  ã               @   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   ú@lib/python3.7/site-packages/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_mysqldbN)r   r   r   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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   r   r   )ÚreÚmatchÚtupleÚgroup)r   ÚversionÚmr   r   r   r    d   s    z)MySQLDialect_mysqldb._parse_dbapi_versionc          	   C   s4   yt dƒj}|j| _dS  ttfk
r.   dS X d S )NzMySQLdb.cursorsTF)Ú
__import__ÚcursorsZSSCursorZ	_sscursorÚImportErrorÚAttributeError)r   r/   r   r   r   Úsupports_server_side_cursorsk   s    
z1MySQLDialect_mysqldb.supports_server_side_cursorsc             C   s   t dƒS )NZMySQLdb)r.   )Úclsr   r   r   r   t   s    zMySQLDialect_mysqldb.dbapic          
   C   sR   y|  d¡ W n: | jjk
rH } z|  ||d ¡r6dS ‚ W d d }~X Y nX dS d S )NFT)Zpingr   ÚErrorZis_disconnect)r   Zdbapi_connectionÚerrr   r   r   Údo_pingx   s    zMySQLDialect_mysqldb.do_pingNc             C   s   |  ||¡}|d k	r||_d S )N)Zexecutemanyr   )r   r   Z	statementZ
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'ZCharsetZ	Collationz'test collated returns'Zutf8mb4)ÚcharsetZutf8mb4_bin)Zserver_version_infoZscalarZidentifier_preparerZquoter	   ZcollateÚcastZliteral_columnr   r   r   Ú_check_unicode_returns)r   Ú
connectionZhas_utf8mb4_binZadditional_tests)r"   r   r   r<   ˆ   s    



z+MySQLDialect_mysqldb._check_unicode_returnsc          	   C   s\  |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}xD|D ]<}||kr¤|| ||dd … < t ||dd … t¡ ||= q¤W |rð||d< | d	d¡}| j	d k	rTy"t
| j	jd ƒjj}||jO }W n  ttfk
rJ   d| _Y nX ||d	< g |gS )NZdbÚuserZpasswd)ZdatabaseZusernameZpasswordÚcompressZconnect_timeoutZread_timeoutZwrite_timeoutÚclient_flagZlocal_infileZuse_unicoder:   Zssl_caZssl_keyZssl_certZ
ssl_capathZ
ssl_cipheré   Ússlr   z.constants.CLIENTF)Ztranslate_connect_argsÚupdateZqueryr
   Zcoerce_kw_typeÚboolr#   ÚstrÚgetr   r.   r   Z	constantsZCLIENTZ
FOUND_ROWSr1   r0   Úsupports_sane_rowcount)r   ZurlZoptsrB   ÚkeysÚkeyr@   ZCLIENT_FLAGSr   r   r   Úcreate_connect_args¦   s<    

z(MySQLDialect_mysqldb.create_connect_argsc             C   s
   |j d S )Nr   )Úargs)r   Z	exceptionr   r   r   Ú_extract_error_codeÓ   s    z(MySQLDialect_mysqldb._extract_error_codec             C   s6   y|j j}W n tk
r*   t d¡ 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)r=   Zcharacter_set_namer1   r
   Úwarn)r   r=   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 )NrP   TF)Z
autocommitr   r   Ú_set_isolation_level)r   r=   Úlevel)r"   r   r   rQ   ò   s
    

z)MySQLDialect_mysqldb._set_isolation_level)F)N)!r   r   r   ZdriverZsupports_unicode_statementsrG   Zsupports_sane_multi_rowcountZsupports_native_decimalZdefault_paramstyler   Zexecution_ctx_clsr   Zstatement_compilerr   Zpreparerr   r    r
   ZlanghelpersZmemoized_propertyr2   Úclassmethodr   r6   r8   r<   rJ   rL   rO   ÚsetZ_isolation_lookuprQ   Ú__classcell__r   r   )r"   r   r   N   s4   		
-r   )Ú__doc__r(   Úbaser   r   r   r   r   Ú r	   r
   r   r   r   r   Zdialectr   r   r   r   Ú<module>0   s   	 /