On Monday, 31 December, 2018 13:19, Jesse Rittner <rittneje+sql...@gmail.com> wrote:
>Keith Medcalf wrote >> What are you trying to accomplish? Perhaps what you really want is >> a progress callback? > I'm trying to write a function to run a query with a timeout. If the > timeout expires, the query must stop execution within a "reasonable" amount > of time. > To use a progress callback, it sounds like I'd have to choose a small > enough N and poll some kind of "timed out" flag, which sounds undesirable. > If instead of sqlite3_interrupt, we had sqlite3_begin_interrupt and > sqlite3_end_interrupt, that would meet my needs a lot better. Then I > would > just do the following: > 1. Have thread 1 call sqlite3_step. > 2. Have thread 2 sleep for whatever timeout, then call > sqlite3_begin_interrupt. > 3. Once sqlite3_step returns, have thread 1 signal thread 2. > 4. Have thread 2 call sqlite3_end_interrupt. > Then there would never be a race condition because the interrupt > remains in effect even while there are no running statements. > Alternatively, having some sort of object to pass into sqlite3_step > would also work, as then I could just call some sort of cancel method on > that object and have it interrupt that call only. If the timeout is so short that you need to make sure that a query is actively running, then simply wait for it it be running if necessary: def interrupt_function(db, stmt, timeout, whizround) while whizround and !sqlite3_stmt_busy /* whizround waiting for statement to start */ sleep(0.001) sleep(timeout) /* wait for our timeout */ if sqlite3_stmt_busy(stmt) /* if statement is running */ sqlite3_interrupt(db) /* interrupt it */ def run_query_with_timeout(db, query, timeout, whizround) stmt = prepare(db, query) create_thread A interrupt_function(db, stmt, timeout, whizround) while sqlite3_step(stmt) == SQLITE_ROW ... process the row ... cancel_thread A join_thread A /* make sure the thread is ended */ sqlite3_finalize(stmt) --- The fact that there's a Highway to Hell but only a Stairway to Heaven says a lot about anticipated traffic volume. _______________________________________________ sqlite-users mailing list sqlite-users@mailinglists.sqlite.org http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users