+
    DfjA                         R t ^ RIHt ^ RIHtHt  ! R R]4      t ! R R4      t ! R R4      t	 ! R	 R
4      t
RR
.tR# )zg
An asynchronous mapping to U{DB-API
2.0<http://www.python.org/topics/database/DatabaseAPI-2.0.html>}.
)threads)logreflectc                       ] tR t^tRtRtR# )ConnectionLostzV
This exception means that a db connection has been lost.  Client code may
try again.
 N)__name__
__module____qualname____firstlineno____doc____static_attributes__r       ;/usr/lib/python3/dist-packages/twisted/enterprise/adbapi.pyr   r      s    r   r   c                   B   a  ] tR t^t o RtR tR tR tR tR t	Rt
V tR# )	
Connectionz
A wrapper for a DB-API connection instance.

The wrapper passes almost everything to the wrapped connection and so has
the same API. However, the L{Connection} knows about its pool and also
handle reconnecting should when the real connection dies.
c                @    Wn         R V n        V P                  4        R # N)_pool_connection	reconnect)selfpools   &&r   __init__Connection.__init__   s    
r   c                    R # r   r   r   s   &r   closeConnection.close$   s     	r   c                   V P                   P                  '       g   V P                  P                  4        R #  V P                  P                  4        V P                  P	                  4       pVP                  V P                   P                  4       VP                  4        V P                  P                  4        R #   \         d    \        P                  ! R R4        Mi ; iT P                   P                  T P                  4       T P                   P                  '       d   \        P                  ! R4       \        4       h)NRollback failedzConnection lost.)r   r   r   rollbackcursorexecutegood_sqlr   commitBaseExceptionr   err
disconnectnoisymsgr   )r   curss   & r   r!   Connection.rollback.   s    zz###%%'	-%%'##**,DLL,,-JJL##% 	-GGD+,	- 	

d../::GG&'s   BB? ?"C$#C$c                    V P                   e&   V P                  P                  V P                   4       V P                  P                  4       V n         R # r   )r   r   r(   connectr   s   &r   r   Connection.reconnectD   s;    'JJ!!$"2"23::--/r   c                .    \        V P                  V4      # r   )getattrr   r   names   &&r   __getattr__Connection.__getattr__I   s    t''..r   )r   r   N)r   r	   r
   r   r   r   r   r!   r   r4   r   __classdictcell____classdict__s   @r   r   r      s(     
,0
/ /r   r   c                   F   a  ] tR t^Mt o RtRtR tR tR tR t	R t
RtV tR# )	Transactiona  
A lightweight wrapper for a DB-API 'cursor' object.

Relays attribute access to the DB cursor. That is, you can call
C{execute()}, C{fetchall()}, etc., and they will be called on the
underlying DB-API cursor object. Attributes will also be retrieved from
there.
Nc                >    Wn         W n        V P                  4        R # r   )r   r   reopen)r   r   
connections   &&&r   r   Transaction.__init__Y   s    
%r   c                L    V P                   pR V n         VP                  4        R # r   )_cursorr   )r   r@   s   & r   r   Transaction.close^   s    ,,r   c                   V P                   e   V P                  4         V P                  P                  4       V n         R #   \         d8    T P
                  P                  '       g   h \        P                  ! R R4        Mi ; iT P
                  P                  '       d   \        P                  ! R4       T P                  4        T P                  P                  4       T n         R # )NzCursor creation failedzConnection lost, reconnecting)r@   r   r   r"   r&   r   r   r   r'   r)   r*   r   s   &r   r<   Transaction.reopenc   s    <<#JJL	8++224DL 	8::'''67		8 ::GG34''..0s   A &B(BBc                H    V P                   P                  4        R V n        R # r   )r   r   r@   r   s   &r   r   Transaction.reconnectv   s    ""$r   c                .    \        V P                  V4      # r   )r1   r@   r2   s   &&r   r4   Transaction.__getattr__z   s    t||T**r   )r   r@   r   )r   r	   r
   r   r   r@   r   r   r<   r   r4   r   r6   r7   s   @r   r:   r:   M   s/      G

1&+ +r   r:   c                      a  ] tR t^~t o RtRP                  4       tRt^t^t	Rt
RtRtRtRt]t]tRtR tR tR tR	 tR
 tR tR tR tR tR tR tR tR t R t!R t"R t#R t$R t%Rt&V t'R# )ConnectionPoolaV  
Represent a pool of connections to a DB-API 2.0 compliant database.

@ivar connectionFactory: factory for connections, default to L{Connection}.
@type connectionFactory: any callable.

@ivar transactionFactory: factory for transactions, default to
    L{Transaction}.
@type transactionFactory: any callable

@ivar shutdownID: L{None} or a handle on the shutdown event trigger which
    will be used to stop the connection pool workers when the reactor
    stops.

@ivar _reactor: The reactor which will be used to schedule startup and
    shutdown events.
@type _reactor: L{IReactorCore} provider
z-min max name noisy openfun reconnect good_sqlFNzselect 1c                R   Wn         \        P                  ! V4      V n        \	        V P                  RR4      R8w  d   \
        P                  ! R4       \	        V P                  R^ 4      ^8  d   \
        P                  ! R4       VP                  RR4      pVf   ^ RIH	p W@n
        W n        W0n        V P                   F$  pR	V 2pWc9   g   K  \        WW6,          4       W6 K&  	  \        V P                  V P                   4      V n        \!        V P                  V P                   4      V n        / V n        ^ R
IHpHp VP*                  V n        VP/                  V P                  V P                   4      V n        V P                  P1                  V P2                  4      V n        R# )a  
Create a new L{ConnectionPool}.

Any positional or keyword arguments other than those documented here
are passed to the DB-API object when connecting. Use these arguments to
pass database names, usernames, passwords, etc.

@param dbapiName: an import string to use to obtain a DB-API compatible
    module (e.g. C{'pyPgSQL.PgSQL'})

@keyword cp_min: the minimum number of connections in pool (default 3)

@keyword cp_max: the maximum number of connections in pool (default 5)

@keyword cp_noisy: generate informational log messages during operation
    (default C{False})

@keyword cp_openfun: a callback invoked after every C{connect()} on the
    underlying DB-API object. The callback is passed a new DB-API
    connection object. This callback can setup per-connection state
    such as charset, timezone, etc.

@keyword cp_reconnect: detect connections which have failed and reconnect
    (default C{False}). Failed connections may result in
    L{ConnectionLost} exceptions, which indicate the query may need to
    be re-sent.

@keyword cp_good_sql: an sql query which should always succeed and change
    no state (default C{'select 1'})

@keyword cp_reactor: use this reactor instead of the global reactor
    (added in Twisted 10.2).
@type cp_reactor: L{IReactorCore} provider
apilevelNz2.0z'DB API module not DB API 2.0 compliant.threadsafetyz+DB API module not sufficiently thread-safe.
cp_reactor)reactorcp_)
threadable
threadpool)	dbapiNamer   namedModuledbapir1   r   r*   poptwisted.internetrN   _reactorconnargsconnkwCP_ARGSsetattrminmaxconnectionstwisted.pythonrP   rQ   getThreadIDthreadID
ThreadPoolcallWhenRunning_startstartID)	r   rR   rX   rY   rN   argcpArgrP   rQ   s	   &&*,     r   r   ConnectionPool.__init__   s6   F #((3
4::z40E9GG=>4::~q1A5GGAB**\40?0 <<C#KE6=1M	   txx*txx*  	:"..$//$((C}}44T[[Ar   c                0    R V n         V P                  4       # r   )re   startr   s   &r   rd   ConnectionPool._start   s    zz|r   c                    V P                   '       gP   V P                  P                  4        V P                  P	                  RRV P
                  4      V n        RV n         R# R# )zp
Start the connection pool.

If you are using the reactor normally, this function does *not*
need to be called.
duringshutdownTN)runningrQ   rj   rW   addSystemEventTrigger
finalClose
shutdownIDr   s   &r   rj   ConnectionPool.start   sL     |||OO!!#"mmAA*dooDO  DL r   c                x    \         P                  ! V P                  V P                  V P                  V.VO5/ VB # )a}  
Execute a function with a database connection and return the result.

@param func: A callable object of one argument which will be executed
    in a thread with a connection from the pool. It will be passed as
    its first argument a L{Connection} instance (whose interface is
    mostly identical to that of a connection object for your DB-API
    module of choice), and its results will be returned as a
    L{Deferred}. If the method raises an exception the transaction will
    be rolled back. Otherwise, the transaction will be committed.
    B{Note} that this function is B{not} run in the main thread: it
    must be threadsafe.

@param args: positional arguments to be passed to func

@param kw: keyword arguments to be passed to func

@return: a L{Deferred} which will fire the return value of
    C{func(Transaction(...), *args, **kw)}, or a
    L{twisted.python.failure.Failure}.
)r   deferToThreadPoolrW   rQ   _runWithConnection)r   funcargskws   &&*,r   runWithConnection ConnectionPool.runWithConnection   s>    , ((MM4??D,C,CT
LP
TV
 	
r   c                    V P                  V 4      p V! V.VO5/ VB pVP                  4        V#   \         d<     TP                  4        h   \         d    \        P
                  ! R R4        h i ; ii ; iNr    )connectionFactoryr%   r&   r!   r   r'   )r   rw   rx   ry   connresults   &&*,  r   rv   !ConnectionPool._runWithConnection  s~    %%d+		$,,,FKKMM 	1  ! 1/01	s,   1 A7AA7"A30A72A33A7c                x    \         P                  ! V P                  V P                  V P                  V.VO5/ VB # )a(  
Interact with the database and return the result.

The 'interaction' is a callable object which will be executed in a
thread using a pooled connection. It will be passed an L{Transaction}
object as an argument (whose interface is identical to that of the
database cursor for your DB-API module of choice), and its results will
be returned as a L{Deferred}. If running the method raises an
exception, the transaction will be rolled back. If the method returns a
value, the transaction will be committed.

NOTE that the function you pass is *not* run in the main thread: you
may have to worry about thread-safety in the function you pass to this
if it tries to use non-local objects.

@param interaction: a callable object whose first argument is an
    L{adbapi.Transaction}.

@param args: additional positional arguments to be passed to
    interaction

@param kw: keyword arguments to be passed to interaction

@return: a Deferred which will fire the return value of
    C{interaction(Transaction(...), *args, **kw)}, or a
    L{twisted.python.failure.Failure}.
)r   ru   rW   rQ   _runInteraction)r   interactionrx   ry   s   &&*,r   runInteractionConnectionPool.runInteraction$  sE    8 ((MMOO  	

 
 
 	
r   c                B    V P                   ! V P                  .VO5/ VB # )a  
Execute an SQL query and return the result.

A DB-API cursor which will be invoked with C{cursor.execute(*args,
**kw)}. The exact nature of the arguments will depend on the specific
flavor of DB-API being used, but the first argument in C{*args} be an
SQL statement. The result of a subsequent C{cursor.fetchall()} will be
fired to the L{Deferred} which is returned. If either the 'execute' or
'fetchall' methods raise an exception, the transaction will be rolled
back and a L{twisted.python.failure.Failure} returned.

The C{*args} and C{**kw} arguments will be passed to the DB-API
cursor's 'execute' method.

@return: a L{Deferred} which will fire the return value of a DB-API
    cursor's 'fetchall' method, or a L{twisted.python.failure.Failure}.
)r   	_runQueryr   rx   ry   s   &*,r   runQueryConnectionPool.runQueryI  s#    $ ""4>>?D?B??r   c                B    V P                   ! V P                  .VO5/ VB # )a  
Execute an SQL query and return L{None}.

A DB-API cursor which will be invoked with C{cursor.execute(*args,
**kw)}. The exact nature of the arguments will depend on the specific
flavor of DB-API being used, but the first argument in C{*args} will be
an SQL statement. This method will not attempt to fetch any results
from the query and is thus suitable for C{INSERT}, C{DELETE}, and other
SQL statements which do not return values. If the 'execute' method
raises an exception, the transaction will be rolled back and a
L{Failure} returned.

The C{*args} and C{*kw} arguments will be passed to the DB-API cursor's
'execute' method.

@return: a L{Deferred} which will fire with L{None} or a
    L{twisted.python.failure.Failure}.
)r   _runOperationr   s   &*,r   runOperationConnectionPool.runOperation]  s%    & ""4#5#5CCCCr   c                   V P                   '       d-   V P                  P                  V P                   4       RV n         V P                  '       d-   V P                  P                  V P                  4       RV n        V P	                  4        R# )z3
Close all pool connections and shutdown the pool.
N)rr   rW   removeSystemEventTriggerre   rq   r   s   &r   r   ConnectionPool.closer  sZ     ???MM224??C"DO<<<MM224<<@DLr   c                    RV n         V P                  P                  4        RV n        V P                  P                  4        F  pV P                  V4       K  	  V P                  P                  4        R# )z5
This should only be called by the shutdown trigger.
NF)rr   rQ   stopro   r^   values_closeclearr   r   s   & r   rq   ConnectionPool.finalClose~  sY     $$++-DKK . r   c                   V P                  4       pV P                  P                  V4      pVf   V P                  '       d$   \        P
                  ! RV P                   24       V P                  P                  ! V P                  / V P                  B pV P                  e   V P                  V4       W P                  V&   V# )a]  
Return a database connection when one becomes available.

This method blocks and should be run in a thread from the internal
threadpool. Don't call this method directly from non-threaded code.
Using this method outside the external threadpool may exceed the
maximum number of connections in the pool.

@return: a database connection from the pool.
zadbapi connecting: )ra   r^   getr)   r   r*   rR   rT   r.   rX   rY   openfun)r   tidr   s   &  r   r.   ConnectionPool.connect  s     mmo##C(<zzz-dnn-=>?::%%t}}DDD||'T"$(S!r   c                    V P                  4       pWP                  P                  V4      Jd   \        R4      hVe!   V P	                  V4       V P                  V R# R# )z
Disconnect a database connection associated with this pool.

Note: This function should only be used by the same thread which called
L{ConnectionPool.connect}. As with C{connect}, this function is not
used in normal non-threaded Twisted code.
zwrong connection for threadN)ra   r^   r   	Exceptionr   )r   r   r   s   && r   r(   ConnectionPool.disconnect  sW     mmo''++C009::KK  % r   c                    V P                   '       d$   \        P                  ! R V P                   24        VP	                  4        R#   \
         d    \        P                  ! RR4        R# i ; i)zadbapi closing: NzConnection close failed)r)   r   r*   rR   r   r&   r'   r   s   &&r   r   ConnectionPool._close  sP    :::GG&t~~&678	5JJL 	5GGD34	5s   A	 	"A/.A/c                6   V P                  V 4      pV P                  W4      p V! V.VO5/ VB pVP                  4        VP                  4        V#   \         d<     TP                  4        h   \         d    \        P                  ! R R4        h i ; ii ; ir}   )r~   transactionFactoryr   r%   r&   r!   r   r'   )r   r   rx   ry   r   transr   s   &&*,   r   r   ConnectionPool._runInteraction  s    %%d+''3
	 444FKKMKKMM 	1  ! 1/01	s/   -A BA/.B/"BBBBc                F    VP                   ! V/ VB  VP                  4       # r   )r#   fetchallr   r   rx   ry   s   &&*,r   r   ConnectionPool._runQuery  s     t"r"~~r   c                *    VP                   ! V/ VB  R # r   )r#   r   s   &&*,r   r   ConnectionPool._runOperation  s    t"r"r   c                    R V P                   RV P                  RV P                  RV P                  RV P                  RV P
                  RV P                  RV P                  /# rR   r\   r]   r)   r   r$   rX   rY   r   r   s   &r   __getstate__ConnectionPool.__getstate__  sT    488488TZZdkk	
 		
r   c                z    Wn         V P                  ! V P                  .V P                  O5/ V P                  B  R # r   )__dict__r   rR   rX   rY   )r   states   &&r   __setstate__ConnectionPool.__setstate__  s)    dnnDt}}DDr   )r   rW   rX   r^   rY   rT   rR   r]   r\   ro   rr   re   ra   rQ   )(r   r	   r
   r   r   splitrZ   r)   r\   r]   r3   r   r   r$   ro   r   r~   r:   r   rr   r   rd   rj   rz   rv   r   r   r   r   rq   r.   r(   r   r   r   r   r   r   r   r6   r7   s   @r   rI   rI   ~   s     & >CCEGE
C
CDGIHG"$ JEBN 
4#
J@(D*
	!.&5 #

E Er   rI   N)r   rV   r   r_   r   r   r   r   r   r:   rI   __all__r   r   r   <module>r      sP   
 % 'Y 4/ 4/n.+ .+b]E ]E@ *
+r   