U
    R+|jAB  ã                   @   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 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_propertyc                       sŠ  e Zd ZdZdddœZdZedddgƒZdd	„ Zd
d„ Z	dd„ Z
dd„ Zdd„ ZdYdd„ZdZd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/d0„ ƒZd1d1d2œd3d4„Zd5d6„ Zd7d8„ Zd9d:„ Z ‡ fd;d<„Z!d=d>„ Z"d?d@„ Z#dAdB„ Z$dCdD„ Z%dEdF„ Z&dGdH„ Z'dIdJ„ Z(‡ fdKdL„Z)dMdN„ Z*dOdP„ Z+dQdR„ Z,d[‡ fdSdT„	Z-dUdV„ Z.‡ fdWdX„Z/‡  Z0S )\ÚDatabaseOperationsÚtextZTEXT)Ú	DateFieldÚDateTimeFieldzEXPLAIN QUERY PLANÚnullÚfalseÚtruec                 C   s:   t |ƒdkrdS t |ƒdkr.| jjjt |ƒ S t |ƒS d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ô  N)ÚlenÚ
connectionÚfeaturesZmax_query_params)ÚselfÚfieldsÚobjs© r   úmc:\users\snmko\desktop\web_content\django_cbt\venv\Lib\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||ƒrr| 	¡ D ]:}z
|j
}W n ttfk
r\   Y q6X t||ƒr6tdƒ‚q6t|t jƒrš|jršt|jƒdkrštdƒ‚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   Ú	TimeFieldZSumZAvgZVarianceZStdDevÚ
isinstanceZget_source_expressionsÚoutput_fieldÚAttributeErrorr   r   Z	AggregateZdistinctr   Zsource_expressions)r   Ú
expressionZ
bad_fieldsZbad_aggregatesÚexprr$   r   r   r    Úcheck_expression_support,   s*    


ÿ
ÿþýÿz+DatabaseOperations.check_expression_supportc                 C   s   d|› d�|  ¡ f|˜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_sqlH   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_rowsP   s    z-DatabaseOperations.fetch_returned_insert_rowsc                 C   s   |S )z>Do nothing since formatting is handled in the custom function.r   )r   r.   r   r   r    Úformat_for_duration_arithmeticW   s    z1DatabaseOperations.format_for_duration_arithmeticNc                 C   s"   d|› d�|  ¡ f||  |¡˜fS )Nzdjango_date_trunc(%s, ú	, %s, %s)©r+   Ú_convert_tznames_to_sql©r   r-   r.   r/   Útznamer   r   r    Údate_trunc_sql[   s    
ÿýz!DatabaseOperations.date_trunc_sqlc                 C   s"   d|› d�|  ¡ f||  |¡˜fS )Nzdjango_time_trunc(%s, r5   r6   r8   r   r   r    Útime_trunc_sqlb   s    
ÿýz!DatabaseOperations.time_trunc_sqlc                 C   s   |rt jr|| jjfS dS ©N)NN)r   ÚUSE_TZr   Ztimezone_name)r   r9   r   r   r    r7   i   s    
z*DatabaseOperations._convert_tznames_to_sqlc                 C   s   d|› d�||   |¡˜fS )Nzdjango_datetime_cast_date(r5   ©r7   ©r   r.   r/   r9   r   r   r    Údatetime_cast_date_sqln   s    
þz)DatabaseOperations.datetime_cast_date_sqlc                 C   s   d|› d�||   |¡˜fS )Nzdjango_datetime_cast_time(r5   r>   r?   r   r   r    Údatetime_cast_time_sqlt   s    
þz)DatabaseOperations.datetime_cast_time_sqlc                 C   s"   d|› d�|  ¡ f||  |¡˜fS )Nzdjango_datetime_extract(%s, r5   r6   r8   r   r   r    Údatetime_extract_sqlz   s    
ÿýz'DatabaseOperations.datetime_extract_sqlc                 C   s"   d|› d�|  ¡ f||  |¡˜fS )Nzdjango_datetime_trunc(%s, r5   r6   r8   r   r   r    Údatetime_trunc_sql�   s    
ÿýz%DatabaseOperations.datetime_trunc_sqlc                 C   s   d|› d�|  ¡ f|˜fS )Nzdjango_time_extract(%s, r)   r*   r,   r   r   r    Útime_extract_sqlˆ   s    z#DatabaseOperations.time_extract_sqlc                 C   s   dS )NÚNULLr   ©r   r   r   r    Úpk_default_value‹   s    z#DatabaseOperations.pk_default_valuec                 C   s”   d}t |ƒ|krLd}tdt |ƒ|ƒD ]"}|||| … }||  |¡7 }q$|S dd dgt |ƒ ¡ }| jj ¡ }z| ||¡ ¡ W ¢S | ¡  X dS )zV
        Only for last_executed_query! Don't use this to execute SQL queries!
        iç  r   r   zSELECT ú, zQUOTE(?)N)	r   ÚrangeÚ%_quote_params_for_last_executed_queryÚjoinr   r2   ÚcloseÚexecuteZfetchone)r   r/   Z
BATCH_SIZEÚresultsÚindexÚchunkr.   r2   r   r   r    rJ   Ž   s    	z8DatabaseOperations._quote_params_for_last_executed_queryc                 C   sR   |rJt |ttfƒr|  |¡}n$t| ¡ ƒ}|  |¡}tt||ƒƒ}|| S |S d S ©N)r#   ÚlistÚtuplerJ   ÚvaluesÚdictÚzip)r   r2   r.   r/   rT   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   s   dS )Néÿÿÿÿr   rF   r   r   r    Úno_limit_valueÀ   s    z!DatabaseOperations.no_limit_valuec              
   C   sN   d}|ddf}| j  ¡ �,}| ||¡}dd„ | ¡ D ƒW  5 Q R £ S Q R X 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   r2   rM   r1   )r   Z
table_nameÚqueryr/   r2   rN   r   r   r    Z__references_graphÃ   s    
ýz%DatabaseOperations.__references_graphc                 C   s   t dd�| jƒS )Ni   )Úmaxsize)r   Ú%_DatabaseOperations__references_graphrF   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 rQ   )rf   ©r`   ÚtablerF   r   r    Ú	<genexpr>á   s     z/DatabaseOperations.sql_flush.<locals>.<genexpr>c              
      s2   g | ]*}d ˆ  d¡ˆ  d¡ˆ ˆ  |¡¡f ‘qS )z	%s %s %s;ÚDELETEZFROM)ÚSQL_KEYWORDÚ	SQL_FIELDr\   ri   ©r   Ústyler   r    rb   ã   s   úýÿz0DatabaseOperations.sql_flush.<locals>.<listcomp>c                 S   s   g | ]}d |i‘qS )rj   r   ri   r   r   r    rb   í   s     )Úsetr   Úfrom_iterableÚextendÚsequence_reset_by_name_sql)r   rp   Ztablesrg   rh   r.   Ú	sequencesr   ro   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);ÚUPDATEZsqlite_sequenceZSETÚseqZWHEREr[   ÚINrH   c                 S   s   g | ]}d |d  ‘qS )ú'%s'rj   r   )r`   Zsequence_infor   r   r    rb   ÿ   s     zADatabaseOperations.sequence_reset_by_name_sql.<locals>.<listcomp>)rm   Z	SQL_TABLEr\   rn   rK   )r   rp   ru   r   r   r    rt   ñ   s     ÿøÿÿz-DatabaseOperations.sequence_reset_by_name_sqlc                 C   sL   |d krd S t |dƒr|S t |¡rDtjr<t || jj¡}ntdƒ‚t|ƒS )NÚresolve_expressionzNSQLite backend does not support timezone-aware datetimes when USE_TZ is False.)	Úhasattrr   Úis_awarer   r=   Z
make_naiver   Ú
ValueErrorÚstr©r   Úvaluer   r   r    Úadapt_datetimefield_value  s    

ÿz,DatabaseOperations.adapt_datetimefield_valuec                 C   s4   |d k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~   r   r€   r   r   r    Úadapt_timefield_value  s    

z(DatabaseOperations.adapt_timefield_valuec                    s    t ƒ  |¡}|j ¡ }|dkr,| | j¡ np|dkrB| | j¡ nZ|dkrX| | j¡ nD|dkrr| |  |¡¡ n*|dkrˆ| | j	¡ n|dkrœ| | j
¡ |S )Nr   r   r"   ZDecimalFieldZ	UUIDFieldZBooleanField)ÚsuperÚget_db_convertersr$   Z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 k	r<t |tjƒst|ƒ}tjr<t |¡s<t || jj¡}|S rQ   )	r#   Údatetimer   r   r=   r   r}   Z
make_awarer   ©r   r�   r&   r   r   r   r    r‡   7  s    z.DatabaseOperations.convert_datetimefield_valuec                 C   s    |d k	rt |tjƒst|ƒ}|S rQ   )r#   r‘   Údater   r’   r   r   r    rˆ   ?  s    z*DatabaseOperations.convert_datefield_valuec                 C   s    |d k	rt |tjƒst|ƒ}|S rQ   )r#   r‘   Útimer   r’   r   r   r    r‰   E  s    z*DatabaseOperations.convert_timefield_valuec                    sN   t jdd�j‰ t|tƒr>t  d¡ |jj ¡‰‡ ‡fdd„}n‡ fdd„}|S )Né   )Úprecr   c                    s"   | d k	rˆ | ƒj ˆ|jjd�S d S )N)Úcontext)Úquantizer$   r—   ©r�   r&   r   ©Úcreate_decimalZquantize_valuer   r    Ú	converterT  s
     ÿz@DatabaseOperations.get_decimalfield_converter.<locals>.converterc                    s   | d k	rˆ | ƒS d S rQ   r   r™   )r›   r   r    rœ   \  s    )	ÚdecimalÚContextÚcreate_decimal_from_floatr#   r   ÚDecimalÚscalebr$   Zdecimal_places)r   r&   rœ   r   rš   r    rŠ   K  s    

ÿz-DatabaseOperations.get_decimalfield_converterc                 C   s   |d k	rt  |¡}|S rQ   )ÚuuidÚUUIDr’   r   r   r    r‹   b  s    
z*DatabaseOperations.convert_uuidfield_valuec                 C   s   |dkrt |ƒS |S )N)r   r   )Úboolr’   r   r   r    rŒ   g  s    z-DatabaseOperations.convert_booleanfield_valuec                 C   s,   dd„ |D ƒ}d  dd„ |D ƒ¡}d|› �S )Nc                 s   s   | ]}d   |¡V  qdS )rH   N©rK   r_   r   r   r    rk   k  s     z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>rH   c                 s   s   | ]}d |› d�V  qdS )ú(r)   Nr   )r`   r.   r   r   r    rk   l  s     zVALUES r¥   )r   r   Zplaceholder_rowsZplaceholder_rows_sqlZ
values_sqlr   r   r    Úbulk_insert_sqlj  s    z"DatabaseOperations.bulk_insert_sqlc                    s:   |dkrdd  |¡ S |dkr,dd  |¡ S tƒ  ||¡S )Nú^z	POWER(%s)ú,ú#z
BITXOR(%s))rK   r„   Úcombine_expression)r   Ú	connectorÚsub_expressionsr�   r   r    r«   o  s
    z%DatabaseOperations.combine_expressionc                 C   sD   |dkrt d| ƒ‚d| g| }t|ƒdkr6tdƒ‚dd |¡ S )N)ú+ú-Ú*ú/z$Invalid connector for timedelta: %s.rz   é   z)Too many params for timedelta operations.zdjango_format_dtdelta(%s)rH   )r   r   r~   rK   )r   r¬   r­   Z	fn_paramsr   r   r    Úcombine_duration_expressionx  s    z.DatabaseOperations.combine_duration_expressionc                 C   s   dS r<   r   )r   rŽ   r   r   r    Úinteger_field_range€  s    z&DatabaseOperations.integer_field_rangec           	      C   s@   |\}}|\}}||˜}|dkr0d||f |fS d||f |fS )Nr"   zdjango_time_diff(%s, %s)zdjango_timestamp_diff(%s, %s)r   )	r   rŽ   ÚlhsÚrhsZlhs_sqlZ
lhs_paramsZrhs_sqlZ
rhs_paramsr/   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
   Z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)r\   ÚmodelZ_metaZdb_tableÚcolumn©r`   ÚfieldrF   r   r    rb   •  s   û
þÿz<DatabaseOperations.return_insert_columns.<locals>.<listcomp>zRETURNING %srH   r   r¥   )r   r   Úcolumnsr   rF   r    Úreturn_insert_columns‘  s    
úz(DatabaseOperations.return_insert_columnsc                    sX   |t jkrF| jjjrFdd t| j|ƒ¡d dd„ t| j|ƒD ƒ¡f S tƒ  	||||¡S )Nz ON CONFLICT(%s) DO UPDATE SET %srH   c                 S   s   g | ]}|› d |› �‘qS )z = EXCLUDED.r   r½   r   r   r    rb   §  s   ÿz=DatabaseOperations.on_conflict_suffix_sql.<locals>.<listcomp>)
r
   rw   r   r   Z%supports_update_conflicts_with_targetrK   Úmapr\   r„   Úon_conflict_suffix_sql)r   r   r¸   Zupdate_fieldsZunique_fieldsr�   r   r    rÂ   Ÿ  s$    ÿþ
þÿþ	üz)DatabaseOperations.on_conflict_suffix_sql)N)N)N)1Ú__name__Ú
__module__Ú__qualname__Z"cast_char_field_without_max_lengthZcast_data_typesZexplain_prefixÚ	frozensetZjsonfield_datatype_valuesr!   r(   r0   r3   r4   r:   r;   r7   r@   rA   rB   rC   rD   rG   rJ   rW   r\   r^   re   r   rf   rv   rt   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   Zdjango.confr   Zdjango.core.exceptionsr   Z	django.dbr   r   r   Z"django.db.backends.base.operationsr	   Zdjango.db.models.constantsr
   Zdjango.db.models.expressionsr   Zdjango.utilsr   Zdjango.utils.dateparser   r   r   Zdjango.utils.functionalr   r   r   r   r   r    Ú<module>   s   