o
    uvXjV6  ã                   @   sÈ   d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlm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 d dlmZ d dlmZ G dd„ deƒZdS )é    N)Ú	lru_cache)Úchain)Úsettings)Ú
FieldError)Úutils)ÚBaseDatabaseOperations)Ú
aggregatesÚfields)ÚCol)Útimezone)Ú
parse_dateÚparse_datetimeÚ
parse_time)Úduration_microseconds)Úcached_propertyc                       sV  e Zd ZdZdddœZ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dd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zed+d,„ ƒZdNd.d/„Zd0d1„ Zd2d3„ Z‡ fd4d5„Zd6d7„ Zd8d9„ Z d:d;„ Z!d<d=„ Z"d>d?„ Z#d@dA„ Z$dBdC„ Z%‡ fdDdE„Z&dFdG„ Z'dHdI„ Z(dJdK„ Z)dN‡ fdLdM„	Z*‡  Z+S )OÚDatabaseOperationsÚtextÚTEXT)Ú	DateFieldÚDateTimeFieldzEXPLAIN QUERY PLANc                 C   s6   t |ƒdkrdS t |ƒdkr| jjjt |ƒ S t |ƒS )zà
        SQLite has a compile-time default (SQLITE_LIMIT_VARIABLE_NUMBER) of
        999 variables per query.

        If there's only a single field to insert, the limit is 500
        (SQLITE_MAX_COMPOUND_SELECT).
        é   iô  )ÚlenÚ
connectionÚfeaturesÚmax_query_params)Úselfr	   Úobjs© r   úb/var/www/html/myproject/venv/lib/python3.10/site-packages/django/db/backends/sqlite3/operations.pyÚbulk_batch_size   s
   z"DatabaseOperations.bulk_batch_sizec              	   C   sš   t jt jt jf}tjtjtjtjf}t	||ƒr7| 
¡ D ]}z|j}W n	 ty+   Y qw t	||ƒr6t d¡‚qt	|tjƒrIt|jƒdkrKt d¡‚d S d S )Nz{You cannot use Sum, Avg, StdDev, and Variance aggregations on date/time fields in sqlite3 since date/time is saved as text.r   zTSQLite doesn't support DISTINCT on aggregate functions accepting multiple arguments.)r	   r   r   Ú	TimeFieldr   ÚSumÚAvgÚVarianceÚStdDevÚ
isinstanceÚget_source_expressionsÚoutput_fieldr   r   ÚNotSupportedErrorÚ	Aggregater   Úsource_expressions)r   Ú
expressionÚ
bad_fieldsÚbad_aggregatesÚexprr'   r   r   r   Úcheck_expression_support*   s&   

ý
ÿÿÿÿz+DatabaseOperations.check_expression_supportc                 C   ó   d|  ¡ |f S )zè
        Support EXTRACT with a user-defined function django_date_extract()
        that's registered in connect(). Use single quotes because this is a
        string and could otherwise cause a collision with a field name.
        zdjango_date_extract('%s', %s)©Úlower©r   Úlookup_typeÚ
field_namer   r   r   Údate_extract_sqlB   s   z#DatabaseOperations.date_extract_sqlc                 C   s   t t|ƒƒS ©N)Ústrr   )r   Ú	timedeltar   r   r   Údate_interval_sqlJ   s   z$DatabaseOperations.date_interval_sqlc                 C   s   |S )z>Do nothing since formatting is handled in the custom function.r   )r   Úsqlr   r   r   Úformat_for_duration_arithmeticM   ó   z1DatabaseOperations.format_for_duration_arithmeticc                 C   r0   )Nzdjango_date_trunc('%s', %s)r1   r3   r   r   r   Údate_trunc_sqlQ   ó   z!DatabaseOperations.date_trunc_sqlc                 C   r0   )Nzdjango_time_trunc('%s', %s)r1   r3   r   r   r   Útime_trunc_sqlT   r?   z!DatabaseOperations.time_trunc_sqlc                 C   s   t jrd| S dS )Nú'%s'ÚNULL)r   ÚUSE_TZ)r   Útznamer   r   r   Ú_convert_tzname_to_sqlW   s   z)DatabaseOperations._convert_tzname_to_sqlc                 C   ó   d||   |¡f S )Nz!django_datetime_cast_date(%s, %s)©rE   ©r   r5   rD   r   r   r   Údatetime_cast_date_sqlZ   ó   
ÿz)DatabaseOperations.datetime_cast_date_sqlc                 C   rF   )Nz!django_datetime_cast_time(%s, %s)rG   rH   r   r   r   Údatetime_cast_time_sql_   rJ   z)DatabaseOperations.datetime_cast_time_sqlc                 C   ó   d|  ¡ ||  |¡f S )Nz%django_datetime_extract('%s', %s, %s)©r2   rE   ©r   r4   r5   rD   r   r   r   Údatetime_extract_sqld   ó   ÿz'DatabaseOperations.datetime_extract_sqlc                 C   rL   )Nz#django_datetime_trunc('%s', %s, %s)rM   rN   r   r   r   Údatetime_trunc_sqli   rP   z%DatabaseOperations.datetime_trunc_sqlc                 C   r0   )Nzdjango_time_extract('%s', %s)r1   r3   r   r   r   Útime_extract_sqln   r?   z#DatabaseOperations.time_extract_sqlc                 C   ó   dS )NrB   r   ©r   r   r   r   Úpk_default_valueq   ó   z#DatabaseOperations.pk_default_valuec                 C   s–   d}t |ƒ|kr&d}tdt |ƒ|ƒD ]}|||| … }||  |¡7 }q|S dd dgt |ƒ ¡ }| jj ¡ }z| ||¡ ¡ W | ¡  S | ¡  w )zV
        Only for last_executed_query! Don't use this to execute SQL queries!
        iç  r   r   zSELECT ú, zQUOTE(?))	r   ÚrangeÚ%_quote_params_for_last_executed_queryÚjoinr   ÚcursorÚexecuteÚfetchoneÚclose)r   ÚparamsÚ
BATCH_SIZEÚresultsÚindexÚchunkr;   r[   r   r   r   rY   t   s   	z8DatabaseOperations._quote_params_for_last_executed_queryc                 C   sT   |r(t |ttfƒr|  |¡}|| S t| ¡ ƒ}|  |¡}tt||ƒƒ}|| S |S r7   )r%   ÚlistÚtuplerY   ÚvaluesÚdictÚzip)r   r[   r;   r_   rf   r   r   r   Úlast_executed_query�   s   
ý
z&DatabaseOperations.last_executed_queryc                 C   s    |  d¡r| d¡r|S d| S )Nú"z"%s")Ú
startswithÚendswith)r   Únamer   r   r   Ú
quote_name¡   s   zDatabaseOperations.quote_namec                 C   rS   )Néÿÿÿÿr   rT   r   r   r   Úno_limit_value¦   rV   z!DatabaseOperations.no_limit_valuec                 C   sZ   d}|ddf}| j  ¡ �}| ||¡}dd„ | ¡ D ƒW  d   ƒ S 1 s&w   Y  d S )Nz÷
        WITH tables AS (
            SELECT %s name
            UNION
            SELECT sqlite_master.name
            FROM sqlite_master
            JOIN tables ON (sql REGEXP %s || tables.name || %s)
        ) SELECT name FROM tables;
        z(?i)\s+references\s+("|\')?z("|\')?\s*\(c                 S   s   g | ]}|d  ‘qS )r   r   ©Ú.0Úrowr   r   r   Ú
<listcomp>º   s    z9DatabaseOperations.__references_graph.<locals>.<listcomp>)r   r[   r\   Úfetchall)r   Ú
table_nameÚqueryr_   r[   ra   r   r   r   Ú__references_graph©   s   
ý$þz%DatabaseOperations.__references_graphc                 C   s   t dd�| jƒS )Ni   )Úmaxsize)r   Ú%_DatabaseOperations__references_graphrT   r   r   r   Ú_references_graph¼   s   z$DatabaseOperations._references_graphFc                    s<   |r|rt t ‡ fdd„|D ƒ¡ƒ}‡ ‡fdd„|D ƒ}|S )Nc                 3   s   � | ]}ˆ   |¡V  qd S r7   )r{   ©rr   ÚtablerT   r   r   Ú	<genexpr>Æ   s   € z/DatabaseOperations.sql_flush.<locals>.<genexpr>c              
      s2   g | ]}d ˆ  d¡ˆ  d¡ˆ ˆ  |¡¡f ‘qS )z	%s %s %s;ÚDELETEÚFROM)ÚSQL_KEYWORDÚ	SQL_FIELDrn   r|   ©r   Ústyler   r   rt   Ç   s    ü
ýz0DatabaseOperations.sql_flush.<locals>.<listcomp>)Úsetr   Úfrom_iterable)r   r„   ÚtablesÚ	sequencesÚallow_cascader;   r   rƒ   r   Ú	sql_flushÂ   s   üzDatabaseOperations.sql_flushc                 C   sR   |d u rd S t |dƒr|S t |¡r%tjr!t || jj¡}t|ƒS tdƒ‚t|ƒS )NÚresolve_expressionzNSQLite backend does not support timezone-aware datetimes when USE_TZ is False.)	Úhasattrr   Úis_awarer   rC   Ú
make_naiver   Ú
ValueErrorr8   ©r   Úvaluer   r   r   Úadapt_datetimefield_valueÐ   s   

þz,DatabaseOperations.adapt_datetimefield_valuec                 C   s4   |d u rd S t |dƒr|S t |¡rtdƒ‚t|ƒS )Nr‹   z5SQLite backend does not support timezone-aware times.)rŒ   r   r�   r�   r8   r�   r   r   r   Úadapt_timefield_valueá   s   

z(DatabaseOperations.adapt_timefield_valuec                    sª   t ƒ  |¡}|j ¡ }|dkr| | j¡ |S |dkr#| | j¡ |S |dkr/| | j¡ |S |dkr=| |  |¡¡ |S |dkrI| | j	¡ |S |dv rS| | j
¡ |S )Nr   r   r    ÚDecimalFieldÚ	UUIDField)ÚNullBooleanFieldÚBooleanField)ÚsuperÚget_db_convertersr'   Úget_internal_typeÚappendÚconvert_datetimefield_valueÚconvert_datefield_valueÚconvert_timefield_valueÚget_decimalfield_converterÚconvert_uuidfield_valueÚconvert_booleanfield_value)r   r+   Ú
convertersÚinternal_type©Ú	__class__r   r   r™   ï   s(   
ö	øúüþz$DatabaseOperations.get_db_convertersc                 C   s@   |d urt |tjƒst|ƒ}tjrt |¡st || jj¡}|S r7   )	r%   Údatetimer   r   rC   r   r�   Ú
make_awarer   ©r   r‘   r+   r   r   r   r   rœ      s   z.DatabaseOperations.convert_datetimefield_valuec                 C   ó    |d urt |tjƒst|ƒ}|S r7   )r%   r¦   Údater   r¨   r   r   r   r�     ó   z*DatabaseOperations.convert_datefield_valuec                 C   r©   r7   )r%   r¦   Útimer   r¨   r   r   r   rž     r«   z*DatabaseOperations.convert_timefield_valuec                    sP   t jdd�j‰ t|tƒr t  d¡ |jj ¡‰‡ ‡fdd„}|S ‡ fdd„}|S )Né   )Úprecr   c                    s"   | d urˆ | ƒj ˆ|jjd�S d S )N)Úcontext)Úquantizer'   r¯   ©r‘   r+   r   ©Úcreate_decimalÚquantize_valuer   r   Ú	converter  s   ÿz@DatabaseOperations.get_decimalfield_converter.<locals>.converterc                    s   | d urˆ | ƒS d S r7   r   r±   )r³   r   r   rµ     s   ÿ)	ÚdecimalÚContextÚcreate_decimal_from_floatr%   r
   ÚDecimalÚscalebr'   Údecimal_places)r   r+   rµ   r   r²   r   rŸ     s   
ýz-DatabaseOperations.get_decimalfield_converterc                 C   s   |d ur	t  |¡}|S r7   )ÚuuidÚUUIDr¨   r   r   r   r    $  s   
z*DatabaseOperations.convert_uuidfield_valuec                 C   s   |dv rt |ƒS |S )N)r   r   )Úboolr¨   r   r   r   r¡   )  ó   z-DatabaseOperations.convert_booleanfield_valuec                 C   s   d  dd„ |D ƒ¡S )Nz UNION ALL c                 s   s   � | ]
}d d  |¡ V  qdS )z	SELECT %srW   N©rZ   rq   r   r   r   r~   -  s
   € ÿ
ÿz5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>rÀ   )r   r	   Úplaceholder_rowsr   r   r   Úbulk_insert_sql,  s   
þz"DatabaseOperations.bulk_insert_sqlc                    s$   |dkrdd  |¡ S tƒ  ||¡S )Nú^z	POWER(%s)ú,)rZ   r˜   Úcombine_expression)r   Ú	connectorÚsub_expressionsr¤   r   r   rÅ   2  s   z%DatabaseOperations.combine_expressionc                 C   sF   |dvrt  d| ¡‚d| g| }t|ƒdkrtdƒ‚dd |¡ S )N)ú+ú-z$Invalid connector for timedelta: %s.rA   é   z)Too many params for timedelta operations.zdjango_format_dtdelta(%s)rW   )r   ÚDatabaseErrorr   r�   rZ   )r   rÆ   rÇ   Ú	fn_paramsr   r   r   Úcombine_duration_expression9  s   z.DatabaseOperations.combine_duration_expressionc                 C   rS   )N)NNr   )r   r£   r   r   r   Úinteger_field_rangeA  r=   z&DatabaseOperations.integer_field_rangec                 C   s@   |\}}|\}}|dkrd||f || fS d||f || fS )Nr    zdjango_time_diff(%s, %s)zdjango_timestamp_diff(%s, %s)r   )r   r£   ÚlhsÚrhsÚlhs_sqlÚ
lhs_paramsÚrhs_sqlÚ
rhs_paramsr   r   r   Úsubtract_temporalsE  s
   z%DatabaseOperations.subtract_temporalsc                    s   |rdS t ƒ  |¡S )NzINSERT OR IGNORE INTO)r˜   Úinsert_statement)r   Úignore_conflictsr¤   r   r   rÖ   L  r¿   z#DatabaseOperations.insert_statement)F),Ú__name__Ú
__module__Ú__qualname__Ú"cast_char_field_without_max_lengthÚcast_data_typesÚexplain_prefixr   r/   r6   r:   r<   r>   r@   rE   rI   rK   rO   rQ   rR   rU   rY   ri   rn   rp   rz   r   r{   rŠ   r’   r“   r™   rœ   r�   rž   rŸ   r    r¡   rÂ   rÅ   rÍ   rÎ   rÕ   rÖ   Ú__classcell__r   r   r¤   r   r      sV    þ

r   )r¦   r¶   r¼   Ú	functoolsr   Ú	itertoolsr   Údjango.confr   Údjango.core.exceptionsr   Ú	django.dbr   Ú"django.db.backends.base.operationsr   Údjango.db.modelsr   r	   Údjango.db.models.expressionsr
   Údjango.utilsr   Údjango.utils.dateparser   r   r   Údjango.utils.durationr   Údjango.utils.functionalr   r   r   r   r   r   Ú<module>   s     