U SW[!@sddlZddlZddlmZddlmZzddlmZWn ek rXddlmZYnXz0ddlZddlm Z ddl mZ ddl mZWn ek rdZ ZZ YnXddlmZedZGdd d eZGd d d eZd Zd ZGdddeZGdddeZGdddeZdS)NEvent)Thread)Queue)Greenlet)SqliteExtDatabasezpeewee.sqliteqc@s eZdZdS) ResultTimeoutN)__name__ __module__ __qualname__r r D/opt/alt/python38/lib64/python3.8/site-packages/playhouse/sqliteq.pyrsrc@s|eZdZdZddZdddZdddZd d Zd d ZeZ e d dZ e ddZ e ddZ ddZddZddZdS) AsyncCursor) sqlparamscommittimeout_event_cursor_exc_idx_rowscCs:||_||_||_||_||_d|_|_|_|_dSN) rrrrrrrrr)selfeventrrrrr r r __init__ s zAsyncCursor.__init__NcCs6||_||_d|_|dkr"|ng|_|j|S)Nr)rrrfetchallrrset)rcursorexcr r r set_result(s  zAsyncCursor.set_resultcCs@|dk r |n|j}|jj|ds,|r,td|jdk r<|jdS)N)rzresults not ready, timed out.)rrwaitrr)rrr r r _wait0s  zAsyncCursor._waitcCs||jdk r|j|Sr)r"r_execrr r r __iter__7s zAsyncCursor.__iter__cCs@z|j|j}Wntk r(tYnX|jd7_|SdS)N)rr IndexError StopIteration)robjr r r next=s  zAsyncCursor.nextcCs||jjSr)r"r lastrowidr$r r r r+GszAsyncCursor.lastrowidcCs||jjSr)r"rrowcountr$r r r r,LszAsyncCursor.rowcountcCs|jjSr)r descriptionr$r r r r-QszAsyncCursor.descriptioncCs|jdSr)rcloser$r r r r.UszAsyncCursor.closecCst|Sr)listr$r r r rXszAsyncCursor.fetchallcCs.|z t|WStk r(YdSXdSr)r"r*r(r$r r r fetchone[s  zAsyncCursor.fetchone)N)N)r r r __slots__rr r"r%r*__next__propertyr+r,r-r.rr0r r r r rs      rzthreadlocals cannot be set to True when using the Sqlite thread / queue database. All queries are serialized through a single connection, so allowing multiple threads to connect defeats the purpose of this database.zSQLite must be configured to use the WAL journal mode when using this feature. WAL mode allows one or more readers to continue reading while another connection writes to the database.csreZdZdfdd ZddZddd Zd d Zd d ZddZddZ dddZ ddZ ddZ ddZ ZS)SqliteQueueDatabaseFr&Nc s|drttd|d<d|d<||dd|dd} tt|} | j|_| j |f|d| i|||_ ||_ ||_ d|_ ||||_||j r|dS)N threadlocalsFZcheck_same_thread journal_modepragmasT)get ValueErrorTHREADLOCAL_ERROR_MESSAGE_validate_journal_modepopsuperr4 execute_sql!_SqliteQueueDatabase__execute_sqlrZ _autostart_results_timeout _num_readers _is_stoppedget_thread_impl_thread_helper_create_queues_and_workersstart) rdatabase use_geventZ autostartZreadersqueue_max_sizeZresults_timeoutargskwargsr7ZParent __class__r r ros&    zSqliteQueueDatabase.__init__cCs |rtStSr)GreenletHelper ThreadHelper)rrHr r r rCsz#SqliteQueueDatabase.get_thread_implcCsh|r|dkrtt|r^tdd|D}|dddkrJttdd|DdgSdgSdS)Nwalcss|]\}}||fVqdSr)lower.0kvr r r sz=SqliteQueueDatabase._validate_journal_mode..r6cSs g|]\}}|dkr||fqS)r6r rRr r r sz>SqliteQueueDatabase._validate_journal_mode..)r6rP)rQr9WAL_MODE_ERROR_MESSAGEdictr8)rr6r7Zpdictr r r r;s z*SqliteQueueDatabase._validate_journal_modecsPj_j_jjj_fddtjD_ dS)Ncsg|]}jjqSr )rDthread _read_queue)rS_rtargetr r rWszBSqliteQueueDatabase._create_queues_and_workers..) rDqueue _write_queuer[_run_worker_looprZ_writerrangerA_readersr$r r]r rEs   z.SqliteQueueDatabase._create_queues_and_workerscCs<|}|tkrtddStd|j||qdS)Nzworker shutting down.zreceived query %s)r8r(loggerinfodebugr_process_execution)rr_ async_cursorr r r ras  z$SqliteQueueDatabase._run_worker_loopc CsPz||j|j|j}Wn&tk r>}zd}W5d}~XYnXd}|||Sr)r?rrr Exceptionr )rrirrr r r rhs z&SqliteQueueDatabase._process_executioncCs|j|jfSr)r`Zqsizer[r$r r r queue_sizeszSqliteQueueDatabase.queue_sizeTcCsDt|j||||dkr|jn|d}|r0|jn|j}|||S)N)rrrrr)rrDrr@r`r[put)rrrrequire_commitrrr_r r r r>s zSqliteQueueDatabase.execute_sqlc Csb|jR|jsW5QRdS|j|jD] }|q,tdd|_W5QRdSQRXdS)NFzworkers started.T) _conn_lockrBrbrFrdrerf)rreaderr r r rFs    zSqliteQueueDatabase.startc Cstd|jf|jr&W5QRdS|jt|jD]}|jtq8|j |jD] }| qZW5QRdSQRXdS)Nzenvironment stop requested.FT) rergrnrBr`rlr(rdr[rbjoin)rr\ror r r stops      zSqliteQueueDatabase.stopc Cs$|j|jW5QRSQRXdSr)rnrBr$r r r is_stoppedszSqliteQueueDatabase.is_stopped)FFr&NN)NN)NTN)r r r rrCr;rErarhrkr>rFrqrr __classcell__r r rLr r4ns!       r4c@s4eZdZdZd ddZddZd ddZd d ZdS) rOrINcCs ||_dSrrt)rrIr r r rszThreadHelper.__init__cCstSrrr$r r r rzThreadHelper.eventcCs |dk r |n|j}t|pddSNr)maxsize)rIrrZmax_sizer r r r_szThreadHelper.queuecOst|||d}d|_|S)N)r^rJrKT)rdaemon)rfnrJrKrZr r r rZszThreadHelper.thread)N)N)r r r r1rrr_rZr r r r rOs   rOc@s*eZdZdZddZd ddZddZdS) rNrtcCstSr)GEventr$r r r rruzGreenletHelper.eventNcCs |dk r |n|j}t|pddSrv)rIGQueuerxr r r r_szGreenletHelper.queuecsfdd}t|f||S)Ncst||Sr)geventsleep)arTrzr r wrapsz#GreenletHelper.thread..wrap)GThread)rrzrJrKrr rr rZs zGreenletHelper.thread)N)r r r r1rr_rZr r r r rNs rN)loggingweakref threadingrrr ImportErrorr_r}rrZ gevent.eventr{Z gevent.queuer|Zplayhouse.sqlite_extr getLoggerrerjrobjectrr:rXr4rOrNr r r r s.      G{