Listing 4
// Listing 4. Structures and methods for the Database type
typedef struct
{
/* Header */
PyObject_HEAD
/* Database specific information */
ORJDatabase_holder *dbh;
ORJDatabase const *database;
char *path;
openrj_RecordObject **records;
} openrj_Database;
static openrj_Database *
openrj_Database_alloc(PyObject *self, ORJDatabase const *database
, char const *path);
static void openrj_Database_dealloc(openrj_Database *self);
static int openrj_Database_print(openrj_Database *self
, FILE *file, int flags);
static PyObject *openrj_Database_getattr( openrj_Database *self
, char const *name);
static PyObject *openrj_Database_path(openrj_Database *self);
static PyObject *openrj_Database_records(openrj_Database *self);
static PyObject *openrj_Database_numRecords(openrj_Database *self);
static PyObject *openrj_Database_numFields(openrj_Database *self);
static PyObject *openrj_Database_numLines(openrj_Database *self);
static int openrj_Database_length(openrj_Database *self);
static PyObject *openrj_Database_item(openrj_Database *self, int index);
static PyObject *openrj_Database_slice(openrj_Database *self,int from,int to);
static struct PyMethodDef openrj_Database_methods[] =
{
{ "path", openrj_Database_path
, METH_NOARGS, "The path of the database" }
, { "records", openrj_Database_records
, METH_NOARGS, "A tuple of all the records in the database" }
, { "numRecords", openrj_Database_numRecords
, METH_NOARGS, "The number of records in the database" }
, { "numFields", openrj_Database_numFields
, METH_NOARGS, "The number of fields in the database" }
, { "numLines", openrj_Database_numLines
, METH_NOARGS, "The number of lines in the database" }
, { NULL, NULL
, 0, NULL }
};
static PySequenceMethods openrj_Database_as_sequence =
{
(inquiry)openrj_Database_length /* sq_length "len(x)" */
, (binaryfunc)0 /* sq_concat "x + y" */
, (intargfunc)0 /* sq_repeat "x * n" */
, (intargfunc)openrj_Database_item /* sq_item "x[i], in" */
, (intintargfunc)openrj_Database_slice /* sq_slice "x[i:j]" */
, (intobjargproc)0 /* sq_ass_item "x[i] = v" */
, (intintobjargproc)0 /* sq_ass_slice "x[i:j]=v" */
, (objobjproc)0 /* sq_contains */
, (binaryfunc)0 /* sq_inplace_concat */
, (intargfunc)0 /* sq_inplace_repeat */
};
static PyTypeObject openrj_Database_Type =
{
PyObject_HEAD_INIT(NULL)
0
, "Database"
, sizeof(openrj_Database)
, 0
, (destructor) openrj_Database_dealloc /* tp_dealloc */
, (printfunc) openrj_Database_print /* tp_print */
, (getattrfunc) openrj_Database_getattr /* tp_getattr */
, 0 /* tp_setattr */
, 0 /* tp_compare */
, 0 /* tp_repr */
, 0 /* tp_as_number */
, &openrj_Database_as_sequence /* tp_as_sequence */
, 0 /* tp_as_mapping */
, 0 /* tp_hash */
, 0 /* tp_call */
, 0 /* tp_str */
, 0 /* tp_getattro */
, 0 /* tp_setattro */
, 0 /* tp_as_buffer */
, 0 /* tp_flags */
, 0 /* tp_doc */
, 0 /* tp_traverse */
, 0 /* tp_clear */
, 0 /* tp_richcompare */
, 0 /* tp_weaklistoffset */
, 0 /* tp_iter */
, 0 /* tp_iternext */
, 0 /* tp_methods */
, 0 /* tp_members */
, 0 /* tp_getset */
, 0 /* tp_base */
, 0 /* tp_dict */
, 0 /* tp_descr_get */
, 0 /* tp_descr_set */
, 0 /* tp_dictoffset */
, 0 /* tp_init */
, 0 /* tp_alloc */
, 0 /* tp_new */
, 0 /* tp_free */
, 0 /* tp_is_gc */
, 0 /* tp_bases */
, 0 /* tp_mro */
, 0 /* tp_cache */
, 0 /* tp_subclasses */
, 0 /* tp_weaklist */
#ifdef COUNT_ALLOCS
, 0 /* tp_allocs */
, 0 /* tp_frees */
, 0 /* tp_maxalloc */
, 0 /* tp_next */
#endif /* COUNT_ALLOCS */
};