• [转]BDB实例代码


    BTree读写

    1. Db db(NULL,DB_CXX_NO_EXCEPTIONS);//环境指针  
    2.   
    3. //事务指针,数据库类别,访问标志(创建,只读,自动提交事务,线程安全),mode在windows中忽略  
    4. if(db.open(NULL,"test.db",NULL,DB_BTREE,DB_CREATE|DB_TRUNCATE,0)!=0)  
    5. {  
    6.     cout<<"同名数据库存在"<<endl;  
    7. }  
    8.   
    9. //基本写  
    10. int  nKey=1;  
    11. char szBuf[100]="愚蠢的人类啊";  
    12. Dbt key,value;  
    13. key.set_data(&nKey);  
    14. key.set_size(4);  
    15. value.set_data(szBuf);  
    16. value.set_size(sizeof(szBuf));  
    17. if(db.put(NULL,&key,&value,0)!=0)  
    18. {  
    19.     cout<<"写入失败"<<endl;  
    20. }  
    21.   
    22. //基本读  
    23. char szBufRead[100]={0};  
    24. Dbt readKey,readValue;  
    25. readKey.set_data(&nKey);  
    26. readKey.set_size(4);  
    27. readValue.set_data(szBufRead);  
    28. readValue.set_ulen(100);  
    29. readValue.set_flags(DB_DBT_USERMEM);  
    30. if(db.get(NULL,&readKey,&readValue,0)!=0)  
    31. {  
    32.     cout<<"读取失败"<<endl;  
    33. }  
    34.   
    35. cout<<szBufRead<<endl;  


     

    Queue读写

    1. Db db(NULL,DB_CXX_NO_EXCEPTIONS);//环境指针     
    2.   
    3. db.set_re_len(100);  
    4. db.set_re_pad(0);  
    5.     
    6. //事务指针,数据库类别,访问标志(创建,只读,自动提交事务,线程安全),mode在windows中忽略     
    7. if(db.open(NULL,"DB\\test.db",NULL,DB_QUEUE,DB_CREATE|DB_TRUNCATE,0)!=0)    
    8. {    
    9.     std::cout<<"同名数据库存在"<<std::endl;    
    10. }    
    11.     
    12. //基本写   
    13. char szBuf[100]="愚蠢的人类啊";    
    14. int nkey=0;  
    15. Dbt key(&nkey,sizeof(nkey));  
    16. Dbt value;  
    17. value.set_data(szBuf);    
    18. value.set_size(sizeof(szBuf));    
    19. if(db.put(NULL,&key,&value,DB_APPEND)!=0)    
    20. {    
    21.     cout<<"写入失败"<<endl;    
    22. }    
    23. cout<<"返回的记录号为:"<<*((int*)key.get_data())<<endl;  

    游标基本读写删

    1. Db db(NULL,DB_CXX_NO_EXCEPTIONS);//环境指针  
    2. //事务指针,数据库类别,访问标志(创建,只读,自动提交事务,线程安全),mode在windows中忽略     
    3. if(db.open(NULL,"test.db",NULL,DB_BTREE,DB_CREATE|DB_TRUNCATE,0)!=0)    
    4. {    
    5.     cout<<"同名数据库存在"<<endl;    
    6. }    
    7.     
    8. //基本写     
    9. int  nKey=1;    
    10. char szBuf[100]="愚蠢的人类啊";    
    11.   
    12. Dbt key,value;    
    13. key.set_data(&nKey);    
    14. key.set_size(4);    
    15. value.set_data(szBuf);    
    16. value.set_size(sizeof(szBuf));    
    17.   
    18. for(int i=0;i<100;++i)  
    19. {  
    20.     nKey=i;  
    21.     if(db.put(NULL,&key,&value,0)!=0)    
    22.     {    
    23.         cout<<"写入失败"<<endl;    
    24.     }    
    25. }  
    26.   
    27. //游标读  
    28. Dbc *p=0;  
    29. db.cursor(NULL,&p,0);  
    30. Dbt key1,value1;  
    31. while(p->get(&key1,&value1,DB_NEXT)==0)  
    32. {  
    33.     cout<<"键:"<<(*((int *)key1.get_data()))<<"值:"<<(char*)(value1.get_data())<<endl;  
    34. }  
    35. //备注:游标没有函数返回当前有多少个键  
    36.   
    37. //查找  
    38. nKey=80;  
    39. key1.set_data(&nKey);  
    40. key1.set_size(sizeof(int));  
    41. p->get(&key1,&value1,DB_SET);  
    42. p->del(0);  
    43.   
    44. //游标读  
    45. Dbc *p1=0;  
    46. db.cursor(NULL,&p1,0);  
    47. while(p1->get(&key1,&value1,DB_NEXT)==0)  
    48. {  
    49.     cout<<"键:"<<(*((int *)key1.get_data()))<<"值:"<<(char*)(value1.get_data())<<endl;  
    50. }  

    数据库支持重复记录

    1. Db db(NULL,DB_CXX_NO_EXCEPTIONS);//环境指针     
    2.     
    3.     db.set_flags(DB_DUP);  
    4.   
    5.     //事务指针,数据库类别,访问标志(创建,只读,自动提交事务,线程安全),mode在windows中忽略     
    6.     if(db.open(NULL,"test.db",NULL,DB_BTREE,DB_CREATE|DB_TRUNCATE,0)!=0)    
    7.     {    
    8.         cout<<"同名数据库存在"<<endl;    
    9.     }    
    10.     
    11.     //基本写        
    12.     int  nKey=1;      
    13.     char szBuf[100]="愚蠢的人类啊";      
    14.     
    15.     Dbt key,value;      
    16.     key.set_data(&nKey);      
    17.     key.set_size(4);      
    18.     value.set_data(szBuf);      
    19.     value.set_size(sizeof(szBuf));      
    20.     
    21.     for(int i=0;i<5;++i)    
    22.     {     
    23.         if(db.put(NULL,&key,&value,0)!=0)      
    24.         {      
    25.             cout<<"写入失败"<<endl;      
    26.         }      
    27.     }    
    28.   
    29.     //游标读     
    30.     Dbc *p=0;    
    31.     db.cursor(NULL,&p,0);    
    32.     Dbt key1,value1;    
    33.     while(p->get(&key1,&value1,DB_NEXT)==0)    
    34.     {    
    35.         cout<<"键:"<<(*((int *)key1.get_data()))<<"值:"<<(char*)(value1.get_data())<<endl;    
    36.     }    

    基本环境操作

    1. DbEnv evn(0);  
    2. if(evn.open("DB",DB_CREATE|DB_INIT_MPOOL,0)!=0)  
    3. {  
    4.     cout<<"打开环境错误"<<endl;  
    5.     return 0;  
    6. }  
    7. Db db(&evn,DB_CXX_NO_EXCEPTIONS);//环境指针     
    8.    
    9.   
    10. //事务指针,数据库类别,访问标志(创建,只读,自动提交事务,线程安全),mode在windows中忽略     
    11. if(db.open(NULL,"test.db",NULL,DB_BTREE,DB_CREATE|DB_TRUNCATE,0)!=0)    
    12. {    
    13.     cout<<"同名数据库存在"<<endl;    
    14. }    

    游标的覆盖操作

    1. Db db(NULL,DB_CXX_NO_EXCEPTIONS);  
    2. db.set_flags(DB_DUP);  
    3. if(db.open(NULL,"DB\\test.db",NULL,DB_BTREE,DB_CREATE|DB_TRUNCATE,0)!=0)  
    4. {  
    5.     cout<<"打开错误"<<endl;  
    6.     return 0;  
    7. }  
    8.   
    9. int nkey=1;  
    10. char szBuf[100]="愚蠢的地球人";  
    11. Dbt key(&nkey,sizeof(int));  
    12. Dbt value(szBuf,strlen(szBuf));  
    13.   
    14. for(int i=0;i<5;++i)  
    15. {  
    16.     db.put(NULL,&key,&value,0);  
    17. }  
    18.   
    19. Dbc *currsor=0;  
    20. db.cursor(NULL,&currsor,0);  
    21.   
    22. Dbt key1;  
    23. Dbt value1;  
    24. sprintf(szBuf,"愚蠢的火星人");  
    25. currsor->get(&key1,&value1,DB_FIRST);  
    26. currsor->get(&key1,&value1,DB_NEXT);  
    27. nkey=100;  
    28. if(currsor->put(&key,&value,DB_CURRENT)!=0)  
    29. {  
    30.     cout<<"put失败"<<endl;  
    31. }  
    32. currsor->get(&key1,&value1,DB_FIRST);  
    33. cout<<*((int *)key1.get_data())<<":"<<(char*)value1.get_data()<<endl;  
    34.   
    35. while(currsor->get(&key1,&value1,DB_NEXT)==0)  
    36. {  
    37.     cout<<*((int *)key1.get_data())<<":"<<(char*)value1.get_data()<<endl;  
    38. }  

    二级数据库 没成功

    1. struct Info  
    2. {  
    3.     char name[20];  
    4.     int  age;  
    5. };  
    6.   
    7. int Fun(Db *pSecondary,const Dbt *key,const Dbt *value,Dbt *result)  
    8. {  
    9.     //result->set_flags(DB_DBT_APPMALLOC);  
    10.     Info *p=(Info *)value->get_data();  
    11.     result->set_data((void *)(p->age));  
    12.     result->set_size(sizeof(int));  
    13.     //result->set_ulen(4);  
    14.     return 0;  
    15. };  
    16.   
    17. int _tmain(int argc, _TCHAR* argv[])  
    18. {  
    19.     Db dbPrimary(NULL,DB_CXX_NO_EXCEPTIONS);  
    20.     if(dbPrimary.open(NULL,"DB\\Primary.db",NULL,DB_BTREE,DB_CREATE|DB_TRUNCATE,0)!=0)  
    21.     {  
    22.         cout<<"打开错误"<<endl;  
    23.         return 0;  
    24.     }  
    25.   
    26.     Dbt key,value;  
    27.     int nID=0;  
    28.     Info info;  
    29.     key.set_data(&nID);  
    30.     key.set_size(sizeof(int));  
    31.     value.set_data(&info);  
    32.     value.set_size(sizeof(Info));  
    33.       
    34.     int nReturn=0;  
    35.   
    36.     nID=100;  
    37.     sprintf(info.name,"张三");  
    38.     info.age=20;  
    39.     nReturn+=dbPrimary.put(NULL,&key,&value,0);  
    40.   
    41.     nID=200;  
    42.     sprintf(info.name,"里斯");  
    43.     info.age=10;  
    44.     nReturn+=dbPrimary.put(NULL,&key,&value,0);  
    45.   
    46.     nID=300;  
    47.     sprintf(info.name,"周杰伦");  
    48.     info.age=40;  
    49.     nReturn+=dbPrimary.put(NULL,&key,&value,0);  
    50.   
    51.     if(nReturn!=0)  
    52.     {  
    53.         cout<<"出错啦"<<endl;  
    54.         return 0;  
    55.     }  
    56.   
    57.   
    58.     Db dbSecondary(NULL,DB_CXX_NO_EXCEPTIONS);  
    59.     if(dbSecondary.open(NULL,"DB\\Secondary.db",NULL,DB_BTREE,DB_CREATE|DB_TRUNCATE,0)!=0)  
    60.     {  
    61.         cout<<"打开错误"<<endl;  
    62.         return 0;  
    63.     }  
    64.   
    65.     if(dbPrimary.associate(NULL,&dbSecondary,Fun,DB_CREATE)!=0)  
    66.     {  
    67.         cout<<"associate错误"<<endl;  
    68.         return 0;  
    69.     }  
    70.   
    71.   
    72.     /*Dbc *pCursor=0; 
    73.     if(dbSecondary.cursor(NULL,&pCursor,0)!=0) 
    74.     { 
    75.         cout<<"cursor创建错误"<<endl; 
    76.         return 0; 
    77.     } 
    78.     */  
    79.     nID=100;  
    80.     if(dbSecondary.get(NULL,&key,&value,0)==0)  
    81.     {  
    82.         cout<<((Info *)value.get_data())->name<<endl;  
    83.     }  
    84.   
    85.   
    86.     /*Dbt key1; 
    87.     Dbt value1; 
    88.  
    89.     nID=20; 
    90.     if(pCursor->get(&key1,&value1,DB_FIRST|DB_GET_BOTH)!=0) 
    91.     { 
    92.         if(pCursor->get(&key1,&value1,DB_FIRST)==DB_NOTFOUND) 
    93.             cout<<"没有元素"<<endl; 
    94.         cout<<"get错误"<<endl; 
    95.         return 0; 
    96.     } 
    97.     cout<<*((int *)key1.get_data())<<":"<<((Info *)value1.get_data())->name<<endl; 
    98.     while(pCursor->get(&key1,&value1,DB_NEXT)!=0) 
    99.     { 
    100.         cout<<*((int *)key1.get_data())<<":"<<(char *)value1.get_data()<<endl; 
    101.     }*/  
    102.   
    103.     return 0;  
    104. }  

    部分写

    1. Db dbPrimary(NULL,DB_CXX_NO_EXCEPTIONS);  
    2. if(dbPrimary.open(NULL,"DB\\Primary.db",NULL,DB_BTREE,DB_CREATE|DB_TRUNCATE,0)!=0)  
    3. {  
    4.     cout<<"打开错误"<<endl;  
    5.     return 0;  
    6. }  
    7.   
    8. Dbt key,value;  
    9. int nID=0;  
    10. Info info;  
    11. key.set_data(&nID);  
    12. key.set_size(sizeof(int));  
    13. value.set_data(&info);  
    14. value.set_size(sizeof(Info));  
    15.       
    16. int nReturn=0;  
    17.   
    18. nID=100;  
    19. sprintf(info.name,"张三");  
    20. info.age=20;  
    21. nReturn+=dbPrimary.put(NULL,&key,&value,0);  
    22.   
    23. nID=200;  
    24. sprintf(info.name,"里斯");  
    25. info.age=10;  
    26. nReturn+=dbPrimary.put(NULL,&key,&value,0);  
    27.   
    28. nID=300;  
    29. sprintf(info.name,"周杰伦");  
    30. info.age=40;  
    31. nReturn+=dbPrimary.put(NULL,&key,&value,0);  
    32.   
    33. if(nReturn!=0)  
    34. {  
    35.     cout<<"出错啦"<<endl;  
    36.     return 0;  
    37. }  
    38.   
    39. nID=200;  
    40. char name[20]={"四"};  
    41. Dbt bt;  
    42. bt.set_flags(DB_DBT_PARTIAL);  
    43. bt.set_data(name);  
    44. bt.set_size(20);  
    45. bt.set_doff(0);  
    46. bt.set_dlen(20);  
    47. if(dbPrimary.put(NULL,&key,&bt,NULL)==0)  
    48. {  
    49.     cout<<"成功"<<endl;  
    50.   
    51.     Dbc *pCursor=0;  
    52.     dbPrimary.cursor(NULL,&pCursor,0);  
    53.   
    54.     Dbt key1,value1;  
    55.     while(pCursor->get(&key1,&value1,DB_NEXT)==0)  
    56.     {  
    57.         cout<<*((int *)(key1.get_data()))<<":"<<((Info *)(value1.get_data()))->name<<":"<<((Info *)(value1.get_data()))->age<<endl;  
    58.     }  
    59. }  

    事务

    1. DbEnv env(0);  
    2. env.set_data_dir("Database");  
    3. env.set_lg_dir("Log");  
    4. //日志系统木默认是开启的  
    5. env.open("Environment",DB_CREATE|DB_INIT_MPOOL|DB_INIT_TXN|DB_INIT_LOCK|DB_PRIVATE,0);  
    6.   
    7. Db dbPrimary(&env,DB_CXX_NO_EXCEPTIONS);  
    8.   
    9. DbTxn *pTxn;  
    10. env.txn_begin(NULL,&pTxn,0);  
    11. if(dbPrimary.open(pTxn,"Primary.db",NULL,DB_BTREE,DB_CREATE,0)!=0)  
    12. {  
    13.     cout<<"打开错误"<<endl;  
    14.     return 0;  
    15. }  
    16. pTxn->commit(0);  
    17.   
    18. Dbt key,value;  
    19. int nID=0;  
    20. Info info;  
    21. key.set_data(&nID);  
    22. key.set_size(sizeof(int));  
    23. value.set_data(&info);  
    24. value.set_size(sizeof(Info));  
    25.       
    26. int nReturn=0;  
    27.   
    28. nID=100;  
    29. sprintf(info.name,"张三");  
    30. info.age=20;  
    31.   
    32. nReturn+=dbPrimary.put(NULL,&key,&value,0);  
    33.   
    34.   
    35. nID=200;  
    36. sprintf(info.name,"里斯");  
    37. info.age=10;  
    38.   
    39. int ntime1=timeGetTime();  
    40.   
    41. for(int i=0;i<1000000;++i)  
    42. {  
    43.     nID+=1;  
    44.     env.txn_begin(NULL,&pTxn,0);  
    45.     dbPrimary.put(pTxn,&key,&value,0);  
    46.     pTxn->abort();  
    47. }  
    48. int ntime2=timeGetTime();  
    49. cout<<ntime2-ntime1<<endl;  
    50.   
    51. env.txn_begin(NULL,&pTxn,0);  
    52. nID=300;  
    53. sprintf(info.name,"周杰伦");  
    54. info.age=40;  
    55. nReturn+=dbPrimary.put(pTxn,&key,&value,0);  
    56. pTxn->abort();  
    57.   
    58. if(nReturn!=0)  
    59. {  
    60.     cout<<"出错啦"<<endl;  
    61.     return 0;  
    62. }  
    63.   
    64. Dbc *pCursor=0;  
    65. dbPrimary.cursor(NULL,&pCursor,0);  
    66.   
    67. Dbt key1,value1;  
    68. while(pCursor->get(&key1,&value1,DB_NEXT)==0)  
    69. {  
    70.     cout<<*((int *)(key1.get_data()))<<":"<<((Info *)(value1.get_data()))->name<<":"<<((Info *)(value1.get_data()))->age<<endl;  
    71. }  

    最终方案

    1. DbEnv env(0);  
    2. env.set_data_dir("Database");  
    3. env.set_lg_dir("Log");  
    4.   
    5. env.set_cachesize(0,500*1024*1024,0);  
    6. env.log_set_config(DB_TXN_NOSYNC,1);  
    7. env.set_lg_bsize(300*1024*1024);  
    8.   
    9.   
    10. //日志系统木默认是开启的  
    11. env.open("Environment",DB_CREATE|DB_INIT_MPOOL|DB_INIT_TXN|DB_INIT_LOCK|DB_PRIVATE|DB_RECOVER,0);  
    12.   
    13. //打开数据库  
    14. Db dbPrimary(&env,DB_CXX_NO_EXCEPTIONS);  
    15. DbTxn *pTxn;  
    16. env.txn_begin(NULL,&pTxn,0);  
    17. if(dbPrimary.open(pTxn,"Primary.db",NULL,DB_BTREE,DB_CREATE,0)!=0)  
    18. {  
    19.     cout<<"打开错误"<<endl;  
    20.     return 0;  
    21. }  
    22. pTxn->commit(0);  
    23.   
    24. Dbt key,value;  
    25. int nID=0;  
    26. Info info;  
    27. key.set_data(&nID);  
    28. key.set_size(sizeof(int));  
    29. value.set_data(&info);  
    30. value.set_size(sizeof(Info));  
    31.       
    32. nID=200;  
    33. sprintf(info.name,"里斯");  
    34. info.age=10;  
    35.   
    36. int ntime1=timeGetTime();   
    37. env.txn_begin(NULL,&pTxn,0);  
    38. for(int i=0;i<20000;++i)  
    39. {  
    40.     nID+=1;  
    41.     dbPrimary.put(pTxn,&key,&value,0);  
    42. }  
    43. pTxn->commit(0);  
    44. int ntime2=timeGetTime();    
    45. cout<<(ntime2-ntime1)/1000<<endl;   
    46. system("pause");  

    一些配置

    1. DbEnv env(0);  
    2.     env.set_data_dir("Database");  
    3.     env.set_lg_dir("Log");  
    4.   
    5.     env.set_cachesize(0,500*1024*1024,0);  
    6.     env.log_set_config(DB_TXN_NOSYNC,1);  
    7.     env.set_lg_bsize(300*1024*1024);  
    8.     //db_env->set_lg_max()  
    9.   
    10.     //日志系统木默认是开启的  
    11.     env.open("Environment",DB_CREATE|DB_INIT_MPOOL|DB_INIT_TXN|DB_INIT_LOCK|DB_PRIVATE|DB_RECOVER,0);  
    12.     env.set_flags(DB_HOTBACKUP_IN_PROGRESS,1);  
    13.     env.txn_checkpoint(0,0,DB_FORCE);  
    14.     env.log_archive(NULL,DB_ARCH_REMOVE);  
    15.     env.log_set_config(DB_LOG_AUTO_REMOVE,1);  
    16.     env.txn_checkpoint(0,0,DB_FORCE);   





     



  • 相关阅读:
    求树中两个节点的最低公共祖先
    [2014校招笔试]判断单链表是否有环?
    二叉树的遍历
    求所有划分集合
    用rand5()生成rand(n)
    由等概率生成的0和1构建rand()函数
    等概率生成0和1
    求输出和为n的所有连续自然数序列
    求正整数n的所有因子
    css 2D转换总结
  • 原文地址:https://www.cnblogs.com/freebird92/p/2289889.html
Copyright © 2020-2023  润新知