
    "i4O                     B   d Z ddl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mZ 	 ddlZddlmZ n+# e$ r#Z ed                    e                    dZ[ww xY w	 ddlmZmZ dZn# e$ r dZY nw xY w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j+        j,        Z,ej+        j-        Z-ej+        j.        Z.ej+        j/        Z/ej+        j0        Z0d Z1 G d d          Z2 G d de          Z3 G d de          Z4dS )a  Django database Backend using MySQL Connector/Python.

This Django database backend is heavily based on the MySQL backend from Django.

Changes include:
* Support for microseconds (MySQL 5.6.3 and later)
* Using INFORMATION_SCHEMA where possible
* Using new defaults for, for example SQL_AUTO_IS_NULL

Requires and comes with MySQL Connector/Python v8.0.22 and later:
    http://dev.mysql.com/downloads/connector/python/
    N)datetime)settings)ImproperlyConfigured)IntegrityError)BaseDatabaseWrapper)utils)cached_property)	dateparsetimezone)MySQLConverterz)Error loading mysql.connector module: {0})datetime_to_mysqltime_to_mysqlTF   )DatabaseClient)DatabaseCreation)DatabaseIntrospection)DatabaseValidation)DatabaseFeatures)DatabaseOperations)DatabaseSchemaEditorc                    t           j        rt          j        |           rEt	          j        d| z  t                     t          j                    }t          j        | |          } | 	                    t          j
                                      d           } t          rt          |           S |                     d          S )NzGMySQL received a naive datetime (%s) while time zone support is active.tzinfoz%Y-%m-%d %H:%M:%S.%f)r   USE_TZr   is_naivewarningswarnRuntimeWarningget_default_timezone
make_aware
astimezoneutcreplace	HAVE_CEXTr   strftime)valuedefault_timezones     S/srv/django_bis/venv311/lib/python3.11/site-packages/mysql/connector/django/base.py$adapt_datetime_with_timezone_supportr)   U   s     DU## 	AM @BGH(* * *  (<>>'/?@@E  ..66d6CC 6 '''~~4555    c                   B    e Zd ZdZdZd Zd Zd ZddZd Z	d	 Z
d
 ZdS )CursorWrapperzWrapper around MySQL Connector/Python's cursor class.

    The cursor class is defined by the options passed to MySQL
    Connector/Python. If buffered option is True in those options,
    MySQLCursorBuffered will be used.
    )i  i  i  i  c                     || _         d S N)cursorselfr/   s     r(   __init__zCursorWrapper.__init__s   s    r*   c                     |s|S t          |          }|                                D ],\  }}t          |t                    rt	          |          ||<   -|S r.   )dictitems
isinstancer   r)   )r1   argsnew_argskeyr&   s        r(   _adapt_execute_args_dictz&CursorWrapper._adapt_execute_args_dictv   sa     	K::**,, 	L 	LJC%** L DU K Kr*   c                     |s|S t          |          }t          |          D ],\  }}t          |t                    rt	          |          ||<   -t          |          S r.   )list	enumerater6   r   r)   tuple)r1   r7   r8   iargs        r(   _adapt_execute_argsz!CursorWrapper._adapt_execute_args   sf     	K::oo 	H 	HFAs#x(( HB3GGXr*   Nc                 R   t          |t                    r|                     |          }n|                     |          }	 | j                            ||          S # t          j        j        $ r5}|j	        d         | j
        v rt          t          |j	                    d}~ww xY w)zExecutes the given operation

        This wrapper method around the execute()-method of the cursor is
        mainly needed to re-raise using different exceptions.
        r   N)r6   r4   r:   rA   r/   executemysql	connectorOperationalErrorr7   codes_for_integrityerrorr   r>   )r1   queryr7   r8   es        r(   rC   zCursorWrapper.execute   s     dD!! 	644T::HH//55H	;&&uh777/ 	 	 	vayD999$eAFmm44	s   A B&10B!!B&c                     	 | j                             ||          S # t          j        j        $ r5}|j        d         | j        v rt          t          |j                    d}~ww xY w)zExecutes the given operation

        This wrapper method around the executemany()-method of the cursor is
        mainly needed to re-raise using different exceptions.
        r   N)	r/   executemanyrD   rE   rF   r7   rG   r   r>   )r1   rH   r7   rI   s       r(   rK   zCursorWrapper.executemany   sm    	;**5$777/ 	 	 	vayD999$eAFmm44	s    A&0A!!A&c                 ,    t          | j        |          S )z"Return attribute of wrapped cursor)getattrr/   r1   attrs     r(   __getattr__zCursorWrapper.__getattr__   s    t{D)))r*   c                 *    t          | j                  S )z$Returns iterator over wrapped cursor)iterr/   r1   s    r(   __iter__zCursorWrapper.__iter__   s    DK   r*   r.   )__name__
__module____qualname____doc__rG   r2   r:   rA   rC   rK   rP   rT    r*   r(   r,   r,   e   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/d0d1d2d3d-d-d,d,d4Zd5Zd6d7d8d9d:d;d<Zh d=Z	e
j        ZeZeZeZeZeZeZeZ fd>Zd? Zd@ ZdA ZdB ZdRdDZ dE Z!dF Z"dG Z#dH Z$dRdIZ%dJ Z&e'dK             Z(e'dL             Z)e'dM             Z*e'dN             Z+e'dO             Z,e'dP             Z-e.dQ             Z/ xZ0S )SDatabaseWrapperrD   	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
mediumblobr_   tinytexttext
mediumtextrt   rr   z= %szLIKE %szLIKE BINARY %szREGEXP BINARY %sz	REGEXP %sz> %sz>= %sz< %sz<= %s)exactiexactcontains	icontainsregexiregex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('%%', {}))r   r   r   r   r   r   >   read committedrepeatable readread uncommittedserializablec                     t          t          |           j        |i | | j                            d          }|rq|                    dt
                     | _        |                    dt                    }t          |t                    st          d           |            | _
        d S t                      | _
        t
           | _        d S )NOPTIONSuse_pureconverter_classzXConverter class should be a subclass of mysql.connector.django.base.DjangoMySQLConverter)superr[   r2   settings_dictgetr$   	_use_pureDjangoMySQLConverter
issubclassProgrammingError	converter)r1   r7   kwargsoptionsr   	__class__s        r(   r2   zDatabaseWrapper.__init__  s    -ot$$-t>v>>>$((33 	,$[[]CCDN%kk!$ O o/CDD &G   -_..DNNN244T^"+mT^^^r*   c                 >    |                     d          rdS t          )Nmysql_isF)r   AttributeErrorrN   s     r(   rP   zDatabaseWrapper.__getattr__(  s!    ??:&& 	5r*   c                    ddddd}| j         }|d         r|d         |d<   |d         r|d         |d<   |d	         r|d	         |d
<   |d                             d          r|d         |d<   n|d         r|d         |d<   |d         rt          |d                   |d<   t          j        |d<   t
          j        j        j        j	        g|d<   	 |
                    |d                    n# t          $ r Y nw xY w|S )Nutf8TF)charsetuse_unicodebufferedconsume_resultsUSERuserNAMEdatabasePASSWORDpasswdHOST/unix_sockethostPORTportraise_on_warningsclient_flagsr   )r   r   intr   DEBUGrD   rE   	constants
ClientFlag
FOUND_ROWSupdateKeyError)r1   r   r   s      r(   get_connection_paramsz%DatabaseWrapper.get_connection_params-  sS   #	
 
 *  	3*62F6N  	7!.v!6F:$ 	9,Z8F8 ++C00 	3$1&$9F=!!6" 	3*62F6N  	8 v!677F6N '/n"# O%0;"
~	MM-	23333 	 	 	D	 s   C- -
C:9C:c                 N    d|vr
t           |d<   t          j        j        di |}|S )Nr   rY   )r   rD   rE   connect)r1   conn_paramscnxs      r(   get_new_connectionz"DatabaseWrapper.get_new_connectionS  s5     K//-AK)*o%4444
r*   c                    g }| j         j        r|                    d           |rT|                                 5 }|                    d                    |                     d d d            n# 1 swxY w Y   d| j        v rT	 |                     | j        d                    d S # t          $ r$ | 	                    | j        d                    Y d S w xY wd S )NzSET SQL_AUTO_IS_NULL = 0z; 
AUTOCOMMIT)
featuresis_sql_auto_is_null_enabledappendr/   rC   joinr   set_autocommitr   _set_autocommit)r1   assignmentsr/   s      r(   init_connection_statez%DatabaseWrapper.init_connection_stateZ  s5   =4 	;
 9::: 	7 7&tyy556667 7 7 7 7 7 7 7 7 7 7 7 7 7 7 4---G##D$6|$DEEEEE! G G G$$T%7%EFFFFFFG .-s#   )A//A36A3 B& &*CCNc                 R    | j                                         }t          |          S r.   )
connectionr/   r,   )r1   namer/   s      r(   create_cursorzDatabaseWrapper.create_cursorm  s#    ''))V$$$r*   c                 R    	 t          j        |            d S # t          $ r Y d S w xY wr.   )r   	_rollbackNotSupportedErrorrS   s    r(   r   zDatabaseWrapper._rollbackq  s@    	)$/////  	 	 	DD	s    
&&c                 ^    | j         5  || j        _        d d d            d S # 1 swxY w Y   d S r.   )wrap_database_errorsr   
autocommit)r1   r   s     r(   r   zDatabaseWrapper._set_autocommitw  sy    & 	4 	4)3DO&	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4s   "&&c                     |                                  5 }|                    d           ddd           n# 1 swxY w Y   dS )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/   rC   r0   s     r(   disable_constraint_checkingz+DatabaseWrapper.disable_constraint_checking{  s|     [[]] 	7fNN5666	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7ts   7;;c                     d| j         c| _         }	 |                                 5 }|                    d           ddd           n# 1 swxY w Y   || _         dS # || _         w xY w)zM
        Re-enable foreign key checks after they have been disabled.
        FzSET foreign_key_checks=1N)needs_rollbackr/   rC   )r1   r   r/   s      r(   enable_constraint_checkingz*DatabaseWrapper.enable_constraint_checking  s     /4T5H+^	1 ;&9:::; ; ; ; ; ; ; ; ; ; ; ; ; ; ; #1D.D0000s-   A AA AA AA 	A$c                    |                                  5 }|| j                            |          }|D ]}| j                            ||          }|s | j                            ||          }|D ]{\  }}}|                    d|d|d|d|d|d|d|d	|d
           |                                D ]2}	t          d|d|	d         d|d|d|	d         d|d|d          |	 ddd           dS # 1 swxY w Y   dS )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_columnsrC   fetchallr   )
r1   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<<VDD)  
*.*<*S*STZ\f*g*g'. "0@@TTR]  NK!68NNNN 433[[[***111;;;@V@V@V'KK)?)?)?	   $*??#4#4 	 	,n
 !+

GAJJJ


KKK '


,A,A,ACYCYCY  		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   CC<<D D c                 \    	 | j                                          dS # t          $ r Y dS w xY w)NTF)r   pingErrorrS   s    r(   	is_usablezDatabaseWrapper.is_usable  sF    	O  """ 4  	 	 	55	s    
++c                     dS )NMySQLrY   rS   s    r(   display_namezDatabaseWrapper.display_name  s    wr*   c                 .    | j         j        rdddd}|S i S )Nz`%(column)s` >= 0)rw   rx   ry   )r   !supports_column_check_constraints)r1   r   s     r(   data_type_check_constraintsz+DatabaseWrapper.data_type_check_constraints  s2    =: 	%+>(;-@! !
 %$	r*   c           	      T   |                                  5 }|                    d           |                                }d d d            n# 1 swxY w Y   |d         |d         |d         t          |d                   t          |d                   t          |d                   dS )	Na2  
                SELECT VERSION(),
                       @@sql_mode,
                       @@default_storage_engine,
                       @@sql_auto_is_null,
                       @@lower_case_table_names,
                       CONVERT_TZ('2001-01-01 01:00:00', 'UTC', 'UTC') IS NOT NULL
            r   r               )versionsql_modedefault_storage_enginesql_auto_is_nulllower_case_table_nameshas_zoneinfo_database)temporary_connectionrC   fetchonera   )r1   r/   rows      r(   mysql_server_dataz!DatabaseWrapper.mysql_server_data  s    &&(( 	$F NN     //##C	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 1vA&)!f $SV&*3q6ll%)#a&\\
 
 	
   *AAAc                     |                                  5 }|                    d           |                                d         cd d d            S # 1 swxY w Y   d S )NzSELECT VERSION()r   )r  rC   r	  r0   s     r(   mysql_server_infoz!DatabaseWrapper.mysql_server_info  s    &&(( 	(FNN-...??$$Q'	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(s   /AAAc                     |                                  }t          j        j        di |5 }|                                }d d d            n# 1 swxY w Y   |S )NrY   )r   rD   rE   r   get_server_version)r1   configconnserver_versions       r(   mysql_versionzDatabaseWrapper.mysql_version  s    ++--_$..v.. 	7$!4466N	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7s   AAAc                    |                                  5 }|                    d           |                                }d d d            n# 1 swxY w Y   t          |r|d                             d          nd          S )NzSELECT @@sql_moder   ,rY   )r/   rC   r	  setsplit)r1   r/   r  s      r(   r  zDatabaseWrapper.sql_mode  s    [[]] 	)fNN.///((H	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) X=8A;$$S)))2>>>r  c                     | j         S r.   )r   rS   s    r(   r   zDatabaseWrapper.use_pure  s
    ~r*   r.   )1rU   rV   rW   vendor
data_types_limited_data_types	operatorspattern_escpattern_opsisolation_levelsrD   rE   Databaser   SchemaEditorClassr   client_classr   creation_classr   features_classr   introspection_classr   	ops_classr   validation_classr2   rP   r   r   r   r   r   r   r   r   r   r   r	   r   r   r  r  r  r  propertyr   __classcell__)r   s   @r(   r[   r[      s^       F
-/ 	z 		
 	. 	V 	 	E 	 	. 	2 	( 		 	8 	*  	 !" 	V#$ #"#4 2%8.3'9  JH $#&$  I2 YK824.2, K   H,!L%N%N/"I), , , , ,(  
$ $ $L  G G G&% % % %  4 4 4  1 1 1& & & &P     _   _ 
 
 _
. ( ( _(
   _ ? ? _?   X    r*   r[   c                   4    e Zd ZdZddZddZd Zd Zd ZdS )	r   zCustom converter for Django.Nc                 P    t          j        |                    d                    S )zXReturn MySQL TIME data type as datetime.time()

        Returns datetime.time()
        zutf-8)r
   
parse_timedecode)r1   r&   dscs      r(   _TIME_to_pythonz$DjangoMySQLConverter._TIME_to_python  s!    
 #ELL$9$9:::r*   c                     |sdS t          j        | |          }|dS t          j        r4t	          j        |          r |                    t          j                  }|S )a  Connector/Python always returns naive datetime.datetime

        Connector/Python always returns naive timestamps since MySQL has
        no time zone support. Since Django needs non-naive, we need to add
        the UTC time zone.

        Returns datetime.datetime()
        Nr   )r   _DATETIME_to_pythonr   r   r   r   r#   r"   )r1   r&   r/  dts       r(   __DATETIME_to_pythonz)DjangoMySQLConverter.__DATETIME_to_python  sc      	4/e<<:4? 	1x044 	18<00B	r*   c                 ,    |                      |          S r.   _str_to_mysqlr1   r&   s     r(   _safestring_to_mysqlz)DjangoMySQLConverter._safestring_to_mysql      !!%(((r*   c                 ,    |                      |          S r.   r6  r8  s     r(   _safetext_to_mysqlz'DjangoMySQLConverter._safetext_to_mysql   r:  r*   c                 ,    |                      |          S r.   )_bytes_to_mysqlr8  s     r(   _safebytes_to_mysqlz(DjangoMySQLConverter._safebytes_to_mysql#  s    ##E***r*   r.   )	rU   rV   rW   rX   r0  )_DjangoMySQLConverter__DATETIME_to_pythonr9  r<  r?  rY   r*   r(   r   r     so        &&; ; ; ;   $) ) )) ) )+ + + + +r*   r   )5rX   r   sysr   django.confr   django.core.exceptionsr   	django.dbr   django.db.backends.base.baser   r   django.utils.functionalr	   django.utilsr
   r   mysql.connectorrD   mysql.connector.conversionr   ImportErrorerrformat_mysql_connectorr   r   r$   clientr   creationr   r   r   
validationr   r   r   
operationsr   schemar   rE   r   DatabaseErrorr   rF   r   r)   r,   r[   r   rY   r*   r(   <module>rT     s  :   



                   7 7 7 7 7 7 $ $ $ $ $ $ < < < < < <       3 3 3 3 3 3 , , , , , , , ,A9999999 A A A

3::3??A A AAAAAAAAAA II    III
 # " " " " " & & & & & & 0 0 0 0 0 0 * * * * * * & & & & & & * * * * * * ( ( ( ( ( ( 	-O5 ?3 ?3 6 6 6 I! I! I! I! I! I! I! I!XN N N N N) N N Nb
"+ "+ "+ "+ "+> "+ "+ "+ "+ "+s)   
A	 	A1A,,A15B   B
	B
