[关闭]
@cyysu 2018-03-05T05:57:44.000000Z 字数 3923 阅读 942

BDB数据库移植

  • 时间:2018年2月27日14:56:20
  • 作者:Kali
  • 邮箱:cyysu.github.io@gmail.com/2869905223@qq.com/微信lwyx1413
  • 版本:6.0
  • 描述:BDB数据库移植

BDB数据库


编译

  1. #!/bin/bash
  2. # 将当前内容保存为一个sh文件,放在根目录下
  3. export CC=arm-none-linux-gnueabi-gcc
  4. mkdir -p ./buid_arm && cd buid_arm
  5. sudo ../dist/configure --host=arm
  6. sudo make && sudo make install
  1. env CC=/opt/arm-2011.03/bin/arm-none-linux-gnueabi-gcc STRIP=/opt/arm-2011.03/bin/arm-none-linux-gnueabi-strip ../dist/configure --enable-sql --disable-java --disable-tcl --disable-jdbc --host=arm
  1. # 此处编译文件大小为11M
  2. env CC=/opt/arm-2011.03/bin/arm-none-linux-gnueabi-gcc STRIP=/opt/arm-2011.03/bin/arm-none-linux-gnueabi-strip ../dist/configure --enable-sql --disable-java --disable-tcl --disable-jdbc --enable-smallbuild --host=arm

下载链接

http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/index.html

测试Demo

  1. #include <db.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <pthread.h>
  5. /* DB的函数执行完成后,返回0代表成功,否则失败 */
  6. void print_error(int ret) {
  7. if (ret != 0)
  8. printf("ERROR: %s\n", db_strerror(ret));
  9. }
  10. /* 数据结构DBT在使用前,应首先初始化,否则编译可通过但运行时报参数错误 */
  11. void init_DBT(DBT * key, DBT * data) {
  12. memset(key, 0, sizeof(DBT));
  13. memset(data, 0, sizeof(DBT));
  14. }
  15. void main(void) {
  16. DB *dbp;
  17. DBT key, data;
  18. u_int32_t flags;
  19. int ret;
  20. int number = 15;
  21. init_DBT(&key, &data);
  22. /* 第一步:首先创建数据库句柄 */
  23. ret = db_create(&dbp, NULL, 0);
  24. print_error(ret);
  25. /* 第二步:创建数据库标志 */
  26. flags = DB_CREATE;
  27. /* 第三步:创建一个名为single.db的数据库,使用B+树访问算法,本段代码演示对简单数据类型的处理 */
  28. ret = dbp->open(dbp, NULL, "single.db", NULL, DB_BTREE, flags, 0);
  29. print_error(ret);
  30. /* 分别对关键字和数据赋值和规定长度 */
  31. data.data = &number;
  32. data.size = sizeof(int);
  33. /* 把记录写入数据库中,不允许覆盖关键字相同的记录 */
  34. ret = dbp->put(dbp, NULL, &key, &data, DB_OVERWRITE_DUP);
  35. print_error(ret);
  36. /* 手动把缓存中的数据刷新到硬盘文件中,实际上在关闭数据库时,数据会被自动刷新 */
  37. dbp->sync(dbp,0);
  38. /* 从数据库中查询关键字为apple的记录 */
  39. ret = dbp->get(dbp, NULL, &key, &data, 0);
  40. /* 特别要注意数据结构DBT的字段data为void *型,所以在对data赋值和取值时,要做必要的类型转换。 */
  41. printf("The number = %d\n", *(int*) (data.data));
  42. if (dbp != NULL)
  43. dbp->close(dbp, 0);
  44. }

综合例子

  1. #include <db.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <pthread.h>
  5. /* DB的函数执行完成后,返回0代表成功,否则失败 */
  6. void print_error(int ret) {
  7. if (ret != 0)
  8. printf("ERROR: %s\n", db_strerror(ret));
  9. }
  10. /* 数据结构DBT在使用前,应首先初始化,否则编译可通过但运行时报参数错误 */
  11. void init_DBT(DBT * key, DBT * data) {
  12. memset(key, 0, sizeof(DBT));
  13. memset(data, 0, sizeof(DBT));
  14. }
  15. void main(void) {
  16. DB *dbp;
  17. DBT key, data;
  18. u_int32_t flags;
  19. int ret;
  20. char *fruit = "apple";
  21. int number = 15;
  22. typedef struct customer {
  23. int c_id;
  24. char name[10];
  25. char address[20];
  26. int age;
  27. } CUSTOMER;
  28. CUSTOMER cust;
  29. int key_cust_c_id = 1;
  30. cust.c_id = 1;
  31. strncpy(cust.name, "javer", 9);
  32. strncpy(cust.address, "chengdu", 19);
  33. cust.age = 32;
  34. /* 首先创建数据库句柄 */
  35. ret = db_create(&dbp, NULL, 0);
  36. print_error(ret);
  37. /* 创建数据库标志 */
  38. flags = DB_CREATE;
  39. /* 创建一个名为single.db的数据库,使用B+树访问算法,本段代码演示对简单数据类型的处理 */
  40. ret = dbp->open(dbp, NULL, "single.db", NULL, DB_BTREE, flags, 0);
  41. print_error(ret);
  42. init_DBT(&key, &data);
  43. /* 分别对关键字和数据赋值和规定长度 */
  44. key.data = fruit;
  45. key.size = strlen(fruit) + 1;
  46. data.data = &number;
  47. data.size = sizeof(int);
  48. /* 把记录写入数据库中,不允许覆盖关键字相同的记录 */
  49. ret = dbp->put(dbp, NULL, &key, &data, DB_OVERWRITE_DUP);
  50. print_error(ret);
  51. /* 手动把缓存中的数据刷新到硬盘文件中,实际上在关闭数据库时,数据会被自动刷新 */
  52. dbp->sync(dbp,0);
  53. init_DBT(&key, &data);
  54. key.data = fruit;
  55. key.size = strlen(fruit) + 1;
  56. /* 从数据库中查询关键字为apple的记录 */
  57. ret = dbp->get(dbp, NULL, &key, &data, 0);
  58. print_error(ret);
  59. /* 特别要注意数据结构DBT的字段data为void *型,所以在对data赋值和取值时,要做必要的类型转换。 */
  60. printf("The number = %d\n", *(int*) (data.data));
  61. if (dbp != NULL)
  62. dbp->close(dbp, 0);
  63. ret = db_create(&dbp, NULL, 0);
  64. print_error(ret);
  65. flags = DB_CREATE;
  66. /* 创建一个名为complex.db的数据库,使用HASH访问算法,本段代码演示对复杂数据结构的处理 */
  67. ret = dbp->open(dbp, NULL, "complex.db", NULL, DB_HASH, flags, 0);
  68. print_error(ret);
  69. init_DBT(&key, &data);
  70. key.size = sizeof(int);
  71. key.data = &(cust.c_id);
  72. data.size = sizeof(CUSTOMER);
  73. data.data = &cust;
  74. ret = dbp->put(dbp, NULL, &key, &data, DB_OVERWRITE_DUP);
  75. print_error(ret);
  76. memset(&cust, 0, sizeof(CUSTOMER));
  77. key.size = sizeof(int);
  78. key.data = &key_cust_c_id;
  79. data.data = &cust;
  80. data.ulen = sizeof(CUSTOMER);
  81. data.flags = DB_DBT_USERMEM;
  82. dbp->get(dbp, NULL, &key, &data, 0);
  83. print_error(ret);
  84. printf("c_id = %d name = %s address = %s age = %d\n", cust.c_id, cust.name,
  85. cust.address, cust.age);
  86. if (dbp != NULL)
  87. dbp->close(dbp, 0);
  88. }

结束语

以上内容有笔者自己编写,也有摘自互联网。摘自互联网部分笔者都会仔细阅读,确保符合笔者当时测试情况进行编写,当然在学习的过程中不可避免的有理解不到位的地方,还请读友批评指正。

打赏

                    支付宝                                                         微信

微信与支付宝支付

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注