o
    [h                      @   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
 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+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`.

    N   )MySQLCompiler)MySQLDialect)MySQLExecutionContext)MySQLIdentifierPreparer)TEXT   )sql)utilc                   @   s   e Zd Zedd ZdS )MySQLExecutionContext_mysqldbc                 C   s   t | dr| jS | jjS )N	_rowcount)hasattrr   cursorrowcount)self r   /home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/sqlalchemy/dialects/mysql/mysqldb.pyr   >   s   
z&MySQLExecutionContext_mysqldb.rowcountN)__name__
__module____qualname__propertyr   r   r   r   r   r   =   s    r   c                   @      e Zd ZdS )MySQLCompiler_mysqldbNr   r   r   r   r   r   r   r   F       r   c                   @   r   )MySQLIdentifierPreparer_mysqldbNr   r   r   r   r   r   J   r   r   c                       s   e Zd ZdZdZdZdZdZdZe	Z
eZeZd fdd	Zdd Zejjd	d
 Zedd Z fddZdd Zd ddZ fddZdd Zdd Zdd Zeg dZ fddZ   Z!S )!MySQLDialect_mysqldbZmysqldbTformatFc                    sP   t t| jdi | || _| jd ur#t| jdr#| | jj| _d S d| _d S )N__version__r   r   r   r   )	superr   __init__server_side_cursorsdbapir   _parse_dbapi_versionr   Z_mysql_dbapi_version)r   r"   kwargs	__class__r   r   r!   [   s   zMySQLDialect_mysqldb.__init__c                 C   s0   t d|}|rtdd |dddD S dS )Nz(\d+)\.(\d+)(?:\.(\d+))?c                 s   s     | ]}|d urt |V  qd S N)int).0xr   r   r   	<genexpr>g   s    z<MySQLDialect_mysqldb._parse_dbapi_version.<locals>.<genexpr>r      r   r   )rematchtuplegroup)r   versionmr   r   r   r$   d   s   z)MySQLDialect_mysqldb._parse_dbapi_versionc              	   C   s2   zt dj}|j| _W dS  ttfy   Y dS w )NzMySQLdb.cursorsTF)
__import__cursorsZSSCursorZ	_sscursorImportErrorAttributeError)r   r5   r   r   r   supports_server_side_cursorsk   s   
z1MySQLDialect_mysqldb.supports_server_side_cursorsc                 C   s   t dS )NZMySQLdb)r4   )clsr   r   r   r#   t   s   zMySQLDialect_mysqldb.dbapic                    s   t t|    fdd}|S )Nc                    sF    d ur |  |   }|d ur!|  }|d|  |  d S d S )NzSET NAMES %s)character_set_namer   executeclose)connZcharset_namer   Zsuper_r   r   
on_connect{   s   z3MySQLDialect_mysqldb.on_connect.<locals>.on_connect)r    r   r?   )r   r?   r&   r>   r   r?   x   s   zMySQLDialect_mysqldb.on_connectc              
   C   sL   z| d W dS  | jjy% } z| ||d r W Y d }~dS  d }~ww )NFT)Zpingr#   ErrorZis_disconnect)r   Zdbapi_connectionerrr   r   r   do_ping   s   zMySQLDialect_mysqldb.do_pingNc                 C   s"   | ||}|d ur||_d S d S r(   )Zexecutemanyr   )r   r   Z	statement
parameterscontextr   r   r   r   do_executemany   s   
z#MySQLDialect_mysqldb.do_executemanyc                    sj   | j dko|d| jd| jdf }|r*tttdtdddg}ng }t	t
| ||S )	N)   z:show collation where %s = 'utf8mb4' and %s = 'utf8mb4_bin'CharsetZ	Collationz'test collated returns'Zutf8mb4)charsetZutf8mb4_bin)Zserver_version_infoZscalarZidentifier_preparerquoter	   ZcollatecastZliteral_columnr   r    r   _check_unicode_returns)r   
connectionZhas_utf8mb4_binZadditional_testsr&   r   r   rK      s,   


	

z+MySQLDialect_mysqldb._check_unicode_returnsc              	   C   sL  |j dddd}||j t|dt t|dt t|dt t|dt t|d	t t|d
t t|dt t|dt i }g d}|D ]}||v rl|| ||dd  < t||dd  t ||= qN|rs||d< |d	d}| j	d urzt
| j	jd jj}||jO }W n ttfy   d| _Y nw ||d	< g |gS )Ndbuserpasswd)Zdatabaseusernamepasswordcompressconnect_timeoutread_timeoutZwrite_timeoutclient_flagZlocal_infileZuse_unicoderH   )Zssl_caZssl_keyZssl_certZ
ssl_capathZ
ssl_cipher   sslr   z.constants.CLIENTF)Ztranslate_connect_argsupdatequeryr
   Zcoerce_kw_typeboolr)   strgetr#   r4   r   	constantsZCLIENTZ
FOUND_ROWSr7   r6   supports_sane_rowcount)r   urloptsrW   keyskeyrU   ZCLIENT_FLAGSr   r   r   create_connect_args   sH   


z(MySQLDialect_mysqldb.create_connect_argsc                 C   s
   |j d S )Nr   )args)r   	exceptionr   r   r   _extract_error_code   s   
z(MySQLDialect_mysqldb._extract_error_codec                 C   s0   z|j j}W | S  ty   td Y dS w )z:Sniff out the character set in use for connection results.zNo 'character_set_name' can be detected with this MySQL-Python version; please upgrade to a recent version of MySQL-Python.  Assuming latin1.latin1)rL   r:   r7   r
   warn)r   rL   Z	cset_namer   r   r   _detect_charset   s   

z$MySQLDialect_mysqldb._detect_charset)ZSERIALIZABLEzREAD UNCOMMITTEDzREAD COMMITTEDzREPEATABLE READ
AUTOCOMMITc                    s6   |dkr| d d S | d tt| || d S )Nrj   TF)Z
autocommitr    r   _set_isolation_level)r   rL   levelr&   r   r   rk     s   

z)MySQLDialect_mysqldb._set_isolation_level)Fr(   )"r   r   r   ZdriverZsupports_unicode_statementsr^   Zsupports_sane_multi_rowcountZsupports_native_decimalZdefault_paramstyler   Zexecution_ctx_clsr   Zstatement_compilerr   preparerr!   r$   r
   ZlanghelpersZmemoized_propertyr8   classmethodr#   r?   rB   rE   rK   rc   rf   ri   setZ_isolation_lookuprk   __classcell__r   r   r&   r   r   N   s6    	


-
r   )__doc__r.   baser   r   r   r   r    r	   r
   r   r   r   r   dialectr   r   r   r   <module>   s   *	 ?