o
    ^"<ff                     @   sd  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	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 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l/m0Z0 ddl1m2Z2 dd Z3dd Z4dd Z5dd Z6e6  e7ddj8 e7d e3e  e7d!e3e e7d"e3e e9ej:e; G d#d$ d$eZ<e$d%Z=G d&d' d'ej>Z?dDd(d)Z@d*d+ ZAd,d- ZBd.d/ ZCd0d1 ZDdDd2d3ZEd4d5 ZFd6d7 ZGe4d8d9 ZHe4d:d; ZIe4d<d= ZJe4d>d? ZKe4d@dA ZLe4dBdC ZMdS )Ez@
SQLite backend for the sqlite3 module in the standard library.
    N)chain)dbapi2)ImproperlyConfigured)IntegrityError)utils)BaseDatabaseWrapper)timezone)async_unsafe)parse_datetime
parse_time)duration_microseconds)_lazy_re_compile)PY38   )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 V/var/www/html/kck/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   wrapper4   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_aggregate:   s   r/   c                   C   s   t jdk rtdt j d S )N)   	   r   z-SQLite 3.9.0 or later is required (found %s).)Databasesqlite_version_infor   sqlite_versionr   r   r   r   check_sqlite_versionB   s
   
r5   bool   1timedatetime	timestampc                   @   s|  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d$d%d&Zd'd(d'd'd)Zd*d*d*d+Zd,d-d-d-d.d/d0d1d2d3d-d-d-d-d4Zd5Z	d6d7d8d9d:d;d<Z
eZeZeZeZeZeZeZd=d> Zed?d@ ZdAdB ZdXdDdEZedFdG ZdHdI ZdJdK ZdLdM Z dNdO Z!dXdPdQZ"dRdS Z#dTdU Z$dVdW Z%dCS )YDatabaseWrappersqliteSQLite	AutoFieldintegerBigAutoFieldBinaryFieldBLOBBooleanFieldr6   	CharFieldzvarchar(%(max_length)s)	DateFielddateDateTimeFieldr9   DecimalFielddecimalDurationFieldbigint	FileFieldFilePathField
FloatFieldrealIntegerFieldBigIntegerFieldIPAddressFieldzchar(15)GenericIPAddressFieldzchar(39)	JSONFieldtextzbigint unsignedzinteger unsignedzsmallint unsignedsmallintr8   zchar(32))NullBooleanFieldOneToOneFieldPositiveBigIntegerFieldPositiveIntegerFieldPositiveSmallIntegerField	SlugFieldSmallAutoFieldSmallIntegerField	TextField	TimeField	UUIDFieldz"%(column)s" >= 0z2(JSON_VALID("%(column)s") OR "%(column)s" IS NULL))rY   rT   rZ   r[   AUTOINCREMENT)r>   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 '\')re   rf   rm   ro   rn   rp   c                 C   sh   | j }|d stdt|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_threadzThe `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)ru   uri)
settings_dictr   strr2   PARSE_DECLTYPESPARSE_COLNAMESwarningswarnRuntimeWarningupdate)selfrw   r!   r   r   r   get_connection_params   s"   

z%DatabaseWrapper.get_connection_paramsc                 C   s^  t jdEi |}trtj|jdd}n|j}|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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d%d  |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$ |d0dtd1d  |d2dtd3d  |d4dtd5d  |d6dtd7d  |d8dtd9d  |d:dtd;d  |d<dttj% |d=dttj& |d>dttj' |d?d(t(j( |)d@dt*t+j, |)dAdt*t+j- |)dBdt*t+j. |)dCdt*t+j/ |0dD |S )FNT)deterministicdjango_date_extract   django_date_trunc   django_datetime_cast_dater0   django_datetime_cast_timedjango_datetime_extractdjango_datetime_truncdjango_time_extractdjango_time_truncdjango_time_diffdjango_timestamp_diffdjango_format_dtdeltaregexpACOSr   ASINATANATAN2BITXOR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MD5c                 S      t |   S r   )hashlibmd5encode	hexdigestr   r   r   r   r          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 )Nr   r   r   r   r   r      r   RPADSHA1c                 S   r   r   )r   sha1r   r   r   r   r   r   r      r   SHA224c                 S   r   r   )r   sha224r   r   r   r   r   r   r      r   SHA256c                 S   r   r   )r   sha256r   r   r   r   r   r   r      r   SHA384c                 S   r   r   )r   sha384r   r   r   r   r   r   r      r   SHA512c                 S   r   r   )r   sha512r   r   r   r   r   r   r      r   SIGNc                 S   s   | dk| dk  S )Nr   r   r   r   r   r   r      s    SINSQRTTANRAND
STDDEV_POPSTDDEV_SAMPVAR_POPVAR_SAMPPRAGMA foreign_keys = ONr   )1r2   connectr   r%   partial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operatorxorceilcosdegreesexpfloorr   _sqlite_lpadfmodpowradiansmul_sqlite_rpadsinsqrtr   randomcreate_aggregater/   
statisticspstdevstdev	pvariancevarianceexecute)r   conn_paramsconncreate_deterministic_functionr   r   r   get_new_connection   sr   
z"DatabaseWrapper.get_new_connectionc                 C   s   d S r   r   r   r   r   r   init_connection_state     z%DatabaseWrapper.init_connection_stateNc                 C   s   | j jtdS )N)factory)
connectioncursorSQLiteCursorWrapper)r   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)r   
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   fetchoner6   )r   r   enabledr   r   r   disable_constraint_checking1  s
   


z+DatabaseWrapper.disable_constraint_checkingc                 C   s8   |   }|d W d    d S 1 sw   Y  d S )Nr   r   r   )r   r   r   r   r   enable_constraint_checking:  s   
"z*DatabaseWrapper.enable_constraint_checkingc                    s  j jr q |du r d }nt fdd|D }|D ]L\}}}} dj|  | }|dd \}}	j	
 |}
 dj|
j|j|f |f \}}td	|||||||	f W d   dS 1 s|w   Y  dS  W |du rj	 }|D ]A}j	
 |}
|
sqj	 |}|D ]+\}}}	 d
|
|||||	||	f    D ]}td	||d |||d ||	f qqW d   dS 1 sw   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 j|  V  qdS )zPRAGMA foreign_key_check(%s)N)r   ops
quote_namefetchall).0
table_namer   r   r   r   	<genexpr>K  s    

z4DatabaseWrapper.check_constraints.<locals>.<genexpr>zPRAGMA foreign_key_list(%s)r0      z'SELECT %s, %s FROM %s WHERE rowid = %%szThe 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_iterabler  r  introspectionget_primary_key_columnr
  r   table_namesget_key_columns)r   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>  s~   



"
#
"z!DatabaseWrapper.check_constraintsc                 C   s   dS )NTr   r   r   r   r   	is_usable  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_autocommit  s   z3DatabaseWrapper._start_transaction_under_autocommitc                 C   s   | j | jd S )Nrq   )creationr   rw   r   r   r   r   r     s   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_opsr2   r   SchemaEditorClassr   client_classr   creation_classr   features_classr   introspection_classr   	ops_classr   r	   r   r   r   r  r  r	  r  r  r*  r+  r-  r   r   r   r   r   r;   S   s    	
		
>

	
L	r;   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   )r2   Cursorr   convert_query)r   queryparamsr   r   r   r     s   
zSQLiteCursorWrapper.executec                 C   s   |  |}tj| ||S r   )rA  r2   r@  executemany)r   rB  
param_listr   r   r   rD    s   
zSQLiteCursorWrapper.executemanyc                 C   s   t d|ddS )N?z%%%)FORMAT_QMARK_REGEXsubreplace)r   rB  r   r   r   rA    s   z!SQLiteCursorWrapper.convert_queryr   )r/  r0  r1  __doc__r   rD  rA  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 |r%| jt|d} |d urp||krp|d|d d }|dkrg|| }||\}}|rg|d\}}t	j
t|t|d}| |dkrc|n| 7 } t| t|} | S )N)tzinfo+-r   r   :)hoursminutes)backend_utilstypecast_timestamp	TypeError
ValueErrorrJ  pytzr   findsplitr9   	timedeltaint	localtime)	dttznameconn_tzname
sign_indexsignoffsetrP  rQ  offset_deltar   r   r   _sqlite_datetime_parse  s(   rc  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r6d|j|jf S | dkrN|tj| d	 }d
|j|j|jf S | dkr\d
|j|j|jf S d S )Nyearz%i-01-01quarterr   r0   z
%i-%02i-01monthweekdaysz%i-%02i-%02iday)rc  rd  rf  r9   rY  weekdayrj  lookup_typer\  r]  r^  month_in_quarterr   r   r   r     s    
r   c              	   C   s   |d u rd S t |||}|d u r$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rId|j|j|jf S d S )Nhourz
%02i:00:00minutez%02i:%02i:00secondz%02i:%02i:%02i)rc  rR  typecast_timerU  rT  ro  rp  rq  )rm  r\  r]  r^  	dt_parsedr   r   r   r     s"   
r   c                 C   $   t | ||} | d u rd S |   S r   )rc  rF   	isoformatr\  r]  r^  r   r   r   r        r   c                 C   rt  r   )rc  r8   ru  rv  r   r   r   r     rw  r   c                 C   s   t |||}|d u rd S | dkr| d d S | dkr | S | dkr*| d S | dkr6t|jd S | dkr@| d	 S t|| S )
Nweek_day   r   iso_week_dayrg  re  r0   iso_yearr   )rc  
isoweekdayisocalendarr   r   rf  getattr)rm  r\  r]  r^  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r6d|j|jf S | dkrN|tj| d	 }d
|j|j|jf S | dkr\d
|j|j|jf S | dkrld|j|j|j|jf S | dkr~d|j|j|j|j|jf S | dkrd|j|j|j|j|j|j	f S d S )Nrd  z%i-01-01 00:00:00re  r   r0   z%i-%02i-01 00:00:00rf  rg  rh  z%i-%02i-%02i 00:00:00rj  ro  z%i-%02i-%02i %02i:00:00rp  z%i-%02i-%02i %02i:%02i:00rq  z%i-%02i-%02i %02i:%02i:%02i)
rc  rd  rf  r9   rY  rk  rj  ro  rp  rq  rl  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   )rR  rr  rU  rT  r~  )rm  r\  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   rM  N)

isinstancerZ  r9   rY  rR  rS  striprU  rT  rx   )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 )rR  rr  ro  rp  rq  microsecondr  r  leftrightr   r   r   r   C  s$   

r   c                 C   s    t | }t |}t|| S r   )rR  rS  r   r  r   r   r   r   S  s   

r   c                 C   s   t t| t|S r   )r6   researchrx   )
re_pattern	re_stringr   r   r   r   Z     r   c                 C   s4   t | |kr| d | S || d |t |   |  S r   )lenrU   length	fill_textr   r   r   r   _  s   r   c                 C   s   | ||  d | S r   r   r  r   r   r   r   f  r  r   )NN)NrK  r9   rI   r%   r   r   r   r   r  r   r{   	itertoolsr   sqlite3r   r2   rV  django.core.exceptionsr   	django.dbr   django.db.backendsr   rR  django.db.backends.base.baser   django.utilsr   django.utils.asyncior	   django.utils.dateparser
   r   django.utils.durationr   django.utils.regex_helperr   django.utils.versionr   clientr   r.  r   r  r   r  r   
operationsr   schemar   r   r'   r/   r5   register_converter__eq__register_adapterDecimalrx   r;   rH  r@  r   rc  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s      I



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