
    h;                        d 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ZddlmZ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jN                  Z(e(dk  r edejR                  z        i eejT                  ejV                  iZ, ed      Z- G d d      Z. G d de	      Z/y	# e$ rZ ed
      ed	Z[ww xY w)za
MySQL database backend for Django.

Requires mysqlclient: https://pypi.org/project/mysqlclient/
    )ImproperlyConfigured)IntegrityError)utils)BaseDatabaseWrapper)async_unsafe)cached_property)_lazy_re_compileNz:Error loading MySQLdb module.
Did you install mysqlclient?)CLIENT
FIELD_TYPE)conversions   )DatabaseClient)DatabaseCreation)DatabaseFeatures)DatabaseIntrospection)DatabaseOperations)DatabaseSchemaEditor)DatabaseValidation)r      r   z4mysqlclient 1.4.0 or newer is required; you have %s.z(\d{1,2})\.(\d{1,2})\.(\d{1,2})c                   4    e Zd ZdZdZd Zd	dZd Zd Zd Z	y)
CursorWrappera6  
    A thin wrapper around MySQLdb's normal cursor class that catches particular
    exception instances and reraises them with the correct types.

    Implemented as a wrapper, rather than a subclass, so that it isn't stuck
    to the particular underlying representation returned by Connection.cursor().
    )i  i  i  i  c                     || _         y N)cursorselfr   s     `/var/www/html/ranktracker/api/venv/lib/python3.12/site-packages/django/db/backends/mysql/base.py__init__zCursorWrapper.__init__C   s	        Nc                     	 | j                   j                  ||      S # t        j                  $ r<}|j                  d   | j
                  v rt        t        |j                          d }~ww xY wNr   )r   executeDatabaseOperationalErrorargscodes_for_integrityerrorr   tupler   queryr%   es       r   r"   zCursorWrapper.executeF   sb    	;;&&ud33(( 	 vvayD999$eAFFm44	    A-7A((A-c                     	 | j                   j                  ||      S # t        j                  $ r<}|j                  d   | j
                  v rt        t        |j                          d }~ww xY wr!   )r   executemanyr#   r$   r%   r&   r   r'   r(   s       r   r-   zCursorWrapper.executemanyQ   sb    	;;**5$77(( 	 vvayD999$eAFFm44	r+   c                 .    t        | j                  |      S r   )getattrr   )r   attrs     r   __getattr__zCursorWrapper.__getattr__[   s    t{{D))r   c                 ,    t        | j                        S r   )iterr   r   s    r   __iter__zCursorWrapper.__iter__^   s    DKK  r   r   )
__name__
__module____qualname____doc__r&   r   r"   r-   r1   r5    r   r   r   r   4   s(     	*!r   r   c                      e Zd ZdZi dddddddd	d
ddddddddddddddddddddddddd d	dd!d"d#dd$d%d&d'd(d)Zd*Zd+d,d-d,d.d/d0d1d-d-d,d,d2Zd3Zd4d5d6d7d8d9d:Zh d;Z	e
Z
eZeZeZeZeZeZeZd< Zed=        Zd> ZedMd@       ZdA ZdB ZdC Z dD Z!dMdEZ"dF Z#e$dG        Z%e$dH        Z&e$dI        Z'e$dJ        Z(e$dK        Z)e$dL        Z*y?)NDatabaseWrappermysql	AutoFieldzinteger AUTO_INCREMENTBigAutoFieldzbigint AUTO_INCREMENTBinaryFieldlongblobBooleanFieldbool	CharFieldzvarchar(%(max_length)s)	DateFielddateDateTimeFieldzdatetime(6)DecimalFieldz+numeric(%(max_digits)s, %(decimal_places)s)DurationFieldbigint	FileFieldFilePathField
FloatFieldzdouble precisionIntegerFieldintegerBigIntegerFieldIPAddressFieldzchar(15)GenericIPAddressFieldzchar(39)	JSONFieldjsonzbigint UNSIGNEDzinteger UNSIGNEDzsmallint UNSIGNEDzsmallint AUTO_INCREMENTsmallintlongtextztime(6)zchar(32))NullBooleanFieldOneToOneFieldPositiveBigIntegerFieldPositiveIntegerFieldPositiveSmallIntegerField	SlugFieldSmallAutoFieldSmallIntegerField	TextField	TimeField	UUIDField)	tinyblobblob
mediumblobrA   tinytexttext
mediumtextrV   rT   z= %szLIKE %szLIKE BINARY %sz> %sz>= %sz< %sz<= %s)exactiexactcontains	icontainsgtgteltlte
startswithendswithistartswith	iendswithzCREPLACE(REPLACE(REPLACE({}, '\\', '\\\\'), '%%', '\%%'), '_', '\_')z"LIKE BINARY CONCAT('%%', {}, '%%')zLIKE CONCAT('%%', {}, '%%')zLIKE BINARY CONCAT({}, '%%')zLIKE CONCAT({}, '%%')zLIKE BINARY CONCAT('%%', {})zLIKE CONCAT('%%', {}))rj   rk   rp   rr   rq   rs   >   repeatable readread uncommittedserializableread committedc                 T   t         dd}| j                  }|d   r|d   |d<   |d   r|d   |d<   |d   r|d   |d<   |d	   j                  d
      r	|d	   |d<   n|d	   r|d	   |d<   |d   rt        |d         |d<   t        j
                  |d<   |d   j                         }|j                  dd      }|rY|j                         }|| j                  vr;t        d|ddj                  d t        | j                        D              d      || _        |j                  |       |S )Nutf8)convcharsetUSERuserNAMEdbPASSWORDpasswdHOST/unix_sockethostPORTportclient_flagOPTIONSisolation_levelrw   z%Invalid transaction isolation level 'z' specified.
Use one of z, c              3   &   K   | ]	  }d |z    yw)z'%s'Nr:   ).0ss     r   	<genexpr>z8DatabaseWrapper.get_connection_params.<locals>.<genexpr>   s     !T&1*!Ts   z
, or None.)django_conversionssettings_dictrp   intr
   
FOUND_ROWScopypoplowerisolation_levelsr   joinsortedr   update)r   kwargsr   optionsr   s        r   get_connection_paramsz%DatabaseWrapper.get_connection_params   sW   &
 ** *62F6N (0F4L$,Z8F8 ++C0$1&$9F=!6"*62F6N  v!67F6N !' 1 1}	*//1!++&79IJ-335Od&;&;;* (		!TfT=R=R6S!TT   /gr   c                 ,    t        j                  di |S )Nr:   )r#   connect)r   conn_paramss     r   get_new_connectionz"DatabaseWrapper.get_new_connection   s    .+..r   c                 V   g }| j                   j                  r|j                  d       | j                  r,|j                  d| j                  j	                         z         |r:| j                         5 }|j                  dj                  |             d d d        y y # 1 sw Y   y xY w)NzSET SQL_AUTO_IS_NULL = 0z*SET SESSION TRANSACTION ISOLATION LEVEL %sz; )featuresis_sql_auto_is_null_enabledappendr   upperr   r"   r   )r   assignmentsr   s      r   init_connection_statez%DatabaseWrapper.init_connection_state   s    ==44
 9:KdNbNbNhNhNjjk 7&tyy567 7 7 7s   4!BB(Nc                 L    | j                   j                         }t        |      S r   )
connectionr   r   )r   namer   s      r   create_cursorzDatabaseWrapper.create_cursor   s    '')V$$r   c                 b    	 t        j                  |        y # t        j                  $ r Y y w xY wr   )r   	_rollbackr#   NotSupportedErrorr4   s    r   r   zDatabaseWrapper._rollback  s-    	))$/)) 		s    ..c                 |    | j                   5  | j                  j                  |       d d d        y # 1 sw Y   y xY wr   )wrap_database_errorsr   
autocommit)r   r   s     r   _set_autocommitzDatabaseWrapper._set_autocommit  s2    && 	3OO&&z2	3 	3 	3s   2;c                 p    | j                         5 }|j                  d       ddd       y# 1 sw Y   yxY w)z
        Disable foreign key checks, primarily for use in adding rows with
        forward references. Always return True to indicate constraint checks
        need to be re-enabled.
        zSET foreign_key_checks=0NT)r   r"   r   s     r   disable_constraint_checkingz+DatabaseWrapper.disable_constraint_checking  s2     [[] 	7fNN56	7	7s   ,5c                     d| j                   c| _         }	 | j                         5 }|j                  d       ddd       || _         y# 1 sw Y   xY w# || _         w xY w)zM
        Re-enable foreign key checks after they have been disabled.
        FzSET foreign_key_checks=1N)needs_rollbackr   r"   )r   r   r   s      r   enable_constraint_checkingz*DatabaseWrapper.enable_constraint_checking  s`     /4T5H5H+^	1 ;&9:; #1D; ; #1Ds!   A AA AA 	Ac                    | j                         5 }|| j                  j                  |      }|D ]  }| j                  j                  ||      }|s"| j                  j	                  ||      }|D ]k  \  }}}|j                  d|d|d|d|d|d|d|d	|d
       |j                         D ](  }	t        d|d|	d   d|d|d|	d   d|d|d       m  	 ddd       y# 1 sw Y   yxY w)a]  
        Check each table name in `table_names` for rows with invalid foreign
        key references. This method is intended to be used in conjunction with
        `disable_constraint_checking()` and `enable_constraint_checking()`, to
        determine if rows with invalid references were entered while constraint
        checks were off.
        Nz+
                        SELECT REFERRING.`z`, REFERRING.`z` FROM `z2` as REFERRING
                        LEFT JOIN `z5` as REFERRED
                        ON (REFERRING.`z` = REFERRED.`z,`)
                        WHERE REFERRING.`z` IS NOT NULL AND REFERRED.`z"` IS NULL
                        zThe row in table 'z' with primary key 'r   z' has an invalid foreign key: .z contains a value 'r   z.' that does not have a corresponding value in )r   introspectiontable_namesget_primary_key_columnget_key_columnsr"   fetchallr   )
r   r   r   
table_nameprimary_key_column_namekey_columnscolumn_namereferenced_table_namereferenced_column_namebad_rows
             r   check_constraintsz!DatabaseWrapper.check_constraints"  s    [[] 	f""00<<VD) 
*.*<*<*S*STZ\f*g'."00@@TR] NK!68NNN 4[*1;@V')?	 $*??#4 	,
 !+GAJ
K '
,ACY 		 	 	s   CC++C4c                 l    	 | j                   j                          y# t        j                  $ r Y yw xY w)NTF)r   pingr#   Errorr4   s    r   	is_usablezDatabaseWrapper.is_usableJ  s4    	OO  "  ~~ 		s    33c                 "    | j                   rdS dS )NMariaDBMySQL)mysql_is_mariadbr4   s    r   display_namezDatabaseWrapper.display_nameR  s     11y>w>r   c                     | j                   j                  r(dddd}| j                  r| j                  dk  rd|d<   |S i S )Nz`%(column)s` >= 0)rY   rZ   r[   )
   r      zJSON_VALID(`%(column)s`)rS   )r   !supports_column_check_constraintsr   mysql_version)r   r   s     r   data_type_check_constraintsz+DatabaseWrapper.data_type_check_constraintsV  sQ    ==::+>(;-@!
 $$););j)H 2L!+.$$	r   c                     | j                         5 }|j                  d       |j                         d   cd d d        S # 1 sw Y   y xY w)NzSELECT VERSION()r   )temporary_connectionr"   fetchoner   s     r   mysql_server_infoz!DatabaseWrapper.mysql_server_infoe  sA    &&( 	(FNN-.??$Q'	( 	( 	(s	   $?Ac                     t         j                  | j                        }|st        d| j                  z        t	        d |j                         D              S )Nz8Unable to determine MySQL version from version string %rc              3   2   K   | ]  }t        |        y wr   )r   )r   xs     r   r   z0DatabaseWrapper.mysql_version.<locals>.<genexpr>p  s     4SV4s   )server_version_rematchr   	Exceptionr'   groups)r   r   s     r   r   zDatabaseWrapper.mysql_versionk  sJ    !''(>(>?VY]YoYoopp4U\\^444r   c                 :    d| j                   j                         v S )Nmariadb)r   r   r4   s    r   r   z DatabaseWrapper.mysql_is_mariadbr  s    D2288:::r   c                     | j                         5 }|j                  d       |j                         }d d d        t        r|d   j	                  d            S d      S # 1 sw Y   .xY w)NzSELECT @@sql_moder   ,r:   )r   r"   r   setsplit)r   r   sql_modes      r   r   zDatabaseWrapper.sql_modev  sa    [[] 	)fNN./(H	) X8A;$$S)>>2>>	) 	)s   "A  A)r   )+r6   r7   r8   vendor
data_types_limited_data_types	operatorspattern_escpattern_opsr   r#   r   SchemaEditorClassr   client_classr   creation_classr   features_classr   introspection_classr   	ops_classr   validation_classr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r:   r   r   r<   r<   b   s[   F
-/ 	z 		
 	. 	V 	 	E 	 	. 	2 	( 		 	8 	*  	 !" 	V#$ #"#4 2%8.3'9JH $&$ I. YK824.2,K H,!L%N%N/"I)#J / /7  % %31&P ? ?   ( (
 5 5 ; ; ? ?r   r<   )0r9   django.core.exceptionsr   	django.dbr   django.db.backendsr   backend_utilsdjango.db.backends.base.baser   django.utils.asyncior   django.utils.functionalr   django.utils.regex_helperr	   MySQLdbr#   ImportErrorerrMySQLdb.constantsr
   r   MySQLdb.convertersr   clientr   creationr   r   r   r   r   
operationsr   schemar   
validationr   version_infoversion__version__TIMEtypecast_timer   r   r   r<   r:   r   r   <module>r     s   
 8 $ 5 < - 3 6 1 * # & & 0 * ( *



Y
UX`XlXll
mm334  %%GH +! +!\Y?) Y?e  
	' s   C
 
C	CC