Listing 3
// Listing 3. Implementation of the openrj_Database_alloc
static openrj_Database *
openrj_Database_alloc(PyObject *self
, ORJDatabase const *database
, char const *jarName)
{
openrj_Database *db = PyObject_New( openrj_Database
, &openrj_Database_Type);
if(NULL == db)
{
PyErr_SetFromErrno(self);
}
else
{
size_t cbRecords = db->database->numRecords*sizeof(openrj_RecordObject*);
db->dbh = ORJDatabase_holder_create(database);
db->database = database;
db->jarName = strdup(jarName);
db->records = (openrj_RecordObject**)PyObject_Malloc(cbRecords);
db->fields = NULL;
if( NULL == db->jarName ||
NULL == db->records)
{
openrj_Database_dealloc(db);
PyErr_SetFromErrno(self);
db = NULL;
}
else
{
size_t n;
for(n = 0; n < db->database->numRecords; ++n)
{
db->records[n] = NULL;
}
for(n = 0; n < db->database->numRecords; ++n)
{
db->records[n] = openrj_Record_alloc(self
, &database->records[n], db->dbh);
if(NULL == db->records[n])
{
openrj_Database_dealloc(db);
db = NULL;
break;
}
}
}
}
return db;
}