o
    ^"<f.                     @   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                       sj  e Zd ZdZdZeg dZddddZdd	 Zd
d Z	dQddZ
dd Zdd Zdd Zdd Zdd Zdd ZdQddZdd Zdd  ZdQd!d"Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d+d,d-d.Zd/d0 ZdRd1d2Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z d=d> Z!d?d@ Z"dAdB Z#dCdD Z$dEdF Z%dSdGdHZ&dIdJ Z' fdKdLZ(dQ fdMdN	Z)dQ fdOdP	Z*  Z+S )TDatabaseOperationsvarcharEXPLAIN)ANALYZEBUFFERSCOSTSSETTINGSSUMMARYTIMINGVERBOSEWALintegerbigintsmallint)	AutoFieldBigAutoFieldSmallAutoFieldc                 C   s.   |  }|dv rd|| jdd  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_type r$   _/var/www/html/kck/venv/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 )Nweek_dayzEXTRACT('dow' FROM %s) + 1iso_week_dayzEXTRACT('isodow' FROM %s)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_sql5      z!DatabaseOperations.date_trunc_sqlc                 C   s,   d|v r
| ddS d|v r| ddS |S )N+-)replace)r!   r2   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   USE_TZr8   r!   r+   r2   r$   r$   r%   r0   A   s   
z'DatabaseOperations._convert_field_to_tzc                 C      |  ||}d| S )Nz
(%s)::dater/   r:   r$   r$   r%   datetime_cast_date_sqlF      z)DatabaseOperations.datetime_cast_date_sqlc                 C   r;   )Nz
(%s)::timer/   r:   r$   r$   r%   datetime_cast_time_sqlJ   r=   z)DatabaseOperations.datetime_cast_time_sqlc                 C   s   |  ||}| ||S N)r0   r,   r1   r$   r$   r%   datetime_extract_sqlN      z'DatabaseOperations.datetime_extract_sqlc                 C   r-   r.   r/   r1   r$   r$   r%   datetime_trunc_sqlR   r4   z%DatabaseOperations.datetime_trunc_sqlc                 C   r-   )NzDATE_TRUNC('%s', %s)::timer/   r1   r$   r$   r%   time_trunc_sqlW   rA   z!DatabaseOperations.time_trunc_sqlc                 C      dS )Nz DEFERRABLE INITIALLY DEFERREDr$   r!   r$   r$   r%   deferrable_sql[      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.
        )fetchall)r!   cursorr$   r$   r%   fetch_returned_insert_rows^   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regexiregex)r   r   zHOST(%s))CICharFieldCIEmailFieldCITextFieldz
%s::citextz%s::text)rK   rM   rO   rQ   z	UPPER(%s)r$   )r!   r*   r#   lookupr$   r$   r%   lookup_caste   s   zDatabaseOperations.lookup_castc                 C   s   d S r?   r$   rE   r$   r$   r%   no_limit_valuex   rG   z!DatabaseOperations.no_limit_valuec                 C   s   |gS r?   r$   )r!   sqlr$   r$   r%   prepare_sql_script{   s   z%DatabaseOperations.prepare_sql_scriptc                 C   s    | dr|dr|S d| S )N"z"%s")rN   rP   )r!   namer$   r$   r%   
quote_name~   s   zDatabaseOperations.quote_namec                 C   rD   )NzSET TIME ZONE %sr$   rE   r$   r$   r%   set_time_zone_sql   rG   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 )	NTRUNCATE, c                 3   s     | ]}  |V  qd S r?   )	SQL_FIELDr^   ).0tabler!   styler$   r%   	<genexpr>   s    z/DatabaseOperations.sql_flush.<locals>.<genexpr>zRESTART IDENTITYCASCADEz%s; )SQL_KEYWORDjoinappend)r!   rh   tablesr`   ra   	sql_partsr$   rg   r%   	sql_flush   s   zDatabaseOperations.sql_flushc              
   C   sR   g }|D ]"}|d }|d pd}| d|d|| |||f  q|S )Nrf   columnidz7%s setval(pg_get_serial_sequence('%s','%s'), 1, false);SELECT)rn   rl   	SQL_TABLEr^   rd   )r!   rh   	sequencesrZ   sequence_info
table_name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)r^   )r!   
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 NOTFROM)	django.dbr~   r^   _metalocal_fields
isinstancer   rn   rl   ru   db_tablerd   rr   )r!   rh   
model_listr~   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   rG   z(DatabaseOperations.prep_for_iexact_queryc                 C   rD   )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$   rE   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$   )re   
param_listparamr$   r$   r%   
<listcomp>   s    z3DatabaseOperations.distinct_sql.<locals>.<listcomp>zDISTINCT ON (%s)rc   DISTINCTrm   )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!   rI   rZ   r   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)r^   r   r   r   rr   )re   fieldrE   r$   r%   r      s    
z<DatabaseOperations.return_insert_columns.<locals>.<listcomp>zRETURNING %src   r$   r   )r!   r   columnsr$   rE   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 )rc   Nr   )re   rowr$   r$   r%   ri      s    z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>rc   c                 s       | ]}d | V  qdS )z(%s)Nr$   )re   rZ   r$   r$   r%   ri          zVALUES r   )r!   r   placeholder_rowsplaceholder_rows_sql
values_sqlr$   r$   r%   bulk_insert_sql   s   z"DatabaseOperations.bulk_insert_sqlc                 C   r   r?   r$   r!   valuer$   r$   r%   adapt_datefield_value   rG   z(DatabaseOperations.adapt_datefield_valuec                 C   r   r?   r$   r   r$   r$   r%   adapt_datetimefield_value   rG   z,DatabaseOperations.adapt_datetimefield_valuec                 C   r   r?   r$   r   r$   r$   r%   adapt_timefield_value   rG   z(DatabaseOperations.adapt_timefield_valuec                 C   r   r?   r$   )r!   r   
max_digitsdecimal_placesr$   r$   r%   adapt_decimalfield_value   rG   z+DatabaseOperations.adapt_decimalfield_valuec                 C   s   |rt |S d S r?   r   r   r$   r$   r%   adapt_ipaddressfield_value  s   z-DatabaseOperations.adapt_ipaddressfield_valuec           	         sF   |dkr|\}}|\}}g ||R }d||f |fS t  |||S )N	DateFieldz(interval '1 day' * (%s - %s)))supersubtract_temporals)	r!   r#   lhsrhslhs_sql
lhs_paramsrhs_sql
rhs_paramsr   	__class__r$   r%   r     s   z%DatabaseOperations.subtract_temporalsc                    s   i }|r#dd |  D }| jD ]}||d }|d ur"||| < qt j|fi |}|r3||d< |rE|dddd |  D  7 }|S )Nc                 S   s"   i | ]\}}|  |rd ndqS )truefalse)upper)re   r]   r   r$   r$   r%   
<dictcomp>  s    z;DatabaseOperations.explain_query_prefix.<locals>.<dictcomp>FORMATz (%s)rc   c                 s   r   )z%s %sNr$   )re   ir$   r$   r%   ri      r   z:DatabaseOperations.explain_query_prefix.<locals>.<genexpr>)itemsexplain_optionspopr   r   explain_query_prefixrm   )r!   formatoptionsextravalid_optionr   prefixr   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!   ignore_conflictsr   r$   r%   r   #  s   z.DatabaseOperations.ignore_conflicts_suffix_sqlr?   )F)NN),__name__
__module____qualname__"cast_char_field_without_max_lengthexplain_prefix	frozensetr   cast_data_typesr&   r,   r3   r8   r0   r<   r>   r@   rB   rC   rF   rJ   rX   rY   r[   r^   r_   rq   rz   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r$   r$   r   r%   r      sZ    




r   N)psycopg2.extrasr   django.confr   "django.db.backends.base.operationsr   r   r$   r$   r$   r%   <module>   s    