o
    þÞh;  ã                   @   s®  d Z ddlZddlZddl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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'm(Z( dd„ Z)dd„ Z*dd„ Z+dd„ Z,e -ddj.¡ e -de)eƒ¡ e -de)eƒ¡ e -d e)eƒ¡ e -d!e)eƒ¡ e /ej0e1¡ e /ej2e*¡ e /eje+¡ G d"d#„ d#eƒZ3ed$ƒZ4G d%d&„ d&ej5ƒZ6dS )'z@
SQLite backend for the sqlite3 module in the standard library.
é    N)ÚMapping)ÚchainÚtee)Údbapi2)ÚImproperlyConfigured)ÚIntegrityError)ÚBaseDatabaseWrapper)Úasync_unsafe)Ú
parse_dateÚparse_datetimeÚ
parse_time)Ú_lazy_re_compileé   )Úregister)Ú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/premium_crap/venv/lib/python3.10/site-packages/django/db/backends/sqlite3/base.pyÚ<lambda>    s    zdecoder.<locals>.<lambda>r   r   r   r   r   Údecoder   s   r   c                 C   s   |   ¡ S r   ©Ú	isoformat©Úvalr   r   r   Ú
adapt_date#   ó   r#   c                 C   s
   |   d¡S )Nú r   r!   r   r   r   Úadapt_datetime'   s   
r&   c                 C   s   | d d u rdS d|  S )NÚ
max_lengthÚvarcharúvarchar(%(max_length)s)r   )Údatar   r   r   Ú_get_varchar_column+   s   r+   Úbooló   1ÚdateÚtimeÚdatetimeÚ	timestampc                   @   s†  e Zd ZdZdZi dd“dd“dd“dd	“d
e“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g d=¢ƒZeZeZeZeZeZeZeZd>d?„ Zd@dA„ ZedBdC„ ƒZdYdEdF„ZedGdH„ ƒZ dIdJ„ Z!dKdL„ Z"dMdN„ Z#dOdP„ Z$dYdQdR„Z%dSdT„ Z&dUdV„ Z'dWdX„ Z(dDS )ZÚDatabaseWrapperÚsqliteÚSQLiteÚ	AutoFieldÚintegerÚBigAutoFieldÚBinaryFieldÚBLOBÚBooleanFieldr,   Ú	CharFieldÚ	DateFieldr.   ÚDateTimeFieldr0   ÚDecimalFieldÚdecimalÚDurationFieldÚbigintÚ	FileFieldr)   ÚFilePathFieldÚ
FloatFieldÚrealÚIntegerFieldÚBigIntegerFieldÚIPAddressFieldzchar(15)ÚGenericIPAddressFieldzchar(39)Ú	JSONFieldÚtextzbigint unsignedzinteger unsignedzsmallint unsignedÚsmallintr/   zchar(32))
ÚOneToOneFieldÚPositiveBigIntegerFieldÚPositiveIntegerFieldÚPositiveSmallIntegerFieldÚ	SlugFieldÚSmallAutoFieldÚSmallIntegerFieldÚ	TextFieldÚ	TimeFieldÚ	UUIDFieldz"%(column)s" >= 0z2(JSON_VALID("%(column)s") OR "%(column)s" IS NULL))rN   rJ   rO   rP   ÚAUTOINCREMENT)r5   r7   rR   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 '\')rZ   r[   rb   rd   rc   re   )ÚDEFERREDÚ	EXCLUSIVEÚ	IMMEDIATEc                 C   sè   | j }|d stdƒ‚|d tjtjB dœ|d ¥}d|v r(|d r(t dt¡ | ddd	œ¡ | 	d
d ¡}|d ur]| 
¡ | jvr]d dd„ t| jƒD ƒ¡}td| j›d|› d|› d�ƒ‚|rc| 
¡ nd | _| 	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)rm   ÚuriÚtransaction_modez, c                 S   s   g | ]}|›‘qS r   r   )Ú.0Úmoder   r   r   Ú
<listcomp>¼   s    z9DatabaseWrapper.get_connection_params.<locals>.<listcomp>zsettings.DATABASES[z>]['OPTIONS']['transaction_mode'] is improperly configured to 'z'. Use one of z
, or None.Úinit_commandÚ ú;)Úsettings_dictr   ÚDatabaseÚPARSE_DECLTYPESÚPARSE_COLNAMESÚwarningsÚwarnÚRuntimeWarningÚupdateÚpopÚupperÚtransaction_modesÚjoinÚsortedÚaliasro   ÚsplitÚinit_commands)Úselfrv   Úkwargsro   Úallowed_transaction_modesrs   r   r   r   Úget_connection_params›   sB   ÿ
þýûÿ
ÿþÿz%DatabaseWrapper.get_connection_paramsc                 C   s   | j jS r   )rw   Úsqlite_version_info©r†   r   r   r   Úget_database_versionÉ   r$   z$DatabaseWrapper.get_database_versionc                 C   sR   t jdi |¤Ž}t|ƒ | d¡ | d¡ | jD ]}| ¡  }r&| |¡ q|S )NúPRAGMA foreign_keys = ONzPRAGMA legacy_alter_table = OFFr   )rw   ÚconnectÚregister_functionsÚexecuter…   Ústrip)r†   Úconn_paramsÚconnrs   r   r   r   Úget_new_connectionÌ   s   



€z"DatabaseWrapper.get_new_connectionNc                 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 )Nrt   )Ú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�   Úfetchoner,   )r†   r—   Úenabledr   r   r   Údisable_constraint_checkingú   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þ   ˆ  ¡ �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 sxw   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)rp   Ú
table_name©r—   r†   r   r   Ú	<genexpr>  s   € ýÿ
ýz4DatabaseWrapper.check_constraints.<locals>.<genexpr>zPRAGMA foreign_key_list(%s)é   é   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.)r—   r�   r«   r   Úfrom_iterabler©   rª   ÚintrospectionÚget_primary_key_columnr¥   r   )r†   Útable_namesÚ
violationsr¬   ÚrowidÚreferenced_table_nameÚforeign_key_indexÚforeign_keyÚcolumn_nameÚreferenced_column_nameÚprimary_key_column_nameÚprimary_key_valueÚ	bad_valuer   r­   r   Úcheck_constraints  s\   
üûÿþÿ


ýÿùø	ùýÿê"õz!DatabaseWrapper.check_constraintsc                 C   s   dS )NTr   r‹   r   r   r   Ú	is_usable?  s   zDatabaseWrapper.is_usablec                 C   s6   | j du r|  ¡  d¡ dS |  ¡  d| j › �¡ 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.
        NÚBEGINzBEGIN )ro   r—   r�   r‹   r   r   r   Ú#_start_transaction_under_autocommitB  s   
z3DatabaseWrapper._start_transaction_under_autocommitc                 C   s   | j  | jd ¡S )Nri   )Úcreationrœ   rv   r‹   r   r   r   rœ   N  s   zDatabaseWrapper.is_in_memory_dbr   ))Ú__name__Ú
__module__Ú__qualname__ÚvendorÚdisplay_namer+   Ú
data_typesÚdata_type_check_constraintsÚdata_types_suffixÚ	operatorsÚpattern_escÚpattern_opsÚ	frozensetr€   rw   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   r2   <   sÐ    ÿþýüûúùø	÷
öõôóòñðïåüý	òú	.


	
8r2   z(?<!%)%sc                       s<   e Zd ZdZd
‡ fdd„	Z‡ fdd„Zddœdd	„Z‡  ZS )r˜   aQ  
    Django uses the "format" and "pyformat" styles, but Python's sqlite3 module
    supports neither of these styles.

    This wrapper performs the following conversions:

    - "format" style to "qmark" style
    - "pyformat" style to "named" style

    In both cases, if you want to use a literal "%s", you'll need to use "%%s".
    Nc                    sF   |d u r
t ƒ  |¡S t|tƒrt|ƒnd }| j||d�}t ƒ  ||¡S ©N©Úparam_names)Úsuperr�   Ú
isinstancer   ÚlistÚconvert_query)r†   ÚqueryÚparamsrØ   ©Ú	__class__r   r   r�   b  s
   zSQLiteCursorWrapper.executec                    sR   t t|ƒƒ\}}t|d ƒ }rt|tƒrt|ƒ}nd }| j||d�}tƒ  ||¡S rÖ   )	r   ÚiterÚnextrÚ   r   rÛ   rÜ   rÙ   Úexecutemany)r†   rÝ   Ú
param_listÚpeekablerÞ   rØ   rß   r   r   rã   j  s   
zSQLiteCursorWrapper.executemanyr×   c                C   s.   |d u rt  d|¡ dd¡S |dd„ |D ƒ S )Nú?z%%ú%c                 S   s   i | ]}|d |› �“qS )ú:r   )rp   r™   r   r   r   Ú
<dictcomp>{  s    z5SQLiteCursorWrapper.convert_query.<locals>.<dictcomp>)ÚFORMAT_QMARK_REGEXÚsubÚreplace)r†   rÝ   rØ   r   r   r   rÜ   u  s   z!SQLiteCursorWrapper.convert_queryr   )rÄ   rÅ   rÆ   Ú__doc__r�   rã   rÜ   Ú__classcell__r   r   rß   r   r˜   U  s
    r˜   )7rí   r0   r?   rz   Úcollections.abcr   Ú	itertoolsr   r   Úsqlite3r   rw   Údjango.core.exceptionsr   Ú	django.dbr   Údjango.db.backends.base.baser   Údjango.utils.asyncior	   Údjango.utils.dateparser
   r   r   Údjango.utils.regex_helperr   Ú
_functionsr   r�   Úclientr   rÃ   r   Úfeaturesr   r²   r   Ú
operationsr   Úschemar   r   r#   r&   r+   Úregister_converterÚ__eq__Úregister_adapterÚDecimalÚstrr.   r2   rê   ÚCursorr˜   r   r   r   r   Ú<module>   sJ      