
     hG                     >   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n# e$ r ddlZY nw xY wn# e$ r  e	d          w xY w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#r)ddlm$Z$m%Z% ddl&m'Z' ddl!m(Z(m)Z) e$j*        d         j+        Z,nddl-Zddl.Zej/        0                    eej/        j1                   ej2        3                                 dZ4ej/        5                    e4fdej/        j6                  Z7ej/        8                    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#rE G d& d'          ZG G d( d)eGejH                  ZI G d* d+eGejJ                  ZH G d, d-e          ZdS ej/        jK        ZH G d. d-e          ZdS )/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                  l    t           j                            dd          d         } t          |           S )N    r   )Database__version__splitr   )versions    a/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/django/db/backends/postgresql/base.pypsycopg_versionr       s-    "((a0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         dS d| z  S )N
max_lengthvarcharvarchar(%(max_length)s) )datas    r   _get_varchar_columnr2   S   s    L!y$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dMdD            Z!dE Z"edF             Z#dG Z$dMdHZ%dI Z&e' fdJ            Z(e)dK             Z*dL Z+ xZ,S )N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    
 dou---r   c                 V   | j         }|d         dk    r8|                    di                               d          st          d          t          |d         pd          | j                                        k    rEt          d|d         t          |d                   | j                                        fz            |d         rd|d         i|d         }nI|d         7|                    di                               dd            ddi|d         }n
i |d         }d	|d
<   |                    dd            |                    dd            |                    dd           }|                    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<   |                    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/O/S/S0
 0
& 'F   }V$*++dh.F.F.H.HHH&) "&)f-..H,,..	 	 	   
	7-/	*KK 6"*i,,00DAAA#ZL=3KLKK6]956K)/%&t,,,)4000)oo.CTJJ2d::  		
 	
 	
   	8"/"7K$ 	@&3J&?K
#  	8"/"7K  	8"/"7K 	%:& &K	"
 0;#T0 0K+, r   c                 |   | j         d         }d}	 |d         }	 t          |          | _        d}nB# t          $ r t	          d| d          w xY w# t
          $ r t          j        | _        Y nw xY w | j        j        d	i |}|r| j        |_        t          s"t          j                            |d            |S )
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'L$&*##   *P;P P P P    	A 	A 	A#1#@D   	A +T]*99[99
 	>)-)=J& 	 O22'{{ 3    s   A 1 AA0/A0c                 6   | j         dS | j         j                            d          }| j        }|rg||k    ra| j                                         5 }|                    | j                                        |g           d d d            n# 1 swxY w Y   dS dS )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    ?"5!_1BB:NN* 	/=@@'')) NVtx99;;m_MMMN N N N N N N N N N N N N N N4us   /BBBc                 @   | j         dS | j                            di                               d          x}rd| j                                         5 }| j                            d|g          }|                    |           d d d            n# 1 swxY w Y   dS dS )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    ?"5)--i<<@@OOO8 	'')) $Vh**=8*EEs###$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ 4us   2BBBc                    t                                                       |                                 }|                                 }|s|r1|                                 s| j                                         d S d S d S r   )superinit_connection_stater   r   get_autocommitr   commit)rp   	commit_tzcommit_role	__class__s      r   r   z%DatabaseWrapper.init_connection_state4  s    %%''' ((**	 &&(( 	%9 	%d.A.A.C.C 	%O""$$$$$	% 	% 	% 	%r   Nc                 x   |r(| j                             |d| j         j                  }n| j                                         }t          rU| j         j                            t          t          j                  }| j	        |j	        k    rt          | j	        |           n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     	. _++1K ,  FF _++--F 	U /::?FKXXH} 111!$-888;C?$TD$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                    }n# t          $ r d }Y nw xY w|rt	          t          |                    }nd}|                     dt          j                    j	        || j         fz            S )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    !#	 "/11LL 	  	  	 LLL	   	 R--..JJJ||( (**0&	  
 
 	
s   & 55c                 ^    | j         5  || j        _        d d d            d S # 1 swxY w Y   d S r   )wrap_database_errorsr   r   )rp   r   s     r   _set_autocommitzDatabaseWrapper._set_autocommitu  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   )rp   table_namesr   s      r   check_constraintsz!DatabaseWrapper.check_constraintsy  s    
 [[]] 	;fNN:;;;NN9:::	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	;s   +AAAc                     	 | j                                         5 }|                    d           d d d            n# 1 swxY w Y   dS # t          j        $ r Y dS w xY w)NzSELECT 1TF)r   r   r   r   Errorrp   r   s     r   	is_usablezDatabaseWrapper.is_usable  s    	'')) +Vz***+ + + + + + + + + + + + + + +
 4 ~ 	 	 	55	s1   A
 =A
 AA
 AA
 
AAc              #     K   d }	 t                                                      5 }|V  d d d            d S # 1 swxY w Y   d S # t          j        t          f$ r | t          j        dt                     t          j	                    D ]}|j
        dk    r|j        d         dk    r|                     i | j        d|j        d         i| j                  }	 |                                5 }|V  d d d            n# 1 swxY w Y   |                                 n# |                                 w xY w Y d S  w xY 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  s     !	%%'' 6                 &(<= 	 	 	!MF
    *o//  
%55"08JFF>>"0"J$<V$D  #j *  D%![[]] )f"(LLL) ) ) ) ) ) ) ) ) ) ) ) ) ) ) 



EEE=	sk    A 9A =A  =A BED"1D6D"DD"	D
D"E"D88E?Ec                     |                                  5  | j        j        j        cd d d            S # 1 swxY w Y   d S r   )temporary_connectionr   r   server_versionro   s    r   rn   zDatabaseWrapper.pg_version  s    &&(( 	7 	7?'6	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7s   377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   s+       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 4 4; ; ; ;   # # # # ^#J 7 7 _70 0 0 0 0 0 0r   r4   c                       e Zd ZdZddZdS )CursorMixinzE
        A subclass of psycopg cursor implementing callproc.
        Nc                    t          |t          j                  st          j        |          }t          j        d          |t          j        d          g}|rV|D ]P}|                    t          j        |                     |                    t          j        d                     Q|d= |                    t          j        d                     t          j        |          }|                     |           |S )NzSELECT * FROM (,))
isinstancer    
IdentifierSQLappendLiteralComposedr   )rp   r   argsqpartsitemstmts         r   callproczCursorMixin.callproc  s    dCN33 ,~d++g.//sws||DF   0 0DMM#+d"3"3444MM#'#,,////2JMM#'#,,'''<''DLLKr   r   )r   r   r   __doc__r  r0   r   r   r  r    s2        	 		 	 	 	 	 	r   r  c                       e Zd ZdS )r   Nr   r   r   r0   r   r   r   r             r   r   c                       e Zd ZdS )r   Nr  r0   r   r   r   r     r  r   r   c                       e Zd Zd ZdS )r
   c                     |                      |          5  | j                            |          cd d d            S # 1 swxY w Y   d S r   )	debug_sqlr   copy)rp   	statements     r   r  zCursorDebugWrapper.copy  s    	** 3 3{''	223 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3s   =AAN)r   r   r   r  r0   r   r   r
   r
     s#        	3 	3 	3 	3 	3r   r
   c                       e Zd Zd Zd ZdS )r
   c                     |                      |          5   | j        j        ||g|R  cd d d            S # 1 swxY w Y   d S r   )r  r   copy_expert)rp   r    filer  s       r   r#  zCursorDebugWrapper.copy_expert  s    $$ A A.t{.sD@4@@@A A A A A A A A A A A A A A A A A As   7;;c                     |                      d|z            5   | j        j        ||g|R i |cd d d            S # 1 swxY w Y   d S )NzCOPY %s TO STDOUT)r    )r  r   copy_to)rp   r$  tabler  kwargss        r   r&  zCursorDebugWrapper.copy_to  s    $7%$?@@ I I*t{*4HHHHHHI I I I I I I I I I I I I I I I I Is   >AAN)r   r   r   r#  r&  r0   r   r   r
   r
     s:        	A 	A 	A	I 	I 	I 	I 	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 7 7 7 7 7 ; ; ; ; ; ; ! ! ! ! ! ! < < < < < < Q Q Q Q Q Q - - - - - - 3 3 3 3 3 3 . . . . . . 2 2 2 2 2 2K$""""" $ $ $######$ K K K

I
J
JJK& & &
 ?y  

WAUWW   ??((((y(((((

V@TVV  
 5 4 4 4 4 4 4 4 1%%%%%%%%!!!!!!EEEEEEEEn]37OO ((X5H5UVVVO!!### M#22	# I
 %%i000 # " " " " " & & & & & & & & & & & & 0 0 0 0 0 0 * * * * * * ( ( ( ( ( (, , ,_0 _0 _0 _0 _0) _0 _0 _0D  ,I       *    k8?       h3   3 3 3 3 33 3 3 3 3 3  'FI I I I I3 I I I I Is*   A A( 	A$!A( #A$$A( (A9