A C application can extend the amount of memory for use by a database by calling
mco_db_extend_dev()
to add a new memory device. The following code snippet demonstrates the recommended way for C applications to extend a database:int extend_db_memory(const char * dbname) { MCO_RET rc; int size = 1*1024*1024; mco_device_t extdev; /* set extended memory region parameters */ extdev.type = MCO_MEMORY_CONV; extdev.assignment = MCO_MEMORY_ASSIGN_DATABASE; extdev.size = size; extdev.dev.conv.ptr = (void*)malloc( extdev.size ); if ( mco_db_extend_dev( dbname, &extdev ) == MCO_OK ) { /* the database RAM pool has been successfully increased */ ... } return rc; }The structure member
mco_runtime_info_t.max_extends
holds the maximum number of database extensions allowed (generally only applicable to databases in shared memory). Its value is -1 (which means "unlimited") for databases in conventional memory and persistent databases.Backward-compatibility
For backward compatibility, the old-style
mco_db_extend()
API used in previous versions (prior to 4.0) of eXtremeDB is also provided to extend an all-in-memory database (but not a shared memory database) as illustrated in the following code snippet:int extend_db_memory(const char * dbname) { MCO_RET rc; int size = 1*1024*1024; void * memory = malloc( size ); if ( mco_db_extend( dbname, memory, size ) == MCO_OK ) { /* the database memory size was increased */ ... } return rc; }Extending memory from within a transaction
If database memory needs to be extended from within a transaction, for example when a write operation fails due to not enough memory, use the following alternate versions:
MCO_RET mco_db_extend_dev_t( /*IN*/ mco_trans_h t, /*IN*/ mco_device_t * dev );or
MCO_RET mco_db_extend_t( /*IN*/ mco_trans_h t, /*IN*/ void *start_ptr, /*IN*/ uint4 size );passing the current active transaction handle.