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