root / snf-common / synnefo / lib / db / psyco_gevent.py @ ab133e68
History | View | Annotate | Download (2.2 kB)
1 |
# Copyright (C) 2010 Daniele Varrazzo <daniele.varrazzo@gmail.com>
|
---|---|
2 |
# and licensed under the MIT license:
|
3 |
#
|
4 |
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
5 |
# of this software and associated documentation files (the "Software"), to deal
|
6 |
# in the Software without restriction, including without limitation the rights
|
7 |
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8 |
# copies of the Software, and to permit persons to whom the Software is
|
9 |
# furnished to do so, subject to the following conditions:
|
10 |
#
|
11 |
# The above copyright notice and this permission notice shall be included in
|
12 |
# all copies or substantial portions of the Software.
|
13 |
#
|
14 |
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15 |
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
16 |
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
17 |
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
18 |
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
19 |
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
20 |
# THE SOFTWARE.
|
21 |
"""A wait callback to allow psycopg2 cooperation with gevent.
|
22 |
|
23 |
Use `make_psycopg_green()` to enable gevent support in Psycopg.
|
24 |
|
25 |
"""
|
26 |
|
27 |
import psycopg2 |
28 |
from psycopg2 import extensions |
29 |
|
30 |
from gevent.socket import wait_read, wait_write |
31 |
|
32 |
|
33 |
def make_psycopg_green(): |
34 |
"""Configure Psycopg to be used with gevent in non-blocking way."""
|
35 |
if not hasattr(extensions, 'set_wait_callback'): |
36 |
raise ImportError( |
37 |
"support for coroutines not available in this Psycopg version (%s)"
|
38 |
% psycopg2.__version__) |
39 |
|
40 |
extensions.set_wait_callback(gevent_wait_callback) |
41 |
|
42 |
|
43 |
def gevent_wait_callback(conn, timeout=None): |
44 |
"""A wait callback useful to allow gevent to work with Psycopg."""
|
45 |
while 1: |
46 |
state = conn.poll() |
47 |
if state == extensions.POLL_OK:
|
48 |
break
|
49 |
elif state == extensions.POLL_READ:
|
50 |
wait_read(conn.fileno(), timeout=timeout) |
51 |
elif state == extensions.POLL_WRITE:
|
52 |
wait_write(conn.fileno(), timeout=timeout) |
53 |
else:
|
54 |
raise psycopg2.OperationalError("Bad result from poll: %r" % state) |