mco_db_extend_dev_ctx
接口适用于实时数据库 RT 。
通过添加内存设备来扩展数据库内存。
MCO_RET mco_db_extend_dev_ctx(
/*IN*/ mco_trans_h t,
/*IN*/ mco_device_t * dev,
/*IN*/ void const* ctx
);
参数
t
mco_trans_h
当前事务句柄。
dev
mco_device_t
要添加的设备。
ctx
void const*
数据库上下文数据的地址,或者调用 mco_db_connection_context()
函数,该函数返回与现有数据库连接相关联的上下文的地址。
返回
MCO_S_OK
已成功扩展数据库内存。
MCO_E_NOINSTANCE
指定的数据库未打开。
MCO_ERR_TRN
发生数据库事务错误。(例如。数据库已经被具有打开事务的其他线程打开.)。
MCO_E_ILLEGAL_PARAM
如果设备大小过小则返回。最小大小取决于运行时配置和硬件架构。在 x64 平台上且配置为 100 个连接(默认值)时,最小大小略超过 1K(1104 字节)。
示例
/* 应用程序代码片段 */
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);
...
/* 检测到内存不足的情况 */
mco_db_free_pages(db, &freepages);
mco_db_total_pages(db, &totalpages );
if(freepages < totalpages / 10)
{
// 扩展数据库
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_ctx(t, &dev[n_segments], mco_db_connection_context());
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();
...
}
}
文件
- 头文件:
mco.h
- 源文件:
mcodb.c
- 库:
libmcolib.a