Statistics
| Branch: | Tag: | Revision:

root / snf-common / synnefo / lib / db / psyco_gevent.py @ ab133e68

History | View | Annotate | Download (2.2 kB)

1 e83ed1fb Vangelis Koukis
# Copyright (C) 2010 Daniele Varrazzo <daniele.varrazzo@gmail.com>
2 e83ed1fb Vangelis Koukis
# and licensed under the MIT license:
3 e83ed1fb Vangelis Koukis
#
4 e83ed1fb Vangelis Koukis
# Permission is hereby granted, free of charge, to any person obtaining a copy
5 e83ed1fb Vangelis Koukis
# of this software and associated documentation files (the "Software"), to deal
6 e83ed1fb Vangelis Koukis
# in the Software without restriction, including without limitation the rights
7 e83ed1fb Vangelis Koukis
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 e83ed1fb Vangelis Koukis
# copies of the Software, and to permit persons to whom the Software is
9 e83ed1fb Vangelis Koukis
# furnished to do so, subject to the following conditions:
10 e83ed1fb Vangelis Koukis
#
11 e83ed1fb Vangelis Koukis
# The above copyright notice and this permission notice shall be included in
12 e83ed1fb Vangelis Koukis
# all copies or substantial portions of the Software.
13 e83ed1fb Vangelis Koukis
#
14 e83ed1fb Vangelis Koukis
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 e83ed1fb Vangelis Koukis
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 e83ed1fb Vangelis Koukis
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 e83ed1fb Vangelis Koukis
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 e83ed1fb Vangelis Koukis
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 e83ed1fb Vangelis Koukis
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 e83ed1fb Vangelis Koukis
# THE SOFTWARE.
21 e83ed1fb Vangelis Koukis
"""A wait callback to allow psycopg2 cooperation with gevent.
22 e83ed1fb Vangelis Koukis

23 e83ed1fb Vangelis Koukis
Use `make_psycopg_green()` to enable gevent support in Psycopg.
24 e83ed1fb Vangelis Koukis

25 e83ed1fb Vangelis Koukis
"""
26 e83ed1fb Vangelis Koukis
27 e83ed1fb Vangelis Koukis
import psycopg2
28 e83ed1fb Vangelis Koukis
from psycopg2 import extensions
29 e83ed1fb Vangelis Koukis
30 e83ed1fb Vangelis Koukis
from gevent.socket import wait_read, wait_write
31 e83ed1fb Vangelis Koukis
32 e83ed1fb Vangelis Koukis
33 e83ed1fb Vangelis Koukis
def make_psycopg_green():
34 e83ed1fb Vangelis Koukis
    """Configure Psycopg to be used with gevent in non-blocking way."""
35 e83ed1fb Vangelis Koukis
    if not hasattr(extensions, 'set_wait_callback'):
36 e83ed1fb Vangelis Koukis
        raise ImportError(
37 e83ed1fb Vangelis Koukis
            "support for coroutines not available in this Psycopg version (%s)"
38 e83ed1fb Vangelis Koukis
            % psycopg2.__version__)
39 e83ed1fb Vangelis Koukis
40 e83ed1fb Vangelis Koukis
    extensions.set_wait_callback(gevent_wait_callback)
41 e83ed1fb Vangelis Koukis
42 e83ed1fb Vangelis Koukis
43 e83ed1fb Vangelis Koukis
def gevent_wait_callback(conn, timeout=None):
44 e83ed1fb Vangelis Koukis
    """A wait callback useful to allow gevent to work with Psycopg."""
45 e83ed1fb Vangelis Koukis
    while 1:
46 e83ed1fb Vangelis Koukis
        state = conn.poll()
47 e83ed1fb Vangelis Koukis
        if state == extensions.POLL_OK:
48 e83ed1fb Vangelis Koukis
            break
49 e83ed1fb Vangelis Koukis
        elif state == extensions.POLL_READ:
50 e83ed1fb Vangelis Koukis
            wait_read(conn.fileno(), timeout=timeout)
51 e83ed1fb Vangelis Koukis
        elif state == extensions.POLL_WRITE:
52 e83ed1fb Vangelis Koukis
            wait_write(conn.fileno(), timeout=timeout)
53 e83ed1fb Vangelis Koukis
        else:
54 e83ed1fb Vangelis Koukis
            raise psycopg2.OperationalError("Bad result from poll: %r" % state)