
    sghD>                         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	 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y)    N)	lru_cachepartial)settings)BaseDatabaseOperations)InsertUnnest)InetJsonberrorsis_psycopg3mogrifysplit_tzname_delta)
OnConflict)Cast)_lazy_re_compilec                 \    | t         j                  S t        t         j                  |       S )N)cls)jsondumpsr   )encoders    l/var/www/enzed_healthcare/enzed_env/lib/python3.12/site-packages/django/db/backends/postgresql/operations.pyget_json_dumpsr      s"    zz4::7++    c                   
    e Zd ZdZdZdZ eg d      ZddddZe	rKd	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 f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. Z0d/ Z1d0 Z2d1 Z3d2 Z4 fd3Z5d7 fd4	Z6 fd5Z7 fd6Z8 xZ9S )9DatabaseOperationsz&django.db.backends.postgresql.compilervarcharEXPLAIN)ANALYZEBUFFERSCOSTSGENERIC_PLANMEMORYSETTINGS	SERIALIZESUMMARYTIMINGVERBOSEWALintegerbigintsmallint)	AutoFieldBigAutoFieldSmallAutoFieldr   )numeric)SmallIntegerFieldIntegerFieldBigIntegerFieldPositiveSmallIntegerFieldPositiveIntegerFieldPositiveBigIntegerFieldc                     |j                         }|dv r0d|j                  | j                        j                  d      d   z  S y)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@   sR    $668 
 
 "L$8$8$I$O$OPS$TUV$WW r   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                         }| j                  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rA   lookup_typesqlparamss       r   date_extract_sqlz#DatabaseOperations.date_extract_sqlW   s    *$&se51699N*)#a0&88J&*3%q1699!'')&&00=4[ODEE+fSE3V;;r   c                 F    | j                  |||      \  }}d| d|g|fS NDATE_TRUNC(%s, rH   _convert_sql_to_tzrA   rO   rP   rQ   tznames        r   date_trunc_sqlz!DatabaseOperations.date_trunc_sqlf   6    --c66BV Q'+)?)???r   c                 J    t        |      \  }}}|r|dk(  rdnd}| | | S |S )N+-r   )rA   rY   signoffsets       r   _prepare_tzname_deltaz(DatabaseOperations._prepare_tzname_deltak   s;    1&9f#+33DXdVF8,,r   c                 h    |r-t         j                  r| j                  |      }| dg ||fS ||fS )Nz AT TIME ZONE %s)r   USE_TZra   )rA   rP   rQ   rY   tzname_params        r   rW   z%DatabaseOperations._convert_sql_to_tzr   sC    hoo55f=LU*+-Dv-D|-DDDF{r   c                 >    | j                  |||      \  }}d| d|fS )Nr;   z)::daterV   rA   rP   rQ   rY   s       r   datetime_cast_date_sqlz)DatabaseOperations.datetime_cast_date_sqlx   .    --c66BV3%w''r   c                 >    | j                  |||      \  }}d| d|fS )Nr;   )::timerV   rf   s       r   datetime_cast_time_sqlz)DatabaseOperations.datetime_cast_time_sql|   rh   r   c                 v    | j                  |||      \  }}|dk(  rd| ddg|fS | j                  |||      S Nsecondz#EXTRACT(SECOND FROM DATE_TRUNC(%s, )))rW   rR   rX   s        r   datetime_extract_sqlz'DatabaseOperations.datetime_extract_sql   sS    --c66BV("8R@8BUfBUUU$$[#v>>r   c                 F    | j                  |||      \  }}d| d|g|fS rT   rV   rX   s        r   datetime_trunc_sqlz%DatabaseOperations.datetime_trunc_sql   r[   r   c                 J    |dk(  rd| ddg|fS | j                  |||      S rm   )rR   rN   s       r   time_extract_sqlz#DatabaseOperations.time_extract_sql   s;    ("8R@8BUfBUUU$$[#v>>r   c                 F    | j                  |||      \  }}d| d|g|fS )NrU   rj   rV   rX   s        r   time_trunc_sqlz!DatabaseOperations.time_trunc_sql   s6    --c66BV W-/Ef/EEEr   c                      y)Nz DEFERRABLE INITIALLY DEFERRED rA   s    r   deferrable_sqlz!DatabaseOperations.deferrable_sql   s    /r   c                 N    t        |t              rd| S t        |   ||      S )NzSELECT * FROM )
isinstancer   superbulk_insert_sql)rA   fieldsplaceholder_rows	__class__s      r   r~   z"DatabaseOperations.bulk_insert_sql   s0    &5#$4#566w&v/?@@r   c                 "    |j                         S )z
        Given a cursor object that has just performed an INSERT...RETURNING
        statement into a table, return the tuple of returned data.
        )fetchall)rA   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 )Nr<   )	iexactcontains	icontains
startswithistartswithendswith	iendswithregexiregex)r8   r7   zHOST(%s)z%s::text)r   r   r   r   z	UPPER(%s)rx   )rA   rO   rC   lookups       r   lookup_castzDatabaseOperations.lookup_cast   sC     

 

  KK## MM 6)Fr   c                      y Nrx   ry   s    r   no_limit_valuez!DatabaseOperations.no_limit_value   s    r   c                     |gS r   rx   )rA   rP   s     r   prepare_sql_scriptz%DatabaseOperations.prepare_sql_script   s	    ur   c                 T    |j                  d      r|j                  d      r|S d|z  S )N"z"%s")r   r   )rA   names     r   
quote_namezDatabaseOperations.quote_name   s(    ??3DMM#$6K}r   c                 0    t        ||| j                        S r   )r   r?   )rA   rP   rQ   s      r   compose_sqlzDatabaseOperations.compose_sql   s    sFDOO44r   c                      y)Nz(SELECT set_config('TimeZone', %s, false)rx   ry   s    r   set_time_zone_sqlz$DatabaseOperations.set_time_zone_sql   s    9r   F)reset_sequencesallow_cascadec                    |sg S j                  d      dj                   fd|D              g}|r |j                  j                  d             |r |j                  j                  d             ddj                  |      z  gS )NTRUNCATE, c              3   ^   K   | ]$  }j                  j                  |             & y wr   )	SQL_FIELDr   ).0tablerA   styles     r   	<genexpr>z/DatabaseOperations.sql_flush.<locals>.<genexpr>   s#     R%eoodooe&<=Rs   *-zRESTART IDENTITYCASCADEz%s; )SQL_KEYWORDjoinappend)rA   r   tablesr   r   	sql_partss   ``    r   	sql_flushzDatabaseOperations.sql_flush   s    I
 j)IIR6RR
	 U../ABCU..y9:++,,r   c           
          g }|D ]f  }|d   }|d   xs d}|j                  |j                  d      d|j                  | j                  |            d|j	                  |      d       h |S )Nr   columnidSELECT  setval(pg_get_serial_sequence('','z'), 1, false);)r   r   	SQL_TABLEr   r   )rA   r   	sequencesrP   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		 
r   c                 V    |rd| j                  |      z  S d| j                  |      z  S )NzUSING INDEX TABLESPACE %szTABLESPACE %s)r   )rA   
tablespaceinlines      r   tablespace_sqlz!DatabaseOperations.tablespace_sql   s-    .1LLL"T__Z%@@@r   c                    ddl m} g }| j                  }|D ]7  }|j                  j                  D ]  }t        ||j                        s|j                  |j                  d      d|j                   ||j                  j                              d|j                  |j                        d|j                   ||j                              d|j                   ||j                              d|j                  d	      d
|j                  d      d|j                   ||j                  j                              d        7 : |S )Nr   )modelsr   r   r   z'), coalesce(max(z), 1), max(z) zIS NOTz null) FROMr   ;)	django.dbr   r   _metalocal_fieldsr|   r,   r   r   r   db_tabler   r   )rA   r   
model_listr   outputqnmodelfs           r   sequence_reset_sqlz%DatabaseOperations.sequence_reset_sql   s   $__ 	E [[-- a!1!12MM "--h7!OOBu{{/C/C,DE!OOAHH5!OOBqxxL9!OOBqxxL9!--h7!--f5!OOBu{{/C/C,DE  %	6 r   c                     |S r   rx   )rA   xs     r   prep_for_iexact_queryz(DatabaseOperations.prep_for_iexact_query  s    r   c                      y)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.
        ?   rx   ry   s    r   max_name_lengthz"DatabaseOperations.max_name_length  s     r   c                 z    |r/|D cg c]  }|D ]  }|  }}}ddj                  |      z  g|fS dgg fS c c}}w )NzDISTINCT ON (%s)r   DISTINCT)r   )rA   r   rQ   
param_listparams        r   distinct_sqlzDatabaseOperations.distinct_sql*  sS    .4M
*MeMeMFM'$))F*;;<fEE<## Ns   7c                 (   | j                   j                  j                  r	 | j                  ||      S |j                  r:|j                  j                  $|j                  j                  j                         S y # t        j
                  $ r Y y w xY wr   )	r?   featuresuses_server_side_bindingr   r
   	DataError_queryquerydecoderA   r   rP   rQ   s       r   last_executed_queryz&DatabaseOperations.last_executed_query3  s{    ''@@ ++C88 ==V]]%8%8%D!==..5577 ''   s   A; ;BBc                 P    |j                   |j                   j                         S y r   )r   r   r   s       r   r   z&DatabaseOperations.last_executed_query@  s$     ||'||**,,r   c                     |sy|D cg c]O  }| j                  |j                  j                  j                        d| j                  |j                        Q }}ddj                  |      z  dfS c c}w )N) rx   .zRETURNING %sr   rx   )r   r   r   r   r   r   )rA   r   fieldcolumnss       r   return_insert_columnsz(DatabaseOperations.return_insert_columnsG  sw      
   1 1 : :;-
 
 		' 22B66
s   AA4c                 L    |t        |d      r|S  | j                  |   |      S )Nresolve_expression)hasattrintegerfield_type_map)rA   valuerC   s      r   adapt_integerfield_valuez+DatabaseOperations.adapt_integerfield_valueV  s.    }/C D<4--m<UCCr   c                     |S r   rx   rA   r   s     r   adapt_datefield_valuez(DatabaseOperations.adapt_datefield_value[      r   c                     |S r   rx   r   s     r   adapt_datetimefield_valuez,DatabaseOperations.adapt_datetimefield_value^  r   r   c                     |S r   rx   r   s     r   adapt_timefield_valuez(DatabaseOperations.adapt_timefield_valuea  r   r   c                     |rt        |      S y r   )r   r   s     r   adapt_ipaddressfield_valuez-DatabaseOperations.adapt_ipaddressfield_valued  s    ;r   c                 .    t        |t        |            S )N)r   )r	   r   )rA   r   r   s      r   adapt_json_valuez#DatabaseOperations.adapt_json_valuei  s    U."9::r   c                 h    |dk(  r|\  }}|\  }}g ||}d|d|d|fS t         	|   |||      S )N	DateFieldz(interval '1 day' * (z - ro   )r}   subtract_temporals)
rA   rC   lhsrhslhs_sql
lhs_paramsrhs_sql
rhs_paramsrQ   r   s
            r   r   z%DatabaseOperations.subtract_temporalsl  sR    K'"%GZ"%GZ/z/J/F7>H&PPw)-cBBr   c                    i }|j                  dd       x}r%|j                         dv r|j                         |d<   |r`|j                         D ci c]  \  }}|j                         |rdnd }}}| j                  D ]  }|j                  |d       }||||<    t	        	|   |fi |}|r||d<   |r,|ddj                  d	 |j                         D              z  z  }|S c c}}w )
N	serialize>   TEXTBINARYr$   truefalseFORMATz (%s)r   c              3   &   K   | ]	  }d |z    yw)z%s %sNrx   )r   is     r   r   z:DatabaseOperations.explain_query_prefix.<locals>.<genexpr>  s     )M!'A+)Ms   )poprJ   itemsexplain_optionsr}   explain_query_prefixr   )
rA   formatoptionsextrar  r   r   valid_optionprefixr   s
            r   r  z'DatabaseOperations.explain_query_prefixt  s   K6696 $66%.__%6k" $+==?D% 

f7:G  !% 4 4 0L$7$*/E,'0 -f@@$E(Og		)Mu{{})M MMMFs   C&c                 B   |t         j                  k(  ry|t         j                  k(  raddj                  t	        | j
                  |            ddj                  t	        | j
                  |      D cg c]	  }| d|  c}      S t        |   ||||      S c c}w )NzON CONFLICT DO NOTHINGzON CONFLICT(r   z) DO UPDATE SET z = EXCLUDED.)r   IGNOREUPDATEr   mapr   r}   on_conflict_suffix_sql)rA   r   on_conflictupdate_fieldsunique_fieldsr   r   s         r   r  z)DatabaseOperations.on_conflict_suffix_sql  s    *++++*+++		#doo}=>		 &)-%H! !'eW5  w-	
 	
s   3Bc                     t         |   ||||      \  }}|j                  | j                        |j                  | j                        k7  rt	        ||      }||fS r   )r}   prepare_join_on_clauser>   r?   r   )rA   	lhs_table	lhs_field	rhs_table	rhs_fieldlhs_exprrhs_exprr   s          r   r!  z)DatabaseOperations.prepare_join_on_clause  s_    "W;y)Y
( T__-1B1B4??1SSHi0H!!r   r   )F):__name__
__module____qualname__compiler_module"cast_char_field_without_max_lengthexplain_prefix	frozensetr  cast_data_typesr   psycopg.typesr/   Int2Int4Int8r   rD   r   rK   rR   rZ   ra   rW   rg   rk   rp   rr   rt   rv   rz   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      sd   >O)2&N	
O   $O ) ")#LL&||)0$+LL'.||!
* **5<@
((?@
?F0A
!2
5: ;@u - &A D$ 			7 	D

;C,
(" "r   r   )r   	functoolsr   r   django.confr   "django.db.backends.base.operationsr   &django.db.backends.postgresql.compilerr   )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   rx   r   r   <module>r>     sO     (   E ?  8 1 + 6 , ,K"/ K"r   