mco_db_open_dev
接口适用于实时数据库 RT 。
在指定的设备上创建数据库。
此函数会根据参数 params
中指定的参数,在由 devs
定义的设备上创建名为 dbname
的数据库。
注
有关内存设备结构 devs
的详细描述,请参阅 mco_device_t
;
有关数据库参数 params
的详细描述,请参阅 mco_db_params_t
。
MCO_RET mco_db_open_dev(
/*IN*/ const char * dbname,
/*IN*/ mco_dictionary_h dict,
/*IN*/ mco_device_t * devs,
/*IN*/ mco_size_t n_devs,
/*IN*/ mco_db_params_t * params
);
参数
dbname
const char *
要打开的数据库名称。从declare database dbname
”DDL 语句中获取。数据库名称的最大长度为 16 个字符。
dict
mco_dictionary_h
由模式编译器 mcocomp 创建的字典的句柄。通常,此句柄由 dbname_get_dictionary()
传递进来。
devs
mco_device_t *
存储设备(mco_device_t
类型的数组)。
n_devs
mco_size_t
数组“devs
”中的设备规格数量。
params
mco_db_params_t *
数据库规范参数。
返回
MCO_S_OK
已成功创建/打开数据库。
MCO_E_ILLEGAL_PARAM
非法组合数据库参数。数据库没有内存段,或者数据库没有持久段或缓存段。
MCO_E_NOMEM
未分配足够的内存。(例如,没有足够的内存来创建索引)
MCO_E_INSTANCE_DUPLICATE
重复的数据库实例,即尝试打开与当前打开的数据库同名的数据库。
MCO_E_SHM_ERROR
尝试创建、截断或关闭共享内存段时出错。
MCO_E_INMEM_ONLY_RUNTIME
数据库字典包含持久对象,但应用程序与内存中运行时库链接。
MCO_ERR_DB_NAMELONG
数据库名称长度超过 16 个字符。
MCO_E_DISK_INVALID_PARAM
磁盘数据库创建参数无效。
MCO_E_DISK_ALREADY_OPENED
指定的磁盘设备已打开。
示例
以下示例代码演示了如何定义内存设备和数据库参数并调用全内存数据库:
/* 应用程序代码片段 */
/* 全内存示例 */
#define DATABASE_SEGMENT_SIZE 16 * 1024 * 1024
#define MEMORY_PAGE_SIZE 128
const char * dbname = "convdb";
int main(int argc, char* argv[])
{
MCO_RET rc;
mco_device_t dev;
mco_db_params_t db_params;
mco_runtime_start();
/* 将内存设备设置为普通的常规内存区域 */
dev.type = MCO_MEMORY_CONV; /* 常规内存 */
dev.assignment = MCO_MEMORY_ASSIGN_DATABASE; /* 主数据库内存*/
dev.size = DATABASE_SEGMENT_SIZE; /* 设备大小 */
dev.dev.conv.ptr = (void*)malloc( DATABASE_SEGMENT_SIZE );
if( !dev.dev.conv.ptr ) exit;
/* 初始化并自定义数据库参数 */
mco_db_params_init ( &db_params ); /* 使用默认值初始化 */
db_params.mem_page_size = MEMORY_PAGE_SIZE; /* 内存中部分 */
db_params.disk_page_size = 0; /* 禁用磁盘操作 */
db_params.db_max_connections = 1; /* 数据库的总连接数 */
/* 使用给定的参数在设备上打开一个数据库 */
rc = mco_db_open_dev(dbname, convdb_get_dictionary(), &dev, 1, &db_params );
...
}
下一个示例代码演示了如何定义内存设备和数据库参数并调用持久数据库:
/* 应用程序代码片段 */
/* 持久化数据库示例 */
#define MEMORY_PAGE_SIZE 128
#define DISK_PAGE_SIZE 128
#define DB_LOG_TYPE REDO_LOG
#define REDO_LOG_SIZE ( 2 * 1024 * 1024 )
const char * dbname = "diskdb";
int main(int argc, char* argv[])
{
MCO_RET rc;
mco_device_t dev[4];
mco_db_params_t db_params;
dev[0].type = MCO_MEMORY_CONV;
dev[0].assignment = MCO_MEMORY_ASSIGN_DATABASE;
dev[0].size = DATABASE_SEGMENT_SIZE;
dev[1].type = MCO_MEMORY_CONV;
dev[1].assignment = MCO_MEMORY_ASSIGN_CACHE;
dev[1].size = CACHE_SEGMENT_SIZE;
dev[2].type = MCO_MEMORY_FILE;
dev[2].assignment = MCO_MEMORY_ASSIGN_PERSISTENT;
sprintf( dev[2].dev.file.name, FILE_PREFIX "%s.dbs", dbname );
dev[2].dev.file.flags = MCO_FILE_OPEN_DEFAULT;
dev[3].type = MCO_MEMORY_FILE;
dev[3].assignment = MCO_MEMORY_ASSIGN_LOG;
sprintf( dev[3].dev.file.name, FILE_PREFIX "%s.log", dbname );
dev[3].dev.file.flags = MCO_FILE_OPEN_DEFAULT;
/* 为数据库和缓存分配内存 */
dev[0].dev.conv.ptr = (void*)malloc( DATABASE_SEGMENT_SIZE );
if( !dev[0].dev.conv.ptr ) exit;
dev[1].dev.conv.ptr = (void*)malloc( CACHE_SEGMENT_SIZE );
if( !dev[1].dev.conv.ptr ) exit;
/* 设置默认数据库参数 */
mco_db_params_init ( &db_params );
/* customize the parameters */
db_params.mem_page_size = MEMORY_PAGE_SIZE;
db_params.disk_page_size = DISK_PAGE_SIZE;
db_params.db_max_connections = 1;
db_params.disk_max_database_size = MAXIMUM_DATABASE_SIZE;
db_params.db_log_type = DB_LOG_TYPE;
db_params.log_params.redo_log_limit = REDO_LOG_SIZE;
rc = mco_db_open_dev( dbname , diskdb_get_dictionary(), dev, sizeof(dev)/sizeof(dev[0]), &db_params );
...
}