Ë
    oPêj%-  ã                  ó°   — d Z ddlm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	m
Z
 ddlmZmZmZ ddlmZmZmZ ddlmZ ddlmZ dd	„Zdd
„Z G d„ d«      Zy)z"SQLite abstraction for coverage.pyé    )ÚannotationsN)ÚIterableÚIterator)ÚAnyÚNeverÚcast)Ú	auto_reprÚclipped_reprÚexc_one_line)Ú	DataError)Ú	TDebugCtlc                óˆ   — t        j                  t        j                  j	                  | «      «      j                  «       dz   S )aƒ  Make a URI to open `filename` read-only.

    Opening a database read-write lets SQLite act on files beside it: a hot
    `*-journal` file gets rolled back, and the "super-journal" it names gets
    deleted. Data files we only read (combine inputs, for example) can come
    from anywhere, so open them with `immutable=1`, which makes SQLite ignore
    journals and locks entirely.

    z?mode=ro&immutable=1)ÚpathlibÚPathÚosÚpathÚabspathÚas_uri)Úfilenames    úV/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/coverage/sqlitedb.pyÚread_only_urir      s/   € ô �<‰<œŸ™Ÿ™¨Ó1Ó2×9Ñ9Ó;Ð>TÑTÐTó    c                ó"  — t         j                  j                  | «      syt        j                  t         j                  j                  | «      «      j                  «       dz   }	 t        j                  t        j                  |d¬«      «      5 }|j                  d«      j                  «        ddd«       y# 1 sw Y   yxY w# t        j                  $ r7}|j                  t        j                  k(  rt!        d| ›d�«      |‚Y d}~yd}~ww xY w)a  Raise DataError if SQLite would roll back a journal beside `filename`.

    When a database is opened read-write, SQLite rolls back a hot journal
    beside it, then deletes the "super-journal" the journal names, which could
    be any file at all.  Coverage.py turn journaling off, so a journal like
    that is almost certainly not ours.  A read-only connection won't roll back,
    but reports the hot journal instead, so probe with one of those first.
    This lets SQLite decide where the journal is and whether it is hot.

    Nz?mode=roT)Úuriz"select count(*) from sqlite_masterúCouldn't use data file z$: it has a journal file to roll back)r   r   Úexistsr   r   r   r   Ú
contextlibÚclosingÚsqlite3ÚconnectÚexecuteÚfetchallÚErrorÚsqlite_errorcodeÚSQLITE_READONLY_ROLLBACKr   )r   r   ÚconÚexcs       r   Úcheck_hot_journalr(   $   sÙ   € ô �7‰7�>‰>˜(Ô#ØÜ
�,‰,”r—w‘w—‘ xÓ0Ó
1×
8Ñ
8Ó
:¸ZÑ
G€CðÜ×Ñ¤§¡°¸Ô >Ó?ð 	IÀ3Ø�K‰KÐ<Ó=×FÑFÔH÷	I÷ 	Iñ 	Iûä�=‰=ò Ø×Ñ¤7×#CÑ#CÒCÜØ)¨(¨Ð5YÐZóàðô Dûðús6   Á%*C Â B8Â/C Â8CÂ=C ÃC ÃDÃ-D	Ä	Dc                  óÚ   — e Zd ZdZdddœ	 	 	 	 	 	 	 	 	 dd„ZeZdd„Zdd„Zddd„Z	dd„Z
dd	„Zdd
„Zej                  	 d	 	 	 	 	 dd„«       Zddd„Zddd„Zdd d„Zd!d„Zd"d„Zd#d„Zd$d„Zy)%ÚSqliteDbaU  A simple abstraction over a SQLite database.

    Use as a context manager, then you can use it like a
    :class:`python:sqlite3.Connection` object::

        with SqliteDb(filename, debug_control) as db:
            with db.execute("select a, b from some_table") as cur:
                for a, b in cur:
                    etc(a, b)

    F)Úno_diskÚ	read_onlyc               óX   — || _         || _        || _        || _        d| _        d | _        y )Nr   )Údebugr   r+   r,   Únestr&   )Úselfr   r.   r+   r,   s        r   Ú__init__zSqliteDb.__init__J   s.   € ð ˆŒ
Ø ˆŒØˆŒØ"ˆŒØˆŒ	Ø.2ˆ�r   c                óh   — |d|› �z  }t        |d«      r|d|j                  › d�z  }t        |«      |‚)z7Raise a DataError with as much information as possible.ú: Úsqlite_errornamez: (ú))Úhasattrr4   r   )r0   Úmsgr'   s      r   Ú_raise_data_errorzSqliteDb._raise_data_error[   sC   € à��C�5ˆzÑˆÜ�3Ð*Ô+Ø�S˜×-Ñ-Ð.¨aÐ0Ñ0ˆCÜ˜‹n #Ð%r   c                óx  — | j                   �y| j                  j                  d«      r(| j                  j                  d| j                  ›�«       | j                  }|j                  d«      s#| j                  rt        |«      }nt        |«       	 t        j                  |dd¬«      | _         | j                  j                  d«      r5| j                  j                  d	| j                  ›d
| j                   ›�«       | j                   j                  ddd„ «       t        t        d«      r*| j                   j                  t        j                   d«       | j#                  d«       | j#                  dd¬«       y# t        j                  $ r*}| j                  d| j                  ›�|«       Y d}~�Œd}~ww xY w)z2Connect to the db and do universal initialization.NÚsqlzConnecting to zfile:FT)Úcheck_same_threadr   r   zConnected to z as ÚREGEXPé   c                ó2   — t        j                  | |«      d uS )N)ÚreÚsearch)ÚtxtÚpats     r   ú<lambda>z#SqliteDb._connect.<locals>.<lambda>~   s   € ¼r¿y¹yÈÈcÓ?RÐZ^Ð?^€ r   ÚSQLITE_DBCONFIG_DEFENSIVEzpragma journal_mode=offzpragma synchronous=off)Úfail_ok)r&   r.   ÚshouldÚwriter   Ú
startswithr,   r   r(   r   r    r#   r8   Úcreate_functionr6   Ú	setconfigrD   Úexecute_void)r0   r   r'   s      r   Ú_connectzSqliteDb._connectb   sk  € à�8‰8ÐØð �:‰:×Ñ˜UÔ#Ø�J‰J×Ñ˜~¨d¯m©mÐ->Ð?Ô@Ø—=‘=ˆØ×"Ñ" 7Ô+Ø�~Š~Ü(¨Ó2‘ä! (Ô+ð	Uô —‘ xÀ5ÈdÔSˆDŒHð �:‰:×Ñ˜UÔ#Ø�J‰J×Ñ˜}¨T¯]©]Ð,=¸TÀ$Ç(Á(ÀÐNÔOà�‰× Ñ  ¨1Ñ.^Ô_ô
 ”7Ð7Ô8à�H‰H×ÑÜ×1Ñ1Øôð 	×ÑÐ3Ô4ð
 	×ÑÐ2¸DÐÕAøô1 �}‰}ò 	UØ×"Ñ"Ð%<¸T¿]¹]Ð<MÐ#NÐPS×TÒTûð	Uús   ÂE< Å<F9ÆF4Æ4F9c                ó  — | j                   ��|s| j                  sr| j                  j                  d«      r5| j                  j	                  d| j                   ›d| j
                  ›�«       | j                   j                  «        d| _         yyy)z If needed, close the connection.Nr:   zClosing z on )r&   r+   r.   rF   rG   r   Úclose)r0   Úforces     r   rN   zSqliteDb.close’   sn   € à�8‰8ÐÙ˜DŸLšLØ—:‘:×$Ñ$ UÔ+Ø—J‘J×$Ñ$ x°·±¨|¸4ÀÇÁÐ?PÐ%QÔRØ—‘—‘Ô Ø�•ð	 )ð  r   c                ó¾   — | j                   dk(  r8| j                  «        | j                  €J ‚| j                  j                  «        | xj                   dz  c_         | S )Nr   é   )r/   rL   r&   Ú	__enter__©r0   s    r   rR   zSqliteDb.__enter__›   sH   € Ø�9‰9˜Š>Ø�M‰MŒOØ—8‘8Ð'Ð'Ð'Ø�H‰H×ÑÔ Ø�	Š	�Q‰�	Øˆr   c                ó´  — | xj                   dz  c_         | j                   dk(  r=	 | j                  €J ‚| j                  j                  |||«       | j                  «        y y # t        $ rk}| j
                  j                  d«      r'| j
                  j                  dt        |«      › �«       | j                  d| j                  ›�|«       Y d }~y d }~ww xY w)NrQ   r   r:   zEXCEPTION from __exit__: zCouldn't end data file )r/   r&   Ú__exit__rN   Ú	Exceptionr.   rF   rG   r   r8   r   )r0   Úexc_typeÚ	exc_valueÚ	tracebackr'   s        r   rU   zSqliteDb.__exit__£   s»   € Ø�	Š	�Q‰�	Ø�9‰9˜Š>ðYØ—x‘xÐ+Ð+Ð+Ø—‘×!Ñ! (¨I°yÔAØ—
‘
•ð	 øô
 ò YØ—:‘:×$Ñ$ UÔ+Ø—J‘J×$Ñ$Ð'@ÄÈcÓARÐ@SÐ%TÔUØ×&Ñ&Ð)@ÀÇÁÐ@QÐ'RÐTW×XÑXûðYús   ¦;A# Á#	CÁ,A!CÃCc                ó:  — | j                   j                  d«      r)|rd|›�nd}| j                   j                  d|›|› �«       	 | j                  €J ‚	 | j                  j	                  ||«      S # t
        $ r | j                  j	                  ||«      cY S w xY w# t        j                  $ rk}| j                   j                  d«      r'| j                   j                  dt        |«      › �«       | j                  d| j                  ›�|«       Y d}~yd}~ww xY w)z2Same as :meth:`python:sqlite3.Connection.execute`.r:   ú with Ú z
Executing NzEXCEPTION from execute: r   )r.   rF   rG   r&   r!   rV   r   r#   r   r8   r   )r0   r:   Ú
parametersÚtailr'   s        r   Ú_executezSqliteDb._execute¯   s  € à�:‰:×Ñ˜UÔ#Ù.8�V˜J˜>Ñ*¸bˆDØ�J‰J×Ñ˜z¨#¨°°Ð7Ô8ð	UØ—8‘8Ð'Ð'Ð'ð9Ø—x‘x×'Ñ'¨¨ZÓ8Ð8øÜò 9ð —x‘x×'Ñ'¨¨ZÓ8Ò8ð	9ûô
 �}‰}ò 	UØ�z‰z× Ñ  Ô'Ø—
‘
× Ñ Ð#;¼LÈÓ<MÐ;NÐ!OÔPØ×"Ñ"Ð%<¸T¿]¹]Ð<MÐ#NÐPS×TÑTûð	Uús7   ÁB ÁA1 Á1%BÂB ÂBÂB ÂDÂ/A!DÄDc              #  ó„   K  — | j                  ||«      }	 |–— |j                  «        y# |j                  «        w xY w­w)z�Context managed :meth:`python:sqlite3.Connection.execute`.

        Use with a ``with`` statement to auto-close the returned cursor.
        N)r_   rN   )r0   r:   r]   Úcurs       r   r!   zSqliteDb.executeÂ   s4   è ø€ ð �m‰m˜C Ó,ˆð	ØŠIà�I‰I�KøˆC�I‰I�Küs   ‚A –+ šA «=½A c                ój   — 	 | j                  ||«      j                  «        y# t        $ r |s‚ Y yw xY w)z™Same as :meth:`python:sqlite3.Connection.execute` when you don't need the cursor.

        If `fail_ok` is True, then SQLite errors are ignored.
        N)r_   rN   r   )r0   r:   r]   rE   s       r   rK   zSqliteDb.execute_voidÒ   s:   € ð
	ð �M‰M˜#˜zÓ*×0Ñ0Õ2øÜò 	ÙØñ ð	ús   ‚ # £2±2c                óú   — | j                  ||«      5 }|j                  €J ‚|j                  }ddd«       | j                  j                  d«      r| j                  j	                  d›�«       S # 1 sw Y   ŒDxY w)z(Like execute, but returns the lastrowid.NÚsqldatazRow id result: )r!   Ú	lastrowidr.   rF   rG   )r0   r:   r]   ra   Úrowids        r   Úexecute_for_rowidzSqliteDb.execute_for_rowidß   sr   € à�\‰\˜#˜zÓ*ð 	'¨cØ—=‘=Ð,Ð,Ð,ØŸ™ˆE÷	'ð �:‰:×Ñ˜YÔ'Ø�J‰J×Ñ˜¨u¨iÐ8Ô9Øˆ÷	'ð 	'ús   “A1Á1A:c                ó  — | j                  ||«      5 }t        |«      }ddd«       t        «      dk(  ryt        |«      dk(  rt        t        t
        df   |d   «      S t        d|›dt        |«      › d�«      ‚# 1 sw Y   Œ]xY w)a6  Execute a statement and return the one row that results.

        This is like execute(sql, parameters).fetchone(), except it is
        correct in reading the entire result set.  This will raise an
        exception if more than one row results.

        Returns a row, or None if there were no rows.
        Nr   rQ   .zSQL z shouldn't return ú rows)r!   ÚlistÚlenr   Útupler   ÚAssertionError)r0   r:   r]   ra   Úrowss        r   Úexecute_onezSqliteDb.execute_oneè   sƒ   € ð �\‰\˜#˜zÓ*ð 	¨cÜ˜“9ˆD÷	äˆt‹9˜Š>ØÜ�‹Y˜!Š^Üœœc 3˜h™¨¨a©Ó1Ð1ä  4¨ wÐ.@ÄÀTÃÀÈ5Ð!QÓRÐR÷	ð 	ús   “A;Á;Bc                ó  — | j                   j                  d«      r›| j                   j                  d«      rdnd}| j                   j                  d|›dt        |«      › d|› �«       | j                   j                  d«      r4t	        |«      D ]&  \  }}| j                   j                  |d›d	|›�«       Œ( | j
                  €J ‚	 | j
                  j                  ||«      S # t        $ r | j
                  j                  ||«      cY S w xY w)
z6Same as :meth:`python:sqlite3.Connection.executemany`.r:   rd   ú:r\   zExecuting many r[   ri   Ú4dr3   )r.   rF   rG   rk   Ú	enumerater&   ÚexecutemanyrV   )r0   r:   ÚdataÚfinalÚiÚrows         r   Ú_executemanyzSqliteDb._executemanyú   sñ   € à�:‰:×Ñ˜UÔ#ØŸ:™:×,Ñ,¨YÔ7‘C¸RˆEØ�J‰J×Ñ˜¨s¨g°V¼CÀ»I¸;ÀeÈEÈ7ÐSÔTØ�z‰z× Ñ  Ô+Ü'¨›oò 9‘F�A�sØ—J‘J×$Ñ$¨¨" v¨R°¨wÐ%7Õ8ð9à�x‰xÐ#Ð#Ð#ð	3Ø—8‘8×'Ñ'¨¨TÓ2Ð2øÜò 	3ð —8‘8×'Ñ'¨¨TÓ2Ò2ð		3ús   ÃC" Ã"%D
Ä	D
c                óD   — | j                  ||«      j                  «        y)zUSame as :meth:`python:sqlite3.Connection.executemany` when you don't need the cursor.N)ry   rN   )r0   r:   ru   s      r   Úexecutemany_voidzSqliteDb.executemany_void  s   € à×Ñ˜#˜tÓ$×*Ñ*Õ,r   c           	     ó  — | j                   j                  d«      r4| j                   j                  dt        |«      › dt	        |d«      › �«       | j
                  €J ‚| j
                  j                  |«      j                  «        y)z8Same as :meth:`python:sqlite3.Connection.executescript`.r:   zExecuting script with z chars: éd   N)r.   rF   rG   rk   r
   r&   ÚexecutescriptrN   )r0   Úscripts     r   r~   zSqliteDb.executescript  sp   € à�:‰:×Ñ˜UÔ#Ø�J‰J×ÑØ(¬¨V«¨°X¼lÈ6ÐSVÓ>WÐ=XÐYôð �x‰xÐ#Ð#Ð#Ø�‰×Ñ˜vÓ&×,Ñ,Õ.r   c                óp   — | j                   €J ‚dj                  | j                   j                  «       «      S )z9Return a multi-line string, the SQL dump of the database.ú
)r&   ÚjoinÚiterdumprS   s    r   ÚdumpzSqliteDb.dump  s.   € à�x‰xÐ#Ð#Ð#Ø�y‰y˜Ÿ™×*Ñ*Ó,Ó-Ð-r   N)
r   Ústrr.   r   r+   Úboolr,   r†   ÚreturnÚNone)r7   r…   r'   rV   r‡   r   )r‡   rˆ   )F)rO   r†   r‡   rˆ   )r‡   r*   )r:   r…   r]   úIterable[Any]r‡   úsqlite3.Cursor)© )r:   r…   r]   r‰   r‡   zIterator[sqlite3.Cursor])r‹   F)r:   r…   r]   r‰   rE   r†   r‡   rˆ   )r:   r…   r]   r‰   r‡   Úint)r:   r…   r]   r‰   r‡   ztuple[Any, ...] | None)r:   r…   ru   ú	list[Any]r‡   rŠ   )r:   r…   ru   r�   r‡   rˆ   )r   r…   r‡   rˆ   )r‡   r…   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r1   r	   Ú__repr__r8   rL   rN   rR   rU   r_   r   Úcontextmanagerr!   rK   rg   ro   ry   r{   r~   r„   r‹   r   r   r*   r*   =   sÌ   „ ñ
ð" Øñ3àð3ð ð3ð
 ð3ð ð3ð 
ó3ð €Hó&ó.Bô` óó
YóUð& ×Ñð %'ðàðð "ðð 
"ò	ó ðôôôSó$3ó"-ó/ô.r   r*   )r   r…   r‡   r…   )r   r…   r‡   rˆ   )r‘   Ú
__future__r   r   r   r   r?   r   Úcollections.abcr   r   Útypingr   r   r   Úcoverage.debugr	   r
   r   Úcoverage.exceptionsr   Úcoverage.typesr   r   r(   r*   r‹   r   r   ú<module>rš      sJ   ðñ )õ #ã Û 	Û Û 	Û ß .ß #Ñ #ç @Ñ @Ý )Ý $ó
Uó÷2^.ò ^.r   