
    ؄_                          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 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 <http://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.


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dS )MySQLExecutionContext_mysqldbc                 H    t          | d          r| j        S | j        j        S )N	_rowcount)hasattrr   cursorrowcount)selfs    f/var/www/book.euthymeo.com/html/venv/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqldb.pyr   z&MySQLExecutionContext_mysqldb.rowcount>   s'    4%% 	(>!;''    N)__name__
__module____qualname__propertyr    r   r   r   r   =   s-        ( ( X( ( (r   r   c                       e Zd ZdS )MySQLCompiler_mysqldbNr   r   r   r   r   r   r   r   F           Dr   r   c                       e Zd ZdS )MySQLIdentifierPreparer_mysqldbNr   r   r   r   r    r    J   r   r   r    c                        e Zd ZdZdZdZdZdZdZe	Z
eZeZd 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 Zd Zd Z eg d          Z fdZ  xZ!S )MySQLDialect_mysqldbmysqldbTformatFc                      t          t          |           j        di | || _        | j        4t          | j        d          r|                     | j        j                  nd| _        d S )N__version__r   r   r   r   )	superr"   __init__server_side_cursorsdbapir   _parse_dbapi_versionr&   _mysql_dbapi_version)r   r*   kwargs	__class__s      r   r)   zMySQLDialect_mysqldb.__init__[   sv    2"D))2<<V<<<#6  z%'$*m*L*L% %%dj&<=== 	!!!r   c                     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>g   s(      KKAQ]Q]]]]KKr   r      r	   r'   )rematchtuplegroup)r   versionms      r   r,   z)MySQLDialect_mysqldb._parse_dbapi_versiond   sN    H0':: 	KKAq)9)9KKKKKK9r   c                 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)r   r@   s     r   supports_server_side_cursorsz1MySQLDialect_mysqldb.supports_server_side_cursorsk   sN    	 !233;G$-DN4^, 	 	 	55	s    $ 99c                      t          d          S )NMySQLdb)r?   )clss    r   r+   zMySQLDialect_mysqldb.dbapit   s    )$$$r   c                 b    t          t          |                                           fd}|S )Nc                      |            |                                  }|B|                                 }|                    d|z             |                                 d S d S )NzSET NAMES %s)character_set_namer   executeclose)conncharset_namer   super_s      r   
on_connectz3MySQLDialect_mysqldb.on_connect.<locals>.on_connect{   sj    !t2244L'~<=== ('r   )r(   r"   rQ   )r   rQ   rP   r/   s     @r   rQ   zMySQLDialect_mysqldb.on_connectx   sA    +T22==??		 		 		 		 		 r   c                     	 |                     d           dS # | j        j        $ r#}|                     ||d           rY d }~dS  d }~ww xY w)NFT)pingr+   Erroris_disconnect)r   dbapi_connectionerrs      r   do_pingzMySQLDialect_mysqldb.do_ping   ss    	!!%((( 4 z 	 	 	!!#'7>> uuuuu		s    AAAANc                 H    |                     ||          }|	||_        d S d S r2   )executemanyr   )r   r   	statement
parameterscontextr   s         r   do_executemanyz#MySQLDialect_mysqldb.do_executemany   s3    %%i<< (G r   c                    | j         dk    oK|                    d| j                            d          d| j                            d          d          }|rJt	          j        t	          j        t	          j        d          t          d	                    d
          g}ng }t          t          |                               ||          S )N)   zshow collation where Charsetz = 'utf8mb4' and 	Collationz = 'utf8mb4_bin'z'test collated returns'utf8mb4)charsetutf8mb4_bin)server_version_infoscalaridentifier_preparerquoter
   collatecastliteral_columnr   r(   r"   _check_unicode_returns)r   
connectionhas_utf8mb4_binadditional_testsr/   s       r   rm   z+MySQLDialect_mysqldb._check_unicode_returns   s    
 2 6
 
 
 (..y9999(..{;;;;
 
 	  	"H*+DEEY///  "    ")400GG(
 
 	
r   c                    |                     ddd          }|                    |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 }g d}|D ]?}||v r9||         ||dd          <   t          j        ||dd          t                     ||= @|r||d<   |                    d	d          }| j	        U	 t          | j	        j        dz             j        j        }||j        z  }n# t          t           f$ r
 d| _        Y nw xY w||d	<   g |gS )Ndbuserpasswd)databaseusernamepasswordcompressconnect_timeoutread_timeoutwrite_timeoutclient_flaglocal_infileuse_unicoderd   )ssl_cassl_keyssl_cert
ssl_capath
ssl_cipher   sslr   z.constants.CLIENTF)translate_connect_argsupdatequeryr   coerce_kw_typeboolr3   strgetr+   r?   r   	constantsCLIENT
FOUND_ROWSrD   rC   supports_sane_rowcount)r   urloptsr   keyskeyr|   CLIENT_FLAGSs           r   create_connect_argsz(MySQLDialect_mysqldb.create_connect_args   s   ))FX * 
 
 	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.#666 	D-666D)S111
 LLL 	 	Cd{{#CyCG#CQRR#666I 	DK hh}a00:!4)J'*==   F  |66"K0 4 4 4.3+++4"-DDzs   80F) )GGc                     |j         d         S )Nr   )args)r   	exceptions     r   _extract_error_codez(MySQLDialect_mysqldb._extract_error_code   s    ~a  r   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)rn   rK   rD   r   warn)r   rn   	cset_names      r   _detect_charsetz$MySQLDialect_mysqldb._detect_charset   sa    	 #-@I 9;;  	 	 	I#   88	s    ::)SERIALIZABLEzREAD UNCOMMITTEDzREAD COMMITTEDzREPEATABLE READ
AUTOCOMMITc                     |dk    r|                     d           d S |                     d           t          t          |                               ||           d S )Nr   TF)
autocommitr(   r"   _set_isolation_level)r   rn   levelr/   s      r   r   z)MySQLDialect_mysqldb._set_isolation_level  sn    L  !!$'''''!!%(((&--BBE    r   )Fr2   )"r   r   r   driversupports_unicode_statementsr   supports_sane_multi_rowcountsupports_native_decimaldefault_paramstyler   execution_ctx_clsr   statement_compilerr    preparerr)   r,   r   langhelpersmemoized_propertyrE   classmethodr+   rQ   rX   r^   rm   r   r   r   set_isolation_lookupr   __classcell__)r/   s   @r   r"   r"   N   s|       F"&!#' "!5..H
 
 
 
 
 
   
'  (' % % [%     	 	 	) ) ) )

 
 
 
 
<+ + +Z! ! !  $ 	
 	
 	
         r   r"   )__doc__r8   baser   r   r   r   r    r
   r   r   r   r    r"   dialectr   r   r   <module>r      sW  ( (T 
			             ' ' ' ' ' ' ) ) ) ) ) )                  ( ( ( ( ($9 ( ( (	 	 	 	 	M 	 	 		 	 	 	 	&= 	 	 	{ { { { {< { { {| r   