
    +h&                         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e      Z G d de      Z G d de      ZeZy)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 <https://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.

.. _mysqldb_ssl:

SSL Connections
----------------

The mysqlclient and PyMySQL DBAPIs accept an additional dictionary under the
key "ssl", which may be specified using the
:paramref:`_sa.create_engine.connect_args` dictionary::

    engine = create_engine(
        "mysql+mysqldb://scott:tiger@192.168.0.134/test",
        connect_args={
            "ssl": {
                "ca": "/home/gord/client-ssl/ca.pem",
                "cert": "/home/gord/client-ssl/client-cert.pem",
                "key": "/home/gord/client-ssl/client-key.pem"
            }
        }
    )

For convenience, the following keys may also be specified inline within the URL
where they will be interpreted into the "ssl" dictionary automatically:
"ssl_ca", "ssl_cert", "ssl_key", "ssl_capath", "ssl_cipher",
"ssl_check_hostname". An example is as follows::

    connection_uri = (
        "mysql+mysqldb://scott:tiger@192.168.0.134/test"
        "?ssl_ca=/home/gord/client-ssl/ca.pem"
        "&ssl_cert=/home/gord/client-ssl/client-cert.pem"
        "&ssl_key=/home/gord/client-ssl/client-key.pem"
    )

.. seealso::

    :ref:`pymysql_ssl` in the PyMySQL dialect


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                       e Zd Zed        Zy)MySQLExecutionContext_mysqldbc                 ^    t        | d      r| j                  S | j                  j                  S )N	_rowcount)hasattrr   cursorrowcount)selfs    T/var/www/html/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/mysqldb.pyr   z&MySQLExecutionContext_mysqldb.rowcountb   s&    4%>>!;;'''    N)__name__
__module____qualname__propertyr    r   r   r   r   a   s    ( (r   r   c                       e Zd Zy)MySQLCompiler_mysqldbN)r   r   r   r   r   r   r   r   j   s    r   r   c                        e Zd ZdZdZdZdZdZdZdZ	e
ZeZeZ fdZd Zej&                  j(                  d        Zed        Z fdZd	 Zdd
Z fdZddZd Zd Zd Z e g d      Z! fdZ" xZ#S )MySQLDialect_mysqldbmysqldbTformatc                     t        t        | 
  di | | j                  At	        | j                  d      r+| j                  | j                  j                        | _        y d| _        y )N__version__r   r   r   r   )superr   __init__dbapir   _parse_dbapi_versionr"   _mysql_dbapi_version)r   kwargs	__class__s     r   r%   zMySQLDialect_mysqldb.__init__|   s^    "D2<V< zz%'$**m*L %%djj&<&<= 	!  	!r   c                 z    t        j                  d|      }|r#t        d |j                  ddd      D              S y)Nz(\d+)\.(\d+)(?:\.(\d+))?c              3   8   K   | ]  }|t        |        y wN)int).0xs     r   	<genexpr>z<MySQLDialect_mysqldb._parse_dbapi_version.<locals>.<genexpr>   s     KAQ]QKs   r      r	   r#   )rematchtuplegroup)r   versionms      r   r'   z)MySQLDialect_mysqldb._parse_dbapi_version   s7    HH0':KAq)9KKKr   c                 |    	 t        d      j                  }|j                  | _        y# t        t
        f$ r Y yw xY w)NzMySQLdb.cursorsTF)
__import__cursorsSSCursor	_sscursorImportErrorAttributeError)r   r;   s     r   supports_server_side_cursorsz1MySQLDialect_mysqldb.supports_server_side_cursors   s?    	 !23;;G$--DN^, 		s   &) ;;c                     t        d      S )NMySQLdb)r:   )clss    r   r&   zMySQLDialect_mysqldb.dbapi   s    )$$r   c                 8    t         t        |          fd}|S )Nc                      |        | j                         }|5| j                         }|j                  d|z         |j                          y y )NzSET NAMES %s)character_set_namer   executeclose)conncharset_namer   super_s      r   
on_connectz3MySQLDialect_mysqldb.on_connect.<locals>.on_connect   sN    !t224L'~<= (r   )r$   r   rL   )r   rL   rK   r*   s     @r   rL   zMySQLDialect_mysqldb.on_connect   s     +T=?		 r   c                     	 |j                  d       y# | j                  j                  $ r}| j                  ||d       rY d }~y d }~ww xY w)NFT)pingr&   Erroris_disconnect)r   dbapi_connectionerrs      r   do_pingzMySQLDialect_mysqldb.do_ping   sO    	!!%(  zz 	!!#'7>		s    AAAAc                 <    |j                  ||      }|||_        y y r-   )executemanyr   )r   r   	statement
parameterscontextr   s         r   do_executemanyz#MySQLDialect_mysqldb.do_executemany   s'    %%i< (G r   c                    |j                  d| j                  j                  d      d| j                  j                  d      d      j                         }| j                  dkD  xr |}|rIt        j                  t        j                  t        j                  d      t        d	            d
      g}ng }t        t        | 3  ||      S )Nzshow collation where Charsetz = 'utf8mb4' and 	Collationz = 'utf8mb4_bin')   z'test collated returns'utf8mb4)charsetutf8mb4_bin)exec_driver_sqlidentifier_preparerquotescalarserver_version_infor
   collatecastliteral_columnr   r$   r   _check_unicode_returns)r   
connection	collationhas_utf8mb4_binadditional_testsr*   s        r   ri   z+MySQLDialect_mysqldb._check_unicode_returns   s    
 .. ((..y9((..{;
 &( 	 22T9GiHH**+DEY/ "   ")4G(
 	
r   c                 h   |t        ddd      } |j                  di |}|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t        fdt        fdt        fdt        fdt        fdt        fg}|D ]2  \  }}||v s||   ||dd  <   t	        j
                  ||dd  |       ||= 4 |r||d<   |j                  d	d      }| j                         }	|	
||	z  }||d	<   g |gS )Ndbuserpasswd)databaseusernamepasswordcompressconnect_timeoutread_timeoutwrite_timeoutclient_flaglocal_infileuse_unicoder_   ssl_cassl_keyssl_cert
ssl_capath
ssl_cipherssl_check_hostname   sslr   r   )dicttranslate_connect_argsupdatequeryr   coerce_kw_typeboolr.   strget_found_rows_client_flag)
r   url_translate_argsoptsr   keyskeykw_typery   client_flag_found_rowss
             r   create_connect_argsz(MySQLDialect_mysqldb.create_connect_args   s   ""O *s))<O<CIID*d3D"3S9D.#6D/37D-5D.#6 	D-6D)S1
 sO33!4(
 ! 	LCd{#CyCG##CQR':I		
 DK hh}a0!%!=!=!?!-11K"-DDzr   c                     | j                   C	 t        | j                   j                  dz         j                  j                  }|j
                  S y # t        t        f$ r Y y w xY w)Nz.constants.CLIENT)r&   r:   r   	constantsCLIENT
FOUND_ROWSr?   r>   )r   CLIENT_FLAGSs     r   r   z,MySQLDialect_mysqldb._found_rows_client_flag  sd    ::!/)JJ''*== )FF  $... #K0 s   6A A#"A#c                      |j                   d   S )Nr   )args)r   	exceptions     r   _extract_error_codez(MySQLDialect_mysqldb._extract_error_code  s    ~~a  r   c                     	 |j                   j                  } |       S # t        $ r t        j                  d       Y yw xY 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)rj   rF   r?   r   warn)r   rj   	cset_names      r   _detect_charsetz$MySQLDialect_mysqldb._detect_charset  sK    	 #--@@I ;  	II# 	s    A A )SERIALIZABLEzREAD UNCOMMITTEDzREAD COMMITTEDzREPEATABLE READ
AUTOCOMMITc                 ~    |dk(  r|j                  d       y |j                  d       t        t        |   ||       y )Nr   TF)
autocommitr$   r   _set_isolation_level)r   rj   levelr*   s      r   r   z)MySQLDialect_mysqldb._set_isolation_level4  s<    L !!$'!!%(&BEr   r-   )$r   r   r   driversupports_statement_cachesupports_unicode_statementssupports_sane_rowcountsupports_sane_multi_rowcountsupports_native_decimaldefault_paramstyler   execution_ctx_clsr   statement_compilerr   preparerr%   r'   r   langhelpersmemoized_propertyr@   classmethodr&   rL   rS   rY   ri   r   r   r   r   set_isolation_lookupr   __classcell__)r*   s   @r   r   r   n   s    F#"&!#' "!5.&H
 
'' ( % % 	)

:1f!$ 	
 r   r   )__doc__r3   baser   r   r   r   r    r
   r   r   r   r   dialectr   r   r   <module>r      sU   L\ 
   ' )   ($9 (	M 	M< M` r   