⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000016.htm

📁 一份很好的linux入门资料
💻 HTM
📖 第 1 页 / 共 5 页
字号:
&nbsp;&nbsp;char&nbsp;*idxbuf;/*&nbsp;malloc'ed&nbsp;buffer&nbsp;for&nbsp;index&nbsp;record&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;char&nbsp;*datbuf;/*&nbsp;malloc'ed&nbsp;buffer&nbsp;for&nbsp;data&nbsp;record*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;char&nbsp;*name;&nbsp;/*&nbsp;name&nbsp;db&nbsp;was&nbsp;opened&nbsp;under&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;off_t&nbsp;idxoff;&nbsp;/*&nbsp;offset&nbsp;in&nbsp;index&nbsp;file&nbsp;of&nbsp;index&nbsp;record&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;actual&nbsp;key&nbsp;is&nbsp;at&nbsp;(idxoff&nbsp;+&nbsp;PTR_SZ&nbsp;+&nbsp;IDXLEN_SZ)&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;size_t&nbsp;idxlen;/*&nbsp;length&nbsp;of&nbsp;index&nbsp;record&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;excludes&nbsp;IDXLEN_SZ&nbsp;bytes&nbsp;at&nbsp;front&nbsp;of&nbsp;index&nbsp;record&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;includes&nbsp;newline&nbsp;at&nbsp;end&nbsp;of&nbsp;index&nbsp;record&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;off_t&nbsp;datoff;&nbsp;/*&nbsp;offset&nbsp;in&nbsp;data&nbsp;file&nbsp;of&nbsp;data&nbsp;record&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;size_t&nbsp;datlen;/*&nbsp;length&nbsp;of&nbsp;data&nbsp;record&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;includes&nbsp;newline&nbsp;at&nbsp;end&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;off_t&nbsp;ptrval;&nbsp;/*&nbsp;contents&nbsp;of&nbsp;chain&nbsp;ptr&nbsp;in&nbsp;index&nbsp;record&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;off_t&nbsp;ptroff;&nbsp;/*&nbsp;offset&nbsp;of&nbsp;chain&nbsp;ptr&nbsp;that&nbsp;points&nbsp;to&nbsp;this&nbsp;index&nbsp;record&nbsp;&nbsp;<BR>&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;off_t&nbsp;chainoff;/*&nbsp;offset&nbsp;of&nbsp;hash&nbsp;chain&nbsp;for&nbsp;this&nbsp;index&nbsp;record&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;off_t&nbsp;hashoff;/*&nbsp;offset&nbsp;in&nbsp;index&nbsp;file&nbsp;of&nbsp;hash&nbsp;table&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;int&nbsp;nhash;&nbsp;/*&nbsp;current&nbsp;hash&nbsp;table&nbsp;size&nbsp;*/&nbsp;&nbsp;<BR>#define&nbsp;HASH_OFF&nbsp;&nbsp;PTR_SZ&nbsp;/*&nbsp;offset&nbsp;of&nbsp;hash&nbsp;table&nbsp;in&nbsp;index&nbsp;file&nbsp;*/&nbsp;&nbsp;<BR>typedef&nbsp;struct&nbsp;{&nbsp;/*&nbsp;our&nbsp;internal&nbsp;structure&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;int&nbsp;idxfd;&nbsp;/*&nbsp;fd&nbsp;for&nbsp;index&nbsp;file&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;int&nbsp;datfd;&nbsp;/*&nbsp;fd&nbsp;for&nbsp;data&nbsp;file&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;int&nbsp;oflag;&nbsp;/*&nbsp;flags&nbsp;for&nbsp;open()/db_open():&nbsp;O_xxx&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;char&nbsp;*idxbuf;/*&nbsp;malloc'ed&nbsp;buffer&nbsp;for&nbsp;index&nbsp;record&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;char&nbsp;*datbuf;/*&nbsp;malloc'ed&nbsp;buffer&nbsp;for&nbsp;data&nbsp;record*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;char&nbsp;*name;&nbsp;/*&nbsp;name&nbsp;db&nbsp;was&nbsp;opened&nbsp;under&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;off_t&nbsp;idxoff;&nbsp;/*&nbsp;offset&nbsp;in&nbsp;index&nbsp;file&nbsp;of&nbsp;index&nbsp;record&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;actual&nbsp;key&nbsp;is&nbsp;at&nbsp;(idxoff&nbsp;+&nbsp;PTR_SZ&nbsp;+&nbsp;IDXLEN_SZ)&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;size_t&nbsp;idxlen;/*&nbsp;length&nbsp;of&nbsp;index&nbsp;record&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;excludes&nbsp;IDXLEN_SZ&nbsp;bytes&nbsp;at&nbsp;front&nbsp;of&nbsp;index&nbsp;record&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;includes&nbsp;newline&nbsp;at&nbsp;end&nbsp;of&nbsp;index&nbsp;record&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;off_t&nbsp;datoff;&nbsp;/*&nbsp;offset&nbsp;in&nbsp;data&nbsp;file&nbsp;of&nbsp;data&nbsp;record&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;size_t&nbsp;datlen;/*&nbsp;length&nbsp;of&nbsp;data&nbsp;record&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;includes&nbsp;newline&nbsp;at&nbsp;end&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;off_t&nbsp;ptrval;&nbsp;/*&nbsp;contents&nbsp;of&nbsp;chain&nbsp;ptr&nbsp;in&nbsp;index&nbsp;record&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;off_t&nbsp;ptroff;&nbsp;/*&nbsp;offset&nbsp;of&nbsp;chain&nbsp;ptr&nbsp;that&nbsp;points&nbsp;to&nbsp;this&nbsp;index&nbsp;record&nbsp;&nbsp;<BR>&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;off_t&nbsp;chainoff;/*&nbsp;offset&nbsp;of&nbsp;hash&nbsp;chain&nbsp;for&nbsp;this&nbsp;index&nbsp;record&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;off_t&nbsp;hashoff;/*&nbsp;offset&nbsp;in&nbsp;index&nbsp;file&nbsp;of&nbsp;hash&nbsp;table&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;int&nbsp;nhash;&nbsp;/*&nbsp;current&nbsp;hash&nbsp;table&nbsp;size&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;long&nbsp;cnt_delok;&nbsp;/*&nbsp;delete&nbsp;OK&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;long&nbsp;cnt_delerr;&nbsp;/*&nbsp;delete&nbsp;error&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;long&nbsp;cnt_fetchok;/*&nbsp;fetch&nbsp;OK&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;long&nbsp;cnt_fetcherr;/*&nbsp;fetch&nbsp;error&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;long&nbsp;cnt_nextrec;/*&nbsp;nextrec&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;long&nbsp;cnt_stor1;&nbsp;/*&nbsp;store:&nbsp;DB_INSERT,&nbsp;no&nbsp;empty,&nbsp;appended&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;long&nbsp;cnt_stor2;&nbsp;/*&nbsp;store:&nbsp;DB_INSERT,&nbsp;found&nbsp;empty,&nbsp;reused&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;long&nbsp;cnt_stor3;&nbsp;/*&nbsp;store:&nbsp;DB_REPLACE,&nbsp;diff&nbsp;data&nbsp;len,&nbsp;appended&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;long&nbsp;cnt_stor4;&nbsp;/*&nbsp;store:&nbsp;DB_REPLACE,&nbsp;same&nbsp;data&nbsp;len,&nbsp;overwrote&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;long&nbsp;cnt_storerr;/*&nbsp;store&nbsp;error&nbsp;*/&nbsp;&nbsp;<BR>}&nbsp;DB;&nbsp;&nbsp;<BR>typedef&nbsp;unsigned&nbsp;long&nbsp;hash_t;&nbsp;/*&nbsp;hash&nbsp;values&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;/*&nbsp;user-callable&nbsp;functions&nbsp;*/&nbsp;&nbsp;<BR>DB&nbsp;&nbsp;*db_open(const&nbsp;char&nbsp;*,&nbsp;int,&nbsp;int);&nbsp;&nbsp;<BR>void&nbsp;&nbsp;db_close(DB&nbsp;*);&nbsp;&nbsp;<BR>char&nbsp;*db_fetch(DB&nbsp;*,&nbsp;const&nbsp;char&nbsp;*);&nbsp;&nbsp;<BR>int&nbsp;&nbsp;&nbsp;db_store(DB&nbsp;*,&nbsp;const&nbsp;char&nbsp;*,&nbsp;const&nbsp;char&nbsp;*,&nbsp;int);&nbsp;&nbsp;<BR>int&nbsp;&nbsp;&nbsp;db_delete(DB&nbsp;*,&nbsp;const&nbsp;char&nbsp;*);&nbsp;&nbsp;<BR>void&nbsp;&nbsp;db_rewind(DB&nbsp;*);&nbsp;&nbsp;<BR>char&nbsp;*db_nextrec(DB&nbsp;*,&nbsp;char&nbsp;*);&nbsp;&nbsp;<BR>void&nbsp;&nbsp;db_stats(DB&nbsp;*);&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;/*&nbsp;internal&nbsp;functions&nbsp;*/&nbsp;&nbsp;<BR>DB&nbsp;&nbsp;*_db_alloc(int);&nbsp;&nbsp;<BR>int&nbsp;&nbsp;&nbsp;_db_checkfree(DB&nbsp;*);&nbsp;&nbsp;<BR>int&nbsp;&nbsp;&nbsp;_db_dodelete(DB&nbsp;*);&nbsp;&nbsp;<BR>int&nbsp;&nbsp;&nbsp;_db_emptykey(char&nbsp;*);&nbsp;&nbsp;<BR>int&nbsp;&nbsp;&nbsp;_db_find(DB&nbsp;*,&nbsp;const&nbsp;char&nbsp;*,&nbsp;int);&nbsp;&nbsp;<BR>int&nbsp;&nbsp;&nbsp;_db_findfree(DB&nbsp;*,&nbsp;int,&nbsp;int);&nbsp;&nbsp;<BR>int&nbsp;&nbsp;&nbsp;_db_free(DB&nbsp;*);&nbsp;&nbsp;<BR>hash_t&nbsp;&nbsp;_db_hash(DB&nbsp;*,&nbsp;const&nbsp;char&nbsp;*);&nbsp;&nbsp;<BR>char&nbsp;*_db_nextkey(DB&nbsp;*);&nbsp;&nbsp;<BR>char&nbsp;*_db_readdat(DB&nbsp;*);&nbsp;&nbsp;<BR>off_t&nbsp;&nbsp;_db_readidx(DB&nbsp;*,&nbsp;off_t);&nbsp;&nbsp;<BR>off_t&nbsp;&nbsp;_db_readptr(DB&nbsp;*,&nbsp;off_t);&nbsp;&nbsp;<BR>void&nbsp;&nbsp;_db_writedat(DB&nbsp;*,&nbsp;const&nbsp;char&nbsp;*,&nbsp;off_t,&nbsp;int);&nbsp;&nbsp;<BR>void&nbsp;&nbsp;_db_writeidx(DB&nbsp;*,&nbsp;const&nbsp;char&nbsp;*,&nbsp;off_t,&nbsp;int,&nbsp;off_t);&nbsp;&nbsp;<BR>void&nbsp;&nbsp;_db_writeptr(DB&nbsp;*,&nbsp;off_t,&nbsp;off_t);&nbsp;&nbsp;<BR>程序16.2&nbsp;db.h头文件&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;这里,我们定义了实现的基本限制。如果要支持更大的数据库的话,这些限制&nbsp;&nbsp;<BR>也可以修改。其中一些我们定义为常数的值也可定义为变量,只是会使实现复杂一&nbsp;&nbsp;<BR>些。例如,我们设定Hash表的大小为137,一个也许更好的方法是让db_open的调用&nbsp;&nbsp;<BR>者根据数据库的大小通过参数来设定这个值,然后将这个值存在索引文件的最前面&nbsp;&nbsp;<BR>。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;在DB结构中我们记录一个打开的数据库的所有信息。db_open函数返回一个DB&nbsp;&nbsp;<BR>结构的指针,这个指针被用于其它的所有函数。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;我们选择用db_开头来命名用户可调用的库函数,用_db_开头来命名内部函数&nbsp;&nbsp;<BR>。&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;在程序16.3中定义了函数db_open。它打开索引文件和数据文件,必要的话初&nbsp;&nbsp;<BR>始化索引文件。通过调用_db_alloc来为DB结构分配空间,并初始化此结构。&nbsp;&nbsp;<BR>#include&nbsp;&quot;db.h&quot;&nbsp;&nbsp;<BR>/*&nbsp;Open&nbsp;or&nbsp;create&nbsp;a&nbsp;database.&nbsp;&nbsp;Same&nbsp;arguments&nbsp;as&nbsp;open().&nbsp;*/&nbsp;&nbsp;<BR>DB&nbsp;*&nbsp;&nbsp;<BR>db_open(const&nbsp;char&nbsp;*pathname,&nbsp;int&nbsp;oflag,&nbsp;int&nbsp;mode)&nbsp;&nbsp;<BR>{&nbsp;&nbsp;<BR>&nbsp;DB&nbsp;&nbsp;&nbsp;*db;&nbsp;&nbsp;<BR>&nbsp;int&nbsp;&nbsp;&nbsp;i,&nbsp;len;&nbsp;&nbsp;<BR>&nbsp;char&nbsp;&nbsp;asciiptr[PTR_SZ&nbsp;+&nbsp;1],&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;hash[(NHASH_DEF&nbsp;+&nbsp;1)&nbsp;*&nbsp;PTR_SZ&nbsp;+&nbsp;2];&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;+2&nbsp;for&nbsp;newline&nbsp;and&nbsp;null&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;struct&nbsp;stat&nbsp;statbuff;&nbsp;&nbsp;<BR>&nbsp;&nbsp;/*&nbsp;Allocate&nbsp;a&nbsp;DB&nbsp;structure,&nbsp;and&nbsp;the&nbsp;buffers&nbsp;it&nbsp;needs&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;len&nbsp;=&nbsp;strlen(pathname);&nbsp;&nbsp;<BR>&nbsp;if&nbsp;(&nbsp;(db&nbsp;=&nbsp;_db_alloc(len))&nbsp;==&nbsp;NULL)&nbsp;&nbsp;<BR>&nbsp;&nbsp;err_dump(&quot;_db_alloc&nbsp;error&nbsp;for&nbsp;DB&quot;);&nbsp;&nbsp;<BR>&nbsp;db-&gt;oflag&nbsp;=&nbsp;oflag;&nbsp;&nbsp;/*&nbsp;save&nbsp;a&nbsp;copy&nbsp;of&nbsp;the&nbsp;open&nbsp;flags&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;/*&nbsp;Open&nbsp;index&nbsp;file&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;strcpy(db-&gt;name,&nbsp;pathname);&nbsp;&nbsp;<BR>&nbsp;strcat(db-&gt;name,&nbsp;&quot;.idx&quot;);&nbsp;&nbsp;<BR>&nbsp;if&nbsp;(&nbsp;(db-&gt;idxfd&nbsp;=&nbsp;open(db-&gt;name,&nbsp;oflag,&nbsp;mode))&nbsp;&lt;&nbsp;0)&nbsp;{&nbsp;&nbsp;<BR>&nbsp;&nbsp;_db_free(db);&nbsp;&nbsp;<BR>&nbsp;&nbsp;return(NULL);&nbsp;&nbsp;<BR>&nbsp;}&nbsp;&nbsp;<BR>&nbsp;&nbsp;/*&nbsp;Open&nbsp;data&nbsp;file&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;strcpy(db-&gt;name&nbsp;+&nbsp;len,&nbsp;&quot;.dat&quot;);&nbsp;&nbsp;<BR>&nbsp;if&nbsp;(&nbsp;(db-&gt;datfd&nbsp;=&nbsp;open(db-&gt;name,&nbsp;oflag,&nbsp;mode))&nbsp;&lt;&nbsp;0)&nbsp;{&nbsp;&nbsp;<BR>&nbsp;&nbsp;_db_free(db);&nbsp;&nbsp;<BR>&nbsp;&nbsp;return(NULL);&nbsp;&nbsp;<BR>&nbsp;}&nbsp;&nbsp;<BR>&nbsp;&nbsp;/*&nbsp;If&nbsp;the&nbsp;database&nbsp;was&nbsp;created,&nbsp;we&nbsp;have&nbsp;to&nbsp;initialize&nbsp;it&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;if&nbsp;((oflag&nbsp;&amp;&nbsp;(O_CREAT&nbsp;|&nbsp;O_TRUNC))&nbsp;==&nbsp;(O_CREAT&nbsp;|&nbsp;O_TRUNC))&nbsp;{&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;/*&nbsp;Write&nbsp;lock&nbsp;the&nbsp;entire&nbsp;file&nbsp;so&nbsp;that&nbsp;we&nbsp;can&nbsp;stat&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;file,&nbsp;check&nbsp;its&nbsp;size,&nbsp;and&nbsp;initialize&nbsp;it,&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;as&nbsp;an&nbsp;atomic&nbsp;operation.&nbsp;*/&nbsp;&nbsp;<BR>&nbsp;&nbsp;if&nbsp;(writew_lock(db-&gt;idxfd,&nbsp;0,&nbsp;SEEK_SET,&nbsp;0)&nbsp;&lt;&nbsp;0)&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;err_dump(&quot;writew_lock&nbsp;error&quot;);&nbsp;&nbsp;<BR>&nbsp;&nbsp;if&nbsp;(fstat(db-&gt;idxfd,&nbsp;&amp;statbuff)&nbsp;&lt;&nbsp;0)&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;err_sys(&quot;fstat&nbsp;error&quot;);&nbsp;&nbsp;<BR>&nbsp;&nbsp;if&nbsp;(statbuff.st_size&nbsp;==&nbsp;0)&nbsp;{&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;如果数据库正被建立,则我们必须加锁。考虑两个进程同时试图建立同一个数&nbsp;&nbsp;<BR>据库的情况。第一个进程运行到调用fstat,并且在fstat返回后被核心切换。这时&nbsp;&nbsp;<BR>第二个进程调用db_open,发现索引文件的长度为0,并初始化空闲链表和Hash链表&nbsp;&nbsp;<BR>。第二个进程继续运行,向数据库中添加了一条记录。这时第二个进程被阻塞,第&nbsp;&nbsp;<BR>一个进程继续运行,并发现索引文件的大小为0(因为第一个进程是在fstat返回后&nbsp;&nbsp;<BR>才被切换),所以第一个进程重新初始化空闲链表和Hash链表,第二个进程写入的&nbsp;&nbsp;<BR>记录就被抹去了。要避免发生这种情况的方法是进行加锁,我们使用12.3节中的r&nbsp;&nbsp;<BR>eadw_lock,writew_lock和un_lock这三个函数。&nbsp;&nbsp;<BR>db_open调用程序16.4中定义的函数_db_alloc来为DB结构分配空间,包括一个索引&nbsp;&nbsp;<BR>缓冲和一个数据缓冲。&nbsp;&nbsp;<BR>#include&nbsp;&quot;db.h&quot;&nbsp;&nbsp;<BR>/*&nbsp;Allocate&nbsp;&amp;&nbsp;initialize&nbsp;a&nbsp;DB&nbsp;structure,&nbsp;and&nbsp;all&nbsp;the&nbsp;buffers&nbsp;it&nbsp;needs&nbsp;&nbsp;<BR>*/&nbsp;&nbsp;<BR>DB&nbsp;*&nbsp;&nbsp;<BR>_db_alloc(int&nbsp;namelen)&nbsp;&nbsp;<BR>{&nbsp;&nbsp;<BR>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -