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Z	conv_func /home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/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_lengthZ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DatabaseWrapperZsqliteZSQLite	AutoFieldintegerBigAutoFieldZBinaryFieldZBLOBZBooleanFieldr*   Z	CharFieldZ	DateFieldr,   ZDateTimeFieldr.   ZDecimalFielddecimalZDurationFieldZbigintZ	FileFieldr'   ZFilePathFieldZ
FloatFieldrealZIntegerFieldZBigIntegerFieldZIPAddressFieldzchar(15)ZGenericIPAddressFieldzchar(39)	JSONFieldtextzbigint unsignedzinteger unsignedzsmallint unsignedZsmallintr-   zchar(32))
ZOneToOneFieldPositiveBigIntegerFieldPositiveIntegerFieldPositiveSmallIntegerFieldZ	SlugFieldSmallAutoFieldZSmallIntegerFieldZ	TextFieldZ	TimeFieldZ	UUIDFieldz"%(column)s" >= 0z2(JSON_VALID("%(column)s") OR "%(column)s" IS NULL))r8   r6   r9   r:   ZAUTOINCREMENT)r1   r3   r;   z= %szLIKE %s ESCAPE '\'z	REGEXP %szREGEXP '(?i)' || %sz> %sz>= %sz< %sz<= %s)exactZiexactcontains	icontainsregexZiregexgtZgteltZ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>   rB   rD   rC   rE   )ZDEFERREDZ	EXCLUSIVEZ	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.)ZdatabaseZ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)rH   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   DatabaseZPARSE_DECLTYPESZPARSE_COLNAMESwarningswarnRuntimeWarningupdatepopuppertransaction_modesjoinsortedaliasrJ   splitinit_commands)selfrQ   kwargsrJ   Zallowed_transaction_modesrN   r   r   r   get_connection_params   sB   

z%DatabaseWrapper.get_connection_paramsc                 C   s   | j jS r   )rR   Z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   )rR   connectregister_functionsexecuter^   strip)r_   Zconn_paramsconnrN   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   )Zvalidate_thread_sharingis_in_memory_dbr   closerb   r   r   r   rr      s   zDatabaseWrapper.closec                 C   s   | j S r   )Zin_atomic_blockrb   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 )NrO   )Zwrap_database_errorsrl   Zisolation_level)r_   Z
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   )rm   rg   fetchoner*   )r_   rm   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 )Nrd   )rm   rg   )r_   rm   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)rg   ops
quote_namefetchall)rK   
table_namerm   r_   r   r   	<genexpr>  s    
z4DatabaseWrapper.check_constraints.<locals>.<genexpr>zPRAGMA foreign_key_list(%s)      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.)rm   rg   r|   r   from_iterablerz   r{   introspectionZget_primary_key_columnrv   r   )r_   Ztable_namesZ
violationsr}   ZrowidZreferenced_table_nameZforeign_key_indexZforeign_keyZcolumn_nameZreferenced_column_nameZprimary_key_column_nameZprimary_key_valueZ	bad_valuer   r~   r   check_constraints  s\   



	"z!DatabaseWrapper.check_constraintsc                 C   s   dS )NTr   rb   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.
        NZBEGINzBEGIN )rJ   rm   rg   rb   r   r   r   #_start_transaction_under_autocommitB  s   
z3DatabaseWrapper._start_transaction_under_autocommitc                 C   s   | j | jd S )NrF   )creationrq   rQ   rb   r   r   r   rq   N  s   zDatabaseWrapper.is_in_memory_dbr   ))__name__
__module____qualname__vendordisplay_namer)   
data_typesZdata_type_check_constraintsZdata_types_suffix	operatorsZpattern_escZpattern_ops	frozensetrY   rR   r   ZSchemaEditorClassr   Zclient_classr   Zcreation_classr   Zfeatures_classr   Zintrospection_classr   Z	ops_classra   rc   r	   rj   rp   rr   rs   ru   rx   ry   r   r   r   rq   r   r   r   r   r0   <   s    	
		.


	
8r0   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 )rn   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)superrg   
isinstancer   listconvert_query)r_   queryparamsr   	__class__r   r   rg   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   Z
param_listZ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   )rK   ro   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__rg   r   r   __classcell__r   r   r   r   rn   U  s
    rn   )7r   r.   r4   rS   collections.abcr   	itertoolsr   r   sqlite3r   rR   Zdjango.core.exceptionsr   Z	django.dbr   Zdjango.db.backends.base.baser   Zdjango.utils.asyncior	   Zdjango.utils.dateparser
   r   r   Zdjango.utils.regex_helperr   Z
_functionsr   rf   clientr   r   r   featuresr   r   r   
operationsr   Zschemar   r   r"   r%   r)   Zregister_converter__eq__Zregister_adapterDecimalstrr,   r0   r   ZCursorrn   r   r   r   r   <module>   sJ      