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	 d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+mariadbconnector
    :name: MariaDB Connector/Python
    :dbapi: mariadb
    :connectstring: mariadb+mariadbconnector://<user>:<password>@<host>[:<port>]/<dbname>
    :url: https://pypi.org/project/mariadb/

Driver Status
-------------

MariaDB Connector/Python enables Python programs to access MariaDB and MySQL
databases using an API which is compliant with the Python DB API 2.0 (PEP-249).
It is written in C and uses MariaDB Connector/C client library for client server
communication.

Note that the default driver for a ``mariadb://`` connection URI continues to
be ``mysqldb``. ``mariadb+mariadbconnector://`` is required to use this driver.

.. mariadb: https://github.com/mariadb-corporation/mariadb-connector-python

    N   )MySQLCompiler)MySQLDialect)MySQLExecutionContext)MySQLIdentifierPreparer   )sql)utilc               @   s   e Zd Zdd Zdd ZdS )&MySQLExecutionContext_mariadbconnectorc             C   s   | j jddS )NF)buffered)_dbapi_connectioncursor)self r   P/tmp/pip-build-6_cqtusv/SQLAlchemy/sqlalchemy/dialects/mysql/mariadbconnector.pycreate_server_side_cursor+   s    z@MySQLExecutionContext_mariadbconnector.create_server_side_cursorc             C   s   | j jddS )NT)r   )r   r   )r   r   r   r   create_default_cursor.   s    z<MySQLExecutionContext_mariadbconnector.create_default_cursorN)__name__
__module____qualname__r   r   r   r   r   r   r
   *   s   r
   c               @   s   e Zd ZdS )MySQLCompiler_mariadbconnectorN)r   r   r   r   r   r   r   r   2   s   r   c               @   s   e Zd ZdS )(MySQLIdentifierPreparer_mariadbconnectorN)r   r   r   r   r   r   r   r   6   s   r   c                   s   e Zd ZdZdZdZdZdZdZdZ	dZ
dZeZeZeZdZejdd Z fddZe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dd Z dd Z!d#dd Z"d$d!d"Z#  Z$S )%MySQLDialect_mariadbconnectorZmariadbconnectorTutf8mb4qmarkc             C   s8   | j r0t| j dr0tdd tjd| j jD S dS d S )N__version__c             S   s   g | ]}t |qS r   )int).0xr   r   r   
<listcomp>Z   s   z@MySQLDialect_mariadbconnector._dbapi_version.<locals>.<listcomp>z(\d+)(?:[-\.]?|$)c   )r    r    r    )dbapihasattrtuplerefindallr   )r   r   r   r   _dbapi_versionU   s    z,MySQLDialect_mariadbconnector._dbapi_versionc                sL   t t| jf | d| _| jd k	rH| jtk rHtddjdd tD  d S )Nr   z?The minimum required version for MariaDB Connector/Python is %s.c             s   s   | ]}t |V  qd S )N)str)r   r   r   r   r   	<genexpr>k   s    z9MySQLDialect_mariadbconnector.__init__.<locals>.<genexpr>)	superr   __init__Z
paramstyler!   r&   mariadb_cpy_minimum_versionNotImplementedErrorjoin)r   kwargs)	__class__r   r   r+   c   s    

z&MySQLDialect_mariadbconnector.__init__c             C   s   t dS )NZmariadb)
__import__)clsr   r   r   r!   n   s    z#MySQLDialect_mariadbconnector.dbapic                sJ   t t| j|||rdS t|| jjrBt|j }d|kp@d|kS dS d S )NTznot connectedzisn't validF)r*   r   is_disconnect
isinstancer!   Errorr(   lower)r   e
connectionr   Zstr_e)r0   r   r   r3   r   s    

z+MySQLDialect_mariadbconnector.is_disconnectc             C   s   |j  }ddddddg}ddd	d
g}x|D ]}tj||t q*W x|D ]}tj||t qFW |jdd}| jd k	ry"t| jjd j	j
}||jO }W n ttfk
r   d| _Y nX ||d< g |gS )Nconnect_timeoutread_timeoutZwrite_timeoutclient_flagportZ	pool_sizeZlocal_infileZssl_verify_certsslZpool_reset_connectionr   z.constants.CLIENTF)Ztranslate_connect_argsr	   Zcoerce_kw_typer   boolgetr!   r1   r   	constantsZCLIENTZ
FOUND_ROWSAttributeErrorImportErrorsupports_sane_rowcount)r   urloptsZ
int_paramsZbool_paramskeyr;   ZCLIENT_FLAGSr   r   r   create_connect_args}   s2    


z1MySQLDialect_mariadbconnector.create_connect_argsc          	   C   s    y
|j }W n   d}Y nX |S )Nr   )errno)r   	exceptionrcr   r   r   _extract_error_code   s
    

z1MySQLDialect_mariadbconnector._extract_error_codec             C   s   dS )Nr   r   )r   r8   r   r   r   _detect_charset   s    z-MySQLDialect_mariadbconnector._detect_charsetZSERIALIZABLEzREAD UNCOMMITTEDzREAD COMMITTEDzREPEATABLE READ
AUTOCOMMITc                s,   |dkrd|_ nd|_ tt| j|| d S )NrN   TF)Z
autocommitr*   r   _set_isolation_level)r   r8   level)r0   r   r   rO      s
    
z2MySQLDialect_mariadbconnector._set_isolation_levelc             C   s&   |j tjdjtjd|dd d S )NzXA BEGIN :xidxidT)literal_execute)executer   text
bindparams	bindparam)r   r8   rQ   r   r   r   do_begin_twophase   s    
z/MySQLDialect_mariadbconnector.do_begin_twophasec             C   sH   |j tjdjtjd|dd |j tjdjtjd|dd d S )NzXA END :xidrQ   T)rR   zXA PREPARE :xid)rS   r   rT   rU   rV   )r   r8   rQ   r   r   r   do_prepare_twophase   s    

z1MySQLDialect_mariadbconnector.do_prepare_twophaseFc             C   sL   |s&|j tjdjtjd|dd |j tjdjtjd|dd d S )NzXA END :xidrQ   T)rR   zXA ROLLBACK :xid)rS   r   rT   rU   rV   )r   r8   rQ   is_preparedrecoverr   r   r   do_rollback_twophase   s    

z2MySQLDialect_mariadbconnector.do_rollback_twophasec             C   s6   |s| j || |jtjdjtjd|dd d S )NzXA COMMIT :xidrQ   T)rR   )rX   rS   r   rT   rU   rV   )r   r8   rQ   rY   rZ   r   r   r   do_commit_twophase   s
    
z0MySQLDialect_mariadbconnector.do_commit_twophase)TF)TF)%r   r   r   ZdriverZsupports_statement_cacheZsupports_unicode_statementsencodingZconvert_unicoderC   Zsupports_sane_multi_rowcountZsupports_native_decimalZdefault_paramstyler
   Zexecution_ctx_clsr   Zstatement_compilerr   ZpreparerZsupports_server_side_cursorsr	   Zmemoized_propertyr&   r+   classmethodr!   r3   rG   rL   rM   setZ_isolation_lookuprO   rW   rX   r[   r\   __classcell__r   r   )r0   r   r   :   s>   %	
r   )r   r   r   )__doc__r$   baser   r   r   r    r   r	   r,   r
   r   r   r   dialectr   r   r   r   <module>   s    4