分享
 
 
 

Berkeley DB使用方法

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

Berkeley DB是Sleepcat开发的开源的嵌入式数据库。具有轻巧、可扩展的优点。

但是它不支持SQL语句,而且操作起来相对比较复杂。

下面讲讲在VC下为了使其能够存储数据结构做的封装。

在google搜索Berkely DB 进入sleepycat下载zip安装包,编译。

建立工程TestBerkeleyDB,拷贝libdb43.dll和libdb43.lib到当前工程下,添加libdb43.dll到工程的setting。

把db.h和db_cxx.h拷贝到当前目录下。

添加icqtypes.h:

#ifndef _ICQ_TYPES_H_

#define _ICQ_TYPES_H_

#include <string>

#include <list>

#include <vector>

#include <bitset>

using namespace std;

typedef unsigned char uint8;

typedef unsigned short uint16;

typedef unsigned long uint32;

typedef list<string> StrList;

typedef list<void *> PtrList;

typedef list<uint32> UinList;

#endif

添加icqdb.h;

#ifndef _ICQ_DB_H

#define _ICQ_DB_H

#include "icqtypes.h"

#include "db_cxx.h"

#define MAX_BLOCK_SIZE 4096

class DBOutStream {

public:

DBOutStream() {

cursor = data;

}

char *getData() {

return data;

}

int getSize() {

return (cursor - data);

}

DBOutStream &operator <<(uint8 b);

DBOutStream &operator <<(uint16 w);

DBOutStream &operator <<(uint32 dw);

DBOutStream &operator <<(const char *str);

DBOutStream &operator <<(const string &str) {

return operator <<(str.c_str());

}

DBOutStream &operator <<(StrList &strList);

private:

char data[MAX_BLOCK_SIZE];

char *cursor;

};

class DBInStream {

public:

DBInStream(void *d, int n) {

cursor = data = (char *) d;

datalen = n;

}

DBInStream &operator >>(uint8 &b);

DBInStream &operator >>(uint16 &w);

DBInStream &operator >>(uint32 &dw);

DBInStream &operator >>(string &str);

DBInStream &operator >>(StrList &strList);

private:

char *data;

char *cursor;

int datalen;

};

class DBSerialize {

public:

virtual void save(DBOutStream &out) = 0;

virtual void load(DBInStream &in) = 0;

};

#endif

添加icqdb.cpp:

#include "stdafx.h"

#include "icqdb.h"

#include "string.h"

#include "icqtypes.h"

#define INDEX_USER 0

#define INDEX_OPTIONS 0xffffffff

#define INDEX_GROUP 0xfffffffe

DBOutStream &DBOutStream::operator <<(uint8 b)

{

if (cursor <= data + MAX_BLOCK_SIZE - sizeof(b))

*cursor++ = b;

return (*this);

}

DBOutStream &DBOutStream::operator <<(uint16 w)

{

if (cursor <= data + MAX_BLOCK_SIZE - sizeof(w)) {

*(uint16 *) cursor = w;

cursor += sizeof(w);

}

return (*this);

}

DBOutStream &DBOutStream::operator <<(uint32 dw)

{

if (cursor <= data + MAX_BLOCK_SIZE - sizeof(dw)) {

*(uint32 *) cursor = dw;

cursor += sizeof(dw);

}

return (*this);

}

DBOutStream &DBOutStream::operator <<(const char *str)

{

uint16 len = strlen(str) + 1;

if (cursor <= data + MAX_BLOCK_SIZE - sizeof(len) - len) {

*this << len;

memcpy(cursor, str, len);

cursor += len;

}

return (*this);

}

DBOutStream &DBOutStream::operator <<(StrList &strList)

{

uint16 n = 0;

char *old = cursor;

cursor += sizeof(n);

StrList::iterator i;

for (i = strList.begin(); i != strList.end(); i++) {

operator <<(*i);

n++;

}

char *p = cursor;

cursor = old;

operator <<(n);

cursor = p;

return (*this);

}

DBInStream &DBInStream::operator >>(uint8 &b)

{

if (cursor <= data + datalen - sizeof(b))

b = *cursor++;

else

b = 0;

return (*this);

}

DBInStream &DBInStream::operator >>(uint16 &w)

{

if (cursor <= data + datalen - sizeof(w)) {

w = *(uint16 *) cursor;

cursor += sizeof(w);

} else

w = 0;

return (*this);

}

DBInStream &DBInStream::operator >>(uint32 &dw)

{

if (cursor <= data + datalen - sizeof(dw)) {

dw = *(uint32 *) cursor;

cursor += sizeof(dw);

} else

dw = 0;

return (*this);

}

DBInStream &DBInStream::operator >>(string &str)

{

uint16 len;

operator >>(len);

if (cursor <= data + datalen - len && !cursor[len - 1]) {

str = cursor;

cursor += len;

} else

str = "";

return (*this);

}

DBInStream &DBInStream::operator >>(StrList &strList)

{

uint16 num;

operator >>(num);

int n = (int) num;

strList.clear();

while (n-- > 0) {

string s;

operator >>(s);

strList.push_back(s);

}

return (*this);

}

添加CPerson类:

CPerson.h:

// Person.h: interface for the CPerson class.

//

//////////////////////////////////////////////////////////////////////

#if !defined(AFX_PERSON_H__D259A8B7_7ACB_4624_8C9E_394B11FFA5C9__INCLUDED_)

#define AFX_PERSON_H__D259A8B7_7ACB_4624_8C9E_394B11FFA5C9__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#include "icqdb.h"

class CPerson: public DBSerialize

{

public:

CPerson();

virtual ~CPerson();

public:

string Name;

uint16 age;

string Describe;

void save(DBOutStream &out);

void load(DBInStream &in);

};

#endif // !defined(AFX_PERSON_H__D259A8B7_7ACB_4624_8C9E_394B11FFA5C9__INCLUDED_)

Person.cpp:

// Person.cpp: implementation of the CPerson class.

//

//////////////////////////////////////////////////////////////////////

#include "stdafx.h"

#include "TestBerkeleyDB.h"

#include "Person.h"

#ifdef _DEBUG

#undef THIS_FILE

static char THIS_FILE[]=__FILE__;

#define new DEBUG_NEW

#endif

//////////////////////////////////////////////////////////////////////

// Construction/Destruction

//////////////////////////////////////////////////////////////////////

CPerson::CPerson()

{

}

CPerson::~CPerson()

{

}

void CPerson::save(DBOutStream &out)

{

out << Name << age << Describe;

}

void CPerson::load(DBInStream &in)

{

in >> Name >> age >> Describe;

}

下面是主函数:

// TestBerkeleyDB.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include "TestBerkeleyDB.h"

#include "db_cxx.h"

#include "icqtypes.h"

#include "icqdb.h"

#include "Person.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// The one and only application object

CWinApp theApp;

//using namespace std;

bool delPeople(char *fileName, string index)

{

Db db(NULL, 0); // Instantiate the Db object

u_int32_t oFlags = DB_CREATE; // Open flags;

try {

// Open the database

db.open(NULL, // Transaction pointer

fileName, // Database file name

NULL, // Optional logical database name

DB_BTREE, // Database access method

oFlags, // Open flags

0); // File mode (using defaults)

// DbException is not subclassed from std::exception, so

// need to catch both of these.

} catch(DbException &e) {

// Error handling code goes here

} catch(std::exception &e) {

// Error handling code goes here

}

Dbc *cursorp;

try {

// Database open omitted

// Get the cursor

db.cursor(NULL, &cursorp, 0);

// Set up our DBTs

Dbt data;

Dbt key;

key.set_data((void*)index.c_str());

key.set_size(index.length()+1);

// Iterate over the database, deleting each record in turn.

int ret;

while ((ret = cursorp->get(&key, &data,

DB_SET)) == 0) {

cursorp->del(0);

}

} catch(DbException &e) {

db.err(e.get_errno(), "Error!");

} catch(std::exception &e) {

db.errx("Error! %s", e.what());

}

// Cursors must be closed

if (cursorp != NULL)

cursorp->close();

db.close(0);

return true;

}

bool delPeople(char *fileName, uint32 index)

{

Db db(NULL, 0); // Instantiate the Db object

u_int32_t oFlags = DB_CREATE; // Open flags;

try {

// Open the database

db.open(NULL, // Transaction pointer

fileName, // Database file name

NULL, // Optional logical database name

DB_BTREE, // Database access method

oFlags, // Open flags

0); // File mode (using defaults)

// DbException is not subclassed from std::exception, so

// need to catch both of these.

} catch(DbException &e) {

// Error handling code goes here

} catch(std::exception &e) {

// Error handling code goes here

}

Dbc *cursorp;

try {

// Database open omitted

// Get the cursor

db.cursor(NULL, &cursorp, 0);

// Set up our DBTs

Dbt data;

Dbt key;

key.set_data(&index);

key.set_size(sizeof(index));

// Iterate over the database, deleting each record in turn.

int ret;

while ((ret = cursorp->get(&key, &data,

DB_SET)) == 0) {

cursorp->del(0);

}

} catch(DbException &e) {

db.err(e.get_errno(), "Error!");

} catch(std::exception &e) {

db.errx("Error! %s", e.what());

}

// Cursors must be closed

if (cursorp != NULL)

cursorp->close();

db.close(0);

return true;

}

bool loadPeople(char *fileName, uint32 index, DBSerialize &obj)

{

Db db(NULL, 0); // Instantiate the Db object

u_int32_t oFlags = DB_CREATE; // Open flags;

try {

// Open the database

db.open(NULL, // Transaction pointer

fileName, // Database file name

NULL, // Optional logical database name

DB_BTREE, // Database access method

oFlags, // Open flags

0); // File mode (using defaults)

// DbException is not subclassed from std::exception, so

// need to catch both of these.

} catch(DbException &e) {

// Error handling code goes here

} catch(std::exception &e) {

// Error handling code goes here

}

Dbt key, data;

key.set_data(&index);

key.set_size(sizeof(index));

if (db.get(NULL, &key, &data, 0) != 0) {

db.close(0);

return false;

}

DBInStream in(data.get_data(), data.get_size());

obj.load(in);

db.close(0);

return true;

}

bool loadPeople(char *fileName, string index, DBSerialize &obj)

{

Db db(NULL, 0); // Instantiate the Db object

u_int32_t oFlags = DB_CREATE; // Open flags;

try {

// Open the database

db.open(NULL, // Transaction pointer

fileName, // Database file name

NULL, // Optional logical database name

DB_BTREE, // Database access method

oFlags, // Open flags

0); // File mode (using defaults)

// DbException is not subclassed from std::exception, so

// need to catch both of these.

} catch(DbException &e) {

// Error handling code goes here

} catch(std::exception &e) {

// Error handling code goes here

}

Dbt key, data;

key.set_data((void*)index.c_str());

key.set_size(index.length()+1);

if (db.get(NULL, &key, &data, 0) != 0) {

db.close(0);

return false;

}

DBInStream in(data.get_data(), data.get_size());

obj.load(in);

db.close(0);

return true;

}

bool savePeople(char *fileName, uint32 index, DBSerialize &obj)

{

Db db(NULL, 0); // Instantiate the Db object

u_int32_t oFlags = DB_CREATE; // Open flags;

try {

// Open the database

db.open(NULL, // Transaction pointer

fileName, // Database file name

NULL, // Optional logical database name

DB_BTREE, // Database access method

oFlags, // Open flags

0); // File mode (using defaults)

// DbException is not subclassed from std::exception, so

// need to catch both of these.

} catch(DbException &e) {

// Error handling code goes here

} catch(std::exception &e) {

// Error handling code goes here

}

DBOutStream out;

obj.save(out);

Dbt key, data;

key.set_data(&index);

key.set_size(sizeof(index));

data.set_data(out.getData());

data.set_size(out.getSize());

int ret = db.put(NULL, &key, &data, 0) ;

db.close(0);

return (ret == 0);

}

bool savePeople(char *fileName, string index, DBSerialize &obj)

{

Db db(NULL, 0); // Instantiate the Db object

u_int32_t oFlags = DB_CREATE; // Open flags;

try {

// Open the database

db.open(NULL, // Transaction pointer

fileName, // Database file name

NULL, // Optional logical database name

DB_BTREE, // Database access method

oFlags, // Open flags

0); // File mode (using defaults)

// DbException is not subclassed from std::exception, so

// need to catch both of these.

} catch(DbException &e) {

// Error handling code goes here

} catch(std::exception &e) {

// Error handling code goes here

}

DBOutStream out;

obj.save(out);

Dbt key, data;

key.set_data((void*)index.c_str());

key.set_size(index.length()+1);

data.set_data(out.getData());

data.set_size(out.getSize());

int ret = db.put(NULL, &key, &data, 0);

db.close(0);

return (ret == 0);

}

bool printAllPeople(char *fileName)

{

Db db(NULL, 0); // Instantiate the Db object

u_int32_t oFlags = DB_CREATE; // Open flags;

try {

// Open the database

db.open(NULL, // Transaction pointer

fileName, // Database file name

NULL, // Optional logical database name

DB_BTREE, // Database access method

oFlags, // Open flags

0); // File mode (using defaults)

// DbException is not subclassed from std::exception, so

// need to catch both of these.

} catch(DbException &e) {

// Error handling code goes here

} catch(std::exception &e) {

// Error handling code goes here

}

Dbc *cursorp;

try {

// Database open omitted

// Get the cursor

db.cursor(NULL, &cursorp, 0);

// Set up our DBTs

Dbt data;

Dbt key;

// Iterate over the database, deleting each record in turn.

int ret;

while ((ret = cursorp->get(&key, &data,

DB_NEXT)) == 0) {

//cursorp->del(0);

CPerson p;

DBInStream in(data.get_data(), data.get_size());

p.load(in);

printf("%s\n",p.Describe);

}

} catch(DbException &e) {

db.err(e.get_errno(), "Error!");

} catch(std::exception &e) {

db.errx("Error! %s", e.what());

}

// Cursors must be closed

if (cursorp != NULL)

cursorp->close();

db.close(0);

return true;

}

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])

{

int nRetCode = 0;

// initialize MFC and print and error on failure

if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))

{

// TODO: change error code to suit your needs

cerr << _T("Fatal Error: MFC initialization failed") << endl;

nRetCode = 1;

}

else

{

string index1 = "Liang Zhijian";

string index2 = "Zou Dan";

CPerson p1;

p1.age = 0;

p1.Name = "Liang Zhijian";

p1.Describe = "student1";

savePeople("mydb.db",index1,p1);

CPerson p2;

p2.age = 1;

p2.Name = "Zou Dan";

p2.Describe = "student2";

savePeople("mydb.db",index2,p2);

CPerson p3;

loadPeople("mydb.db","Liang Zhijian",p3);

printf("%s\n",p3.Describe);

printAllPeople("mydb.db");

delPeople("mydb.db","Liang Zhijian");

printAllPeople("mydb.db");

}

return nRetCode;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有