
    Evgq<                         d dl Z d dlmZmZ d dlmZ d dlmZ d dlm	Z	m
Z
mZmZmZ d dlmZ d dlmZ d dlmZ d d	lmZ ed
             Z G d de          ZdS )    N)	lru_cachepartial)settings)BaseDatabaseOperations)InetJsonberrorsis_psycopg3mogrifysplit_tzname_delta)
OnConflict)Cast)_lazy_re_compilec                 T    | t           j        S t          t           j        |           S )N)cls)jsondumpsr   )encoders    e/var/www/pixelcanvas.ch/venv/lib/python3.11/site-packages/django/db/backends/postgresql/operations.pyget_json_dumpsr      s$    z4:7++++    c                       e Zd ZdZdZ eg d          ZddddZer-dd	l	m
Z
 e
j        e
j        e
j        e
j        e
j        e
j        d
Zd Z ed          Zd Zd7dZd Zd Zd Zd Zd Zd Zd Zd7dZd Zd Zd7dZd Zd Z d Z!d Z"d Z#d d d!d"Z$d# Z%d8d$Z&d% Z'd& Z(d' Z)d( Z*erd) Z+nd* Z+d+ Z,erd, Z-d- Z.d. Z/d/ Z0d9d0Z1d1 Z2d2 Z3 fd3Z4d7 fd4	Z5 fd5Z6 fd6Z7 xZ8S ):DatabaseOperationsvarcharEXPLAIN)	ANALYZEBUFFERSCOSTSGENERIC_PLANSETTINGSSUMMARYTIMINGVERBOSEWALintegerbigintsmallint)	AutoFieldBigAutoFieldSmallAutoFieldr   )numeric)SmallIntegerFieldIntegerFieldBigIntegerFieldPositiveSmallIntegerFieldPositiveIntegerFieldPositiveBigIntegerFieldc                     |                                 }|dv r6d|                    | j                                      d          d         z  S dS )N)GenericIPAddressFieldIPAddressField	TimeField	UUIDFieldzCAST(%%s AS %s)(r   %s)get_internal_typedb_type
connectionsplit)selfoutput_fieldinternal_types      r   unification_cast_sqlz'DatabaseOperations.unification_cast_sql<   s`    $6688 
 
 
 "L$8$8$I$I$O$OPS$T$TUV$WW tr   z[A-Z_]+c                     |dk    rd| d|fS |dk    rd| d|fS |dk    rd| d|fS |                                 }| j                            |          st          d	|          d
| d| d|fS )Nweek_dayzEXTRACT(DOW FROM z) + 1iso_week_dayzEXTRACT(ISODOW FROM )iso_yearzEXTRACT(ISOYEAR FROM zInvalid lookup type: zEXTRACT(z FROM )upper_extract_format_re	fullmatch
ValueErrorr>   lookup_typesqlparamss       r   date_extract_sqlz#DatabaseOperations.date_extract_sqlS   s    *$$1s111699N**0#000&88J&&13111699!''))&00== 	FD[DDEEE3+33S333V;;r   Nc                 N    |                      |||          \  }}d| d|g|R fS NDATE_TRUNC(%s, rE   _convert_sql_to_tzr>   rL   rM   rN   tznames        r   date_trunc_sqlz!DatabaseOperations.date_trunc_sqlb   >    --c66BBV''''+)?)?)???r   c                 T    t          |          \  }}}|r|dk    rdnd}| | | S |S )N+-r   )r>   rV   signoffsets       r   _prepare_tzname_deltaz(DatabaseOperations._prepare_tzname_deltag   sJ    1&99f 	-#++333D,d,F,,,r   c                 h    |r-t           j        r!|                     |          }| dg ||R fS ||fS )Nz AT TIME ZONE %s)r   USE_TZr^   )r>   rM   rN   rV   tzname_params        r   rT   z%DatabaseOperations._convert_sql_to_tzn   sT     	Eho 	E55f==L+++-Dv-D|-D-DDDF{r   c                 F    |                      |||          \  }}d| d|fS )Nr8   z)::daterS   r>   rM   rN   rV   s       r   datetime_cast_date_sqlz)DatabaseOperations.datetime_cast_date_sqlt   3    --c66BBV3''r   c                 F    |                      |||          \  }}d| d|fS )Nr8   )::timerS   rc   s       r   datetime_cast_time_sqlz)DatabaseOperations.datetime_cast_time_sqlx   re   r   c                     |                      |||          \  }}|dk    rd| ddg|R fS |                     |||          S Nsecondz#EXTRACT(SECOND FROM DATE_TRUNC(%s, )))rT   rO   rU   s        r   datetime_extract_sqlz'DatabaseOperations.datetime_extract_sql|   sa    --c66BBV(""@@@@8BUfBUBUUU$$[#v>>>r   c                 N    |                      |||          \  }}d| d|g|R fS rQ   rS   rU   s        r   datetime_trunc_sqlz%DatabaseOperations.datetime_trunc_sql   rX   r   c                 T    |dk    rd| ddg|R fS |                      |||          S rj   )rO   rK   s       r   time_extract_sqlz#DatabaseOperations.time_extract_sql   sF    (""@@@@8BUfBUBUUU$$[#v>>>r   c                 N    |                      |||          \  }}d| d|g|R fS )NrR   rg   rS   rU   s        r   time_trunc_sqlz!DatabaseOperations.time_trunc_sql   s>    --c66BBV----/Ef/E/EEEr   c                     dS )Nz DEFERRABLE INITIALLY DEFERRED r>   s    r   deferrable_sqlz!DatabaseOperations.deferrable_sql   s    //r   c                 *    |                                 S )z
        Given a cursor object that has just performed an INSERT...RETURNING
        statement into a table, return the tuple of returned data.
        )fetchall)r>   cursors     r   fetch_returned_insert_rowsz-DatabaseOperations.fetch_returned_insert_rows   s    
    r   c                 6    d}|dv r	|dv rd}nd}|dv rd|z  }|S )Nr9   )	iexactcontains	icontains
startswithistartswithendswith	iendswithregexiregex)r5   r4   zHOST(%s)z%s::text)r}   r   r   r   z	UPPER(%s)ru   )r>   rL   r@   lookups       r   lookup_castzDatabaseOperations.lookup_cast   sP     

 

 

  KKK## MMM 6)Fr   c                     d S Nru   rv   s    r   no_limit_valuez!DatabaseOperations.no_limit_value   s    tr   c                     |gS r   ru   )r>   rM   s     r   prepare_sql_scriptz%DatabaseOperations.prepare_sql_script   s	    ur   c                 d    |                     d          r|                    d          r|S d|z  S )N"z"%s")r   r   )r>   names     r   
quote_namezDatabaseOperations.quote_name   s8    ??3 	DMM#$6$6 	K}r   c                 .    t          ||| j                  S r   )r   r<   )r>   rM   rN   s      r   compose_sqlzDatabaseOperations.compose_sql   s    sFDO444r   c                     dS )Nz(SELECT set_config('TimeZone', %s, false)ru   rv   s    r   set_time_zone_sqlz$DatabaseOperations.set_time_zone_sql   s    99r   F)reset_sequencesallow_cascadec                V    |sg S                      d          d                     fd|D                       g}|r(|                                         d                     |r(|                                         d                     dd                    |          z  gS )NTRUNCATE, c              3   h   K   | ],}                                         |                    V  -d S r   )	SQL_FIELDr   ).0tabler>   styles     r   	<genexpr>z/DatabaseOperations.sql_flush.<locals>.<genexpr>   s;      RR%eoodooe&<&<==RRRRRRr   zRESTART IDENTITYCASCADEz%s; )SQL_KEYWORDjoinappend)r>   r   tablesr   r   	sql_partss   ``    r   	sql_flushzDatabaseOperations.sql_flush   s     	I
 j))IIRRRRR6RRRRR
	  	DU../ABBCCC 	;U..y99:::+++,,r   c           
         g }|D ]~}|d         }|d         pd}|                     |                    d          d|                    |                     |                    d|                    |          d           |S )Nr   columnidSELECT  setval(pg_get_serial_sequence('','z'), 1, false);)r   r   	SQL_TABLEr   r   )r>   r   	sequencesrM   sequence_info
table_namecolumn_names          r   sequence_reset_by_name_sqlz-DatabaseOperations.sequence_reset_by_name_sql   s     & 	 	M&w/J (19TKJJ %%h////OODOOJ$?$?@@@@OOK0000	    
r   c                 f    |rd|                      |          z  S d|                      |          z  S )NzUSING INDEX TABLESPACE %szTABLESPACE %s)r   )r>   
tablespaceinlines      r   tablespace_sqlz!DatabaseOperations.tablespace_sql   s9     	A.1L1LLL"T__Z%@%@@@r   c                    ddl m} g }| j        }|D ]8}|j        j        D ]'}t          ||j                  r|                    |                    d          d|	                     ||j        j
                            d|                    |j                  d|                     ||j                            d|                     ||j                            d|                    d	          d
|                    d          d|	                     ||j        j
                            d            n):|S )Nr   )modelsr   r   r   z'), coalesce(max(z), 1), max(z) zIS NOTz null) FROMr   ;)	django.dbr   r   _metalocal_fields
isinstancer)   r   r   r   db_tabler   r   )r>   r   
model_listr   outputqnmodelfs           r   sequence_reset_sqlz%DatabaseOperations.sequence_reset_sql   sm   $$$$$$_ 	 	E [-  a!122 MM "--h7777!OOBBu{/C,D,DEEEE!OOAH5555!OOBBqxLL9999!OOBBqxLL9999!--h7777!--f5555!OOBBu{/C,D,DEEEE    E#$ r   c                     |S r   ru   )r>   xs     r   prep_for_iexact_queryz(DatabaseOperations.prep_for_iexact_query  s    r   c                     dS )a  
        Return the maximum length of an identifier.

        The maximum length of an identifier is 63 by default, but can be
        changed by recompiling PostgreSQL after editing the NAMEDATALEN
        macro in src/include/pg_config_manual.h.

        This implementation returns 63, but can be overridden by a custom
        database backend that inherits most of its behavior from this one.
        ?   ru   rv   s    r   max_name_lengthz"DatabaseOperations.max_name_length  s	     rr   c                 ^    |r'd |D             }dd                     |          z  g|fS dgg fS )Nc                     g | ]	}|D ]}|
S ru   ru   )r   
param_listparams      r   
<listcomp>z3DatabaseOperations.distinct_sql.<locals>.<listcomp>#  s%    MMM
*MMeMMMMr   zDISTINCT ON (%s)r   DISTINCTr   )r>   fieldsrN   s      r   distinct_sqlzDatabaseOperations.distinct_sql!  sI     	$MMfMMMF'$))F*;*;;<fEE<##r   c                     | j         j        j        r-	 |                     ||          S # t          j        $ r Y d S w xY w|j        r*|j        j        |j        j                                        S d S r   )	r<   featuresuses_server_side_bindingr   r	   	DataError_queryquerydecoder>   rz   rM   rN   s       r   last_executed_queryz&DatabaseOperations.last_executed_query*  s    '@  ++C888'      44  = 8V]%8%D!=.55777ts   ) <<c                 F    |j         |j                                         S d S r   )r   r   r   s       r   r   z&DatabaseOperations.last_executed_query7  s%     |'|**,,,4r   c                 \     |sdS  fd|D             }dd                     |          z  dfS )N) ru   c                     g | ]C}                     |j        j        j                  d                      |j                  DS ).)r   r   r   r   r   )r   fieldr>   s     r   r   z<DatabaseOperations.return_insert_columns.<locals>.<listcomp>A  s^     
 
 
   1 :;;;;---
 
 
r   zRETURNING %sr   ru   r   )r>   r   columnss   `  r   return_insert_columnsz(DatabaseOperations.return_insert_columns>  sX     	6
 
 
 
  
 
 
 		' 2 22B66r   c                 V    |t          |d          r|S  | j        |         |          S )Nresolve_expression)hasattrintegerfield_type_map)r>   valuer@   s      r   adapt_integerfield_valuez+DatabaseOperations.adapt_integerfield_valueM  s3    }/C D D}<4-m<UCCCr   c                     |S r   ru   r>   r   s     r   adapt_datefield_valuez(DatabaseOperations.adapt_datefield_valueR      r   c                     |S r   ru   r   s     r   adapt_datetimefield_valuez,DatabaseOperations.adapt_datetimefield_valueU  r   r   c                     |S r   ru   r   s     r   adapt_timefield_valuez(DatabaseOperations.adapt_timefield_valueX  r   r   c                     |S r   ru   )r>   r   
max_digitsdecimal_placess       r   adapt_decimalfield_valuez+DatabaseOperations.adapt_decimalfield_value[  r   r   c                 (    |rt          |          S d S r   )r   r   s     r   adapt_ipaddressfield_valuez-DatabaseOperations.adapt_ipaddressfield_value^  s     	;;tr   c                 >    t          |t          |                    S )N)r   )r   r   )r>   r   r   s      r   adapt_json_valuez#DatabaseOperations.adapt_json_valuec  s    U."9"9::::r   c                     |dk    r|\  }}|\  }}g ||R }d|d|d|fS t                                          |||          S )N	DateFieldz(interval '1 day' * (z - rl   )supersubtract_temporals)
r>   r@   lhsrhslhs_sql
lhs_paramsrhs_sql
rhs_paramsrN   	__class__s
            r   r   z%DatabaseOperations.subtract_temporalsf  sj    K''"%GZ"%GZ/z/J//FF7>wwH&PPww))-cBBBr   c                 N   i }|rEd |                                 D             }| j        D ]}|                    |d           }||||<     t                      j        |fi |}|r||d<   |r7|dd                    d |                                 D                       z  z  }|S )Nc                 F    i | ]\  }}|                                 |rd ndS )truefalse)rG   )r   r   r   s      r   
<dictcomp>z;DatabaseOperations.explain_query_prefix.<locals>.<dictcomp>r  s?       D% 

:ff7  r   FORMATz (%s)r   c              3       K   | ]	}d |z  V  
dS )z%s %sNru   )r   is     r   r   z:DatabaseOperations.explain_query_prefix.<locals>.<genexpr>~  s&      )M)M!'A+)M)M)M)M)M)Mr   )itemsexplain_optionspopr   explain_query_prefixr   )r>   formatoptionsextravalid_optionr   prefixr  s          r   r  z'DatabaseOperations.explain_query_prefixn  s     	0 #*==??  G !% 4 0 0L$77$*/E,'--f@@@@ 	%$E(O 	Ng		)M)Mu{{}})M)M)M M MMMFr   c           
      L   |t           j        k    rdS |t           j        k    r^dd                    t	          | j        |                    dd                    d t	          | j        |          D                       S t                                          ||||          S )NzON CONFLICT DO NOTHINGzON CONFLICT(r   z) DO UPDATE SET c                     g | ]	}| d | 
S )z = EXCLUDED.ru   )r   r   s     r   r   z=DatabaseOperations.on_conflict_suffix_sql.<locals>.<listcomp>  s6       ! !55e55  r   )r   IGNOREUPDATEr   mapr   r   on_conflict_suffix_sql)r>   r   on_conflictupdate_fieldsunique_fieldsr  s        r   r  z)DatabaseOperations.on_conflict_suffix_sql  s    *+++++*++++		#do}==>>>>		 %(-%H%H      ww--	
 
 	
r   c                     t                                          ||||          \  }}|                    | j                  |                    | j                  k    rt	          ||          }||fS r   )r   prepare_join_on_clauser;   r<   r   )r>   	lhs_table	lhs_field	rhs_table	rhs_fieldlhs_exprrhs_exprr  s          r   r#  z)DatabaseOperations.prepare_join_on_clause  sq    "WW;;y)Y
 
( T_--1B1B4?1S1SSSHi00H!!r   r   )F)NN)9__name__
__module____qualname__"cast_char_field_without_max_lengthexplain_prefix	frozensetr  cast_data_typesr
   psycopg.typesr,   Int2Int4Int8r   rA   r   rH   rO   rW   r^   rT   rd   rh   rm   ro   rq   rs   rw   r{   r   r   r   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   r   r      s       )2&Ni
	
 
	
 
	
 O  $ O  

)))))) ")#L&|)0$+L'.|!
 !
  * *)*55< < <@ @ @ @
    ( ( (( ( (? ? ?@ @ @
? ? ?F F F F0 0 0! ! !   2      
5 5 5: : : ;@u - - - - -   &A A A A     D    $ $ $  		 		 		 			 	 	7 7 7  D	D 	D 	D
           
; ; ;C C C C C     &
 
 
 
 
(" " " " " " " " "r   r   )r   	functoolsr   r   django.confr   "django.db.backends.base.operationsr   )django.db.backends.postgresql.psycopg_anyr   r   r	   r
   r   django.db.backends.utilsr   django.db.models.constantsr   django.db.models.functionsr   django.utils.regex_helperr   r   r   ru   r   r   <module>r>     s4    ( ( ( ( ( ( ( (             E E E E E E              8 7 7 7 7 7 1 1 1 1 1 1 + + + + + + 6 6 6 6 6 6 , , ,C" C" C" C" C"/ C" C" C" C" C"r   