Ë
    }D™j¿J  ã                   óÐ  — d Z ddl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
mZ ddlmZ ddlmZ dd	lmZmZ dd
lmZmZmZmZmZ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#m$Z$ ddl%m&Z&m'Z'm(Z( ddl)m*Z* dZ+dZ, ee-«      Z. G d„ de&«      Z/ G d„ de'«      Z0dedee1ef   fd„Z2	 d+de(de3de3d e3de(f
d!„Z4d,de(de3de3defd"„Z5	 	 	 	 	 	 	 d-d#e6d$e7d%ee1   d&e3d'ee   d(e7d)e3fd*„Z8y).z¤SQLite cache backend. For usage details, see :ref:`Backends: SQLite <sqlite>`.

.. automodsumm:: requests_cache.backends.sqlite
   :classes-only:
   :nosignatures:
é    N)Úcontextmanager)Ú	getLogger)Úunlink)ÚgetsizeÚisfile)ÚPath)Ú
gettempdir)ÚsleepÚtime)Ú
CollectionÚIteratorÚListÚOptionalÚTupleÚType)Úuser_cache_diré   )ÚchunkifyÚget_valid_kwargs)ÚCachedResponse)ÚExpirationTime)ÚSerializerTypeÚpickle_serializeré   )Ú	BaseCacheÚBaseStorageÚ	StrOrPath)ÚVTzfile::memory:?cache=sharediç  c                   ó  ‡ — e Zd ZdZ	 	 ddedee   fˆ fd„Zedefd„«       Z	ˆ fd„Z
dd	d
œdededefˆ fd„Zd„ Zd„ Zddedefd„Z	 	 	 	 ddededededee   f
ˆ fd„Zˆ fd„Z	 	 	 	 ddededee   dedee   f
d„Zˆ xZS )ÚSQLiteCachea°  SQLite cache backend.

    Args:
        db_path: Database file path
        use_cache_dir: Store database in a user cache directory (e.g., `~/.cache/http_cache.sqlite`)
        use_temp: Store database in a temp directory (e.g., ``/tmp/http_cache.sqlite``)
        use_memory: Store database in memory instead of in a file
        busy_timeout: Timeout in milliseconds for SQLite to wait if a table is locked.
            See `pragma: busy_timeout <https://www.sqlite.org/pragma.html#pragma_busy_timeout>`_
            for details.
        fast_save: Significantly increases cache write performance, but with the possibility of data
            loss. See `pragma: synchronous <https://www.sqlite.org/pragma.html#pragma_synchronous>`_
            for details.
        wal: Use `Write Ahead Logging <https://sqlite.org/wal.html>`_, so readers do not block writers.
        kwargs: Additional keyword arguments for :py:func:`sqlite3.connect`
    Údb_pathÚ
serializerc                 óÆ   •— t        ‰| �  ddt        |«      i|¤Ž |rd|i|¥n|}t        |fddi|¤Ž| _        t        |fd| j                  j
                  d dœ|¤Ž| _        y )NÚ
cache_namer"   Ú
table_nameÚ	responsesÚ	redirects)r%   Úlockr"   © )ÚsuperÚ__init__ÚstrÚ
SQLiteDictr&   Ú_lockr'   )Úselfr!   r"   ÚkwargsÚskwargsÚ	__class__s        €új/var/www/html/Astrologybackend/backend/venv/lib/python3.12/site-packages/requests_cache/backends/sqlite.pyr+   zSQLiteCache.__init__4   sy   ø€ ô 	‰ÑÑ;¤C¨£LÐ;°FÒ;á:D�< Ð6¨vÑ6È&ˆÜ%/°Ñ%[ÀKÐ%[ÐSZÑ%[ˆŒÜ%/Øð&
à"Ø—‘×%Ñ%Øñ	&
ð
 ñ&
ˆ�ó    Úreturnc                 ó.   — | j                   j                  S ©N)r&   r!   ©r/   s    r3   r!   zSQLiteCache.db_pathF   s   € à�~‰~×%Ñ%Ð%r4   c                 óP  •— 	 t         ‰| �  «        y# t        $ rŠ t        j	                  d«       t        | j                  j                  «      rt        | j                  j                  «       | j                  j                  «        | j                  j                  «        Y yw xY w)z«Delete all items from the cache. If this fails due to a corrupted cache or other I/O
        error, this will  attempt to delete the cache file and re-initialize.
        zFailed to clear cacheN)r*   ÚclearÚ	ExceptionÚloggerÚ	exceptionr   r&   r!   r   Úinit_dbr'   ©r/   r2   s    €r3   r:   zSQLiteCache.clearJ   ss   ø€ ð	%Ü‰G‰M�OøÜò 	%Ü×ÑÐ4Ô5Ü�d—n‘n×,Ñ,Ô-Ü�t—~‘~×-Ñ-Ô.Ø�N‰N×"Ñ"Ô$Ø�N‰N×"Ñ"Ö$ð	%ús   ƒ ’BB%Â$B%FT)ÚexpiredÚvacuumÚkeysr@   rA   c                ó¼  •— t        |«      dk(  r	 | j                  |d   = n|r| j                  j                  |«       |r| j	                  «        |r/| j                  j
                  5  t        ‰| �  di |¤Žcddd«       S | j                  «        |r.|s|st        |«      dkD  r| j                  j                  «        yyy# t        $ r Y Œ�w xY w# 1 sw Y   ŒIxY w)al  Remove responses from the cache according one or more conditions.

        Args:
            keys: Remove responses with these cache keys
            expired: Remove all expired responses
            vacuum: Vacuum the database after deleting responses to free up disk space
            kwargs: Additional keyword arguments for :py:meth:`BaseCache.delete`
        r   r   Nr)   )
Úlenr&   ÚKeyErrorÚbulk_deleteÚ_delete_expiredr.   r*   ÚdeleteÚ_prune_redirectsrA   )r/   r@   rA   rB   r0   r2   s        €r3   rH   zSQLiteCache.deleteX   sÒ   ø€ ô  ˆt‹9˜Š>ðØ—N‘N 4¨¡7Ñ+ñ Ø�N‰N×&Ñ& tÔ,ÙØ× Ñ Ô"ñ Ø—‘×%Ñ%ñ 0Ü‘w‘~Ñ/¨Ñ/÷0ñ 0ð ×!Ñ!Ô#ñ ‘w¡&¬C°«I¸ªMØ�N‰N×!Ñ!Õ#ð -:ˆ6øô! ò Ùðú÷0ð 0ús   ‘C Á)CÃ	CÃCÃCc           	      ó4  — | j                   j                  5  | j                   j                  d¬«      5 }|j                  d| j                   j                  › d�t        t        «       «      f«       ddd«       ddd«       y# 1 sw Y   ŒxY w# 1 sw Y   yxY w)zDA more efficient implementation of deleting expired responses in SQLT©ÚcommitúDELETE FROM z WHERE expires <= ?N)r&   r.   Ú
connectionÚexecuter%   Úroundr   ©r/   Úcons     r3   rG   zSQLiteCache._delete_expired~   s   € à�^‰^×!Ñ!ñ 	 4§>¡>×#<Ñ#<ÀDÐ#<Ó#Ið 	ÈSØ�K‰KØ˜tŸ~™~×8Ñ8Ð9Ð9LÐMÜ”t“v“Ð ô÷	÷ 	÷ 	ñ 	ú÷ 	ð 	ús"   —B´=BÁ1BÂB	ÂBÂBc                 ó  — | j                   j                  d¬«      5 }| j                   j                  }| j                  j                  }|j	                  d|› d|› d|› d|› d|› d|› d	|› d
�«       ddd«       y# 1 sw Y   yxY w)zDA more efficient implementation of removing invalid redirects in SQLTrK   rM   z WHERE key IN (    SELECT z
.key FROM z    LEFT JOIN z ON z.key = z.value    WHERE z.key IS NULL)N)r'   rN   r%   r&   rO   )r/   ÚconnÚt1Út2s       r3   rI   zSQLiteCache._prune_redirects†   s–   € à�^‰^×&Ñ&¨dÐ&Ó3ð 		°tØ—‘×*Ñ*ˆBØ—‘×*Ñ*ˆBØ�L‰LØ˜r˜dð #Ø ˜T ¨B¨4Ø    D¨¨¨G°B°4ð 8Ø˜Dð !ðô÷		÷ 		ñ 		ús   �AA:Á:Bc                 ó:   — | j                   j                  |¬«      S )z—Count number of responses, optionally excluding expired

        Args:
            expired: Set to ``False`` to count only unexpired responses
        ©r@   )r&   Úcount)r/   r@   s     r3   rY   zSQLiteCache.count“   s   € ð �~‰~×#Ñ#¨GÐ#Ó4Ð4r4   ÚvalidÚinvalidÚ
older_thanc                 ój   •— |r|s| j                   j                  |¬«      S t        ‰| �  ||||¬«      S )NrX   )rZ   r@   r[   r\   )r&   Úsortedr*   Úfilter)r/   rZ   r@   r[   r\   r2   s        €r3   r_   zSQLiteCache.filterœ   sA   ø€ ñ ™Ø—>‘>×(Ñ(°Ð(Ó9Ð9ä‘7‘>Ø W°gÈ*ð "ó ð r4   c                 ó€   •— | j                   j                  «       5  t        ‰| �  «        d d d «       y # 1 sw Y   y xY wr7   )r&   Úbulk_commitr*   Úrecreate_keysr?   s    €r3   rb   zSQLiteCache.recreate_keys«   s3   ø€ Ø�^‰^×'Ñ'Ó)ñ 	$Ü‰GÑ!Ô#÷	$÷ 	$ñ 	$ús   œ4´=ÚkeyÚreversedÚlimitc                 ó>   — | j                   j                  ||||«      S )aB  Get cached responses, with sorting and other query options.

        Args:
            key: Key to sort by; either 'expires', 'size', or 'key'
            reversed: Sort in descending order
            limit: Maximum number of responses to return
            expired: Set to ``False`` to exclude expired responses
        )r&   r^   )r/   rc   rd   re   r@   s        r3   r^   zSQLiteCache.sorted¯   s   € ð �~‰~×$Ñ$ S¨(°E¸7ÓCÐCr4   )Ú
http_cacheN©T)TTFN©ÚexpiresFNT)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r+   Úpropertyr!   r:   r,   ÚboolrH   rG   rI   ÚintrY   r   r   r   r_   rb   r^   Ú__classcell__©r2   s   @r3   r    r    "   s2  ø„ ñð& *Ø/3ñ
àð
ð ˜^Ñ,õ
ð$ ð&˜ò &ó ð&ô%ð" Øò	$$àð$$ð ð$$ð õ	$$òLòñ5˜Tð 5¨Só 5ð ØØØ%)ñàðð ðð ð	ð
 #ðð 
�.Ñ	!õô$ð ØØ#ØñDàðDð ðDð ˜‰}ð	Dð
 ðDð 
�.Ñ	!÷Dr4   r    c                   ón  ‡ — e Zd ZdZdddeddddfdededee   de	d	ee
   d
e	de	de	de	fˆ fd„Zd„ Zed)deej                      fd„«       Zd„ Zed„ «       Zed„ «       Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd*d„Zd„ Zd+de	defd„Zd efˆ fd!„Z defd"„Z!defd#„Z"	 	 	 	 d,d$ed%e	d&ee   de	dee#   f
d'„Z$d(„ Z%ˆ xZ&S )-r-   z&A dictionary-like interface for SQLiterg   NFr!   r%   Úbusy_timeoutÚ	fast_saver"   Úuse_cache_dirÚ
use_memoryÚuse_tempÚwalc
                 óæ  •— t        ‰| �  d	d|i|
¤Ž d| _        d | _        |
j	                  dt        j                  «       «      | _        |
j	                  dd «      rt        j                  d«       t        t        |
«      | _        | j                  j                  dd«       |rd| j                  d<   t        ||||«      | _        || _        || _        || _        |	| _        | j)                  «        y )
Nr"   Fr(   Úisolation_levelzJSQLite backend requires exclusive transactions; isolation_level is ignoredÚcheck_same_threadTÚurir)   )r*   r+   Ú_active_transactionÚ_connectionÚpopÚ	threadingÚRLockr.   r<   Úwarningr   Úsqlite_templateÚconnection_kwargsÚ
setdefaultÚ_get_sqlite_cache_pathr!   ru   rv   r%   rz   r>   )r/   r!   r%   ru   rv   r"   rw   rx   ry   rz   r0   r2   s              €r3   r+   zSQLiteDict.__init__Ä   sÕ   ø€ ô 	‰ÑÑ9 JÐ9°&Ò9Ø#(ˆÔ Ø9=ˆÔØ—Z‘Z ¬	¯©Ó(9Ó:ˆŒ
Ø�:‰:Ð'¨Ô.Ü�N‰NØ\ôô "2´/À6Ó!JˆÔØ×Ñ×)Ñ)Ð*=¸uÔEÙØ,0ˆD×"Ñ" 5Ñ)Ü-¨g°}ÀhÐPZÓ[ˆŒØ(ˆÔØ"ˆŒØ$ˆŒØˆŒØ�‰�r4   c                 ó`  — | j                  «        | j                  d¬«      5 }	 |j                  d| j                  › d�«       |j                  d| j                  › d�«       |j                  d| j                  › d�«       d	d	d	«       y	# t        j
                  $ r Y Œ\w xY w# 1 sw Y   y	xY w)
z2Initialize the database, if it hasn't already beenTrK   zALTER TABLE z ADD COLUMN expires INTEGERzCREATE TABLE IF NOT EXISTS z? (    key TEXT PRIMARY KEY,    value BLOB,     expires INTEGER)z*CREATE INDEX IF NOT EXISTS expires_idx ON z	(expires)N)ÚcloserN   rO   r%   Úsqlite3ÚOperationalErrorrQ   s     r3   r>   zSQLiteDict.init_dbä   s¶   € à�
‰
ŒØ�_‰_ Dˆ_Ó)ð 	a¨SðØ—‘˜l¨4¯?©?Ð*;Ð;VÐWÔXð �K‰KØ-¨d¯o©oÐ->ð ?ð ôð �K‰KÐDÀTÇ_Á_ÐDUÐU^Ð_Ô`÷	að 	aøô ×+Ñ+ò Ùðú÷		að 	aús.   £B$¥BÁ>B$ÂB!ÂB$Â B!Â!B$Â$B-r5   c              #   ó2  K  — | j                   5  | j                  �st        j                  d| j                  › d| j
                  › �«       t        j                  | j                  fddi| j                  ¤Ž| _        | j                  �(| j                  j                  d| j                  › �«       | j                  r| j                  j                  d«       | j                  r| j                  j                  d«       | j                  r'| j                  s| j                  j                  d«       ddd«       |r4| j                  s(| j                  «       5  | j                  –— ddd«       y| j                  –— y# 1 sw Y   ŒNxY w# 1 sw Y   yxY w­w)	z&Get a thread-local database connectionzOpening connection to ú:r|   NzPRAGMA busy_timeout=zPRAGMA synchronous=OFFzPRAGMA journal_mode=WALzPRAGMA synchronous=NORMAL)r.   r€   r<   Údebugr!   r%   r‹   Úconnectr†   ru   rO   rv   rz   r   Ú_acquire_sqlite_lock)r/   rL   s     r3   rN   zSQLiteDict.connection÷   sY  è ø€ ð �Z‰Zñ 	JØ×#Ó#Ü—‘Ð5°d·l±l°^À1ÀTÇ_Á_ÐDUÐVÔWÜ#*§?¡?Ø—L‘Lñ$Ø26ð$Ø:>×:PÑ:Pñ$�Ô ð ×$Ñ$Ð0Ø×$Ñ$×,Ñ,Ð/CÀD×DUÑDUÐCVÐ-WÔXØ—>’>Ø×$Ñ$×,Ñ,Ð-EÔFØ—8’8Ø×$Ñ$×,Ñ,Ð-FÔGà—8’8 D§N¢NØ×$Ñ$×,Ñ,Ð-HÔI÷	Jñ$ ˜$×2Ò2Ø×*Ñ*Ó,ñ 'Ø×&Ñ&Ò&÷'ð 'ð ×"Ñ"Ó"÷/	Jð 	Jú÷&'ð 'üs5   ‚F�D#E?Ä2&FÅFÅ'FÅ?FÆFÆFÆFc                 ó    — | j                   5  | j                  r!| j                  j                  «        d| _        ddd«       y# 1 sw Y   yxY w)zClose any active connectionsN)r.   r€   rŠ   r8   s    r3   rŠ   zSQLiteDict.close  sA   € à�Z‰Zñ 	(Ø×ÒØ× Ñ ×&Ñ&Ô(Ø#'�Ô ÷	(÷ 	(ñ 	(ús   �.AÁAc              #   ó^   K  — | j                  «       5  d–— ddd«       y# 1 sw Y   yxY w­w)zøInsert a large number of records within a single transaction

        Example:

            >>> d1 = SQLiteDict('test')
            >>> with d1.bulk_commit():
            ...     for i in range(1000):
            ...         d1[i] = i * 2

        N)r‘   r8   s    r3   ra   zSQLiteDict.bulk_commit  s+   è ø€ ð ×&Ñ&Ó(ñ 	Û÷	÷ 	ñ 	üs   ‚-“!˜	-¡*¦-c              #   ó¬  K  — | j                   5  	 	 | j                  j                  d«       d| _        	 	 d –— | j                  j                  «        d| _        	 d d d «       y # t        j
                  $ r t        d«       Y Œuw xY w# t        j
                  $ r | j                  j                  «        Y Œdw xY w# d| _        w xY w# 1 sw Y   y xY w­w)NTzBEGIN IMMEDIATEg-Cëâ6?F)	r.   r€   rO   r   r‹   rŒ   r
   rL   Úrollbackr8   s    r3   r‘   zSQLiteDict._acquire_sqlite_lock)  sÈ   è ø€ à�Z‰Zñ 	1àðØ×$Ñ$×,Ñ,Ð->Ô?Ø/3�DÔ,Øð1ÛØ× Ñ ×'Ñ'Ô)ð ,1�Õ(÷%	1ð 	1øô ×/Ñ/ò ô ˜$”KÙð	ûô ×+Ñ+ò ,Ø× Ñ ×)Ñ)Ö+ð,ûð ,1�Õ(ú÷%	1ð 	1üsm   ‚C�C’"A%´C¶B	ÁCÁ	CÁ%BÂCÂBÂCÂ	-B9Â6B<Â8B9Â9B<Â<	CÃCÃCÃCc                 ó$   — | j                  «        y r7   )rŠ   r8   s    r3   Ú__del__zSQLiteDict.__del__?  s   € Ø�
‰
�r4   c                 ó¸   — | j                  d¬«      5 }|j                  d| j                  › d�|f«      }d d d «       j                  st        ‚y # 1 sw Y   ŒxY w)NTrK   rM   z WHERE key=?)rN   rO   r%   ÚrowcountrE   )r/   rc   rR   Úcurs       r3   Ú__delitem__zSQLiteDict.__delitem__B  s\   € Ø�_‰_ Dˆ_Ó)ð 	T¨SØ—+‘+ ¨T¯_©_Ð,=¸\ÐJÈSÈFÓSˆC÷	Tà�|Š|ÜˆNð ÷	Tð 	Tús   “"AÁAc                 ó  — | j                  «       5 }|j                  d| j                  › d|› d�«      }|j                  «       }|j	                  «        |st        |«      ‚| j                  ||d   «      cd d d «       S # 1 sw Y   y xY w)NzSELECT value FROM z WHERE key='ú'r   )rN   rO   r%   ÚfetchonerŠ   rE   Údeserialize)r/   rc   rR   rš   Úrows        r3   Ú__getitem__zSQLiteDict.__getitem__H  s   € Ø�_‰_Óð 		1 #ð —+‘+Ð 2°4·?±?Ð2CÀ<ÐPSÈuÐTUÐVÓWˆCØ—,‘,“.ˆCØ�I‰IŒKÙÜ˜s“mÐ#à×#Ñ# C¨¨Q©Ó0÷		1÷ 		1ò 		1ús   ‘A$A?Á?Bc                 ó(   — | j                  ||«       y r7   )Ú_write)r/   rc   Úvalues      r3   Ú__setitem__zSQLiteDict.__setitem__T  s   € Ø�‰�C˜Õr4   c                 óÔ   — t        |dd «      }| j                  |«      }| j                  d¬«      5 }|j                  d| j                  › d�|||f«       d d d «       y # 1 sw Y   y xY w)NÚexpires_unixTrK   zINSERT OR REPLACE INTO z# (key,value,expires) VALUES (?,?,?))ÚgetattrÚ	serializerN   rO   r%   )r/   rc   r¤   rj   rR   s        r3   r£   zSQLiteDict._writeW  sk   € ä˜% °Ó6ˆØ—‘˜uÓ%ˆØ�_‰_ Dˆ_Ó)ð 	¨SØ�K‰KØ)¨$¯/©/Ð):Ð:]Ð^Ø�e˜WÐ%ô÷	÷ 	ñ 	ús   ±$AÁA'c              #   ó¬   K  — | j                  «       5 }|j                  d| j                  › �«      D ]	  }|d   –— Œ 	 d d d «       y # 1 sw Y   y xY w­w)NzSELECT key FROM r   )rN   rO   r%   )r/   rR   r    s      r3   Ú__iter__zSQLiteDict.__iter__a  sT   è ø€ Ø�_‰_Óð 	 #Ø—{‘{Ð%5°d·o±oÐ5FÐ#GÓHò �Ø˜!‘f“ñ÷	÷ 	ñ 	üs   ‚A“+A¿	AÁAÁAc                 ó"   — | j                  «       S r7   )rY   r8   s    r3   Ú__len__zSQLiteDict.__len__f  s   € Ø�z‰z‹|Ðr4   c           
      óL  — |s|sy|rdnd}| j                   5  | j                  d¬«      5 }t        |xs |t        ¬«      D ]8  }t	        |«      \  }}d| j
                  › d|› d	|› d
�}|j                  ||«       Œ: 	 ddd«       ddd«       y# 1 sw Y   ŒxY w# 1 sw Y   yxY w)z‘Delete multiple items from the cache, without raising errors for any missing items.
        Supports deleting by either key or by value.
        Nrc   r¤   TrK   )Úmax_sizerM   z WHERE z IN (ú))r.   rN   r   ÚSQLITE_MAX_VARIABLE_NUMBERÚ_format_sequencer%   rO   )	r/   rB   ÚvaluesÚcolumnrR   ÚchunkÚmarksÚargsÚ	statements	            r3   rF   zSQLiteDict.bulk_deletei  s­   € ñ ™FØá‘ GˆØ�Z‰Zñ 	-˜Ÿ™°˜Ó5ð 	-¸ä! $¢.¨&Ô;UÔVò -�Ü.¨uÓ5‘��tØ*¨4¯?©?Ð*;¸7À6À(È%ÐPUÈwÐVWÐX�	Ø—‘˜I tÕ,ñ-÷	-÷ 	-÷ 	-ñ 	-ú÷ 	-ð 	-ús#   ˜B«ABÁ=BÂB	ÂBÂB#c                 ó  — | j                   5  | j                  d¬«      5 }|j                  d| j                  › �«       d d d «       | j	                  «        | j                  «        d d d «       y # 1 sw Y   Œ2xY w# 1 sw Y   y xY w)NTrK   zDROP TABLE IF EXISTS )r.   rN   rO   r%   r>   rA   rQ   s     r3   r:   zSQLiteDict.clearx  sw   € Ø�Z‰Zñ 	Ø—‘¨�Ó-ð G°Ø—‘Ð3°D·O±OÐ3DÐEÔF÷Gà�L‰LŒNØ�K‰KŒM÷		ð 	÷Gð Gú÷	ð 	ús!   �A< A0¿(A<Á0A9	Á5A<Á<Br@   c                 óÞ   — d}d}|sd}t        «       f}d| j                  › d|› �}| j                  «       5 }|j                  ||«      j	                  «       d   cddd«       S # 1 sw Y   yxY w)z7Count number of responses, optionally excluding expiredÚ r)   ú$WHERE expires is null or expires > ?zSELECT COUNT(key) FROM ú r   N)r   r%   rN   rO   rž   )r/   r@   Úfilter_exprÚparamsÚqueryrR   s         r3   rY   zSQLiteDict.count  sq   € àˆØˆÙØ@ˆKÜ“f�YˆFØ)¨$¯/©/Ð):¸!¸K¸=ÐIˆà�_‰_Óð 	< #Ø—;‘;˜u fÓ-×6Ñ6Ó8¸Ñ;÷	<÷ 	<ò 	<ús   ¶#A#Á#A,r¤   c                 óp   •— t         ‰| �  |«      }t        |t        «      rt	        j
                  |«      S |S r7   )r*   r©   Ú
isinstanceÚbytesr‹   ÚBinary)r/   r¤   r2   s     €r3   r©   zSQLiteDict.serialize‹  s/   ø€ Ü‘Ñ! %Ó(ˆÜ(2°5¼%Ô(@Œw�~‰~˜eÓ$ÐKÀeÐKr4   c                 ól   — 	 t        | j                  «      S # t        $ r | j                  «       cY S w xY w)zƒReturn the size of the database, in bytes. For an in-memory database, this will be an
        estimate based on page size.
        )r   r!   ÚIOErrorÚ_estimate_sizer8   s    r3   ÚsizezSQLiteDict.size�  s4   € ð	)Ü˜4Ÿ<™<Ó(Ð(øÜò 	)Ø×&Ñ&Ó(Ò(ð	)ús   ‚ —3²3c                 óà   — | j                  «       5 }|j                  d«      j                  «       d   }|j                  d«      j                  «       d   }||z  cddd«       S # 1 sw Y   yxY w)zDEstimate the current size of the database based on page count * sizezPRAGMA page_countr   zPRAGMA page_sizeN)rN   rO   rž   )r/   rT   Ú
page_countÚ	page_sizes       r3   rÇ   zSQLiteDict._estimate_size˜  se   € à�_‰_Óð 	* $ØŸ™Ð&9Ó:×CÑCÓEÀaÑHˆJØŸ™Ð%7Ó8×AÑAÓCÀAÑFˆIØ 	Ñ)÷	*÷ 	*ò 	*ús   ‘A	A$Á$A-rc   rd   re   c              #   ól  K  — |dvrt        d|› �«      ‚|dk(  rd}|rdnd}|rd|› �nd}d}d	}|sd
}t        «       f}| j                  «       5 }	|	j                  d| j                  › d|› d|› d|› d|› �
|«      D ]!  }
| j                  |
d   |
d   «      }|sŒ|–— Œ# 	 ddd«       y# 1 sw Y   yxY w­w)zVGet cache values in sorted order; see :py:meth:`.SQLiteCache.sorted` for usage details)rj   rÈ   rc   zInvalid sort key: rÈ   zLENGTH(value)ÚDESCÚASCzLIMIT r»   r)   r¼   zSELECT key, value FROM r½   z  ORDER BY r   r   N)Ú
ValueErrorr   rN   rO   r%   rŸ   )r/   rc   rd   re   r@   Ú	directionÚ
limit_exprr¾   r¿   rR   r    Úresults               r3   r^   zSQLiteDict.sortedŸ  sï   è ø€ ð Ð0Ñ0ÜÐ1°#°Ð7Ó8Ð8Ø�&Š=Ø!ˆCÙ&‘F¨Eˆ	Ù).�v˜e˜WÑ%°Bˆ
ð ˆØˆÙØ@ˆKÜ“f�YˆFà�_‰_Óð 		! #Ø—{‘{Ø)¨$¯/©/Ð):¸!¸K¸=Ø˜c˜U ! I ;¨a°
¨|ð=àóò !�ð
 ×)Ñ)¨#¨a©&°#°a±&Ó9�âØ “Lñ!÷		!÷ 		!ñ 		!üs%   ‚AB4ÁA	B(ÂB(Â	B4Â(B1Â-B4c                 óî   — | j                   5  | j                  rH| j                  r!| j                  j                  «        d| _        | j                  j	                  d«       d d d «       y # 1 sw Y   y xY w)NFÚVACUUM)r.   r€   r   rL   rO   r8   s    r3   rA   zSQLiteDict.vacuumÁ  s^   € à�Z‰Zñ 	3Ø×ÒØ×+Ò+Ø×$Ñ$×+Ñ+Ô-Ø/4�DÔ,Ø× Ñ ×(Ñ(¨Ô2÷	3÷ 	3ñ 	3ús   �AA+Á+A4©F)NNrh   ri   )'rk   rl   rm   rn   r   r   r,   r   rq   rp   r   r+   r>   r   r   r‹   Ú
ConnectionrN   rŠ   ra   r‘   r—   r›   r¡   r¥   r£   r«   r­   rF   r:   rY   r   r©   rÈ   rÇ   r   r^   rA   rr   rs   s   @r3   r-   r-   Á   s˜  ø„ Ù0ð
 'Ø&*ØØ/@Ø#Ø ØØñàðð ðð ˜s‘mð	ð
 ðð ˜^Ñ,ðð ðð ðð ðð õò@að& ñ#¨(°7×3EÑ3EÑ*Fò #ó ð#ò6(ð ñó ðð ñ1ó ð1ò*òò
1ò òòò
ó-òñ
<˜Tð 
<¨Só 
<ðL˜rõ Lð)�có )ð* ó *ð ØØ#Øñ !àð !ð ð !ð ˜‰}ð	 !ð
 ð !ð 
�.Ñ	!ó !öD3r4   r-   r³   r5   c                 óT   — dj                  dgt        | «      z  «      t        | «      fS )z2Get SQL parameter marks for a sequence-based queryú,ú?)ÚjoinrD   Úlist)r³   s    r3   r²   r²   Ë  s%   € à�8‰8�S�EœC ›KÑ'Ó(¬$¨v«,Ð6Ð6r4   r!   rw   ry   rx   c                 óŠ   — t        | «      } |rt        S d| v sd| v r| S t        | «      j                  s| dz  } t	        | ||«      S )z>Get a resolved path for a SQLite database file (or memory URI)z:memory:zmode=memoryz.sqlite)r,   Ú
MEMORY_URIr   ÚsuffixÚget_cache_path)r!   rw   ry   rx   s       r3   rˆ   rˆ   Ð  sR   € ô
 �'‹l€GÙÜÐØ	�wÑ	 -°7Ñ":Øˆô �‹=×ÒØ�9ÑˆÜ˜' =°(Ó;Ð;r4   c                 ó„  — t        | «      } |r'| j                  «       st        t        «       «      | z  } n(|r&| j                  «       st        t        «       «      | z  } | j	                  «       j                  «       } 	 | j                  j                  dd¬«       | S # t        $ r t        d| j                  › d�«      d‚w xY w)zGet a resolved cache pathT)ÚparentsÚexist_okz+Parent path exists and is not a directory: z:.Please either delete the file or choose a different path.N)	r   Úis_absoluter   r	   Ú
expanduserÚabsoluteÚparentÚmkdirÚFileExistsError)r!   rw   ry   s      r3   rß   rß   á  sÄ   € ä�7‹m€Gñ ˜W×0Ñ0Ô2Ü”~Ó'Ó(¨7Ñ2‰Ù	˜'×-Ñ-Ô/Ü”z“|Ó$ wÑ.ˆð × Ñ Ó"×+Ñ+Ó-€GðØ�‰×Ñ T°DÐÔ9ð €Nøô ò ÜØ9¸'¿.¹.Ð9Ið JHð Hó
ð ð	ðús   Á<B Â$B?ÚtimeoutÚdetect_typesr|   r}   ÚfactoryÚcached_statementsr~   c                  ó   — y)zYTemplate function to get an accurate signature for the builtin :py:func:`sqlite3.connect`Nr)   )ré   rê   r|   r}   rë   rì   r~   s          r3   r…   r…   ÷  s   � r4   rÕ   )FF)g      @r   NTNéd   F)9rn   r‹   r‚   Ú
contextlibr   Úloggingr   Úosr   Úos.pathr   r   Úpathlibr   Útempfiler	   r   r
   Útypingr   r   r   r   r   r   Úplatformdirsr   Ú_utilsr   r   Úmodels.responser   Úpolicyr   Úserializersr   r   r»   r   r   r   Úbaser   rÝ   r±   rk   r<   r    r-   r,   r²   rp   rˆ   rß   Úfloatrq   r…   r)   r4   r3   ú<module>rý      sZ  ðñó Û Ý %Ý Ý ß #Ý Ý ß ß D× Då 'ç /Ý ,Ý #ß ;ß /Ñ /Ý à)€
Ø Ð á	�8Ó	€ô\D�)ô \Dô~G3�ô G3ðT7˜Zð 7¨E°#°t°)Ñ,<ó 7ð QVñ<Øð<Ø'+ð<Ø7;ð<ØIMð<àó<ñ"˜Ið °dð Èdð Ð_có ð. ØØ%)Ø"Ø"Ø Øñ	dØð	dàð	dð ˜c‘]ð	dð ð		dð
 �d‰^ð	dð ð	dð 
ô	dr4   