U
    h(                     @  s  d Z ddlm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 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 e	r>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 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jej' 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

    )annotationsN)Any)Optional)Sequence)Tuple)TYPE_CHECKING)Union)UUID   )MySQLCompiler)MySQLDialect)MySQLExecutionContext   )sql)util)sqltypes)
Connection)ConnectArgsType)DBAPIConnection)DBAPICursor)DBAPIModule)Dialect)IsolationLevel)PoolProxiedConnection)URL)SQLCompiler)_ResultProcessorType)r
   r   r
   c                   @  s   e Zd ZddddddZdS )_MariaDBUUIDr   objectz#Optional[_ResultProcessorType[Any]])dialectcoltypereturnc                 C  s2   | j rddddd}|S ddddd}|S d S )Nr   )valuer!   c                 S  s(   | d k	r$t | dr| d} t| } | S Ndecodeascii)hasattrr$   _python_UUIDr"    r)   N/tmp/pip-unpacked-wheel-y9ln43lq/sqlalchemy/dialects/mysql/mariadbconnector.pyprocessJ   s
    

z._MariaDBUUID.result_processor.<locals>.processc                 S  s,   | d k	r(t | dr| d} tt| } | S r#   )r&   r$   strr'   r(   r)   r)   r*   r+   T   s
    

)Zas_uuid)selfr   r    r+   r)   r)   r*   result_processorE   s
    z_MariaDBUUID.result_processorN)__name__
__module____qualname__r.   r)   r)   r)   r*   r   A   s   r   c                      sZ   e Zd ZU dZded< ddddZdddd	Zd
d fddZddddZ  Z	S )&MySQLExecutionContext_mariadbconnectorNzOptional[int]
_lastrowidr   r!   c                 C  s   | j jddS )NFZbufferedZ_dbapi_connectioncursorr-   r)   r)   r*   create_server_side_cursora   s    z@MySQLExecutionContext_mariadbconnector.create_server_side_cursorc                 C  s   | j jddS )NTr5   r6   r8   r)   r)   r*   create_default_cursord   s    z<MySQLExecutionContext_mariadbconnector.create_default_cursorNonec                   sD   t    | jj| _tr(t| jts(t	| j
r@| jjr@| jj| _d S N)super	post_execr7   ZrowcountZ	_rowcountr   
isinstanceZcompiledr   AssertionErrorZisinsertZpostfetch_lastrowidZ	lastrowidr3   r8   	__class__r)   r*   r>   g   s    

z0MySQLExecutionContext_mariadbconnector.post_execintc                 C  s   t r| jd k	st| jS r<   )r   r3   r@   r8   r)   r)   r*   get_lastrowidq   s    z4MySQLExecutionContext_mariadbconnector.get_lastrowid)
r/   r0   r1   r3   __annotations__r9   r:   r>   rD   __classcell__r)   r)   rA   r*   r2   ^   s
   

r2   c                   @  s   e Zd ZdS )MySQLCompiler_mariadbconnectorN)r/   r0   r1   r)   r)   r)   r*   rG   w   s   rG   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dZeejejeiZejddddZd	d
d fddZeddddZddddd fddZdddddZddddd Zd!d"d#d$d%Z d&d'd(d)d*Z!d&dd(d+d,Z"d&d-d
d. fd/d0Z#d!d	d
d1d2d3Z$d!d	d
d1d4d5Z%d<d!d	ddd
d7d8d9Z&d=d!d	ddd
d7d:d;Z'  Z(S )>MySQLDialect_mariadbconnectorZmariadbconnectorTutf8mb4qmarkzTuple[int, ...]r4   c                 C  s8   | j r0t| j dr0tdd td| j jD S dS d S )N__version__c                 S  s   g | ]}t |qS r)   )rC   .0xr)   r)   r*   
<listcomp>   s   z@MySQLDialect_mariadbconnector._dbapi_version.<locals>.<listcomp>z(\d+)(?:[-\.]?|$))c   rP   rP   )dbapir&   tuplerefindallrK   r8   r)   r)   r*   _dbapi_version   s     	z,MySQLDialect_mariadbconnector._dbapi_versionr   r;   )kwargsr!   c                   sH   t  jf | d| _| jd k	rD| jtk rDtdddd tD  d S )NrJ   z?The minimum required version for MariaDB Connector/Python is %s.c                 s  s   | ]}t |V  qd S r<   )r,   rL   r)   r)   r*   	<genexpr>   s     z9MySQLDialect_mariadbconnector.__init__.<locals>.<genexpr>)r=   __init__Z
paramstylerQ   rU   mariadb_cpy_minimum_versionNotImplementedErrorjoin)r-   rV   rA   r)   r*   rY      s    

z&MySQLDialect_mariadbconnector.__init__r   c                 C  s   t dS )NZmariadb)
__import__)clsr)   r)   r*   import_dbapi   s    z*MySQLDialect_mariadbconnector.import_dbapizDBAPIModule.Errorz7Optional[Union[PoolProxiedConnection, DBAPIConnection]]zOptional[DBAPICursor]bool)e
connectionr7   r!   c                   sF   t  |||rdS t|| jjr>t| }d|kp<d|kS dS d S )NTznot connectedzisn't validF)r=   is_disconnectr?   Zloaded_dbapiErrorr,   lower)r-   ra   rb   r7   Zstr_erA   r)   r*   rc      s    z+MySQLDialect_mariadbconnector.is_disconnectr   r   )urlr!   c              	   C  s   |  }||j ddddddg}ddd	d
dg}|D ]}t||t q6|D ]}t||t qN|dd}| jd k	rz"t	| jj
d jj}||jO }W n ttfk
r   d| _Y nX ||d< g |fS )Nconnect_timeoutread_timeoutZwrite_timeoutclient_flagportZ	pool_sizeZlocal_infileZssl_verify_certsslZpool_reset_connectioncompressr   z.constants.CLIENTF)Ztranslate_connect_argsupdatequeryr   Zcoerce_kw_typerC   r`   getrQ   r]   r/   	constantsZCLIENTZ
FOUND_ROWSAttributeErrorImportErrorsupports_sane_rowcount)r-   rf   optsZ
int_paramsZbool_paramskeyri   ZCLIENT_FLAGSr)   r)   r*   create_connect_args   s<    	

z1MySQLDialect_mariadbconnector.create_connect_argsrC   )	exceptionr!   c                 C  s    z
|j }W n   d}Y nX |S )N)errno)r-   rw   rcr)   r)   r*   _extract_error_code   s
    

z1MySQLDialect_mariadbconnector._extract_error_coder   r,   )rb   r!   c                 C  s   dS )NrI   r)   )r-   rb   r)   r)   r*   _detect_charset   s    z-MySQLDialect_mariadbconnector._detect_charsetr   zSequence[IsolationLevel])
dbapi_connr!   c                 C  s   dS )N)ZSERIALIZABLEzREAD UNCOMMITTEDzREAD COMMITTEDzREPEATABLE READ
AUTOCOMMITr)   r-   r}   r)   r)   r*   get_isolation_level_values   s    z8MySQLDialect_mariadbconnector.get_isolation_level_valuesc                 C  s
   t |jS r<   )r`   
autocommitr   r)   r)   r*   detect_autocommit_setting   s    z7MySQLDialect_mariadbconnector.detect_autocommit_settingr   )dbapi_connectionlevelr!   c                   s(   |dkrd|_ nd|_ t || d S )Nr~   TF)r   r=   set_isolation_level)r-   r   r   rA   r)   r*   r     s    z1MySQLDialect_mariadbconnector.set_isolation_level)rb   xidr!   c              	   C  s&   | tdtjd|dd d S )NzXA BEGIN :xidr   TZliteral_executeexecuter   text
bindparams	bindparamr-   rb   r   r)   r)   r*   do_begin_twophase  s
    
z/MySQLDialect_mariadbconnector.do_begin_twophasec              	   C  sH   | tdtjd|dd | tdtjd|dd d S )NXA END :xidr   Tr   zXA PREPARE :xidr   r   r)   r)   r*   do_prepare_twophase  s    

z1MySQLDialect_mariadbconnector.do_prepare_twophaseF)rb   r   is_preparedrecoverr!   c              	   C  sL   |s&| tdtjd|dd | tdtjd|dd d S )Nr   r   Tr   zXA ROLLBACK :xidr   r-   rb   r   r   r   r)   r)   r*   do_rollback_twophase  s    

z2MySQLDialect_mariadbconnector.do_rollback_twophasec              	   C  s6   |s|  || |tdtjd|dd d S )NzXA COMMIT :xidr   Tr   )r   r   r   r   r   r   r   r)   r)   r*   do_commit_twophase2  s    
z0MySQLDialect_mariadbconnector.do_commit_twophase)TF)TF))r/   r0   r1   ZdriverZsupports_statement_cacheZsupports_unicode_statementsencodingZconvert_unicoders   Zsupports_sane_multi_rowcountZsupports_native_decimalZdefault_paramstyler2   Zexecution_ctx_clsrG   Zstatement_compilerZsupports_server_side_cursorsr   Zupdate_copyr   Zcolspecsr   ZUuidr   Zmemoized_propertyrU   rY   classmethodr_   rc   rv   r{   r|   r   r   r   r   r   r   r   rF   r)   r)   rA   r*   rH   {   sH    '	    rH   )-__doc__
__future__r   rS   typingr   r   r   r   r   r   uuidr	   r'   baser   r   r    r   r   r   Zengine.baser   Zengine.interfacesr   r   r   r   r   r   r   Z
engine.urlr   Zsql.compilerr   Zsql.type_apir   rZ   Z_UUID_RETURNr   r2   rG   rH   r   r)   r)   r)   r*   <module>   sD    H