3
a
                 @   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	 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+mysqlconnector
    :name: MySQL Connector/Python
    :dbapi: myconnpy
    :connectstring: mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>
    :url: https://pypi.org/project/mysql-connector-python/

.. note::

    The MySQL Connector/Python DBAPI has had many issues since its release,
    some of which may remain unresolved, and the mysqlconnector dialect is
    **not tested as part of SQLAlchemy's continuous integration**.
    The recommended MySQL dialects are mysqlclient and PyMySQL.

    N   )BIT)MySQLCompiler)MySQLDialect)MySQLIdentifierPreparer   )
processors)utilc               @   s$   e Zd Zdd Zdd Zdd ZdS )MySQLCompiler_mysqlconnectorc             K   sT   | j jr,| j|jf|d | j|jf| S | j|jf|d | j|jf| S d S )Nz %% z % )dialect_mysqlconnector_double_percentsprocessleftright)selfbinaryoperatorkw r   N/tmp/pip-build-6_cqtusv/SQLAlchemy/sqlalchemy/dialects/mysql/mysqlconnector.pyvisit_mod_binary#   s    $z-MySQLCompiler_mysqlconnector.visit_mod_binaryc             C   s   | j jr|jddS |S d S )N%z%%)r   r   replace)r   textr   r   r   post_process_text1   s    z.MySQLCompiler_mysqlconnector.post_process_textc             C   s   | j jr|jddS |S d S )Nr   z%%)r   r   r   )r   r   r   r   r   escape_literal_column7   s    z2MySQLCompiler_mysqlconnector.escape_literal_columnN)__name__
__module____qualname__r   r   r   r   r   r   r   r
   "   s   r
   c               @   s.   e Zd Zedd Zejdd Zdd ZdS )&MySQLIdentifierPreparer_mysqlconnectorc             C   s   | j jS )N)r   r   )r   r   r   r   _double_percents?   s    z7MySQLIdentifierPreparer_mysqlconnector._double_percentsc             C   s   d S )Nr   )r   valuer   r   r   r    C   s    c             C   s,   |j | j| j}| jjr$|j ddS |S d S )Nr   z%%)r   Zescape_quoteZescape_to_quoter   r   )r   r!   r   r   r   _escape_identifierG   s    z9MySQLIdentifierPreparer_mysqlconnector._escape_identifierN)r   r   r   propertyr    setterr"   r   r   r   r   r   >   s   r   c               @   s   e Zd Zdd ZdS )_myconnpyBITc             C   s   dS )z0MySQL-connector already converts mysql bits, so.Nr   )r   r   Zcoltyper   r   r   result_processorP   s    z_myconnpyBIT.result_processorN)r   r   r   r&   r   r   r   r   r%   O   s   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jejeeiZ fddZdd Zedd	 Zejd
d Zedd Zdd Zdd Zejdd Zejdd Zdd Z dd Z!dd Z"d(ddZ#d)dd Z$e%d!d"d#d$d%gZ& fd&d'Z'  Z(S )*MySQLDialect_mysqlconnectorZmysqlconnectorTformatc                s$   t t| j|| tj| j| _d S )N)superr'   __init__r   Z(to_conditional_unicode_processor_factorydescription_encodingZ_description_decoder)r   argr   )	__class__r   r   r*   h   s    z$MySQLDialect_mysqlconnector.__init__c             C   s   dS )NFr   )r   
connectionr   r   r   _check_unicode_descriptionq   s    z6MySQLDialect_mysqlconnector._check_unicode_descriptionc             C   s   dS )Nzlatin-1r   )r   r   r   r   r+   v   s    z0MySQLDialect_mysqlconnector.description_encodingc             C   s   t jp| jdkS )N   r   )r0   r   )r	   py3k_mysqlconnector_version_info)r   r   r   r   supports_unicode_statements{   s    z7MySQLDialect_mysqlconnector.supports_unicode_statementsc             C   s   ddl m} |S )Nr   )	connector)Zmysqlr4   )clsr4   r   r   r   dbapi   s    z!MySQLDialect_mysqlconnector.dbapic             C   sR   y|j d W n: | jjk
rH } z| j||d r6dS  W Y d d }~X nX dS d S )NFT)Zpingr6   Erroris_disconnect)r   Zdbapi_connectionerrr   r   r   do_ping   s    z#MySQLDialect_mysqlconnector.do_pingc             C   sb  |j dd}|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 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 |jdd | jd k	rZy2ddl	m
} |jd|j }||jO }||d< W n tk
rX   Y nX g |gS )Nuser)usernameZallow_local_infile
autocommitZbufferedcompressZconnection_timeoutconnect_timeoutZconsume_resultsZ
force_ipv6Zget_warningsZpool_reset_sessionZ	pool_sizeZraise_on_warningsrawZssl_verify_certZuse_pureZuse_unicodeTr   )
ClientFlagclient_flags)Ztranslate_connect_argsupdatequeryr	   Zcoerce_kw_typeboolint
setdefaultr6   Zmysql.connector.constantsrA   getget_defaultZ
FOUND_ROWS	Exception)r   urloptsrA   rB   r   r   r   create_connect_args   s:    
z/MySQLDialect_mysqlconnector.create_connect_argsc             C   sF   | j rBt| j drBtjd| j j}|rBtdd |jdddD S d S )N__version__z(\d+)\.(\d+)(?:\.(\d+))?c             s   s   | ]}|d k	rt |V  qd S )N)rF   ).0xr   r   r   	<genexpr>   s    zKMySQLDialect_mysqlconnector._mysqlconnector_version_info.<locals>.<genexpr>r   r0   r   )r6   hasattrrematchrN   tuplegroup)r   mr   r   r   r2      s    z8MySQLDialect_mysqlconnector._mysqlconnector_version_infoc             C   s   t j o| jdk S )Nr0   r   )r0   r   )r	   r1   r2   )r   r   r   r   r      s    z;MySQLDialect_mysqlconnector._mysqlconnector_double_percentsc             C   s   |j jS )N)r.   charset)r   r.   r   r   r   _detect_charset   s    z+MySQLDialect_mysqlconnector._detect_charsetc             C   s   |j S )N)errno)r   	exceptionr   r   r   _extract_error_code   s    z/MySQLDialect_mysqlconnector._extract_error_codec             C   sH   d
}| j j| j jf}t||r@|j|kp>dt|kp>dt|kS d	S d S )N             zMySQL Connection not available.z$Connection to MySQL is not availableF)r]   r^   r_   r`   ra   rb   )r6   ZOperationalErrorZInterfaceError
isinstancerZ   str)r   er.   cursorZerrnos
exceptionsr   r   r   r8      s    

z)MySQLDialect_mysqlconnector.is_disconnectNc             C   s   |j  S )N)Zfetchall)r   rprX   r   r   r   _compat_fetchall   s    z,MySQLDialect_mysqlconnector._compat_fetchallc             C   s   |j  S )N)Zfetchone)r   rh   rX   r   r   r   _compat_fetchone   s    z,MySQLDialect_mysqlconnector._compat_fetchoneZSERIALIZABLEzREAD UNCOMMITTEDzREAD COMMITTEDzREPEATABLE READ
AUTOCOMMITc                s,   |dkrd|_ nd|_ tt| j|| d S )Nrk   TF)r=   r)   r'   _set_isolation_level)r   r.   level)r-   r   r   rl      s
    
z0MySQLDialect_mysqlconnector._set_isolation_level)N)N))r   r   r   ZdriverZsupports_statement_cacheZsupports_unicode_bindsZsupports_sane_rowcountZsupports_sane_multi_rowcountZsupports_native_decimalZdefault_paramstyler
   Zstatement_compilerr   Zpreparerr	   Zupdate_copyr   Zcolspecsr   r%   r*   r/   r#   r+   Zmemoized_propertyr3   classmethodr6   r:   rM   r2   r   rY   r\   r8   ri   rj   setZ_isolation_lookuprl   __classcell__r   r   )r-   r   r'   V   s>   	)

r'   )__doc__rS   baser   r   r   r    r   r	   r
   r   r%   r'   r   r   r   r   r   <module>   s    