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; }