source: trunk/pgnotice.c

Last change on this file was 1002, checked in by cito, 7 months ago

Use same prefix for all C files

So that they are not scattered among the other files
in the root directory.

File size: 3.9 KB
Line 
1/*
2 * $Id: pgnotice.c 985 2019-04-22 22:07:43Z cito $
3 *
4 * PyGreSQL - a Python interface for the PostgreSQL database.
5 *
6 * The notice object - this file is part a of the C extension module.
7 *
8 * Copyright (c) 2019 by the PyGreSQL Development Team
9 *
10 * Please see the LICENSE.TXT file for specific restrictions.
11 *
12 */
13
14/* Get notice object attributes. */
15static PyObject *
16notice_getattr(noticeObject *self, PyObject *nameobj)
17{
18    PGresult const *res = self->res;
19    const char *name = PyStr_AsString(nameobj);
20    int fieldcode;
21
22    if (!res) {
23        PyErr_SetString(PyExc_TypeError, "Cannot get current notice");
24        return NULL;
25    }
26
27    /* pg connection object */
28    if (!strcmp(name, "pgcnx")) {
29        if (self->pgcnx && _check_cnx_obj(self->pgcnx)) {
30            Py_INCREF(self->pgcnx);
31            return (PyObject *) self->pgcnx;
32        }
33        else {
34            Py_INCREF(Py_None);
35            return Py_None;
36        }
37    }
38
39    /* full message */
40    if (!strcmp(name, "message")) {
41        return PyStr_FromString(PQresultErrorMessage(res));
42    }
43
44    /* other possible fields */
45    fieldcode = 0;
46    if (!strcmp(name, "severity"))
47        fieldcode = PG_DIAG_SEVERITY;
48    else if (!strcmp(name, "primary"))
49        fieldcode = PG_DIAG_MESSAGE_PRIMARY;
50    else if (!strcmp(name, "detail"))
51        fieldcode = PG_DIAG_MESSAGE_DETAIL;
52    else if (!strcmp(name, "hint"))
53        fieldcode = PG_DIAG_MESSAGE_HINT;
54    if (fieldcode) {
55        char *s = PQresultErrorField(res, fieldcode);
56        if (s) {
57            return PyStr_FromString(s);
58        }
59        else {
60            Py_INCREF(Py_None); return Py_None;
61        }
62    }
63
64    return PyObject_GenericGetAttr((PyObject *) self, nameobj);
65}
66
67/* Get the list of notice attributes. */
68static PyObject *
69notice_dir(noticeObject *self, PyObject *noargs)
70{
71    PyObject *attrs;
72
73    attrs = PyObject_Dir(PyObject_Type((PyObject *) self));
74    PyObject_CallMethod(
75        attrs, "extend", "[ssssss]",
76        "pgcnx", "severity", "message", "primary", "detail", "hint");
77
78    return attrs;
79}
80
81/* Return notice as string in human readable form. */
82static PyObject *
83notice_str(noticeObject *self)
84{
85    return notice_getattr(self, PyBytes_FromString("message"));
86}
87
88/* Notice object methods */
89static struct PyMethodDef notice_methods[] = {
90    {"__dir__", (PyCFunction) notice_dir,  METH_NOARGS, NULL},
91    {NULL, NULL}
92};
93
94static char notice__doc__[] = "PostgreSQL notice object";
95
96/* Notice type definition */
97static PyTypeObject noticeType = {
98    PyVarObject_HEAD_INIT(NULL, 0)
99    "pg.Notice",                    /* tp_name */
100    sizeof(noticeObject),           /* tp_basicsize */
101    0,                              /* tp_itemsize */
102    /* methods */
103    0,                              /* tp_dealloc */
104    0,                              /* tp_print */
105    0,                              /* tp_getattr */
106    0,                              /* tp_setattr */
107    0,                              /* tp_compare */
108    0,                              /* tp_repr */
109    0,                              /* tp_as_number */
110    0,                              /* tp_as_sequence */
111    0,                              /* tp_as_mapping */
112    0,                              /* tp_hash */
113    0,                              /* tp_call */
114    (reprfunc) notice_str,          /* tp_str */
115    (getattrofunc) notice_getattr,  /* tp_getattro */
116    PyObject_GenericSetAttr,        /* tp_setattro */
117    0,                              /* tp_as_buffer */
118    Py_TPFLAGS_DEFAULT,             /* tp_flags */
119    notice__doc__,                  /* tp_doc */
120    0,                              /* tp_traverse */
121    0,                              /* tp_clear */
122    0,                              /* tp_richcompare */
123    0,                              /* tp_weaklistoffset */
124    0,                              /* tp_iter */
125    0,                              /* tp_iternext */
126    notice_methods,                 /* tp_methods */
127};
Note: See TracBrowser for help on using the repository browser.