
    g6%                         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:

.. sourcecode:: text

    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y)MySQLExecutionContext_mysqldbN__name__
__module____qualname__     `/var/www/html/AdoubleTech/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/mysqldb.pyr   r   e       r   r   c                       e Zd Zy)MySQLCompiler_mysqldbNr   r   r   r   r   r   i   r   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d Z  fdZ! xZ"S )MySQLDialect_mysqldbmysqldbTformatc                     t        |   di | | j                  At        | j                  d      r+| j	                  | j                  j
                        | _        y d| _        y )N__version__r   r   r   r   )super__init__dbapihasattr_parse_dbapi_versionr   _mysql_dbapi_version)selfkwargs	__class__s     r   r    zMySQLDialect_mysqldb.__init__{   s[    "6" 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%   r8   s     r   supports_server_side_cursorsz1MySQLDialect_mysqldb.supports_server_side_cursors   s?    	 !23;;G$--DN^, 		s   &) ;;c                     t        d      S )NMySQLdb)r7   )clss    r   import_dbapiz!MySQLDialect_mysqldb.import_dbapi   s    )$$r   c                 0    t         |          fd}|S )Nc                      |        | j                         }|5| j                         }|j                  d|z         |j                          y y )NzSET NAMES %s)character_set_namecursorexecuteclose)conncharset_namerE   super_s      r   
on_connectz3MySQLDialect_mysqldb.on_connect.<locals>.on_connect   sN    !t224L'~<= (r   )r   rK   )r%   rK   rJ   r'   s     @r   rK   zMySQLDialect_mysqldb.on_connect   s    #%		 r   c                 $    |j                          y)NT)pingr%   dbapi_connections     r   do_pingzMySQLDialect_mysqldb.do_ping   s    r   c                 <    |j                  ||      }|||_        y y r*   )executemany	_rowcount)r%   rE   	statement
parameterscontextrowcounts         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        | -  ||      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   _check_unicode_returns)r%   
connection	collationhas_utf8mb4_binadditional_testsr'   s        r   rh   z+MySQLDialect_mysqldb._check_unicode_returns   s    
 .. ((..y9((..{;
 &( 	 22T9GiHH**+DEY/ "   "w-j:JKKr   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_typerx   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.$7 	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!   r7   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)ri   rD   r<   r   warn)r%   ri   	cset_names      r   _detect_charsetz$MySQLDialect_mysqldb._detect_charset  sK    	 #--@@I ;  	II# 	s    A A c                      y)N)SERIALIZABLEzREAD UNCOMMITTEDzREAD COMMITTEDzREPEATABLE READ
AUTOCOMMITr   rN   s     r   get_isolation_level_valuesz/MySQLDialect_mysqldb.get_isolation_level_values   s    
r   c                 v    |dk(  r|j                  d       y |j                  d       t        | 	  ||       y )Nr   TF)
autocommitr   set_isolation_level)r%   rO   levelr'   s      r   r   z(MySQLDialect_mysqldb.set_isolation_level)  s7    L ''-''.G'(8%@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=   classmethodrA   rK   rP   rX   rh   r   r   r   r   r   r   __classcell__)r'   s   @r   r   r   m   s    F#"&!#' "!5.&H
 
'' ( % % )
L61f!$
A Ar   r   )__doc__r0   baser   r   r   r   r    r
   r   r   r   r   dialectr   r   r   <module>r      sW   N` 
   ' )   	$9 		M 	AA< AAH r   