
    /~h%                        d Z ddlm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 ddlmZmZmZ ddlmZ ddlmZ  G d	 d
      Zy)z"SQLite abstraction for coverage.py    )annotationsN)castAny)IterableIterator)	auto_reprclipped_reprexc_one_line)	DataError)	TDebugCtlc                      e Zd ZdZddZeZddZ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)

    c                <    || _         || _        d| _        d | _        y )Nr   )debugfilenamenestcon)selfr   r   s      Z/var/www/peopleoo.sandbox-dev.co.uk/venv/lib/python3.12/site-packages/coverage/sqlitedb.py__init__zSqliteDb.__init__    s    
 	.2    c                   | j                   y| j                  j                  d      r(| j                  j                  d| j                         	 t        j                  | j                  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!}t        d| j                  d|       |d}~ww xY w)z2Connect to the db and do universal initialization.NsqlzConnecting to F)check_same_threadCouldn't use data file : 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    ryyc?RZ^?^ r   SQLITE_DBCONFIG_DEFENSIVEzpragma journal_mode=offzpragma synchronous=offT)fail_ok)r   r   shouldwriter   sqlite3connectErrorr   create_functionhasattr	setconfigr%   execute_void)r   excs     r   _connectzSqliteDb._connect(   s:   88 ::U#JJ~dmm->?@	Yt}}NDH ::U#JJ}T]],=T$((NO  1.^_
 778HH115
 	34
 	2DA/ }} 	Y5dmm5FbNOUXX	Ys   &E E9E44E9c                    | j                   | j                  dk7  rr| j                  j                  d      r5| j                  j	                  d| j                   d| j                         | j                   j                          d| _         yyy)z If needed, close the connection.N:memory:r   zClosing z on )r   r   r   r'   r(   closer   s    r   r4   zSqliteDb.closeO   so    88DMMZ$?zz  '

  8DHH<tDMM;L!MNHHNNDH	 %@r   c                    | j                   dk(  r8| j                          | j                  J | j                  j                          | xj                   dz  c_         | S )Nr      )r   r1   r   	__enter__r5   s    r   r8   zSqliteDb.__enter__W   sH    99>MMO88'''HH 		Q	r   c                   | xj                   dz  c_         | j                   dk(  r=	 | j                  J | j                  j                  |||       | j                          y y # t        $ rc}| j
                  j                  d      r'| j
                  j                  dt        |              t        d| j                  d|       |d }~ww xY w)Nr7   r   r   zEXCEPTION from __exit__: zCouldn't end data file r   )r   r   __exit__r4   	Exceptionr   r'   r(   r
   r   r   )r   exc_type	exc_value	tracebackr0   s        r   r:   zSqliteDb.__exit___   s    		Q	99>]xx+++!!(IyA

	 
  ]::$$U+JJ$$'@cAR@S%TU"9$--9J"SE RSY\\]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                  $ r}t        |      }| j                  dk7  r^	 t        | j                  d      5 }d}|j                  t        |            |k(  rd	}ddd       n# 1 sw Y   nxY wn# t
        $ r Y nw xY w| j                   j                  d      r'| j                   j                  d
t        |              t        d| j                  d|       |d}~ww xY w)z2Same as :meth:`python:sqlite3.Connection.execute`.r    with  z
Executing Nr3   rbs&   !coverage.py: This is a private formatzILooks like a coverage 4.x data file. Are you mixing versions of coverage?zEXCEPTION from execute: r   r   )r   r'   r(   r   executer;   r)   r+   strr   openreadlenr
   r   )r   r   
parameterstailr0   msgbad_filecov4_sigs           r   _executezSqliteDb._executek   s~   ::U#.8VJ>*bDJJz#78	Y88'''9xx''Z88 9 xx''Z88	9
 }} 	Yc(C}}
* dmmT2 h#L#==X78C!G     ! zz  '

  #;L<M;N!OP5dmm5FbNOUXX#	Yss   B A1 1%BB BB F
/F
D "D	DD	DF	D$!F#D$$A!FF
c              #     K   | j                  ||      }	 | |j                          y# |j                          w xY ww)zContext managed :meth:`python:sqlite3.Connection.execute`.

        Use with a ``with`` statement to auto-close the returned cursor.
        N)rM   r4   )r   r   rH   curs       r   rC   zSqliteDb.execute   s4      mmC,	IIIKCIIKs   A + A =A c                j    	 | j                  ||      j                          y# t        $ r |s Y yw xY w)zSame as :meth:`python:sqlite3.Connection.execute` when you don't need the cursor.

        If `fail_ok` is True, then SQLite errors are ignored.
        N)rM   r4   r   )r   r   rH   r&   s       r   r/   zSqliteDb.execute_void   s:    
	 MM#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: )rC   	lastrowidr   r'   r(   )r   r   rH   rO   rowids        r   execute_for_rowidzSqliteDb.execute_for_rowid   sr    \\#z* 	'c==,,,E	' ::Y'JJui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   r7   .zSQL z shouldn't return  rows)rC   listrG   r   tupler   AssertionError)r   r   rH   rO   rowss        r   execute_onezSqliteDb.execute_one   s     \\#z* 	c9D	t9>Y!^c3h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   rR   :rA   zExecuting many r@   rW   4dr   )r   r'   r(   rG   	enumerater   executemanyr;   )r   r   datafinalirows         r   _executemanyzSqliteDb._executemany   s    ::U#::,,Y7CREJJsgVCI;eE7STzz  +'o 9FAsJJ$$"vRw%789xx###	388''T22 	3 88''T22		3s   C" "%D
	D
c                `    t        |      }|r!| j                  ||      j                          yy)zUSame as :meth:`python:sqlite3.Connection.executemany` when you don't need the cursor.N)rX   rf   r4   )r   r   rb   s      r   executemany_voidzSqliteDb.executemany_void   s,    Dzc4(..0 r   c           	     $   | j                   j                  d      r>| j                   j                  dj                  t	        |      t        |d                   | j                  J | j                  j                  |      j                          y)z8Same as :meth:`python:sqlite3.Connection.executescript`.r   z"Executing script with {} chars: {}d   N)	r   r'   r(   formatrG   r	   r   executescriptr4   )r   scripts     r   rl   zSqliteDb.executescript   sq    ::U#JJAHHF\&#6  xx###v&,,.r   c                p    | j                   J dj                  | j                   j                               S )z9Return a multi-line string, the SQL dump of the database.
)r   joiniterdumpr5   s    r   dumpzSqliteDb.dump   s.    xx###yy**,--r   N)r   rD   r   r   returnNone)rs   rt   )rs   r   )r   rD   rH   Iterable[Any]rs   sqlite3.Cursor) )r   rD   rH   ru   rs   zIterator[sqlite3.Cursor])rw   F)r   rD   rH   ru   r&   boolrs   rt   )r   rD   rH   ru   rs   int)r   rD   rH   ru   rs   ztuple[Any, ...] | None)r   rD   rb   z	list[Any]rs   rv   )r   rD   rb   ru   rs   rt   )rm   rD   rs   rt   )rs   rD   )__name__
__module____qualname____doc__r   r   __repr__r1   r4   r8   r:   rM   
contextlibcontextmanagerrC   r/   rU   r\   rf   rh   rl   rr   rw   r   r   r   r      s    
3 H%BN
]YB  %' " 
"	 S$3"1/.r   r   )r}   
__future__r   r   r    r)   typingr   r   collections.abcr   r   coverage.debugr   r	   r
   coverage.exceptionsr   coverage.typesr   r   rw   r   r   <module>r      s4    ) "  	   . @ @ ) $S. S.r   