o
    uvXj®Y  ã                   @   sB  d Z ddlZddlZddlZddlZddlZ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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! ddl"m#Z# ddl$m%Z% ddl&m'Z' ddl(m)Z) dd„ Z*dd„ Z+dd„ Z,dd„ Z-e-ƒ  e .ddj/¡ e .de*eƒ¡ e .de*eƒ¡ e .de*eƒ¡ e .de*eƒ¡ e 0ej1e2¡ G d d!„ d!eƒZ3e 4d"¡Z5G d#d$„ d$ej6ƒZ7dAd%d&„Z8d'd(„ Z9d)d*„ Z:d+d,„ Z;d-d.„ Z<dAd/d0„Z=d1d2„ Z>d3d4„ Z?e+d5d6„ ƒZ@e+d7d8„ ƒZAe+d9d:„ ƒZBe+d;d<„ ƒZCe+d=d>„ ƒZDe+d?d@„ ƒZEdS )Bz@
SQLite backend for the sqlite3 module in the standard library.
é    N)Úchain)Údbapi2)ÚImproperlyConfigured)Úutils)ÚBaseDatabaseWrapper)Útimezone)Úparse_datetimeÚ
parse_time)Úduration_microsecondsé   )ÚDatabaseClient)ÚDatabaseCreation)ÚDatabaseFeatures)ÚDatabaseIntrospection)ÚDatabaseOperations)ÚDatabaseSchemaEditorc                    s   ‡ fdd„S )zR
    Convert bytestrings from Python's sqlite3 interface to a regular string.
    c                    s   ˆ |   ¡ ƒS ©N)Údecode)Ús©Ú	conv_func© ú\/var/www/html/myproject/venv/lib/python3.10/site-packages/django/db/backends/sqlite3/base.pyÚ<lambda>%   ó    zdecoder.<locals>.<lambda>r   r   r   r   r   Údecoder!   s   r   c                    s   t  ˆ ¡‡ fdd„ƒ}|S )a  
    Decorator that returns None if any of the arguments to the decorated
    function are None. Many SQL functions return NULL if any of their arguments
    are NULL. This decorator simplifies the implementation of this for the
    custom functions registered below.
    c                     s   d | v rd S ˆ | i |¤ŽS r   r   )ÚargsÚkwargs©Úfuncr   r   Úwrapper/   s   znone_guard.<locals>.wrapper)Ú	functoolsÚwraps)r   r    r   r   r   Ú
none_guard(   s   r#   c                 C   s   t dtf| tjdœƒS )zx
    Return an aggregate class that accumulates values in a list and applies
    the provided function to the data.
    ÚListAggregate)ÚfinalizeÚstep)ÚtypeÚlistÚappend)Úfunctionr   r   r   Úlist_aggregate5   s   r+   c                   C   s   t jdk rtdt j ƒ‚d S )N)é   é   r,   z-SQLite 3.8.3 or later is required (found %s).)ÚDatabaseÚsqlite_version_infor   Úsqlite_versionr   r   r   r   Úcheck_sqlite_version=   s   
ÿr1   Úbooló   1ÚtimeÚdatetimeÚ	timestampÚ	TIMESTAMPc                   @   sh  e Zd ZdZdZi dd“dd“dd“dd	“d
d“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd	“ddd dd!d"d#d$d%œ¥Zd&d&d'œZd(d(d)œZd*d+d+d+d,d-d.d/d0d1d+d+d+d+d2œZd3Z	d4d5d6d7d8d9d:œZ
eZeZeZeZeZeZeZd;d<„ Zd=d>„ Zd?d@„ ZdVdBdC„ZdDdE„ ZdFdG„ ZdHdI„ ZdJdK„ ZdLdM„ Z dVdNdO„Z!dPdQ„ Z"dRdS„ Z#dTdU„ Z$dAS )WÚDatabaseWrapperÚsqliteÚSQLiteÚ	AutoFieldÚintegerÚBigAutoFieldÚBinaryFieldÚBLOBÚBooleanFieldr2   Ú	CharFieldzvarchar(%(max_length)s)Ú	DateFieldÚdateÚDateTimeFieldr5   ÚDecimalFieldÚdecimalÚDurationFieldÚbigintÚ	FileFieldÚFilePathFieldÚ
FloatFieldÚrealÚIntegerFieldÚBigIntegerFieldÚIPAddressFieldzchar(15)ÚGenericIPAddressFieldzchar(39)ÚNullBooleanFieldzinteger unsignedzsmallint unsignedÚsmallintÚtextr4   zchar(32))ÚOneToOneFieldÚPositiveIntegerFieldÚPositiveSmallIntegerFieldÚ	SlugFieldÚSmallIntegerFieldÚ	TextFieldÚ	TimeFieldÚ	UUIDFieldz"%(column)s" >= 0)rU   rV   ÚAUTOINCREMENT)r;   r=   z= %szLIKE %s ESCAPE '\'z	REGEXP %szREGEXP '(?i)' || %sz> %sz>= %sz< %sz<= %s)ÚexactÚiexactÚcontainsÚ	icontainsÚregexÚiregexÚgtÚgteÚltÚlteÚ
startswithÚendswithÚistartswithÚ	iendswithz@REPLACE(REPLACE(REPLACE({}, '\', '\\'), '%%', '\%%'), '_', '\_')z"LIKE '%%' || {} || '%%' ESCAPE '\'z)LIKE '%%' || UPPER({}) || '%%' ESCAPE '\'zLIKE {} || '%%' ESCAPE '\'z!LIKE UPPER({}) || '%%' ESCAPE '\'zLIKE '%%' || {} ESCAPE '\'z!LIKE '%%' || UPPER({}) ESCAPE '\')r_   r`   rg   ri   rh   rj   c                 C   sd   | j }|d stdƒ‚|d tjtjB dœ|d ¥}d|v r(|d r(t dt¡ | ddd	œ¡ |S )
NÚNAMEzJsettings.DATABASES is improperly configured. Please supply the NAME value.)ÚdatabaseÚdetect_typesÚOPTIONSÚcheck_same_threadzÃThe `check_same_thread` option was provided and set to True. It will be overridden with False. Use the `DatabaseWrapper.allow_thread_sharing` property instead for controlling thread shareability.FT)ro   Úuri)	Úsettings_dictr   r.   ÚPARSE_DECLTYPESÚPARSE_COLNAMESÚwarningsÚwarnÚRuntimeWarningÚupdate)Úselfrq   r   r   r   r   Úget_connection_params¥   s"   ÿ
þýûz%DatabaseWrapper.get_connection_paramsc                 C   sÚ  t jd2i |¤Ž}| ddt¡ | ddt¡ | ddt¡ | ddt¡ | ddt¡ | ddt¡ | d	dt¡ | d
dt	¡ | ddt
¡ | ddt¡ | ddt¡ | ddt¡ | ddttjƒ¡ | ddttjƒ¡ | ddttjƒ¡ | ddttjƒ¡ | ddttjƒ¡ | ddttjƒ¡ | ddtdd„ ƒ¡ | ddttjƒ¡ | ddttjƒ¡ | ddttjƒ¡ | ddttjƒ¡ | ddtdd„ ƒ¡ | ddt¡ | d dttjƒ¡ | d!d"d#d„ ¡ | d$dttjƒ¡ | d%dttjƒ¡ | d&dttjƒ¡ | d'dtd(d„ ƒ¡ | d)dt ¡ | d*dttj!ƒ¡ | d+dttj"ƒ¡ | d,dttj#ƒ¡ | $d-dt%t&j'ƒ¡ | $d.dt%t&j(ƒ¡ | $d/dt%t&j)ƒ¡ | $d0dt%t&j*ƒ¡ | +d1¡ |S )3NÚdjango_date_extracté   Údjango_date_truncÚdjango_datetime_cast_dateÚdjango_datetime_cast_timeÚdjango_datetime_extractr,   Údjango_datetime_truncÚdjango_time_extractÚdjango_time_truncÚdjango_time_diffÚdjango_timestamp_diffÚdjango_format_dtdeltaÚregexpÚACOSr   ÚASINÚATANÚATAN2ÚCEILINGÚCOSÚCOTc                 S   s   dt  | ¡ S )Nr   )ÚmathÚtan©Úxr   r   r   r   Õ   ó    z4DatabaseWrapper.get_new_connection.<locals>.<lambda>ÚDEGREESÚEXPÚFLOORÚLNÚLOGc                 S   s   t  || ¡S r   )rŽ   Úlog)r‘   Úyr   r   r   r   Ú   r   ÚLPADÚMODÚPIr   c                   S   s   t jS r   )rŽ   Úpir   r   r   r   r   Ý   s    ÚPOWERÚRADIANSÚREPEATÚREVERSEc                 S   s   | d d d… S )Néÿÿÿÿr   r�   r   r   r   r   á   r’   ÚRPADÚSINÚSQRTÚTANÚ
STDDEV_POPÚSTDDEV_SAMPÚVAR_POPÚVAR_SAMPúPRAGMA foreign_keys = ONr   ),r.   ÚconnectÚcreate_functionÚ_sqlite_datetime_extractÚ_sqlite_date_truncÚ_sqlite_datetime_cast_dateÚ_sqlite_datetime_cast_timeÚ_sqlite_datetime_truncÚ_sqlite_time_extractÚ_sqlite_time_truncÚ_sqlite_time_diffÚ_sqlite_timestamp_diffÚ_sqlite_format_dtdeltaÚ_sqlite_regexpr#   rŽ   ÚacosÚasinÚatanÚatan2ÚceilÚcosÚdegreesÚexpÚfloorr˜   Ú_sqlite_lpadÚfmodÚoperatorÚpowÚradiansÚmulÚ_sqlite_rpadÚsinÚsqrtr�   Úcreate_aggregater+   Ú
statisticsÚpstdevÚstdevÚ	pvarianceÚvarianceÚexecute)rx   Úconn_paramsÚconnr   r   r   Úget_new_connectionÁ   sT   
z"DatabaseWrapper.get_new_connectionc                 C   s   d S r   r   ©rx   r   r   r   Úinit_connection_stateí   ó   z%DatabaseWrapper.init_connection_stateNc                 C   s   | j jtd�S )N)Úfactory)Ú
connectionÚcursorÚSQLiteCursorWrapper)rx   Únamer   r   r   Úcreate_cursorð   s   zDatabaseWrapper.create_cursorc                 C   s"   |   ¡  |  ¡ st | ¡ d S d S r   )Úvalidate_thread_sharingÚis_in_memory_dbr   ÚcloserÕ   r   r   r   rà   ó   s   ÿzDatabaseWrapper.closec                 C   s   | j S r   )Úin_atomic_blockrÕ   r   r   r   Ú_savepoint_allowedû   s   z"DatabaseWrapper._savepoint_allowedc                 C   sB   |rd }nd}| j � || j_W d   ƒ d S 1 sw   Y  d S )NÚ )Úwrap_database_errorsrÙ   Úisolation_level)rx   Ú
autocommitÚlevelr   r   r   Ú_set_autocommit  s   
"ÿzDatabaseWrapper._set_autocommitc                 C   sN   |   ¡ �}| d¡ | d¡ ¡ d }W d   ƒ n1 sw   Y  t|ƒ S )NzPRAGMA foreign_keys = OFFzPRAGMA foreign_keysr   )rÚ   rÑ   Úfetchoner2   )rx   rÚ   Úenabledr   r   r   Údisable_constraint_checking  s
   

û
z+DatabaseWrapper.disable_constraint_checkingc                 C   s   |   ¡  d¡ d S )Nr«   ©rÚ   rÑ   rÕ   r   r   r   Úenable_constraint_checking  ó   z*DatabaseWrapper.enable_constraint_checkingc                    s¶  | j jru|  ¡ �c‰ |du r|  ¡  d¡ ¡ }nt ‡ fdd„|D ƒ¡}|D ]=\}}}}ˆ  d| ¡ ¡ | }|dd… \}}	| j ˆ |¡}
ˆ  d|
||f |f¡ 	¡ \}}t
 d	|||||||	f ¡‚W d  ƒ dS 1 snw   Y  dS |  ¡ �X‰ |du r„| j ˆ ¡}|D ]B}| j ˆ |¡}
|
s’q†| j ˆ |¡}|D ],\}}}	ˆ  d
|
|||||	||	f ¡ ˆ  ¡ D ]}t
 d	||d |||d ||	f ¡‚q›q†W d  ƒ dS 1 sÔw   Y  dS )a]  
        Check each table name in `table_names` for rows with invalid foreign
        key references. This method is intended to be used in conjunction with
        `disable_constraint_checking()` and `enable_constraint_checking()`, to
        determine if rows with invalid references were entered while constraint
        checks were off.
        NzPRAGMA foreign_key_checkc                 3   s"   � | ]}ˆ   d | ¡ ¡ V  qdS )zPRAGMA foreign_key_check(%s)N)rÑ   Úfetchall)Ú.0Ú
table_name©rÚ   r   r   Ú	<genexpr>(  s
   € ÿ
ÿz4DatabaseWrapper.check_constraints.<locals>.<genexpr>zPRAGMA foreign_key_list(%s)r,   é   z'SELECT %s, %s FROM %s WHERE rowid = %%sz–The row in table '%s' with primary key '%s' has an invalid foreign key: %s.%s contains a value '%s' that does not have a corresponding value in %s.%s.aD  
                            SELECT REFERRING.`%s`, REFERRING.`%s` FROM `%s` as REFERRING
                            LEFT JOIN `%s` as REFERRED
                            ON (REFERRING.`%s` = REFERRED.`%s`)
                            WHERE REFERRING.`%s` IS NOT NULL AND REFERRED.`%s` IS NULL
                            r   r   )ÚfeaturesÚ!supports_pragma_foreign_key_checkrÚ   rÑ   rï   r   Úfrom_iterableÚintrospectionÚget_primary_key_columnré   r   ÚIntegrityErrorÚtable_namesÚget_key_columns)rx   rû   Ú
violationsrñ   ÚrowidÚreferenced_table_nameÚforeign_key_indexÚforeign_keyÚcolumn_nameÚreferenced_column_nameÚprimary_key_column_nameÚprimary_key_valueÚ	bad_valueÚkey_columnsÚbad_rowr   rò   r   Úcheck_constraints  sz   
þÿþÿüûþþÿô"÷
ýúÿ
þþÿÿòû"ýz!DatabaseWrapper.check_constraintsc                 C   s   dS )NTr   rÕ   r   r   r   Ú	is_usableb  r×   zDatabaseWrapper.is_usablec                 C   s   |   ¡  d¡ dS )zÂ
        Start a transaction explicitly in autocommit mode.

        Staying in autocommit mode works around a bug of sqlite3 that breaks
        savepoints when autocommit is disabled.
        ÚBEGINNrì   rÕ   r   r   r   Ú#_start_transaction_under_autocommite  s   z3DatabaseWrapper._start_transaction_under_autocommitc                 C   s   | j  | jd ¡S )Nrk   )Úcreationrß   rq   rÕ   r   r   r   rß   n  rî   zDatabaseWrapper.is_in_memory_dbr   )%Ú__name__Ú
__module__Ú__qualname__ÚvendorÚdisplay_nameÚ
data_typesÚdata_type_check_constraintsÚdata_types_suffixÚ	operatorsÚpattern_escÚpattern_opsr.   r   ÚSchemaEditorClassr   Úclient_classr   Úcreation_classr   Úfeatures_classr   Úintrospection_classr   Ú	ops_classry   rÔ   rÖ   rÝ   rà   râ   rè   rë   rí   r	  r
  r  rß   r   r   r   r   r8   M   sÀ    ÿþýüûúùø	÷
öõôóòñðïçþþòú	,
	
G	r8   z(?<!%)%sc                   @   s*   e Zd ZdZd	dd„Zdd„ Zdd„ ZdS )
rÛ   zÃ
    Django uses "format" style placeholders, but pysqlite2 uses "qmark" style.
    This fixes it -- but note that if you want to use a literal "%s" in a query,
    you'll need to use "%%s".
    Nc                 C   s0   |d u rt j | |¡S |  |¡}t j | ||¡S r   )r.   ÚCursorrÑ   Úconvert_query)rx   ÚqueryÚparamsr   r   r   rÑ   {  s   
zSQLiteCursorWrapper.executec                 C   s   |   |¡}tj | ||¡S r   )r   r.   r  Úexecutemany)rx   r!  Ú
param_listr   r   r   r#  �  s   
zSQLiteCursorWrapper.executemanyc                 C   s   t  d|¡ dd¡S )Nú?z%%ú%)ÚFORMAT_QMARK_REGEXÚsubÚreplace)rx   r!  r   r   r   r   …  s   z!SQLiteCursorWrapper.convert_queryr   )r  r  r  Ú__doc__rÑ   r#  r   r   r   r   r   rÛ   u  s
    
rÛ   c              	   C   sR   | d u rd S zt  | ¡} W n ttfy   Y d S w |d ur't | t |¡¡} | S r   )Úbackend_utilsÚtypecast_timestampÚ	TypeErrorÚ
ValueErrorr   Ú	localtimeÚpytz©ÚdtÚtznamer   r   r   Ú_sqlite_datetime_parse‰  s   ÿr4  c                 C   s¸   t |ƒ}|d u r
d S | dkrd|j S | dkr(|j|jd d  }d|j|f S | dkr4d|j|jf S | dkrL|tj| ¡ d	� }d
|j|j|jf S | dkrZd
|j|j|jf S d S )NÚyearz%i-01-01Úquarterr   r,   z
%i-%02i-01ÚmonthÚweek©Údaysz%i-%02i-%02iÚday)r4  r5  r7  r5   Ú	timedeltaÚweekdayr;  )Úlookup_typer2  Úmonth_in_quarterr   r   r   r¯   •  s    
ÿr¯   c              	   C   s~   |d u rd S zt  |¡}W n ttfy   Y d S w | dkr#d|j S | dkr/d|j|jf S | dkr=d|j|j|jf S d S )NÚhourz
%02i:00:00Úminutez%02i:%02i:00Úsecondz%02i:%02i:%02i)r+  Útypecast_timer.  r-  r@  rA  rB  ©r>  r2  r   r   r   r´   §  s   ÿ
ÿr´   c                 C   ó"   t | |ƒ} | d u rd S |  ¡  ¡ S r   )r4  rC   Ú	isoformatr1  r   r   r   r°   ¶  ó   
r°   c                 C   rE  r   )r4  r4   rF  r1  r   r   r   r±   ½  rG  r±   c                 C   sx   t ||ƒ}|d u rd S | dkr| ¡ d d S | dkr!| ¡ d S | dkr-t |jd ¡S | dkr7| ¡ d S t|| ƒS )	NÚweek_dayé   r   r8  r6  r,   Úiso_yearr   )r4  Ú
isoweekdayÚisocalendarrŽ   r½   r7  Úgetattr)r>  r2  r3  r   r   r   r®   Ä  s   

r®   c                 C   s&  t ||ƒ}|d u rd S | dkrd|j S | dkr)|j|jd d  }d|j|f S | dkr5d|j|jf S | dkrM|tj| ¡ d	� }d
|j|j|jf S | dkr[d
|j|j|jf S | dkrkd|j|j|j|jf S | dkr}d|j|j|j|j|jf S | dkr‘d|j|j|j|j|j|j	f S d S )Nr5  z%i-01-01 00:00:00r6  r   r,   z%i-%02i-01 00:00:00r7  r8  r9  z%i-%02i-%02i 00:00:00r;  r@  z%i-%02i-%02i %02i:00:00rA  z%i-%02i-%02i %02i:%02i:00rB  z%i-%02i-%02i %02i:%02i:%02i)
r4  r5  r7  r5   r<  r=  r;  r@  rA  rB  )r>  r2  r3  r?  r   r   r   r²   Ô  s,   

 ÿr²   c              	   C   s>   |d u rd S zt  |¡}W n ttfy   Y d S w t|| ƒS r   )r+  rC  r.  r-  rM  rD  r   r   r   r³   ì  s   ÿ
r³   c              	   C   s�   z;t |tƒrt dd|¡nt |¡}t |tƒrt dd|¡nt |¡}|  ¡ dkr.|| }n	|| }W t	|ƒS W t	|ƒS  ttfyG   Y dS w )zs
    LHS and RHS can be either:
    - An integer number of microseconds
    - A string representing a datetime
    r   ú+N)
Ú
isinstanceÚintr5   r<  r+  r,  Ústripr.  r-  Ústr)rÓ   ÚlhsÚrhsÚreal_lhsÚreal_rhsÚoutr   r   r   r·   ö  s   ""

ùüÿr·   c                 C   st   t  | ¡}t  |¡}|jd d d |jd d  |jd  |j |jd d d  |jd d  |jd  |j S )Né<   i@B )r+  rC  r@  rA  rB  Úmicrosecond©rS  rT  ÚleftÚrightr   r   r   rµ     s$   

ÿþýüûúùÿrµ   c                 C   s    t  | ¡}t  |¡}t|| ƒS r   )r+  r,  r
   rZ  r   r   r   r¶     s   

r¶   c                 C   s   t t | t|ƒ¡ƒS r   )r2   ÚreÚsearchrR  )Ú
re_patternÚ	re_stringr   r   r   r¸   "  ó   r¸   c                 C   s4   t | ƒ|kr| d |… S || d |t | ƒ … |  S r   )Úlen©rS   ÚlengthÚ	fill_textr   r   r   rÂ   '  s   rÂ   c                 C   s   | ||  d |… S r   r   rc  r   r   r   rÈ   .  ra  rÈ   r   )Fr*  r5   rF   r!   rŽ   rÄ   r]  rÌ   rt   Ú	itertoolsr   Úsqlite3r   r.   r0  Údjango.core.exceptionsr   Ú	django.dbr   Údjango.db.backendsr+  Údjango.db.backends.base.baser   Údjango.utilsr   Údjango.utils.dateparser   r	   Údjango.utils.durationr
   Úclientr   r  r   rõ   r   rø   r   Ú
operationsr   Úschemar   r   r#   r+   r1   Úregister_converterÚ__eq__Úregister_adapterÚDecimalrR  r8   Úcompiler'  r  rÛ   r4  r¯   r´   r°   r±   r®   r²   r³   r·   rµ   r¶   r¸   rÂ   rÈ   r   r   r   r   Ú<module>   sz      
'







