U
    x^                     @   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   sD   | d kr| S t | trt| S d}| D ]}|d> |d@ B }q&|} | S )Nr         )
isinstanceboolint)valuevi r   H/tmp/pip-install-dq5v43_d/SQLAlchemy/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   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 }dD ]}||dr"||   S q"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   
connectionrs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-8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   	exceptionmcr   r   r   _extract_error_coded   s    
z'MySQLDialect_zxjdbc._extract_error_codec              	   C   s`   |j }g }td}||jD ]6}z|t| W q  tk
rT   || Y q X q t|S )Nz[.\-])	r(   r0   r1   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/   r9   rA   r   r   r   r   r!   B   s    r!   )__doc__r0   baser   r   r    r   rB   r   Zconnectors.zxJDBCr	   r
   r   r!   r   r   r   r   r   <module>   s   	6