
    [h6%                         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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`.

    N   )MySQLCompiler)MySQLDialect)MySQLExecutionContext)MySQLIdentifierPreparer)TEXT   )sql)utilc                       e Zd ZdS )MySQLExecutionContext_mysqldbN__name__
__module____qualname__     p/var/www/api.easyaligner.net/htdocs/venv_linux/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/mysqldb.pyr   r   e           Dr   r   c                       e Zd ZdS )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                      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_versionr   _mysql_dbapi_version)selfkwargs	__class__s     r   r    zMySQLDialect_mysqldb.__init__{   sg    ""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>   s(      KKAQ]Q]]]]KKr   r      r	   r   )rematchtuplegroup)r%   versionms      r   r#   z)MySQLDialect_mysqldb._parse_dbapi_version   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%   r8   s     r   supports_server_side_cursorsz1MySQLDialect_mysqldb.supports_server_side_cursors   sN    	 !233;G$-DN4^, 	 	 	55	s    $ 99c                      t          d          S )NMySQLdb)r7   )clss    r   import_dbapiz!MySQLDialect_mysqldb.import_dbapi   s    )$$$r   c                 T    t                                                      fd}|S )Nc                      |            |                                  }|B|                                 }|                    d|z             |                                 d S d S )NzSET NAMES %s)character_set_namecursorexecuteclose)conncharset_namerE   super_s      r   
on_connectz3MySQLDialect_mysqldb.on_connect.<locals>.on_connect   sj    !t2244L'~<=== ('r   )r   rK   )r%   rK   rJ   r'   s     @r   rK   zMySQLDialect_mysqldb.on_connect   s:    ##%%		 		 		 		 		 r   c                 .    |                                  dS )NT)pingr%   dbapi_connections     r   do_pingzMySQLDialect_mysqldb.do_ping   s    tr   Nc                 H    |                     ||          }|	||_        d S d S r*   )executemany	_rowcount)r%   rE   	statement
parameterscontextrowcounts         r   do_executemanyz#MySQLDialect_mysqldb.do_executemany   s3    %%i<< (G r   c                    |                     d| j                            d          d| j                            d          d                                          }| j        dk    o|}|rJt          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999(..{;;;;
 
 &(( 	 2T9Gi 	"H*+DEEY///  "    "ww--j:JKKKr   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 |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<<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Dzr   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)r!   r7   r   	constantsCLIENT
FOUND_ROWSr<   r;   )r%   CLIENT_FLAGSs     r   r   z,MySQLDialect_mysqldb._found_rows_client_flag   so    :!/)J'*==   F  $.. #K0   tt
 4s   &6 A
A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)ri   rD   r<   r   warn)r%   ri   	cset_names      r   _detect_charsetz$MySQLDialect_mysqldb._detect_charset  sa    	 #-@I 9;;  	 	 	I#   88	s    ::c                     dS )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                     |dk    r|                     d           d S |                     d           t                                          ||           d S )Nr   TF)
autocommitr   set_isolation_level)r%   rO   levelr'   s      r   r   z(MySQLDialect_mysqldb.set_isolation_level)  s]    L  ''-----''...GG''(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 L L L L61 1 1 1f  ! ! !  $
 
 
A A A A A A A A Ar   r   )__doc__r0   baser   r   r   r   r    r
   r   r   r   r   dialectr   r   r   <module>r      s6  N N` 
			             ' ' ' ' ' ' ) ) ) ) ) )                  	 	 	 	 	$9 	 	 		 	 	 	 	M 	 	 	AA AA AA AA AA< AA AA AAH r   