o
    TiL<                     @   s   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 ed	d
 ZG dd deZdS )    N)	lru_cachepartial)settings)BaseDatabaseOperations)InetJsonberrorsis_psycopg3mogrifysplit_tzname_delta)
OnConflict)_lazy_re_compilec                 C   s   | d u rt jS tt j| dS )N)cls)jsondumpsr   )encoder r   h/var/www/html/evchargy.com/venv/lib/python3.10/site-packages/django/db/backends/postgresql/operations.pyget_json_dumps   s   r   c                       s  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d ZedZdd Zd^ddZdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd^d!d"Zd#d$ Zd%d& Zd^d'd(Zd)d* Zd+d, Z d-d. Z!d/d0 Z"d1d2 Z#d3d3d4d5d6Z$d7d8 Z%d_d9d:Z&d;d< Z'd=d> Z(d?d@ Z)dAdB Z*erdCdD Z+ndEdD Z+dFdG Z,dHdI Z-erdJdK Z.dLdM Z/dNdO Z0dPdQ Z1d`dRdSZ2dTdU Z3dVdW Z4 fdXdYZ5d^ fdZd[	Z6 fd\d]Z7  Z8S )aDatabaseOperationsZvarcharZEXPLAIN)ZANALYZEZBUFFERSZCOSTSZSETTINGSZSUMMARYZTIMINGVERBOSEZWALintegerZbigintZsmallint)	AutoFieldZBigAutoFieldZSmallAutoFieldr   )numeric)ZSmallIntegerFieldZIntegerFieldZBigIntegerFieldZPositiveSmallIntegerFieldZPositiveIntegerFieldZPositiveBigIntegerFieldc                 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_typer   r   r   unification_cast_sql:   s
   z'DatabaseOperations.unification_cast_sqlz[A-Z_]+c                 C   s   |dkrd| d|fS |dkrd| d|fS |dkr$d| d|fS |  }| j|s5td	|d
| d| d|fS )NZweek_dayzEXTRACT(DOW FROM z) + 1Ziso_week_dayzEXTRACT(ISODOW FROM )Ziso_yearzEXTRACT(ISOYEAR FROM zInvalid lookup type: zEXTRACT(z FROM )upper_extract_format_re	fullmatch
ValueErrorr!   lookup_typesqlparamsr   r   r   date_extract_sqlQ   s   z#DatabaseOperations.date_extract_sqlNc                 C   *   |  |||\}}d| d|g|R fS NDATE_TRUNC(%s, r$   _convert_sql_to_tzr!   r*   r+   r,   tznamer   r   r   date_trunc_sql`      z!DatabaseOperations.date_trunc_sqlc                 C   s6   t |\}}}|r|dkrdnd}| | | S |S )N+-r   )r!   r4   signoffsetr   r   r   _prepare_tzname_deltae   s
   z(DatabaseOperations._prepare_tzname_deltac                 C   s4   |rt jr| |}| dg ||R fS ||fS )Nz AT TIME ZONE %s)r   ZUSE_TZr;   )r!   r+   r,   r4   Ztzname_paramr   r   r   r2   l   s   

z%DatabaseOperations._convert_sql_to_tzc                 C   "   |  |||\}}d| d|fS )Nr   z)::dater1   r!   r+   r,   r4   r   r   r   datetime_cast_date_sqlr      z)DatabaseOperations.datetime_cast_date_sqlc                 C   r<   )Nr   )::timer1   r=   r   r   r   datetime_cast_time_sqlv   r?   z)DatabaseOperations.datetime_cast_time_sqlc                 C   s@   |  |||\}}|dkrd| ddg|R fS | |||S Nsecondz#EXTRACT(SECOND FROM DATE_TRUNC(%s, z)))r2   r-   r3   r   r   r   datetime_extract_sqlz   s   z'DatabaseOperations.datetime_extract_sqlc                 C   r.   r/   r1   r3   r   r   r   datetime_trunc_sql   r6   z%DatabaseOperations.datetime_trunc_sqlc                 C   s.   |dkrd| ddg|R fS |  |||S rB   )r-   r)   r   r   r   time_extract_sql   s   z#DatabaseOperations.time_extract_sqlc                 C   r.   )Nr0   r@   r1   r3   r   r   r   time_trunc_sql   s   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.
        )Zfetchall)r!   cursorr   r   r   fetch_returned_insert_rows   s   z-DatabaseOperations.fetch_returned_insert_rowsc                 C   sT   d}|dkr|dv rdS |dv r |dv rd}n	|dv rd	}nd}|d
v r(d| }|S )Nr   Zisnull)Z	CharFieldZ
EmailFieldZ	TextFieldCICharFieldCIEmailFieldCITextFieldz%s::text)	iexactcontains	icontains
startswithistartswithendswith	iendswithregexZiregex)r   r   zHOST(%s))rN   rO   rP   z
%s::citext)rQ   rS   rU   rW   z	UPPER(%s)r   )r!   r*   r"   lookupr   r   r   lookup_cast   s   zDatabaseOperations.lookup_castc                 C   s   d S Nr   rI   r   r   r   no_limit_value   rK   z!DatabaseOperations.no_limit_valuec                 C   s   |gS r[   r   )r!   r+   r   r   r   prepare_sql_script   s   z%DatabaseOperations.prepare_sql_scriptc                 C   s    | dr|dr|S d| S )N"z"%s")rT   rV   )r!   namer   r   r   
quote_name   s   zDatabaseOperations.quote_namec                 C   s   t ||| jS r[   )r
   r   )r!   r+   r,   r   r   r   compose_sql   s   zDatabaseOperations.compose_sqlc                 C   rH   )Nz(SELECT set_config('TimeZone', %s, false)r   rI   r   r   r   set_time_zone_sql   rK   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_FIELDr`   ).0tabler!   styler   r   	<genexpr>   s    z/DatabaseOperations.sql_flush.<locals>.<genexpr>zRESTART IDENTITYZCASCADEz%s; )SQL_KEYWORDjoinappend)r!   rj   Ztablesrc   rd   Z	sql_partsr   ri   r   	sql_flush   s   zDatabaseOperations.sql_flushc              
   C   sR   g }|D ]"}|d }|d pd}| d|d|| |||f  q|S )Nrh   columnidz7%s setval(pg_get_serial_sequence('%s','%s'), 1, false);SELECT)ro   rm   	SQL_TABLEr`   rf   )r!   rj   	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)r`   )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;rs   zIS NOTZFROM)Z	django.dbry   r`   _metaZlocal_fields
isinstancer   ro   rm   rt   db_tablerf   rq   )r!   rj   Z
model_listry   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  rK   z(DatabaseOperations.prep_for_iexact_queryc                 C   rH   )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   rI   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   )rg   Z
param_listparamr   r   r   
<listcomp>/  s    z3DatabaseOperations.distinct_sql.<locals>.<listcomp>zDISTINCT ON (%s)re   ZDISTINCTrn   )r!   fieldsr,   r   r   r   distinct_sql-  s   
zDatabaseOperations.distinct_sqlc                 C   s&   z|  ||W S  tjy   Y d S w r[   )ra   r   Z	DataErrorr!   rL   r+   r,   r   r   r   last_executed_query6  s
   z&DatabaseOperations.last_executed_queryc                 C   s   |j d ur
|j  S d S r[   )querydecoder   r   r   r   r   >  s   

c                    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   rz   r|   rq   rg   fieldrI   r   r   r   H  s    
z<DatabaseOperations.return_insert_columns.<locals>.<listcomp>zRETURNING %sre   r   r   )r!   r   columnsr   rI   r   return_insert_columnsE  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 )re   Nr   )rg   rowr   r   r   rk   S  s    z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>re   c                 s       | ]}d | V  qdS )z(%s)Nr   )rg   r+   r   r   r   rk   T      zVALUES r   )r!   r   Zplaceholder_rowsZplaceholder_rows_sqlZ
values_sqlr   r   r   bulk_insert_sqlR  s   z"DatabaseOperations.bulk_insert_sqlc                 C   s$   |d u s	t |dr|S | j| |S )NZresolve_expression)hasattrintegerfield_type_map)r!   valuer"   r   r   r   adapt_integerfield_valueY  s   z+DatabaseOperations.adapt_integerfield_valuec                 C   r   r[   r   r!   r   r   r   r   adapt_datefield_value^  rK   z(DatabaseOperations.adapt_datefield_valuec                 C   r   r[   r   r   r   r   r   adapt_datetimefield_valuea  rK   z,DatabaseOperations.adapt_datetimefield_valuec                 C   r   r[   r   r   r   r   r   adapt_timefield_valued  rK   z(DatabaseOperations.adapt_timefield_valuec                 C   r   r[   r   )r!   r   Z
max_digitsZdecimal_placesr   r   r   adapt_decimalfield_valueg  rK   z+DatabaseOperations.adapt_decimalfield_valuec                 C   s   |rt |S d S r[   )r   r   r   r   r   adapt_ipaddressfield_valuej  s   z-DatabaseOperations.adapt_ipaddressfield_valuec                 C   s   t |t|dS )N)r   )r   r   )r!   r   r   r   r   r   adapt_json_valueo  s   z#DatabaseOperations.adapt_json_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_paramsr,   	__class__r   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 |}|r1||d< |rC|dddd |  D  7 }|S )Nc                 S   s"   i | ]\}}|  |rd ndqS )truefalse)r%   )rg   r_   r   r   r   r   
<dictcomp>~  s    z;DatabaseOperations.explain_query_prefix.<locals>.<dictcomp>ZFORMATz (%s)re   c                 s   r   )z%s %sNr   )rg   ir   r   r   rk     r   z:DatabaseOperations.explain_query_prefix.<locals>.<genexpr>)itemsexplain_optionspopr   explain_query_prefixrn   )r!   formatoptionsextraZvalid_optionr   prefixr   r   r   r   z  s    
 z'DatabaseOperations.explain_query_prefixc                    s\   |t jkrdS |t jkr%ddt| j|ddd t| j|D f S t ||||S )NzON CONFLICT DO NOTHINGz ON CONFLICT(%s) DO UPDATE SET %sre   c                 S   s   g | ]	}| d | qS )z = EXCLUDED.r   r   r   r   r   r     s    z=DatabaseOperations.on_conflict_suffix_sql.<locals>.<listcomp>)r   ZIGNOREZUPDATErn   mapr`   r   on_conflict_suffix_sql)r!   r   Zon_conflictZupdate_fieldsZunique_fieldsr   r   r   r     s"   


	z)DatabaseOperations.on_conflict_suffix_sqlr[   )F)NN)9__name__
__module____qualname__Z"cast_char_field_without_max_lengthZexplain_prefix	frozensetr   Zcast_data_typesr	   Zpsycopg.typesr   ZInt2ZInt4ZInt8r   r#   r   r&   r-   r5   r;   r2   r>   rA   rD   rE   rF   rG   rJ   rM   rZ   r\   r]   r`   ra   rb   rp   rv   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r   r   r   r   r      s|    	


'
"

r   )r   	functoolsr   r   Zdjango.confr   Z"django.db.backends.base.operationsr   Z)django.db.backends.postgresql.psycopg_anyr   r   r   r	   r
   Zdjango.db.backends.utilsr   Zdjango.db.models.constantsr   Zdjango.utils.regex_helperr   r   r   r   r   r   r   <module>   s    
