o
    b,                     @   s8   d dl mZ d dlmZ d dlmZ G dd deZdS )    Inet)settings)BaseDatabaseOperationsc                       s^  e Zd ZdZdZddddZdd Zd	d
 ZdPddZdd Z	dd Z
dd Zdd Zdd Zdd ZdPddZdd Zdd ZdPd d!Zd"d# Zd$d% Zd&d' Zd(d) Zd*d*d+d,d-Zd.d/ ZdQd0d1Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Zd>d? Z d@dA Z!dBdC Z"dDdE Z#dRdFdGZ$dHdI Z% fdJdKZ&dP fdLdM	Z'dP fdNdO	Z(  Z)S )SDatabaseOperationsZvarcharZEXPLAINintegerZbigintZsmallint)	AutoFieldZBigAutoFieldZSmallAutoFieldc                 C   s.   |  }|dv rd|| jdd  S dS )N)GenericIPAddressFieldIPAddressFieldZ	TimeFieldZ	UUIDFieldzCAST(%%s AS %s)(r   %s)Zget_internal_typeZdb_type
connectionsplit)selfZoutput_fieldinternal_type r   g/var/www/secure340b-portal/env/lib/python3.10/site-packages/django/db/backends/postgresql/operations.pyunification_cast_sql   s   z'DatabaseOperations.unification_cast_sqlc                 C   s<   |dkrd| S |dkrd| S |dkrd| S d||f S )NZweek_dayzEXTRACT('dow' FROM %s) + 1Ziso_week_dayzEXTRACT('isodow' FROM %s)Ziso_yearzEXTRACT('isoyear' FROM %s)zEXTRACT('%s' FROM %s)r   )r   lookup_type
field_namer   r   r   date_extract_sql   s   z#DatabaseOperations.date_extract_sqlNc                 C      |  ||}d||f S NzDATE_TRUNC('%s', %s)_convert_field_to_tzr   r   r   tznamer   r   r   date_trunc_sql)      z!DatabaseOperations.date_trunc_sqlc                 C   s,   d|v r
| ddS d|v r| ddS |S )N+-)replace)r   r   r   r   r   _prepare_tzname_delta.   s
   z(DatabaseOperations._prepare_tzname_deltac                 C   s    |rt jrd|| |f }|S )Nz%s AT TIME ZONE '%s')r   ZUSE_TZr"   r   r   r   r   r   r   r   5   s   
z'DatabaseOperations._convert_field_to_tzc                 C      |  ||}d| S )Nz
(%s)::dater   r#   r   r   r   datetime_cast_date_sql:      z)DatabaseOperations.datetime_cast_date_sqlc                 C   r$   )Nz
(%s)::timer   r#   r   r   r   datetime_cast_time_sql>   r&   z)DatabaseOperations.datetime_cast_time_sqlc                 C   s   |  ||}| ||S N)r   r   r   r   r   r   datetime_extract_sqlB      z'DatabaseOperations.datetime_extract_sqlc                 C   r   r   r   r   r   r   r   datetime_trunc_sqlF   r   z%DatabaseOperations.datetime_trunc_sqlc                 C   r   )NzDATE_TRUNC('%s', %s)::timer   r   r   r   r   time_trunc_sqlK   r*   z!DatabaseOperations.time_trunc_sqlc                 C      dS )Nz DEFERRABLE INITIALLY DEFERREDr   r   r   r   r   deferrable_sqlO      z!DatabaseOperations.deferrable_sqlc                 C   s   |  S )z
        Given a cursor object that has just performed an INSERT...RETURNING
        statement into a table, return the tuple of returned data.
        )Zfetchall)r   cursorr   r   r   fetch_returned_insert_rowsR   s   z-DatabaseOperations.fetch_returned_insert_rowsc                 C   s@   d}|dv r|dv rd}n	|dv rd}nd}|dv rd	| }|S )
Nr   )	iexactcontains	icontains
startswithistartswithendswith	iendswithregexZiregex)r
   r	   zHOST(%s))ZCICharFieldZCIEmailFieldZCITextFieldz
%s::citextz%s::text)r3   r5   r7   r9   z	UPPER(%s)r   )r   r   r   lookupr   r   r   lookup_castY   s   zDatabaseOperations.lookup_castc                 C   s   d S r(   r   r.   r   r   r   no_limit_valuel   r0   z!DatabaseOperations.no_limit_valuec                 C   s   |gS r(   r   )r   sqlr   r   r   prepare_sql_scripto   s   z%DatabaseOperations.prepare_sql_scriptc                 C   s    | dr|dr|S d| S )N"z"%s")r6   r8   )r   namer   r   r   
quote_namer   s   zDatabaseOperations.quote_namec                 C   r-   )NzSET TIME ZONE %sr   r.   r   r   r   set_time_zone_sqlw   r0   z$DatabaseOperations.set_time_zone_sqlF)reset_sequencesallow_cascadec                   sd   |sg S  dd fdd|D g}|r | d |r*| d dd| gS )	NZTRUNCATE, c                 3   s     | ]}  |V  qd S r(   )	SQL_FIELDrB   ).0tabler   styler   r   	<genexpr>   s    z/DatabaseOperations.sql_flush.<locals>.<genexpr>zRESTART IDENTITYZCASCADEz%s; )SQL_KEYWORDjoinappend)r   rK   ZtablesrD   rE   Z	sql_partsr   rJ   r   	sql_flushz   s   zDatabaseOperations.sql_flushc              
   C   sR   g }|D ]"}|d }|d pd}| d|d|| |||f  q|S )NrI   columnidz7%s setval(pg_get_serial_sequence('%s','%s'), 1, false);SELECT)rP   rN   	SQL_TABLErB   rG   )r   rK   	sequencesr>   Zsequence_infoZ
table_nameZcolumn_namer   r   r   sequence_reset_by_name_sql   s   
z-DatabaseOperations.sequence_reset_by_name_sqlc                 C   s    |r	d|  | S d|  | S )NzUSING INDEX TABLESPACE %szTABLESPACE %s)rB   )r   Z
tablespaceinliner   r   r   tablespace_sql   s   z!DatabaseOperations.tablespace_sqlc                 C   s   ddl m} g }| j}|D ]G}|jjD ]@}t||jrS|d|d|	||jj
||j|||j|||j|d|d|	||jj
f   nqq|S )Nr   )modelszZ%s setval(pg_get_serial_sequence('%s','%s'), coalesce(max(%s), 1), max(%s) %s null) %s %s;rT   zIS NOTZFROM)Z	django.dbrZ   rB   _metaZlocal_fields
isinstancer   rP   rN   rU   db_tablerG   rR   )r   rK   Z
model_listrZ   outputqnmodelfr   r   r   sequence_reset_sql   s.   
z%DatabaseOperations.sequence_reset_sqlc                 C      |S r(   r   )r   xr   r   r   prep_for_iexact_query   r0   z(DatabaseOperations.prep_for_iexact_queryc                 C   r-   )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.
        ?   r   r.   r   r   r   max_name_length   s   z"DatabaseOperations.max_name_lengthc                 C   s0   |rdd |D }dd | g|fS dgg fS )Nc                 S   s   g | ]	}|D ]}|qqS r   r   )rH   Z
param_listparamr   r   r   
<listcomp>   s    z3DatabaseOperations.distinct_sql.<locals>.<listcomp>zDISTINCT ON (%s)rF   ZDISTINCTrO   )r   fieldsparamsr   r   r   distinct_sql   s   
zDatabaseOperations.distinct_sqlc                 C   s   |j d ur
|j  S d S r(   )querydecode)r   r1   r>   rl   r   r   r   last_executed_query   s   

z&DatabaseOperations.last_executed_queryc                    s,   |sdS  fdd|D }dd | dfS )N) r   c                    s,   g | ]}d   |jjj  |jf qS )z%s.%s)rB   r`   r[   r]   rR   )rH   fieldr.   r   r   ri      s    
z<DatabaseOperations.return_insert_columns.<locals>.<listcomp>zRETURNING %srF   r   rj   )r   rk   columnsr   r.   r   return_insert_columns   s   
z(DatabaseOperations.return_insert_columnsc                 C   s*   dd |D }d dd |D }d| S )Nc                 s   s    | ]}d  |V  qdS )rF   Nrj   )rH   rowr   r   r   rL      s    z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>rF   c                 s       | ]}d | V  qdS )z(%s)Nr   )rH   r>   r   r   r   rL          zVALUES rj   )r   rk   Zplaceholder_rowsZplaceholder_rows_sqlZ
values_sqlr   r   r   bulk_insert_sql   s   z"DatabaseOperations.bulk_insert_sqlc                 C   rc   r(   r   r   valuer   r   r   adapt_datefield_value   r0   z(DatabaseOperations.adapt_datefield_valuec                 C   rc   r(   r   ry   r   r   r   adapt_datetimefield_value   r0   z,DatabaseOperations.adapt_datetimefield_valuec                 C   rc   r(   r   ry   r   r   r   adapt_timefield_value   r0   z(DatabaseOperations.adapt_timefield_valuec                 C   rc   r(   r   )r   rz   Z
max_digitsZdecimal_placesr   r   r   adapt_decimalfield_value   r0   z+DatabaseOperations.adapt_decimalfield_valuec                 C   s   |rt |S d S r(   r   ry   r   r   r   adapt_ipaddressfield_value   s   z-DatabaseOperations.adapt_ipaddressfield_valuec           	         sF   |dkr|\}}|\}}g ||R }d||f |fS t  |||S )NZ	DateFieldz(interval '1 day' * (%s - %s)))supersubtract_temporals)	r   r   lhsrhsZlhs_sqlZ
lhs_paramsZrhs_sqlZ
rhs_paramsrl   	__class__r   r   r      s   z%DatabaseOperations.subtract_temporalsc                    s`   t  |}i }|r||d< |r|dd | D  |r.|dddd | D  7 }|S )NZFORMATc                 S   s"   i | ]\}}|  |rd ndqS )truefalse)upper)rH   rA   rz   r   r   r   
<dictcomp>
  s    z;DatabaseOperations.explain_query_prefix.<locals>.<dictcomp>z (%s)rF   c                 s   rv   )z%s %sNr   )rH   ir   r   r   rL     rw   z:DatabaseOperations.explain_query_prefix.<locals>.<genexpr>)r   explain_query_prefixupdateitemsrO   )r   formatoptionsprefixextrar   r   r   r     s   
 z'DatabaseOperations.explain_query_prefixc                    s   |rdS t  |S )NzON CONFLICT DO NOTHING)r   ignore_conflicts_suffix_sql)r   Zignore_conflictsr   r   r   r     s   z.DatabaseOperations.ignore_conflicts_suffix_sqlr(   )F)NN)*__name__
__module____qualname__Z"cast_char_field_without_max_lengthZexplain_prefixZcast_data_typesr   r   r   r"   r   r%   r'   r)   r+   r,   r/   r2   r<   r=   r?   rB   rC   rQ   rW   rY   rb   re   rg   rm   rp   rt   rx   r{   r|   r}   r~   r   r   r   r   __classcell__r   r   r   r   r      sT    




r   N)Zpsycopg2.extrasr   Zdjango.confr   Z"django.db.backends.base.operationsr   r   r   r   r   r   <module>   s    