Added Diagnostics.severity_nonlocalized attribute

Close #783.
This commit is contained in:
Daniele Varrazzo 2018-10-04 16:13:46 +01:00
parent 9d83b03605
commit 4e0b2ec9c9
4 changed files with 29 additions and 4 deletions

2
NEWS
View File

@ -13,6 +13,8 @@ New features:
(:ticket:`#773`). (:ticket:`#773`).
- `~psycopg2.extras.DictCursor` and `~psycopg2.extras.RealDictCursor` rows - `~psycopg2.extras.DictCursor` and `~psycopg2.extras.RealDictCursor` rows
maintain columns order (:ticket:`#177`). maintain columns order (:ticket:`#177`).
- Added `!severity_nonlocalized` attribute on the
`~psycopg2.extensions.Diagnostics` object (:ticket:`#783`).
Other changes: Other changes:

View File

@ -186,6 +186,7 @@ introspection etc.
message_primary message_primary
schema_name schema_name
severity severity
severity_nonlocalized
source_file source_file
source_function source_function
source_line source_line
@ -198,6 +199,9 @@ introspection etc.
not all the fields are available for all the errors and for all the not all the fields are available for all the errors and for all the
server versions. server versions.
.. versionadded:: 2.8
The `!severity_nonlocalized` attribute.
.. _sql-adaptation-objects: .. _sql-adaptation-objects:

View File

@ -29,8 +29,11 @@
#include "psycopg/diagnostics.h" #include "psycopg/diagnostics.h"
#include "psycopg/error.h" #include "psycopg/error.h"
/* These are new in PostgreSQL 9.3. Defining them here so that psycopg2 can
* use them with a 9.3+ server even if compiled against pre-9.3 headers. */ /* These constants are defined in src/include/postgres_ext.h but some may not
* be available with the libpq we currently support at compile time. */
/* Available from PG 9.3 */
#ifndef PG_DIAG_SCHEMA_NAME #ifndef PG_DIAG_SCHEMA_NAME
#define PG_DIAG_SCHEMA_NAME 's' #define PG_DIAG_SCHEMA_NAME 's'
#endif #endif
@ -47,6 +50,11 @@
#define PG_DIAG_CONSTRAINT_NAME 'n' #define PG_DIAG_CONSTRAINT_NAME 'n'
#endif #endif
/* Available from PG 9.6 */
#ifndef PG_DIAG_SEVERITY_NONLOCALIZED
#define PG_DIAG_SEVERITY_NONLOCALIZED 'V'
#endif
/* Retrieve an error string from the exception's cursor. /* Retrieve an error string from the exception's cursor.
* *
@ -70,6 +78,8 @@ psyco_diagnostics_get_field(diagnosticsObject *self, void *closure)
static struct PyGetSetDef diagnosticsObject_getsets[] = { static struct PyGetSetDef diagnosticsObject_getsets[] = {
{ "severity", (getter)psyco_diagnostics_get_field, NULL, { "severity", (getter)psyco_diagnostics_get_field, NULL,
NULL, (void*) PG_DIAG_SEVERITY }, NULL, (void*) PG_DIAG_SEVERITY },
{ "severity_nonlocalized", (getter)psyco_diagnostics_get_field, NULL,
NULL, (void*) PG_DIAG_SEVERITY_NONLOCALIZED },
{ "sqlstate", (getter)psyco_diagnostics_get_field, NULL, { "sqlstate", (getter)psyco_diagnostics_get_field, NULL,
NULL, (void*) PG_DIAG_SQLSTATE }, NULL, (void*) PG_DIAG_SQLSTATE },
{ "message_primary", (getter)psyco_diagnostics_get_field, NULL, { "message_primary", (getter)psyco_diagnostics_get_field, NULL,

View File

@ -173,8 +173,8 @@ class ExceptionsTestCase(ConnectingTestCase):
'column_name', 'constraint_name', 'context', 'datatype_name', 'column_name', 'constraint_name', 'context', 'datatype_name',
'internal_position', 'internal_query', 'message_detail', 'internal_position', 'internal_query', 'message_detail',
'message_hint', 'message_primary', 'schema_name', 'severity', 'message_hint', 'message_primary', 'schema_name', 'severity',
'source_file', 'source_function', 'source_line', 'sqlstate', 'severity_nonlocalized', 'source_file', 'source_function',
'statement_position', 'table_name', ]: 'source_line', 'sqlstate', 'statement_position', 'table_name', ]:
v = getattr(diag, attr) v = getattr(diag, attr)
if v is not None: if v is not None:
self.assert_(isinstance(v, str)) self.assert_(isinstance(v, str))
@ -276,6 +276,15 @@ class ExceptionsTestCase(ConnectingTestCase):
self.assertEqual(e.diag.constraint_name, "chk_eq1") self.assertEqual(e.diag.constraint_name, "chk_eq1")
self.assertEqual(e.diag.datatype_name, None) self.assertEqual(e.diag.datatype_name, None)
@skip_before_postgres(9, 6)
def test_9_6_diagnostics(self):
cur = self.conn.cursor()
try:
cur.execute("select 1 from nosuchtable")
except psycopg2.Error as exc:
e = exc
self.assertEqual(e.diag.severity_nonlocalized, 'ERROR')
def test_pickle(self): def test_pickle(self):
import pickle import pickle
cur = self.conn.cursor() cur = self.conn.cursor()