PostgreSQL database adapter for the Python programming language
Go to file
Greg Ward ac14957fbb Always detect when a connection is closed behind psycopg2's back.
There's a race condition that only seems to happen over Unix-domain
sockets. Sometimes, the closed socket is reported by the kernel to
libpq like this (captured with strace):

  sendto(3, "Q\0\0\0\34select pg_backend_pid()\0", 29, MSG_NOSIGNAL, NULL, 0) = 29
  recvfrom(3, "E\0\0\0mSFATAL\0C57P01\0Mterminating "..., 16384, 0, NULL, NULL) = 110
  recvfrom(3, 0x12d0330, 16384, 0, 0, 0)  = -1 ECONNRESET (Connection reset by peer)

That is, psycopg2/libpq sees no error when sending the first query
after the connection is closed, but gets an error reading the result.
In that case, everything worked fine.

But sometimes, the error manifests like this:

  sendto(3, "Q\0\0\0\34select pg_backend_pid()\0", 29, MSG_NOSIGNAL, NULL, 0) = -1 EPIPE (Broken pipe)
  recvfrom(3, "E\0\0\0mSFATAL\0C57P01\0Mterminating "..., 16384, 0, NULL, NULL) = 110
  recvfrom(3, "", 16274, 0, NULL, NULL)   = 0
  recvfrom(3, "", 16274, 0, NULL, NULL)   = 0

i.e. libpq received an error when sending the query. This manifests as
a slightly different exception from a slightly different place. More
importantly, in this case connection.closed is left at 0 rather than
being set to 2, and that is the bug I'm fixing here.

Note that we see almost identical behaviour for sync and async
connections, and the fixes are the same. So I added extremely similar
test cases.

Finally, there is still a bug here: for async connections, we
sometimes raise DatabaseError (incorrect) and sometimes raise
OperationalError (correct). Will fix that next.
2016-06-28 17:46:21 -04:00
doc Improve sentence. 2016-03-10 12:07:38 +00:00
examples cleanup remaining GPL license text 2014-05-20 09:50:53 -07:00
lib Update psycopg1.py 2016-03-10 11:58:37 +00:00
psycopg Always detect when a connection is closed behind psycopg2's back. 2016-06-28 17:46:21 -04:00
sandbox cleanup remaining GPL license text 2014-05-20 09:42:41 -07:00
scripts Don't need to build the env for a sdist 2014-09-01 16:29:38 +01:00
tests Always detect when a connection is closed behind psycopg2's back. 2016-06-28 17:46:21 -04:00
.gitignore Added scripts to release and upload docs 2014-09-01 16:29:38 +01:00
.travis.yml Add .travis.yml for Travis CI (http://travis-ci.org/) 2012-06-15 08:07:19 -07:00
AUTHORS Preparing release 2.3.0-beta1 2010-11-06 15:50:39 +01:00
INSTALL Dropped content from the INSTALL file 2014-08-24 02:06:09 +01:00
LICENSE Changes license to LGPL3 + OpenSSL exception on all source files 2010-02-12 23:34:53 +01:00
Makefile Fixed 'make sdist' to work with setuptools 2016-03-08 04:34:12 +00:00
MANIFEST.in Fixed 'make sdist' to work with setuptools 2016-03-08 04:34:12 +00:00
NEWS Fixed read() exception propagation in copy_from 2016-03-08 05:12:06 +00:00
psycopg2.cproj Dropped outdated HACKING file 2014-08-24 02:06:09 +01:00
psycopg2.sln New 'withhold' parameter for connection.cursor() 2011-08-10 18:25:46 +02:00
README.rst Direct link to the install docs in the readme 2014-08-24 23:33:14 +01:00
setup.cfg Dropped HAVE_PQFREEMEM flag 2014-08-24 01:43:12 +01:00
setup.py Start advertising Py 3.5 support 2016-03-08 05:13:57 +00:00
tox.ini Dropped Zope support 2012-12-03 02:53:20 +00:00

psycopg2 - Python-PostgreSQL Database Adapter
=============================================

Psycopg is the most popular PostgreSQL database adapter for the Python
programming language.  Its main features are the complete implementation of
the Python DB API 2.0 specification and the thread safety (several threads can
share the same connection).  It was designed for heavily multi-threaded
applications that create and destroy lots of cursors and make a large number
of concurrent "INSERT"s or "UPDATE"s.

Psycopg 2 is mostly implemented in C as a libpq wrapper, resulting in being
both efficient and secure.  It features client-side and server-side cursors,
asynchronous communication and notifications, "COPY TO/COPY FROM" support.
Many Python types are supported out-of-the-box and adapted to matching
PostgreSQL data types; adaptation can be extended and customized thanks to a
flexible objects adaptation system.

Psycopg 2 is both Unicode and Python 3 friendly.


Documentation
-------------

Documentation is included in the 'doc' directory and is `available online`__.

.. __: http://initd.org/psycopg/docs/


Installation
------------

If all the dependencies are met (i.e. you have the Python and libpq
development packages installed in your system) the standard::

    python setup.py build
    sudo python setup.py install

should work no problem.  In case you have any problem check the 'install' and
the 'faq' documents in the docs or online__.

.. __: http://initd.org/psycopg/docs/install.html

For any other resource (source code repository, bug tracker, mailing list)
please check the `project homepage`__.

.. __: http://initd.org/psycopg/