Description Usage Arguments Details Value Note Author(s) Examples
Manage an asynchronous query
1 2 3 4 5 6 7 8 9 | async_query(sql = "", pars = NULL)
async_status()
is_busy()
cancel()
finish_async()
|
sql |
a query string |
pars |
a vector of parameters |
These functions expose the asynchronous query interface from
libpq
. The function async_query
issues a query. Its
call is identical to query
except that it will return
immediately. When the issued command is ready, the function
async_status
will return a query status object exactly
as query
. Otherwise it will return "BUSY"
to
indicate the server has not finished or "DONE"
to indicate
there is nothing more to fetch.
If async_status
does not return "DONE"
, then
you should call finish_async
to free pending results. Note
that a call to finish_async
may block until the server is finished
processing the command. It calls cancel
internally but there is
no guarantee the command will abort.
Any pending results will be lost if you call query
,
execute
or fetch
with a sql
string prior
to async_query
returning DONE
. If you need to issue queries
while waiting on an async call, then use push_conn
to save
the query state, connect
to make a new connetion, and then
pop_conn
followed by async_status
.
is_busy
is a slightly faster shortcut to check whether the
server has completed the query. You must still call async_status
to
fetch the results.
async_query
: true if query was successfully sent (an invalid query
will still return true)
async_status
: a results status object, possibly indicating an
invalid query
is_busy
: a boolean
In practice, you will be much better off using cursor
as that will usually return very quickly even for large queries, and has
the advantage of retrieving the results in chunks. You can call cancel
while a cursor is active. The cursor will return PGRES_FATAL_ERROR
if
the cancel
is effective. Alternately, issuing any query that sets the
result status will have the same effect as finish_async
.
Timothy H. Keitt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | ## Not run:
# create a database
createdb("rpgtesting")
connect("rpgtesting")
begin()
# write data frame contents
data(mtcars)
write_table(mtcars)
# async processing on smallish result
# this wont be interesting if your machine is very fast
async_query("SELECT a.* FROM mtcars a, mtcars b")
repeat
{
status = async_status()
if ( status != "BUSY" ) break
cat("busy...\n")
Sys.sleep(1)
}
print(status)
head(fetch())
finish_async()
Sys.sleep(1)
# async processing on larger result
async_query("SELECT a.* FROM mtcars a, mtcars b, mtcars c")
count = 0
repeat
{
status = async_status()
if ( status == "BUSY" )
{
if ( count > 2 )
{
cat("calling cancel...\n")
cancel()
}
}
else break
cat("busy... \n")
Sys.sleep(1)
count = count + 1
}
print(status)
finish_async()
# you can run multiple queries with async_query
rollback(); begin()
write_table(mtcars)
sql1 = "SELECT mpg FROM mtcars LIMIT 3"
sql2 = "SELECT cyl FROM mtcars LIMIT 4"
async_query(paste(sql1, sql2, sep = "; "))
while ( async_status() == "BUSY" ) NULL
fetch()
while ( is_busy() ) NULL
async_status()
fetch()
finish_async()
# issue an async query and come back later
async_query(sql1)
push_conn()
connect("rpgtesting")
# fails because of transaction isolation
fetch(sql2)
pop_conn()
async_status()
# results from sql1
fetch()
# this is automatic if you issue new queries
finish_async()
# cleanup
rollback()
disconnect()
dropdb("rpgtesting")
## End(Not run)
|
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.