extremeDB_render props模式

extremeDB_render props模式内存数据库extremeDB

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

简介:

    eXtremeDB 是一款内存数据库产品。主要应用于嵌入式等实时系统中,可以提高软件的响应速度。具体请参见官方网站 http://www.mcobject.com.

    它是一个对象型数据库,可以理解为,数据库中的每一行都是一个对象。

 

使用方法:

   下面根据一个简单的例子,来说明eXtremeDB的使用方法。

 

1,编写数据库定义文件

    利用任何文本编辑器,创建一个*.mco 文件,如下:

 /**
* Author : hehong
* date :2010-11-22
* Description:  test eXtremeDB
**/
// signed<1> 是 eXtremeDB 内置的数据类型,下面通过宏的形式,起一个便于记忆的名称。
#define int1        signed<1>    // 表示1个字节有符号 ,下面类推
#define int2        signed<2>
#define int4        signed<4>
#define int8        signed<8>
#define uint8   unsigned<8>
#define uint4   unsigned<4>
#define uint2   unsigned<2>
#define uint1   unsigned<1>

declare database testdb;       //声明数据库的

class employeer                    //声明一个类,相当于关系型数据库中的表
{

   uint8  id;                            //开始声明表中的字段。
   string name;
   int1   sex;
   int2   age;
  
   unique tree<id> 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 <stdlib.h>
#include <stdio.h>
#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);
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/181905.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • java游戏开发入门教程_JAVA制作游戏入门教程

    java游戏开发入门教程_JAVA制作游戏入门教程现在流行的游戏似乎都是用C或C++来开发的。在java平台上几乎没有很大型及可玩的流行游戏。由于java是个新生语言,他的许多特性还有待大家的发掘,但是我们不能否认Java在游戏编程方面的强大性。本文将带领大家一步一步学习编写Java游戏。最终打造属于自己的Java游戏。在开始之前我们得确认你已经安装了JavaJDK,并已经安装了浏览器软件如IE。本章是以Internet为开发对象,一步一步教大…

  • cde网站_cde6150a车床

    cde网站_cde6150a车床给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。 你 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)。示例 1:输入:matrix = [[9,9,4],[6,6,8],[2,1,1]]输出:4 解释:最长递增路径为 [1, 2, 6, 9]。示例 2:输入:matrix = [[3,4,5],[3,2,6],[2,2,1]]输出:4 解释:最长递增路径是 [3, 4, 5, 6]。注意

  • windows安装设置_ffmpeg使用方法

    windows安装设置_ffmpeg使用方法windows下下载配置ffmpeg

  • 罗技k375s键盘怎么连接_罗技k380键盘怎么连接手机

    罗技k375s键盘怎么连接_罗技k380键盘怎么连接手机罗技K375s无线蓝牙键盘使用总结(连接|手感)首先我们先来试试优联连接。优联只支持PC(废话)。如果之前没有配对过,需要再下个优联的软件来进行配对。不得不说,罗技的网站打开真慢,服务器估计在国外。而且中文主页,K375S竟然还没上架,列表里没有,也搜索不到。我用的是旧的优联,已经配对了M570。配对新设备之后,其实就连上了。要你输入一些字符确认。不过这里的K370S是怎么回事,这命名……既然…

    2022年10月15日
  • 什么是跨域?如何解决跨域问题?

    什么是跨域?如何解决跨域问题?什么是跨域?浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域域名:主域名不同http://www.baidu.com/index.html–&amp;gt;http://www.sina.com/test.js子域名不同http://www.666.baidu.com/index.html–&amp;gt;http://www.555.baidu.co…

  • PathFileExists用法--使用#include <shlwapi.h>

    PathFileExists用法--使用#include <shlwapi.h>BOOLPathFileExists(LPCTSTRpszPath);Determinesifafileexists.—经检测,该函数可以检测文件或目录是否存在!RemarksThisfunctionteststhevalidityofthefileandpath.Itworksonlyonthelocal…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号