
    Bh&                    x   S r SSKJr  SSKrSSKJr  SSKJr  SSKJr  SSKJr  SSKJ	r	  SS	KJ
r
  SS
KJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  \(       a6  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJ r    " S S\5      r! " S S\5      r" " S  S!\5      r#\#r$g)"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                      \ rS rSrSrg)MySQLExecutionContext_mysqldbv    N__name__
__module____qualname____firstlineno____static_attributes__r       d/home/kali/devsecops-assessor/venv/lib/python3.13/site-packages/sqlalchemy/dialects/mysql/mysqldb.pyr   r   v       r&   r   c                      \ rS rSrSrg)MySQLCompiler_mysqldbz   r   Nr    r   r&   r'   r*   r*   z   r(   r&   r*   c                  f  ^  \ rS rSr% SrSrSrSrSrSr	Sr
\r\r\rS\S'   SU 4S jjrSS jr\R*                  R,                  SS	 j5       r\SS
 j5       rSU 4S jjrSS jr S         SS jjr S     SS jjrSS jrS S jrS!S jr     S"S jr!S#S jr"      S$U 4S jjr#Sr$U =r%$ )%MySQLDialect_mysqldb~   mysqldbTformatTuple[int, ...]server_version_infoc                   > [         TU ]  " S0 UD6  U R                  bF  [        U R                  S5      (       a+  U R	                  U R                  R
                  5      U l        g SU l        g )N__version__r   r   r   r   )super__init__dbapihasattr_parse_dbapi_versionr4   _mysql_dbapi_version)selfkwargs	__class__s     r'   r7   MySQLDialect_mysqldb.__init__   s^    "6" zz%'$**m*L*L %%djj&<&<= 	!  	!r&   c                    [         R                  " SU5      nU(       a#  [        S UR                  SSS5       5       5      $ g)Nz(\d+)\.(\d+)(?:\.(\d+))?c              3  @   #    U  H  oc  M  [        U5      v   M     g 7fN)int).0xs     r'   	<genexpr><MySQLDialect_mysqldb._parse_dbapi_version.<locals>.<genexpr>   s     K)9AQ)9s   r      r   r5   )rematchtuplegroup)r<   versionms      r'   r:   )MySQLDialect_mysqldb._parse_dbapi_version   s7    HH0':KAq)9KKKr&   c                ~     [        S5      R                  nUR                  U l        g! [        [
        4 a     gf = f)NzMySQLdb.cursorsTF)
__import__cursorsSSCursor	_sscursorImportErrorAttributeError)r<   rR   s     r'   supports_server_side_cursors1MySQLDialect_mysqldb.supports_server_side_cursors   s?    	 !23;;G$--DN^, 		s   &) <<c                    [        S5      $ )NMySQLdb)rQ   )clss    r'   import_dbapi!MySQLDialect_mysqldb.import_dbapi   s    )$$r&   c                6   >^ [         TU ]  5       mSU4S jjnU$ )Nc                   > Tb  T" U 5        U R                  5       nUb5  U R                  5       nUR                  SU-  5        UR                  5         g g )NzSET NAMES %s)character_set_namecursorexecuteclose)conncharset_namera   super_s      r'   
on_connect3MySQLDialect_mysqldb.on_connect.<locals>.on_connect   sN    !t224L'~<= (r&   )rd   r   returnNone)r6   rg   )r<   rg   rf   r>   s     @r'   rg   MySQLDialect_mysqldb.on_connect   s    #%		 r&   c                $    UR                  5         g)NT)ping)r<   dbapi_connections     r'   do_pingMySQLDialect_mysqldb.do_ping   s    r&   c                X    UR                  X#5      nUb  U[        [        U5      l        g g rB   )executemanyr   r   	_rowcount)r<   ra   	statement
parameterscontextrowcounts         r'   do_executemany#MySQLDialect_mysqldb.do_executemany   s/     %%i<=ED&0: r&   c                z   Uc  [        SSSS9nUR                  " S0 UD6nUR                  UR                  5        [        R
                  " US[        5        [        R
                  " US[        5        [        R
                  " US[        5        [        R
                  " US[        5        [        R
                  " US	[        5        [        R
                  " US
[        5        [        R
                  " US[        5        [        R
                  " US[        5        0 nS[        4S[        4S[        4S[        4S[        4S[        4/nU H1  u  pgXc;   d  M  X6   XFSS  '   [        R
                  " XFSS  U5        X6	 M3     U(       a  XCS'   UR                  S	S5      nU R                  5       n	U	b  X-  nXS	'   / U4$ )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boolrC   strget_found_rows_client_flag)
r<   url_translate_argsoptsr   keyskeykw_typer   client_flag_found_rowss
             r'   create_connect_args(MySQLDialect_mysqldb.create_connect_args   s    ""O ))<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{#yG##CQR':I	 !
 K hh}a0!%!=!=!?!-1K"-4xr&   c                    U R                   bC   [        U R                   R                  S-   5      R                  R                  nUR
                  $ g ! [        [        4 a     g f = f)Nz.constants.CLIENT)r8   rQ   r!   	constantsCLIENT
FOUND_ROWSrV   rU   )r<   CLIENT_FLAGSs     r'   r   ,MySQLDialect_mysqldb._found_rows_client_flag   sd    ::!/)JJ''*== )FF  $... #K0 s   6A A%$A%c                     UR                   S   $ )Nr   )args)r<   	exceptions     r'   _extract_error_code(MySQLDialect_mysqldb._extract_error_code
  s    ~~a  r&   c                     UR                   R                  nU" 5       $ ! [         a    [        R                  " S5         gf = f)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)
connectionr`   rV   r   warn)r<   r   	cset_names      r'   _detect_charset$MySQLDialect_mysqldb._detect_charset  sN    	
 %%88  ;  	II# 	s     AAc                    g)N)SERIALIZABLEzREAD UNCOMMITTEDzREAD COMMITTEDzREPEATABLE READ
AUTOCOMMITr   r<   
dbapi_conns     r'   get_isolation_level_values/MySQLDialect_mysqldb.get_isolation_level_values"  s    
r&   c                "    UR                  5       $ rB   )get_autocommitr   s     r'   detect_autocommit_setting.MySQLDialect_mysqldb.detect_autocommit_setting-  s    ((**r&   c                v   > US:X  a  UR                  S5        g UR                  S5        [        TU ]	  X5        g )Nr   TF)
autocommitr6   set_isolation_level)r<   rn   levelr>   s      r'   r   (MySQLDialect_mysqldb.set_isolation_level0  s7     L ''-''.G'(8@r&   )r;   rT   )r=   r   )rM   r   ri   r1   )ri   r   )ri   r   )ri   z!Callable[[DBAPIConnection], None])rn   r   ri   zLiteral[True]rB   )
ra   r   rt   r   ru   r   rv   zOptional[ExecutionContext]ri   rj   )r   r   r   zOptional[Dict[str, Any]]ri   r   )ri   zOptional[int])r   zDBAPIModule.Errorri   rC   )r   r   ri   r   )r   r   ri   zTuple[IsolationLevel, ...])r   r   ri   r   )rn   r   r   r   ri   rj   )&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__r7   r:   r   langhelpersmemoized_propertyrW   classmethodr\   rg   ro   rx   r   r   r   r   r   r   r   r%   __classcell__)r>   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   rI   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&   