a
    ÛEb1?  ã                   @   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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)ÚCol)Útimezone)Ú
parse_dateÚparse_datetimeÚ
parse_time)Úcached_propertyc                       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dUdd„ZdVd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'dGdH„ Z(‡ fdIdJ„Z)dKdL„ Z*dMdN„ Z+dOdP„ Z,dW‡ fdQdR„	Z-dSdT„ Z.‡  Z/S )XÚ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   úe/home/ja/django-apps/lartica_env/lib/python3.9/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||ƒrp| 	¡ D ]8}z
|j
}W n ttfyZ   Y q60 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|  ¡ |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_sqlG   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_rowsO   s    z-DatabaseOperations.fetch_returned_insert_rowsc                 C   s   |S )z>Do nothing since formatting is handled in the custom function.r   )r   Úsqlr   r   r   Úformat_for_duration_arithmeticV   s    z1DatabaseOperations.format_for_duration_arithmeticNc                 C   s   d|  ¡ |g|  |¡¢R  S )Nz#django_date_trunc('%s', %s, %s, %s)©r)   Ú_convert_tznames_to_sql©r   r+   r,   Útznamer   r   r   Údate_trunc_sqlZ   s    þýz!DatabaseOperations.date_trunc_sqlc                 C   s   d|  ¡ |g|  |¡¢R  S )Nz#django_time_trunc('%s', %s, %s, %s)r3   r5   r   r   r   Útime_trunc_sqla   s    þýz!DatabaseOperations.time_trunc_sqlc                 C   s"   |rt jrd| d| jj fS dS )Nú'%s')ÚNULLr:   )r   ÚUSE_TZr   Ztimezone_name)r   r6   r   r   r   r4   h   s    
z*DatabaseOperations._convert_tznames_to_sqlc                 C   s   d|g|   |¡¢R  S )Nz%django_datetime_cast_date(%s, %s, %s)©r4   ©r   r,   r6   r   r   r   Údatetime_cast_date_sqlm   s
    ÿþz)DatabaseOperations.datetime_cast_date_sqlc                 C   s   d|g|   |¡¢R  S )Nz%django_datetime_cast_time(%s, %s, %s)r<   r=   r   r   r   Údatetime_cast_time_sqls   s
    ÿþz)DatabaseOperations.datetime_cast_time_sqlc                 C   s   d|  ¡ |g|  |¡¢R  S )Nz)django_datetime_extract('%s', %s, %s, %s)r3   r5   r   r   r   Údatetime_extract_sqly   s    þýz'DatabaseOperations.datetime_extract_sqlc                 C   s   d|  ¡ |g|  |¡¢R  S )Nz'django_datetime_trunc('%s', %s, %s, %s)r3   r5   r   r   r   Údatetime_trunc_sql€   s    þýz%DatabaseOperations.datetime_trunc_sqlc                 C   s   d|  ¡ |f S )Nzdjango_time_extract('%s', %s)r(   r*   r   r   r   Útime_extract_sql‡   s    z#DatabaseOperations.time_extract_sqlc                 C   s   dS )Nr:   r   ©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 | ¡  0 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   r/   ÚexecuteZfetchoneÚclose)r   ÚparamsZ
BATCH_SIZEÚresultsÚindexÚchunkr1   r/   r   r   r   rG   �   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ÚtuplerG   ÚvaluesÚdictÚzip)r   r/   r1   rK   rR   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   rC   r   r   r   Úno_limit_valueÁ   s    z!DatabaseOperations.no_limit_valuec                 C   sZ   d}|ddf}| j  ¡ �.}| ||¡}dd„ | ¡ D ƒW  d   ƒ S 1 sL0    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>Õ   ó    z9DatabaseOperations.__references_graph.<locals>.<listcomp>)r   r/   rI   r.   )r   Z
table_nameÚqueryrK   r/   rL   r   r   r   Z__references_graphÄ   s    
ýz%DatabaseOperations.__references_graphc                 C   s   t dd�| jƒS )Ni   )Úmaxsize)r   Ú%_DatabaseOperations__references_graphrC   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 rO   )re   ©r^   ÚtablerC   r   r   Ú	<genexpr>â   ra   z/DatabaseOperations.sql_flush.<locals>.<genexpr>c              
      s2   g | ]*}d ˆ  d¡ˆ  d¡ˆ ˆ  |¡¡f ‘qS )z	%s %s %s;ÚDELETEZFROM)ÚSQL_KEYWORDÚ	SQL_FIELDrZ   rh   ©r   Ústyler   r   r`   ä   s   úýÿz0DatabaseOperations.sql_flush.<locals>.<listcomp>c                 S   s   g | ]}d |i‘qS )ri   r   rh   r   r   r   r`   î   ra   )Úsetr   Úfrom_iterableÚextendÚsequence_reset_by_name_sql)r   ro   Ztablesrf   rg   r1   Ú	sequencesr   rn   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);ZUPDATEZsqlite_sequenceZSETÚseqZWHERErY   ÚINrE   c                 S   s   g | ]}d |d  ‘qS )r9   ri   r   )r^   Zsequence_infor   r   r   r`      ra   zADatabaseOperations.sequence_reset_by_name_sql.<locals>.<listcomp>)rl   Z	SQL_TABLErZ   rm   rH   )r   ro   rt   r   r   r   rs   ò   s     ÿøÿÿz-DatabaseOperations.sequence_reset_by_name_sqlc                 C   sL   |d u 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 u rd S t |dƒr|S t |¡r,tdƒ‚t|ƒS )Nrx   z5SQLite backend does not support timezone-aware times.)ry   r   rz   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 ur<t |tjƒst|ƒ}tjr<t |¡s<t || jj¡}|S rO   )	r"   Údatetimer   r   r;   r   rz   Z
make_awarer   ©r   r~   r%   r   r   r   r   r„   8  s    z.DatabaseOperations.convert_datetimefield_valuec                 C   s    |d urt |tjƒst|ƒ}|S rO   )r"   rŽ   Údater   r�   r   r   r   r…   @  s    z*DatabaseOperations.convert_datefield_valuec                 C   s    |d urt |tjƒst|ƒ}|S rO   )r"   rŽ   Útimer   r�   r   r   r   r†   F  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 urˆ | ƒj ˆ|jjd�S d S )N)Úcontext)Úquantizer#   r”   ©r~   r%   r   ©Úcreate_decimalZquantize_valuer   r   Ú	converterU  s    ÿz@DatabaseOperations.get_decimalfield_converter.<locals>.converterc                    s   | d urˆ | ƒS d S rO   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‡   L  s    

ÿz-DatabaseOperations.get_decimalfield_converterc                 C   s   |d urt  |¡}|S rO   )ÚuuidÚUUIDr�   r   r   r   rˆ   c  s    
z*DatabaseOperations.convert_uuidfield_valuec                 C   s   |dv rt |ƒS |S )N)r   r   )Úboolr�   r   r   r   r‰   h  s    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 %srE   N©rH   r]   r   r   r   rj   l  s   z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>r¢   )r   r   Zplaceholder_rowsr   r   r   Úbulk_insert_sqlk  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))rH   r�   Úcombine_expression)r   Ú	connectorÚsub_expressionsrŒ   r   r   r§   p  s
    z%DatabaseOperations.combine_expressionc                 C   sD   |dvrt d| ƒ‚d| g| }t|ƒdkr6tdƒ‚dd |¡ S )N)ú+ú-Ú*ú/z$Invalid connector for timedelta: %s.r9   é   z)Too many params for timedelta operations.zdjango_format_dtdelta(%s)rE   )r   r   r{   rH   )r   r¨   r©   Z	fn_paramsr   r   r   Úcombine_duration_expressiony  s    z.DatabaseOperations.combine_duration_expressionc                 C   s   dS )N)NNr   )r   r‹   r   r   r   Úinteger_field_range�  s    z&DatabaseOperations.integer_field_rangec           	      C   sF   |\}}|\}}g |¢|¢R }|dkr6d||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_paramsrK   r   r   r   Úsubtract_temporals…  s    z%DatabaseOperations.subtract_temporalsc                    s   |rdS t ƒ  |¡S )NzINSERT OR IGNORE INTO)r�   Úinsert_statement)r   Zignore_conflictsrŒ   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)rZ   ÚmodelÚ_metaZdb_tableÚcolumn)r^   ÚfieldrC   r   r   r`   ˜  s   û
þÿz<DatabaseOperations.return_insert_columns.<locals>.<listcomp>zRETURNING %srE   r   r¢   )r   r   Úcolumnsr   rC   r   Úreturn_insert_columns”  s    
úz(DatabaseOperations.return_insert_columns)N)N)F)0Ú__name__Ú
__module__Ú__qualname__Z"cast_char_field_without_max_lengthZcast_data_typesZexplain_prefixÚ	frozensetZjsonfield_datatype_valuesr    r'   r-   r0   r2   r7   r8   r4   r>   r?   r@   rA   rB   rD   rG   rU   rZ   r\   rd   r   re   ru   rs   r   r€   r‚   r„   r…   r†   r‡   rˆ   r‰   r£   r§   r¯   r°   r³   r´   r»   Ú__classcell__r   r   rŒ   r   r      sZ   þ


	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.expressionsr
   Zdjango.utilsr   Zdjango.utils.dateparser   r   r   Zdjango.utils.functionalr   r   r   r   r   r   Ú<module>   s   