o
    –¨Êh`0  ã                   @   s¬   d dl mZ d dlZd dlZd dlmZ ejdkr d dlmZ nd dl	mZ d dl
mZmZ d dlmZ z
d dlmZmZ W n eyI   d	ZY nw d
ZG dd„ deƒZdS )é    )Úunicode_literalsN)Úsettings©é   é   )ÚBaseDatabaseOperations)ÚsixÚtimezone©Ú
force_text)Údatetime_to_mysqlÚtime_to_mysqlFTc                       s‚  e Zd ZdZejdkreejddd�Zdd„ Z	dd	„ Z
d
d„ Zdd„ Zejdkr-dd„ Zn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dKd#d$„Zd%d&„ Zejdkrcd'd(„ Zd)d*„ Zejdkrpd+d,„ Zd-d.„ Zd/d0„ Zejd1k r‚d2d3„ Znd4d3„ Zejdk r¥d5d6„ Z‡ fd7d8„Zd9d:„ Z d;d<„ Z!d=d>„ Z"d?d@„ Z#‡ fdAdB„Z$‡ fdCdD„Z%dEdF„ Z&dGdH„ Z'dIdJ„ Z(‡  Z)S )LÚDatabaseOperationszmysql.connector.django.compiler)r   é   )r   l   ÿÿ )r   ì   ÿÿÿÿ )ÚPositiveSmallIntegerFieldÚPositiveIntegerFieldc                 C   s"   |dkr	d  |¡S d  | ¡ |¡S )NÚweek_dayúDAYOFWEEK({0})úEXTRACT({0} FROM {1}))ÚformatÚupper)ÚselfÚlookup_typeÚ
field_name© r   úS/var/www/html/env/lib/python3.10/site-packages/mysql/connector/django/operations.pyÚdate_extract_sql$   s
   
ÿz#DatabaseOperations.date_extract_sqlc           	      C   s~   g d¢}d}d}z	|  |¡d }W n ty   |}Y |S w d dd„ |d|… D ƒd	d„ ||d… D ƒ ¡}d
 ||¡}|S )zÒReturns SQL simulating DATE_TRUNC

        This function uses MySQL functions DATE_FORMAT and CAST to
        simulate DATE_TRUNC.

        The field_name is returned when lookup_type is not supported.
        ©ÚyearÚmonthÚdayÚhourÚminuteÚsecond©z%Y-z%mz-%dz %H:z%iz:%S©z0000-Ú01z-01z 00:Ú00z:00r   Ú c                 S   ó   g | ]}|‘qS r   r   ©Ú.0Úfr   r   r   Ú
<listcomp>?   ó    z5DatabaseOperations.date_trunc_sql.<locals>.<listcomp>Nc                 S   r*   r   r   r+   r   r   r   r.   @   r/   ú)CAST(DATE_FORMAT({0}, '{1}') AS DATETIME))ÚindexÚ
ValueErrorÚjoinr   )	r   r   r   Úfieldsr   Ú
format_defÚiÚsqlÚ
format_strr   r   r   Údate_trunc_sql.   s    øÿÿz!DatabaseOperations.date_trunc_sqlc                 C   sN   t jrd |¡}|g}ng }|dkrd |¡}||fS d | ¡ |¡}||fS )NúCONVERT_TZ({0}, 'UTC', %s)r   r   r   )r   ÚUSE_TZr   r   )r   r   r   ÚtznameÚparamsr7   r   r   r   Údatetime_extract_sqlE   s   


þÿz'DatabaseOperations.datetime_extract_sqlc                 C   s¢   t jrd |¡}|g}ng }g d¢}d}d}z	| |¡d }W n ty-   |}	Y |	|fS w d dd„ |d |… D ƒd	d„ ||d … D ƒ ¡}
d
 ||
¡}	|	|fS )Nr:   r   r%   r&   r   r)   c                 S   r*   r   r   r+   r   r   r   r.   f   r/   z9DatabaseOperations.datetime_trunc_sql.<locals>.<listcomp>c                 S   r*   r   r   r+   r   r   r   r.   g   r/   r0   )r   r;   r   r1   r2   r3   )r   r   r   r<   r=   r4   Úformat_r5   r6   r7   r8   r   r   r   Údatetime_trunc_sqlW   s(   
ùÿÿz%DatabaseOperations.datetime_trunc_sqlr   c                 C   s   d|j |j|jf g fS )ú<Returns SQL for calculating date/time intervals
            z'INTERVAL '%d 0:0:%d:%d' DAY_MICROSECOND)ÚdaysÚsecondsÚmicroseconds)r   Ú	timedeltar   r   r   Údate_interval_sqlm   s
   ÿÿz$DatabaseOperations.date_interval_sqlc                 C   s   d}|j |||j|j|jd�S )rA   zH({sql} {connector} INTERVAL '{days} 0:0:{secs}:{msecs}' DAY_MICROSECOND))r7   Ú	connectorrB   ÚsecsÚmsecs)r   rB   rC   rD   )r   r7   rG   rE   Úfmtr   r   r   rF   s   s   ÿûc                 C   s   | j jjr	d| S d| S )NzINTERVAL %s MICROSECONDz#INTERVAL FLOOR(%s / 1000000) SECOND)Ú
connectionÚfeaturesÚsupports_microsecond_precision)r   r7   r   r   r   Úformat_for_duration_arithmetic‚   s   
z1DatabaseOperations.format_for_duration_arithmeticc                 C   ó   dS )NzDROP FOREIGN KEYr   ©r   r   r   r   Údrop_foreignkey_sqlˆ   ó   z&DatabaseOperations.drop_foreignkey_sqlc                 C   s    t jdkrddg dffgS dgS )zÅ
        "ORDER BY NULL" prevents MySQL from implicitly ordering by grouped
        columns. If no ordering would otherwise be applied, we don't want any
        implicit sorting going on.
        r   NÚNULLF)ÚdjangoÚVERSIONrP   r   r   r   Úforce_no_ordering‹   s   
z$DatabaseOperations.force_no_orderingc                 C   ó
   d  |¡S )Nz(MATCH ({0}) AGAINST (%s IN BOOLEAN MODE)©r   )r   r   r   r   r   Úfulltext_search_sql–   ó   
z&DatabaseOperations.fulltext_search_sqlc                 C   s   t |jdd�S )NÚreplace)Úerrors)r   Ú	statement)r   Úcursorr7   r=   r   r   r   Úlast_executed_query™   s   z&DatabaseOperations.last_executed_queryc                 C   rO   )Nr   r   rP   r   r   r   Úno_limit_valueœ   s   z!DatabaseOperations.no_limit_valuec                 C   s"   |  d¡r| d¡r|S d |¡S )Nú`z`{0}`)Ú
startswithÚendswithr   )r   Únamer   r   r   Ú
quote_name    s   
zDatabaseOperations.quote_namec                 C   rO   )NzRAND()r   rP   r   r   r   Úrandom_function_sql¥   rR   z&DatabaseOperations.random_function_sqlFc              
   C   s^   |r-dg}|D ]}|  dj| d¡| |  |¡¡d�¡ q|  d¡ | |  ||¡¡ |S g S )NzSET FOREIGN_KEY_CHECKS = 0;z{keyword} {table};ÚTRUNCATE)ÚkeywordÚtablezSET FOREIGN_KEY_CHECKS = 1;)Úappendr   ÚSQL_KEYWORDÚ	SQL_FIELDre   ÚextendÚsequence_reset_by_name_sql)r   ÚstyleÚtablesÚ	sequencesÚallow_cascader7   ri   r   r   r   Ú	sql_flush¨   s   
þ
zDatabaseOperations.sql_flushc                 C   s   |dkrt dƒ‚|S )Nr   z@The database backend does not accept 0 as a value for AutoField.)r2   ©r   Úvaluer   r   r   Úvalidate_autopk_valueµ   s   z(DatabaseOperations.validate_autopk_valuec                 C   ó
   |   |¡S ©N)Úvalue_to_db_datetimert   r   r   r   Úadapt_datetimefield_value½   rZ   z,DatabaseOperations.adapt_datetimefield_valuec                 C   sn   |d u rd S t  |¡rtjr| t j¡jd d�}ntdƒ‚| jj	j
s(|jdd�}| jjs0t|ƒS | jj |¡S )N)Útzinfoú4MySQL backend does not support timezone-aware times.r   ©Úmicrosecond)r	   Úis_awarer   r;   Ú
astimezoneÚutcr[   r2   rK   rL   rM   Úuse_purer   Ú	converterÚto_mysqlrt   r   r   r   ry   À   s   
ÿ
z'DatabaseOperations.value_to_db_datetimec                 C   rw   rx   )Úvalue_to_db_timert   r   r   r   Úadapt_timefield_valueÒ   rZ   z(DatabaseOperations.adapt_timefield_valuec                 C   s<   |d u rd S t  |¡rtdƒ‚| jjst|ƒS | jj |¡S )Nr|   )r	   r   r2   rK   r‚   r   rƒ   r„   rt   r   r   r   r…   Õ   s   
z#DatabaseOperations.value_to_db_timec                 C   rO   )Né@   r   rP   r   r   r   Úmax_name_lengthâ   rR   z"DatabaseOperations.max_name_length)r   é	   c                 C   s.   d  d dgt|ƒ ¡¡}dd |g| ¡ S )Nú({0})ú, z%súVALUES )r   r3   Úlen)r   r4   Ú
num_valuesÚ	items_sqlr   r   r   Úbulk_insert_sqlæ   s   z"DatabaseOperations.bulk_insert_sqlc                 C   s*   dd„ |D ƒ}d  dd„ |D ƒ¡}d| S )Nc                 s   ó   � | ]}d   |¡V  qdS )r‹   N©r3   )r,   Úrowr   r   r   Ú	<genexpr>ë   ó   € z5DatabaseOperations.bulk_insert_sql.<locals>.<genexpr>r‹   c                 s   r‘   )rŠ   NrX   )r,   r7   r   r   r   r”   ì   r•   rŒ   r’   )r   r4   Úplaceholder_rowsÚplaceholder_rows_sqlÚ
values_sqlr   r   r   r�   ê   s   c                 C   s   d}d}|  |¡|  |¡gS )Nz{0}-01-01 00:00:00z{0}-12-31 23:59:59.999999rX   ©r   ru   Úfirstr$   r   r   r   Úyear_lookup_boundsð   s   z%DatabaseOperations.year_lookup_boundsc                    sH   t t| ƒ |¡\}}| jjdkr|jdd�|gS |jdd�|jdd�gS )N)é   é   é   r   r}   )Úsuperr   Ú%year_lookup_bounds_for_datetime_fieldrK   Úmysql_versionr[   r™   ©Ú	__class__r   r   r    ö   s   ÿÿ

ÿz8DatabaseOperations.year_lookup_bounds_for_datetime_fieldc                 C   sr   g }| j jdk r7dj| d¡| d¡| d¡| d¡d�}|D ]}| |  |d ¡¡}| |j|d	�¡ q|S |S )
N)rœ   r   é   z1{alter} {table} {{tablename}} {auto_inc} {field};ÚALTERÚTABLEÚAUTO_INCREMENTz= 1)Úalterri   Úauto_incÚfieldri   )Ú	tablename)rK   r¡   r   rk   rl   Ú	SQL_TABLEre   rj   )r   ro   rq   ÚresrJ   Úsequencer«   r   r   r   rn     s   üz-DatabaseOperations.sequence_reset_by_name_sqlc                 C   rW   )NzSAVEPOINT {0}rX   ©r   Úsidr   r   r   Úsavepoint_create_sql  rZ   z'DatabaseOperations.savepoint_create_sqlc                 C   rW   )NzRELEASE SAVEPOINT {0}rX   r¯   r   r   r   Úsavepoint_commit_sql  rZ   z'DatabaseOperations.savepoint_commit_sqlc                 C   rW   )NzROLLBACK TO SAVEPOINT {0}rX   r¯   r   r   r   Úsavepoint_rollback_sql  rZ   z)DatabaseOperations.savepoint_rollback_sqlc                    s(   |dkrdd  |¡ S tt| ƒ ||¡S )zS
        MySQL requires special cases for ^ operators in query expressions
        ú^zPOW(%s)ú,)r3   rŸ   r   Úcombine_expression)r   rG   Úsub_expressionsr¢   r   r   r¶     s
   
ÿz%DatabaseOperations.combine_expressionc                    sZ   t t| ƒ |¡}|j ¡ }|dv r| | j¡ |dkr!| | j¡ |dkr+| | j¡ |S )N)ÚBooleanFieldÚNullBooleanFieldÚ	UUIDFieldÚ	TextField)	rŸ   r   Úget_db_convertersÚoutput_fieldÚget_internal_typerj   Úconvert_booleanfield_valueÚconvert_uuidfield_valueÚconvert_textfield_value)r   Ú
expressionÚ
convertersÚinternal_typer¢   r   r   r¼   $  s   
ÿ
z$DatabaseOperations.get_db_convertersc                 C   s   |dv rt |ƒ}|S )N)r   r   )Úbool©r   ru   rÂ   rK   Úcontextr   r   r   r¿   1  s   z-DatabaseOperations.convert_booleanfield_valuec                 C   s   |d ur	t  |¡}|S rx   )ÚuuidÚUUIDrÆ   r   r   r   rÀ   8  s   
z*DatabaseOperations.convert_uuidfield_valuec                 C   s   |d urt |ƒ}|S rx   r
   rÆ   r   r   r   rÁ   >  s   z*DatabaseOperations.convert_textfield_value)F)*Ú__name__Ú
__module__Ú__qualname__Úcompiler_modulerT   rU   Údictr   Úinteger_field_rangesr   r9   r>   r@   rF   rN   rQ   rV   rY   r_   r`   re   rf   rs   rv   rz   ry   r†   r…   rˆ   r�   r›   r    rn   r±   r²   r³   r¶   r¼   r¿   rÀ   rÁ   Ú__classcell__r   r   r¢   r   r      s\    
þ








	r   )Ú
__future__r   rÈ   rT   Údjango.confr   rU   Ú"django.db.backends.base.operationsr   Údjango.db.backendsÚdjango.utilsr   r	   Údjango.utils.encodingr   Ú_mysql_connectorr   r   ÚImportErrorÚ	HAVE_CEXTr   r   r   r   r   Ú<module>   s    
ÿ