
    hk^                        S r SSKrSSKrSSKrSSKrSSKJr  SSKJr  SSK	J
r
  SSKJr  SSKJr  SSKJr  SS	KJr  SS
KJr  SSKJrJr  SSKJr  SSKJr  S r\" SS/5        SSKJr  SSK J!r!  SSK"J#r#  SSK$J%r%  SSK&J'r'  SSK(J)r)  SSK*J+r+J,r,  SSK-J.r.  \S 5       r/ " S S5      r0 " S S\5      r1 " S S 5      r2 " S! S"5      r3 " S# S$5      r4g)%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                 V   [         R                  " 5       R                  5       R                  S5      (       a3   SS KnUR                  S5      nU  H  u  pEUR                  XE5        M     g [        R                  R                  U 5        g ! [
         a  n[        SU-  5      eS nAff = f)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         P/var/www/html/env/lib/python3.13/site-packages/django/db/backends/oracle/base.py_setup_environmentr!      s      ++H55	 ;;z*"KD,,T9 # 	

'"  	&2456 	s   B 
B(B##B()NLS_LANGz	.AL32UTF8)ORA_NCHAR_LITERAL_REPLACETRUE   )DatabaseClient)DatabaseCreation)DatabaseFeatures)DatabaseIntrospection)DatabaseOperations)DatabaseSchemaEditor)Oracle_datetimedsn)DatabaseValidationc               #   H  #     S v   g ! [         R                   a  n U R                  S   n[        US5      (       a\  [        US5      (       aK  UR                  S:X  a;  SUR
                  ;   d  SUR
                  ;   a  [        [        U R                  5      6 ee S n A ff = f7f)Nr   codemessagei+  z	ORA-02291z	ORA-00001)DatabaseDatabaseErrorargshasattrr0   r1   r   tuple)r   xs     r    wrap_oracle_errorsr8   C   s     !!  FF1IAv9%%$		)[AII-E %-00's%   B"	 B"BA=BBB"c                       \ rS rSrSS jrSrg)!_UninitializedOperatorsDescriptor]   Nc                 x    Uc  [        S5      eUR                  5       R                  5         UR                  S   $ )Nz*operators not available as class attribute	operators)AttributeErrorcursorclose__dict__)selfinstanceclss      r    __get__)_UninitializedOperatorsDescriptor.__get__^   s:      !MNN!  --     N)__name__
__module____qualname____firstlineno__rE   __static_attributes__rH   rG   r    r:   r:   ]   s    .rG   r:   c                     ^ \ rS rSrSrSr0 SS_SS_SS	_S
S_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_S S!_S"S#_SSSSSS$SSSS%S&S'.ErS(S)S*S*S*S+.rS,r\	" 5       r
S-S.S/S0S1S2S3S4S/S/S0S0S5.r0 \ES6S7S6S6S7S7S8.ErS9rS:S;S<S=S>S?S@.r\R                  5        V VVs0 s H  u  pUSAU-   SB-   _M     snnn r\R                  5        V VVs0 s H  u  pUSCU-   SD-   _M     snnn r\r\r\r\r\r\r\r\r U4SE jr!SF r"SG r#\$SH 5       r%U4SI jr&\$SSSJ j5       r'SK r(SL r)SM r*SSSN jr+SO r,\-SP 5       r.\-SQ 5       r/SRr0U=r1$ s  snnn f s  snnn f )TDatabaseWrapperi   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)rX   rd   rj   rk   rl   )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 '\')ry   rz   r   r   r   r   z@REPLACE(REPLACE(REPLACE({}, '\', '\\'), '%%', '\%%'), '_', '\_')z'%%' || {} || '%%'z'%%' || UPPER({}) || '%%'z
{} || '%%'zUPPER({}) || '%%'z
'%%' || {}z'%%' || UPPER({}))ry   rz   r   r   r   r   zLIKE TRANSLATE( z5 USING NCHAR_CS) ESCAPE TRANSLATE('\' USING NCHAR_CS)zLIKEC z ESCAPE '\'c                    > [         TU ]  " U0 UD6  U R                  S   R                  SS5      nX0R                  l        g )NOPTIONSuse_returning_intoT)super__init__settings_dictgetfeaturescan_return_columns_from_insert)rB   r4   kwargsr   	__class__s       r    r   DatabaseWrapper.__init__   sC    $)&)!//	:>> $
 8J4rG   c                     U R                   $ rI   )oracle_versionrB   s    r    get_database_version$DatabaseWrapper.get_database_version   s    """rG   c                 R    U R                   S   R                  5       nSU;   a  US	 U$ )Nr   r   )r   copyrB   conn_paramss     r    get_connection_params%DatabaseWrapper.get_connection_params   s2    ((388:;.01rG   c                     [         R                  " SU R                  S   U R                  S   [        U R                  5      S.UD6$ )NUSERPASSWORD)userpasswordr-   rH   )r2   connectr   r-   r   s     r    get_new_connection"DatabaseWrapper.get_new_connection   sN     
##F+''
3D&&'
 	
 	
rG   c                   > [         TU ]  5         U R                  5       nUR                  S5        UR                  S[        R
                  (       a  SOS-   5        UR                  5         SU R                  ;  af  U R                  5       n UR                  SU R                  S   -  S/5        U R                  U l	        U R                  U l        UR                  5         S	U R                   l        U R%                  5       (       d  U R'                  5         g g ! [        R                   a%    U R                  U l	        U R                  U l         Nf = f)
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 %sry   X   )r   init_connection_statecreate_cursorexecuter   USE_TZr@   rA   _standard_operatorsr=   _standard_pattern_opspattern_opsr2   r3   _likec_operators_likec_pattern_ops
connectionstmtcachesizeget_autocommitcommit)rB   r?   r   s     r    r   %DatabaseWrapper.init_connection_state  s%   %'##%
 	DE
 	A'/#B@	

 	dmm+ '')F>7..z:;E "&!9!9#'#=#= LLN(*%""$$KKM % )) ;!%!6!6#'#:#: ;s   #D 6EEc                 .    [        U R                  U 5      $ rI   )FormatStylePlaceholderCursorr   )rB   r   s     r    r   DatabaseWrapper.create_cursor/  s    +DOOTBBrG   c                     U R                   bD  [        U S5         [        5          U R                   R                  5       sS S S 5        sS S S 5        $ g ! , (       d  f       O= fS S S 5        g ! , (       d  f       g = f)NCOMMIT)r   r	   r8   r   r   s    r    _commitDatabaseWrapper._commit3  sQ    ??&"424F4H--/ 5I4H22 '4H4H222s!   A-A	A-
A!	A--
A;c                     U R                   (       a;  U R                  R                  SU R                  R	                  U5      -  SS.5        g g )Nz-- RELEASE SAVEPOINT %s (faked)z0.000)sqltime)queries_loggedqueries_logappendops
quote_name)rB   sids     r    _savepoint_commit!DatabaseWrapper._savepoint_commit:  sD    ##<txx?R?RSV?WW# rG   c                 p    U R                      XR                  l        S S S 5        g ! , (       d  f       g = frI   )wrap_database_errorsr   
autocommit)rB   r   s     r    _set_autocommitDatabaseWrapper._set_autocommitC  s!    &&)3OO& '&&s   '
5c                     U R                  5        nUR                  S5        UR                  S5        SSS5        g! , (       d  f       g= f)zT
Check constraints by setting them to immediate. Return them to deferred
afterward.
zSET CONSTRAINTS ALL IMMEDIATEzSET CONSTRAINTS ALL DEFERREDN)r?   r   )rB   table_namesr?   s      r    check_constraints!DatabaseWrapper.check_constraintsG  s3    
 [[]fNN:;NN9: ]]s	   #=
Ac                 n     U R                   R                  5         g! [        R                   a     gf = f)NTF)r   pingr2   Errorr   s    r    	is_usableDatabaseWrapper.is_usableP  s4    	OO  "  ~~ 		    44c                     U R                  5          [        S U R                  R                  R	                  S5       5       5      sS S S 5        $ ! , (       d  f       g = f)Nc              3   8   #    U  H  n[        U5      v   M     g 7frI   )int).0r7   s     r    	<genexpr>1DatabaseWrapper.oracle_version.<locals>.<genexpr>[  s     L)KAQ)Ks   .)temporary_connectionr6   r   versionsplitr   s    r    r   DatabaseWrapper.oracle_versionX  s=    &&(L)@)@)F)Fs)KLL )((s   5A
Ac                 4    [        [        R                  5      $ rI   )r   r2   __version__r   s    r    oracledb_version DatabaseWrapper.oracledb_version]  s     !5!566rG   )r=   r   rI   )2rJ   rK   rL   rM   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   rN   __classcell__)r   kvr   s   000@r    rP   rP   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3I U4 U V443<
*2,*42$ VK(0"* (L !&&( )DA 	
! %1 1 	1( 6B5G5G5I5ITQ8a<.((5I H,!L%N%N/"I)J# 
 
)V C C04; M M 7 7M
s   D>	ErP   c                   "    \ rS rSrSrSS jrSrg)OracleParamib  a  
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.
c                    [         R                  (       aJ  [        U[        R                  5      (       a+  [        U[        5      (       d  [        R
                  " U5      nSnUR                  R                  R                  nU(       d  USL a  SnOUSL a  Sn[        US5      (       a  UR                  U5      U l        O[        U[        R                  [        R                  45      (       a  Xl        OY[        XR                   U5      U l        [        U R                  ["        5      (       a  [%        [        XR                   U5      5      n[        US5      (       a  UR&                  U l        g US:  a  [        R(                  U l        g [        U[        R                  5      (       a  [        R*                  U l        g U(       a+  [        U[,        5      (       a  [        R.                  U l        g S U l        g )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)rB   paramr?   strings_onlystring_sizehas_boolean_data_types         r    r   OracleParam.__init__l  sg    ??uh//00uo66#11%8EOO$$KK 	 %}%5*++$33F;D1C1CDEE$  )MD$**C00!+e^^\"RS5,''#..DO4&33DOx0011&88DO"z%'>'>&66DO"DOrG   )r   r   NF)rJ   rK   rL   rM   __doc__r   rN   rH   rG   r    r   r   b  s    )#rG   r   c                   0    \ rS rSrSrS rS rS rS rSr	g)	VariableWrapperi  z
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                     Xl         g rI   var)rB   r  s     r    r   VariableWrapper.__init__  s    rG   c                     U R                   $ rI   r  )rB   r?   s     r    r   VariableWrapper.bind_parameter  s    xxrG   c                 .    [        U R                  U5      $ rI   )getattrr  )rB   keys     r    __getattr__VariableWrapper.__getattr__  s    txx%%rG   c                 Z    US:X  a  X R                   U'   g [        U R                  X5        g )Nr  )rA   setattrr  )rB   r  r   s      r    __setattr__VariableWrapper.__setattr__  s#    %<!&MM#DHHc)rG   r  N)
rJ   rK   rL   rM   r  r   r   r  r  rN   rH   rG   r    r  r    s    &*rG   r  c                       \ rS rSrSrSrS r\S 5       r\S 5       r	\S 5       r
S rS	 rS
 rSS jrSS jrSS jrS rS rS rS rS rSrg)r   i  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                 p    UR                  5       U l         U R                  U R                   l        X l        g rI   )r?   _output_type_handleroutputtypehandlerr   )rB   r   r   s      r    r   %FormatStylePlaceholderCursor.__init__  s)     '')(,(A(A% rG   c                 P    SU ;   a  [         R                  " U 5      $ [        U 5      $ )Nr   )decimalDecimalr   )r   s    r    _output_number_converter5FormatStylePlaceholderCursor._output_number_converter  s     ),wu%E3u:ErG   c                    ^^ US:X  a  [         $ [        R                  " U S9m[        R                  " S5      R	                  U* 5      mUU4S j$ )Nr   )precr%   c                 L   > [         R                  " U 5      R                  TTS9$ )N)context)r&  r'  quantize)r   r-  quantize_values    r    <lambda>EFormatStylePlaceholderCursor._get_decimal_converter.<locals>.<lambda>  s    +44^W4UrG   )r   r&  Contextr'  scaleb)	precisionscaler-  r/  s     @@r    _get_decimal_converter3FormatStylePlaceholderCursor._get_decimal_converter  s>    A:J//y1 +22E6:UUrG   c                    U[         R                  :X  az  US:X  a  US:X  a  [        R                  nO3[        nO,US:  a  [        R                  XE5      nO[        R                  nU R                  [         R                  SU R                  US9$ U[         R                  :X  a(  U R                  [         R                  U R                  S9$ g)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(  floatr6  r  STRINGr;  DB_TYPE_NCLOB)r?   r   defaultTypelengthr4  r5  r<  s          r    r"  1FormatStylePlaceholderCursor._output_type_handler  s     (//)}> $@#X#XL $)LQ  <RR   <TT:: **)	    H222::h44@P@P:QQ 3rG   c           
         ^   UR                  5        VVs0 s H  u  p#U[        UT S5      _M     snn$ s  snnf ! [         a    [        U 4S jU 5       5      s $ f = f)NTc              3   >   >#    U  H  n[        UTS 5      v   M     g7f)TN)r   )r   prB   s     r    r   >FormatStylePlaceholderCursor._format_params.<locals>.<genexpr>  s     DVQd33Vs   )r   r   r>   r6   )rB   paramsr   r   s   `   r    _format_params+FormatStylePlaceholderCursor._format_params  sY    	E>DllnMndaA{1dD11nMMM 	EDVDDD	Es   : 4: : AAc                    [        US   S5      (       a`  0 nU H=  nUR                  5        H&  u  pEUR                  (       d  M  UR                  X$'   M(     M?     U(       a  U R                  " S0 UD6  g g S /[	        US   5      -  nU H8  n[        U5       H&  u  peUR                  (       d  M  UR                  X&'   M(     M:     U(       a  U R                  " U6   g g )Nr   keysrH   )r5   r   r   setinputsizesr  	enumerate)rB   params_listsizesrH  r   r   is          r    _guess_input_sizes/FormatStylePlaceholderCursor._guess_input_sizes  s    ;q>6**E% &HA'''#(#3#3 !/ & ""+U+  FSQ00E% )& 1HA'''#(#3#3 !2 & ""E* rG   c                     [        US5      (       a/  UR                  5        VVs0 s H  u  p#X#R                  _M     snn$ U Vs/ s H  oDR                  PM     sn$ s  snnf s  snf )Nr   )r5   r   r   )rB   rH  r   r   rF  s        r    _param_generator-FormatStylePlaceholderCursor._param_generator  sS    67##17@A}}$@@+126aMM622 A2s   AA#c                    UR                  S5      (       d  UR                  S5      (       a  US S nUc  / nGO[        US5      (       a  U Vs0 s H  oDSU-  _M
     nnX-  nOU(       a  U(       a  U Vs/ s H  n[        U5      U4PM     nn[        [        R                  U5      5       VV	s0 s H  u  pU	SU-  _M     n
nn	U V	s/ s H  oU	   PM	     nn	U
R                  5        VVVs0 s H
  u  u  poU_M     nnnnU[        U5      -  nO5[        [        U5      5       Vs/ s H  nSU-  PM
     nnU[        U5      -  nXR                  U5      4$ s  snf s  snf s  sn	nf s  sn	f s  snnnf s  snf )N;/rL  z:%sz:arg%d)r   r5   typerN  dictfromkeysr   r6   ranger  rI  )rB   queryrH  unify_by_valuesr   r4   r  param_typesrQ  
param_typeparams_dict_placeholders                r    _fix_for_params,FormatStylePlaceholderCursor._fix_for_params  s   
 >>#%.."5"5#2JE>FVV$$*01&QuqyL&D1ME >DDVEDK/VKD &/t}}[/I%J%JMA HqL(%J   ?JJk

+kDJBMBSBSBUBU'>z;U"BU   U4[ E -2#f+,>?,>qX\,>D?U4[ E))&111= 2  E K @s$   E6E0E"	E(-E-'E4Nc                     U R                  XSS9u  pU R                  U/5        [        5          U R                  R	                  XR                  U5      5      sS S S 5        $ ! , (       d  f       g = f)NT)r`  )rf  rR  r8   r?   r   rU  )rB   r_  rH  s      r    r   $FormatStylePlaceholderCursor.execute=  sX    ,,UD,Q)!;;&&u.C.CF.KL "!!s   *A##
A1c           
         U(       d  g [        U5      nU R                  U[        U5      5      u  pU/U Vs/ s H  oPR                  U5      PM     sn-   nU R	                  U5        [        5          U R                  R                  X Vs/ s H  oPR                  U5      PM     sn5      sS S S 5        $ s  snf s  snf ! , (       d  f       g = frI   )	iterrf  nextrI  rR  r8   r?   executemanyrU  )rB   r_  rH  params_iterfirstparamsrF  	formatteds          r    rm  (FormatStylePlaceholderCursor.executemanyC  s    6l!11%k9JK !M[$Q[%8%8%;[$QQ		*!;;**)D)Q--a0)D "! %R E "!s#   B51B?B:%B?:B??
Cc                 n     U R                   R                  5         g ! [        R                   a     g f = frI   )r?   r@   r2   InterfaceErrorr   s    r    r@   "FormatStylePlaceholderCursor.closeS  s/    	KK&& 		r   c                 F    [        U R                  R                  " U6 5      $ rI   )r  r?   r  rB   r4   s     r    r   FormatStylePlaceholderCursor.varZ  s    t{{566rG   c                 F    [        U R                  R                  " U6 5      $ rI   )r  r?   arrayvarrv  s     r    ry  %FormatStylePlaceholderCursor.arrayvar]  s    t{{33T:;;rG   c                 .    [        U R                  U5      $ rI   )r  r?   )rB   attrs     r    r  (FormatStylePlaceholderCursor.__getattr__`  s    t{{D))rG   c                 ,    [        U R                  5      $ rI   )rk  r?   r   s    r    __iter__%FormatStylePlaceholderCursor.__iter__c  s    DKK  rG   )r?   r   r  rI   )rJ   rK   rL   rM   r  r  r   staticmethodr(  r6  r"  rI  rR  rU  rf  r   rm  r@   r  ry  r  r  rN   rH   rG   r    r   r     s     G!
 F F V V $R $RLE+(3)2VM 7<*!rG   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:   rP   r   r  r   rH   rG   r    <module>r     s      	  %   7 $ < G 6 - 8 3 2#&  	" 	. # & & 0 * ( ' *  2	. 	.v7) v7r3# 3#l* *0t! t!rG   