
    h&                    n   d Z ddlm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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 er6d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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`.

    )annotationsN)Any)Callable)cast)Dict)Optional)Tuple)TYPE_CHECKING   )MySQLCompiler)MySQLDialect)MySQLExecutionContext)MySQLIdentifierPreparer   )util)Literal)
Connection)_DBAPIMultiExecuteParams)ConnectArgsType)DBAPIConnection)DBAPICursor)DBAPIModule)ExecutionContext)IsolationLevel)URLc                      e Zd Zy)MySQLExecutionContext_mysqldbN__name__
__module____qualname__     _/var/www/html/eduruby.in/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/mysqldb.pyr   r   v       r#   r   c                      e Zd Zy)MySQLCompiler_mysqldbNr   r"   r#   r$   r'   r'   z   r%   r#   r'   c                  8    e Zd ZU dZdZdZdZdZdZdZ	e
ZeZeZded<   d fdZddZej(                  j*                  dd       Zedd	       Zd fd
ZddZ	 d	 	 	 	 	 	 	 	 	 ddZ	 d	 	 	 	 	 ddZddZddZddZ	 	 	 	 d dZ d!dZ!	 	 	 	 	 	 d" fdZ" xZ#S )#MySQLDialect_mysqldbmysqldbTformatTuple[int, ...]server_version_infoc                    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$   r2   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   r0   )rematchtuplegroup)r7   versionms      r$   r5   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)r7   rJ   s     r$   supports_server_side_cursorsz1MySQLDialect_mysqldb.supports_server_side_cursors   s?    	 !23;;G$--DN^, 		s   &) ;;c                    t        d      S )NMySQLdb)rI   )clss    r$   import_dbapiz!MySQLDialect_mysqldb.import_dbapi   s    )$$r#   c                2    t         |          d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_namerW   super_s      r$   
on_connectz3MySQLDialect_mysqldb.on_connect.<locals>.on_connect   sN    !t224L'~<= (r#   )rZ   r   returnNone)r1   r]   )r7   r]   r\   r9   s     @r$   r]   zMySQLDialect_mysqldb.on_connect   s    #%		 r#   c                $    |j                          y)NT)ping)r7   dbapi_connections     r$   do_pingzMySQLDialect_mysqldb.do_ping   s    r#   c                X    |j                  ||      }||t        t        |      _        y y r<   )executemanyr   r   	_rowcount)r7   rW   	statement
parameterscontextrowcounts         r$   do_executemanyz#MySQLDialect_mysqldb.do_executemany   s1     %%i<=ED&0: 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 |fS )Ndbuserpasswd)databaseusernamepasswordcompressconnect_timeoutread_timeoutwrite_timeoutclient_flaglocal_infileuse_unicodecharset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)
r7   url_translate_argsoptsr   keyskeykw_typerw   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4x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)r3   rI   r   	constantsCLIENT
FOUND_ROWSrN   rM   )r7   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)r7   	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)
connectionrV   rN   r   warn)r7   r   	cset_names      r$   _detect_charsetz$MySQLDialect_mysqldb._detect_charset  sN    	
 %%88  ;  	II# 	s    A A c                     y)N)SERIALIZABLEzREAD UNCOMMITTEDzREAD COMMITTEDzREPEATABLE READ
AUTOCOMMITr"   r7   
dbapi_conns     r$   get_isolation_level_valuesz/MySQLDialect_mysqldb.get_isolation_level_values"  s    
r#   c                "    |j                         S r<   )get_autocommitr   s     r$   detect_autocommit_settingz.MySQLDialect_mysqldb.detect_autocommit_setting-  s    ((**r#   c                v    |dk(  r|j                  d       y |j                  d       t        | 	  ||       y )Nr   TF)
autocommitr1   set_isolation_level)r7   rb   levelr9   s      r$   r   z(MySQLDialect_mysqldb.set_isolation_level0  s9     L ''-''.G'(8%@r#   )r8   r   )rF   r   r^   r,   )r^   r   )r^   r   )r^   z!Callable[[DBAPIConnection], None])rb   r   r^   zLiteral[True]r<   )
rW   r   rg   r   rh   r   ri   zOptional[ExecutionContext]r^   r_   )r   r   r   zOptional[Dict[str, Any]]r^   r   )r^   zOptional[int])r   zDBAPIModule.Errorr^   r=   )r   r   r^   r   )r   r   r^   zTuple[IsolationLevel, ...])r   r   r^   r   )rb   r   r   r   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   preparer__annotations__r2   r5   r   langhelpersmemoized_propertyrO   classmethodrS   r]   rc   rk   r   r   r   r   r   r   r   __classcell__)r9   s   @r$   r)   r)   ~   s@   F#"&!#' "!5.&H((
 
'' ( % %  /3	F	F 	F -		F
 ,	F 
	F EI33)A3	3j!*	
)	
	#	
+A /A8FA	A Ar#   r)   )%__doc__
__future__r   rB   typingr   r   r   r   r   r	   r
   baser   r   r   r    r   util.typingr   engine.baser   engine.interfacesr   r   r   r   r   r   r   
engine.urlr   r   r'   r)   dialectr"   r#   r$   <module>r      s   N^ # 	           ' )  ")=440053!	$9 		M 	yA< yAx r#   