下面这段代码示范了如何向数据库中添加新的数据:
int main()
{ DB *dbp;
DBT key, data;
int ret;
if ((ret = db_create(&dbp, NULL, 0)) != 0) {
fprintf(stderr, "db_create: %s\n", db_strerror(ret));
exit (1);
}
if ((ret = dbp->open(dbp,
NULL, DATABASE, NULL, DB_BTREE, DB_CREATE, 0664)) != 0) {
dbp->err(dbp, ret, "%s", DATABASE);
exit (1);
}
memset(&key, 0, sizeof(key));
memset(&data, 0, sizeof(data));
key.data = "sport";
key.size = sizeof("sport");
data.data = "football";
data.size = sizeof("football");
if ((ret = dbp->put(dbp, NULL, &key, &data, 0)) == 0)
printf("db: %s: key stored.\n", (char *)key.data);
else
dbp->err(dbp, ret, "DB->put");
}
代码首先声明了两个DBT结构变量,并分别用字符串“sport”和“football”进行填充。它们随后作为关键字和数据传递给用来添加数据的DB->put()函数。DBT结构几乎会在所有同数据访问相关的函数中被用到。
在向数据库中添加数据时,如果给定的关键字已经存在,大多数应用会对于已经存在的数据采用覆盖原则。也就是说,如果数据库中已经保存了一个“sport/basketball”对,再次调用DB->put()函数添加一个“sport/football”对,那么先前保存的那些数据将会被覆盖。但Berkeley DB允许在调用DB->put()函数时指定参数“DB_NOOVERWRITE”,声明不对数据库中已经存在的数据进行覆盖,其代码如下:
if ((ret = dbp->put(dbp, NULL, &key, &data, DB_NOOVERWRITE)) == 0)
printf("db: %s: key stored.\n", (char *)key.data);
else
dbp->err(dbp, ret, "DB->put");
一旦给出“DB_NOOVERWRITE”标记,如果DB->put()函数在执行过程中发现给出的关键字在数据库中已经存在了,就无法成功地把该Key/Data对添加到数据库中,于是将返回错误代号“DB_KEYEXIST”。
7、检索数据
从Berkeley DB数据库中检索数据可以通过调用DB->get()函数来完成,其原型如下所示:
int DB->get(DB *db, DB_TXN *txnid, DBT *key, DBT *data, u_int32_t flags);
下面这段代码示范了如何从数据库中检索出所需的数据:
int main()
{ DB *dbp;
DBT key, data;
int ret;
if ((ret = db_create(&dbp, NULL, 0)) != 0) {
fprintf(stderr, "db_create: %s\n", db_strerror(ret));
exit (1);
}
if ((ret = dbp->open(dbp,
NULL, DATABASE, NULL, DB_BTREE, DB_CREATE, 0664)) != 0) {
dbp->err(dbp, ret, "%s", DATABASE);
exit (1);
}
memset(&key, 0, sizeof(key));
memset(&data, 0, sizeof(data));
key.data = "sport";
key.size = sizeof("sport");
if ((ret = dbp->get(dbp, NULL, &key, &data, 0)) == 0)
printf("db: %s: key retrieved: data was %s.\n",
(char *)key.data, (char *)data.data);
else
dbp->err(dbp, ret, "DB->get");
}
文章来源于领测软件测试网 https://www.ltesting.net/