
    HwgG                     j   d 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 ddlmZ ddlmZ 	 	 ddlZd Z e       dk  r e	dej@                         d e       cxk  rdk  rn n e	dej@                         ddl!m"Z"m#Z# e#r0ddlm$Z$m%Z% ddl&m'Z' ddl!m(Z(m)Z) e$jT                  d   jV                  Z,nddl-Zddl.Zej^                  ja                  eej^                  jb                         ejd                  jg                          dZ4ej^                  jk                  e4fdej^                  jl                        Z7ej^                  jq                  e7       ddl9m:Z: ddl;m<Z< ddl=m>Z> dd l?m@Z@ dd!lAmBZB dd"lCmDZD d# ZE G d$ d%e      ZFe#rB G d& d'      ZG G d( d)eGej                        ZI G d* d+eGej                        ZH G d, d-e      Zyej^                  j                  ZH G d. d-e      Zy# e$ r ddlZY w xY w# e$ r	  e	d      w xY w)/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                  ^    t         j                  j                  dd      d   } t        |       S )N    r   )Database__version__splitr   )versions    Y/var/www/horilla/myenv/lib/python3.12/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                     | d   yd| z  S )N
max_lengthvarcharvarchar(%(max_length)s) )datas    r   _get_varchar_columnr2   S   s    L!$t++r   c                       e Zd ZdZdZi ddddddd	d
de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&Zd'd'd'd(Zd)d*d+d,d-d.d/d0d1d2d+d+d,d,d3Z	d4Z
d5d6d7d8d9d:d;ZeZeZeZeZeZeZeZd<Zd= Zd> Zed?        Zd@ ZdA Z fdBZ edLdC       Z!dD Z"edE        Z#dF Z$dLdGZ%dH Z&e' fdI       Z(e)dJ        Z*dK Z+ xZ,S )MDatabaseWrapper
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)rU   rV   rW   z GENERATED BY DEFAULT AS IDENTITY)r7   r9   rY   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({}))r`   ra   rh   rj   ri   rk   r   c                 .    t        | j                  d      S )zo
        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_versionz$DatabaseWrapper.get_database_version   s    
 doou--r   c                    | j                   }|d   dk(  r,|j                  di       j                  d      st        d      t        |d   xs d      | j                  j                         kD  r8t        d|d   t        |d         | j                  j                         fz        |d   rd|d   i|d   }n8|d   ,|j                  di       j                  dd        ddi|d   }ni |d   }d	|d
<   |j                  dd        |j                  dd        |j                  dd       }|j                  dt        r
|du rt        nt               |d   r|d   |d<   |d   r|d   |d<   |d   r|d   |d<   |d   r|d   |d<   t        r<t        t        j                  | j                        |d<   |j                  dd       |d<   |S )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)rp   r   conn_paramsr}   s       r   get_connection_paramsz%DatabaseWrapper.get_connection_params   s(   ** B&}/@/@B/O/S/S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2d:  		
  "/"7K$&3J&?K
# "/"7K "/"7K%:&K	"
 0;#T0K+, r   c                    | j                   d   }d}	 |d   }	 t        |      | _        d} | j                  j                  d	i |}|r| j                  |_        t        s"t        j                  j                  |d        |S # t        $ r t	        d| d      w xY w# t
        $ r t        j                  | _        Y w xY w)
Nru   Fr|   Tz$Invalid transaction isolation level z9 specified. Use one of the psycopg.IsolationLevel values.c                     | S Nr0   )xs    r   <lambda>z4DatabaseWrapper.get_new_connection.<locals>.<lambda>  s     r   )conn_or_cursloadsr0   )r   r   r|   
ValueErrorr   KeyErrorREAD_COMMITTEDr   connectr   psycopg2extrasregister_default_jsonb)rp   r   optionsset_isolation_levelisolation_level_value
connections         r   get_new_connectionz"DatabaseWrapper.get_new_connection   s     $$Y/#	$+,=$>!
'56K'L$&*# +T]]**9[9
)-)=)=J& OO22'{ 3    *:;P:Q RO P   	A#1#@#@D 	As   B  B B C Cc                 D   | j                   y| j                   j                  j                  d      }| j                  }|rT||k7  rO| j                   j	                         5 }|j                  | j                  j                         |g       d d d        yy# 1 sw Y   yxY w)NFTimeZoneT)r   infoparameter_statustimezone_namecursorexecuter   set_time_zone_sql)rp   conn_timezone_namer   r   s       r   ensure_timezonezDatabaseWrapper.ensure_timezone  s    ??"!__11BB:N**/=@'') NVtxx99;m_MNNs    ,BBc                 4   | j                   y| j                  j                  di       j                  d      x}rR| j                   j                         5 }| j                  j                  d|g      }|j                  |       d d d        yy# 1 sw Y   yxY w)NFru   r{   zSET ROLE %sT)r   r   r   r   r   compose_sqlr   )rp   new_roler   r    s       r   ensure_rolezDatabaseWrapper.ensure_role*  s    ??"))--i<@@OO8O'') $Vhh**=8*Es#$ 	$ s   /BBc                     t         |           | j                         }| j                         }|s|r,| j	                         s| j
                  j                          y y y r   )superinit_connection_stater   r   get_autocommitr   commit)rp   	commit_tzcommit_role	__class__s      r   r   z%DatabaseWrapper.init_connection_state4  sV    %' ((*	 &&(9d.A.A.COO""$ /D9r   c                    |r3| j                   j                  |d| j                   j                        }n| j                   j                         }t        ri| j                   j                  j                  t        t        j                        }| j                  |j                  k7  rt        | j                  |       |S t        j                  r| j                  nd |_        |S )NF)
scrollablewithhold)r   r   
autocommitr   r   
get_loaderTIMESTAMPTZ_OIDr!   TEXTr   r#   r   r   tzinfo_factory)rp   namer   tzloaders       r   create_cursorzDatabaseWrapper.create_cursorA  s     __++1K1K , F __++-F //::?FKKXH}} 1 11!$--8  <D??D$7$7PTF!r   c                     | j                   S r   )r   )rp   offsets     r   r   zDatabaseWrapper.tzinfo_factoryV  s    }}r   c                 &   | xj                   dz  c_         	 t        j                         }|rt	        t        |            }nd}| j                  dt        j                         j                  || j                   fz        S # t        $ r d }Y dw xY w)Nr   syncz_django_curs_%d_%s_%d)r   )
_named_cursor_idxasynciocurrent_taskRuntimeErrorstrid_cursor	threadingcurrent_threadident)rp   r   
task_idents      r   chunked_cursorzDatabaseWrapper.chunked_cursorY  s    !#	 "//1L R-.JJ||( ((*00&&	  
 	
  	 L	 s   B BBc                 h    | j                   5  || j                  _        d d d        y # 1 sw Y   y xY wr   )wrap_database_errorsr   r   )rp   r   s     r   _set_autocommitzDatabaseWrapper._set_autocommitu  s,    && 	4)3DOO&	4 	4 	4s   (1c                     | j                         5 }|j                  d       |j                  d       ddd       y# 1 sw Y   yxY w)zl
        Check constraints by setting them to immediate. Return them to deferred
        afterward.
        zSET CONSTRAINTS ALL IMMEDIATEzSET CONSTRAINTS ALL DEFERREDN)r   r   )rp   table_namesr   s      r   check_constraintsz!DatabaseWrapper.check_constraintsy  s>    
 [[] 	;fNN:;NN9:	; 	; 	;s	   #=Ac                     	 | j                   j                         5 }|j                  d       d d d        y# 1 sw Y   yxY w# t        j                  $ r Y yw xY w)NzSELECT 1TF)r   r   r   r   Errorrp   r   s     r   	is_usablezDatabaseWrapper.is_usable  sV    	'') +Vz*+
 +
  ~~ 		s*   A 7A A A  A AAc              #   j  K   d }	 t         |          5 }| d d d        y # 1 sw Y   y xY w# t        j                  t        f$ r | t        j                  dt               t        j                         D ]  }|j                  dk(  s|j                  d   dk7  s&| j                  i | j                  d|j                  d   i| j                        }	 |j                         5 }| d d d        n# 1 sw Y   nxY w|j                          n# |j                          w xY w Y y   w xY ww)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.r5   rs   rx   )alias)r   _nodb_cursorr   r   WrappedDatabaseErrorwarningswarnRuntimeWarningr   allvendorr   r   r   r   close)rp   r   r   connr   s       r   r   zDatabaseWrapper._nodb_cursor  s5    !	%' 6  &&(<= 	!MMF
  *oo/ 
%%5"008JF>>"00"J$<$<V$D #jj * D%![[] )f"(L) ) ) 



#& =	s{   D3/ #/ D3,/ D3/ AD0D0:D0D*C8/	D8D=DD0D''D0+D3-D00D3c                     | j                         5  | j                  j                  j                  cd d d        S # 1 sw Y   y xY wr   )temporary_connectionr   r   server_versionro   s    r   rn   zDatabaseWrapper.pg_version  s6    &&( 	7??''66	7 	7 	7s	    ;Ac                     t        ||       S r   r	   r   s     r   make_debug_cursorz!DatabaseWrapper.make_debug_cursor  s    !&$//r   r   )-__name__
__module____qualname__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   rq   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rn   r   __classcell__)r   s   @r   r4   r4   Y   sL   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0r   r4   c                       e Zd ZdZddZy)CursorMixinzE
        A subclass of psycopg cursor implementing callproc.
        Nc                    t        |t        j                        st        j                  |      }t        j                  d      |t        j                  d      g}|rR|D ]J  }|j	                  t        j
                  |             |j	                  t        j                  d             L |d= |j	                  t        j                  d             t        j                  |      }| j                  |       |S )NzSELECT * FROM (,))
isinstancer    
IdentifierSQLappendLiteralComposedr   )rp   r   argsqpartsitemstmts         r   callproczCursorMixin.callproc  s    dCNN3~~d+gg./swws|DF  0DMM#++d"34MM#''#,/0 2JMM#''#,'<<'DLLKr   r   )r   r   r   __doc__r  r0   r   r   r  r    s    		r   r  c                       e Zd Zy)r   Nr   r   r   r0   r   r   r   r         r   r   c                       e Zd Zy)r   Nr  r0   r   r   r   r     r  r   r   c                       e Zd Zd Zy)r
   c                     | j                  |      5  | j                  j                  |      cd d d        S # 1 sw Y   y xY wr   )	debug_sqlr   copy)rp   	statements     r   r  zCursorDebugWrapper.copy  s5    	* 3{{''	23 3 3s	   7A N)r   r   r   r  r0   r   r   r
   r
     s    	3r   r
   c                       e Zd Zd Zd Zy)r
   c                     | j                  |      5   | j                  j                  ||g| cd d d        S # 1 sw Y   y xY wr   )r  r   copy_expert)rp   r    filer  s       r   r#  zCursorDebugWrapper.copy_expert  sB    $ A.t{{..sD@4@A A As	   :Ac                     | j                  d|z        5   | j                  j                  ||g|i |cd d d        S # 1 sw Y   y xY w)NzCOPY %s TO STDOUT)r    )r  r   copy_to)rp   r$  tabler  kwargss        r   r&  zCursorDebugWrapper.copy_to  sO    $7%$?@ I*t{{**4HHHI I Is   !AA
N)r   r   r   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>rK     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 * (,_0) _0D  *k8?? h33 33 3   ''FI3 IM  $#$ K
I
JJKs$   H 	H!H$  H!!H$ $H2