o
    þÞhC  ã                   @   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mZ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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)ÚDatabaseErrorÚNotSupportedErrorÚmodels)ÚBaseDatabaseOperations)Ú
OnConflict)ÚCol)Útimezone)Ú
parse_dateÚparse_datetimeÚ
parse_time)Úcached_propertyé   )ÚDatabasec                       sˆ  e Zd ZdZdddœZdZeg d¢ƒZdd„ Zdd	„ Z	d
d„ Z
dd„ Zdd„ ZdWdd„ZdWd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d/d/d0œd1d2„Zd3d4„ Zd5d6„ Zd7d8„ Z ‡ fd9d:„Z!d;d<„ Z"d=d>„ Z#d?d@„ Z$dAdB„ Z%dCdD„ Z&dEdF„ Z'‡ fdGdH„Z(dIdJ„ Z)dKdL„ Z*dMdN„ Z+dW‡ fdOdP„	Z,dQdR„ Z-‡ fdSdT„Z.dUdV„ Z/‡  Z0S )XÚDatabaseOperationsÚtextÚTEXT)Ú	DateFieldÚDateTimeFieldzEXPLAIN QUERY PLAN)ÚnullÚfalseÚtruec                 C   sN   t t dd„ |D ƒ¡ƒ}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).
        c                 s   s(   � | ]}t |tjƒr|jn|gV  qd S ©N)Ú
isinstancer   ÚCompositePrimaryKeyÚfields©Ú.0Úfield© r"   úe/var/www/html/premium_crap/venv/lib/python3.10/site-packages/django/db/backends/sqlite3/operations.pyÚ	<genexpr>(   s   € 
ýÿ
üz5DatabaseOperations.bulk_batch_size.<locals>.<genexpr>r   iô  )Úlistr   Úfrom_iterableÚlenÚ
connectionÚfeaturesÚmax_query_params)Úselfr   Úobjsr"   r"   r#   Ú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||ƒr8| 	¡ D ]}z|j
}W n ttfy-   Y qw t||ƒr7tdƒ‚qt|t jƒrL|jrNt|jƒdkrPtdƒ‚d S 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   Ú	TimeFieldÚSumÚAvgÚVarianceÚStdDevr   Úget_source_expressionsÚoutput_fieldÚAttributeErrorr   r   Ú	AggregateÚdistinctr'   Úsource_expressions)r+   Ú
expressionÚ
bad_fieldsÚbad_aggregatesÚexprr4   r"   r"   r#   Úcheck_expression_support8   s0   

ý
ÿÿ
ÿþÿûz+DatabaseOperations.check_expression_supportc                 C   ó   d|› d�|  ¡ g|¢R 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, ú)©Úlower©r+   Úlookup_typeÚsqlÚparamsr"   r"   r#   Údate_extract_sqlT   s   z#DatabaseOperations.date_extract_sqlc                 C   s   |  ¡ S )z—
        Given a cursor object that has just performed an INSERT...RETURNING
        statement into a table, return the list of returned data.
        )Úfetchall)r+   Úcursorr"   r"   r#   Úfetch_returned_insert_rows\   s   z-DatabaseOperations.fetch_returned_insert_rowsc                 C   s   |S )z>Do nothing since formatting is handled in the custom function.r"   )r+   rD   r"   r"   r#   Úformat_for_duration_arithmeticc   s   z1DatabaseOperations.format_for_duration_arithmeticNc                 C   ó&   d|› d�|  ¡ g|¢|  |¡¢R fS )Nzdjango_date_trunc(%s, ú	, %s, %s)©rA   Ú_convert_tznames_to_sql©r+   rC   rD   rE   Útznamer"   r"   r#   Údate_trunc_sqlg   ó   
ÿþýz!DatabaseOperations.date_trunc_sqlc                 C   rK   )Nzdjango_time_trunc(%s, rL   rM   rO   r"   r"   r#   Útime_trunc_sqln   rR   z!DatabaseOperations.time_trunc_sqlc                 C   s   |rt jr|| jjfS dS )N)NN)r   ÚUSE_TZr(   Útimezone_name)r+   rP   r"   r"   r#   rN   u   s   
z*DatabaseOperations._convert_tznames_to_sqlc                 C   ó    d|› d�g |¢|   |¡¢R fS )Nzdjango_datetime_cast_date(rL   ©rN   ©r+   rD   rE   rP   r"   r"   r#   Údatetime_cast_date_sqlz   ó
   ÿþz)DatabaseOperations.datetime_cast_date_sqlc                 C   rV   )Nzdjango_datetime_cast_time(rL   rW   rX   r"   r"   r#   Údatetime_cast_time_sql€   rZ   z)DatabaseOperations.datetime_cast_time_sqlc                 C   rK   )Nzdjango_datetime_extract(%s, rL   rM   rO   r"   r"   r#   Údatetime_extract_sql†   rR   z'DatabaseOperations.datetime_extract_sqlc                 C   rK   )Nzdjango_datetime_trunc(%s, rL   rM   rO   r"   r"   r#   Údatetime_trunc_sql�   rR   z%DatabaseOperations.datetime_trunc_sqlc                 C   r>   )Nzdjango_time_extract(%s, r?   r@   rB   r"   r"   r#   Útime_extract_sql”   s   z#DatabaseOperations.time_extract_sqlc                 C   ó   dS )NÚNULLr"   ©r+   r"   r"   r#   Úpk_default_value—   ó   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(   rH   ÚexecuteÚfetchoneÚclose)r+   rE   Ú
BATCH_SIZEÚresultsÚindexÚchunkrD   rH   r"   r"   r#   rf   š   s   	z8DatabaseOperations._quote_params_for_last_executed_queryc                 C   sT   |r(t |ttfƒr|  |¡}|| S t| ¡ ƒ}|  |¡}tt||ƒƒ}|| S |S r   )r   r%   Útuplerf   ÚvaluesÚdictÚzip)r+   rH   rD   rE   rp   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   r_   )Néÿÿÿÿr"   ra   r"   r"   r#   Úno_limit_valueÌ   rc   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"   )r    Úrowr"   r"   r#   Ú
<listcomp>à   ó    z9DatabaseOperations.__references_graph.<locals>.<listcomp>)r(   rH   rh   rG   )r+   Ú
table_nameÚqueryrE   rH   rl   r"   r"   r#   Ú__references_graphÏ   s   
ý$þz%DatabaseOperations.__references_graphc                 C   s   t dd�| jƒS )Ni   )Úmaxsize)r   Ú%_DatabaseOperations__references_graphra   r"   r"   r#   Ú_references_graphâ   s   z$DatabaseOperations._references_graphF)Úreset_sequencesÚallow_cascadec                   s`   |r|rt t ‡ fdd„|D ƒ¡ƒ}‡ ‡fdd„|D ƒ}|r.dd„ |D ƒ}| ˆ  ˆ|¡¡ |S )Nc                 3   s   � | ]}ˆ   |¡V  qd S r   )rƒ   ©r    Útablera   r"   r#   r$   í   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_FIELDrx   r†   ©r+   Ústyler"   r#   r|   ï   s    úýÿÿz0DatabaseOperations.sql_flush.<locals>.<listcomp>c                 S   s   g | ]}d |i‘qS )r‡   r"   r†   r"   r"   r#   r|   ù   r}   )Úsetr   r&   ÚextendÚsequence_reset_by_name_sql)r+   r�   Útablesr„   r…   rD   Ú	sequencesr"   rŒ   r#   Ú	sql_flushè   s   ÿù	zDatabaseOperations.sql_flushc                 C   sn   |sg S d|  d¡| |  d¡¡|  d¡| |  d¡¡|  d¡| |  d¡¡|  d¡d	 d
d„ |D ƒ¡f gS )Nz%s %s %s %s = 0 %s %s %s (%s);ÚUPDATEÚsqlite_sequenceÚSETÚseqÚWHERErw   ÚINrd   c                 S   s   g | ]}d |d  ‘qS )ú'%s'r‡   r"   )r    Úsequence_infor"   r"   r#   r|     s    zADatabaseOperations.sequence_reset_by_name_sql.<locals>.<listcomp>)rŠ   Ú	SQL_TABLErx   r‹   rg   )r+   r�   r’   r"   r"   r#   r�   ý   s    ÿøÿÿz-DatabaseOperations.sequence_reset_by_name_sqlc                 C   sD   |d u rd S t  |¡rtjrt  || jj ¡}t|ƒS tdƒ‚t|ƒS )NzNSQLite backend does not support timezone-aware datetimes when USE_TZ is False.)r   Úis_awarer   rT   Ú
make_naiver(   Ú
ValueErrorÚstr©r+   Úvaluer"   r"   r#   Úadapt_datetimefield_value  s   
ûÿz,DatabaseOperations.adapt_datetimefield_valuec                 C   s&   |d u rd S t  |¡rtdƒ‚t|ƒS )Nz5SQLite backend does not support timezone-aware times.)r   r�   rŸ   r    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krS| | j
¡ |S )Nr   r   r.   ÚDecimalFieldÚ	UUIDFieldÚBooleanField)ÚsuperÚget_db_convertersr4   Úget_internal_typeÚappendÚconvert_datetimefield_valueÚconvert_datefield_valueÚconvert_timefield_valueÚget_decimalfield_converterÚconvert_uuidfield_valueÚconvert_booleanfield_value)r+   r9   Ú
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 r   )	r   Údatetimer   r   rT   r   r�   Ú
make_awarer(   ©r+   r¢   r9   r(   r"   r"   r#   r¬   ;  s   z.DatabaseOperations.convert_datetimefield_valuec                 C   ó    |d urt |tjƒst|ƒ}|S r   )r   r¶   Údater   r¸   r"   r"   r#   r­   C  ó   z*DatabaseOperations.convert_datefield_valuec                 C   r¹   r   )r   r¶   Útimer   r¸   r"   r"   r#   r®   I  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)Úquantizer4   r¿   ©r¢   r9   r(   ©Úcreate_decimalÚquantize_valuer"   r#   Ú	converterX  s
   ÿÿz@DatabaseOperations.get_decimalfield_converter.<locals>.converterc                    s   | d urˆ | ƒS d S r   r"   rÁ   )rÃ   r"   r#   rÅ   `  s   ÿ)	ÚdecimalÚContextÚcreate_decimal_from_floatr   r   ÚDecimalÚscalebr4   Údecimal_places)r+   r9   rÅ   r"   rÂ   r#   r¯   O  s   

ÿüz-DatabaseOperations.get_decimalfield_converterc                 C   s   |d ur	t  |¡}|S r   )ÚuuidÚUUIDr¸   r"   r"   r#   r°   f  s   
z*DatabaseOperations.convert_uuidfield_valuec                 C   s   |dv rt |ƒS |S )N)r   r   )Úboolr¸   r"   r"   r#   r±   k  ó   z-DatabaseOperations.convert_booleanfield_valuec                    s:   |dkrdd  |¡ S |dkrdd  |¡ S tƒ  ||¡S )Nú^z	POWER(%s)ú,ú#z
BITXOR(%s))rg   r¨   Úcombine_expression)r+   Ú	connectorÚsub_expressionsr´   r"   r#   rÓ   n  s
   z%DatabaseOperations.combine_expressionc                 C   sD   |dvr
t d| ƒ‚d| g| }t|ƒdkrtdƒ‚dd |¡ S )N)ú+ú-Ú*ú/z$Invalid connector for timedelta: %s.rš   é   z)Too many params for timedelta operations.zdjango_format_dtdelta(%s)rd   )r   r'   rŸ   rg   )r+   rÔ   rÕ   Ú	fn_paramsr"   r"   r#   Úcombine_duration_expressionw  s   z.DatabaseOperations.combine_duration_expressionc                 C   s   |dv rdS dS )N)ÚPositiveBigIntegerFieldÚPositiveIntegerFieldÚPositiveSmallIntegerField)r   ì   ÿÿÿÿ )lûÿÿÿ         rà   r"   )r+   r³   r"   r"   r#   Úinteger_field_range  s   z&DatabaseOperations.integer_field_rangec           	      C   sF   |\}}|\}}g |¢|¢R }|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_paramsrE   r"   r"   r#   Úsubtract_temporalsŠ  s   z%DatabaseOperations.subtract_temporalsc                    s   |t jkrdS tƒ j|d�S )NzINSERT OR IGNORE INTO)Úon_conflict)r
   ÚIGNOREr¨   Úinsert_statement)r+   ré   r´   r"   r#   rë   ’  s   
z#DatabaseOperations.insert_statementc                    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)rx   ÚmodelÚ_metaÚdb_tableÚcolumnr   ra   r"   r#   r|   ›  s    û
þÿÿz<DatabaseOperations.return_insert_columns.<locals>.<listcomp>zRETURNING %srd   r"   )rg   )r+   r   Úcolumnsr"   ra   r#   Úreturn_insert_columns—  s   
úz(DatabaseOperations.return_insert_columnsc                    sX   |t jkr#| jjjr#dd t| j|ƒ¡d dd„ t| j|ƒD ƒ¡f S tƒ  	||||¡S )Nz ON CONFLICT(%s) DO UPDATE SET %srd   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
   r”   r(   r)   Ú%supports_update_conflicts_with_targetrg   Úmaprx   r¨   Úon_conflict_suffix_sql)r+   r   ré   Úupdate_fieldsÚunique_fieldsr´   r"   r#   rõ   ¥  s"   
ÿ
þÿþ	üz)DatabaseOperations.on_conflict_suffix_sqlc                 C   s   t jdk rdgS g S )N)rÚ   é'   zGROUP BY TRUE)r   Úsqlite_version_infora   r"   r"   r#   Úforce_group_byº  rÏ   z!DatabaseOperations.force_group_byr   )1Ú__name__Ú
__module__Ú__qualname__Ú"cast_char_field_without_max_lengthÚcast_data_typesÚexplain_prefixÚ	frozensetÚjsonfield_datatype_valuesr-   r=   rF   rI   rJ   rQ   rS   rN   rY   r[   r\   r]   r^   rb   rf   rs   rx   rz   r‚   r   rƒ   r“   r�   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¶   rÆ   rÌ   Ú	functoolsr   Ú	itertoolsr   Údjango.confr   Údjango.core.exceptionsr   Ú	django.dbr   r   r   Ú"django.db.backends.base.operationsr	   Údjango.db.models.constantsr
   Údjango.db.models.expressionsr   Údjango.utilsr   Údjango.utils.dateparser   r   r   Údjango.utils.functionalr   Úbaser   r   r"   r"   r"   r#   Ú<module>   s     