
    Evgk^                        d Z ddlZddl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 ddlmZmZ ddlmZ ddlmZ d Z eddg           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-m.Z. ed             Z/ G d d          Z0 G d de          Z1 G d d           Z2 G d! d"          Z3 G d# d$          Z4dS )%zc
Oracle database backend for Django.

Requires oracledb: https://oracle.github.io/python-oracledb/
    N)contextmanager)settings)ImproperlyConfigured)IntegrityError)BaseDatabaseWrapper)oracledb)debug_transaction)async_unsafe)force_bytes	force_str)cached_property)get_version_tuplec                 r   t          j                                                                        d          r_	 dd l}n$# t
          $ r}t          d|z            d }~ww xY w|                    d          }| D ]\  }}|                    ||           d S t          j
                            |            d S )NCYGWINr   z_Error loading ctypes: %s; the Oracle backend requires ctypes to operate correctly under Cygwin.kernel32)platformsystemupper
startswithctypesImportErrorr   CDLLSetEnvironmentVariableAosenvironupdate)r   r   er   namevalues         [/var/www/pixelcanvas.ch/venv/lib/python3.11/site-packages/django/db/backends/oracle/base.py_setup_environmentr!      s       ++H55 #	MMMM 	 	 	&2456  	 ;;z**" 	: 	:KD%,,T59999	: 	: 	
'"""""s   ? 
A 	AA )NLS_LANGz	.AL32UTF8)ORA_NCHAR_LITERAL_REPLACETRUE   )DatabaseClient)DatabaseCreation)DatabaseFeatures)DatabaseIntrospection)DatabaseOperations)DatabaseSchemaEditor)Oracle_datetimedsn)DatabaseValidationc               #     K   	 d V  d S # t           j        $ rk} | j        d         }t          |d          rHt          |d          r8|j        dk    r-d|j        v s	d|j        v rt          t          | j                    d } ~ ww xY w)Nr   codemessagei+  z	ORA-02291z	ORA-00001)DatabaseDatabaseErrorargshasattrr0   r1   r   tuple)r   xs     r    wrap_oracle_errorsr8   C   s      !    F1IAv	19%%	1 $	))[AI-E-E %--00's   
 BA&A??Bc                       e Zd ZddZdS )!_UninitializedOperatorsDescriptorNc                     |t          d          |                                                                 |j        d         S )Nz*operators not available as class attribute	operators)AttributeErrorcursorclose__dict__)selfinstanceclss      r    __get__z)_UninitializedOperatorsDescriptor.__get__^   sC      !MNNN!!! --    N)__name__
__module____qualname__rD    rE   r    r:   r:   ]   s(        . . . . . .rE   r:   c                   J    e Zd 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'd(d)d)d)d*Zd+Z e            Z	d,d-d.d/d0d1d2d3d.d.d/d/d4Z
i e
d5d6d5d5d6d6d7Zd8Zd9d:d;d<d=d>d?Zd@ e                                D             ZdA e                                D             ZeZeZeZeZeZeZeZeZ fdBZ dC Z!dD Z"e#dE             Z$ fdFZ%e#dPdH            Z&dI Z'dJ Z(dK Z)dPdLZ*dM Z+e,dN             Z-e,dO             Z. xZ/S )QDatabaseWrapperoracleOracle	AutoFieldz3NUMBER(11) GENERATED BY DEFAULT ON NULL AS IDENTITYBigAutoFieldz3NUMBER(19) GENERATED BY DEFAULT ON NULL AS IDENTITYBinaryFieldBLOBBooleanFieldz	NUMBER(1)	CharFieldzNVARCHAR2(%(max_length)s)	DateFieldDATEDateTimeField	TIMESTAMPDecimalFieldz*NUMBER(%(max_digits)s, %(decimal_places)s)DurationFieldzINTERVAL DAY(9) TO SECOND(6)	FileFieldFilePathField
FloatFieldzDOUBLE PRECISIONIntegerFieldz
NUMBER(11)	JSONFieldNCLOBBigIntegerFieldz
NUMBER(19)IPAddressFieldzVARCHAR2(15)GenericIPAddressFieldzVARCHAR2(39)z2NUMBER(5) GENERATED BY DEFAULT ON NULL AS IDENTITYzVARCHAR2(%(max_length)s)zVARCHAR2(32))OneToOneFieldPositiveBigIntegerFieldPositiveIntegerFieldPositiveSmallIntegerField	SlugFieldSmallAutoFieldSmallIntegerField	TextField	TimeFieldURLField	UUIDFieldz%(qn_column)s IN (0,1)z%(qn_column)s IS JSONz%(qn_column)s >= 0)rS   r_   re   rf   rg   )clobnclobblobz= %sz= UPPER(%s)zFLIKE TRANSLATE(%s USING NCHAR_CS) ESCAPE TRANSLATE('\' USING NCHAR_CS)zMLIKE UPPER(TRANSLATE(%s USING NCHAR_CS)) ESCAPE TRANSLATE('\' USING NCHAR_CS)z> %sz>= %sz< %sz<= %s)exactiexactcontains	icontainsgtgteltlter   endswithistartswith	iendswithzLIKEC %s ESCAPE '\'zLIKEC UPPER(%s) ESCAPE '\')rt   ru   r   rz   r{   r|   z@REPLACE(REPLACE(REPLACE({}, '\', '\\'), '%%', '\%%'), '_', '\_')z'%%' || {} || '%%'z'%%' || UPPER({}) || '%%'z
{} || '%%'zUPPER({}) || '%%'z
'%%' || {}z'%%' || UPPER({}))rt   ru   r   r{   rz   r|   c                 &    i | ]\  }}|d |z   dz   S )zLIKE TRANSLATE( z5 USING NCHAR_CS) ESCAPE TRANSLATE('\' USING NCHAR_CS)rJ   .0kvs      r    
<dictcomp>zDatabaseWrapper.<dictcomp>   s@        Aq 	
! %1 1  rE   c                 &    i | ]\  }}|d |z   dz   S )zLIKEC z ESCAPE '\'rJ   r~   s      r    r   zDatabaseWrapper.<dictcomp>   s4       -1Q8a<.(  rE   c                      t                      j        |i | | j        d                             dd          }|| j        _        d S )NOPTIONSuse_returning_intoT)super__init__settings_dictgetfeaturescan_return_columns_from_insert)rA   r4   kwargsr   	__class__s       r    r   zDatabaseWrapper.__init__   sU    $)&)))!/	:>> $
 
 8J444rE   c                     | j         S rF   )oracle_versionrA   s    r    get_database_versionz$DatabaseWrapper.get_database_version   s    ""rE   c                 R    | j         d                                         }d|v r|d= |S )Nr   r   )r   copyrA   conn_paramss     r    get_connection_paramsz%DatabaseWrapper.get_connection_params   s5    (388::;..01rE   c                 |    t          j        d| j        d         | j        d         t          | j                  d|S )NUSERPASSWORD)userpasswordr-   rJ   )r2   connectr   r-   r   s     r    get_new_connectionz"DatabaseWrapper.get_new_connection   sO     
#F+'
3D&''
 
 	
 
 	
rE   c                    t                                                       |                                 }|                    d           |                    dt          j        rdndz              |                                 d| j        vr|                                 }	 |                    d| j        d         z  dg           | j        | _	        | j
        | _        n-# t          j        $ r | j        | _	        | j        | _        Y nw xY w|                                 d	| j        _        |                                 s|                                  d S d S )
Nz+ALTER SESSION SET NLS_TERRITORY = 'AMERICA'zmALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS' NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF'z TIME_ZONE = 'UTC' r<   z!SELECT 1 FROM DUAL WHERE DUMMY %srt   X   )r   init_connection_statecreate_cursorexecuter   USE_TZr?   r@   _standard_operatorsr<   _standard_pattern_opspattern_opsr2   r3   _likec_operators_likec_pattern_ops
connectionstmtcachesizeget_autocommitcommit)rA   r>   r   s     r    r   z%DatabaseWrapper.init_connection_state  sr   %%'''##%%
 	DEEE
 	A'/>##B@	
 	
 	

 	dm++ ''))F>7.z:;E   "&!9#'#=   ) ; ; ;!%!6#'#:   ; LLNNN(*%""$$ 	KKMMMMM	 	s   #%C! !'D
DNc                 ,    t          | j        |           S rF   )FormatStylePlaceholderCursorr   )rA   r   s     r    r   zDatabaseWrapper.create_cursor/  s    +DOTBBBrE   c                     | j         vt          | d          5  t                      5  | j                                         cd d d            cd d d            S # 1 swxY w Y   d d d            d S # 1 swxY w Y   d S d S )NCOMMIT)r   r	   r8   r   r   s    r    _commitzDatabaseWrapper._commit3  s    ?&"422 0 04F4H4H 0 0--//0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 '&s4   A1A A1A	A1 A	!A11A58A5c                     | j         r:| j                            d| j                            |          z  dd           d S d S )Nz-- RELEASE SAVEPOINT %s (faked)z0.000)sqltime)queries_loggedqueries_logappendops
quote_name)rA   sids     r    _savepoint_commitz!DatabaseWrapper._savepoint_commit:  sb     	##<tx?R?RSV?W?WW#     	 	rE   c                 ^    | j         5  || j        _        d d d            d S # 1 swxY w Y   d S rF   )wrap_database_errorsr   
autocommit)rA   r   s     r    _set_autocommitzDatabaseWrapper._set_autocommitC  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d           dS # 1 swxY w Y   dS )zl
        Check constraints by setting them to immediate. Return them to deferred
        afterward.
        zSET CONSTRAINTS ALL IMMEDIATEzSET CONSTRAINTS ALL DEFERREDN)r>   r   )rA   table_namesr>   s      r    check_constraintsz!DatabaseWrapper.check_constraintsG  s    
 [[]] 	;fNN:;;;NN9:::	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	;s   +AAAc                 f    	 | j                                          dS # t          j        $ r Y dS w xY w)NTF)r   pingr2   Errorr   s    r    	is_usablezDatabaseWrapper.is_usableP  sH    	O  """ 4 ~ 	 	 	55	    00c                     |                                  5  t          d | j        j                            d          D                       cd d d            S # 1 swxY w Y   d S )Nc              3   4   K   | ]}t          |          V  d S rF   )int)r   r7   s     r    	<genexpr>z1DatabaseWrapper.oracle_version.<locals>.<genexpr>[  s(      LLAQLLLLLLrE   .)temporary_connectionr6   r   versionsplitr   s    r    r   zDatabaseWrapper.oracle_versionX  s    &&(( 	M 	MLL)@)F)Fs)K)KLLLLL	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	Ms   6AAAc                 4    t          t          j                  S rF   )r   r2   __version__r   s    r    oracledb_versionz DatabaseWrapper.oracledb_version]  s     !5666rE   rF   )0rG   rH   rI   vendordisplay_name
data_typesdata_type_check_constraints_limited_data_typesr:   r<   r   r   pattern_esc_pattern_opsitemsr   r   r2   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   __classcell__)r   s   @r    rL   rL   i   s       FLJM 	v 		
 	0 	V 	 	D 	7 	0 	4 	( 	 	W 	<  	.!" 	 #$ &#/ ,%10N) .#9  J> 1,#7 4%9# # 41133I U4 U V443 <
*2,*42  $ VK(0"* ( L  !&&((  
 5A5G5G5I5I   H,!L%N%N/"I)J J J J J# # #   
 
 \
) ) ) ) )V C C C \C0 0 0  4 4 4; ; ; ;   M M _M 7 7 _7 7 7 7 7rE   rL   c                       e Zd ZdZddZdS )OracleParama  
    Wrapper object for formatting parameters for Oracle. If the string
    representation of the value is large enough (greater than 4000 characters)
    the input size needs to be set as CLOB. Alternatively, if the parameter
    has an `input_size` attribute, then the value of the `input_size` attribute
    will be used instead. Otherwise, no input size will be set for the
    parameter when executing the query.
    Fc                 t   t           j        rCt          |t          j                  r)t          |t                    st	          j        |          }d}|j        j        j        }|s|du rd}n|du rd}t          |d          r|
                    |          | _        nt          |t          j        t          j        f          r|| _        nXt          ||j        |          | _        t          | j        t"                    r#t%          t          ||j        |                    }t          |d          r|j        | _        d S |dk    rt          j        | _        d S t          |t          j                  rt          j        | _        d S |r(t          |t,                    rt          j        | _        d S d | _        d S )Nr   Tr%   Fbind_parameter
input_sizei  )r   r   
isinstancedatetimer,   from_datetimedatabaser   &supports_boolean_expr_in_select_clauser5   r   r   r2   Binary	timedeltar   charsetstrlenr   DB_TYPE_CLOBDB_TYPE_TIMESTAMPboolDB_TYPE_BOOLEAN)rA   paramr>   strings_onlystring_sizehas_boolean_data_types         r    r   zOracleParam.__init__l  s    ? 	9uh/00	9uo66	9 $1%88EO$K 	 % 	}}%5*++ 
	T$33F;;D1CDEE 	T$D  )MMD$*C00 T!+eV^\"R"RSS5,'' 	##.DOOO4&3DOOOx011 	#&8DOOO" 	#z%'>'> 	#&6DOOO"DOOOrE   NF)rG   rH   rI   __doc__r   rJ   rE   r    r   r   b  s2         )# )# )# )# )# )#rE   r   c                   *    e Zd ZdZd Zd Zd Zd ZdS )VariableWrappera	  
    An adapter class for cursor variables that prevents the wrapped object
    from being converted into a string when used to instantiate an OracleParam.
    This can be used generally for any other object that should be passed into
    Cursor.execute as-is.
    c                     || _         d S rF   var)rA   r  s     r    r   zVariableWrapper.__init__  s    rE   c                     | j         S rF   r  )rA   r>   s     r    r   zVariableWrapper.bind_parameter  s	    xrE   c                 ,    t          | j        |          S rF   )getattrr  )rA   keys     r    __getattr__zVariableWrapper.__getattr__  s    tx%%%rE   c                 V    |dk    r|| j         |<   d S t          | j        ||           d S )Nr  )r@   setattrr  )rA   r  r   s      r    __setattr__zVariableWrapper.__setattr__  s7    %<<!&DM#DHc5)))))rE   N)rG   rH   rI   r   r   r   r  r  rJ   rE   r    r   r     sZ             & & &* * * * *rE   r   c                       e Zd ZdZdZd Zed             Zed             Zed             Z	d Z
d Zd	 ZddZddZddZd Zd Zd Zd Zd ZdS )r   z
    Django uses "format" (e.g. '%s') style placeholders, but Oracle uses ":var"
    style. This fixes it -- but note that if you want to use a literal "%s" in
    a query, you'll need to use "%%s".
    zutf-8c                 h    |                                 | _         | j        | j         _        || _        d S rF   )r>   _output_type_handleroutputtypehandlerr   )rA   r   r   s      r    r   z%FormatStylePlaceholderCursor.__init__  s-     ''))(,(A% rE   c                 P    d| v rt          j        |           nt          |           S )Nr   )decimalDecimalr   )r   s    r    _output_number_converterz5FormatStylePlaceholderCursor._output_number_converter  s%    ),wu%%%3u::ErE   c                     |dk    rt           S t          j        |           t          j        d                              |           fdS )Nr   )precr%   c                 V    t          j        |                                         S )N)context)r  r  quantize)r   r  quantize_values    r    <lambda>zEFormatStylePlaceholderCursor._get_decimal_converter.<locals>.<lambda>  s$    ++44^W4UU rE   )r   r  Contextr  scaleb)	precisionscaler  r  s     @@r    _get_decimal_converterz3FormatStylePlaceholderCursor._get_decimal_converter  sU    A::J/y111 ++22E6::UUUUUUrE   c                    |t           j        k    rw|dk    r|dk    rt          j        }n6t          }n.|dk    rt                              ||          }nt          j        }|                     t           j        d| j        |          S |t           j	        k    r&|                     t           j	        | j                  S dS )z
        Called for each db column fetched from cursors. Return numbers as the
        appropriate Python type, and NCLOB with JSON as strings.
        ir      )size	arraysizeoutconverter)r#  N)
r2   NUMBERr   r  floatr  r  STRINGr#  DB_TYPE_NCLOB)r>   r   defaultTypelengthr  r  r$  s          r    r  z1FormatStylePlaceholderCursor._output_type_handler  s     (/))}}>> $@#XLL $)LLQ  <RRu     <T:: *)	     H222::h4@P:QQQ 32rE   c                      	  fd|                                 D             S # t          $ r t           fd|D                       cY S w xY w)Nc                 :    i | ]\  }}|t          |d           S )Tr   )r   r   r   rA   s      r    r   z?FormatStylePlaceholderCursor._format_params.<locals>.<dictcomp>  s+    MMMdaA{1dD11MMMrE   c              3   :   K   | ]}t          |d           V  dS )TNr-  r   prA   s     r    r   z>FormatStylePlaceholderCursor._format_params.<locals>.<genexpr>  s/      DDQd33DDDDDDrE   )r   r=   r6   rA   paramss   ` r    _format_paramsz+FormatStylePlaceholderCursor._format_params  ss    	EMMMMfllnnMMMM 	E 	E 	EDDDDVDDDDDDDD	Es   # %A
Ac                 `   t          |d         d          rEi }|D ]-}|                                D ]\  }}|j        r
|j        ||<   .|r | j        di | d S d S d gt	          |d                   z  }|D ](}t          |          D ]\  }}|j        r
|j        ||<   )|r | j        |  d S d S )Nr   keysrJ   )r5   r   r   setinputsizesr   	enumerate)rA   params_listsizesr2  r   r   is          r    _guess_input_sizesz/FormatStylePlaceholderCursor._guess_input_sizes  s"   ;q>6** 	+E% 4 4 & 4 4HAu' 4#(#3a4  ,""++U+++++, , FSQ000E% 4 4 )& 1 1 4 4HAu' 4#(#3a4  +""E****+ +rE   c                 v    t          |d          rd |                                D             S d |D             S )Nr   c                 $    i | ]\  }}||j         S rJ   r   r~   s      r    r   zAFormatStylePlaceholderCursor._param_generator.<locals>.<dictcomp>  s     @@@AAq}@@@rE   c                     g | ]	}|j         
S rJ   r>  )r   r0  s     r    
<listcomp>zAFormatStylePlaceholderCursor._param_generator.<locals>.<listcomp>  s    222aAM222rE   )r5   r   r1  s     r    _param_generatorz-FormatStylePlaceholderCursor._param_generator  sD    67## 	3@@@@@@2262222rE   Fc                 X   |                     d          s|                     d          r
|d d         }|g }nt          |d          rd |D             }||z  }n|r~|r|d |D             }d t          t                              |                    D             fd|D             }d	                                 D             }|t          |          z  }n8d
 t          t          |                    D             }|t          |          z  }|| 	                    |          fS )N;/r5  c                     i | ]}|d |z  	S )z:%srJ   )r   r   s     r    r   z@FormatStylePlaceholderCursor._fix_for_params.<locals>.<dictcomp>  s    111QAuqy111rE   c                 0    g | ]}t          |          |fS rJ   )type)r   r   s     r    r@  z@FormatStylePlaceholderCursor._fix_for_params.<locals>.<listcomp>-  s#    DDDEDKK/DDDrE   c                      i | ]\  }}|d |z  S z:arg%drJ   )r   r:  
param_types      r    r   z@FormatStylePlaceholderCursor._fix_for_params.<locals>.<dictcomp>.  s2       !Az HqL  rE   c                      g | ]
}|         S rJ   rJ   )r   rK  params_dicts     r    r@  z@FormatStylePlaceholderCursor._fix_for_params.<locals>.<listcomp>2  s    JJJ
K
+JJJrE   c                      i | ]\  \  }}}||S rJ   rJ   )r   _r   placeholders       r    r   z@FormatStylePlaceholderCursor._fix_for_params.<locals>.<dictcomp>3  s/       '>z5;U  rE   c                     g | ]}d |z  S rJ  rJ   )r   r:  s     r    r@  z@FormatStylePlaceholderCursor._fix_for_params.<locals>.<listcomp>9  s    ???qX\???rE   )
rz   r5   r7  dictfromkeysr   r6   ranger   r3  )rA   queryr2  unify_by_valuesr4   param_typesrM  s         @r    _fix_for_paramsz,FormatStylePlaceholderCursor._fix_for_params  ss   
 >># 	%.."5"5 	#2#JE>FFVV$$ 	!11&111DTMEE 	! 	! EDVDDDK %.t}}[/I/I%J%J  K KJJJkJJJD BMBSBSBUBU  F U4[[ EE @?E#f++,>,>???DU4[[ Ed))&1111rE   Nc                    |                      ||d          \  }}|                     |g           t                      5  | j                            ||                     |                    cd d d            S # 1 swxY w Y   d S )NT)rV  )rX  r;  r8   r>   r   rA  )rA   rU  r2  s      r    r   z$FormatStylePlaceholderCursor.execute=  s    ,,UFD,QQv)))!! 	M 	M;&&ud.C.CF.K.KLL	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	Ms    .A;;A?A?c                 b    |sd S t          |          }                     |t          |                    \  }}|g fd|D             z   }                     |           t	                      5   j                            | fd|D                       cd d d            S # 1 swxY w Y   d S )Nc                 :    g | ]}                     |          S rJ   )r3  r/  s     r    r@  z<FormatStylePlaceholderCursor.executemany.<locals>.<listcomp>L  s'    $Q$Q$QT%8%8%;%;$Q$Q$QrE   c                 :    g | ]}                     |          S rJ   )rA  r/  s     r    r@  z<FormatStylePlaceholderCursor.executemany.<locals>.<listcomp>P  s'    DDDQ--a00DDDrE   )iterrX  nextr;  r8   r>   executemany)rA   rU  r2  params_iterfirstparams	formatteds   `     r    r_  z(FormatStylePlaceholderCursor.executemanyC  s    	46ll!11%k9J9JKK{ !M$Q$Q$Q$Q[$Q$Q$QQ		***!! 	 	;**DDDD)DDD 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   0'B$$B(+B(c                 f    	 | j                                          d S # t          j        $ r Y d S w xY wrF   )r>   r?   r2   InterfaceErrorr   s    r    r?   z"FormatStylePlaceholderCursor.closeS  sF    	K& 	 	 	DD	r   c                 :    t           | j        j        |           S rF   )r   r>   r  rA   r4   s     r    r  z FormatStylePlaceholderCursor.varZ  s    t{5666rE   c                 :    t           | j        j        |           S rF   )r   r>   arrayvarrf  s     r    rh  z%FormatStylePlaceholderCursor.arrayvar]  s    3t{3T:;;;rE   c                 ,    t          | j        |          S rF   )r  r>   )rA   attrs     r    r  z(FormatStylePlaceholderCursor.__getattr__`  s    t{D)))rE   c                 *    t          | j                  S rF   )r]  r>   r   s    r    __iter__z%FormatStylePlaceholderCursor.__iter__c  s    DK   rE   r   rF   )rG   rH   rI   r   r   r   staticmethodr  r  r  r3  r;  rA  rX  r   r_  r?   r  rh  r  rl  rJ   rE   r    r   r     sK         G! ! !
 F F \F V V \V $R $R \$RLE E E+ + +(3 3 3)2 )2 )2 )2VM M M M      7 7 7< < <* * *! ! ! ! !rE   r   )5r   r   r  r   r   
contextlibr   django.confr   django.core.exceptionsr   	django.dbr   django.db.backends.base.baser   &django.db.backends.oracle.oracledb_anyr   r2   django.db.backends.utilsr	   django.utils.asyncior
   django.utils.encodingr   r   django.utils.functionalr   django.utils.versionr   r!   clientr&   creationr'   r   r(   introspectionr)   
operationsr*   schemar+   utilsr,   r-   
validationr.   r8   r:   rL   r   r   r   rJ   rE   r    <module>r     s      				  % % % % % %             7 7 7 7 7 7 $ $ $ $ $ $ < < < < < < G G G G G G 6 6 6 6 6 6 - - - - - - 8 8 8 8 8 8 8 8 3 3 3 3 3 3 2 2 2 2 2 2# # #&   	" 	.   # " " " " " & & & & & & & & & & & & 0 0 0 0 0 0 * * * * * * ( ( ( ( ( ( ' ' ' ' ' ' ' ' * * * * * *   2	. 	. 	. 	. 	. 	. 	. 	.v7 v7 v7 v7 v7) v7 v7 v7r3# 3# 3# 3# 3# 3# 3# 3#l* * * * * * * *0t! t! t! t! t! t! t! t! t! t!rE   