
    Evg[                        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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j0        1                    eej0        j2                   ej3        4                                 dZ5ej0        6                    e5fdej0        j7                  Z8ej0        9                    e8           ddl:m;Z; ddl<m=Z= ddl>m?Z? dd l@mAZA dd!lBmCZC dd"lDmEZE d# ZF G d$ d%e          ZGe$rd G d& d'          ZH G d( d)eHejI                  ZJ G d* d+eHejK                  ZI G d, d-eHejL        jM        ejN                  ZO G d. d/e          ZdS ej0        jP        ZI G d0 d/e          ZdS )1zY
PostgreSQL database backend for Django.

Requires psycopg2 >= 2.8.4 or psycopg >= 3.1.8
    N)contextmanager)settings)ImproperlyConfigured)DatabaseError)connections)NO_DB_ALIAS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    _/var/www/pixelcanvas.ch/venv/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_columnr3   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i Zed=             Zd> Zd? Zd@ Ze dA             Z!dB Z"dC Z#dD Z$dE Z%dF Z& fdGZ'e dSdI            Z(dJ Z)e dK             Z*dL Z+dSdMZ,dN Z- fdOZ.e/ fdP            Z0e1dQ             Z2dR Z3 xZ4S )T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	FileFieldr0   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                 (   | j         d                             d          }| j        t          k    s|sd S | j        | j        vr| j                             dd          dk    rt          d          |du ri }	 ddlm} n"# t          $ r}t          d          |d }~ww xY w| 	                                }d|d	<   | j         d
         } |d|d| j
        |r|j        nd d|}| j                            | j        |           | j        | j                 S )NOPTIONSpoolCONN_MAX_AGEr   z/Pooling doesn't support persistent connections.T)ConnectionPoolzAError loading psycopg_pool module.
Did you install psycopg[pool]?
autocommitCONN_HEALTH_CHECKSF)kwargsopen	configurecheckr1   )settings_dictgetaliasr   _connection_poolsr   psycopg_poolrq   ImportErrorget_connection_params_configure_connectioncheck_connection
setdefault)selfpool_optionsrq   errconnect_kwargsenable_checksro   s          r   ro   zDatabaseWrapper.pool   ss   ))488@@:$$L$4:T333!%%na88A==*E   t##!7777777   *X 
 "7799N+/N<( ./CDM!> %49FPn55D	 
  D "--dj$???%dj11s   8A? ?
B	BBc                 d    | j         r(| j                                          | j        | j        = d S d S N)ro   closer{   rz   r   s    r   
close_poolzDatabaseWrapper.close_pool   s;    9 	3IOO&tz222	3 	3r   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_versionr   s    r   get_database_versionz$DatabaseWrapper.get_database_version   s    
 dou---r   c                 z   | j         }|d         dk    r*|d                             d          st          d          t          |d         pd          | j                                        k    rEt          d|d         t          |d                   | j                                        fz            |d         rd|d         i|d         }n;|d         )|d                             dd            ddi|d         }n
i |d         }d	|d
<   |                    dd            |                    dd            |                    dd           }|rt          st          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 rn   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_levelro   z&Database pooling requires psycopg >= 3server_side_bindingcursor_factoryTUSERuserPASSWORDpasswordHOSThostPORTportcontextprepare_threshold)rx   ry   r   lenopsmax_name_lengthpopr   r   ServerBindingCursorCursorr#   r   USE_TZtimezone)r   rx   conn_paramsr   r   s        r   r~   z%DatabaseWrapper.get_connection_params   s   * B&&}Y/G/K/KI/V/V&&F   }V$*++dh.F.F.H.HHH&) "&)f-..H,,..	 	 	   
	7-/	*KK 6"*)$((D999#ZL=3KLKK6]956K)/%&t,,,)4000"vt44 	Q 	Q&'OPPP)oo.CTJJ #6$#>#> $#	
 	
 	
   	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        r3| j                                         | j        	                                }n | j
        j        d	i |}|r| j        |_        t          s"t          j                            |d            |S )
Nrn   Fr   Tz$Invalid transaction isolation level z9 specified. Use one of the psycopg.IsolationLevel values.c                     | S r   r1   )xs    r   <lambda>z4DatabaseWrapper.get_new_connection.<locals>.<lambda>T  s     r   )conn_or_cursloadsr1   )rx   r   r   
ValueErrorr   KeyErrorREAD_COMMITTEDro   ru   getconnr   connectr   psycopg2extrasregister_default_jsonb)r   r   optionsset_isolation_levelisolation_level_value
connections         r   get_new_connectionz"DatabaseWrapper.get_new_connection0  sY    $Y/#	$+,=$>!
'56K'L'L$&*##   *P;P P P P    	A 	A 	A#1#@D   	A 9 	>INN**,,JJ..====J 	>)-)=J& 	 O22'{{ 3    s   A 1 AA0/A0c                 p    |                                   | j        dS |                     | j                  S )NF)r   r   _configure_timezoner   s    r   ensure_timezonezDatabaseWrapper.ensure_timezoneX  s5    ?"5''888r   c                    |j                             d          }| j        }|rb||k    r\|                                5 }|                    | j                                        |g           d d d            n# 1 swxY w Y   dS dS )NTimeZoneTF)infoparameter_statustimezone_namecursorexecuter   set_time_zone_sql)r   r   conn_timezone_namer   r   s        r   r   z#DatabaseWrapper._configure_timezone_  s    '_==jII* 	/=@@""$$ Ntx99;;m_MMMN N N N N N N N N N N N N N N4us   /A99A= A=c                    | j         d                             d          x}r_|                                5 }| j                            d|g          }|                    |           d d d            n# 1 swxY w Y   dS dS )Nrn   r   zSET ROLE %sTF)rx   ry   r   r   compose_sqlr   )r   r   new_roler   r!   s        r   _configure_rolezDatabaseWrapper._configure_roleh  s    ))488GGG8 	""$$ $h**=8*EEs###$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ 4us   2A55A9<A9c                 ^    |                      |          }|                     |          }|p|S r   )r   r   )r   r   	commit_tzcommit_roles       r   r   z%DatabaseWrapper._configure_connectionp  s7    
 ,,Z88	 **:66'i'r   c                 
   | j         {| j        5  | j        r,| j         j                            | j                    d | _         n%| j                                         cd d d            S 	 d d d            d S # 1 swxY w Y   d S d S r   )r   wrap_database_errorsro   _poolputconnr   r   s    r   _closezDatabaseWrapper._close}  s    ?& * 	3 	39 3 O)11$/BBB&*DOO?0022	3 	3 	3 	3 	3 	3 	3 	3 $	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3	 '&s   AA66A:=A:c                    t                                                       | j        R| j        sM|                     | j                  }|r3|                                 s!| j                                         d S d S d S d S d S r   )superinit_connection_stater   ro   r   get_autocommitcommit)r   r   	__class__s     r   r   z%DatabaseWrapper.init_connection_state  s    %%'''?&ty&//@@F )d1133 )&&(((((	 '&&&) ) ) )r   Nc                    |rtt           rE| j        d                             d          dur#t          | j        |d| j        j                  }nA| 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 )Nrn   r   TF)name
scrollablewithhold)r   r   )r   rx   ry   ServerSideCursorr   rr   r   r    
get_loaderTIMESTAMPTZ_OIDr"   TEXTr   r$   r   r   tzinfo_factory)r   r   r   tzloaders       r   create_cursorzDatabaseWrapper.create_cursor  s    	. "9-112GHHPTTT *O$!_7	   //UT_5O 0   _++--F 	U /::?FKXXH} 111!$-888;C?$TD$7$7PTF!r   c                     | j         S r   )r   )r   offsets     r   r   zDatabaseWrapper.tzinfo_factory  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)r   r   
task_idents      r   chunked_cursorzDatabaseWrapper.chunked_cursor  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   )r   r   rr   )r   rr   s     r   _set_autocommitzDatabaseWrapper._set_autocommit  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   )r   table_namesr   s      r   check_constraintsz!DatabaseWrapper.check_constraints  s    
 [[]] 	;fNN:;;;NN9:::	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	;s   +AAAc                     | j         dS 	 | 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)NFzSELECT 1T)r   r   r   r   Errorr   r   s     r   	is_usablezDatabaseWrapper.is_usable  s    ?"5	'')) +Vz***+ + + + + + + + + + + + + + +
 4 ~ 	 	 	55	s3   A AA A

A A
A A&%A&c                 V    | j         rd S t                                                      S r   )ro   r   close_if_health_check_failed)r   r   s    r   r  z,DatabaseWrapper.close_if_health_check_failed  s(    9 	Fww33555r   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.r6   r   r   )rz   )r   _nodb_cursorr   r   WrappedDatabaseErrorwarningswarnRuntimeWarningr   allvendorrx   r   rz   r   r   )r   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_versionr   s    r   r   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   )5__name__
__module____qualname__r  display_namer3   
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   r{   propertyro   r   r   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r  r   r   r  __classcell__)r   s   @r   r5   r5   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&2 &2 X&2P3 3 3
. . .A A AF % % \%N9 9 9    ( ( (3 3 3 ) ) ) ) )       \ D   
 
 \
64 4 4; ; ; ;
 
 
6 6 6 6 6 # # # # ^#J 7 7 _70 0 0 0 0 0 0r   r5   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   )r   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__r7  r1   r   r   r'  r'  (  s2        	 		 	 	 	 	 	r   r'  c                       e Zd ZdS )r   Nr  r  r  r1   r   r   r   r   =          r   r   c                       e Zd ZdS )r   Nr:  r1   r   r   r   r   @  r;  r   r   c                       e Zd ZdZdS )r   aD  
        psycopg >= 3 forces the usage of server-side bindings when using named
        cursors but the ORM doesn't yet support the systematic generation of
        prepareable SQL (#20516).

        ClientCursorMixin forces the usage of client-side bindings while
        ServerCursor implements the logic required to declare and scroll
        through named cursors.

        Mixing ClientCursorMixin in wouldn't be necessary if Cursor allowed to
        specify how parameters should be bound instead, which ServerCursor
        would inherit, but that's not the case.
        N)r  r  r  r8  r1   r   r   r   r   C  s        	 	 	 	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)r   	statements     r   rA  zCursorDebugWrapper.copyU  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  rA  r1   r   r   r   r   T  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)r   r!   filer3  s       r   rE  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)r   rF  tabler3  rt   s        r   rH  zCursorDebugWrapper.copy_toa  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  rE  rH  r1   r   r   r   r   \  s:        	A 	A 	A	I 	I 	I 	I 	Ir   )Qr8  r   r   r	  
contextlibr   django.confr   django.core.exceptionsr   	django.dbr   r  r   django.db.backends.base.baser   r	   django.db.backends.utilsr   BaseCursorDebugWrapperdjango.utils.asyncior   django.utils.functionalr   django.utils.safestringr   django.utils.versionr   psycopgr   r}   r   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,   r3   r5   r'  r   r   ClientCursorclient_cursorClientCursorMixinServerCursorr   r   r1   r   r   <module>rn     s          % % % % % %             7 7 7 7 7 7 ; ; ; ; ; ; ! ! ! ! ! ! I I I I I I I I 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 * * * * * * ( ( ( ( ( (, , ,J0 J0 J0 J0 J0) J0 J0 J0Z  =I       *    k8?       h3       X+=x?T  "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* *A;