
    (ph<G                        S 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  SSKJr  SSKJr    SSKrS r\" 5       S:  a  \	" S\R@                   35      eS\" 5       s=::  a  S:  a  O  O\	" S\R@                   35      eSSK!J"r"J#r#  \#(       a0  SSKJ$r$J%r%  SSK&J'r'  SSK!J(r(J)r)  \$RT                  S   RV                  r,OSSK-rSSK.r\R^                  Ra                  \\R^                  Rb                  5        \Rd                  Rg                  5         Sr4\R^                  Rk                  \44S\R^                  Rl                  5      r7\R^                  Rq                  \75        SSK9J:r:  SSK;J<r<  SSK=J>r>  SS K?J@r@  SS!KAJBrB  SS"KCJDrD  S# rE " S$ S%\5      rF\#(       aB   " S& S'5      rG " S( S)\G\R                  5      rI " S* S+\G\R                  5      rH " S, S-\5      rg\R^                  R                  rH " S. S-\5      rg! \ a    SSKr GNf = f! \ a	    \	" S5      ef = f)/zY
PostgreSQL database backend for Django.

Requires psycopg2 >= 2.8.4 or psycopg >= 3.1.8
    N)contextmanager)settings)ImproperlyConfigured)DatabaseError)connections)BaseDatabaseWrapperCursorDebugWrapper)async_unsafe)cached_property)
SafeString)get_version_tuplez(Error loading psycopg2 or psycopg modulec                  ^    [         R                  R                  SS5      S   n [        U 5      $ )N    r   )Database__version__splitr   )versions    U/var/www/html/venv/lib/python3.13/site-packages/django/db/backends/postgresql/base.pypsycopg_versionr       s*    ""((a03GW%%    )         z6psycopg2 version 2.8.4 or newer is required; you have )   )r   r   r   z5psycopg version 3.1.8 or newer is required; you have r   )IsolationLevelis_psycopg3)adapterssql)Format)get_adapters_templateregister_tzloadertimestamptzi  	INETARRAY)DatabaseClient)DatabaseCreation)DatabaseFeatures)DatabaseIntrospection)DatabaseOperations)DatabaseSchemaEditorc                     U S   c  gSU -  $ )N
max_lengthvarcharvarchar(%(max_length)s) )datas    r   _get_varchar_columnr2   S   s    L!$t++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%.
ErS&S&S&S'.rS(S(S(S).r	S*S+S,S-S.S/S0S1S2S3S,S,S-S-S4.r
S5rS6S7S8S9S:S;S<.r\r\r\r\r\r\r\rS=rS> rS? r\S@ 5       rSA rSB r U 4SC jr!\SNSD j5       r"SE r#\SF 5       r$SG r%SNSH jr&SI r'\(U 4SJ j5       r)\*SK 5       r+SL r,SMr-U =r.$ )ODatabaseWrapperY   
postgresql
PostgreSQL	AutoFieldintegerBigAutoFieldbigintBinaryFieldbyteaBooleanFieldboolean	CharField	DateFielddateDateTimeFieldztimestamp with time zoneDecimalFieldz+numeric(%(max_digits)s, %(decimal_places)s)DurationFieldinterval	FileFieldr/   FilePathField
FloatFieldzdouble precisionIntegerFieldBigIntegerFieldIPAddressFieldinetGenericIPAddressField	JSONFieldjsonbsmallinttexttimeuuid)
OneToOneFieldPositiveBigIntegerFieldPositiveIntegerFieldPositiveSmallIntegerField	SlugFieldSmallAutoFieldSmallIntegerField	TextField	TimeField	UUIDFieldz"%(column)s" >= 0)rV   rW   rX   z GENERATED BY DEFAULT AS IDENTITY)r8   r:   rZ   z= %sz= UPPER(%s)zLIKE %szLIKE UPPER(%s)z~ %sz~* %sz> %sz>= %sz< %sz<= %s)exactiexactcontains	icontainsregexiregexgtgteltlte
startswithendswithistartswith	iendswithzKREPLACE(REPLACE(REPLACE({}, E'\\', E'\\\\'), E'%%', E'\\%%'), E'_', E'\\_')zLIKE '%%' || {} || '%%'zLIKE '%%' || UPPER({}) || '%%'zLIKE {} || '%%'zLIKE UPPER({}) || '%%'zLIKE '%%' || {}zLIKE '%%' || UPPER({}))ra   rb   ri   rk   rj   rl   r   c                 .    [        U R                  S5      $ )zW
Return a tuple of the database's version.
E.g. for pg_version 120004, return (12, 4).
i'  )divmod
pg_versionselfs    r   get_database_version$DatabaseWrapper.get_database_version   s    
 doou--r   c                    U R                   nUS   S:X  a1  UR                  S0 5      R                  S5      (       d  [        S5      e[        US   =(       d    S5      U R                  R                  5       :  a8  [        SUS   [        US   5      U R                  R                  5       4-  5      eUS   (       a  SUS   0US   EnO9US   c,  UR                  S0 5      R                  SS 5        SS0US   EnO0 US   EnS	US
'   UR                  SS 5        UR                  SS 5        UR                  SS 5      nUR                  S[        (       a  USL a  [        O[        5        US   (       a  US   US'   US   (       a  US   US'   US   (       a  US   US'   US   (       a  US   US'   [        (       a<  [        [        R                  U R                  5      US'   UR                  SS 5      US'   U$ )NNAME OPTIONSservicez`settings.DATABASES is improperly configured. Please supply the NAME or OPTIONS['service'] value.zThe database name '%s' (%d characters) is longer than PostgreSQL's limit of %d characters. Supply a shorter NAME in settings.DATABASES.dbnamepostgresUTF8client_encodingassume_roleisolation_levelserver_side_bindingcursor_factoryTUSERuserPASSWORDpasswordHOSThostPORTportcontextprepare_threshold)settings_dictgetr   lenopsmax_name_lengthpop
setdefaultr   ServerBindingCursorCursorr"   r   USE_TZtimezone)rq   r   conn_paramsr   s       r   get_connection_params%DatabaseWrapper.get_connection_params   s3   ** B&}/@/@B/O/S/S0
 0
 'F  }V$*+dhh.F.F.HH&) "&)f-.HH,,.	 	  -/	*K 6"*i,00DA#ZL=3KLK6]956K)/%&t,)40)oo.CTJ ;#6$#> $	
  "/"7K$&3J&?K
# "/"7K "/"7K;%:&K	"
 0;#T0K+, r   c                    U R                   S   nSn US   n [        U5      U l        SnU R                  R                  " S	0 UD6nU(       a  U R                  Ul        [        (       d  [        R                  R                  US S9  U$ ! [         a    [	        SU S35      ef = f! [
         a    [        R                  U l         Nf = f)
Nrw   Fr~   Tz$Invalid transaction isolation level z9 specified. Use one of the psycopg.IsolationLevel values.c                     U $ Nr0   )xs    r   <lambda>4DatabaseWrapper.get_new_connection.<locals>.<lambda>  s    r   )conn_or_cursloadsr0   )r   r   r~   
ValueErrorr   KeyErrorREAD_COMMITTEDr   connectr   psycopg2extrasregister_default_jsonb)rq   r   optionsset_isolation_levelisolation_level_value
connections         r   get_new_connection"DatabaseWrapper.get_new_connection   s     $$Y/#	$+,=$>!
'56K'L$&*# ]]**9[9
)-)=)=J&{ OO22'{ 3    *:;P:Q RO P   	A#1#@#@D 	As   B( B B%(C
	C
c                 Z   U R                   c  gU R                   R                  R                  S5      nU R                  nU(       aT  X:w  aO  U R                   R	                  5        nUR                  U R                  R                  5       U/5        S S S 5        gg! , (       d  f       g= f)NFTimeZoneT)r   infoparameter_statustimezone_namecursorexecuter   set_time_zone_sql)rq   conn_timezone_namer   r   s       r   ensure_timezoneDatabaseWrapper.ensure_timezone!  s    ??"!__11BB:N**/@'')Vtxx99;m_M * *)s   &,B
B*c                 J   U R                   c  gU R                  R                  S0 5      R                  S5      =n(       aR  U R                   R                  5        nU R                  R                  SU/5      nUR                  U5        S S S 5        gg! , (       d  f       g= f)NFrw   r}   zSET ROLE %sT)r   r   r   r   r   compose_sqlr   )rq   new_roler   r    s       r   ensure_roleDatabaseWrapper.ensure_role,  s    ??"))--i<@@OO8O'')Vhh**=8*Es# * 	 *) s   /B
B"c                    > [         TU ]  5         U R                  5       nU R                  5       nU(       d  U(       a1  U R	                  5       (       d  U R
                  R                  5         g g g r   )superinit_connection_stater   r   get_autocommitr   commit)rq   	commit_tzcommit_role	__class__s      r   r   %DatabaseWrapper.init_connection_state6  sY    %' ((*	 &&(9d.A.A.C.COO""$ /D9r   c                    U(       a0  U R                   R                  USU R                   R                  S9nOU R                   R                  5       n[        (       aj  U R                   R                  R                  [        [        R                  5      nU R                  UR                  :w  a  [        U R                  U5        U$ [        R                  (       a  U R                  OS Ul        U$ )NF)
scrollablewithhold)r   r   
autocommitr   r   
get_loaderTIMESTAMPTZ_OIDr!   TEXTr   r#   r   r   tzinfo_factory)rq   namer   tzloaders       r   create_cursorDatabaseWrapper.create_cursorC  s     __++1K1K , F __++-F; //::?FKKXH}} 1 11!$--8  <D??D$7$7PTF!r   c                     U R                   $ r   )r   )rq   offsets     r   r   DatabaseWrapper.tzinfo_factoryX  s    }}r   c                 0   U =R                   S-  sl          [        R                  " 5       nU(       a  [	        [        U5      5      nOSnU R                  S[        R                  " 5       R                  UU R                   4-  S9$ ! [         a    S n Nhf = f)Nr   syncz_django_curs_%d_%s_%d)r   )
_named_cursor_idxasynciocurrent_taskRuntimeErrorstrid_cursor	threadingcurrent_threadident)rq   r   
task_idents      r   chunked_cursorDatabaseWrapper.chunked_cursor[  s    !#	 "//1L R-.JJ||( ((*00&&	  
 	
  	 L	 s   B BBc                 p    U R                      XR                  l        S S S 5        g ! , (       d  f       g = fr   )wrap_database_errorsr   r   )rq   r   s     r   _set_autocommitDatabaseWrapper._set_autocommitw  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   )rq   table_namesr   s      r   check_constraints!DatabaseWrapper.check_constraints{  s3    
 [[]fNN:;NN9: ]]s	   #=
Ac                      U R                   R                  5        nUR                  S5        S S S 5        g! , (       d  f       g= f! [        R                   a     gf = f)NzSELECT 1TF)r   r   r   r   Errorrq   r   s     r   	is_usableDatabaseWrapper.is_usable  sT    	'')Vz* *
  *)
  ~~ 		s+   A 7A 
AA A AAc              #     >#    S n [         TU ]  5        nUv   S S S 5        g ! , (       d  f       g = f! [        R                  [        4 a    Ub  e [
        R                  " S[        5        [        R                  " 5        H  nUR                  S:X  d  M  UR                  S   S:w  d  M*  U R                  0 U R                  ESUR                  S   0EU R                  S9n UR                  5        nUv   S S S 5        O! , (       d  f       O= fUR                  5         O! UR                  5         f = f   g    e f = f7f)Na8  Normally Django will use a connection to the 'postgres' database to avoid running initialization queries against the production database when it's not needed (for example, when running tests). Django was unable to create a connection to the 'postgres' database and will use the first PostgreSQL database instead.r6   ru   rz   )alias)r   _nodb_cursorr   r   WrappedDatabaseErrorwarningswarnRuntimeWarningr   allvendorr   r   r   r   close)rq   r   r   connr   s       r   r   DatabaseWrapper._nodb_cursor  s    !	%'6 (''&&(<= 	!MMF
  *oo/
%%5"008JF>>"00"J$<$<V$D #jj * D%![[]f"(L +]] 



# 0& =	s{   E4 #4 E
14 E4 AE E ,7E $D$4D9	D$
DD$E $D66E :E<E  Ec                     U R                  5          U R                  R                  R                  sS S S 5        $ ! , (       d  f       g = fr   )temporary_connectionr   r   server_versionrp   s    r   ro   DatabaseWrapper.pg_version  s-    &&(??''66 )((s	    ;
A	c                     [        X5      $ r   r	   r   s     r   make_debug_cursor!DatabaseWrapper.make_debug_cursor  s    !&//r   )r~   r   )/__name__
__module____qualname____firstlineno__r   display_namer2   
data_typesdata_type_check_constraintsdata_types_suffix	operatorspattern_escpattern_opsr   r+   SchemaEditorClassr&   client_classr'   creation_classr(   features_classr)   introspection_classr*   	ops_classr   rr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ro   r  __static_attributes____classcell__)r   s   @r   r4   r4   Y   sQ   FL
Y 	w 			
 	( 	V 	3 	E 	 	. 	2 	( 		 	8 	&  	 !" 	W#$ ##+ )%/.$'7J< $7 3%8# 8:< %'%I4 	W  .5'/%-K H,!L%N%N/"I.>@    D	%  ( 
 
64; # #J 7 70 0r   r4   c                   "    \ rS rSrSrSS jrSrg)CursorMixini  z5
A subclass of psycopg cursor implementing callproc.
Nc                    [        U[        R                  5      (       d  [        R                  " U5      n[        R                  " S5      U[        R                  " S5      /nU(       aV  U HM  nUR	                  [        R
                  " U5      5        UR	                  [        R                  " S5      5        MO     US	 UR	                  [        R                  " S5      5        [        R                  " U5      nU R                  U5        U$ )NzSELECT * FROM (,))
isinstancer    
IdentifierSQLappendLiteralComposedr   )rq   r   argsqpartsitemstmts         r   callprocCursorMixin.callproc  s    dCNN33~~d+gg./swws|DF DMM#++d"34MM#''#,/ ! 2JMM#''#,'<<'DLLKr   r0   r   )r  r  r  r  __doc__r)  r  r0   r   r   r  r    s    		r   r  c                       \ rS rSrSrg)r   i  r0   Nr  r  r  r  r  r0   r   r   r   r         r   r   c                       \ rS rSrSrg)r   i  r0   Nr-  r0   r   r   r   r     r.  r   r   c                       \ rS rSrS rSrg)r
   i  c                     U R                  U5         U R                  R                  U5      sS S S 5        $ ! , (       d  f       g = fr   )	debug_sqlr   copy)rq   	statements     r   r3  CursorDebugWrapper.copy  s,    	*{{''	2 +**s	   7
Ar0   N)r  r  r  r  r3  r  r0   r   r   r
   r
     s    	3r   r
   c                        \ rS rSrS rS rSrg)r
   i  c                     U R                  U5         U R                  R                  " X/UQ76 sS S S 5        $ ! , (       d  f       g = fr   )r2  r   copy_expert)rq   r    filer%  s       r   r8  CursorDebugWrapper.copy_expert  s1    ${{..s@4@ %$$s	   9
Ac                     U R                  SU-  S9   U R                  R                  " X/UQ70 UD6sS S S 5        $ ! , (       d  f       g = f)NzCOPY %s TO STDOUT)r    )r2  r   copy_to)rq   r9  tabler%  kwargss        r   r<  CursorDebugWrapper.copy_to  s?    $7%$?@{{**4HHH A@@s	    =
Ar0   N)r  r  r  r  r8  r<  r  r0   r   r   r
   r
     s    	A	Ir   )Lr+  r   r   r   
contextlibr   django.confr   django.core.exceptionsr   	django.dbr   r   r   django.db.backends.base.baser   django.db.backends.utilsr
   BaseCursorDebugWrapperdjango.utils.asyncior   django.utils.functionalr   django.utils.safestringr   django.utils.versionr   psycopgr   ImportErrorr   r   r   psycopg_anyr   r   r   r    
psycopg.pqr!   r"   r#   typesoidr   psycopg2.extensionspsycopg2.extras
extensionsregister_adapterQuotedStringr   register_uuidINETARRAY_OIDnew_array_typeUNICODEr%   register_typeclientr&   creationr'   featuresr(   introspectionr)   
operationsr*   schemar+   r2   r4   r  r   r   ClientCursorr   r0   r   r   <module>rb     s      %   7 ; ! < Q - 3 . 2K$"&
 y 

@AUAU@VW  ?(y(

?@T@T?UV 
 5%!Enn]377O ((X5H5H5U5UVOO!!# M##22	##I
 %%i0 # & & 0 * (,a0) a0H  *k8?? h33 33 3   ''FI3 IQ  $#$ K
I
JJKs$   H! !
H/+H2 .H//H2 2I