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 G dd deZG dd deZG dd deeZeZdS )a  

.. dialect:: mysql+zxjdbc
    :name: zxjdbc for Jython
    :dbapi: zxjdbc
    :connectstring: mysql+zxjdbc://<user>:<password>@<hostname>[:<port>]/<database>
    :driverurl: http://dev.mysql.com/downloads/connector/j/

    .. note:: Jython is not supported by current versions of SQLAlchemy.  The
       zxjdbc dialect should be considered as experimental.

Character Sets
--------------

SQLAlchemy zxjdbc dialects pass unicode straight through to the
zxjdbc/JDBC layer. To allow multiple character sets to be sent from the
MySQL Connector/J JDBC driver, by default SQLAlchemy sets its
``characterEncoding`` connection property to ``UTF-8``. It may be
overridden via a ``create_engine`` URL parameter.

    N   )BIT)MySQLDialect)MySQLExecutionContext   )types)util)ZxJDBCConnectorc               @   s   e Zd Zdd ZdS )
_ZxJDBCBitc             C   s   dd }|S )z@Converts boolean or byte arrays from MySQL Connector/J to longs.c             S   sH   | d kr| S t | trt| S d}x| D ]}|d> |d@ B }q(W |} | S )Nr         )
isinstanceboolint)valuevi r   ?lib/python3.7/site-packages/sqlalchemy/dialects/mysql/zxjdbc.pyprocess+   s    

z,_ZxJDBCBit.result_processor.<locals>.processr   )selfdialectZcoltyper   r   r   r   result_processor(   s    z_ZxJDBCBit.result_processorN)__name__
__module____qualname__r   r   r   r   r   r
   '   s   r
   c               @   s   e Zd Zdd ZdS )MySQLExecutionContext_zxjdbcc             C   s*   |   }|d | d }|  |S )NzSELECT LAST_INSERT_ID()r   )Zcreate_cursorexecuteZfetchoneclose)r   ZcursorZ	lastrowidr   r   r   get_lastrowid:   s
    
z*MySQLExecutionContext_zxjdbc.get_lastrowidN)r   r   r   r   r   r   r   r   r   9   s   r   c               @   sR   e Zd ZdZdZeZee	j
ejejeeiZ
dd Zdd Zdd Zd	d
 ZdS )MySQLDialect_zxjdbcZmysqlzcom.mysql.jdbc.Driverc             C   sN   | d}dd | |D }x dD ]}||dr$|| S q$W td dS )z:Sniff out the character set in use for connection results.z%SHOW VARIABLES LIKE 'character_set%%'c             S   s   i | ]}|d  |d qS )r   r   r   ).0rowr   r   r   
<dictcomp>U   s    z7MySQLDialect_zxjdbc._detect_charset.<locals>.<dictcomp>)Zcharacter_set_connectionZcharacter_setNz@Could not detect the connection character set.  Assuming latin1.latin1)r   Z_compat_fetchallgetr   warn)r   
connectionZrsZoptskeyr   r   r   _detect_charsetL   s    

z#MySQLDialect_zxjdbc._detect_charsetc             C   s   t dddS )z+return kw arg dict to be sent to connect().zUTF-8Zfalse)ZcharacterEncodingZyearIsDateType)dict)r   r   r   r   _driver_kwargs`   s    z"MySQLDialect_zxjdbc._driver_kwargsc             C   s0   t dt|j}|d}|r,t|S d S )Nz\[SQLCode\: (\d+)\]r   )recompilesearchstrargsgroupr   )r   Z	exceptionmcr   r   r   _extract_error_coded   s    
z'MySQLDialect_zxjdbc._extract_error_codec          	   C   sd   |j }g }td}xF||jD ]6}y|t| W q" tk
rV   || Y q"X q"W t|S )Nz[.\-])	r'   r,   r-   splitZ	dbversionappendr   
ValueErrortuple)r   r'   Z	dbapi_conversionrnr   r   r   _get_server_version_infol   s    
z,MySQLDialect_zxjdbc._get_server_version_infoN)r   r   r   Zjdbc_db_nameZjdbc_driver_namer   Zexecution_ctx_clsr   Zupdate_copyr   ZcolspecssqltypesZTimer   r
   r)   r+   r4   r<   r   r   r   r   r    B   s   r    )__doc__r,   baser   r   r    r   r=   r   Zconnectors.zxJDBCr	   r
   r   r    r   r   r   r   r   <module>   s   	6