侧边栏壁纸
博主头像
noerror

虚灵不寐,众理具而万事出。

  • 累计撰写 239 篇文章
  • 累计创建 9 个标签
  • 累计收到 2 条评论
标签搜索

目 录CONTENT

文章目录

dbopen函数用法详解

noerror
2022-10-19 / 0 评论 / 0 点赞 / 161 阅读 / 2,725 字 / 正在检测是否收录...

dbopen函数用法详解

dbopen函数简介

  • 头文件包含
#include <sys/types.h>
#include <limits.h>
#include <db.h>
#include <fcntl.h>
  • 函数定义
DB *dbopen(const char * file , int  flags , int  mode \
           const void * openinfo );

dbopen函数常见使用错误

  • 编译错误
    warning: implicit declaration of function ‘dbopen’ [-Wimplicit-function-declaration]
    解决办法:包含头文件
#include <sys/types.h>
#include <limits.h>
#include <db.h>
#include <fcntl.h>

dbopen函数详细描述

"Note well" :此页面记录glibc提供的接口直到2.1版。从2.2版开始,glibc不再提供这些接口。您可能正在寻找libdb库提供的API。
dbopen ()是数据库文件的库接口。支持的文件格式有btree、hashed和UNIX文件导向。btree格式是一种排序的、平衡的树结构的表示。哈希格式是一种可扩展的动态哈希方案。平面文件格式是具有固定或可变长度记录的字节流文件。在各自的手册页btree (3)、hash (3)和recno (3)中详细描述了格式和文件格式特定的信息
dbopen ()打开file进行读和/或写。可以通过将file参数设置为null来创建从未打算保存在磁盘上的文件。
flags和mode参数与open (2)例程所指定的一样,但是,只有O_CREAT O_EXCL O_EXLOCK O_NONBLOCK O_RDONLY O_RDWR O_SHLOCK 和 O_TRUNC 标志是有意义的。(注意,不能打开数据库文件mode1。)
type参数的类型为DBTYPE(在包含文件中定义),可以设置为DB_BTREE 、DB_HASH 或DB_RECNO
openinfo参数是指向access方法手册页中描述的access方法特定结构的指针。如果openinfo为NULL,每个访问方法将使用适合系统和访问方法的默认值。
dbopen ()在成功时返回一个指向DB结构的指针,在错误时返回NULL。DB结构在 include文件中定义,并且至少包含以下字段:

typedef struct {
   DBTYPE type;
   int (*close)(const DB *db);
   int (*del)(const DB *db, const DBT *key, unsigned int flags);
   int (*fd)(const DB *db);
   int (*get)(const DB *db, DBT *key, DBT *data,
              unsigned int flags);
   int (*put)(const DB *db, DBT *key, const DBT *data,
              unsigned int flags);
   int (*sync)(const DB *db, unsigned int flags);
   int (*seq)(const DB *db, DBT *key, DBT *data,
              unsigned int flags);
} DB;

这些元素描述了一个数据库类型和一组执行各种操作的函数。这些函数获取一个指向由dbopen ()返回的结构的指针,有时还有一个或多个指向键/数据结构的指针和一个标志值。

  • 底层访问方法的类型(和文件格式)。
  • close一个指向例程的指针,用于将任何缓存的信息刷新到磁盘,释放任何分配的资源,并关闭底层文件。由于密钥/数据对可能缓存在内存中,如果无法用close或sync函数同步文件,可能会导致信息不一致或丢失。close例程在错误时返回-1(在成功时设置errno )和0。
  • del一个指向从数据库中移除键/数据对的例程的指针。.ip参数flag可以设置为以下值:.rs
  • R_CURSOR 删除游标引用的记录。游标以前必须已初始化。.re.ip delete例程在错误时返回-1(在成功时设置errno ) 0,如果指定的key不在文件中,则设置1。
  • fd一个指向返回表示底层数据库的文件描述符的例程的指针。引用相同文件的文件描述符将返回给调用具有相同file名称的dbopen ()的所有进程。这个文件描述符可以安全地用作fcntl (2)和flock (2)锁定函数的参数。文件描述符不一定与access方法使用的任何基础文件相关联。内存数据库中没有可用的文件描述符。fd例程在错误时返回-1(在成功时设置errno )和文件描述符)。
  • get一个指向例程的指针,该例程是从数据库中进行键控检索的接口。与指定的key相关联的数据的地址和长度在data 所引用的结构中返回,get例程在出错时返回-1(在成功时设置errno ),如果key不在文件中,则设置1)。
  • put指向在数据库中存储键/数据对的例程的指针。.ip参数flag可以设置为以下值之一:.rs
  • R_CURSOR 替换游标引用的键/数据对。游标以前必须已初始化。
  • R_IAFTER 在key 引用的数据之后立即追加数据,创建一个新的键/数据对。追加的键/数据对的记录号在key结构中返回。(仅适用于 DB_RECNO 访问方法。)
  • R_IBEFORE 在key 引用的数据之前插入数据,创建一个新的键/数据对。在key结构中返回插入的键/数据对的记录号。(仅适用于 DB_RECNO 访问方法。)
  • R_NOOVERWRITE 只有在密钥以前不存在的情况下才输入新的密钥/数据对。
  • R_SETCURSOR 存储键/数据对,设置或初始化光标的位置以引用它。(仅适用于 DB_BTREEDB_RECNO 访问方法。)R_SETCURSOR 仅用于 DB_BTREEDB_RECNO 访问方法,因为它意味着密钥具有不改变的固有顺序。R_IAFTERR_IBEFORE 仅适用于 DB_RECNO 访问方法,因为它们都意味着访问方法能够创建新的密钥。只有当键是有序的和独立的,例如记录编号时,这才是正确的。.ip put例程的默认行为是输入新的密钥/数据对,替换以前存在的任何密钥。.IP put例程在错误时返回-1(在成功时将errno )设置为0,如果设置了 DB_BTREE 2 flag并且密钥已经存在于文件中,则返回1。
  • seq一个指向例程的指针,该例程是从数据库中顺序检索的接口。在key 所引用的结构中返回密钥的地址和长度,在data 所引用的结构中返回数据的地址和长度。IP顺序密钥/数据对检索可以在任何时候开始,并且“光标”的位置不受对del 、get 、put 或sync例程调用的影响。在顺序扫描期间对数据库的修改将反映在扫描中,即插入游标后面的记录将不会返回,而插入游标前面的记录将返回。.ip将标志值 must 设置为以下值之一:.rs
  • R_CURSOR 返回与指定键关联的数据。这与get例程的不同之处在于,它还将光标设置或初始化到键的位置。(注意,对于 DB_BTREE 访问方法,返回的密钥不一定与指定的密钥完全匹配。返回的密钥是大于或等于指定密钥的最小密钥,允许部分密钥匹配和范围搜索。)
  • R_FIRST 返回数据库的第一个键/数据对,并设置或初始化游标以引用它。
  • R_LAST 返回数据库的最后一个键/数据对,并设置或初始化游标以引用它。(仅适用于 DB_BTREEDB_RECNO 访问方法。)
  • R_NEXT 检索紧随光标之后的键/数据对。如果光标尚未设置,则与 R_FIRST 标志相同。
  • R_PREV 检索紧接在光标之前的键/数据对。如果光标尚未设置,则与 R_LAST 标志相同。(仅适用于 DB_BTREEDB_RECNO 访问方法。).关于IP, R_LASTR_PREV 仅可用于 DB_BTREEDB_RECNO 访问方法,因为它们都意味着密钥具有不改变的固有顺序。seq例程在错误时返回-1(在成功时设置perrno )0,如果没有小于或大于指定或当前键的键/数据对,则设置1。如果使用 DB_RECNO 访问方法,如果数据库文件是字符专用文件,并且当前没有完整的键/数据对,则seq例程返回2。
  • sync一个指向例程的指针,用于将任何缓存的信息刷新到磁盘。如果数据库仅在内存中,则sync例程没有影响,并且总是成功。标志值可以设置为以下值:
  • R_RECNOSYNC 如果使用 DB_RECNO 访问方法,此标志将使同步例程应用于recno文件下面的btree文件,而不是recno文件本身。(有关更多信息,请参见recno (3)手册页面的bfname字段。).re.ip sync例程在错误时返回-1(在成功时设置errno )和0。Key/data pairs对所有文件类型的访问基于键/数据对。键和数据都由以下数据结构表示:
typedef struct {
   void  *data;
   size_t size;
} DBT;

DBT结构的元素定义如下:

  • 指向字节字符串的指针。
  • size字节字符串的长度。

键和数据字节字符串可以引用基本上无限长度的字符串,尽管它们中的任何两个必须同时放入可用内存中。应该注意的是,访问方法不能保证字节字符串对齐。

dbopen函数错误码

dbopen ()例程可能失败,并针对为库例程open (2)和malloc (3)指定的任何错误设置errno或以下错误:

  • EFTYPE 文件格式不正确。
  • EINVAL 指定的参数(哈希函数、pad字节等)与当前文件规范不兼容,或者对函数没有意义(例如,在没有预先初始化的情况下使用游标),或者文件的版本号与软件不匹配。

close例程可能失败,并为库例程close (2) read (2) write (2) free (3)或fsync (2)指定的任何错误设置errno
del 、get 、put 和seq例程可能失败,并为库例程read (2)、write (2)、free (3)或malloc (3)指定的任何错误设置errno
fd例程将失败,并在内存数据库中将errno设置为 ENOENT
sync例程可能失败,并为库例程fsync (2)指定的任何错误设置errno

0

评论区