简介:
eXtremeDB 是一款内存数据库产品。主要应用于嵌入式等实时系统中,可以提高软件的响应速度。具体请参见官方网站 http://www.mcobject.com.
它是一个对象型数据库,可以理解为,数据库中的每一行都是一个对象。
使用方法:
下面根据一个简单的例子,来说明eXtremeDB的使用方法。
1,编写数据库定义文件
利用任何文本编辑器,创建一个*.mco 文件,如下:
/*** Author : hehong* date :2010-11-22* Description: test eXtremeDB**/// signed 是 eXtremeDB 内置的数据类型,下面通过宏的形式,起一个便于记忆的名称。 #define int1 signed // 表示1个字节有符号 ,下面类推#define int2 signed#define int4 signed#define int8 signed#define uint8 unsigned#define uint4 unsigned#define uint2 unsigned#define uint1 unsigned
declare database testdb; //声明数据库的
class employeer //声明一个类,相当于关系型数据库中的表{ uint8 id; //开始声明表中的字段。 string name; int1 sex; int2 age;
unique tree IdxID; //用字段id 建立一个索引,可以用来进行查找};
2,在命令行下执行eXtremeDB 安装目录下的 mcocomp.exe
假设 上面的mco文件保存在 d:/testDB.mco 中
执行命令行 mcocomp.exe -x32 -hpp d:/testDB.mco
-32 表示操作系统使用的是32位
-hpp 表示生成c++ 方式的代码
执行后会生成如下3个文件:
testdb.c
testdb.h (c接口)
testdb.hpp (c++ 接口)
这些代码自动生成,对数据库的操作,就是利用接口文件中的各种函数来实现的
3,将上面生成的3个文件加入VC++ 工程
并设置要是有的eXtremeDB的lib文件,比如 mcolib.lib mcolib_shm.lib(这个版本支持共享内存)
4,编写代码实现内存数据库的常用功能,代码如下:详细请看注释
#include "stdafx.h"#include "mco.h"#include "testdb.h"#include #include #include "testdb.hpp"#include "mcospec.h"
static mco_db_h m_db_h; //数据库句柄 static mco_trans_h m_trans_h; //事务句柄 static mco_runtime_info_t m_runtime_info; //数据库运行时信息 static void* m_start_mem=0; //数据库内存地址 static const char* m_db_name="testDB"; //数据库名字
#define MAXTRANSSIZE 10000
const int dbSize = 20*1024*1024; //数据库大小 const int pageSize = 256;
static void InsertOne(int id,char* name,char sex,int age);static void FindOne(int id);static void Search1();static void Update1();static void Remove1(int id);
static void mco_my_error_handle(int errorCode){ printf("mco happen error,code=%d",errorCode);}
int _tmain(int argc, _TCHAR* argv[]){ MCO_RET ret;
//获取内存数据库运行时信息,根据性能来进行不同的处理
//runtime info 记录了当前内存数据库的功能上的一些信息,比如 是否支持共享内存等等。 mco_get_runtime_info(&m_runtime_info);
if(m_runtime_info.mco_shm_supported) { //如果支持共享内存,可以在这里使用共享内存 } else { m_start_mem = malloc(dbSize); if(m_start_mem == NULL) { printf("alloc memory fail./n"); return -1; } }
//设置错误处理函数 mco_error_set_handler(mco_my_error_handle);
//启动运行时,这个函数必须调用 ret = mco_runtime_start(); if(ret != MCO_S_OK) { printf("runtime start fail./n"); return -1; }
//设置一个事物可以更新的记录数量 ret = mco_set_maxtranssize(MAXTRANSSIZE);
//创建数据库 ret= mco_db_open(m_db_name,testdb_get_dictionary(),m_start_mem,dbSize,pageSize); if(ret!=MCO_S_OK) { printf("open memory db error./n"); goto errorExit;
} //连接数据库 ret = mco_db_connect(m_db_name,&m_db_h); if(ret != MCO_S_OK) { printf("connect memory db error./n"); goto errorExit; }
//插入记录 InsertOne(1,"hehong",'m',23); InsertOne(2,"yuanlin",'w',23);
//查找记录 FindOne(2); Search1();
//更新数据 Update1();
//删除记录
Remove1(2);
//清理数据 mco_close_all_instances(); mco_db_close(m_db_name); mco_db_kill(m_db_name); //结束运行时 mco_runtime_stop();
getchar();
return 0;
errorExit: if(!m_runtime_info.mco_shm_supported) { free(m_start_mem); } return -1;}
//插入一条记录 void InsertOne(int id,char* name,char sex,int age){ //启动一个事务 MCO_RET ret = mco_trans_start(m_db_h,MCO_READ_WRITE,MCO_TRANS_FOREGROUND,&m_trans_h); if(ret == MCO_S_OK) {
//创建一个对象,相当于创建了一行数据 testdb::employeer newObj; ret = newObj.create(m_trans_h); if(ret == MCO_S_OK) {
//设置对象(行)的各字段的信息 newObj.id_put(id); newObj.name_put(name,strlen(name)); newObj.age_put(age); newObj.sex_put(sex);
mco_trans_commit(m_trans_h);
printf("add user %s successful./n",name); } else { mco_trans_rollback(m_trans_h); }
}}//查找 void FindOne(int id){ MCO_RET ret = mco_trans_start(m_db_h,MCO_READ_WRITE,MCO_TRANS_FOREGROUND,&m_trans_h); //利用find 进行查找,查到的数据会放到对象obj 中 testdb::employeer obj; ret = testdb::employeer::IdxID::find(m_trans_h,id,obj);
if(ret == MCO_S_OK) {
//显示obj中的一些信息 uint2 len; printf("find a user id=%d /n",id); char name[20]={0}; obj.name_get(name,20,len); printf("user's name is %s/n",name);
} else if(ret = MCO_S_NOTFOUND) { printf("can not find user id =%d /n",id); } mco_trans_commit(m_trans_h);}
void Search1(){
//利用search 和cursor 功能来实现遍历多个查找结果 mco_cursor_t my_cursor; mco_cursor_h cursor_h=&my_cursor; testdb::employeer obj;
MCO_RET ret = mco_trans_start(m_db_h,MCO_READ_WRITE,MCO_TRANS_FOREGROUND,&m_trans_h);
testdb::employeer::IdxID::cursor(m_trans_h,cursor_h); //查找id小于等于10的用户 ret = testdb::employeer::IdxID::search(m_trans_h,cursor_h,MCO_LE,10);
ret = mco_cursor_first(m_trans_h,cursor_h); while(ret == MCO_S_OK) { uint2 len;
//从当前游标处构造对象 ret = obj.from_cursor(m_trans_h,cursor_h);
char name[20]={0}; obj.name_get(name,20,len); printf("search user's name is %s/n",name);
ret = mco_cursor_next(m_trans_h,cursor_h);
} mco_trans_commit(m_trans_h);}void Update1(){ mco_cursor_t my_cursor; mco_cursor_h cursor_h=&my_cursor; testdb::employeer obj;
MCO_RET ret = mco_trans_start(m_db_h,MCO_READ_WRITE,MCO_TRANS_FOREGROUND,&m_trans_h);
testdb::employeer::IdxID::cursor(m_trans_h,cursor_h); //查找id小于等于10的用户 ret = testdb::employeer::IdxID::search(m_trans_h,cursor_h,MCO_LE,10);
ret = mco_cursor_first(m_trans_h,cursor_h); while(ret == MCO_S_OK) { //从当前游标处构造对象 ret = obj.from_cursor(m_trans_h,cursor_h);
int2 age; obj.age_get(age); age+=1; obj.age_put(age); //更新数据
ret = mco_cursor_next(m_trans_h,cursor_h);
} mco_trans_commit(m_trans_h); //提交事务 }//删除记录 void Remove1(int id){ MCO_RET ret = mco_trans_start(m_db_h,MCO_READ_WRITE,MCO_TRANS_FOREGROUND,&m_trans_h);
testdb::employeer obj; ret = testdb::employeer::IdxID::find(m_trans_h,id,obj);
if(ret == MCO_S_OK) { obj.remove(); //将查到的对象删除
} else if(ret = MCO_S_NOTFOUND) { printf("can not find user id =%d /n",id); } mco_trans_commit(m_trans_h);————————————————版权声明:本文为CSDN博主「hehong_78」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/hehong_78/article/details/6026883