extremeDB_shiro使用详解

extremeDB_shiro使用详解1、准备工作:下载eXtremeDB安装包(http://www.leadingtek.com.cn/)然后将安装或解压至磁盘。此时可以看到其目录下有host、include、platform和target等目录。2、用你喜欢的文本编辑器构建一数据库结构,文本内容如下:(举例说明,保存文件名为test.mco)#defineint1    signed#definein

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

Jetbrains全系列IDE稳定放心使用
1、准备工作:下载eXtremeDB安装包(
http://www.leadingtek.com.cn/
)然后将安装或解压至磁盘。此时可以看到其目录下有host、include、platform和target等目录。




2、用你喜欢的文本编辑器构建一数据库结构,文本内容如下:(举例说明,保存文件名为test.mco)




#define int1      signed<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>




// db over shm memory test




declare database shmdb;                          //数据名字




compact class MyClass                     //表名字


{



unsigned<4>        id;                     


string             str1;


char<20>           str2;




unique tree<id>    pkey;                    //索引


};




3、用hostin目录里的mcocomp.exe程序在DOS命令行模式下将test.mco编译生成,用法如:




》mcocomp test.mco




编译成功后将会生成shmdb.h和shmdb.c文件。当然了,可以根据需要生成所需的文件,具体请见mcocomp命令的参数(mcocomp -help)。至此,生成的文件里就含有数据库操作所需要API函数了。




4、新建一控制台程序工程为shmdb,在链接库里加上mcolib_shm.lib(此处为共享内存LIB库),此处需要注意LIB的路径,最简单的办法就是将eXtremeDB的库文件拷贝至工程目录下包含其就可以了。




5、将编译生成的shmdb.h和shmdb.c添加至此工程中。然后新建一C文件shmdemo.c(当然了,也可以是.cpp文件),下面将分别讲解shmdemo.c文件代码。先看此文件的全部代码:




/*标准库*/




#include <ctype.h>     /*ctype.h*/


#include <stdlib.h>   /*stdlib.h*/


#include <stdio.h>   /*stdio.h*/


#include <string.h>   /*string.h*/




#include “shmdb.h”      /*用mcocomp生成的shmdb.h文件*/




const char  * dbname   = “demoShmDb”;                   //DB名称


const int   SEGSZ    = 1024 * 1024 * 10;                      //10M大小的数据库


const uint2 PAGESIZE = 90;                  //页面大小




const int MAP_ADDRESS =  0x20000000;                  //内存地址




void SH(void) {





char text[] = {



  “


This sample demonstrates eXtremeDB shared memory interfaces





};


char text1[] = {



  “Copyright (c) 2001-2005 McObject LLC. All Right Reserved.







};




printf(“%s


eXtremeDB runtime version %d.%d, build %d


%s




Press Enter to start”,


  text, MCO_COMP_VER_MAJOR, MCO_COMP_VER_MINOR, MCO_COMP_BUILD_NUM,text1);




getchar();




}






static int askNumber(const char *prompt) {



char buf[300];


printf(“


%s “, prompt);


fgets(buf, sizeof (buf), stdin);


if(isdigit(buf[0]))


  return atoi(buf);


return -1;


}




/*16进制转换成10进制*/


static int hex2num(const char *s) {



unsigned int a = 0;




while(*s) {



  int n;


  if( *s >= ‘0’ && *s <= ‘9’ )


   n = *s – ‘0’;


  else if( *s >=’a’ && *s <= ‘f’)


   n = *s – ‘a’ + 10;


  else if( *s >=’A’ && *s <= ‘F’)


   n = *s – ‘A’ + 10;


  else return a;




  a = (a << 4) | n;




  s++;


}


return a;


}






static int askHex(const char *prompt) {



char buf[300];


printf(“


%s “, prompt);


fgets(buf, sizeof (buf), stdin);


return hex2num(buf);


}




/*插入记录*/


static void insertRec(mco_db_h db) {



MyClass       c;


MCO_RET       rc;


mco_trans_h     t;


int           id;


char          str1[100], str2[100];




id = askNumber(“Enter new record’s id:”
extremeDB_shiro使用详解
;


mco_trans_start( db, MCO_READ_WRITE, MCO_TRANS_FOREGROUND, &t );                  //事务start


MyClass_new(t, &c);               //新建一条记录


sprintf(str1,”String1: %d”, id);


sprintf(str2,”String2: %d”, id);


MyClass_id_put(&c,(uint4)id);               //插入


MyClass_str1_put(&c, str1, (uint2)strlen(str1) );


MyClass_str2_put(&c, str2, (uint2)strlen(str2) );


rc = mco_trans_commit(t);               //事务commit


if(rc==MCO_S_OK)


  printf(“


insert done for %d (%s, %s)


“,(int)id,str1,str2);


else


  printf(“


insert failed (%d) for %d (%s, %s)


“,rc,(int)id,str1,str2);


}




/*删除记录*/


static void deleteRec(mco_db_h db) {



MyClass       c;


MCO_RET       rc;


mco_trans_h     t;


int           id;


char          str1[100]= {0}


    , str2[100]= {0};




id = askNumber(“deleting record, Enter record’s id:”
extremeDB_shiro使用详解
;


mco_trans_start( db, MCO_READ_WRITE, MCO_TRANS_FOREGROUND, &t );


rc = MyClass_pkey_find(t, (uint4)id, &c);               //通过索引查找id


if(rc != MCO_S_OK) {



  printf(“


Record with id = %d not found


“, (int)id);


  mco_trans_rollback(t);               //如果没有找到回滚


  return;


}


MyClass_str1_get(&c,str1,(uint2)sizeof(str1),0);


MyClass_str2_get(&c,str2,(uint2)sizeof(str2) );


rc = MyClass_delete(&c);




if(rc == MCO_S_OK)


  rc = mco_trans_commit(t);


else


  mco_trans_rollback(t);


  


if(rc==MCO_S_OK)


  printf(“


delete done for %d (%s, %s)


“,id,str1,str2);


else


  printf(“


delete failed (%d) for %d (%s, %s)


“,rc,id,str1,str2);


}




/*查找记录*/


static void searchRec(mco_db_h db) {



MyClass       c;


MCO_RET       rc;


mco_trans_h     t;


int           id;


char          str1[100]= {0}


    , str2[100]= {0};




id = askNumber(“searching record, Enter record’s id:”
extremeDB_shiro使用详解
;


mco_trans_start( db, MCO_READ_ONLY, MCO_TRANS_FOREGROUND, &t );


rc = MyClass_pkey_find(t, (uint4)id, &c);               //通过索引查找id


if(rc != MCO_S_OK) {



  printf(“


Record with id = %d not found


“, id);


  mco_trans_rollback(t);


  return;


}


MyClass_str1_get(&c,str1,(uint2)sizeof(str1),0);


MyClass_str2_get(&c,str2,(uint2)sizeof(str2) );


mco_trans_rollback(t);


printf(“


record found: %d (%s, %s)


“,id,str1,str2);


}




/*显示数据库中的记录信息*/


static void listRecs(mco_db_h db) {



MyClass       c;


MCO_RET       rc;


mco_trans_h     t;


uint4         id;


char          str1[100]= {0}


    , str2[100]= {0};


mco_cursor_t  csr;




mco_trans_start( db, MCO_READ_ONLY, MCO_TRANS_FOREGROUND, &t );




/*用游标的方法遍历数据*/




MyClass_pkey_index_cursor( t, & csr );


rc = mco_cursor_first(t, &csr);               //置游标为第一条记录


printf(“


———– All records of type MyClass: ——– 


” );




/*遍历数据库*/


for( ; rc == MCO_S_OK; rc = mco_cursor_next(t, &csr) ) {



  rc = MyClass_from_cursor(t, &csr, &c);


  if(rc) {



   printf(“


Unexpected error %d


“,rc); break;


  }


  MyClass_id_get(&c, &id);


  MyClass_str1_get(&c,str1,(uint2)sizeof(str1),0);


  MyClass_str2_get(&c,str2,(uint2)sizeof(str2) );


  printf(“record: %7d (%s, %s)


“,(int)id,str1,str2);


}


printf(  “———————— end of list ———— 



extremeDB_shiro使用详解
;


mco_trans_rollback(t);


}




/*数据库操作选择*/


static void menu( mco_db_h db ) {



char          ibuf[300];


int           ch;         // menu choice




for(;
extremeDB_shiro使用详解
 {





  printf(“


—————————-


Menu:





   “0:   exit





   “1:   insert a record





   “2:   delete a record





   “3:   search a record





   “4:   list records





   “5:   print db statistics





   “$ “


   );




  fgets(ibuf, sizeof (ibuf), stdin);


  if( ! isdigit( ibuf[0] ) )


   continue;


  ch = atoi(ibuf);




  switch(ch) {



   default:


    break;


   case 0:


                                return;


   case 1:


    insertRec(db); break;


   case 2:


    deleteRec(db); break;


   case 3:


    searchRec(db); break;


   case 4:


    listRecs(db); break;


   case 5:


   {



    uint4 freepg, totalpg, nused;


    mco_db_free_pages   (db, &freepg);               //求数据库剩余空间大小


    mco_db_total_pages  (db, &totalpg);               //求数据库总大小




    nused = totalpg – freepg;




    printf(“


Memory:





     ”  %dKb available, %dKb used


“,


     (int)(freepg * PAGESIZE / 1024), (int)(nused * PAGESIZE / 1024) );               //求最后大小需要乘以页面大小




   }


   break;


  }




}             // end for




}




/*出错处理*/


static void errhandler( int n ) {



printf( “


eXtremeDB fatal error: %d”, n );


getchar();


exit( -1 );


}




/*主程序*/


int main( int na, char **aa) {



MCO_RET       rc;


mco_db_h      db;               //数据库句柄


void        * start_mem = 0;


char          prompt[300], buf[100];


mco_runtime_info_t info;               //数据库信息




SH();


mco_get_runtime_info( &info);               //获取可运行数据库信息


if ( !info.mco_shm_supported ) {               //是否有多线程支持


  printf(“


This program requires shared memory database runtime



extremeDB_shiro使用详解
;


  exit(1);


};




mco_runtime_start();               //初始化运行环境




/* set fatal error handler */


mco_error_set_handler( &errhandler );




printf(“


Would you like to create a new database [Y] or attach [N] — [Y/N] ?” );


fgets(buf, sizeof (buf), stdin);




if(buf[0] == ‘y’ || buf[0] == ‘Y’) {





  sprintf(prompt,”Enter hint address (default is %x):”,


   (int) MAP_ADDRESS );




  start_mem = (void*) askHex(prompt);


  if( start_mem == 0 )


   start_mem = (void*) MAP_ADDRESS;




  printf(“


SHM Map address is %x


“, (int) start_mem );




/*创建数据库*/




/*MCO_RET mco_db_open( IN const char * dbname, IN mco_dictionary_h dict, IN void * mem, IN uint4 total_size, IN uint2 page_size)*/




/*参数: */


/*  dbname  要打开的数据库名。 */


/*  h_dict   eXtremeDB模式处理器创建的字典句柄。通常,传递该句柄时传递dbname_getDictionary()函数。*/


/*  mem   用于容纳数据库的已分配堆内存。 */


/*  total_size  mem指向的内存的数量,以字节为单位。 */


/*  page_size  不连续的内存块,这些块由eXtremeDB页   管理器来管理。 */     




/*说明:


/*  该函数在mem表示的空间中创建数据库dbname,*/


/* 并指定初始尺寸为total_size(数据库的尺寸是可以扩展的),*/


/* 页尺寸为page_size。*/


/* 返回值:*/


/*  MCO_S_OK 数据库创建成功。 */


/*  MCO_E_PAGESIZE 非法页尺寸。 */


/*  MCO_E_NOMEM MCO_E_INSTANCE_DUPLICATE */


/*    数据库实例重复。 */


/*  MCO_ERR_DB_VER_MISMATCH */


/*  MCO_ERR_DB_NOMEM */


/*  MCO_ERR_DB_NAMELONG */


/*  MCO_ERR_DB_NUM_INSTANCES */


/*  MCO_ERR_DB MCO_ERR_PGMEM*/         




  rc = mco_db_open( dbname, shmdb_get_dictionary(), start_mem, SEGSZ, PAGESIZE );


  if ( rc ) {



   printf(“


Could not create instance: %d


“, rc);


   exit( 1 );


  }


}




/*连接数据库*/




/*MCO_RET mco_db_connect( IN const char * dbname, OUT mco_db_h *handle) */




/*参数: */


/*  dbname        要连接的数据库名称,该名称与调用            mco_db_open时指定的名称相同 */


/* handle          指向数据库句柄的指针,该函数将填充该句柄 */


/* 说明:*/


/*  该函数将应用程序(线程)连接到数据库。数据库必须已经由mco_db_open函数打开过。函数返回一个连接句柄,该句柄可以作为数据库的引用传给其它接口函数。  */


/* 返回值:*/


/*   MCO_S_OK 成功建立数据库连接。 */


/*  MCO_E_NOINSTANCE */


/*  MCO_ERR_TRN*/




rc = mco_db_connect( dbname, &db );


if ( rc ) {



  printf(“


Could not attach to instance: %d


“, rc);


  exit( 1 );


}




menu( db );




// shutdown




rc = mco_db_disconnect( db );                //断开连接


rc = mco_db_close( dbname );            //关闭数据库




mco_runtime_stop();            //释放




return 0;




}






6、需要注意的几点问题:




一、 如果初始化环境出错,将访问内存地址改大一些就可以了(特别在WIN XP上);




二、如果出现插入记录失败,查找是不是插入重复的ID了;




三、打开或创建数据库失败,查找是不是之前已经打开相同的数据库了,如果是创建数据库的话,最好在此之前加一函数mco_db_kill(db_name);




四、如果创建数据库失败,需要查看LIB库和用mcocomp编译出来的.h和.c文件的版本是否一致。一定要保证所使用的版本一致!

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

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

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

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

(0)
blank

相关推荐

  • 如何求a类不确定度_不确定度a类分量与随机误差相对应

    如何求a类不确定度_不确定度a类分量与随机误差相对应1.计算A类不确定度u(a):某一工业容器温度控制要求为10℃,用温度计连续。A类不确定度的计算方法n=6时,u(a)=S(x)数据平均值设为q用贝塞尔公式S(x)*S(x)=[(X1-q)*(X1-q)+(X2-q)*(X2-q).+(X6-q)(X6-q)]/(6-1)可求出a类不确定度b类Ub就是0.6."A类不确定度"和"B类不确定度"的区别在于测定方法、输入量、系统效应的不…

  • 腾讯架构大调整!七大事业群变六大事业群

    腾讯架构大调整!七大事业群变六大事业群微信又改版了,为了方便第一时间看到我们的推送,请按照下列操作,设置“置顶”:点击上方蓝色字体“程序员之家”-点击右上角“…”-点击“设为星标”。可以啦,让我们继续相互陪伴…

  • JWT单点登录(源码学习)

    JWT单点登录(源码学习)三、JWT源码学习//登录成功之后,需要生成tokenStringtoken=Jwts.builder().setSubject(“用户名/用户信息”)//主题,可以放用户的详细信息.setIssuedAt(newDate())//token创建时间.setExpiration(newDate(System.currentTimeMillis()+60000))//token过期时间.setId(“用户ID”)//用户ID

  • Linux内核版本_linux最新版本是多少

    Linux内核版本_linux最新版本是多少Linux版本linux版本分为两类:内核版本:免费的,它只是操作系统的核心,负责控制硬件、管理文件系统、程序进程等,并不给用户提供各种工具和应用软件; 发行版本:不一定免费,出了操作系统核心外,还包含一套强大的软件,例如:C/C++编译器和库等1、内核版本:1.1)内核版本命名:Linux内核版本号由3组数字组成:第一个组数字.第二组数字.第三组数字第一个组数字:目前发布的内核主版本。 第二个组数字:偶数表示稳定版本;奇数表示开发中版本。 第三个组数字:错误修补的次数。可以使

  • webstrom2021激活码【2021最新】

    (webstrom2021激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.cn/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~ML…

  • JAVA数组的定义及用法

    JAVA数组的定义及用法

发表回复

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

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