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) |