ó
¿b›]c           @   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	 d l m
 Z
 d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ e Z d S(   s  

.. dialect:: mysql+mysqldb
    :name: mysqlclient (maintained fork of MySQL-Python)
    :dbapi: mysqldb
    :connectstring: mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
    :url: https://pypi.org/project/mysqlclient/

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

The mysqlclient DBAPI is a maintained fork of the
`MySQL-Python <http://sourceforge.net/projects/mysql-python>`_ DBAPI
that is no longer maintained.  `mysqlclient`_ supports Python 2 and Python 3
and is very stable.

.. _mysqlclient: https://github.com/PyMySQL/mysqlclient-python

.. _mysqldb_unicode:

Unicode
-------

Please see :ref:`mysql_unicode` for current recommendations on unicode
handling.


Using MySQLdb with Google Cloud SQL
-----------------------------------

Google Cloud SQL now recommends use of the MySQLdb dialect.  Connect
using a URL like the following::

    mysql+mysqldb://root@/<dbname>?unix_socket=/cloudsql/<projectid>:<instancename>

Server Side Cursors
-------------------

The mysqldb dialect supports server-side cursors. See :ref:`mysql_ss_cursors`.

iÿÿÿÿNi   (   t   MySQLCompiler(   t   MySQLDialect(   t   MySQLExecutionContext(   t   MySQLIdentifierPreparer(   t   TEXTi   (   t   sql(   t   utilt   MySQLExecutionContext_mysqldbc           B   s   e  Z e d  „  ƒ Z RS(   c         C   s$   t  |  d ƒ r |  j S|  j j Sd  S(   Nt	   _rowcount(   t   hasattrR   t   cursort   rowcount(   t   self(    (    s@   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/mysqldb.pyR   >   s    (   t   __name__t
   __module__t   propertyR   (    (    (    s@   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/mysqldb.pyR   =   s   t   MySQLCompiler_mysqldbc           B   s   e  Z RS(    (   R   R   (    (    (    s@   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/mysqldb.pyR   F   s   t   MySQLIdentifierPreparer_mysqldbc           B   s   e  Z RS(    (   R   R   (    (    (    s@   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/mysqldb.pyR   J   s   t   MySQLDialect_mysqldbc           B   sÝ   e  Z d  Z e Z e Z e Z e Z d Z e	 Z
 e Z e Z e d „ Z d „  Z e j j d „  ƒ Z e d „  ƒ Z d „  Z d „  Z d d „ Z d	 „  Z d
 „  Z d „  Z d „  Z e  d d d d d g ƒ Z! d „  Z" RS(   t   mysqldbt   formatc         K   sb   t  t |  ƒ j |   | |  _ |  j d  k	 rU t |  j d ƒ rU |  j |  j j ƒ n d |  _	 d  S(   Nt   __version__i    (   i    i    i    (
   t   superR   t   __init__t   server_side_cursorst   dbapit   NoneR	   t   _parse_dbapi_versionR   t   _mysql_dbapi_version(   R   R   t   kwargs(    (    s@   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/mysqldb.pyR   [   s    	6c         C   sC   t  j d | ƒ } | r; t d „  | j d d d ƒ Dƒ ƒ Sd Sd  S(   Ns   (\d+)\.(\d+)(?:\.(\d+))?c         s   s'   |  ] } | d  k	 r t | ƒ Vq d  S(   N(   R   t   int(   t   .0t   x(    (    s@   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/mysqldb.pys	   <genexpr>g   s    i   i   i   i    (   i    i    i    (   t   ret   matcht   tuplet   group(   R   t   versiont   m(    (    s@   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/mysqldb.pyR   d   s    #c         C   sB   y# t  d ƒ j } | j |  _ t SWn t t f k
 r= t SXd  S(   Ns   MySQLdb.cursors(   t
   __import__t   cursorst   SSCursort	   _sscursort   Truet   ImportErrort   AttributeErrort   False(   R   R(   (    (    s@   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/mysqldb.pyt   supports_server_side_cursorsk   s    c         C   s
   t  d ƒ S(   Nt   MySQLdb(   R'   (   t   cls(    (    s@   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/mysqldb.pyR   t   s    c            s(   t  t |  ƒ j ƒ  ‰  ‡  f d †  } | S(   Nc            s_   ˆ  d  k	 r ˆ  |  ƒ n  |  j ƒ  } | d  k	 r[ |  j ƒ  } | j d | ƒ | j ƒ  n  d  S(   Ns   SET NAMES %s(   R   t   character_set_nameR
   t   executet   close(   t   connt   charset_nameR
   (   t   super_(    s@   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/mysqldb.pyt
   on_connect{   s    (   R   R   R8   (   R   R8   (    (   R7   s@   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/mysqldb.pyR8   x   s    c         C   sQ   y | j  t ƒ Wn5 |  j j k
 rH } |  j | | d  ƒ rB t S‚  n Xt Sd  S(   N(   t   pingR.   R   t   Errort   is_disconnectR   R+   (   R   t   dbapi_connectiont   err(    (    s@   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/mysqldb.pyt   do_pingˆ   s    c         C   s.   | j  | | ƒ } | d  k	 r* | | _ n  d  S(   N(   t   executemanyR   R   (   R   R
   t	   statementt
   parameterst   contextR   (    (    s@   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/mysqldb.pyt   do_executemany“   s    c         C   s›   |  j  d	 k o= | j d |  j j d ƒ |  j j d ƒ f ƒ } | r| t j t j t j d ƒ t d d ƒ ƒ d ƒ g } n g  } t	 t
 |  ƒ j | | ƒ S(
   Ni   s:   show collation where %s = 'utf8mb4' and %s = 'utf8mb4_bin't   Charsett	   Collations   'test collated returns't   charsett   utf8mb4t   utf8mb4_bin(   i   (   t   server_version_infot   scalart   identifier_preparert   quoteR   t   collatet   castt   literal_columnR   R   R   t   _check_unicode_returns(   R   t
   connectiont   has_utf8mb4_bint   additional_tests(    (    s@   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/mysqldb.pyRP   ˜   s    	c         C   sÌ  | j  d d d d 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 ƒ i  } d d d d d g } xM | D]E } | | k rè | | | | d <t j | | d t ƒ | | =qè qè W| rD| | d <n  | j d d ƒ } |  j	 d  k	 rÂy- t |  j	 j d ƒ j j } | | j O} Wn  t t f k
 r´t |  _ n X| | d <n  g  | g S(   Nt   databaset   dbt   usernamet   usert   passwordt   passwdt   compresst   connect_timeoutt   read_timeoutt   write_timeoutt   client_flagt   local_infilet   use_unicodeRF   t   ssl_cat   ssl_keyt   ssl_certt
   ssl_capatht
   ssl_cipheri   t   ssli    s   .constants.CLIENT(   t   translate_connect_argst   updatet   queryR   t   coerce_kw_typet   boolR   t   strt   getR   R   R'   R   t	   constantst   CLIENTt
   FOUND_ROWSR-   R,   R.   t   supports_sane_rowcount(   R   t   urlt   optsRf   t   keyst   keyR^   t   CLIENT_FLAGS(    (    s@   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/mysqldb.pyt   create_connect_args¶   s<    	c         C   s   | j  d S(   Ni    (   t   args(   R   t	   exception(    (    s@   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/mysqldb.pyt   _extract_error_codeã   s    c         C   s=   y | j  j } Wn t k
 r1 t j d ƒ d SX| ƒ  Sd S(   s:   Sniff out the character set in use for connection results.s   No 'character_set_name' can be detected with this MySQL-Python version; please upgrade to a recent version of MySQL-Python.  Assuming latin1.t   latin1N(   RQ   R2   R-   R   t   warn(   R   RQ   t	   cset_name(    (    s@   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/mysqldb.pyt   _detect_charsetæ   s    t   SERIALIZABLEs   READ UNCOMMITTEDs   READ COMMITTEDs   REPEATABLE READt
   AUTOCOMMITc         C   sF   | d k r | j  t ƒ n& | j  t ƒ t t |  ƒ j | | ƒ d  S(   NR€   (   t
   autocommitR+   R.   R   R   t   _set_isolation_level(   R   RQ   t   level(    (    s@   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/mysqldb.pyR‚     s
    N(#   R   R   t   driverR+   t   supports_unicode_statementsRq   t   supports_sane_multi_rowcountt   supports_native_decimalt   default_paramstyleR   t   execution_ctx_clsR   t   statement_compilerR   t   preparerR.   R   R   R   t   langhelperst   memoized_propertyR/   t   classmethodR   R8   R>   R   RC   RP   Rw   Rz   R~   t   sett   _isolation_lookupR‚   (    (    (    s@   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/mysqldb.pyR   N   s6   							-		(   t   __doc__R!   t   baseR    R   R   R   R   t    R   R   R   R   R   R   t   dialect(    (    (    s@   lib/python2.7/site-packages/sqlalchemy/dialects/mysql/mysqldb.pyt   <module>0   s   	¾