76
79
<div id="centerContent">
77
80
<div id="contentHeader">
78
81
<div id="contentHeaderLeft"><a href="#" onClick="showLeft()">Show navigation</a></div>
79
<div id="contentHeaderCentre">-- Perl 5.8.8 documentation --</div>
82
<div id="contentHeaderCentre">-- Perl 5.10.0 documentation --</div>
80
83
<div id="contentHeaderRight"><a href="#" onClick="showRight()">Show toolbar</a></div>
82
85
<div id="breadCrumbs"><a href="index.html">Home</a> > <a href="index-modules-A.html">Core modules</a> > <a href="index-modules-D.html">D</a> > DB_File</div>
83
86
<script language="JavaScript">fromSearch();</script>
84
<div id="contentBody"><div class="title_container"><div class="page_title">DB_File</div></div><ul><li><a href="#NAME">NAME</a><li><a href="#SYNOPSIS">SYNOPSIS</a><li><a href="#DESCRIPTION">DESCRIPTION</a><ul><li><a href="#Using-DB_File-with-Berkeley-DB-version-2-or-greater">Using DB_File with Berkeley DB version 2 or greater</a><li><a href="#Interface-to-Berkeley-DB">Interface to Berkeley DB</a><li><a href="#Opening-a-Berkeley-DB-Database-File">Opening a Berkeley DB Database File</a><li><a href="#Default-Parameters">Default Parameters</a><li><a href="#In-Memory-Databases">In Memory Databases</a></ul><li><a href="#DB_HASH">DB_HASH</a><ul><li><a href="#A-Simple-Example">A Simple Example</a></ul><li><a href="#DB_BTREE">DB_BTREE</a><ul><li><a href="#Changing-the-BTREE-sort-order">Changing the BTREE sort order</a><li><a href="#Handling-Duplicate-Keys">Handling Duplicate Keys </a><li><a href="#The-get_dup()-Method">The get_dup() Method</a><li><a href="#The-find_dup()-Method">The find_dup() Method</a><li><a href="#The-del_dup()-Method">The del_dup() Method</a><li><a href="#Matching-Partial-Keys">Matching Partial Keys </a></ul><li><a href="#DB_RECNO">DB_RECNO</a><ul><li><a href="#The-'bval'-Option">The 'bval' Option</a><li><a href="#A-Simple-Example">A Simple Example</a><li><a href="#Extra-RECNO-Methods">Extra RECNO Methods</a><li><a href="#Another-Example">Another Example</a></ul><li><a href="#THE-API-INTERFACE">THE API INTERFACE</a><li><a href="#DBM-FILTERS">DBM FILTERS</a><ul><li><a href="#The-Filter">The Filter</a><li><a href="#An-Example----the-NULL-termination-problem.">An Example -- the NULL termination problem.</a><li><a href="#Another-Example----Key-is-a-C-int.">Another Example -- Key is a C int.</a></ul><li><a href="#HINTS-AND-TIPS">HINTS AND TIPS </a><ul><li><a href="#Locking%3a-The-Trouble-with-fd">Locking: The Trouble with fd</a><li><a href="#Safe-ways-to-lock-a-database">Safe ways to lock a database</a><li><a href="#Sharing-Databases-With-C-Applications">Sharing Databases With C Applications</a><li><a href="#The-untie()-Gotcha">The untie() Gotcha</a></ul><li><a href="#COMMON-QUESTIONS">COMMON QUESTIONS</a><ul><li><a href="#Why-is-there-Perl-source-in-my-database%3f">Why is there Perl source in my database?</a><li><a href="#How-do-I-store-complex-data-structures-with-DB_File%3f">How do I store complex data structures with DB_File?</a><li><a href="#What-does-%22Invalid-Argument%22-mean%3f">What does "Invalid Argument" mean?</a><li><a href="#What-does-%22Bareword-'DB_File'-not-allowed%22-mean%3f">What does "Bareword 'DB_File' not allowed" mean? </a></ul><li><a href="#REFERENCES">REFERENCES</a><li><a href="#HISTORY">HISTORY</a><li><a href="#BUGS">BUGS</a><li><a href="#AVAILABILITY">AVAILABILITY</a><li><a href="#COPYRIGHT">COPYRIGHT</a><li><a href="#SEE-ALSO">SEE ALSO</a><li><a href="#AUTHOR">AUTHOR</a></ul><a name="NAME"></a><h1>NAME</h1>
87
<div id="contentBody"><div class="title_container"><div class="page_title">DB_File</div></div><ul><li><a href="#NAME">NAME</a><li><a href="#SYNOPSIS">SYNOPSIS</a><li><a href="#DESCRIPTION">DESCRIPTION</a><ul><li><a href="#Using-DB_File-with-Berkeley-DB-version-2-or-greater">Using DB_File with Berkeley DB version 2 or greater</a><li><a href="#Interface-to-Berkeley-DB">Interface to Berkeley DB</a><li><a href="#Opening-a-Berkeley-DB-Database-File">Opening a Berkeley DB Database File</a><li><a href="#Default-Parameters">Default Parameters</a><li><a href="#In-Memory-Databases">In Memory Databases</a></ul><li><a href="#DB_HASH">DB_HASH</a><ul><li><a href="#A-Simple-Example">A Simple Example</a></ul><li><a href="#DB_BTREE">DB_BTREE</a><ul><li><a href="#Changing-the-BTREE-sort-order">Changing the BTREE sort order</a><li><a href="#Handling-Duplicate-Keys">Handling Duplicate Keys</a><li><a href="#The-get_dup()-Method">The get_dup() Method</a><li><a href="#The-find_dup()-Method">The find_dup() Method</a><li><a href="#The-del_dup()-Method">The del_dup() Method</a><li><a href="#Matching-Partial-Keys">Matching Partial Keys</a></ul><li><a href="#DB_RECNO">DB_RECNO</a><ul><li><a href="#The-'bval'-Option">The 'bval' Option</a><li><a href="#A-Simple-Example">A Simple Example</a><li><a href="#Extra-RECNO-Methods">Extra RECNO Methods</a><li><a href="#Another-Example">Another Example</a></ul><li><a href="#THE-API-INTERFACE">THE API INTERFACE</a><li><a href="#DBM-FILTERS">DBM FILTERS</a><ul><li><a href="#The-Filter">The Filter</a><li><a href="#An-Example----the-NULL-termination-problem.">An Example -- the NULL termination problem.</a><li><a href="#Another-Example----Key-is-a-C-int.">Another Example -- Key is a C int.</a></ul><li><a href="#HINTS-AND-TIPS">HINTS AND TIPS</a><ul><li><a href="#Locking%3a-The-Trouble-with-fd">Locking: The Trouble with fd</a><li><a href="#Safe-ways-to-lock-a-database">Safe ways to lock a database</a><li><a href="#Sharing-Databases-With-C-Applications">Sharing Databases With C Applications</a><li><a href="#The-untie()-Gotcha">The untie() Gotcha</a></ul><li><a href="#COMMON-QUESTIONS">COMMON QUESTIONS</a><ul><li><a href="#Why-is-there-Perl-source-in-my-database%3f">Why is there Perl source in my database?</a><li><a href="#How-do-I-store-complex-data-structures-with-DB_File%3f">How do I store complex data structures with DB_File?</a><li><a href="#What-does-%22Invalid-Argument%22-mean%3f">What does "Invalid Argument" mean?</a><li><a href="#What-does-%22Bareword-'DB_File'-not-allowed%22-mean%3f">What does "Bareword 'DB_File' not allowed" mean?</a></ul><li><a href="#REFERENCES">REFERENCES</a><li><a href="#HISTORY">HISTORY</a><li><a href="#BUGS">BUGS</a><li><a href="#AVAILABILITY">AVAILABILITY</a><li><a href="#COPYRIGHT">COPYRIGHT</a><li><a href="#SEE-ALSO">SEE ALSO</a><li><a href="#AUTHOR">AUTHOR</a></ul><a name="NAME"></a><h1>NAME</h1>
85
88
<p>DB_File - Perl5 access to Berkeley DB version 1.x</p>
86
89
<a name="SYNOPSIS"></a><h1>SYNOPSIS</h1>
87
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="DB_File.html">DB_File</a><span class="sc">;</span></pre>
90
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <span class="w">DB_File</span><span class="sc">;</span></pre>
88
91
<pre class="verbatim"> <span class="s">[</span><span class="i">$X</span> =<span class="s">]</span> <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%hash</span><span class="cm">,</span> <span class="q">'DB_File'</span><span class="cm">,</span> <span class="s">[</span><span class="i">$filename</span><span class="cm">,</span> <span class="i">$flags</span><span class="cm">,</span> <span class="i">$mode</span><span class="cm">,</span> <span class="i">$DB_HASH</span><span class="s">]</span> <span class="sc">;</span>
89
92
<span class="s">[</span><span class="i">$X</span> =<span class="s">]</span> <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%hash</span><span class="cm">,</span> <span class="q">'DB_File'</span><span class="cm">,</span> <span class="i">$filename</span><span class="cm">,</span> <span class="i">$flags</span><span class="cm">,</span> <span class="i">$mode</span><span class="cm">,</span> <span class="i">$DB_BTREE</span> <span class="sc">;</span>
90
93
<span class="s">[</span><span class="i">$X</span> =<span class="s">]</span> <a class="l_k" href="functions/tie.html">tie</a> <span class="i">@array</span><span class="cm">,</span> <span class="q">'DB_File'</span><span class="cm">,</span> <span class="i">$filename</span><span class="cm">,</span> <span class="i">$flags</span><span class="cm">,</span> <span class="i">$mode</span><span class="cm">,</span> <span class="i">$DB_RECNO</span> <span class="sc">;</span></pre>
103
106
<pre class="verbatim"> <span class="c"># RECNO only</span>
104
107
<span class="i">$a</span> = <span class="i">$X</span><span class="i">->length</span><span class="sc">;</span>
105
108
<span class="i">$a</span> = <span class="i">$X</span><span class="i">->pop</span> <span class="sc">;</span>
106
<span class="i">$X</span><span class="i">->push</span><span class="s">(</span>list<span class="s">)</span><span class="sc">;</span>
109
<span class="i">$X</span><span class="i">->push</span><span class="s">(</span><span class="w">list</span><span class="s">)</span><span class="sc">;</span>
107
110
<span class="i">$a</span> = <span class="i">$X</span><span class="i">->shift</span><span class="sc">;</span>
108
<span class="i">$X</span><span class="i">->unshift</span><span class="s">(</span>list<span class="s">)</span><span class="sc">;</span>
109
<span class="i">@r</span> = <span class="i">$X</span><span class="i">->splice</span><span class="s">(</span>offset<span class="cm">,</span> <a class="l_k" href="functions/length.html">length</a><span class="cm">,</span> elements<span class="s">)</span><span class="sc">;</span></pre>
111
<span class="i">$X</span><span class="i">->unshift</span><span class="s">(</span><span class="w">list</span><span class="s">)</span><span class="sc">;</span>
112
<span class="i">@r</span> = <span class="i">$X</span><span class="i">->splice</span><span class="s">(</span><span class="w">offset</span><span class="cm">,</span> <a class="l_k" href="functions/length.html">length</a><span class="cm">,</span> <span class="w">elements</span><span class="s">)</span><span class="sc">;</span></pre>
110
113
<pre class="verbatim"> <span class="c"># DBM Filters</span>
111
114
<span class="i">$old_filter</span> = <span class="i">$db</span><span class="i">->filter_store_key</span> <span class="s">(</span> <a class="l_k" href="functions/sub.html">sub</a> <span class="s">{</span> ... <span class="s">}</span> <span class="s">)</span> <span class="sc">;</span>
112
115
<span class="i">$old_filter</span> = <span class="i">$db</span><span class="i">->filter_store_value</span><span class="s">(</span> <a class="l_k" href="functions/sub.html">sub</a> <span class="s">{</span> ... <span class="s">}</span> <span class="s">)</span> <span class="sc">;</span>
162
165
2.x or greater, use the Perl module <b>BerkeleyDB</b> instead.</p>
163
166
<p><b>Note:</b> The database file format has changed multiple times in Berkeley
164
167
DB version 2, 3 and 4. If you cannot recreate your databases, you
165
must dump any existing databases with either the <code class="inline">db_dump</code>
168
must dump any existing databases with either the <code class="inline"><span class="w">db_dump</span></code>
167
<code class="inline">db_dump185</code>
170
<code class="inline"><span class="w">db_dump185</span></code>
168
171
utility that comes with Berkeley DB.
169
172
Once you have rebuilt DB_File to use Berkeley DB version 2 or greater,
170
your databases can be recreated using <code class="inline">db_load</code>
173
your databases can be recreated using <code class="inline"><span class="w">db_load</span></code>
171
174
. Refer to the Berkeley DB
172
175
documentation for further details.</p>
173
176
<p>Please read <a href="#COPYRIGHT">"COPYRIGHT"</a> before using version 2.x or greater of Berkeley
184
187
<a name="Opening-a-Berkeley-DB-Database-File"></a><h2>Opening a Berkeley DB Database File</h2>
185
188
<p>Berkeley DB uses the function dbopen() to open or create a database.
186
189
Here is the C prototype for dbopen():</p>
187
<pre class="verbatim"> <a class="l_w" href="DB.html">DB</a>*
188
dbopen <span class="s">(</span>const char * file<span class="cm">,</span> <a class="l_k" href="functions/int.html">int</a> flags<span class="cm">,</span> <a class="l_k" href="functions/int.html">int</a> mode<span class="cm">,</span>
189
DBTYPE type<span class="cm">,</span> const void * openinfo<span class="s">)</span></pre>
190
<p>The parameter <code class="inline">type</code>
190
<pre class="verbatim"> <span class="w">DB</span>*
191
<span class="w">dbopen</span> <span class="s">(</span><span class="w">const</span> <span class="w">char</span> * <span class="w">file</span><span class="cm">,</span> <a class="l_k" href="functions/int.html">int</a> <span class="w">flags</span><span class="cm">,</span> <a class="l_k" href="functions/int.html">int</a> <span class="w">mode</span><span class="cm">,</span>
192
<span class="w">DBTYPE</span> <span class="w">type</span><span class="cm">,</span> <span class="w">const</span> <span class="w">void</span> * <span class="w">openinfo</span><span class="s">)</span></pre>
193
<p>The parameter <code class="inline"><span class="w">type</span></code>
191
194
is an enumeration which specifies which of the 3
192
195
interface methods (DB_HASH, DB_BTREE or DB_RECNO) is to be used.
193
196
Depending on which of these is actually chosen, the final parameter,
196
199
<p>This interface is handled slightly differently in <b>DB_File</b>. Here is
197
200
an equivalent call using <b>DB_File</b>:</p>
198
201
<pre class="verbatim"> <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%array</span><span class="cm">,</span> <span class="q">'DB_File'</span><span class="cm">,</span> <span class="i">$filename</span><span class="cm">,</span> <span class="i">$flags</span><span class="cm">,</span> <span class="i">$mode</span><span class="cm">,</span> <span class="i">$DB_HASH</span> <span class="sc">;</span></pre>
199
<p>The <code class="inline">filename</code>
200
, <code class="inline">flags</code>
201
and <code class="inline">mode</code>
202
<p>The <code class="inline"><span class="w">filename</span></code>
203
, <code class="inline"><span class="w">flags</span></code>
204
and <code class="inline"><span class="w">mode</span></code>
202
205
parameters are the direct
203
206
equivalent of their dbopen() counterparts. The final parameter $DB_HASH
204
performs the function of both the <code class="inline">type</code>
205
and <code class="inline">openinfo</code>
207
performs the function of both the <code class="inline"><span class="w">type</span></code>
208
and <code class="inline"><span class="w">openinfo</span></code>
208
211
<p>In the example above $DB_HASH is actually a pre-defined reference to a
210
213
Apart from $DB_HASH, there is also $DB_BTREE and $DB_RECNO.</p>
211
214
<p>The keys allowed in each of these pre-defined references is limited to
212
215
the names used in the equivalent C structure. So, for example, the
213
$DB_HASH reference will only allow keys called <code class="inline">bsize</code>
214
, <code class="inline">cachesize</code>
216
$DB_HASH reference will only allow keys called <code class="inline"><span class="w">bsize</span></code>
217
, <code class="inline"><span class="w">cachesize</span></code>
216
<code class="inline">ffactor</code>
217
, <code class="inline">hash</code>
218
, <code class="inline">lorder</code>
219
and <code class="inline">nelem</code>
219
<code class="inline"><span class="w">ffactor</span></code>
220
, <code class="inline"><span class="w">hash</span></code>
221
, <code class="inline"><span class="w">lorder</span></code>
222
and <code class="inline"><span class="w">nelem</span></code>
221
224
<p>To change one of these elements, just assign to it like this:</p>
222
225
<pre class="verbatim"> <span class="i">$DB_HASH</span>->{<span class="q">'cachesize'</span>} = <span class="n">10000</span> <span class="sc">;</span></pre>
223
226
<p>The three predefined variables $DB_HASH, $DB_BTREE and $DB_RECNO are
227
230
<p>Here are examples of the constructors and the valid options available
228
231
for DB_HASH, DB_BTREE and DB_RECNO respectively.</p>
229
<pre class="verbatim"> <span class="i">$a</span> = new DB_File::HASHINFO <span class="sc">;</span>
232
<pre class="verbatim"> <span class="i">$a</span> = <span class="w">new</span> <span class="w">DB_File::HASHINFO</span> <span class="sc">;</span>
230
233
<span class="i">$a</span>->{<span class="q">'bsize'</span>} <span class="sc">;</span>
231
234
<span class="i">$a</span>->{<span class="q">'cachesize'</span>} <span class="sc">;</span>
232
235
<span class="i">$a</span>->{<span class="q">'ffactor'</span>}<span class="sc">;</span>
233
236
<span class="i">$a</span>->{<span class="q">'hash'</span>} <span class="sc">;</span>
234
237
<span class="i">$a</span>->{<span class="q">'lorder'</span>} <span class="sc">;</span>
235
238
<span class="i">$a</span>->{<span class="q">'nelem'</span>} <span class="sc">;</span></pre>
236
<pre class="verbatim"> <span class="i">$b</span> = new DB_File::BTREEINFO <span class="sc">;</span>
239
<pre class="verbatim"> <span class="i">$b</span> = <span class="w">new</span> <span class="w">DB_File::BTREEINFO</span> <span class="sc">;</span>
237
240
<span class="i">$b</span>->{<span class="q">'flags'</span>} <span class="sc">;</span>
238
241
<span class="i">$b</span>->{<span class="q">'cachesize'</span>} <span class="sc">;</span>
239
242
<span class="i">$b</span>->{<span class="q">'maxkeypage'</span>} <span class="sc">;</span>
254
257
of their C counterpart. Like their C counterparts, all are set to a
255
258
default values - that means you don't have to set <i>all</i> of the
256
259
values when you only want to change one. Here is an example:</p>
257
<pre class="verbatim"> <span class="i">$a</span> = new DB_File::HASHINFO <span class="sc">;</span>
260
<pre class="verbatim"> <span class="i">$a</span> = <span class="w">new</span> <span class="w">DB_File::HASHINFO</span> <span class="sc">;</span>
258
261
<span class="i">$a</span>->{<span class="q">'cachesize'</span>} = <span class="n">12345</span> <span class="sc">;</span>
259
262
<a class="l_k" href="functions/tie.html">tie</a> <span class="i">%y</span><span class="cm">,</span> <span class="q">'DB_File'</span><span class="cm">,</span> <span class="q">"filename"</span><span class="cm">,</span> <span class="i">$flags</span><span class="cm">,</span> <span class="n">0777</span><span class="cm">,</span> <span class="i">$a</span> <span class="sc">;</span></pre>
260
263
<p>A few of the options need extra discussion here. When used, the C
261
equivalent of the keys <code class="inline">hash</code>
262
, <code class="inline">compare</code>
263
and <code class="inline">prefix</code>
264
equivalent of the keys <code class="inline"><span class="w">hash</span></code>
265
, <code class="inline"><span class="w">compare</span></code>
266
and <code class="inline"><span class="w">prefix</span></code>
265
268
to C functions. In <b>DB_File</b> these keys are used to store references
266
269
to Perl subs. Below are templates for each of the subs:</p>
300
303
common file format used, the call:</p>
301
304
<pre class="verbatim"> <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%A</span><span class="cm">,</span> <span class="q">"DB_File"</span><span class="cm">,</span> <span class="q">"filename"</span> <span class="sc">;</span></pre>
302
305
<p>is equivalent to:</p>
303
<pre class="verbatim"> <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%A</span><span class="cm">,</span> <span class="q">"DB_File"</span><span class="cm">,</span> <span class="q">"filename"</span><span class="cm">,</span> O_CREAT|O_RDWR<span class="cm">,</span> <span class="n">0666</span><span class="cm">,</span> <span class="i">$DB_HASH</span> <span class="sc">;</span></pre>
306
<pre class="verbatim"> <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%A</span><span class="cm">,</span> <span class="q">"DB_File"</span><span class="cm">,</span> <span class="q">"filename"</span><span class="cm">,</span> <span class="w">O_CREAT</span>|<span class="w">O_RDWR</span><span class="cm">,</span> <span class="n">0666</span><span class="cm">,</span> <span class="i">$DB_HASH</span> <span class="sc">;</span></pre>
304
307
<p>It is also possible to omit the filename parameter as well, so the
306
309
<pre class="verbatim"> <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%A</span><span class="cm">,</span> <span class="q">"DB_File"</span> <span class="sc">;</span></pre>
307
310
<p>is equivalent to:</p>
308
<pre class="verbatim"> <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%A</span><span class="cm">,</span> <span class="q">"DB_File"</span><span class="cm">,</span> <a class="l_k" href="functions/undef.html">undef</a><span class="cm">,</span> O_CREAT|O_RDWR<span class="cm">,</span> <span class="n">0666</span><span class="cm">,</span> <span class="i">$DB_HASH</span> <span class="sc">;</span></pre>
311
<pre class="verbatim"> <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%A</span><span class="cm">,</span> <span class="q">"DB_File"</span><span class="cm">,</span> <a class="l_k" href="functions/undef.html">undef</a><span class="cm">,</span> <span class="w">O_CREAT</span>|<span class="w">O_RDWR</span><span class="cm">,</span> <span class="n">0666</span><span class="cm">,</span> <span class="i">$DB_HASH</span> <span class="sc">;</span></pre>
309
312
<p>See <a href="#In-Memory-Databases">"In Memory Databases"</a> for a discussion on the use of <code class="inline"><a class="l_k" href="functions/undef.html">undef</a></code>
310
313
in place of a filename.</p>
311
314
<a name="In-Memory-Databases"></a><h2>In Memory Databases</h2>
320
323
<p>This example shows how to create a database, add key/value pairs to the
321
324
database, delete keys/value pairs and finally how to enumerate the
322
325
contents of the database.</p>
323
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="warnings.html">warnings</a> <span class="sc">;</span>
324
<a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="strict.html">strict</a> <span class="sc">;</span>
325
<a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="DB_File.html">DB_File</a> <span class="sc">;</span>
326
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <span class="w">warnings</span> <span class="sc">;</span>
327
<a class="l_k" href="functions/use.html">use</a> <span class="w">strict</span> <span class="sc">;</span>
328
<a class="l_k" href="functions/use.html">use</a> <span class="w">DB_File</span> <span class="sc">;</span>
326
329
<a class="l_k" href="functions/our.html">our</a> <span class="s">(</span><span class="i">%h</span><span class="cm">,</span> <span class="i">$k</span><span class="cm">,</span> <span class="i">$v</span><span class="s">)</span> <span class="sc">;</span></pre>
327
330
<pre class="verbatim"> <a class="l_k" href="functions/unlink.html">unlink</a> <span class="q">"fruit"</span> <span class="sc">;</span>
328
<a class="l_k" href="functions/tie.html">tie</a> <span class="i">%h</span><span class="cm">,</span> <span class="q">"DB_File"</span><span class="cm">,</span> <span class="q">"fruit"</span><span class="cm">,</span> O_RDWR|O_CREAT<span class="cm">,</span> <span class="n">0666</span><span class="cm">,</span> <span class="i">$DB_HASH</span>
331
<a class="l_k" href="functions/tie.html">tie</a> <span class="i">%h</span><span class="cm">,</span> <span class="q">"DB_File"</span><span class="cm">,</span> <span class="q">"fruit"</span><span class="cm">,</span> <span class="w">O_RDWR</span>|<span class="w">O_CREAT</span><span class="cm">,</span> <span class="n">0666</span><span class="cm">,</span> <span class="i">$DB_HASH</span>
329
332
or <a class="l_k" href="functions/die.html">die</a> <span class="q">"Cannot open file 'fruit': $!\n"</span><span class="sc">;</span></pre>
330
333
<pre class="verbatim"> <span class="c"># Add a few key/value pairs to the file</span>
331
334
<span class="i">$h</span>{<span class="q">"apple"</span>} = <span class="q">"red"</span> <span class="sc">;</span>
341
344
<span class="s">{</span> <a class="l_k" href="functions/print.html">print</a> <span class="q">"$k -> $v\n"</span> <span class="s">}</span></pre>
342
345
<pre class="verbatim"> <a class="l_k" href="functions/untie.html">untie</a> <span class="i">%h</span> <span class="sc">;</span></pre>
343
346
<p>here is the output:</p>
344
<pre class="verbatim"> Banana Exists</pre>
345
<pre class="verbatim"> orange -> orange
347
banana -> yellow</pre>
347
<pre class="verbatim"> <span class="w">Banana</span> <span class="w">Exists</span></pre>
348
<pre class="verbatim"> <span class="w">orange</span> <span class="w">-> orange</span>
349
<span class="w">tomato</span> <span class="w">-> red</span>
350
<span class="w">banana</span> <span class="w">-> yellow</span></pre>
348
351
<p>Note that the like ordinary associative arrays, the order of the keys
349
352
retrieved is in an apparently random order.</p>
350
353
<a name="DB_BTREE"></a><h1>DB_BTREE</h1>
356
359
<p>This script shows how to override the default sorting algorithm that
357
360
BTREE uses. Instead of using the normal lexical ordering, a case
358
361
insensitive compare function will be used.</p>
359
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="warnings.html">warnings</a> <span class="sc">;</span>
360
<a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="strict.html">strict</a> <span class="sc">;</span>
361
<a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="DB_File.html">DB_File</a> <span class="sc">;</span></pre>
362
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <span class="w">warnings</span> <span class="sc">;</span>
363
<a class="l_k" href="functions/use.html">use</a> <span class="w">strict</span> <span class="sc">;</span>
364
<a class="l_k" href="functions/use.html">use</a> <span class="w">DB_File</span> <span class="sc">;</span></pre>
362
365
<pre class="verbatim"> <a class="l_k" href="functions/my.html">my</a> <span class="i">%h</span> <span class="sc">;</span></pre>
363
366
<pre class="verbatim"><a name="Compare"></a> sub <span class="m">Compare</span>
364
367
<span class="s">{</span>
368
371
<pre class="verbatim"> <span class="c"># specify the Perl sub that will do the comparison</span>
369
372
<span class="i">$DB_BTREE</span>->{<span class="q">'compare'</span>} = \<span class="i">&Compare</span> <span class="sc">;</span></pre>
370
373
<pre class="verbatim"> <a class="l_k" href="functions/unlink.html">unlink</a> <span class="q">"tree"</span> <span class="sc">;</span>
371
<a class="l_k" href="functions/tie.html">tie</a> <span class="i">%h</span><span class="cm">,</span> <span class="q">"DB_File"</span><span class="cm">,</span> <span class="q">"tree"</span><span class="cm">,</span> O_RDWR|O_CREAT<span class="cm">,</span> <span class="n">0666</span><span class="cm">,</span> <span class="i">$DB_BTREE</span>
374
<a class="l_k" href="functions/tie.html">tie</a> <span class="i">%h</span><span class="cm">,</span> <span class="q">"DB_File"</span><span class="cm">,</span> <span class="q">"tree"</span><span class="cm">,</span> <span class="w">O_RDWR</span>|<span class="w">O_CREAT</span><span class="cm">,</span> <span class="n">0666</span><span class="cm">,</span> <span class="i">$DB_BTREE</span>
372
375
or <a class="l_k" href="functions/die.html">die</a> <span class="q">"Cannot open file 'tree': $!\n"</span> <span class="sc">;</span></pre>
373
376
<pre class="verbatim"> <span class="c"># Add a key/value pair to the file</span>
374
377
<span class="i">$h</span>{<span class="q">'Wall'</span>} = <span class="q">'Larry'</span> <span class="sc">;</span>
432
435
<p>There are some difficulties in using the tied hash interface if you
433
436
want to manipulate a BTREE database with duplicate keys. Consider this
435
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="warnings.html">warnings</a> <span class="sc">;</span>
436
<a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="strict.html">strict</a> <span class="sc">;</span>
437
<a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="DB_File.html">DB_File</a> <span class="sc">;</span></pre>
438
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <span class="w">warnings</span> <span class="sc">;</span>
439
<a class="l_k" href="functions/use.html">use</a> <span class="w">strict</span> <span class="sc">;</span>
440
<a class="l_k" href="functions/use.html">use</a> <span class="w">DB_File</span> <span class="sc">;</span></pre>
438
441
<pre class="verbatim"> <a class="l_k" href="functions/my.html">my</a> <span class="s">(</span><span class="i">$filename</span><span class="cm">,</span> <span class="i">%h</span><span class="s">)</span> <span class="sc">;</span></pre>
439
442
<pre class="verbatim"> <span class="i">$filename</span> = <span class="q">"tree"</span> <span class="sc">;</span>
440
443
<a class="l_k" href="functions/unlink.html">unlink</a> <span class="i">$filename</span> <span class="sc">;</span></pre>
441
444
<pre class="verbatim"> <span class="c"># Enable duplicate records</span>
442
<span class="i">$DB_BTREE</span>->{<span class="q">'flags'</span>} = R_DUP <span class="sc">;</span></pre>
443
<pre class="verbatim"> <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%h</span><span class="cm">,</span> <span class="q">"DB_File"</span><span class="cm">,</span> <span class="i">$filename</span><span class="cm">,</span> O_RDWR|O_CREAT<span class="cm">,</span> <span class="n">0666</span><span class="cm">,</span> <span class="i">$DB_BTREE</span>
445
<span class="i">$DB_BTREE</span>->{<span class="q">'flags'</span>} = <span class="w">R_DUP</span> <span class="sc">;</span></pre>
446
<pre class="verbatim"> <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%h</span><span class="cm">,</span> <span class="q">"DB_File"</span><span class="cm">,</span> <span class="i">$filename</span><span class="cm">,</span> <span class="w">O_RDWR</span>|<span class="w">O_CREAT</span><span class="cm">,</span> <span class="n">0666</span><span class="cm">,</span> <span class="i">$DB_BTREE</span>
444
447
or <a class="l_k" href="functions/die.html">die</a> <span class="q">"Cannot open $filename: $!\n"</span><span class="sc">;</span></pre>
445
448
<pre class="verbatim"> <span class="c"># Add some key/value pairs to the file</span>
446
449
<span class="i">$h</span>{<span class="q">'Wall'</span>} = <span class="q">'Larry'</span> <span class="sc">;</span>
454
457
<span class="s">{</span> <a class="l_k" href="functions/print.html">print</a> <span class="q">"$_ -> $h{$_}\n"</span> <span class="s">}</span></pre>
455
458
<pre class="verbatim"> <a class="l_k" href="functions/untie.html">untie</a> <span class="i">%h</span> <span class="sc">;</span></pre>
456
459
<p>Here is the output:</p>
457
<pre class="verbatim"> Smith -> John
461
mouse -> mickey</pre>
462
<p>As you can see 3 records have been successfully created with key <code class="inline">Wall</code>
460
<pre class="verbatim"> <span class="w">Smith</span> <span class="w">-> John</span>
461
<span class="w">Wall</span> <span class="w">-> Larry</span>
462
<span class="w">Wall</span> <span class="w">-> Larry</span>
463
<span class="w">Wall</span> <span class="w">-> Larry</span>
464
<span class="w">mouse</span> <span class="w">-> mickey</span></pre>
465
<p>As you can see 3 records have been successfully created with key <code class="inline"><span class="w">Wall</span></code>
464
467
- the only thing is, when they are retrieved from the database they
465
<i>seem</i> to have the same value, namely <code class="inline">Larry</code>
468
<i>seem</i> to have the same value, namely <code class="inline"><span class="w">Larry</span></code>
466
469
. The problem is caused
467
470
by the way that the associative array interface works. Basically, when
468
471
the associative array interface is used to fetch the value associated
471
474
associative array interface can be used to write values with duplicate
472
475
keys, but it cannot be used to read them back from the database.</p>
473
476
<p>The way to get around this problem is to use the Berkeley DB API method
474
called <code class="inline">seq</code>
477
called <code class="inline"><span class="w">seq</span></code>
475
478
. This method allows sequential access to key/value
476
pairs. See <a href="#THE-API-INTERFACE">"THE API INTERFACE"</a> for details of both the <code class="inline">seq</code>
479
pairs. See <a href="#THE-API-INTERFACE">"THE API INTERFACE"</a> for details of both the <code class="inline"><span class="w">seq</span></code>
478
481
and the API in general.</p>
479
<p>Here is the script above rewritten using the <code class="inline">seq</code>
482
<p>Here is the script above rewritten using the <code class="inline"><span class="w">seq</span></code>
481
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="warnings.html">warnings</a> <span class="sc">;</span>
482
<a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="strict.html">strict</a> <span class="sc">;</span>
483
<a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="DB_File.html">DB_File</a> <span class="sc">;</span></pre>
484
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <span class="w">warnings</span> <span class="sc">;</span>
485
<a class="l_k" href="functions/use.html">use</a> <span class="w">strict</span> <span class="sc">;</span>
486
<a class="l_k" href="functions/use.html">use</a> <span class="w">DB_File</span> <span class="sc">;</span></pre>
484
487
<pre class="verbatim"> <a class="l_k" href="functions/my.html">my</a> <span class="s">(</span><span class="i">$filename</span><span class="cm">,</span> <span class="i">$x</span><span class="cm">,</span> <span class="i">%h</span><span class="cm">,</span> <span class="i">$status</span><span class="cm">,</span> <span class="i">$key</span><span class="cm">,</span> <span class="i">$value</span><span class="s">)</span> <span class="sc">;</span></pre>
485
488
<pre class="verbatim"> <span class="i">$filename</span> = <span class="q">"tree"</span> <span class="sc">;</span>
486
489
<a class="l_k" href="functions/unlink.html">unlink</a> <span class="i">$filename</span> <span class="sc">;</span></pre>
487
490
<pre class="verbatim"> <span class="c"># Enable duplicate records</span>
488
<span class="i">$DB_BTREE</span>->{<span class="q">'flags'</span>} = R_DUP <span class="sc">;</span></pre>
489
<pre class="verbatim"> <span class="i">$x</span> = <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%h</span><span class="cm">,</span> <span class="q">"DB_File"</span><span class="cm">,</span> <span class="i">$filename</span><span class="cm">,</span> O_RDWR|O_CREAT<span class="cm">,</span> <span class="n">0666</span><span class="cm">,</span> <span class="i">$DB_BTREE</span>
491
<span class="i">$DB_BTREE</span>->{<span class="q">'flags'</span>} = <span class="w">R_DUP</span> <span class="sc">;</span></pre>
492
<pre class="verbatim"> <span class="i">$x</span> = <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%h</span><span class="cm">,</span> <span class="q">"DB_File"</span><span class="cm">,</span> <span class="i">$filename</span><span class="cm">,</span> <span class="w">O_RDWR</span>|<span class="w">O_CREAT</span><span class="cm">,</span> <span class="n">0666</span><span class="cm">,</span> <span class="i">$DB_BTREE</span>
490
493
or <a class="l_k" href="functions/die.html">die</a> <span class="q">"Cannot open $filename: $!\n"</span><span class="sc">;</span></pre>
491
494
<pre class="verbatim"> <span class="c"># Add some key/value pairs to the file</span>
492
495
<span class="i">$h</span>{<span class="q">'Wall'</span>} = <span class="q">'Larry'</span> <span class="sc">;</span>
497
500
<pre class="verbatim"> <span class="c"># iterate through the btree using seq</span>
498
501
<span class="c"># and print each key/value pair.</span>
499
502
<span class="i">$key</span> = <span class="i">$value</span> = <span class="n">0</span> <span class="sc">;</span>
500
for <span class="s">(</span><span class="i">$status</span> = <span class="i">$x</span><span class="i">->seq</span><span class="s">(</span><span class="i">$key</span><span class="cm">,</span> <span class="i">$value</span><span class="cm">,</span> R_FIRST<span class="s">)</span> <span class="sc">;</span>
503
for <span class="s">(</span><span class="i">$status</span> = <span class="i">$x</span><span class="i">->seq</span><span class="s">(</span><span class="i">$key</span><span class="cm">,</span> <span class="i">$value</span><span class="cm">,</span> <span class="w">R_FIRST</span><span class="s">)</span> <span class="sc">;</span>
501
504
<span class="i">$status</span> == <span class="n">0</span> <span class="sc">;</span>
502
<span class="i">$status</span> = <span class="i">$x</span><span class="i">->seq</span><span class="s">(</span><span class="i">$key</span><span class="cm">,</span> <span class="i">$value</span><span class="cm">,</span> R_NEXT<span class="s">)</span> <span class="s">)</span>
505
<span class="i">$status</span> = <span class="i">$x</span><span class="i">->seq</span><span class="s">(</span><span class="i">$key</span><span class="cm">,</span> <span class="i">$value</span><span class="cm">,</span> <span class="w">R_NEXT</span><span class="s">)</span> <span class="s">)</span>
503
506
<span class="s">{</span> <a class="l_k" href="functions/print.html">print</a> <span class="q">"$key -> $value\n"</span> <span class="s">}</span></pre>
504
507
<pre class="verbatim"> <a class="l_k" href="functions/undef.html">undef</a> <span class="i">$x</span> <span class="sc">;</span>
505
508
<a class="l_k" href="functions/untie.html">untie</a> <span class="i">%h</span> <span class="sc">;</span></pre>
506
509
<p>that prints:</p>
507
<pre class="verbatim"> Smith -> John
511
mouse -> mickey</pre>
510
<pre class="verbatim"> <span class="w">Smith</span> <span class="w">-> John</span>
511
<span class="w">Wall</span> <span class="w">-> Brick</span>
512
<span class="w">Wall</span> <span class="w">-> Brick</span>
513
<span class="w">Wall</span> <span class="w">-> Larry</span>
514
<span class="w">mouse</span> <span class="w">-> mickey</span></pre>
512
515
<p>This time we have got all the key/value pairs, including the multiple
513
values associated with the key <code class="inline">Wall</code>
516
values associated with the key <code class="inline"><span class="w">Wall</span></code>
515
518
<p>To make life easier when dealing with duplicate keys, <b>DB_File</b> comes with
516
519
a few utility methods.</p>
517
520
<a name="The-get_dup()-Method"></a><h2>The get_dup() Method</h2>
518
<p>The <code class="inline">get_dup</code>
521
<p>The <code class="inline"><span class="w">get_dup</span></code>
519
522
method assists in
520
523
reading duplicate values from BTREE databases. The method can take the
521
524
following forms:</p>
533
536
associative array correspond to the values that matched in the BTREE
534
537
and the values of the array are a count of the number of times that
535
538
particular value occurred in the BTREE.</p>
536
<p>So assuming the database created above, we can use <code class="inline">get_dup</code>
539
<p>So assuming the database created above, we can use <code class="inline"><span class="w">get_dup</span></code>
539
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="warnings.html">warnings</a> <span class="sc">;</span>
540
<a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="strict.html">strict</a> <span class="sc">;</span>
541
<a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="DB_File.html">DB_File</a> <span class="sc">;</span></pre>
542
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <span class="w">warnings</span> <span class="sc">;</span>
543
<a class="l_k" href="functions/use.html">use</a> <span class="w">strict</span> <span class="sc">;</span>
544
<a class="l_k" href="functions/use.html">use</a> <span class="w">DB_File</span> <span class="sc">;</span></pre>
542
545
<pre class="verbatim"> <a class="l_k" href="functions/my.html">my</a> <span class="s">(</span><span class="i">$filename</span><span class="cm">,</span> <span class="i">$x</span><span class="cm">,</span> <span class="i">%h</span><span class="s">)</span> <span class="sc">;</span></pre>
543
546
<pre class="verbatim"> <span class="i">$filename</span> = <span class="q">"tree"</span> <span class="sc">;</span></pre>
544
547
<pre class="verbatim"> <span class="c"># Enable duplicate records</span>
545
<span class="i">$DB_BTREE</span>->{<span class="q">'flags'</span>} = R_DUP <span class="sc">;</span></pre>
546
<pre class="verbatim"> <span class="i">$x</span> = <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%h</span><span class="cm">,</span> <span class="q">"DB_File"</span><span class="cm">,</span> <span class="i">$filename</span><span class="cm">,</span> O_RDWR|O_CREAT<span class="cm">,</span> <span class="n">0666</span><span class="cm">,</span> <span class="i">$DB_BTREE</span>
548
<span class="i">$DB_BTREE</span>->{<span class="q">'flags'</span>} = <span class="w">R_DUP</span> <span class="sc">;</span></pre>
549
<pre class="verbatim"> <span class="i">$x</span> = <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%h</span><span class="cm">,</span> <span class="q">"DB_File"</span><span class="cm">,</span> <span class="i">$filename</span><span class="cm">,</span> <span class="w">O_RDWR</span>|<span class="w">O_CREAT</span><span class="cm">,</span> <span class="n">0666</span><span class="cm">,</span> <span class="i">$DB_BTREE</span>
547
550
or <a class="l_k" href="functions/die.html">die</a> <span class="q">"Cannot open $filename: $!\n"</span><span class="sc">;</span></pre>
548
551
<pre class="verbatim"> <a class="l_k" href="functions/my.html">my</a> <span class="i">$cnt</span> = <span class="i">$x</span><span class="i">->get_dup</span><span class="s">(</span><span class="q">"Wall"</span><span class="s">)</span> <span class="sc">;</span>
549
552
<a class="l_k" href="functions/print.html">print</a> <span class="q">"Wall occurred $cnt times\n"</span> <span class="sc">;</span></pre>
568
571
pair exists, the cursor is left pointing to the pair and the method
569
572
returns 0. Otherwise the method returns a non-zero value.</p>
570
573
<p>Assuming the database from the previous example:</p>
571
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="warnings.html">warnings</a> <span class="sc">;</span>
572
<a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="strict.html">strict</a> <span class="sc">;</span>
573
<a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="DB_File.html">DB_File</a> <span class="sc">;</span></pre>
574
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <span class="w">warnings</span> <span class="sc">;</span>
575
<a class="l_k" href="functions/use.html">use</a> <span class="w">strict</span> <span class="sc">;</span>
576
<a class="l_k" href="functions/use.html">use</a> <span class="w">DB_File</span> <span class="sc">;</span></pre>
574
577
<pre class="verbatim"> <a class="l_k" href="functions/my.html">my</a> <span class="s">(</span><span class="i">$filename</span><span class="cm">,</span> <span class="i">$x</span><span class="cm">,</span> <span class="i">%h</span><span class="cm">,</span> <span class="i">$found</span><span class="s">)</span> <span class="sc">;</span></pre>
575
578
<pre class="verbatim"> <span class="i">$filename</span> = <span class="q">"tree"</span> <span class="sc">;</span></pre>
576
579
<pre class="verbatim"> <span class="c"># Enable duplicate records</span>
577
<span class="i">$DB_BTREE</span>->{<span class="q">'flags'</span>} = R_DUP <span class="sc">;</span></pre>
578
<pre class="verbatim"> <span class="i">$x</span> = <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%h</span><span class="cm">,</span> <span class="q">"DB_File"</span><span class="cm">,</span> <span class="i">$filename</span><span class="cm">,</span> O_RDWR|O_CREAT<span class="cm">,</span> <span class="n">0666</span><span class="cm">,</span> <span class="i">$DB_BTREE</span>
580
<span class="i">$DB_BTREE</span>->{<span class="q">'flags'</span>} = <span class="w">R_DUP</span> <span class="sc">;</span></pre>
581
<pre class="verbatim"> <span class="i">$x</span> = <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%h</span><span class="cm">,</span> <span class="q">"DB_File"</span><span class="cm">,</span> <span class="i">$filename</span><span class="cm">,</span> <span class="w">O_RDWR</span>|<span class="w">O_CREAT</span><span class="cm">,</span> <span class="n">0666</span><span class="cm">,</span> <span class="i">$DB_BTREE</span>
579
582
or <a class="l_k" href="functions/die.html">die</a> <span class="q">"Cannot open $filename: $!\n"</span><span class="sc">;</span></pre>
580
583
<pre class="verbatim"> <span class="i">$found</span> = <span class="s">(</span> <span class="i">$x</span><span class="i">->find_dup</span><span class="s">(</span><span class="q">"Wall"</span><span class="cm">,</span> <span class="q">"Larry"</span><span class="s">)</span> == <span class="n">0</span> ? <span class="q">""</span> <span class="co">:</span> <span class="q">"not"</span><span class="s">)</span> <span class="sc">;</span>
581
584
<a class="l_k" href="functions/print.html">print</a> <span class="q">"Larry Wall is $found there\n"</span> <span class="sc">;</span></pre>
584
587
<pre class="verbatim"> <a class="l_k" href="functions/undef.html">undef</a> <span class="i">$x</span> <span class="sc">;</span>
585
588
<a class="l_k" href="functions/untie.html">untie</a> <span class="i">%h</span> <span class="sc">;</span></pre>
586
589
<p>prints this</p>
587
<pre class="verbatim"> Larry Wall is there
588
Harry Wall is not there</pre>
590
<pre class="verbatim"> <span class="w">Larry</span> <span class="w">Wall</span> <span class="w">is</span> <span class="w">there</span>
591
<span class="w">Harry</span> <span class="w">Wall</span> <span class="w">is</span> not <span class="w">there</span></pre>
589
592
<a name="The-del_dup()-Method"></a><h2>The del_dup() Method</h2>
590
593
<pre class="verbatim"> <span class="i">$status</span> = <span class="i">$X</span><span class="i">->del_dup</span><span class="s">(</span><span class="i">$key</span><span class="cm">,</span> <span class="i">$value</span><span class="s">)</span> <span class="sc">;</span></pre>
591
594
<p>This method deletes a specific key/value pair. It returns
592
595
0 if they exist and have been deleted successfully.
593
596
Otherwise the method returns a non-zero value.</p>
594
<p>Again assuming the existence of the <code class="inline">tree</code>
597
<p>Again assuming the existence of the <code class="inline"><span class="w">tree</span></code>
596
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="warnings.html">warnings</a> <span class="sc">;</span>
597
<a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="strict.html">strict</a> <span class="sc">;</span>
598
<a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="DB_File.html">DB_File</a> <span class="sc">;</span></pre>
599
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <span class="w">warnings</span> <span class="sc">;</span>
600
<a class="l_k" href="functions/use.html">use</a> <span class="w">strict</span> <span class="sc">;</span>
601
<a class="l_k" href="functions/use.html">use</a> <span class="w">DB_File</span> <span class="sc">;</span></pre>
599
602
<pre class="verbatim"> <a class="l_k" href="functions/my.html">my</a> <span class="s">(</span><span class="i">$filename</span><span class="cm">,</span> <span class="i">$x</span><span class="cm">,</span> <span class="i">%h</span><span class="cm">,</span> <span class="i">$found</span><span class="s">)</span> <span class="sc">;</span></pre>
600
603
<pre class="verbatim"> <span class="i">$filename</span> = <span class="q">"tree"</span> <span class="sc">;</span></pre>
601
604
<pre class="verbatim"> <span class="c"># Enable duplicate records</span>
602
<span class="i">$DB_BTREE</span>->{<span class="q">'flags'</span>} = R_DUP <span class="sc">;</span></pre>
603
<pre class="verbatim"> <span class="i">$x</span> = <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%h</span><span class="cm">,</span> <span class="q">"DB_File"</span><span class="cm">,</span> <span class="i">$filename</span><span class="cm">,</span> O_RDWR|O_CREAT<span class="cm">,</span> <span class="n">0666</span><span class="cm">,</span> <span class="i">$DB_BTREE</span>
605
<span class="i">$DB_BTREE</span>->{<span class="q">'flags'</span>} = <span class="w">R_DUP</span> <span class="sc">;</span></pre>
606
<pre class="verbatim"> <span class="i">$x</span> = <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%h</span><span class="cm">,</span> <span class="q">"DB_File"</span><span class="cm">,</span> <span class="i">$filename</span><span class="cm">,</span> <span class="w">O_RDWR</span>|<span class="w">O_CREAT</span><span class="cm">,</span> <span class="n">0666</span><span class="cm">,</span> <span class="i">$DB_BTREE</span>
604
607
or <a class="l_k" href="functions/die.html">die</a> <span class="q">"Cannot open $filename: $!\n"</span><span class="sc">;</span></pre>
605
608
<pre class="verbatim"> <span class="i">$x</span><span class="i">->del_dup</span><span class="s">(</span><span class="q">"Wall"</span><span class="cm">,</span> <span class="q">"Larry"</span><span class="s">)</span> <span class="sc">;</span></pre>
606
609
<pre class="verbatim"> <span class="i">$found</span> = <span class="s">(</span> <span class="i">$x</span><span class="i">->find_dup</span><span class="s">(</span><span class="q">"Wall"</span><span class="cm">,</span> <span class="q">"Larry"</span><span class="s">)</span> == <span class="n">0</span> ? <span class="q">""</span> <span class="co">:</span> <span class="q">"not"</span><span class="s">)</span> <span class="sc">;</span>
608
611
<pre class="verbatim"> <a class="l_k" href="functions/undef.html">undef</a> <span class="i">$x</span> <span class="sc">;</span>
609
612
<a class="l_k" href="functions/untie.html">untie</a> <span class="i">%h</span> <span class="sc">;</span></pre>
610
613
<p>prints this</p>
611
<pre class="verbatim"> Larry Wall is not there</pre>
612
<a name="Matching-Partial-Keys"></a><h2>Matching Partial Keys </h2>
614
<pre class="verbatim"> <span class="w">Larry</span> <span class="w">Wall</span> <span class="w">is</span> not <span class="w">there</span></pre>
615
<a name="Matching-Partial-Keys"></a><h2>Matching Partial Keys</h2>
613
616
<p>The BTREE interface has a feature which allows partial keys to be
614
matched. This functionality is <i>only</i> available when the <code class="inline">seq</code>
617
matched. This functionality is <i>only</i> available when the <code class="inline"><span class="w">seq</span></code>
616
619
is used along with the R_CURSOR flag.</p>
617
<pre class="verbatim"> <span class="i">$x</span><span class="i">->seq</span><span class="s">(</span><span class="i">$key</span><span class="cm">,</span> <span class="i">$value</span><span class="cm">,</span> R_CURSOR<span class="s">)</span> <span class="sc">;</span></pre>
620
<pre class="verbatim"> <span class="i">$x</span><span class="i">->seq</span><span class="s">(</span><span class="i">$key</span><span class="cm">,</span> <span class="i">$value</span><span class="cm">,</span> <span class="w">R_CURSOR</span><span class="s">)</span> <span class="sc">;</span></pre>
618
621
<p>Here is the relevant quote from the dbopen man page where it defines
619
622
the use of the R_CURSOR flag with seq:</p>
620
<pre class="verbatim"> Note<span class="cm">,</span> for the DB_BTREE access method<span class="cm">,</span> the returned key is not
621
necessarily an exact match for the specified key. The returned key
622
is the smallest key greater than or equal to the specified key<span class="cm">,</span>
623
permitting partial key matches and range searches.</pre>
624
<p>In the example script below, the <code class="inline">match</code>
623
<pre class="verbatim"> <span class="w">Note</span><span class="cm">,</span> for <span class="w">the</span> <span class="w">DB_BTREE</span> <span class="w">access</span> <span class="w">method</span><span class="cm">,</span> <span class="w">the</span> <span class="w">returned</span> <span class="w">key</span> <span class="w">is</span> not
624
<span class="w">necessarily</span> <span class="w">an</span> <span class="w">exact</span> <span class="w">match</span> for <span class="w">the</span> <span class="w">specified</span> <span class="w">key</span>. <span class="w">The</span> <span class="w">returned</span> <span class="w">key</span>
625
<span class="w">is</span> <span class="w">the</span> <span class="w">smallest</span> <span class="w">key</span> <span class="w">greater</span> <span class="w">than</span> or <span class="w">equal</span> <span class="w">to</span> <span class="w">the</span> <span class="w">specified</span> <span class="w">key</span><span class="cm">,</span>
626
<span class="w">permitting</span> <span class="w">partial</span> <span class="w">key</span> <span class="w">matches</span> and <span class="w">range</span> <span class="w">searches</span>.</pre>
627
<p>In the example script below, the <code class="inline"><span class="w">match</span></code>
625
628
sub uses this feature to find
626
629
and print the first matching key/value pair given a partial key.</p>
627
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="warnings.html">warnings</a> <span class="sc">;</span>
628
<a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="strict.html">strict</a> <span class="sc">;</span>
629
<a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="DB_File.html">DB_File</a> <span class="sc">;</span>
630
<a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="Fcntl.html">Fcntl</a> <span class="sc">;</span></pre>
630
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <span class="w">warnings</span> <span class="sc">;</span>
631
<a class="l_k" href="functions/use.html">use</a> <span class="w">strict</span> <span class="sc">;</span>
632
<a class="l_k" href="functions/use.html">use</a> <span class="w">DB_File</span> <span class="sc">;</span>
633
<a class="l_k" href="functions/use.html">use</a> <span class="w">Fcntl</span> <span class="sc">;</span></pre>
631
634
<pre class="verbatim"> <a class="l_k" href="functions/my.html">my</a> <span class="s">(</span><span class="i">$filename</span><span class="cm">,</span> <span class="i">$x</span><span class="cm">,</span> <span class="i">%h</span><span class="cm">,</span> <span class="i">$st</span><span class="cm">,</span> <span class="i">$key</span><span class="cm">,</span> <span class="i">$value</span><span class="s">)</span> <span class="sc">;</span></pre>
632
635
<pre class="verbatim"><a name="match"></a> sub <span class="m">match</span>
633
636
<span class="s">{</span>
634
637
<a class="l_k" href="functions/my.html">my</a> <span class="i">$key</span> = <a class="l_k" href="functions/shift.html">shift</a> <span class="sc">;</span>
635
638
<a class="l_k" href="functions/my.html">my</a> <span class="i">$value</span> = <span class="n">0</span><span class="sc">;</span>
636
639
<a class="l_k" href="functions/my.html">my</a> <span class="i">$orig_key</span> = <span class="i">$key</span> <span class="sc">;</span>
637
<span class="i">$x</span><span class="i">->seq</span><span class="s">(</span><span class="i">$key</span><span class="cm">,</span> <span class="i">$value</span><span class="cm">,</span> R_CURSOR<span class="s">)</span> <span class="sc">;</span>
640
<span class="i">$x</span><span class="i">->seq</span><span class="s">(</span><span class="i">$key</span><span class="cm">,</span> <span class="i">$value</span><span class="cm">,</span> <span class="w">R_CURSOR</span><span class="s">)</span> <span class="sc">;</span>
638
641
<a class="l_k" href="functions/print.html">print</a> <span class="q">"$orig_key\t-> $key\t-> $value\n"</span> <span class="sc">;</span>
639
642
<span class="s">}</span></pre>
640
643
<pre class="verbatim"> <span class="i">$filename</span> = <span class="q">"tree"</span> <span class="sc">;</span>
641
644
<a class="l_k" href="functions/unlink.html">unlink</a> <span class="i">$filename</span> <span class="sc">;</span></pre>
642
<pre class="verbatim"> <span class="i">$x</span> = <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%h</span><span class="cm">,</span> <span class="q">"DB_File"</span><span class="cm">,</span> <span class="i">$filename</span><span class="cm">,</span> O_RDWR|O_CREAT<span class="cm">,</span> <span class="n">0666</span><span class="cm">,</span> <span class="i">$DB_BTREE</span>
645
<pre class="verbatim"> <span class="i">$x</span> = <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%h</span><span class="cm">,</span> <span class="q">"DB_File"</span><span class="cm">,</span> <span class="i">$filename</span><span class="cm">,</span> <span class="w">O_RDWR</span>|<span class="w">O_CREAT</span><span class="cm">,</span> <span class="n">0666</span><span class="cm">,</span> <span class="i">$DB_BTREE</span>
643
646
or <a class="l_k" href="functions/die.html">die</a> <span class="q">"Cannot open $filename: $!\n"</span><span class="sc">;</span></pre>
644
647
<pre class="verbatim"> <span class="c"># Add some key/value pairs to the file</span>
645
648
<span class="i">$h</span>{<span class="q">'mouse'</span>} = <span class="q">'mickey'</span> <span class="sc">;</span>
648
651
<span class="i">$h</span>{<span class="q">'Smith'</span>} = <span class="q">'John'</span> <span class="sc">;</span></pre>
649
652
<pre class="verbatim"> <span class="i">$key</span> = <span class="i">$value</span> = <span class="n">0</span> <span class="sc">;</span>
650
653
<a class="l_k" href="functions/print.html">print</a> <span class="q">"IN ORDER\n"</span> <span class="sc">;</span>
651
for <span class="s">(</span><span class="i">$st</span> = <span class="i">$x</span><span class="i">->seq</span><span class="s">(</span><span class="i">$key</span><span class="cm">,</span> <span class="i">$value</span><span class="cm">,</span> R_FIRST<span class="s">)</span> <span class="sc">;</span>
654
for <span class="s">(</span><span class="i">$st</span> = <span class="i">$x</span><span class="i">->seq</span><span class="s">(</span><span class="i">$key</span><span class="cm">,</span> <span class="i">$value</span><span class="cm">,</span> <span class="w">R_FIRST</span><span class="s">)</span> <span class="sc">;</span>
652
655
<span class="i">$st</span> == <span class="n">0</span> <span class="sc">;</span>
653
<span class="i">$st</span> = <span class="i">$x</span><span class="i">->seq</span><span class="s">(</span><span class="i">$key</span><span class="cm">,</span> <span class="i">$value</span><span class="cm">,</span> R_NEXT<span class="s">)</span> <span class="s">)</span></pre>
656
<span class="i">$st</span> = <span class="i">$x</span><span class="i">->seq</span><span class="s">(</span><span class="i">$key</span><span class="cm">,</span> <span class="i">$value</span><span class="cm">,</span> <span class="w">R_NEXT</span><span class="s">)</span> <span class="s">)</span></pre>
654
657
<pre class="verbatim"> <span class="s">{</span> <a class="l_k" href="functions/print.html">print</a> <span class="q">"$key -> $value\n"</span> <span class="s">}</span></pre>
655
658
<pre class="verbatim"> <a class="l_k" href="functions/print.html">print</a> <span class="q">"\nPARTIAL MATCH\n"</span> <span class="sc">;</span></pre>
656
<pre class="verbatim"> match <span class="q">"Wa"</span> <span class="sc">;</span>
657
match <span class="q">"A"</span> <span class="sc">;</span>
658
match <span class="q">"a"</span> <span class="sc">;</span></pre>
659
<pre class="verbatim"> <span class="w">match</span> <span class="q">"Wa"</span> <span class="sc">;</span>
660
<span class="w">match</span> <span class="q">"A"</span> <span class="sc">;</span>
661
<span class="w">match</span> <span class="q">"a"</span> <span class="sc">;</span></pre>
659
662
<pre class="verbatim"> <a class="l_k" href="functions/undef.html">undef</a> <span class="i">$x</span> <span class="sc">;</span>
660
663
<a class="l_k" href="functions/untie.html">untie</a> <span class="i">%h</span> <span class="sc">;</span></pre>
661
664
<p>Here is the output:</p>
662
<pre class="verbatim"> IN ORDER
666
mouse -> mickey</pre>
667
<pre class="verbatim"> PARTIAL MATCH
668
Wa -> Wall -> Larry
669
A -> Smith -> John
670
a -> mouse -> mickey</pre>
665
<pre class="verbatim"> <span class="w">IN</span> <span class="w">ORDER</span>
666
<span class="w">Smith</span> <span class="w">-> John</span>
667
<span class="w">Wall</span> <span class="w">-> Larry</span>
668
<span class="w">Walls</span> <span class="w">-> Brick</span>
669
<span class="w">mouse</span> <span class="w">-> mickey</span></pre>
670
<pre class="verbatim"> <span class="w">PARTIAL</span> <span class="w">MATCH</span>
671
<span class="w">Wa</span> <span class="w">-> Wall</span> <span class="w">-> Larry</span>
672
<span class="w">A</span> <span class="w">-> Smith</span> <span class="w">-> John</span>
673
<span class="w">a</span> <span class="w">-> mouse</span> <span class="w">-> mickey</span></pre>
671
674
<a name="DB_RECNO"></a><h1>DB_RECNO</h1>
672
675
<p>DB_RECNO provides an interface to flat text files. Both variable and
673
676
fixed length records are supported.</p>
705
708
<p>Here is a simple example that uses RECNO (if you are using a version
706
709
of Perl earlier than 5.004_57 this example won't work -- see
707
710
<a href="#Extra-RECNO-Methods">"Extra RECNO Methods"</a> for a workaround).</p>
708
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="warnings.html">warnings</a> <span class="sc">;</span>
709
<a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="strict.html">strict</a> <span class="sc">;</span>
710
<a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="DB_File.html">DB_File</a> <span class="sc">;</span></pre>
711
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <span class="w">warnings</span> <span class="sc">;</span>
712
<a class="l_k" href="functions/use.html">use</a> <span class="w">strict</span> <span class="sc">;</span>
713
<a class="l_k" href="functions/use.html">use</a> <span class="w">DB_File</span> <span class="sc">;</span></pre>
711
714
<pre class="verbatim"> <a class="l_k" href="functions/my.html">my</a> <span class="i">$filename</span> = <span class="q">"text"</span> <span class="sc">;</span>
712
715
<a class="l_k" href="functions/unlink.html">unlink</a> <span class="i">$filename</span> <span class="sc">;</span></pre>
713
716
<pre class="verbatim"> <a class="l_k" href="functions/my.html">my</a> <span class="i">@h</span> <span class="sc">;</span>
714
<a class="l_k" href="functions/tie.html">tie</a> <span class="i">@h</span><span class="cm">,</span> <span class="q">"DB_File"</span><span class="cm">,</span> <span class="i">$filename</span><span class="cm">,</span> O_RDWR|O_CREAT<span class="cm">,</span> <span class="n">0666</span><span class="cm">,</span> <span class="i">$DB_RECNO</span>
717
<a class="l_k" href="functions/tie.html">tie</a> <span class="i">@h</span><span class="cm">,</span> <span class="q">"DB_File"</span><span class="cm">,</span> <span class="i">$filename</span><span class="cm">,</span> <span class="w">O_RDWR</span>|<span class="w">O_CREAT</span><span class="cm">,</span> <span class="n">0666</span><span class="cm">,</span> <span class="i">$DB_RECNO</span>
715
718
or <a class="l_k" href="functions/die.html">die</a> <span class="q">"Cannot open file 'text': $!\n"</span> <span class="sc">;</span></pre>
716
719
<pre class="verbatim"> <span class="c"># Add a few key/value pairs to the file</span>
717
720
<span class="i">$h</span>[<span class="n">0</span>] = <span class="q">"orange"</span> <span class="sc">;</span>
773
776
<p>Here is a more complete example that makes use of some of the methods
774
777
described above. It also makes use of the API interface directly (see
775
778
<a href="#THE-API-INTERFACE">"THE API INTERFACE"</a>).</p>
776
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="warnings.html">warnings</a> <span class="sc">;</span>
777
<a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="strict.html">strict</a> <span class="sc">;</span>
779
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <span class="w">warnings</span> <span class="sc">;</span>
780
<a class="l_k" href="functions/use.html">use</a> <span class="w">strict</span> <span class="sc">;</span>
778
781
<a class="l_k" href="functions/my.html">my</a> <span class="s">(</span><span class="i">@h</span><span class="cm">,</span> <span class="i">$H</span><span class="cm">,</span> <span class="i">$file</span><span class="cm">,</span> <span class="i">$i</span><span class="s">)</span> <span class="sc">;</span>
779
<a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="DB_File.html">DB_File</a> <span class="sc">;</span>
780
<a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="Fcntl.html">Fcntl</a> <span class="sc">;</span></pre>
782
<a class="l_k" href="functions/use.html">use</a> <span class="w">DB_File</span> <span class="sc">;</span>
783
<a class="l_k" href="functions/use.html">use</a> <span class="w">Fcntl</span> <span class="sc">;</span></pre>
781
784
<pre class="verbatim"> <span class="i">$file</span> = <span class="q">"text"</span> <span class="sc">;</span></pre>
782
785
<pre class="verbatim"> <a class="l_k" href="functions/unlink.html">unlink</a> <span class="i">$file</span> <span class="sc">;</span></pre>
783
<pre class="verbatim"> <span class="i">$H</span> = <a class="l_k" href="functions/tie.html">tie</a> <span class="i">@h</span><span class="cm">,</span> <span class="q">"DB_File"</span><span class="cm">,</span> <span class="i">$file</span><span class="cm">,</span> O_RDWR|O_CREAT<span class="cm">,</span> <span class="n">0666</span><span class="cm">,</span> <span class="i">$DB_RECNO</span>
786
<pre class="verbatim"> <span class="i">$H</span> = <a class="l_k" href="functions/tie.html">tie</a> <span class="i">@h</span><span class="cm">,</span> <span class="q">"DB_File"</span><span class="cm">,</span> <span class="i">$file</span><span class="cm">,</span> <span class="w">O_RDWR</span>|<span class="w">O_CREAT</span><span class="cm">,</span> <span class="n">0666</span><span class="cm">,</span> <span class="i">$DB_RECNO</span>
784
787
or <a class="l_k" href="functions/die.html">die</a> <span class="q">"Cannot open file $file: $!\n"</span> <span class="sc">;</span></pre>
785
788
<pre class="verbatim"> <span class="c"># first create a text file to play with</span>
786
789
<span class="i">$h</span>[<span class="n">0</span>] = <span class="q">"zero"</span> <span class="sc">;</span>
807
810
<a class="l_k" href="functions/print.html">print</a> <span class="q">"The first record was [$a]\n"</span> <span class="sc">;</span></pre>
808
811
<pre class="verbatim"> <span class="c"># Use the API to add a new record after record 2.</span>
809
812
<span class="i">$i</span> = <span class="n">2</span> <span class="sc">;</span>
810
<span class="i">$H</span><span class="i">->put</span><span class="s">(</span><span class="i">$i</span><span class="cm">,</span> <span class="q">"Newbie"</span><span class="cm">,</span> R_IAFTER<span class="s">)</span> <span class="sc">;</span></pre>
813
<span class="i">$H</span><span class="i">->put</span><span class="s">(</span><span class="i">$i</span><span class="cm">,</span> <span class="q">"Newbie"</span><span class="cm">,</span> <span class="w">R_IAFTER</span><span class="s">)</span> <span class="sc">;</span></pre>
811
814
<pre class="verbatim"> <span class="c"># and a new record before record 1.</span>
812
815
<span class="i">$i</span> = <span class="n">1</span> <span class="sc">;</span>
813
<span class="i">$H</span><span class="i">->put</span><span class="s">(</span><span class="i">$i</span><span class="cm">,</span> <span class="q">"New One"</span><span class="cm">,</span> R_IBEFORE<span class="s">)</span> <span class="sc">;</span></pre>
816
<span class="i">$H</span><span class="i">->put</span><span class="s">(</span><span class="i">$i</span><span class="cm">,</span> <span class="q">"New One"</span><span class="cm">,</span> <span class="w">R_IBEFORE</span><span class="s">)</span> <span class="sc">;</span></pre>
814
817
<pre class="verbatim"> <span class="c"># delete record 3</span>
815
818
<span class="i">$H</span><span class="i">->del</span><span class="s">(</span><span class="n">3</span><span class="s">)</span> <span class="sc">;</span></pre>
816
819
<pre class="verbatim"> <span class="c"># now print the records in reverse order</span>
820
823
<pre class="verbatim"> <span class="c"># same again, but use the API functions instead</span>
821
824
<a class="l_k" href="functions/print.html">print</a> <span class="q">"\nREVERSE again\n"</span> <span class="sc">;</span>
822
825
<a class="l_k" href="functions/my.html">my</a> <span class="s">(</span><span class="i">$s</span><span class="cm">,</span> <span class="i">$k</span><span class="cm">,</span> <span class="i">$v</span><span class="s">)</span> = <span class="s">(</span><span class="n">0</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="n">0</span><span class="s">)</span> <span class="sc">;</span>
823
for <span class="s">(</span><span class="i">$s</span> = <span class="i">$H</span><span class="i">->seq</span><span class="s">(</span><span class="i">$k</span><span class="cm">,</span> <span class="i">$v</span><span class="cm">,</span> R_LAST<span class="s">)</span> <span class="sc">;</span>
826
for <span class="s">(</span><span class="i">$s</span> = <span class="i">$H</span><span class="i">->seq</span><span class="s">(</span><span class="i">$k</span><span class="cm">,</span> <span class="i">$v</span><span class="cm">,</span> <span class="w">R_LAST</span><span class="s">)</span> <span class="sc">;</span>
824
827
<span class="i">$s</span> == <span class="n">0</span> <span class="sc">;</span>
825
<span class="i">$s</span> = <span class="i">$H</span><span class="i">->seq</span><span class="s">(</span><span class="i">$k</span><span class="cm">,</span> <span class="i">$v</span><span class="cm">,</span> R_PREV<span class="s">)</span><span class="s">)</span>
828
<span class="i">$s</span> = <span class="i">$H</span><span class="i">->seq</span><span class="s">(</span><span class="i">$k</span><span class="cm">,</span> <span class="i">$v</span><span class="cm">,</span> <span class="w">R_PREV</span><span class="s">)</span><span class="s">)</span>
826
829
<span class="s">{</span> <a class="l_k" href="functions/print.html">print</a> <span class="q">"$k: $v\n"</span> <span class="s">}</span></pre>
827
830
<pre class="verbatim"> <a class="l_k" href="functions/undef.html">undef</a> <span class="i">$H</span> <span class="sc">;</span>
828
831
<a class="l_k" href="functions/untie.html">untie</a> <span class="i">@h</span> <span class="sc">;</span></pre>
854
857
<pre class="verbatim"> foreach <span class="i">$i</span> <span class="s">(</span><span class="i">@h</span><span class="s">)</span></pre>
855
858
<p>it is necessary to use either this:</p>
856
<pre class="verbatim"> foreach <span class="i">$i</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$H</span><span class="i">->length</span> - <span class="n">1</span><span class="s">)</span> </pre>
859
<pre class="verbatim"> foreach <span class="i">$i</span> <span class="s">(</span><span class="n">0</span> .. <span class="i">$H</span><span class="i">->length</span> - <span class="n">1</span><span class="s">)</span></pre>
858
<pre class="verbatim"> for <span class="s">(</span><span class="i">$a</span> = <span class="i">$H</span><span class="i">->get</span><span class="s">(</span><span class="i">$k</span><span class="cm">,</span> <span class="i">$v</span><span class="cm">,</span> R_FIRST<span class="s">)</span> <span class="sc">;</span>
861
<pre class="verbatim"> for <span class="s">(</span><span class="i">$a</span> = <span class="i">$H</span><span class="i">->get</span><span class="s">(</span><span class="i">$k</span><span class="cm">,</span> <span class="i">$v</span><span class="cm">,</span> <span class="w">R_FIRST</span><span class="s">)</span> <span class="sc">;</span>
859
862
<span class="i">$a</span> == <span class="n">0</span> <span class="sc">;</span>
860
<span class="i">$a</span> = <span class="i">$H</span><span class="i">->get</span><span class="s">(</span><span class="i">$k</span><span class="cm">,</span> <span class="i">$v</span><span class="cm">,</span> R_NEXT<span class="s">)</span> <span class="s">)</span></pre>
863
<span class="i">$a</span> = <span class="i">$H</span><span class="i">->get</span><span class="s">(</span><span class="i">$k</span><span class="cm">,</span> <span class="i">$v</span><span class="cm">,</span> <span class="w">R_NEXT</span><span class="s">)</span> <span class="s">)</span></pre>
863
<p>Notice that both times the <code class="inline">put</code>
866
<p>Notice that both times the <code class="inline"><span class="w">put</span></code>
864
867
method was used the record index was
865
868
specified using a variable, <code class="inline"><span class="i">$i</span></code>
866
869
, rather than the literal value
867
itself. This is because <code class="inline">put</code>
870
itself. This is because <code class="inline"><span class="w">put</span></code>
868
871
will return the record number of the
869
872
inserted line via that parameter.</p>
877
880
<pre class="verbatim"> <span class="i">$db</span> = <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%hash</span><span class="cm">,</span> <span class="q">"DB_File"</span><span class="cm">,</span> <span class="q">"filename"</span> <span class="sc">;</span></pre>
878
881
<p>Once you have done that, you can access the Berkeley DB API functions
879
882
as <b>DB_File</b> methods directly like this:</p>
880
<pre class="verbatim"> <span class="i">$db</span><span class="i">->put</span><span class="s">(</span><span class="i">$key</span><span class="cm">,</span> <span class="i">$value</span><span class="cm">,</span> R_NOOVERWRITE<span class="s">)</span> <span class="sc">;</span></pre>
883
<pre class="verbatim"> <span class="i">$db</span><span class="i">->put</span><span class="s">(</span><span class="i">$key</span><span class="cm">,</span> <span class="i">$value</span><span class="cm">,</span> <span class="w">R_NOOVERWRITE</span><span class="s">)</span> <span class="sc">;</span></pre>
881
884
<p><b>Important:</b> If you have saved a copy of the object returned from
882
885
<code class="inline"><a class="l_k" href="functions/tie.html">tie</a></code>, the underlying database file will <i>not</i> be closed until both
883
886
the tied variable is untied and all copies of the saved object are
885
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="DB_File.html">DB_File</a> <span class="sc">;</span>
888
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <span class="w">DB_File</span> <span class="sc">;</span>
886
889
<span class="i">$db</span> = <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%hash</span><span class="cm">,</span> <span class="q">"DB_File"</span><span class="cm">,</span> <span class="q">"filename"</span>
887
890
or <a class="l_k" href="functions/die.html">die</a> <span class="q">"Cannot tie filename: $!"</span> <span class="sc">;</span>
915
918
the cursor, you should always assume that the cursor has been changed
916
919
any time the tied hash/array interface is used. As an example, this
917
920
code will probably not do what you expect:</p>
918
<pre class="verbatim"> <span class="i">$X</span> = <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%x</span><span class="cm">,</span> <span class="q">'DB_File'</span><span class="cm">,</span> <span class="i">$filename</span><span class="cm">,</span> O_RDWR|O_CREAT<span class="cm">,</span> <span class="n">0777</span><span class="cm">,</span> <span class="i">$DB_BTREE</span>
921
<pre class="verbatim"> <span class="i">$X</span> = <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%x</span><span class="cm">,</span> <span class="q">'DB_File'</span><span class="cm">,</span> <span class="i">$filename</span><span class="cm">,</span> <span class="w">O_RDWR</span>|<span class="w">O_CREAT</span><span class="cm">,</span> <span class="n">0777</span><span class="cm">,</span> <span class="i">$DB_BTREE</span>
919
922
or <a class="l_k" href="functions/die.html">die</a> <span class="q">"Cannot tie $filename: $!"</span> <span class="sc">;</span></pre>
920
923
<pre class="verbatim"> <span class="c"># Get the first key/value pair and set the cursor</span>
921
<span class="i">$X</span><span class="i">->seq</span><span class="s">(</span><span class="i">$key</span><span class="cm">,</span> <span class="i">$value</span><span class="cm">,</span> R_FIRST<span class="s">)</span> <span class="sc">;</span></pre>
924
<span class="i">$X</span><span class="i">->seq</span><span class="s">(</span><span class="i">$key</span><span class="cm">,</span> <span class="i">$value</span><span class="cm">,</span> <span class="w">R_FIRST</span><span class="s">)</span> <span class="sc">;</span></pre>
922
925
<pre class="verbatim"> <span class="c"># this line will modify the cursor</span>
923
<span class="i">$count</span> = <a class="l_k" href="functions/scalar.html">scalar</a> <a class="l_k" href="functions/keys.html">keys</a> <span class="i">%x</span> <span class="sc">;</span> </pre>
926
<span class="i">$count</span> = <a class="l_k" href="functions/scalar.html">scalar</a> <a class="l_k" href="functions/keys.html">keys</a> <span class="i">%x</span> <span class="sc">;</span></pre>
924
927
<pre class="verbatim"> <span class="c"># Get the second key/value pair.</span>
925
928
<span class="c"># oops, it didn't, it got the last key/value pair!</span>
926
<span class="i">$X</span><span class="i">->seq</span><span class="s">(</span><span class="i">$key</span><span class="cm">,</span> <span class="i">$value</span><span class="cm">,</span> R_NEXT<span class="s">)</span> <span class="sc">;</span></pre>
929
<span class="i">$X</span><span class="i">->seq</span><span class="s">(</span><span class="i">$key</span><span class="cm">,</span> <span class="i">$value</span><span class="cm">,</span> <span class="w">R_NEXT</span><span class="s">)</span> <span class="sc">;</span></pre>
927
930
<p>The code above can be rearranged to get around the problem, like this:</p>
928
<pre class="verbatim"> <span class="i">$X</span> = <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%x</span><span class="cm">,</span> <span class="q">'DB_File'</span><span class="cm">,</span> <span class="i">$filename</span><span class="cm">,</span> O_RDWR|O_CREAT<span class="cm">,</span> <span class="n">0777</span><span class="cm">,</span> <span class="i">$DB_BTREE</span>
931
<pre class="verbatim"> <span class="i">$X</span> = <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%x</span><span class="cm">,</span> <span class="q">'DB_File'</span><span class="cm">,</span> <span class="i">$filename</span><span class="cm">,</span> <span class="w">O_RDWR</span>|<span class="w">O_CREAT</span><span class="cm">,</span> <span class="n">0777</span><span class="cm">,</span> <span class="i">$DB_BTREE</span>
929
932
or <a class="l_k" href="functions/die.html">die</a> <span class="q">"Cannot tie $filename: $!"</span> <span class="sc">;</span></pre>
930
933
<pre class="verbatim"> <span class="c"># this line will modify the cursor</span>
931
<span class="i">$count</span> = <a class="l_k" href="functions/scalar.html">scalar</a> <a class="l_k" href="functions/keys.html">keys</a> <span class="i">%x</span> <span class="sc">;</span> </pre>
934
<span class="i">$count</span> = <a class="l_k" href="functions/scalar.html">scalar</a> <a class="l_k" href="functions/keys.html">keys</a> <span class="i">%x</span> <span class="sc">;</span></pre>
932
935
<pre class="verbatim"> <span class="c"># Get the first key/value pair and set the cursor</span>
933
<span class="i">$X</span><span class="i">->seq</span><span class="s">(</span><span class="i">$key</span><span class="cm">,</span> <span class="i">$value</span><span class="cm">,</span> R_FIRST<span class="s">)</span> <span class="sc">;</span></pre>
936
<span class="i">$X</span><span class="i">->seq</span><span class="s">(</span><span class="i">$key</span><span class="cm">,</span> <span class="i">$value</span><span class="cm">,</span> <span class="w">R_FIRST</span><span class="s">)</span> <span class="sc">;</span></pre>
934
937
<pre class="verbatim"> <span class="c"># Get the second key/value pair.</span>
935
938
<span class="c"># worked this time.</span>
936
<span class="i">$X</span><span class="i">->seq</span><span class="s">(</span><span class="i">$key</span><span class="cm">,</span> <span class="i">$value</span><span class="cm">,</span> R_NEXT<span class="s">)</span> <span class="sc">;</span></pre>
939
<span class="i">$X</span><span class="i">->seq</span><span class="s">(</span><span class="i">$key</span><span class="cm">,</span> <span class="i">$value</span><span class="cm">,</span> <span class="w">R_NEXT</span><span class="s">)</span> <span class="sc">;</span></pre>
939
942
<p>All the constants defined in <a href="http://search.cpan.org/perldoc/dbopen">dbopen</a> for use in the flags parameters
1039
1042
the database and have them removed when you read from the database. As I'm
1040
1043
sure you have already guessed, this is a problem that DBM Filters can
1041
1044
fix very easily.</p>
1042
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="warnings.html">warnings</a> <span class="sc">;</span>
1043
<a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="strict.html">strict</a> <span class="sc">;</span>
1044
<a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="DB_File.html">DB_File</a> <span class="sc">;</span></pre>
1045
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <span class="w">warnings</span> <span class="sc">;</span>
1046
<a class="l_k" href="functions/use.html">use</a> <span class="w">strict</span> <span class="sc">;</span>
1047
<a class="l_k" href="functions/use.html">use</a> <span class="w">DB_File</span> <span class="sc">;</span></pre>
1045
1048
<pre class="verbatim"> <a class="l_k" href="functions/my.html">my</a> <span class="i">%hash</span> <span class="sc">;</span>
1046
1049
<a class="l_k" href="functions/my.html">my</a> <span class="i">$filename</span> = <span class="q">"filt"</span> <span class="sc">;</span>
1047
1050
<a class="l_k" href="functions/unlink.html">unlink</a> <span class="i">$filename</span> <span class="sc">;</span></pre>
1048
<pre class="verbatim"> <a class="l_k" href="functions/my.html">my</a> <span class="i">$db</span> = <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%hash</span><span class="cm">,</span> <span class="q">'DB_File'</span><span class="cm">,</span> <span class="i">$filename</span><span class="cm">,</span> O_CREAT|O_RDWR<span class="cm">,</span> <span class="n">0666</span><span class="cm">,</span> <span class="i">$DB_HASH</span>
1051
<pre class="verbatim"> <a class="l_k" href="functions/my.html">my</a> <span class="i">$db</span> = <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%hash</span><span class="cm">,</span> <span class="q">'DB_File'</span><span class="cm">,</span> <span class="i">$filename</span><span class="cm">,</span> <span class="w">O_CREAT</span>|<span class="w">O_RDWR</span><span class="cm">,</span> <span class="n">0666</span><span class="cm">,</span> <span class="i">$DB_HASH</span>
1049
1052
or <a class="l_k" href="functions/die.html">die</a> <span class="q">"Cannot open $filename: $!\n"</span> <span class="sc">;</span></pre>
1050
1053
<pre class="verbatim"> <span class="c"># Install DBM Filters</span>
1051
1054
<span class="i">$db</span><span class="i">->filter_fetch_key</span> <span class="s">(</span> <a class="l_k" href="functions/sub.html">sub</a> <span class="s">{</span> <span class="q">s/\0$//</span> <span class="s">}</span> <span class="s">)</span> <span class="sc">;</span>
1070
1073
as a C int, you will have to use <code class="inline"><a class="l_k" href="functions/pack.html">pack</a></code> when writing, and <code class="inline"><a class="l_k" href="functions/unpack.html">unpack</a></code>
1071
1074
when reading.</p>
1072
1075
<p>Here is a DBM Filter that does it:</p>
1073
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="warnings.html">warnings</a> <span class="sc">;</span>
1074
<a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="strict.html">strict</a> <span class="sc">;</span>
1075
<a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="DB_File.html">DB_File</a> <span class="sc">;</span>
1076
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <span class="w">warnings</span> <span class="sc">;</span>
1077
<a class="l_k" href="functions/use.html">use</a> <span class="w">strict</span> <span class="sc">;</span>
1078
<a class="l_k" href="functions/use.html">use</a> <span class="w">DB_File</span> <span class="sc">;</span>
1076
1079
<a class="l_k" href="functions/my.html">my</a> <span class="i">%hash</span> <span class="sc">;</span>
1077
1080
<a class="l_k" href="functions/my.html">my</a> <span class="i">$filename</span> = <span class="q">"filt"</span> <span class="sc">;</span>
1078
1081
<a class="l_k" href="functions/unlink.html">unlink</a> <span class="i">$filename</span> <span class="sc">;</span></pre>
1079
<pre class="verbatim"> <a class="l_k" href="functions/my.html">my</a> <span class="i">$db</span> = <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%hash</span><span class="cm">,</span> <span class="q">'DB_File'</span><span class="cm">,</span> <span class="i">$filename</span><span class="cm">,</span> O_CREAT|O_RDWR<span class="cm">,</span> <span class="n">0666</span><span class="cm">,</span> <span class="i">$DB_HASH</span>
1082
<pre class="verbatim"> <a class="l_k" href="functions/my.html">my</a> <span class="i">$db</span> = <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%hash</span><span class="cm">,</span> <span class="q">'DB_File'</span><span class="cm">,</span> <span class="i">$filename</span><span class="cm">,</span> <span class="w">O_CREAT</span>|<span class="w">O_RDWR</span><span class="cm">,</span> <span class="n">0666</span><span class="cm">,</span> <span class="i">$DB_HASH</span>
1080
1083
or <a class="l_k" href="functions/die.html">die</a> <span class="q">"Cannot open $filename: $!\n"</span> <span class="sc">;</span></pre>
1081
1084
<pre class="verbatim"> <span class="i">$db</span><span class="i">->filter_fetch_key</span> <span class="s">(</span> <a class="l_k" href="functions/sub.html">sub</a> <span class="s">{</span> <span class="i">$_</span> = <a class="l_k" href="functions/unpack.html">unpack</a><span class="s">(</span><span class="q">"i"</span><span class="cm">,</span> <span class="i">$_</span><span class="s">)</span> <span class="s">}</span> <span class="s">)</span> <span class="sc">;</span>
1082
1085
<span class="i">$db</span><span class="i">->filter_store_key</span> <span class="s">(</span> <a class="l_k" href="functions/sub.html">sub</a> <span class="s">{</span> <span class="i">$_</span> = <a class="l_k" href="functions/pack.html">pack</a> <span class="s">(</span><span class="q">"i"</span><span class="cm">,</span> <span class="i">$_</span><span class="s">)</span> <span class="s">}</span> <span class="s">)</span> <span class="sc">;</span>
1087
1090
<p>This time only two filters have been used -- we only need to manipulate
1088
1091
the contents of the key, so it wasn't necessary to install any value
1090
<a name="HINTS-AND-TIPS"></a><h1>HINTS AND TIPS </h1>
1093
<a name="HINTS-AND-TIPS"></a><h1>HINTS AND TIPS</h1>
1091
1094
<a name="Locking%3a-The-Trouble-with-fd"></a><h2>Locking: The Trouble with fd</h2>
1092
1095
<p>Until version 1.72 of this module, the recommended technique for locking
1093
1096
<b>DB_File</b> databases was to flock the filehandle returned from the "fd"
1094
1097
function. Unfortunately this technique has been shown to be fundamentally
1095
1098
flawed (Kudos to David Harris for tracking this down). Use it at your own
1097
<p>The locking technique went like this. </p>
1098
<pre class="verbatim"> <span class="i">$db</span> = <a class="l_k" href="functions/tie.html">tie</a><span class="s">(</span><span class="i">%db</span><span class="cm">,</span> <span class="q">'DB_File'</span><span class="cm">,</span> <span class="q">'foo.db'</span><span class="cm">,</span> O_CREAT|O_RDWR<span class="cm">,</span> <span class="n">0644</span><span class="s">)</span>
1100
<p>The locking technique went like this.</p>
1101
<pre class="verbatim"> <span class="i">$db</span> = <a class="l_k" href="functions/tie.html">tie</a><span class="s">(</span><span class="i">%db</span><span class="cm">,</span> <span class="q">'DB_File'</span><span class="cm">,</span> <span class="q">'foo.db'</span><span class="cm">,</span> <span class="w">O_CREAT</span>|<span class="w">O_RDWR</span><span class="cm">,</span> <span class="n">0644</span><span class="s">)</span>
1099
1102
|| <a class="l_k" href="functions/die.html">die</a> <span class="q">"dbcreat foo.db $!"</span><span class="sc">;</span>
1100
1103
<span class="i">$fd</span> = <span class="i">$db</span><span class="i">->fd</span><span class="sc">;</span>
1101
<a class="l_k" href="functions/open.html">open</a><span class="s">(</span>DB_FH<span class="cm">,</span> <span class="q">"+<&=$fd"</span><span class="s">)</span> || <a class="l_k" href="functions/die.html">die</a> <span class="q">"dup $!"</span><span class="sc">;</span>
1102
<a class="l_k" href="functions/flock.html">flock</a> <span class="s">(</span>DB_FH<span class="cm">,</span> LOCK_EX<span class="s">)</span> || <a class="l_k" href="functions/die.html">die</a> <span class="q">"flock: $!"</span><span class="sc">;</span>
1104
<a class="l_k" href="functions/open.html">open</a><span class="s">(</span><span class="w">DB_FH</span><span class="cm">,</span> <span class="q">"+<&=$fd"</span><span class="s">)</span> || <a class="l_k" href="functions/die.html">die</a> <span class="q">"dup $!"</span><span class="sc">;</span>
1105
<a class="l_k" href="functions/flock.html">flock</a> <span class="s">(</span><span class="w">DB_FH</span><span class="cm">,</span> <span class="w">LOCK_EX</span><span class="s">)</span> || <a class="l_k" href="functions/die.html">die</a> <span class="q">"flock: $!"</span><span class="sc">;</span>
1104
1107
<span class="i">$db</span>{<span class="q">"Tom"</span>} = <span class="q">"Jerry"</span> <span class="sc">;</span>
1106
<a class="l_k" href="functions/flock.html">flock</a><span class="s">(</span>DB_FH<span class="cm">,</span> LOCK_UN<span class="s">)</span><span class="sc">;</span>
1109
<a class="l_k" href="functions/flock.html">flock</a><span class="s">(</span><span class="w">DB_FH</span><span class="cm">,</span> <span class="w">LOCK_UN</span><span class="s">)</span><span class="sc">;</span>
1107
1110
<a class="l_k" href="functions/undef.html">undef</a> <span class="i">$db</span><span class="sc">;</span>
1108
1111
<a class="l_k" href="functions/untie.html">untie</a> <span class="i">%db</span><span class="sc">;</span>
1109
<a class="l_k" href="functions/close.html">close</a><span class="s">(</span>DB_FH<span class="s">)</span><span class="sc">;</span></pre>
1112
<a class="l_k" href="functions/close.html">close</a><span class="s">(</span><span class="w">DB_FH</span><span class="s">)</span><span class="sc">;</span></pre>
1110
1113
<p>In simple terms, this is what happens:</p>
1199
1202
<p>Here is a snippet of code that is loosely based on Tom Christiansen's
1200
1203
<i>ggh</i> script (available from your nearest CPAN archive in
1201
1204
<i>authors/id/TOMC/scripts/nshist.gz</i>).</p>
1202
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="warnings.html">warnings</a> <span class="sc">;</span>
1203
<a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="strict.html">strict</a> <span class="sc">;</span>
1204
<a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="DB_File.html">DB_File</a> <span class="sc">;</span>
1205
<a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="Fcntl.html">Fcntl</a> <span class="sc">;</span></pre>
1205
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <span class="w">warnings</span> <span class="sc">;</span>
1206
<a class="l_k" href="functions/use.html">use</a> <span class="w">strict</span> <span class="sc">;</span>
1207
<a class="l_k" href="functions/use.html">use</a> <span class="w">DB_File</span> <span class="sc">;</span>
1208
<a class="l_k" href="functions/use.html">use</a> <span class="w">Fcntl</span> <span class="sc">;</span></pre>
1206
1209
<pre class="verbatim"> <a class="l_k" href="functions/my.html">my</a> <span class="s">(</span><span class="i">$dotdir</span><span class="cm">,</span> <span class="i">$HISTORY</span><span class="cm">,</span> <span class="i">%hist_db</span><span class="cm">,</span> <span class="i">$href</span><span class="cm">,</span> <span class="i">$binary_time</span><span class="cm">,</span> <span class="i">$date</span><span class="s">)</span> <span class="sc">;</span>
1207
<span class="i">$dotdir</span> = <span class="i">$ENV</span>{HOME} || <span class="i">$ENV</span>{LOGNAME}<span class="sc">;</span></pre>
1210
<span class="i">$dotdir</span> = <span class="i">$ENV</span>{<span class="w">HOME</span>} || <span class="i">$ENV</span>{<span class="w">LOGNAME</span>}<span class="sc">;</span></pre>
1208
1211
<pre class="verbatim"> <span class="i">$HISTORY</span> = <span class="q">"$dotdir/.netscape/history.db"</span><span class="sc">;</span></pre>
1209
1212
<pre class="verbatim"> <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%hist_db</span><span class="cm">,</span> <span class="q">'DB_File'</span><span class="cm">,</span> <span class="i">$HISTORY</span>
1210
1213
or <a class="l_k" href="functions/die.html">die</a> <span class="q">"Cannot open $HISTORY: $!\n"</span> <span class="sc">;</span><span class="sc">;</span></pre>
1226
1229
<pre class="verbatim"> <a class="l_k" href="functions/untie.html">untie</a> <span class="i">%hist_db</span> <span class="sc">;</span></pre>
1227
1230
<a name="The-untie()-Gotcha"></a><h2>The untie() Gotcha</h2>
1228
1231
<p>If you make use of the Berkeley DB API, it is <i>very</i> strongly
1229
recommended that you read <a href="perltie.html#The-untie-Gotcha">"The untie Gotcha" in perltie</a>. </p>
1232
recommended that you read <a href="perltie.html#The-untie-Gotcha">"The untie Gotcha" in perltie</a>.</p>
1230
1233
<p>Even if you don't currently make use of the API interface, it is still
1231
1234
worth reading it.</p>
1232
1235
<p>Here is an example which illustrates the problem from a <b>DB_File</b>
1233
1236
perspective:</p>
1234
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="DB_File.html">DB_File</a> <span class="sc">;</span>
1235
<a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="Fcntl.html">Fcntl</a> <span class="sc">;</span></pre>
1237
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <span class="w">DB_File</span> <span class="sc">;</span>
1238
<a class="l_k" href="functions/use.html">use</a> <span class="w">Fcntl</span> <span class="sc">;</span></pre>
1236
1239
<pre class="verbatim"> <a class="l_k" href="functions/my.html">my</a> <span class="i">%x</span> <span class="sc">;</span>
1237
1240
<a class="l_k" href="functions/my.html">my</a> <span class="i">$X</span> <span class="sc">;</span></pre>
1238
<pre class="verbatim"> <span class="i">$X</span> = <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%x</span><span class="cm">,</span> <span class="q">'DB_File'</span><span class="cm">,</span> <span class="q">'tst.fil'</span> <span class="cm">,</span> O_RDWR|O_TRUNC
1241
<pre class="verbatim"> <span class="i">$X</span> = <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%x</span><span class="cm">,</span> <span class="q">'DB_File'</span><span class="cm">,</span> <span class="q">'tst.fil'</span> <span class="cm">,</span> <span class="w">O_RDWR</span>|<span class="w">O_TRUNC</span>
1239
1242
or <a class="l_k" href="functions/die.html">die</a> <span class="q">"Cannot tie first time: $!"</span> <span class="sc">;</span></pre>
1240
1243
<pre class="verbatim"> <span class="i">$x</span>{<span class="n">123</span>} = <span class="n">456</span> <span class="sc">;</span></pre>
1241
1244
<pre class="verbatim"> <a class="l_k" href="functions/untie.html">untie</a> <span class="i">%x</span> <span class="sc">;</span></pre>
1242
<pre class="verbatim"> <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%x</span><span class="cm">,</span> <span class="q">'DB_File'</span><span class="cm">,</span> <span class="q">'tst.fil'</span> <span class="cm">,</span> O_RDWR|O_CREAT
1245
<pre class="verbatim"> <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%x</span><span class="cm">,</span> <span class="q">'DB_File'</span><span class="cm">,</span> <span class="q">'tst.fil'</span> <span class="cm">,</span> <span class="w">O_RDWR</span>|<span class="w">O_CREAT</span>
1243
1246
or <a class="l_k" href="functions/die.html">die</a> <span class="q">"Cannot tie second time: $!"</span> <span class="sc">;</span></pre>
1244
1247
<pre class="verbatim"> <a class="l_k" href="functions/untie.html">untie</a> <span class="i">%x</span> <span class="sc">;</span></pre>
1245
1248
<p>When run, the script will produce this error message:</p>
1299
1302
<p>Here are a couple of possibilities:</p>
1302
<p>Attempting to reopen a database without closing it. </p>
1305
<p>Attempting to reopen a database without closing it.</p>
1305
1308
<p>Using the O_WRONLY flag.</p>
1308
<a name="What-does-%22Bareword-'DB_File'-not-allowed%22-mean%3f"></a><h2>What does "Bareword 'DB_File' not allowed" mean? </h2>
1311
<a name="What-does-%22Bareword-'DB_File'-not-allowed%22-mean%3f"></a><h2>What does "Bareword 'DB_File' not allowed" mean?</h2>
1309
1312
<p>You will encounter this particular error message when you have the
1310
<code class="inline"><a class="l_w" href="strict.html">strict</a> <span class="q">'subs'</span></code>
1313
<code class="inline"><span class="w">strict</span> <span class="q">'subs'</span></code>
1311
1314
pragma (or the full strict pragma) in your script.
1312
1315
Consider this script:</p>
1313
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="warnings.html">warnings</a> <span class="sc">;</span>
1314
<a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="strict.html">strict</a> <span class="sc">;</span>
1315
<a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="DB_File.html">DB_File</a> <span class="sc">;</span>
1316
<pre class="verbatim"> <a class="l_k" href="functions/use.html">use</a> <span class="w">warnings</span> <span class="sc">;</span>
1317
<a class="l_k" href="functions/use.html">use</a> <span class="w">strict</span> <span class="sc">;</span>
1318
<a class="l_k" href="functions/use.html">use</a> <span class="w">DB_File</span> <span class="sc">;</span>
1316
1319
<a class="l_k" href="functions/my.html">my</a> <span class="i">%x</span> <span class="sc">;</span>
1317
<a class="l_k" href="functions/tie.html">tie</a> <span class="i">%x</span><span class="cm">,</span> <a class="l_w" href="DB_File.html">DB_File</a><span class="cm">,</span> <span class="q">"filename"</span> <span class="sc">;</span></pre>
1320
<a class="l_k" href="functions/tie.html">tie</a> <span class="i">%x</span><span class="cm">,</span> <span class="w">DB_File</span><span class="cm">,</span> <span class="q">"filename"</span> <span class="sc">;</span></pre>
1318
1321
<p>Running it produces the error in question:</p>
1319
<pre class="verbatim"> Bareword "DB_File" not allowed while "strict subs" in use </pre><p>To get around the error, place the word <code class="inline"><a class="l_w" href="DB_File.html">DB_File</a></code> in either single or
1322
<pre class="verbatim"> Bareword "DB_File" not allowed while "strict subs" in use</pre><p>To get around the error, place the word <code class="inline"><span class="w">DB_File</span></code>
1320
1324
double quotes, like this:</p>
1321
1325
<pre class="verbatim"> <a class="l_k" href="functions/tie.html">tie</a> <span class="i">%x</span><span class="cm">,</span> <span class="q">"DB_File"</span><span class="cm">,</span> <span class="q">"filename"</span> <span class="sc">;</span></pre>
1322
1326
<p>Although it might seem like a real pain, it is really worth the effort
1323
of having a <code class="inline"><a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="strict.html">strict</a></code>
1327
of having a <code class="inline"><a class="l_k" href="functions/use.html">use</a> <span class="w">strict</span></code>
1324
1328
in all your scripts.</p>
1325
1329
<a name="REFERENCES"></a><h1>REFERENCES</h1>
1326
1330
<p>Articles that are either about <b>DB_File</b> or make use of it.</p>
1356
1360
<i><a href="http://reality.sgi.com/ariel">http://reality.sgi.com/ariel</a></i>. It has the patches necessary to
1357
1361
compile properly on IRIX 5.3.</p>
1358
1362
<a name="COPYRIGHT"></a><h1>COPYRIGHT</h1>
1359
<p>Copyright (c) 1995-2005 Paul Marquess. All rights reserved. This program
1363
<p>Copyright (c) 1995-2007 Paul Marquess. All rights reserved. This program
1360
1364
is free software; you can redistribute it and/or modify it under the
1361
1365
same terms as Perl itself.</p>
1362
1366
<p>Although <b>DB_File</b> is covered by the Perl license, the library it
1363
1367
makes use of, namely Berkeley DB, is not. Berkeley DB has its own
1364
1368
copyright and its own license. Please take the time to read it.</p>
1365
1369
<p>Here are are few words taken from the Berkeley DB FAQ (at
1366
<i><a href="http://www.sleepycat.com">http://www.sleepycat.com</a></i>) regarding the license:</p>
1367
<pre class="verbatim"> Do I have to license DB to use it in Perl scripts? </pre><pre class="verbatim"> No. The Berkeley <a class="l_w" href="DB.html">DB</a> license requires that software that uses
1368
Berkeley <a class="l_w" href="DB.html">DB</a> be freely redistributable. In the case of Perl<span class="cm">,</span> that
1369
software is Perl<span class="cm">,</span> and not your scripts. Any Perl scripts that you
1370
<a class="l_k" href="functions/write.html">write</a> are your property<span class="cm">,</span> including scripts that make <a class="l_k" href="functions/use.html">use</a> of
1371
Berkeley <a class="l_w" href="DB.html">DB</a>. Neither the Perl license nor the Berkeley <a class="l_w" href="DB.html">DB</a> license
1372
place any restriction on what you may <a class="l_k" href="functions/do.html">do</a> with them.</pre>
1370
<i><a href="http://www.oracle.com/technology/products/berkeley-db/db/index.html">http://www.oracle.com/technology/products/berkeley-db/db/index.html</a></i>) regarding the license:</p>
1371
<pre class="verbatim"> Do I have to license DB to use it in Perl scripts?</pre><pre class="verbatim"> <span class="w">No</span>. <span class="w">The</span> <span class="w">Berkeley</span> <span class="w">DB</span> <span class="w">license</span> <span class="w">requires</span> <span class="w">that</span> <span class="w">software</span> <span class="w">that</span> <span class="w">uses</span>
1372
<span class="w">Berkeley</span> <span class="w">DB</span> <span class="w">be</span> <span class="w">freely</span> <span class="w">redistributable</span>. <span class="w">In</span> <span class="w">the</span> case <span class="w">of</span> <span class="w">Perl</span><span class="cm">,</span> <span class="w">that</span>
1373
<span class="w">software</span> <span class="w">is</span> <span class="w">Perl</span><span class="cm">,</span> and not <span class="w">your</span> <span class="w">scripts</span>. <span class="w">Any</span> <span class="w">Perl</span> <span class="w">scripts</span> <span class="w">that</span> <span class="w">you</span>
1374
<a class="l_k" href="functions/write.html">write</a> <span class="w">are</span> <span class="w">your</span> <span class="w">property</span><span class="cm">,</span> <span class="w">including</span> <span class="w">scripts</span> <span class="w">that</span> <span class="w">make</span> <a class="l_k" href="functions/use.html">use</a> <span class="w">of</span>
1375
<span class="w">Berkeley</span> <span class="w">DB</span>. <span class="w">Neither</span> <span class="w">the</span> <span class="w">Perl</span> <span class="w">license</span> <span class="w">nor</span> <span class="w">the</span> <span class="w">Berkeley</span> <span class="w">DB</span> <span class="w">license</span>
1376
<span class="w">place</span> <span class="w">any</span> <span class="w">restriction</span> <span class="w">on</span> <span class="w">what</span> <span class="w">you</span> <span class="w">may</span> <a class="l_k" href="functions/do.html">do</a> <span class="w">with</span> <span class="w">them</span>.</pre>
1373
1377
<p>If you are in any doubt about the license situation, contact either the
1374
1378
Berkeley DB authors or the author of DB_File. See <a href="#AUTHOR">"AUTHOR"</a> for details.</p>
1375
1379
<a name="SEE-ALSO"></a><h1>SEE ALSO</h1>