srh$3(dZddlZddlZddlZddlZddlZddlmZddlm Z  ddl m Z ddl m Z ddl m Z n#e$r dxZ xZ Z YnwxYw ddlmZn #e$rYnwxYwdd lmZdd lmZdd lmZejd Zd ZGddeZeddZGddeZdZGddeZGddeeZGddeZ Gdde eZ! ddl"m#Z#Gdde e#Z$n #e$rdZ$YnwxYw dd l%m&Z&Gd!d"ee&Z'n #e$rdZ'YnwxYwGd#d$eZ(Gd%d&e(eZ) dd'l*m+Z+Gd(d)e(e+Z,n #e$rdZ,YnwxYw dd*l*m-Z-Gd+d,e(e-Z.dS#e$rdZ.YdSwxYw)-aG Lightweight connection pooling for peewee. In a multi-threaded application, up to `max_connections` will be opened. Each thread (or, if using gevent, greenlet) will have it's own connection. In a single-threaded application, only one connection will be created. It will be continually recycled until either it exceeds the stale timeout or is closed explicitly (using `.manual_close()`). By default, all your application needs to do is ensure that connections are closed when you are finished with them, and they will be returned to the pool. For web applications, this typically means that at the beginning of a request, you will open a connection, and when you return a response, you will close the connection. Simple Postgres pool example code: # Use the special postgresql extensions. from playhouse.pool import PooledPostgresqlExtDatabase db = PooledPostgresqlExtDatabase( 'my_app', max_connections=32, stale_timeout=300, # 5 minutes. user='postgres') class BaseModel(Model): class Meta: database = db That's it! N) namedtuple)chain)TRANSACTION_STATUS_IDLE)TRANSACTION_STATUS_INERROR)TRANSACTION_STATUS_UNKNOWN)TransactionStatus) MySQLDatabase)PostgresqlDatabase)SqliteDatabasez peewee.poolc`|+t|ttfst|S|SN) isinstanceintfloat)vals Z/var/lib/jenkins/jobs/Dev/workspace/my-venv/lib/python3.11/site-packages/playhouse/pool.pymake_intr>s) z#U|<<3xx JceZdZdS)MaxConnectionsExceededN__name__ __module__ __qualname__rrrrDsrrPoolConnection) timestamp connection checked_outceZdZdZdS) _sentinelcdSNTr)selfothers r__lt__z_sentinel.__lt__KstrN)rrrr&rrrr!r!Js#rr!cFtjfd}|S)Nc^|j5|g|Ri|cdddS#1swxYwYdSr ) _pool_lock)r$argskwargsfns rinnerzlocked..innerPs _ - -2d,T,,,V,, - - - - - - - - - - - - - - - - - -s "&&) functoolswraps)r,r-s` rlockedr0Os8_R----- LrceZdZ dfd Z dfd Zdfd ZefdZdZd Z d Z edfd Z ed Z ed Z eddZedZxZS)PooledDatabaseNc dt||_t||_t||_|jdkrt d|_t j|_g|_i|_ t|_ tt|j|fi|dSNrinf)r_max_connections_stale_timeout _wait_timeoutr threadingRLockr) _connections_in_useidconn_keysuperr2__init__)r$databasemax_connections stale_timeouttimeoutr+ __class__s rrAzPooledDatabase.__init__Xs ( 9 9&}55%g..   " "!&uD #/++   ,nd##,X@@@@@@@rc tt|j|fi||t||_|t||_|5t||_|jdkrtd|_dSdSdSr5)r@r2initrr7r8r9r)r$rBrCrDrEconnect_kwargsrFs rrHzPooledDatabase.initrs(nd##(DD^DDD  &$,_$=$=D !  $"*="9"9D   !)'!2!2D !Q&&%*5\\"""  &&rFc|js(tt||St j|jz}|t jkrf tt||}|S#t $rt jdYnwxYw|t jkft d)Ng?z:Max connections exceeded, timed out attempting to connect.)r9r@r2connecttimersleep)r$ reuse_if_openexpiresretrFs rrKzPooledDatabase.connect~s! F..66}EE E)++ 22 ## ND1199-HH *    3  ##%&>?? ?s$(BB/.B/ct tj|j\}}}|}||}||r t d|dx}}n|jrK||r6t d|| |ddx}}n/n/#t$r!dx}}t dYnwxYw||j r,t|j |j krtdtt |}t%j}||}t d|t'||t%j|j |<|S)NTzConnection %s was closed.z!Connection %s was stale, closing.z No connection available in pool.zExceeded maximum connections.zCreated new connection %s.)heapqheappopr<r? _is_closedloggerdebugr8 _is_stale_close IndexErrorr7lenr=rr@r2_connectrLr)r$ts_c_connconnkeyrFs rr[zPooledDatabase._connects   % d.? @ @ AvmmD)) ??4(( LL!>>,-LMMM..7799DB--%%C LL5s ; ; ;*2tTY[[AA S s4C(C+*C+c@tj|z |jkSr )rLr8)r$rs rrWzPooledDatabase._is_stales i'4+>>>rcdS)NFrr$r_s rrTzPooledDatabase._is_closedsurcdSr#rrcs r _can_reusezPooledDatabase._can_reusestrc||}|r*tt||dS||jvr|j|}|jr_||jrEt d|tt||dS| |rKt d|tj |j|jt|fdSt d|dSdS)NzClosing stale connection %s.zReturning %s to pool.z Closed %s.)r?r@r2rXr=popr8rWrrUrVrerRheappushr<r!)r$r_ close_connr` pool_connrFs rrXzPooledDatabase._closesBmmD!!  0 .$ ' ' . .t 4 4 4 4 4 DL  ((--I" 0t~~i6I'J'J 0 ;SAAAnd++22488888&& 0 4c:::t0 ) 3Y[[$GIIIII \3/////! rc |rdS|}|j||d|||ddS)zS Close the underlying connection without returning it to the pool. FNTri) is_closedrr=rgr?closerXrcs r manual_closezPooledDatabase.manual_closes{ >>   5   t,,d333  DT *****rc^|jD]\}}}||dg|_dSNTrl)r<rX)r$r]r_s r close_idlezPooledDatabase.close_idlesC+ / /JAq$ KKK . . . .rXci}tj|z }d}|jD]7\}}|j|kr"||jd|dz }2|||<8||_|S)NrTrl)rLr=itemsrrXr)r$agein_usecutoffnr`rjs r close_stalezPooledDatabase.close_staless" "l0022 ( (NC$v-- I0T BBBQ's  rc||jD]\}}}||d|jD]}||jdg|_i|_dSrq)rnr<rXr=valuesr)r$r]r_rjs r close_allzPooledDatabase.close_alls + / /JAq$ KKK . . . .,,.. ? ?I KK ,K > > > > r)r3NN)NNNF)rs)rrrrArHrKr0r[rWrTrerXrorrr{r~ __classcell__)rFs@rr2r2Ws}CGAAAAAA4BF 2 2 2 2 2 2 ? ? ? ? ? ? )))) V)V???  00000 V0  ++ V+$  V      V     V     rr2ceZdZdZdS)PooledMySQLDatabasecX|jddkrd}nd} |j|dS#YdSxYw)NrrrFT)server_versionping)r$r_r*s rrTzPooledMySQLDatabase._is_closedsL  q !Q & &DDD  DIt  5 44s $)NrrrrTrrrrr s#     rrceZdZdZdZdS)_PooledPostgresqlDatabasec|jrdS|}|tkrdS|tkr|dSNTF)closedget_transaction_statusrrrollbackr$r_ txn_statuss rrTz$_PooledPostgresqlDatabase._is_closedsQ ; 40022 3 3 34 2 2 2 MMOOOurc|}|tkrdS|tkr|n|tkr|dSNFT)rrrresetrrrs rrez$_PooledPostgresqlDatabase._can_reuse's_0022  3 3 35 5 5 5 JJLLLL 2 2 2 MMOOOtrNrrrrTrerrrrrs2        rrceZdZdS)PooledPostgresqlDatabaseNrrrrrr4Drr)PostgresqlExtDatabaseceZdZdS)PooledPostgresqlExtDatabaseNrrrrrr: rr)Psycopg3DatabaseceZdZdZdZdS)PooledPsycopg3Databasec|jrdS|jj}|tjkrdS|tjkr|dSr)rpgconntransaction_statusrUNKNOWNIDLErrs rrTz!PooledPsycopg3Database._is_closedDsP{ t7J.666t0555 5rc|jj}|tjkrdS|tjkr|n$|tjkr|dSr)rrrrINERRORrrrrs rrez!PooledPsycopg3Database._can_reuseOsa7J.666u0888 0555 4rNrrrrrrCs2        rrceZdZdZdS)_PooledSqliteDatabasec& |jdS#YdSxYwr) total_changesrcs rrTz _PooledSqliteDatabase._is_closed`s'    5 44s Nrrrrrr_s#rrceZdZdS)PooledSqliteDatabaseNrrrrrrhrrr)SqliteExtDatabaseceZdZdS)PooledSqliteExtDatabaseNrrrrrrnrrr)CSqliteExtDatabaseceZdZdS)PooledCSqliteExtDatabaseNrrrrrrvrrr)/__doc__r.rRloggingr:rL collectionsr itertoolsrpsycopg2.extensionsrrr ImportError psycopg.pqrpeeweer r r getLoggerrUr ValueErrorrrobjectr!r0r2rrrplayhouse.postgres_extrrplayhouse.psycopg3_extrrrrplayhouse.sqlite_extrrrrrrrrs  B  """""".;;;;;;>>>>>>>>>>>>>...*... & & & &. ,,,,,,,   D ! %%%%%%!!!!!!  = ) ) /....Z...,/>?? sssssVsssl     .-   2     8:L   '<<<<<<     &?AV    '''"&'"7777771A0"""!"N     0.   #666666     "79J    ###"#$777777     #8:L     $$$#$si7 AA AAA&C<<DD D D*)D* E!!E+*E+/FFF