o
    uvXjà.  ã                   @   sD   d dl mZ 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)ÚNotSupportedError)ÚBaseDatabaseOperationsc                       sN  e Zd ZdZ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„ Zdd„ Zdd„ Zdd„ ZdLdd„Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ ZdMd(d)„Zd*d+„ ZdMd,d-„Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Zd<d=„ Z d>d?„ Z!d@dA„ Z"dBdC„ Z#‡ fdDdE„Z$dN‡ fdFdG„	Z%dL‡ fdHdI„	Z&dL‡ fdJdK„	Z'‡  Z(S )OÚDatabaseOperationsÚvarcharÚEXPLAINÚintegerÚbigint)Ú	AutoFieldÚBigAutoFieldc                 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   úe/var/www/html/myproject/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||f S )NÚweek_dayzEXTRACT('dow' FROM %s) + 1Ú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_sqlc                 C   ó   d||f S ©NzDATE_TRUNC('%s', %s)r   r    r   r   r   Údate_trunc_sql'   s   z!DatabaseOperations.date_trunc_sqlc                 C   s   t jr	d||f }|S )Nz%s AT TIME ZONE '%s')r   ÚUSE_TZ©r   r"   Útznamer   r   r   Ú_convert_field_to_tz+   s   z'DatabaseOperations._convert_field_to_tzc                 C   ó   |   ||¡}d| S )Nz
(%s)::date©r*   r(   r   r   r   Údatetime_cast_date_sql0   ó   z)DatabaseOperations.datetime_cast_date_sqlc                 C   r+   )Nz
(%s)::timer,   r(   r   r   r   Údatetime_cast_time_sql4   r.   z)DatabaseOperations.datetime_cast_time_sqlc                 C   s   |   ||¡}|  ||¡S ©N)r*   r#   ©r   r!   r"   r)   r   r   r   Údatetime_extract_sql8   s   z'DatabaseOperations.datetime_extract_sqlc                 C   s   |   ||¡}d||f S r%   r,   r1   r   r   r   Údatetime_trunc_sql<   s   z%DatabaseOperations.datetime_trunc_sqlc                 C   r$   )NzDATE_TRUNC('%s', %s)::timer   r    r   r   r   Útime_trunc_sqlA   s   z!DatabaseOperations.time_trunc_sqlc                 C   ó   dS )Nz DEFERRABLE INITIALLY DEFERREDr   ©r   r   r   r   Údeferrable_sqlD   ó   z!DatabaseOperations.deferrable_sqlc                 C   s   dd„ |  ¡ D ƒS )zÄ
        Given a cursor object that has just performed an INSERT...RETURNING
        statement into a table that has an auto-incrementing ID, return the
        list of newly created IDs.
        c                 S   s   g | ]}|d  ‘qS )r   r   )Ú.0Úitemr   r   r   Ú
<listcomp>M   s    z@DatabaseOperations.fetch_returned_insert_ids.<locals>.<listcomp>)Úfetchall)r   Úcursorr   r   r   Úfetch_returned_insert_idsG   s   z,DatabaseOperations.fetch_returned_insert_idsNc                 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)r?   rA   rC   rE   z	UPPER(%s)r   )r   r!   r   Úlookupr   r   r   Úlookup_castO   s   zDatabaseOperations.lookup_castc                 C   s   d S r0   r   r6   r   r   r   Úno_limit_valueb   r8   z!DatabaseOperations.no_limit_valuec                 C   s   |gS r0   r   )r   Úsqlr   r   r   Úprepare_sql_scripte   s   z%DatabaseOperations.prepare_sql_scriptc                 C   s    |  d¡r| d¡r|S d| S )Nú"z"%s")rB   rD   )r   Únamer   r   r   Ú
quote_nameh   s   zDatabaseOperations.quote_namec                 C   r5   )NzSET TIME ZONE %sr   r6   r   r   r   Úset_time_zone_sqlm   r8   z$DatabaseOperations.set_time_zone_sqlFc                    sn   |r5d  ‡ ‡fdd„|D ƒ¡}|r dˆ d¡|ˆ d¡f g}n
dˆ d¡|f g}| ˆ  ˆ|¡¡ |S g S )Nú, c                 3   s    � | ]}ˆ  ˆ  |¡¡V  qd S r0   )Ú	SQL_FIELDrR   )r9   Útable©r   Ústyler   r   Ú	<genexpr>u   s   € 
ÿz/DatabaseOperations.sql_flush.<locals>.<genexpr>z	%s %s %s;ÚTRUNCATEÚCASCADEz%s %s;)ÚjoinÚSQL_KEYWORDÚextendÚsequence_reset_by_name_sql)r   rX   ÚtablesÚ	sequencesÚallow_cascadeÚ
tables_sqlrN   r   rW   r   Ú	sql_flushp   s"   ÿ
ýþzDatabaseOperations.sql_flushc              
   C   sR   g }|D ]"}|d }|d pd}|  d| d¡| |  |¡¡| |¡f ¡ q|S )NrV   ÚcolumnÚidz7%s setval(pg_get_serial_sequence('%s','%s'), 1, false);ÚSELECT)Úappendr]   Ú	SQL_TABLErR   rU   )r   rX   ra   rN   Úsequence_infoÚ
table_nameÚcolumn_namer   r   r   r_   ‡   s   
ýz-DatabaseOperations.sequence_reset_by_name_sqlc                 C   s    |r	d|   |¡ S d|   |¡ S )NzUSING INDEX TABLESPACE %szTABLESPACE %s)rR   )r   Ú
tablespaceÚinliner   r   r   Útablespace_sql—   s   z!DatabaseOperations.tablespace_sqlc                 C   s*  ddl m} g }| j}|D ]…}|jjD ]@}t||jƒrS| d| d¡| 	||jj
ƒ¡| |j¡| ||jƒ¡| ||jƒ¡| d¡| d¡| 	||jj
ƒ¡f ¡  nq|jjD ]9}|jjs‘| d| d¡| 	|| ¡ ƒ¡| d¡| |dƒ¡| |dƒ¡| d¡| d¡| 	|| ¡ ƒ¡f ¡ qXq|S )Nr   )ÚmodelszZ%s setval(pg_get_serial_sequence('%s','%s'), coalesce(max(%s), 1), max(%s) %s null) %s %s;rg   zIS NOTÚFROMrf   )Ú	django.dbrp   rR   Ú_metaÚlocal_fieldsÚ
isinstancer   rh   r]   ri   Údb_tablerU   re   Úmany_to_manyÚremote_fieldÚthroughÚm2m_db_table)r   rX   Ú
model_listrp   ÚoutputÚqnÚmodelÚfr   r   r   Úsequence_reset_sql�   sN   
øÿÿòøÿÿ€þz%DatabaseOperations.sequence_reset_sqlc                 C   ó   |S r0   r   )r   Úxr   r   r   Úprep_for_iexact_queryÉ   r8   z(DatabaseOperations.prep_for_iexact_queryc                 C   r5   )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   r6   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   )r9   Ú
param_listÚparamr   r   r   r;   Û   s    z3DatabaseOperations.distinct_sql.<locals>.<listcomp>zDISTINCT ON (%s)rT   ÚDISTINCT©r\   )r   ÚfieldsÚparamsr   r   r   Údistinct_sqlÙ   s   
zDatabaseOperations.distinct_sqlc                 C   s   |j d ur
|j  ¡ S d S r0   )ÚqueryÚdecode)r   r=   rN   r‹   r   r   r   Úlast_executed_queryà   s   

z&DatabaseOperations.last_executed_queryc                 C   r5   )N)zRETURNING %sr   r   r6   r   r   r   Úreturn_insert_idç   r8   z#DatabaseOperations.return_insert_idc                 C   s*   dd„ |D ƒ}d  dd„ |D ƒ¡}d| S )Nc                 s   s   � | ]}d   |¡V  qdS )rT   Nr‰   )r9   Úrowr   r   r   rY   ë   s   € z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>rT   c                 s   ó   � | ]}d | V  qdS )z(%s)Nr   )r9   rN   r   r   r   rY   ì   ó   € 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�   r0   r   ©r   Úvaluer   r   r   Úadapt_datefield_valueï   r8   z(DatabaseOperations.adapt_datefield_valuec                 C   r�   r0   r   r˜   r   r   r   Úadapt_datetimefield_valueò   r8   z,DatabaseOperations.adapt_datetimefield_valuec                 C   r�   r0   r   r˜   r   r   r   Úadapt_timefield_valueõ   r8   z(DatabaseOperations.adapt_timefield_valuec                 C   s   |rt |ƒS d S r0   r   r˜   r   r   r   Úadapt_ipaddressfield_valueø   s   z-DatabaseOperations.adapt_ipaddressfield_valuec                    s<   |dk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_params©Ú	__class__r   r   r    ý   s
   z%DatabaseOperations.subtract_temporalsc                    s:   t ƒ  ||¡\}}|r|dk s|r|dkrtdƒ‚||fS )Nr   zIPostgreSQL only supports UNBOUNDED together with PRECEDING and FOLLOWING.)rŸ   Úwindow_frame_range_start_endr   )r   ÚstartÚendÚstart_Úend_r§   r   r   r©     s   ÿz/DatabaseOperations.window_frame_range_start_endc                    s`   t ƒ  |¡}i }|r||d< |r| dd„ | ¡ D ƒ¡ |r.|dd dd„ | ¡ D ƒ¡ 7 }|S )NÚFORMATc                 S   s"   i | ]\}}|  ¡ |rd nd“qS )ÚtrueÚfalse)Úupper)r9   rQ   r™   r   r   r   Ú
<dictcomp>  s    ÿÿz;DatabaseOperations.explain_query_prefix.<locals>.<dictcomp>z (%s)rT   c                 s   r’   )z%s %sNr   )r9   Úir   r   r   rY     r“   z:DatabaseOperations.explain_query_prefix.<locals>.<genexpr>)rŸ   Úexplain_query_prefixÚupdateÚitemsr\   )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   Úignore_conflictsr§   r   r   r»     s   z.DatabaseOperations.ignore_conflicts_suffix_sqlr0   )F)NN))Ú__name__Ú
__module__Ú__qualname__Ú"cast_char_field_without_max_lengthÚexplain_prefixÚcast_data_typesr   r#   r&   r*   r-   r/   r2   r3   r4   r7   r>   rL   rM   rO   rR   rS   rd   r_   ro   r€   rƒ   r…   rŒ   r�   r�   r—   rš   r›   rœ   r�   r    r©   r´   r»   Ú__classcell__r   r   r§   r   r      sP    þ



,	r   N)	Úpsycopg2.extrasr   Údjango.confr   rr   r   Ú"django.db.backends.base.operationsr   r   r   r   r   r   Ú<module>   s
    