
    	h&                       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$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 <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dS )MySQLExecutionContext_mysqldbN__name__
__module____qualname__     n/var/www/html/web-builder-api.evdpl.com/venv/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqldb.pyr   r   v           Dr#   r   c                      e Zd ZdS )MySQLCompiler_mysqldbNr   r"   r#   r$   r'   r'   z   r%   r#   r'   c                       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<   d7 fdZd8dZej        j        d9d            Zed:d            Zd; fdZd<dZ	 d=d>d Z	 d=d?d&Zd@d(ZdAd,ZdBd/ZdCd2Z dDd3Z!dE fd6Z" xZ#S )FMySQLDialect_mysqldbmysqldbTformatTuple[int, ...]server_version_infokwargsr   c                     t                      j        di | | j        4t          | j        d          r|                     | j        j                  nd| _        d S )N__version__r   r   r   r"   )super__init__dbapihasattr_parse_dbapi_versionr0   _mysql_dbapi_version)selfr.   	__class__s     r$   r3   zMySQLDialect_mysqldb.__init__   sg    ""6""" z%'$*m*L*L% %%dj&<=== 	!!!r#   versionstrreturnc                    t          j        d|          }|r.t          d |                    ddd          D                       S dS )Nz(\d+)\.(\d+)(?:\.(\d+))?c              3  8   K   | ]}|t          |          V  d S N)int).0xs     r$   	<genexpr>z<MySQLDialect_mysqldb._parse_dbapi_version.<locals>.<genexpr>   s(      KKAQ]Q]]]]KKr#   r      r   r1   )rematchtuplegroup)r8   r:   ms      r$   r6   z)MySQLDialect_mysqldb._parse_dbapi_version   sN    H0':: 	KKAq)9)9KKKKKK9r#   boolc                x    	 t          d          j        }|j        | _        dS # t          t
          f$ r Y dS w xY w)NzMySQLdb.cursorsTF)
__import__cursorsSSCursor	_sscursorImportErrorAttributeError)r8   rM   s     r$   supports_server_side_cursorsz1MySQLDialect_mysqldb.supports_server_side_cursors   sN    	 !233;G$-DN4^, 	 	 	55	s    $ 99r   c                     t          d          S )NMySQLdb)rL   )clss    r$   import_dbapiz!MySQLDialect_mysqldb.import_dbapi   s    )$$$r#   !Callable[[DBAPIConnection], None]c                V    t                                                      dfd}|S )Nconnr   r<   Nonec                     |            |                                  }|B|                                 }|                    d|z             |                                 d S d S )NzSET NAMES %s)character_set_namecursorexecuteclose)rY   charset_namer]   super_s      r$   
on_connectz3MySQLDialect_mysqldb.on_connect.<locals>.on_connect   sj    !t2244L'~<=== ('r#   )rY   r   r<   rZ   )r2   rb   )r8   rb   ra   r9   s     @r$   rb   zMySQLDialect_mysqldb.on_connect   s?    ##%%		 		 		 		 		 		 r#   dbapi_connectionr   Literal[True]c                .    |                                  dS )NT)ping)r8   rc   s     r$   do_pingzMySQLDialect_mysqldb.do_ping   s    tr#   Nr]   r   	statement
parametersr   contextOptional[ExecutionContext]rZ   c                n    |                     ||          }||t          t          |          _        d S d S r?   )executemanyr   r   	_rowcount)r8   r]   rh   ri   rj   rowcounts         r$   do_executemanyz#MySQLDialect_mysqldb.do_executemany   s@     %%i<<=ED&00::: r#   urlr   _translate_argsOptional[Dict[str, Any]]r   c                   |t          ddd          } |j        di |}|                    |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 ]=\  }}||v r4||         ||dd          <   t	          j        ||dd          |           ||= >|r||d<   |	                    d	d          }| 
                                }	|	
||	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_typerJ   r@   r;   get_found_rows_client_flag)
r8   rq   rr   optsr   keyskeykw_typer   client_flag_found_rowss
             r$   create_connect_argsz(MySQLDialect_mysqldb.create_connect_args   s    ""  O *s)<<O<<CID*d333D"3S999D.#666D/3777D-555D.$777 	D-666D)S111
 sO33!4(
 ! 	 	LCd{{#CyCG#CQRR':::I 	DK hh}a00!%!=!=!?!?!-11K"-D4xr#   Optional[int]c                    | j         F	 t          | j         j        dz             j        j        }|j        S # t          t          f$ r Y d S w xY wd S )Nz.constants.CLIENT)r4   rL   r   	constantsCLIENT
FOUND_ROWSrQ   rP   )r8   CLIENT_FLAGSs     r$   r   z,MySQLDialect_mysqldb._found_rows_client_flag   so    :!/)J'*==   F  $.. #K0   tt
 4s   &6 A
A	exceptionDBAPIModule.Errorr@   c                    |j         d         S )Nr   )args)r8   r   s     r$   _extract_error_codez(MySQLDialect_mysqldb._extract_error_code
  s    ~a  r#   
connectionr   c                z    	 |j         j        } |            S # t          $ r t          j        d           Y dS 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)r   r\   rQ   r   warn)r8   r   	cset_names      r$   _detect_charsetz$MySQLDialect_mysqldb._detect_charset  sd    	
 %8  9;;  	 	 	I#   88	s    ::
dbapi_connTuple[IsolationLevel, ...]c                    dS )N)SERIALIZABLEzREAD UNCOMMITTEDzREAD COMMITTEDzREPEATABLE READ
AUTOCOMMITr"   r8   r   s     r$   get_isolation_level_valuesz/MySQLDialect_mysqldb.get_isolation_level_values"  s    
 
r#   c                *    |                                 S r?   )get_autocommitr   s     r$   detect_autocommit_settingz.MySQLDialect_mysqldb.detect_autocommit_setting-  s    ((***r#   levelr   c                    |dk    r|                     d           d S |                     d           t                                          ||           d S )Nr   TF)
autocommitr2   set_isolation_level)r8   rc   r   r9   s      r$   r   z(MySQLDialect_mysqldb.set_isolation_level0  s_     L  ''-----''...GG''(8%@@@@@r#   )r.   r   )r:   r;   r<   r,   )r<   rJ   )r<   r   )r<   rW   )rc   r   r<   rd   r?   )
r]   r   rh   r;   ri   r   rj   rk   r<   rZ   )rq   r   rr   rs   r<   r   )r<   r   )r   r   r<   r@   )r   r   r<   r;   )r   r   r<   r   )r   r   r<   rJ   )rc   r   r   r   r<   rZ   )$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__r3   r6   r   langhelpersmemoized_propertyrR   classmethodrV   rb   rg   rp   r   r   r   r   r   r   r   __classcell__)r9   s   @r$   r)   r)   ~   s        F#"&!#' "!5.&H((((
 
 
 
 
 
    
'   (' % % % [%          /3	F 	F 	F 	F 	F EI3 3 3 3 3j   ! ! ! !   *	
 	
 	
 	
+ + + +A A A A A A A A A Ar#   r)   )%__doc__
__future__r   rE   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 N^ # " " " " " 				                                                             ' ' ' ' ' ' ) ) ) ) ) )       " " " " " " 
"))))))======444444444444000000000000555555333333!!!!!!	 	 	 	 	$9 	 	 		 	 	 	 	M 	 	 	yA yA yA yA yA< yA yA yAx r#   