SylixOS伯克利数据库移植笔记
来源:互联网 发布:java 发送邮件 maven 编辑:程序博客网 时间:2024/06/16 10:47
1.DB数据库简介
Berkeley DB(DB)是历史悠久的嵌入式数据库系统,主要应用在UNIX/LINUX操作系统上,其设计思想是简单、小巧、可靠、高性能。
DB是一个高性能的,嵌入数据库编程库,和C语言,C++,Java,Perl,Python,PHP,Tcl以及其他很多语言都有绑定。Berkeley DB可以保存任意类型的键/值对,而且可以为一个键保存多个数据。Berkeley DB可以支持数千的并发线程同时操作数据库,支持最大256TB的数据,广泛用于各种操作系统包括大多数Unix类操作系统和Windows操作系统以及实时操作系统。
2.移植思路
移植Linux中间件到SylixOS上的思路请参考《TN0029_SylixOS第三方中间件移植方法》。
3.移植实现
在伯克利的官方网站上下载伯克利的DB数据库的源码,选择的版本是4.7.25(官方网址http://www.oracle.com/database/berkeley-db/index.html)。
3.1.在Linux下生成配置文件
把官网下载的源码在Linux环境下编译执行,产生配置文件。
1.把源码工程导入到Ubuntu里进行解压缩;
2.在db-4.7.25下新建一个build_arm目录,输入指令../dist/configure CC=arm-linux-gcc进行配置。在build_arm目录下产生配置文件和Makefile,如图 3-1所示。
图 3-1 生成的配置文件和Makefile
这样在Linux环境下生成了配置文件,然后把整个源码包导出。
3.2.移植到SylixOS
把源码工程导入到RealEvo-IDE开发环境上进行开发编译。
3.2.1.创建SylixOS工程
在SylixOS开发环境RealEvo-IDE中创建一个动态库工程libdb,把有配置文件的db源码拷贝到工程下的src目录,如图 3-2所示。
图 3-2 libdb工程
为了不破坏源码工程的结构,移植需要手动修改Makefile,设置工程属性为专家模式,如图 3-3所示。
图 3-3 设置专家模式
3.2.2.参考Linux下的Makefile修改SylixOS的Makefile
打开Linux下的Makefile,找到编译需要依赖哪些*.c文件,如图 3-4所示。
图 3-4 Linux下Makefile
根据Makefile上C_OBJS找到具体依赖的*.c文件,如图 3-5所示。
图 3-5 DB数据库依赖的原文件
根据Linux下的Makefile手动修改IDE上libdb工程的libdb.mk文件,如图 3-6所示。
图 3-6 手动修改IDE的Makefile
3.2.3.修改编译错误
对libdb工程进行编译,会有关于头文件无效错误提示,修改原文件的头文件,如图 3-7所示。
图 3-7 修改头文件名的格式
修改文件依赖的头文件名格式后,仍有一处错误,如图 3-8所示。
图 3-8 出现的汇编错误
在mutex_int.h文件中有个关于LOAD_ACTUAL_MUTEX_CODE这个宏未定义,在Makefile中定义。这个宏功能为:打开ARM/gcc的一个关于互斥锁的汇编代码,如图 39所示。
图 3-9 Makefile中定义宏
修改过后编译成功,生成libdb.so文件导入虚拟机中。
3.2.4.测试DB数据库
编写测试代码,测试代码如程序清单 3-1所示。
程序清单 3-1 DB数据库测试代码
#include <stdio.h>#include <db.h>#include <string.h>#define DESCRIPTION_SIZE 20int main() {DB *dbp; /* DB structure handle */u_int32_t flags; /* database open flags */int ret; /* function return value */char *description = "Grocery bill.";char *description1[DESCRIPTION_SIZE + 1];DBT key, data;float money;/* Initialize the structure. This * database is not opened in an environment, * so the environment pointer is NULL. */ret = db_create(&dbp, NULL, 0);if (ret != 0) { /* Error handling goes here */printf("Create fail!\n");return -1;} /* Database open flags */flags = DB_CREATE; /* If the database does not exist,create it.*/ /* open the database */ret = dbp->open(dbp, /* DB structure pointer */ NULL, /* Transaction pointer */ "/apps/db_test/my_db.db", /* On-disk file that holds the database. */ NULL, /* Optional logical database name */ DB_BTREE, /* Database access method */ flags, /* Open flags */ 0); /* File mode (using defaults) */if (ret != 0) { /* Error handling goes here */printf("Created new database.\n");}money = 122.45;/* Zero out the DBTs before using them. */memset(&key, 0, sizeof(DBT));memset(&data, 0, sizeof(DBT));key.data = &money;key.size = sizeof(float);data.data = description;data.size = strlen(description) + 1;ret = dbp->put(dbp, NULL, &key, &data, DB_NOOVERWRITE);if (ret == DB_KEYEXIST) {dbp->err(dbp, ret, "Put failed because key %f already exists", money);}memset(&data, 0, sizeof(DBT));data.data = &description1;data.ulen = DESCRIPTION_SIZE + 1;data.flags = DB_DBT_USERMEM;dbp->get(dbp, NULL, &key, &data, 0);printf("data: %s\n", (char *) data.data);/* When we're done with the database, close it. */if (dbp != NULL)dbp->close(dbp, 0);return 0;}
程序运行现象如图 3-10所示。
图 3-10测试现象
测试产生一个DB数据库,并且从数据库中读取数据"Grocery bill."。
4.移植总结
4.1.移植流程
移植流程如下:
- 在官网下载源码;
- 在Linux下运行实现功能;
- 一般中间件网络上有移植笔记,可参考;
- 在Linux下利用configure功能产生配置文件(配置文件configure.h和Makefile等很重要);
- 参考Makefile修改IDE的工程****.mk文件(主要知晓中间件依赖的源文件);
- 在移植过程中请做好移植记录,以便查询修改信息;
- 如有修改或者添加功能实现请新建文件。
4.2.移植原则
移植原则如下:
- 做减法,先裁剪留出主要功能;
- 不修改内核源码,如有功能SylixOS暂未实现,可根据功能语义编写功能函数或该功能非主要可裁剪掉。
在移植编译过程中会出现各种错误,需要细心的根据错误信息查找错误位置,再根据SylixOS功能进行修改实现。
- SylixOS伯克利数据库移植笔记
- SylixOS ICAN 协议移植笔记
- Vxworks工程移植到SylixOS应用笔记
- 移植libnopoll到SylixOS技术笔记
- SylixOS之glib移植
- SylixOS音频驱动移植
- SylixOS移植Boa服务器
- 移植libffi到SylixOS
- SylixOS的LCD驱动移植
- SylixOS中间件移植方法总结
- SylixOS SPI Flash驱动移植
- SylixOS下移植C++工程
- SylixOS移植Redis库总结
- x86部署安装sylixos应用笔记
- SylixOS里CT365 I2C触控驱动移植
- SylixOS 里NUC970平台上SPI总线驱动移植
- SylixOS基于Nuc970平台的SD驱动移植
- SylixOS下移植C++程序——命名粉碎
- 08 串口通信
- 简历中的star法则
- 锂电池过充电、过放电、短路保护电路详解
- 微信支付相关流程(总结下最近做微信支付时需要注意的部分)
- 安卓 服务(2)
- SylixOS伯克利数据库移植笔记
- thinking in C++
- Java学习笔记
- Ubuntu报“xxx is not in the sudoers file.This incident will be reported” 错误解决方法
- 矩阵快速幂学习入门
- angularjs学习总结 详细教程
- NIO
- 笔记之Day01
- 友元函数