Extend database memory by adding a memory device within a transaction.
MCO_RET mco_db_extend_dev_t( /*IN*/ mco_trans_h t,
/*IN*/ mco_device_t * dev );
| t | The current transaction handle |
| dev | The device(s) to be added |
This function extends the available database memory by adding the specified memory device. Note that whereas
mco_db_extend_dev()must be called outside any transaction,mco_db_extend_dev_t()must be called with aREAD_WRITEtransaction. Typically it is used when a database write operation fails due to low memory.
Application snippet:
const char * dbname = "SimpleDb";
int main(int argc, char* argv[])
{
mco_db_h db;
MCO_RET rc;
char *mem = malloc( DBSIZE );
uint4 total_pages;
uint4 free_pages;
if( (rc = mco_runtime_start()) != MCO_S_OK)
exit(-1);
rc = mco_db_open( dbname, simpledb_get_dictionary(), mem, DBSIZE, (uint2)PAGESIZE );
...
rc = mco_db_connect(dbname, &db);
...
/* If low memory situation detected (see "Auxiliary APIs: Statistics") */
mco_db_free_pages(db, &freepages);
mco_db_total_pages(db, &totalpages );
if(freepages < totalpages / 10)
{
// yes. Extend the database
rc = mco_trans_start(db, MCO_READ_WRITE, MCO_TRANS_FOREGROUND, &t);
while ( MAX_SEGMENTS > n_segments )
{
dev[n_segments].type = MCO_MEMORY_CONV;
dev[n_segments].assignment = MCO_MEMORY_ASSIGN_DATABASE;
dev[n_segments].size = SEGMENT_SIZE;
dev[n_segments].dev.conv.ptr = (void*)malloc( SEGMENT_SIZE );
rc = mco_db_extend_dev_t(t, &dev[n_segments]);
if ( MCO_S_OK != rc ) break; /* if extend failed exit loop */
n_segments++;
}
if ( MCO_S_OK != rc )
mco_trans_rollback();
else
mco_trans_commit();
...
}
}