old_contents: """A wait callback to allow psycopg2 cooperation with eventlet.
  
  Use `make_psycopg_green()` to enable eventlet support in Psycopg.
  """
  
  # Copyright (C) 2010 Daniele Varrazzo <daniele.varrazzo@gmail.com>
  # and licensed under the MIT license:
  #
  # Permission is hereby granted, free of charge, to any person obtaining a copy
  # of this software and associated documentation files (the "Software"), to deal
  # in the Software without restriction, including without limitation the rights
  # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  # copies of the Software, and to permit persons to whom the Software is
  # furnished to do so, subject to the following conditions:
  #
  # The above copyright notice and this permission notice shall be included in
  # all copies or substantial portions of the Software.
  #
  # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  # THE SOFTWARE.
  
  import psycopg2
  from psycopg2 import extensions
  
  from guv.hubs import trampoline
  
  
  def make_psycopg_green():
      """Configure Psycopg to be used with guv in non-blocking way."""
      if not hasattr(extensions, 'set_wait_callback'):
          raise ImportError(
              "support for coroutines not available in this Psycopg version (%s)"
              % psycopg2.__version__)
  
      extensions.set_wait_callback(eventlet_wait_callback)
  
  
  def eventlet_wait_callback(conn, timeout=-1):
      """A wait callback useful to allow guv to work with Psycopg."""
      while 1:
          state = conn.poll()
          if state == extensions.POLL_OK:
              break
          elif state == extensions.POLL_READ:
              trampoline(conn.fileno(), read=True)
          elif state == extensions.POLL_WRITE:
              trampoline(conn.fileno(), write=True)
          else:
              raise psycopg2.OperationalError(
                  "Bad result from poll: %r" % state)
  
new_contents: """A wait callback to allow psycopg2 cooperation with guv
  
  Use :func:`make_psycopg_green()` to enable guv support in psycopg2.
  """
  
  import psycopg2
  from psycopg2 import extensions
  
  from ..hubs import trampoline
  from ..const import READ, WRITE
  
  
  def psycopg2_wait_cb(conn, timeout=-1):
      """A wait callback to trigger a yield while waiting for the database to respond
      """
      while True:
          state = conn.poll()
          if state == extensions.POLL_OK:
              break
          elif state == extensions.POLL_READ:
              trampoline(conn.fileno(), READ)
          elif state == extensions.POLL_WRITE:
              trampoline(conn.fileno(), WRITE)
          else:
              raise psycopg2.OperationalError('Bad result from poll: {}'.format(state))
  
  
  def make_psycopg_green():
      """Configure psycopg2 to call our wait function
      """
      if not hasattr(extensions, 'set_wait_callback'):
          raise ImportError('support for coroutines not available in this psycopg version ({})'
                            .format(psycopg2.__version__))
  
      extensions.set_wait_callback(psycopg2_wait_cb)
  
  
subject: Rework psycopg2 support