extremeDB使用例子
内存数据库介绍

常用内存数据库介绍(一)博客分类:内存数据库数据结构Oracle企业应用网络应用设计模式(注:部分资料直接来源于Internet)1. 内存数据库简介1.1 概念一、什么是内存数据库传统的数据库管理系统把所有数据都放在磁盘上进行管理,所以称做磁盘数据库(DRDB:Disk-Resident Database)。
磁盘数据库需要频繁地访问磁盘来进行数据的操作,由于对磁盘读写数据的操作一方面要进行磁头的机械移动,另一方面受到系统调用(通常通过CPU中断完成,受到CPU时钟周期的制约)时间的影响,当数据量很大,操作频繁且复杂时,就会暴露出很多问题。
近年来,内存容量不断提高,价格不断下跌,操作系统已经可以支持更大的地址空间(计算机进入了64位时代),同时对数据库系统实时响应能力要求日益提高,充分利用内存技术提升数据库性能成为一个热点。
在数据库技术中,目前主要有两种方法来使用大量的内存。
一种是在传统的数据库中,增大缓冲池,将一个事务所涉及的数据都放在缓冲池中,组织成相应的数据结构来进行查询和更新处理,也就是常说的共享内存技术,这种方法优化的主要目标是最小化磁盘访问。
另一种就是内存数据库(MMDB:Main Memory Database,也叫主存数据库)技术,就是干脆重新设计一种数据库管理系统,对查询处理、并发控制与恢复的算法和数据结构进行重新设计,以更有效地使用CPU周期和内存,这种技术近乎把整个数据库放进内存中,因而会产生一些根本性的变化。
两种技术的区别如下表:内存数据库系统带来的优越性能不仅仅在于对内存读写比对磁盘读写快上,更重要的是,从根本上抛弃了磁盘数据管理的许多传统方式,基于全部数据都在内存中管理进行了新的体系结构的设计,并且在数据缓存、快速算法、并行操作方面也进行了相应的改进,从而使数据处理速度一般比传统数据库的数据处理速度快很多,一般都在10倍以上,理想情况甚至可以达到1000倍。
而使用共享内存技术的实时系统和使用内存数据库相比有很多不足,由于优化的目标仍然集中在最小化磁盘访问上,很难满足完整的数据库管理的要求,设计的非标准化和软件的专用性造成可伸缩性、可用性和系统的效率都非常低,对于快速部署和简化维护都是不利的。
eXtremeDB微秒级实时数据库简介

eXtremeDB微秒级实时数据库简介eXtremeDB实时数据库是美国McObject公司于上世纪九十年代末推出的全世界第一款全内存式实时数据库,特别为高性能、低开销、稳定可靠的极速实时数据管理而设计。
eXtremeDB的性能可以达到微秒一级的惊人速度。
eXtremeDB能够达到这样惊人的极限速度,是由其对市场的独特理解、长期的行业经验、持续不断的创新精神和革命性的体系结构等一些列的因素所决定的。
内存数据库eXtremeDB将数据以程序直接使用的格式保存在主内存之中,不仅剔除了文件I/O的开销,也剔除了文件系统数据库所需的缓冲和Cache机制。
其结果是相比于磁盘数据库,其速度提高成百上千倍,以至普通PC平台的硬件条件下就可以达到每个交易1微秒甚至更小的极限速度。
嵌入式数据库eXtremeDB以链接库的形式包含在应用程序之中,其开销只有50KB~120KB。
因此,无论在嵌入式系统还是在实时系统之中,eXtremeDB都能够实现天然的嵌入。
eXtremeDB的这种天然嵌入性对实时数据管理还有更大的意义:对于应用程序而言,各个进程都可以直接访问eXtremeDB数据库,因此剔除了进程间通信,也避免了进程间通信的开销和不确定性。
并且,由于eXtremeDB数据格式是程序直接使用的格式,剔除了数据复制及数据翻译的开销,缩短了应用程序的代码执行路径。
应用定制的API应用程序对eXtremeDB数据库的操作接口是根据应用数据库设计而产生,这些动态的API剔除了通常数据库应用程序所必不可少的动态内存分配,不仅提升了数据库的实时性能,也提高了应用系统的可靠性。
跨平台的实时数据管理方案eXtremeDB对操作系统、编译器、处理器没有依赖性。
eXtremeDB可以运行在各种操作系统上,包括16位、32位及64位的嵌入式操作系统、桌面操作系统及服务器操作系统上。
eXtremeDB对平台的依赖性如此之小,以至于eXtremeDB可以运行在无操作系统的裸机上。
Extreme交换机快速配置手册

iSpirit68&48交换机快速配置手册(Version 1.0)第一章:介绍管理模块。
(3)第二章:6800和4800交换机的基本配置: (4)第三章创建基于端口的VLAN (6)第四章启用VLAN之间路由的设置 (9)第五章配置静态路由 (10)第六章设置BLACKHOLE路由: (12)第七章创建端口聚合TRUNK (13)第八章端口镜像MIRRORING (14)第九章EAPS的配置: (15)第十章VRRP的配置: (25)第十一章ESRP的配置: (29)第十二章配置VLAN聚合 (35)第十三章配置DHCP/BOOTP RELAY功能 (37)第十四章访问控制列表的概念和配置 (39)第十五章OSPF路由协议的配置 (43)第十六章交换机安全管理控制 (44)第十七章特殊情况下的操作 (46)第十八章超级终端的配置 (47)第十九章操作系统的升级方法 (49)第二十章上传和下载交换机配置文件 (50)第二十一章策略路由配置方法 (50)第二十二章SNMP的设置 (51)Extreme交换机快速配置手册6808和4808、4804系列的配置操作、映像文件和bootrom文件是一样的。
下面所进行的配置案例操作对上面几款交换机都适用。
第一章:介绍管理模块。
1、6800系列的管理模块介绍:一般常用的只有Console口和Management口。
Console口是通过串口连接pc机,设置超级终端后配置交换机使用,是最基本的配置方法。
出厂模式,交换机并没有任何的ipaddress,必须首先通过Console口对交换机进行ipaddress的设定,然后才能通过telnet和web 方式进行控制。
Management端口是一个独立的RG-45端口,单独属于MGMT vlan,这个Vlan不能删除、添加其他端口,也不能做路由,默认情况下没有ipaddress,仅仅在管理模块中作为另一种控制交换机的方式存在。
ExtremeDB在实时多传感器数据采集系统中的应用

中 图分 类 号 :P 1 T31 D I1. 93 ji n 10 O :0 3 6/.s .07—14 .0 0 0 .2 s 4 X 2 1 .20 2
实时多传感器数据采集系统对数据有着实时
Ap . r 201 0
文 章编 号 :07—14 2 1 ) 2— 2 3— 4 10 4 X(0 0 0 0 5 0
文 献 标 志 码 : A
E te D xrme B在 实 时 多传 感 器数 据 采 集 系统 中 的应 用
韩 松 , 王 威
( 海军工程大学 管理工程系 , 湖北 武汉 4 03 ) 30 3
发 了 内存 嵌 入 式 数 据 库 系 统 E t m D 该 系统 xr e B, e
适用于各种嵌入式系统 和其他需要高性 能、 小尺 寸、 紧密存 储 、 内存 分 配 的应 用 领域 。 零
2 实 时 数 据 采 集 系统 构 建
在 实 时数据 采 集 系 统 的构 建 中 , 用 面 向对 采 象 分 析 ( O 的 方 法 进 行 构 建 一 O A) 。在 整 个 大 的系统 中按 功能划 分 为 3个 子 系统 , 即主控 系统 、 数 据调 度 系统 和 显 控 系 统 。 由于 网络 架 构 的 需
能满足实时领域 的要求 , 另一方面又要求人们重 新 研究 数据库 的实 时 实 现策 略 , 以保 证 其 主 要 目 标 的实 现 。为 了满 足 上 述 要求 , O jc 公 司 开 Mc bet
图 1 系统的模块 及模 块之间的通信
收 稿 日期 :0 9—1 0 . 20 0— 6
Drools Fusion介绍

drools fusion(3)2010-12-02 23:07五、事件处理模式(Event Processing Modes)Drools支持2种事件处理模式:云模式(Cloud Mode)和流模式(Stream Mode)1.云模式(Cloud Mode)云(Cloud)处理模式是默认的处理方式。
在云模式下,不会区分事实和事件,都看成是事实。
(1)没有时间的概念。
尽管事件在插入引擎被赋予了时间戳,也不能判断该事件“多大了”,因为没有“现在”的概念。
滑动窗(slid 用。
(2)无序的事件云。
由于事件无序,没有自动的生命周期管理,需要像正常的事实一样显示的删除事件。
云模式虽然是默认的执行模式,我们也可以配置它:KnowledgeBaseConfiguration config = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();config.setOption( EventProcessingOption.CLOUD );等同系统属性配置:drools.eventProcessingMode = cloud2.流模式(Stream Mode)当处理事件流的时候需要选择流处理模式。
在流模式下:(1) 插入到引擎里的事件必须是时间顺序的。
(2) 引擎强制性的和使用的会话时钟session clock同步。
配置流模式:KnowledgeBaseConfiguration config = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();config.setOption( EventProcessingOption.STREAM );等同配置系统属性:drools.eventProcessingMode = stream使用流(STREAM)模式,引擎有时间流和"现在"的概念(通过读取Session Clock的时间戳),提供了以下3种支持:(1) 滑动窗的支持(2) 自动的时间生命周期管理(3) 使用消极模式(Negative Patterns)自动的规则延迟3.会话时钟(Session Clock)在流模式(Stream mode)中的作用在云模式下,会话时钟只有一个作用,就是给插入到working momery 的事件赋予时间戳的值(如果规则没有定义时间戳属性)在流模式下,会话时钟负责维护当前时间戳,基于当前的时间戳,引擎根据事件的年龄计算所有时间运算,从多种源同步流,安排4.流模式(in Stream Mode)中的消极模式(Negative Patterns)消极模式在流模式和云模式意义是不同的。
oracle----【EXPDP】使用EXPDP工具的 EXCLUDE选项过滤掉不关心的数据库对象

【EXPDP】使用EXPDP工具的EXCLUDE选项过滤掉不关心的数据库对象上一篇/ 下一篇2010-03-08 22:54:51 / 个人分类:备份与恢复查看( 952 )/ 评论( 2 ) / 评分( 5 / 0 )使用EXPDP逻辑备份工具的EXCLUDE选项可以指定那类数据库对象不被导出,EXPDP工具的前身EXP如果想要完成同样的任务非常的困难。
我们以排除部分表为例看一下这个选项带给我们的便利。
如果在命令行中完成备份,特殊字符的转义需要特别注意(我这里使用的是Linux操作系统)。
1.EXPDP帮助中的描述信息ora10g@secDB /expdp$ expdp -help……EXCLUDE Exclude specific object types, e.g.EXCLUDE=TABLE:EMP.……2.创建directory数据库对象,并将读写权限授予sec用户sys@ora10g> create or replace directory dump_dir as '/expdp'; Directory created.sys@ora10g> grant read,write on directory dump_dir to sec; Grant succeeded.3.确认操作系统信息ora10g@secDB /expdp$ uname -aLinux secDB 2.6.18-128.el5 #1 SMP Wed Dec 17 11:41:38 EST 2008 x86_64 x86_64 x86_64 GNU/Linux4.在sec用户下创建几张表用于后续的测试创建三张表T1、T2和T3,每张表中初始化一条数据sec@ora10g> create table t1 (x int);sec@ora10g> insert into t1 values (1);sec@ora10g> create table t2 (x int);sec@ora10g> insert into t2 values (2);sec@ora10g> create table t3 (x int);sec@ora10g> insert into t3 values (3);sec@ora10g> commit;5.为了与后面的比较,先全用户导出ora10g@secDB /expdp$ rm -f sec.dmp sec.logora10g@secDB /expdp$ expdp sec/sec directory=dump_dir dumpfile=sec.dmp logfile=sec.logExport: Release 10.2.0.3.0 - 64bit Production on Monday, 08 March, 2010 9:59:25Copyright (c) 2003, 2005, Oracle. All rights reserved.Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit ProductionWith the Partitioning, Oracle Label Security, OLAP and Data Mining Scoring Engine optionsStarting "SEC"."SYS_EXPORT_SCHEMA_01": sec/********directory=dump_dir dumpfile=sec.dmp logfile=sec.logEstimate in progress using BLOCKS method...Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATATotal estimation using BLOCKS method: 192 KBProcessing object type SCHEMA_EXPORT/USERProcessing object type SCHEMA_EXPORT/SYSTEM_GRANTProcessing object type SCHEMA_EXPORT/ROLE_GRANTProcessing object type SCHEMA_EXPORT/DEFAULT_ROLEProcessing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA Processing object type SCHEMA_EXPORT/TABLE/TABLEProcessing object type SCHEMA_EXPORT/TABLE/INDEX/INDEXProcessing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT Processing object typeSCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICSProcessing object type SCHEMA_EXPORT/TABLE/COMMENT. . exported "SEC"."T1" 4.914 KB 1 rows . . exported "SEC"."T2" 4.914 KB 1 rows . . exported "SEC"."T3" 4.914 KB 1 rows Master table "SEC"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded ********************************************************************* *********Dump file set for SEC.SYS_EXPORT_SCHEMA_01 is:/expdp/sec.dmpJob "SEC"."SYS_EXPORT_SCHEMA_01" successfully completed at 09:59:326.排除T1表进行备份ora10g@secDB /expdp$ rm -f sec.dmp sec.logora10g@secDB /expdp$ expdp sec/sec directory=dump_dir dumpfile=sec.dmp logfile=sec.logEXCLUDE=TABLE:\"IN\(\'T1\'\)\"Export: Release 10.2.0.3.0 - 64bit Production on Monday, 08 March, 2010 10:02:03Copyright (c) 2003, 2005, Oracle. All rights reserved.Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit ProductionWith the Partitioning, Oracle Label Security, OLAP and Data Mining Scoring Engine optionsStarting "SEC"."SYS_EXPORT_SCHEMA_01": sec/********directory=dump_dir dumpfile=sec.dmp logfile=sec.logEXCLUDE=TABLE:"IN('T1')"Estimate in progress using BLOCKS method...Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATATotal estimation using BLOCKS method: 128 KBProcessing object type SCHEMA_EXPORT/USERProcessing object type SCHEMA_EXPORT/SYSTEM_GRANTProcessing object type SCHEMA_EXPORT/ROLE_GRANTProcessing object type SCHEMA_EXPORT/DEFAULT_ROLEProcessing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA Processing object type SCHEMA_EXPORT/TABLE/TABLEProcessing object type SCHEMA_EXPORT/TABLE/INDEX/INDEXProcessing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT Processing object typeSCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICSProcessing object type SCHEMA_EXPORT/TABLE/COMMENT. . exported "SEC"."T2" 4.914 KB 1 rows . . exported "SEC"."T3" 4.914 KB 1 rows Master table "SEC"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded ********************************************************************* *********Dump file set for SEC.SYS_EXPORT_SCHEMA_01 is:/expdp/sec.dmpJob "SEC"."SYS_EXPORT_SCHEMA_01" successfully completed at 10:02:10排除表T1后T2和T3表被成功导出。
常用主存数据库

常用主存数据库1.内存数据库简介传统的数据库管理系统把所有数据都放在磁盘上进行管理,所以称做磁盘数据库(DRDB:Disk-Resident Database)。
磁盘数据库需要频繁地访问磁盘来进行数据的操作,由于对磁盘读写数据的操作一方面要进行磁头的机械移动,另一方面受到系统调用(通常通过CPU中断完成,受到CPU时钟周期的制约)时间的影响,当数据量很大,操作频繁且复杂时,就会暴露出很多问题。
近年来,内存容量不断提高,价格不断下跌,操作系统已经可以支持更大的地址空间(计算机进入了64位时代),同时对数据库系统实时响应能力要求日益提高,充分利用内存技术提升数据库性能成为一个热点。
在数据库技术中,目前主要有两种方法来使用大量的内存。
一种是在传统的数据库中,增大缓冲池,将一个事务所涉及的数据都放在缓冲池中,组织成相应的数据结构来进行查询和更新处理,也就是常说的共享内存技术,这种方法优化的主要目标是最小化磁盘访问。
另一种就是内存数据库(MMDB:Main Memory Database,也叫主存数据库)技术,就是干脆重新设计一种数据库管理系统,对查询处理、并发控制与恢复的算法和数据结构进行重新设计,以更有效地使用CPU 周期和内存,这种技术近乎把整个数据库放进内存中,因而会产生一些根本性的变化。
两种技术的区别如下表:内存数据库系统带来的优越性能不仅仅在于对内存读写比对磁盘读写快上,更重要的是,从根本上抛弃了磁盘数据管理的许多传统方式,基于全部数据都在内存中管理进行了新的体系结构的设计,并且在数据缓存、快速算法、并行操作方面也进行了相应的改进,从而使数据处理速度一般比传统数据库的数据处理速度快很多,一般都在10倍以上,理想情况甚至可以达到1000倍。
而使用共享内存技术的实时系统和使用内存数据库相比有很多不足,由于优化的目标仍然集中在最小化磁盘访问上,很难满足完整的数据库管理的要求,设计的非标准化和软件的专用性造成可伸缩性、可用性和系统的效率都非常低,对于快速部署和简化维护都是不利的。
内存数据库eXtremeDB介绍

eXtremeDB:多线程、多进程支持
常规内存中创建多线程eXtremeDB 共享内存中创建多进程eXtremeDB
eXtremeDB:各种数据类型支持
整数、实数、字符、字符串 Blob、数组、Vector
Vector:单字段嵌套表
日期、时间、AutoID、Ref
ref相当于常规数据库的外键
结构
eXtremeDB: 为各行各业的实时数据管理而在
全世界数千家用户采用 eXtremeDB管理实时数据
eXtremeDB:微秒级实时数据库
数据库建立在主内存中, 程序可以直接使用,数据 库操作的速度以微秒计 静态内存分配及定制的 API缩短了代码执行路径, 既加快的时间反应性能, 更提高系统强壮性 应用程序直接以库的形 式使用eXtremeDB,剔除 了进程间通信的开销
安全的实时数据管理
eXtremeDB提供API save()/load()数据库影 像 NVRAM中建立内存库 eXtremeLog提供交易一 级的数据安全保障机制 eXtremeDB Fusion:内 存/磁盘混合数据库 eXtremeHA多模式容灾
加载
保存
保存
加载
安全的实时数据管理:NVRAM 支持
驻留交易
一个eXtremeDB节点上驻留 易,其它节点调用驻留交易, 快速访问eXtremeDB
eXtremeSQL Server Engine
一个节点创建SQL Server Engine, 其它节点作为 Client访eXtremeDB
ODBC
通过eXtremeSQL之ODBC接口访 问本地和远程eXtremeDB数据库
uint4 string Table-2 oid S_ID
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
来一份eXtremeDB使用笔记.1、准备工作:下载eXtremeDB安装包(/)然后将安装或解压至磁盘。
此时可以看到其目录下有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 testdeclare database shmdb; //数据名字compact class MyClass //表名字{unsigned<4> id;string str1;char<20> str2;unique tree<id> pkey; //索引};3、用host in目录里的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("%seXtremeDB runtime version %d.%d, build %d%sPress 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:";mco_trans_start( db, MCO_READ_WRITE, MCO_TRANS_FOREGROUND,&t ); //事务startMyClass_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); //事务commitif(rc==MCO_S_OK)printf("insert done for %d (%s, %s)",(int)id,str1,str2);elseprintf("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:";mco_trans_start( db, MCO_READ_WRITE, MCO_TRANS_FOREGROUND, &t ); rc = MyClass_pkey_find(t, (uint4)id, &c); //通过索引查找idif(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);elsemco_trans_rollback(t);if(rc==MCO_S_OK)printf("delete done for %d (%s, %s)",id,str1,str2);elseprintf("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:";mco_trans_start( db, MCO_READ_ONLY, MCO_TRANS_FOREGROUND, &t ); rc = MyClass_pkey_find(t, (uint4)id, &c); //通过索引查找idif(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 ------------";mco_trans_rollback(t);}/*数据库操作选择*/static void menu( mco_db_h db ) {char ibuf[300];int ch; // menu choicefor(;{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";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 要打开的数据库名。